AURORA-1841: справочник ВСП - виртуализация строк и вынос состояния модалок #219

Open
aep wants to merge 2 commits from feat/214-aurora-1841-dict-vsp-virtual into test
Owner

Closes #214

Jira: AURORA-1841

Что сделано

  • Состояние модалок (open, editingItem, exportOpen, saveLoading, handleSave) вынесено из TableDictVsp в новый DictVspModals (forwardRef + useImperativeHandle: openAdd, openEdit(item), openExport). Открытие модалки больше не перерисовывает MRT-таблицу.
  • TableDictVsp обёрнут в memo; колбэки onAddClick/onEditClick/onExportClick в DictVspPage стабильные (useCallback + ref на модалки); handleAdd/handleEdit/handleDelete обёрнуты в useCallback.
  • Виртуализация строк (enableRowVirtualization, overscan: 5, estimateSize 54). Высота строк измеряется MRT по умолчанию, потому что «Примечания» многострочные (pre-wrap); осознанное отличие от 1836.
  • size/minSize/maxSize колонок выверены под grid-раскладку (было size > maxSize у «Код РФ»; ширины подняты под длину заголовков и адресов, чтобы ничего не обрезалось).
  • Фильтрация по ССП вынесена в utils/filterVspBySsp.js.

Тесты

  • web/src/pages/DictVspPage/utils/filterVspBySsp.test.js - 3 теста, node --test: 3 pass, 0 fail.
  • npm run build проходит. biome: новых нарушений нет (остались прежние console, ==).
  • Бэк не менялся, pytest не запускался.

Проверить руками

Роли admin и executor_dfip:

  • добавить ВСП, отредактировать, удалить
  • фильтр по ССП
  • экспорт
  • прокрутка до конца (720 строк): № идёт подряд, строки с многострочными примечаниями не наезжают друг на друга
  • закреплённые колонки слева (№, Код РФ, Регистрационный номер) и «Действия» справа на месте
  • заголовки и адреса не обрезаны, горизонтальный скролл работает, вертикальный скролл внутри контейнера
    Роль executor_rf: фильтров нет, таблица и экспорт работают.

Замер до/после

Будет добавлен после ночного прогона на стенде perf/. Сценарий: модалки dict_vsp_* на масштабе 1 (PERF_MODALS='dict_vsp_*' PERF_REPEATS=5 npx playwright test scenarios/modals.spec.ts; метрики click_to_visible_ms, main_thread_ms; база 167/193/159 мс) + разовый замер на 720 ВСП доращиванием через create_vsp после остальных замеров.

Rulings I made

  • R-1: ширины колонок подобраны по оценке длины заголовка (bold 0.88rem), без скриншота «до». Цена ошибки: возможна обрезка заголовка или лишняя ширина, правится числами в columns.
  • R-2: estimateSize = 54 px (padding 2*0.75rem + строка 18 px). Цена ошибки: небольшие прыжки скроллбара.

🤖 Generated with Claude Code

Closes #214 Jira: AURORA-1841 ## Что сделано - Состояние модалок (`open`, `editingItem`, `exportOpen`, `saveLoading`, `handleSave`) вынесено из `TableDictVsp` в новый `DictVspModals` (`forwardRef` + `useImperativeHandle`: `openAdd`, `openEdit(item)`, `openExport`). Открытие модалки больше не перерисовывает MRT-таблицу. - `TableDictVsp` обёрнут в `memo`; колбэки `onAddClick`/`onEditClick`/`onExportClick` в `DictVspPage` стабильные (`useCallback` + ref на модалки); `handleAdd`/`handleEdit`/`handleDelete` обёрнуты в `useCallback`. - Виртуализация строк (`enableRowVirtualization`, `overscan: 5`, `estimateSize` 54). Высота строк измеряется MRT по умолчанию, потому что «Примечания» многострочные (`pre-wrap`); осознанное отличие от 1836. - `size/minSize/maxSize` колонок выверены под grid-раскладку (было `size > maxSize` у «Код РФ»; ширины подняты под длину заголовков и адресов, чтобы ничего не обрезалось). - Фильтрация по ССП вынесена в `utils/filterVspBySsp.js`. ## Тесты - `web/src/pages/DictVspPage/utils/filterVspBySsp.test.js` - 3 теста, `node --test`: 3 pass, 0 fail. - `npm run build` проходит. biome: новых нарушений нет (остались прежние `console`, `==`). - Бэк не менялся, pytest не запускался. ## Проверить руками Роли admin и executor_dfip: - [ ] добавить ВСП, отредактировать, удалить - [ ] фильтр по ССП - [ ] экспорт - [ ] прокрутка до конца (720 строк): № идёт подряд, строки с многострочными примечаниями не наезжают друг на друга - [ ] закреплённые колонки слева (№, Код РФ, Регистрационный номер) и «Действия» справа на месте - [ ] заголовки и адреса не обрезаны, горизонтальный скролл работает, вертикальный скролл внутри контейнера Роль executor_rf: фильтров нет, таблица и экспорт работают. ## Замер до/после Будет добавлен после ночного прогона на стенде perf/. Сценарий: модалки `dict_vsp_*` на масштабе 1 (`PERF_MODALS='dict_vsp_*' PERF_REPEATS=5 npx playwright test scenarios/modals.spec.ts`; метрики `click_to_visible_ms`, `main_thread_ms`; база 167/193/159 мс) + разовый замер на 720 ВСП доращиванием через `create_vsp` после остальных замеров. ## Rulings I made - R-1: ширины колонок подобраны по оценке длины заголовка (bold 0.88rem), без скриншота «до». Цена ошибки: возможна обрезка заголовка или лишняя ширина, правится числами в `columns`. - R-2: `estimateSize` = 54 px (padding 2*0.75rem + строка 18 px). Цена ошибки: небольшие прыжки скроллбара. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 2 commits 2026-10-28 17:10:21 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Модалки в DictVspModals (forwardRef), таблица в memo со стабильными колбэками,
enableRowVirtualization, size/minSize/maxSize колонок выверены под grid-раскладку.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This pull request can be merged automatically.
You are not authorized to merge this pull request.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/214-aurora-1841-dict-vsp-virtual:feat/214-aurora-1841-dict-vsp-virtual
git checkout feat/214-aurora-1841-dict-vsp-virtual
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/DFiP_Budget_planing#219
No description provided.