Тяжёлые GET листов, сводов и отчётов проектов: готовый JSON из Postgres без pydantic-модели на строку (PR A) и без null-полей в data листа и сводов с правкой фронта (PR B). Требования — sheet-read-api и realtime-sheet-updates; дизайн, риски, тесты и сценарий замера — design.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4.8 KiB
Spec Delta
Purpose
Как редактируемая таблица фронта (лист формы, отчёт проекта) применяет входящие правки соавторов и эхо собственных правок к уже загруженным строкам и как она показывает значения, которых нет в строке. Цель — чтобы правки не терялись, даже если строки загружены без null-полей.
ADDED 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 ячейка не подсвечивается как ошибочная