Обе задачи влиты в test 01.11 (PR #239/#242, #244/#274), архив пропущен. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
44 lines
4.8 KiB
Markdown
44 lines
4.8 KiB
Markdown
# 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** ячейка не подсвечивается как ошибочная
|