AURORA-1893: доработка по возврату тестирования — агрегаты в счётчике, переход и прокрутка к ячейке, {year}/{unit} #300

Merged
aep merged 1 commits from feat/282-aurora-1893-error-alert-rework into test 2026-11-08 17:11:26 +03:00
Owner

Issue #282 (AURORA-1893), доработка по возврату тестирования 06.11 (комментарий Салмина в Jira).

Что было и почему

Замечание Причина Правка
Промежуточные агрегатные строки не попадают в список и счётчик у ROOT/GROUP/ITEM/SUB_ITEM нет data.id; id ошибки правило:колонка:null совпадал у всех агрегатов колонки, дедупликация оставляла первый getValidationRowKey(row) — line id или sort:<sort_order> (глобальный ROW_NUMBER листа); поле rowKey в ошибке
Выбор ошибки агрегата не выделяет его, выделение остаётся на предыдущей ячейке handleNavigateToError искал строку по line id и для null выходил сразу поиск по getValidationRowKey(candidate.original) === rowKey
Выделенная ячейка остаётся ниже видимой области scrollToIndex(rowIndex + 5, 'auto'): у последних строк запас обрезается, шапка внутри контейнера прокрутки виртуализатором не учитывается scrollToIndex(rowIndex, 'center') + scrollIntoView({block/inline: 'nearest'}) самой ячейки после отрисовки (до 10 кадров)
В названиях колонок {year}, {year:short}, {unit} buildColumnHeaderPaths брал сырые заголовки конфигов formatHeaderPaths(headerPaths, budgetYear, denomination) через formatHeaderYear/formatHeaderUnit, как TableHead. Те же пути использует тост EditCell из AURORA-1892 — там шаблоны тоже уходят
(найдено при проверке) рамка активной ячейки не видна на ошибочной ячейке inset box-shadow на td перекрывает красная рамка вложенного div (INVALID_STYLES) ACTIVE_CELL_STYLE['&::after'] — рамка 3px поверх содержимого

