Andrey Epifancev b701a4f5ff docs(openspec): aurora-1848-sheet-json — proposal, spec, design
Тяжёлые 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>
2026-10-28 20:24:23 +04:00

4.8 KiB
Raw Blame History

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 ячейка не подсвечивается как ошибочная