feat(ui): 3-dot row menu + history compare/revert + DateTime fitting + tablet touch

Per user feedback screenshots:

SchemaDrivenForm DateTimeField:
- grid → flex flex-wrap: на узких cells (drawer 520px ÷ 2 cols = ~210px)
  time wraps под date вертикально. На wide — inline.
- Date min-w 8rem (128px), time w-24 (96px) — tablet touch-safe.

TableHeaderCell без visible label (sr-only для screen readers).
TableCell содержит DropdownMenu trigger 36×36px (touch target):
  - History (always)
  - Edit, Separator, Close (только canMutate, Close в danger color)
Заменяет 3 inline IconButton'a — экономит ширину + tablet friendly.

RecordHistoryDrawer accepts onCompare / onRevert callbacks. Каждая
non-current version row показывает:
  - Сравнить с текущим — opens ConflictDiffModal (reused diff UI)
  - Откатить к v{N} — submit updateMut с этой version данными как
    payload (+ confirm dialog). Backend создаёт новую active version,
    bitemporal history preserves старые.
JSON viewer переключился с <details> на state-driven (hide/show
без CSS rabbit hole).

history.hideData/compare/revert/revertConfirm (RU + EN).

- 3-dot trigger 36px = comfortable touch target (Apple HIG 44, ours
  acceptable для density)
- Drawer на <880px viewport = fullscreen sheet (already)
- DateTime wraps на cell <8rem+9rem+gap = 290px
- Sidebar collapse на <1024 = hamburger overlay
This commit is contained in:
Zimin A.N.
2026-05-12 00:01:04 +03:00
parent 11797f88ae
commit b312ba37ad
4 changed files with 169 additions and 40 deletions
+8
View File
@@ -389,6 +389,10 @@ i18n
'history.validTo': 'действует до',
'history.updatedBy': 'кем',
'history.viewData': 'данные записи (JSON)',
'history.hideData': 'скрыть JSON',
'history.compare': 'Сравнить с текущим',
'history.revert': 'Откатить к v{{v}}',
'history.revertConfirm': 'Откатить к v{{v}}? Создастся новая активная версия.',
// === Lineage (dict-relationships-v2 Phase 1) ===
'lineage.usedBy.title': 'На этот словарь ссылаются',
'lineage.usedBy.count_one': '{{count}} связь',
@@ -895,6 +899,10 @@ i18n
'history.validTo': 'valid to',
'history.updatedBy': 'by',
'history.viewData': 'record data (JSON)',
'history.hideData': 'hide JSON',
'history.compare': 'Compare with current',
'history.revert': 'Revert to v{{v}}',
'history.revertConfirm': 'Revert to v{{v}}? A new active version will be created.',
// === Lineage (dict-relationships-v2 Phase 1) ===
'lineage.usedBy.title': 'Used by',
'lineage.usedBy.count_one': '{{count}} reference',