Проверка

  • node --test src/components/RealtimeTable/utils/*.test.js — 156 passed (было 152; +4 новых: ключ строки, агрегаты в списке, подстановка заголовков, рамка ::after). Сначала падали, потом зелёные.
  • npx biome check по изменённым файлам — новых замечаний нет (оставшиеся noConsole/useExhaustiveDependencies в RealtimeTable.jsx были до правки).
  • Вручную в браузере (API + dev-фронт на тестовой БД с фикстурой, форма 1 «Операц», 7 строк с −100 в плане I кв.): было «Ошибок: 24» (по колонке 7 строк ввода + только ROOT), шаблоны в названиях; стало «Ошибок: 69» = 3 колонки × 23 (7 INPUT + 7 SUB_ITEM + 4 ITEM + 4 GROUP + ROOT), названия «План 2027 (тыс. руб.) с учётом НДС / 1 Кв. 27». Переходы из меню к ROOT, GROUP, ITEM, INPUT и «‹» к последней ошибке (строка 53, низ листа) — активная ячейка в видимой области и обведена.

Rulings I made

  • R-1: рамка через ::after применяется и к подсветке совпадения поиска (общий ACTIVE_CELL_STYLE) — там тоже не была видна на ошибочных ячейках. Inset-тень оставлена.
  • R-2: лимит 20 строк на группу в меню («и ещё N») не трогал — скрытые ячейки достижимы кнопками «‹ ›».
  • R-3: поле lineId в ошибке сохранено (реальный line id или null), для навигации добавлено отдельное rowKey.

Deferred

  • O-1: navigateToSearchMatch (поиск) использует тот же scrollToIndex(rowIndex + 5, 'auto') — у последних строк листа найденная ячейка, вероятно, так же остаётся за краем. Тестировщик не заявлял, в этот PR не включено.

🤖 Generated with Claude Code

Issue #282 (AURORA-1893), доработка по возврату тестирования 06.11 (комментарий Салмина в Jira). ## Что было и почему | Замечание | Причина | Правка | |---|---|---| | Промежуточные агрегатные строки не попадают в список и счётчик | у ROOT/GROUP/ITEM/SUB_ITEM нет `data.id`; id ошибки `правило:колонка:null` совпадал у всех агрегатов колонки, дедупликация оставляла первый | `getValidationRowKey(row)` — line id или `sort:<sort_order>` (глобальный ROW_NUMBER листа); поле `rowKey` в ошибке | | Выбор ошибки агрегата не выделяет его, выделение остаётся на предыдущей ячейке | `handleNavigateToError` искал строку по line id и для `null` выходил сразу | поиск по `getValidationRowKey(candidate.original) === rowKey` | | Выделенная ячейка остаётся ниже видимой области | `scrollToIndex(rowIndex + 5, 'auto')`: у последних строк запас обрезается, шапка внутри контейнера прокрутки виртуализатором не учитывается | `scrollToIndex(rowIndex, 'center')` + `scrollIntoView({block/inline: 'nearest'})` самой ячейки после отрисовки (до 10 кадров) | | В названиях колонок `{year}`, `{year:short}`, `{unit}` | `buildColumnHeaderPaths` брал сырые заголовки конфигов | `formatHeaderPaths(headerPaths, budgetYear, denomination)` через `formatHeaderYear`/`formatHeaderUnit`, как `TableHead`. Те же пути использует тост EditCell из AURORA-1892 — там шаблоны тоже уходят | | (найдено при проверке) рамка активной ячейки не видна на ошибочной ячейке | inset box-shadow на `td` перекрывает красная рамка вложенного div (`INVALID_STYLES`) | `ACTIVE_CELL_STYLE['&::after']` — рамка 3px поверх содержимого | ## Проверка - `node --test src/components/RealtimeTable/utils/*.test.js` — 156 passed (было 152; +4 новых: ключ строки, агрегаты в списке, подстановка заголовков, рамка ::after). Сначала падали, потом зелёные. - `npx biome check` по изменённым файлам — новых замечаний нет (оставшиеся `noConsole`/`useExhaustiveDependencies` в RealtimeTable.jsx были до правки). - Вручную в браузере (API + dev-фронт на тестовой БД с фикстурой, форма 1 «Операц», 7 строк с −100 в плане I кв.): было «Ошибок: 24» (по колонке 7 строк ввода + только ROOT), шаблоны в названиях; стало «Ошибок: 69» = 3 колонки × 23 (7 INPUT + 7 SUB_ITEM + 4 ITEM + 4 GROUP + ROOT), названия «План 2027 (тыс. руб.) с учётом НДС / 1 Кв. 27». Переходы из меню к ROOT, GROUP, ITEM, INPUT и «‹» к последней ошибке (строка 53, низ листа) — активная ячейка в видимой области и обведена. ## Rulings I made - R-1: рамка через `::after` применяется и к подсветке совпадения поиска (общий `ACTIVE_CELL_STYLE`) — там тоже не была видна на ошибочных ячейках. Inset-тень оставлена. - R-2: лимит 20 строк на группу в меню («и ещё N») не трогал — скрытые ячейки достижимы кнопками «‹ ›». - R-3: поле `lineId` в ошибке сохранено (реальный line id или null), для навигации добавлено отдельное `rowKey`. ## Deferred - O-1: `navigateToSearchMatch` (поиск) использует тот же `scrollToIndex(rowIndex + 5, 'auto')` — у последних строк листа найденная ячейка, вероятно, так же остаётся за краем. Тестировщик не заявлял, в этот PR не включено. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-11-08 15:38:58 +03:00
Доработка по возврату тестирования 06.11:
- у агрегатных строк (ROOT/GROUP/ITEM/SUB_ITEM) нет data.id, ключ ошибки был
  «правило:колонка:null» — все агрегаты одной колонки схлопывались в одну
  запись. Ключ строки теперь getValidationRowKey: line id или sort:<sort_order>;
- переход к ошибке ищет строку по тому же ключу (раньше для агрегата
  прерывался, выделение оставалось на предыдущей ячейке);
- прокрутка: вместо scrollToIndex(rowIndex + 5, 'auto') — центрирование и
  scrollIntoView самой ячейки после отрисовки (у последних строк запас +5
  обрезался, шапка внутри контейнера не учитывалась — ячейка оставалась ниже
  видимой области);
- названия колонок в плашке и в тосте EditCell — с подставленными годом и
  единицами (formatHeaderPaths, как в TableHead);
- рамка активной ячейки дублируется псевдоэлементом ::after: inset-тень td
  перекрывалась красной рамкой ошибочной ячейки.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit bc9bd1b5e5 into test 2026-11-08 17:11:26 +03:00
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#300
No description provided.