docs(log): реестр — горизонтальная прокрутка, sticky-шапка, ресайз колонок, лимит строк

This commit is contained in:
2026-09-14 23:31:10 +03:00
parent e32def495d
commit 9c1cd347bc

View File

@@ -561,3 +561,23 @@
- Что изменено: из `TaskView.tsx` и `TaskDetail.tsx` убрана обёртка `<Sidebar>` из основного return (заменена на фрагмент), удалён неиспользуемый импорт. Контент (`flex flex-col h-full overflow-hidden`) корректно ложится в `<main>` от AppShell.
- Как проверялось: `npm run check`, `npm run build`, `npx vitest run` (129/129) — зелёные.
- Подводные камни: Chat.tsx и ShareTarget.tsx тоже рендерят свой Sidebar — но они вне SHELL_ROUTE_PATTERNS, дублирования нет, не трогали. Правило: страницы внутри shell НЕ должны рендерить `<Sidebar>` сами.
---
## [Реестр задач] Возврат горизонтальной прокрутки, sticky-шапка, ресайз колонок, лимит строк
- Статус: ✅ done (коммиты `c8b7741`, `e32def4`; деплой на iistwin.ru, health 200)
- Зачем: (1) на десктопе пропала горизонтальная прокрутка реестра — при широкой таблице скроллбар оказывался внизу всей высоты таблицы и был недостижим, шапка реестра уезжала при вертикальной прокрутке; (2) запрос пользователя: настройка «максимум строк в строке» 1–8 (в режиме 1 — компактный однострочный реестр); (3) ресайз колонок drag'ом с запоминанием у каждого пользователя.
- Причины бага (установлены через WebBridge на проде, замеры scrollWidth/clientHeight):
- Горизонталь: `ui/table` оборачивает `<table>` в `div.relative.w-full.overflow-auto`; wrapper сжимался под ширину контейнера и перехватывал горизонтальный скролл, его скроллбар рисовался внизу полной высоты таблицы (~29,5 тыс. px), а не видимой области. Sticky-шапки в реестре никогда не было.
- Вертикаль/мобильный: мобильный `main#content` (Sidebar.tsx) был блочным `flex-1 overflow-auto`; обёртка `PageTransition` (flex-1 min-h-0) в блочном родителе теряла flex-1 → высота росла по контенту → h-full-цепочки страниц рушились, весь скролл уходил в main. Десктопный main уже был `flex flex-col` — баг проявлялся только на <768px.
- Что изменено:
- `Sidebar.tsx`: мобильный `main` — `flex flex-col` (как десктопный).
- `ui/table.tsx`: пропс `wrapperClassName` (cn/twMerge), обратная совместимость.
- `TaskRegistry.tsx`:
- wrapper таблицы `w-max min-w-full overflow-visible` + `w-fit min-w-full` на обёртке с border → переполнение по ширине всплывает в контейнер реестра (`tableScrollRef`), скроллбар — внизу видимой области; вертикальный скролл и виртуализация на том же контейнере;
- `<TableHeader className="sticky top-0 z-10">` (+ явный фон tr для plain-варианта шапки скина);
- ресайз: ручка на правом крае каждого `<th>` (только mouse, скрыта на `<md`), drag меняет ширину (table-fixed + `<colgroup>`, min 80 / max 1200 px), двойной клик — сброс; хранение `registry-colwidths-<formId>` в localStorage (per-user/per-form, как видимость и порядок колонок); у title/description убирается max-w-xs/max-w-sm при заданной ширине;
- настройка «Строк в ячейке» (Авто / 1–8) в диалоге «Настройки реестра», хранится в `registry-rowlines-<formId>`; CSS `-webkit-line-clamp` на текстовых ячейках (титул, описание, исполнители, автор, текстовые поля; readView inline-редакторов — кламп только на read-view, редактор не затронут); оценка высоты виртуализатора 32 px в однострочном режиме.
- Как проверялось: `npm run check` (heap 6144), `npm run build`, `npx vitest run` (129/129), eslint 0 errors. Деплой через GitHub Actions — success, health 200.
- Подводные камни: (1) кламп не применяется к file/contract-number/составным полям — намеренно; (2) при `table-fixed` колонки без заданной ширины делят оставшееся место поровну (ожидаемо); (3) ширины/строки хранятся в localStorage — не мигрируют между устройствами (единообразно с прочими настройками реестра; серверный вариант — отдельная задача); (4) настройки реестра надо проверить на проде глазами: браузерная сессия WebBridge истекла, ручная проверка отложена за пользователем.