38 Commits

Author SHA1 Message Date
Andrey Epifancev
321943db56 AURORA-1979: подпись программы и проекта в третьем столбце и выгрузке
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 22:35:02 +04:00
Andrey Epifancev
455393cc76 Merge origin/test в feat/264-aurora-1895-formula-localstorage
Конфликты (EditCell.jsx, RealtimeTable.jsx, formulaUtils.test.js):
- EditCell: сохранены правки 1891 (editorInitialInput, Esc/Tab/Enter,
  возврат фокуса) и 1892 (warnIfNegativeNotAllowed); поверх них
  повторена логика 1895: формула из localStorage подставляется только
  если совпадает с текущим значением, иначе stale и удаляется.
- Сохранённая формула не подставляется, если редактор открыт набором
  символа (getEditorInitialInput) и не затирает набранный текст при
  изменении value другим пользователем (разрешение один раз при открытии).
- Tab/Enter помечают следующую ячейку (openNextEditableCell) только после
  фактического закрытия редактора: при невычисляемой формуле он остаётся
  открытым и не оставляет висящую цель перехода.
- formulaUtils.js: единственный isSameCellValue из test (с нормализацией
  разделителей); дубль из ветки удалён.
- formulaUtils.test.js: тесты обеих сторон.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 10:24:55 +04:00
PotapovaA
ad709fb0f7 правки 2026-11-06 16:06:35 +03:00
Andrey Epifancev
ba167c0e48 Merge remote-tracking branch 'origin/test' into feat/284-aurora-1891-cell-click-keyboard-edit
# Conflicts:
#	web/src/components/RealtimeTable/Cell/Cell/Cell.jsx
#	web/src/components/RealtimeTable/RealtimeTable.jsx
#	web/src/components/RealtimeTable/SettingPanel/SettingPanel.jsx
#	web/src/components/RealtimeTable/TableHead/TableHead.jsx
#	web/src/components/RealtimeTable/tableColumns.jsx
2026-11-02 22:04:44 +04:00
Andrey Epifancev
8558670b46 feat(table): редактирование одним кликом и с клавиатуры, без лишних записей в аудит (AURORA-1891)
- processColumns (tableColumns.jsx): enableEditing для каждой листовой колонки
  через isCellEditable (PR #281), а не только для vsp_dropdown — MRT больше не
  открывает редактор (даже disabled) на нередактируемой ячейке, сервер не берёт
  блокировку, коллеги не видят 🔒.
- Одиночный клик по редактируемой, не заблокированной ячейке открывает
  редактор (muiTableBodyCellProps.onClick, RealtimeTable.jsx); клик по
  нередактируемой/занятой ячейке, как раньше, выделяет строку. Удалён мёртвый
  onClick/handleClick из Cell.jsx.
- Клавиатура на выделенной ячейке: Enter/F2 — открыть редактор; Delete/Backspace
  — открыть с пустым значением; печатный символ — открыть и подставить его
  вместо текущего значения (хранится в state RealtimeTable, читается через
  table.options.meta.getEditorInitialInput).
- EditCell.jsx/VspDropdownEditCell.jsx: Esc — отмена без cell_updated; Tab/
  Shift+Tab и Enter — сохранить и перейти к следующей/предыдущей редактируемой
  ячейке через table.options.meta.openNextEditableCell → utils/cellNavigation.js
  (чистые findNextEditableColumnId/findNextEditableRowId по
  getOrderedVisibleColumns и table.getRowModel().flatRows).
- utils/formulaUtils.js: isSameCellValue — handleSave не шлёт cell_updated,
  если значение не изменилось (число/строка, «1 500,0», пусто/null); формула
  всегда считается изменённой.
- Фокус: setTimeout(50) → requestAnimationFrame; после закрытия редактора
  фокус возвращается в <td> ячейки.

Тесты: utils/cellNavigation.test.js, utils/formulaUtils.test.js (новые,
15 тестов). node --test src/components/RealtimeTable/utils/*.test.js:
85 тестов, 84 passed, 1 известный pre-existing fail (columnLayoutUtils.test.js,
нет node_modules в этом worktree, см. PR #281/#283).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-11-01 16:14:02 +04:00
Andrey Epifancev
733d7a9036 fix(denomination): база разрядности — тыс. руб., масштабировать только денежные колонки
Селектор разрядности (AURORA-1650) считал базой рубли, хотя в базе суммы
хранятся в тыс. руб. (формы 1/4, сателлиты формы 2, лимитные строки АХР
после AURORA-1897). По умолчанию стояло «в руб.», и тысячи показывались
под видом рублей; при выборе «в тыс. руб.» значения делились ещё раз.
Делитель также применялся к количествам, площади, ставке НДС, курсу,
кодам и ID — не только к деньгам. Редактор ячейки не учитывал разрядность.

- web/src/components/RealtimeTable/utils/moneyUtils.js — новый модуль:
  UNIT_IN_RUB, getDisplayFactor(baseUnit, denomination), getMoneyUnit
  (денежная единица колонки по accessorKey/sheetName, с явным
  columnDef.moneyUnit как переопределением), TEXT_COLUMN_IDS (перенесён
  из Cell.jsx), resolveDenomination/DEFAULT_DENOMINATION, AHR_LIMIT_SHEET.
  Модуль не импортирует конфиги форм — работает под node --test.
- useDenomination.js — значение по умолчанию 'thousand', ключ хранения
  со суффиксом _denomination_v2 (старые 'rub'/'thousand' больше не
  читаются со старым смыслом); getDenominationDivisor убран.
- tableColumns.jsx/Cell.jsx — displayDivisor заменён на displayFactor
  (умножение, не деление), множитель считается на колонку через
  getMoneyUnit/getDisplayFactor с учётом sheetName; isEditable запрещает
  редактирование денежной ячейки, если разрядность не базовая; на листе
  AHR_LIMIT множитель всегда 1 (значения в рублях, как есть).
- SettingPanel.jsx — селектор скрыт на листе AHR_LIMIT, рядом с ним
  подсказка «Ввод сумм — в тыс. руб.».
- SvodPage/Svod2Page/ProjectSummariesPage — масштабирование по
  meta.money вместо regex по id/блок-листа текстовых id; построители
  колонок проставляют meta.money на денежных метриках.
- DenominationSelect.jsx — «в млн руб.», «в млрд руб.» без точки.

Тесты: web/src/components/RealtimeTable/utils/moneyUtils.test.js
(node --test), полный набор web/src/components/RealtimeTable/utils —
52/52 зелёных. npm run build проходит.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-11-01 16:08:20 +04:00
Andrey Epifancev
d7ab4d170c feat(table): плашка контроля ошибок со счётчиком, переходом к ячейке и подсказкой (AURORA-1893)
- validationUtils.collectInvalidErrors теперь собирает ошибки по ЯЧЕЙКАМ
  (id/ruleId/columnId/lineId/rowLabel/message), а не одну запись на колонку;
  новая groupValidationErrors(errors) группирует их обратно по правилу+колонке
  со счётчиком для меню плашки.
- useValidationRules: getCellErrors(columnId, value, row) отдаёт причины
  конкретной ячейки (для подсказки), isCellInvalid выражен через него;
  сравнение стабильности errors — по id (он уже кодирует правило+колонку+строку).
- RealtimeTable: handleNavigateToError({lineId, columnId}) — находит строку по
  getRowId в table.getRowModel().flatRows (не .rows, т.к. flatRows не фильтруется
  по свёрнутым группам), раскрывает родителей через setExpanded, включает
  скрытую колонку через handleSetColumnsVisibility, выделяет ячейку как
  activeSearchMatch и скроллит к ней — по образцу navigateToSearchMatch.
- ValidationErrorsAlert: красная плашка (#FDEDED/#D32F2F) со счётчиком
  «Ошибок: N», кнопками ‹›  для прохода по всем ошибкам и меню, сгруппированным
  по правилу+колонке (до 20 строк, дальше «и ещё N»); перенесена в начало
  SettingPanel, перед группами настроек.
- tableColumns/Cell: invalidMessage (из getCellErrors) доходит до Cell и
  показывается подсказкой (MUI Tooltip) при наведении на невалидную ячейку.

Тесты (node --test .../validationUtils.test.js): 12/12, включая 5 существующих
тестов nonNegativeRule из AURORA-1892 (не менялись, подтверждают отсутствие
регрессии) и 7 новых для collectInvalidErrors/groupValidationErrors.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-11-01 15:11:26 +04:00
Andrey Epifancev
df6ec795a3 feat(table): визуально отличать редактируемые ячейки от расчётных и закрытых (AURORA-1890)
- utils/cellEditability.js: isCellEditable/isComputedColumn — чистые функции,
  isComputedColumn повторяет часть v3._apply_form_cell/_apply_form3_cell
  (0023_apply_cell_empty_string.sql), чтобы админ не видел вычисляемые
  колонки как редактируемые. tableColumns.jsx использует isCellEditable
  вместо инлайновой проверки.
- useRealtimeData.js: возвращает stageColumnDeadlines (closes_at по колонке
  текущего этапа) рядом с columnsCurStage.
- Cell.jsx: редактируемая ячейка — белый фон, рамка 1px #7FA7C9 (2px при
  наведении), курсор text; нередактируемая ячейка строки INPUT — фон
  #F4F5F7, текст #5F6B7A; занятая коллегой — пунктирная оранжевая рамка
  2px #F0A030 без изменения фона. Строки ITEM/GROUP/ROOT не затронуты.
  Сохранён порядок стилей из AURORA-1894 (INVALID_STYLES последним) и
  спред fontWeight для отрицательных чисел из AURORA-1892.
- TableHead.jsx: метка срока ввода «✎ до DD.MM HH:mm» в заголовке колонки
  текущего этапа, только для исполнителя (utils/deadlineFormat.js).
- SettingPanel/CellLegend.jsx: иконка "?" с легендой (можно вводить /
  расчёт или закрыто) рядом с плашкой контроля ошибок, без новой панели
  и без новых цветов в palettes columnColors.js.

node --test: cellEditability.test.js, deadlineFormat.test.js — 18/18.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-11-01 13:00:40 +04:00
Andrey Epifancev
2e6c94fb07 fix(table): формула из localStorage не перезаписывает чужое значение ячейки
Пока AURORA-1896 не перенесёт формулы на сервер, временно исправляем
потерю данных в EditCell:

- resolveEditorState/isSameCellValue (formulaUtils.js) — чистые функции:
  формула подставляется в редактор только если её результат совпадает
  с текущим значением ячейки, иначе она устарела (stale) и удаляется
  из localStorage.
- EditCell: открытие и закрытие ячейки без правки больше не шлёт
  cell_updated (сверка с initialEditorValue при выходе из редактора;
  для обычных значений — дополнительно через isSameCellValue). Если
  введённая формула не вычисляется — toast и редактор остаётся открытым,
  на сервер ничего не уходит.
- tableColumns.jsx: ключ формулы строится от getRowId(cell.row) (line_id
  из данных), а не от cell.row.id (позиционный индекс-путь в дереве,
  переезжающий при вставке/удалении строк). Префикс ключа — formula_v2_.
- RealtimeTable: при монтировании once-очистка устаревших ключей
  formula_* без суффикса _v2 — они привязаны к позиции строки и стали
  недостоверны.

Тесты: web/src/components/RealtimeTable/utils/formulaUtils.test.js,
node --test — 9/9 новых + 5/5 ранее существующих в utils/ зелёные.

Closes #264.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-31 14:11:34 +04:00
PotapovaA
bce897f4ed правки 2026-10-16 14:55:58 +03:00
PotapovaA
6c3cd5b2e0 добавление селекта для изменения разрядности в твблицах 2026-10-16 14:41:19 +03:00
PotapovaA
e1596e8782 fix style 2026-09-14 12:51:20 +03:00
PotapovaA
37a93f400d исправила цвета в таблице 2026-09-14 11:39:14 +03:00
PotapovaA
d9511ae7c5 fix 2026-08-19 18:38:54 +03:00
PotapovaA
e2760bb39a fix header 2026-08-19 17:47:09 +03:00
PotapovaA
956d1419ca fix 2026-08-13 13:01:39 +03:00
PotapovaA
911962135e Merge branch 'test' into vsp-choose-form2-2 2026-08-12 18:48:48 +03:00
PotapovaA
ca6e0be255 fix 2026-08-11 18:34:24 +03:00
PotapovaA
5634a16143 add column of stage for table 2026-08-10 18:43:05 +03:00
PotapovaA
b150415f6d готово 2026-08-07 17:32:07 +03:00
PotapovaA
72f2c67bdc исправления от линтера 2026-08-06 17:44:49 +03:00
e0c8c57fc2 vsp-choose-form2-2: выбор ВСП на фронте 2026-08-06 17:14:21 +03:00
65ecb164f3 [AURORA-1225] - логические ограничения для столбцов (требования №1 и требования №2) 2026-08-03 11:15:34 +03:00
PotapovaA
e4726b6284 правки 2026-07-24 17:26:05 +03:00
PotapovaA
3c7aafc8bb Оптимизация 2026-07-24 12:58:15 +03:00
PotapovaA
acd4645a4e fix aurora-1149 2026-07-03 12:46:05 +03:00
PotapovaA
a23a2dffc6 865 2026-07-02 17:31:23 +03:00
PotapovaA
aa18a8e19c web сокеты для начала/конца редактирования ячейки 2026-06-22 17:16:29 +03:00
PotapovaA
ca11d55228 ширина столбцов по умолчанию 2026-06-22 13:57:24 +03:00
PotapovaA
bafae2ca58 формула для исполнителей 2026-06-22 13:33:32 +03:00
PotapovaA
d1d1f90268 фикс плывущей таблицы 2026-06-22 10:19:12 +03:00
PotapovaA
56833f454b исправила иерархию, блокировка ячеек, виртуализация строк 2026-05-29 18:38:05 +03:00
PotapovaA
52de655149 ws для ячеек 2026-05-28 12:12:16 +03:00
PotapovaA
079e719f71 ws - в процессе 2026-05-27 16:21:04 +03:00
PotapovaA
58d67d219f форма 2026-05-26 15:24:28 +03:00
PotapovaA
a92df7ae14 форма 1 2026-05-22 17:30:28 +03:00
PotapovaA
b8a1427cf6 стили 2026-05-21 11:09:31 +03:00
PotapovaA
24a59fb853 front new 2026-05-18 17:33:45 +03:00