Andrey Epifancev ac686991a8 openspec: архив aurora-1848-sheet-json и aurora-1850-upd-form-cells-subtree
Обе задачи влиты в test 01.11 (PR #239/#242, #244/#274), архив пропущен.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 01:29:46 +04:00

44 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# realtime-sheet-updates Specification
## Purpose
Как редактируемая таблица фронта (лист формы, отчёт проекта) применяет входящие правки соавторов и эхо собственных правок к уже загруженным строкам и как она показывает значения, которых нет в строке. Цель — чтобы правки не терялись, даже если строки загружены без null-полей.
## Requirements
### Requirement: Входящая правка применяется к отсутствующему ключу
Когда приходит обновление строк — сообщение WebSocket `cell_updated` или ответ PATCH на собственную правку — фронт SHALL записать в найденную строку каждое поле из обновления, на любой глубине. Это делается и тогда, когда ключа этого поля или содержащего его блока в загруженной строке нет. Правка SHALL NOT теряться из-за того, что при загрузке листа поле было опущено.
#### Scenario: Соавтор заполняет пустую ячейку
- **WHEN** лист загружен без ключа `data.q1.<поле>` у строки (ячейка пустая), а соавтор вводит в эту ячейку значение
- **THEN** у пользователя ячейка показывает новое значение без перезагрузки листа
#### Scenario: Отсутствует весь блок
- **WHEN** в загруженной строке нет ключа блока `data.<блок>`, а приходит обновление с `data.<блок>.<поле>`
- **THEN** в строке появляется блок с этим полем, а ячейка показывает значение
#### Scenario: Прочие поля строки сохраняются
- **WHEN** приходит обновление одного поля строки
- **THEN** остальные поля строки сохраняют прежние значения
### Requirement: Очистка ячейки доходит до соавторов
Если в обновлении поле равно `null`, фронт SHALL записать `null`, и ячейка SHALL показываться пустой.
#### Scenario: Соавтор очищает ячейку
- **WHEN** у пользователя ячейка показывает значение, а соавтор очищает её
- **THEN** у пользователя ячейка становится пустой без перезагрузки листа
### Requirement: Отсутствующее значение показывается как null
Если ключа нет в `data`, редактируемая таблица, свод 1 и свод 2 SHALL показывать и обрабатывать значение так же, как явный `null`. Отображение: пустая ячейка в листе, «—» в сводах. Правила подсветки ошибок валидации не срабатывают. Поиск и фильтр по колонке не находят такую ячейку по непустому запросу. При входе в редактирование поле ввода пустое. Правка, которую фронт отправляет по WebSocket, SHALL всегда содержать ключ `value`; пустое значение передаётся как `null`, а не опускается.
#### Scenario: Выход из пустой ячейки без ввода
- **WHEN** пользователь входит в редактирование ячейки, ключа которой нет в строке, и выходит без ввода
- **THEN** сообщение `cell_updated` содержит `"value": null`, как и для ячейки с явным `null`, а пользователь не получает ошибку
#### Scenario: Пустая ячейка свода 2
- **WHEN** свод 2 загружен без ключа `data.q1.<поле>` у строки
- **THEN** ячейка показывает «—», как и для `null`
#### Scenario: Валидация не срабатывает
- **WHEN** у строки листа отсутствует ключ поля, к которому привязано правило валидации (например, остаток бронирования)
- **THEN** ячейка не подсвечивается как ошибочная