feat(editor): ExportModal + TimeTravelModal + InfoPanel merge + fixes

UI redesign matching prototype (Ordinis (3) dump):
- ExportModal: format (CSV/JSON/Excel/SQL) + scope (all/filtered/selected) +
  column toggles + encoding/delimiter + preview filename per redesign line
  1059-1092. CSV uses backend mutation, JSON client-side from filtered rows,
  Excel/SQL disabled (backend pending).
- TimeTravelModal: full-page compare СЕЙЧАС vs ТОЧКА ВО ВРЕМЕНИ + quick
  presets (сейчас/неделя/месяц/год/при создании) + step toggle версия/день
  + slider + tabs (Что изменилось / Записи на момент / Структура и поля) +
  "Открыть как readonly" CTA. Replaces inline TimeTravelPicker.
- InfoPanel ← используют merge: rich rows с field path + active records
  count + onClose policy chip (BLOCK/WARN/CASCADE). Inline
  DictionaryDependentsPanel above records table removed (one source of truth).
- Sidebar logo: match redesign/ui-kit.html .brand SVG (outer ring + inner
  faded ring + orbit dot offset right cx=22.5). ORDINIS Tektur tracking 0.22em
  + MDM smaller mute 0.32em.
- Bg neutralized: #fbf8ee Earth cream → #faf9f5 warm neutral default
  (per user preference, Earth cream still described in comment как opt-in).
- WorkflowBanner: Case 1 Live (approvalRequired=false) returns null —
  permanent "Опубликовано" banner = noise, status already visible в
  InfoPanel scope/version/updatedAt. Banner показывается только когда
  есть actionable state.

Critical bug fixes:
- fix(CascadeConfirmDialog): infinite render loop "Maximum update depth
  exceeded". useEffect had cascadeMut (TanStack Query mutation wrapper) в
  deps — wrapper identity changes every render → effect fires → reset() →
  store update → render → loop. Extract stable `reset` reference перед
  useEffect. Симптомы у user: создание/редактирование записи не работали.
- fix(semantic-release): add missing peer dep
  conventional-changelog-conventionalcommits (9.3.1). semantic-release 22+
  больше не bundles preset. Без неё release job падал с
  "Cannot find module 'conventional-changelog-conventionalcommits'".
This commit is contained in:
Zimin A.N.
2026-05-11 19:01:57 +03:00
parent e15a3916bf
commit 5a2220d779
10 changed files with 1109 additions and 83 deletions
@@ -58,6 +58,11 @@ export const CascadeConfirmDialog = ({
const { t } = useTranslation()
const preview = useCascadePreview(dictionaryName, open ? businessKey : undefined)
const cascadeMut = useCascadeCloseRecord(dictionaryName)
// TanStack Query гарантирует что `reset` / `mutate` стабильны между
// renders, а сам wrapper object — нет. Экстрактим reset чтобы не
// включать unstable mutation object в useEffect deps (infinite loop:
// mutationObject identity → effect fires → reset → store update → render).
const cascadeReset = cascadeMut.reset
const [reason, setReason] = useState('')
const [confirmText, setConfirmText] = useState('')
@@ -66,9 +71,9 @@ export const CascadeConfirmDialog = ({
if (!open) {
setReason('')
setConfirmText('')
cascadeMut.reset()
cascadeReset()
}
}, [open, businessKey, cascadeMut])
}, [open, businessKey, cascadeReset])
const plan = preview.data
const hasBlockers = (plan?.blockers.length ?? 0) > 0