AURORA-1894: красная рамка у ошибки ячейки, тост без Server error:undefined #277
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/275-aurora-1894-error-border-toast"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #275.
Проблема
Ошибки найдены при разборе замечания заказчика «7. Контроль ошибок»:
data.q1.transfer_econ>data.q1.total) рамка оставалась светло-серой(EDITABLE_STYLES), потому что в
Cell.jsxпорядок спреда стилей былINVALID_STYLES, затемEDITABLE_STYLES— редактируемый вариант перетиралкрасную рамку ошибки. У нередактируемых (расчётных) ячеек рамка оставалась
красной, потому что
NOT_EDITABLE_STYLESрамку не задаёт.RealtimeContext.jsстроил текст тоста как`Server error:${data.error.message}` || ''. Backend шлётerrorтострокой (например «Ячейка уже редактируется другим пользователем»), то
объектом
{code, field, message}(ошибки SQL, напримерcomputed_field: q1.corrected_plan). Для строкиdata.error.message—undefined, и|| ''никогда не срабатывает (левая часть — непустаястрока), так что тост показывал «Server error:undefined». А при ошибках БД
пользователь видел технический префикс (
computed_field: ...) вместопонятного текста.
Что сделано
web/src/components/RealtimeTable/Cell/Cell/Cell.jsx— порядок спреда стилейв
cellStylesизменён на base → editable/not-editable → locked → invalid(
INVALID_STYLESтеперь всегда последний), остальной файл не трогал.web/src/components/RealtimeTable/utils/wsErrorUtils.jsсчистой функцией
getWsErrorMessage(error):message || detail;computed_field:→ «Это расчётная ячейка, её нельзя изменить»,role_not_allowed:→ «Нет прав на изменение этой колонки»,window_closed:→ «Окно ввода для этой колонки закрыто»,org_not_assigned→ «Вы не назначены на эту форму»;Server error:;undefined/null(дефолт — «Неизвестная ошибкасервера»).
web/src/components/RealtimeTable/contexts/RealtimeContext.js—toast.error(getWsErrorMessage(data.error))вместо шаблонной строки с|| '';console.log(data.error)вместоconsole.log(data.error.message)(чтобы и в консоли не терять данные для строковых ошибок).
Тесты
cd web && node --test src/components/RealtimeTable/utils/wsErrorUtils.test.js:10 passed, 0 failed — строка, объект с
message, объект безmessage(берёт
detail), объект без обоих полей (дефолтный текст, неundefined),каждый из 4 известных префиксов (в т.ч. в составе
messageобъекта),неизвестный текст без
Server error:, пустая/отсутствующая ошибка.Запускал также весь набор
node --test src/components/RealtimeTable/utils/*.test.js:34 passed, 1 failed — падение в
columnLayoutUtils.test.js(
Cannot find package '@tanstack/table-core') не связано с этой правкой:в
web/node_modulesнет@tanstack/table-coreвообще (не установлен в этомворкзпейсе); подтвердил, что падение воспроизводится и на коммите до моих
правок (временно стэшировал diff и прогнал тест ещё раз). Лёгкий фикс/логика
Cell.jsx и RealtimeContext.js не задействует этот пакет.
npx biome checkна изменённых и новом файлах — чисто.Сценарий А и Б проверены по коду (живой стенд не поднимал, backend не трогал):
INVALID_STYLES(красная рамка 2px) теперьнакладывается после
EDITABLE_STYLES/NOT_EDITABLE_STYLESиLOCKED_STYLES,так что у ячейки с ошибкой рамка красная независимо от
isEditable.data.errorкак строка («Ячейка уже редактируется другим пользователем»,websocket.py:1051/1095) теперь попадает в тост как есть;
data.errorкакобъект с
messageвидаcomputed_field: q1.corrected_plan(websocket.py:1217-1220, map_sqlalchemy_error) теперь даёт понятный текст
«Это расчётная ячейка, её нельзя изменить» вместо «Server error:undefined».
Rulings
R-1:
console.log(data.error.message)заменён наconsole.log(data.error)—не было явно в тикете, но то же
|| undefined-поведение било и по консолидля ошибок-строк; счёл логичным исправить в рамках той же правки, т.к. это
однострочное изменение в том же месте кода.
R-2: для
org_not_assignedсопоставление по префиксу черезstartsWith, каки для остальных (хотя в спеке префикс без
:) — покрывает и голыйorg_not_assigned, и варианты видаorg_not_assigned: form_id=123, еслиbackend когда-нибудь добавит подробности.
⚠️ Известное пересечение: соседняя ветка
feat/276-aurora-1892-negative-amounts(#276) также правит
Cell.jsx(выноситformatNumberвnumberFormat.js,меняет раскраску отрицательных чисел). Эта правка — только реордер спреда
стилей в
cellStyles, остальной файл не тронут, чтобы минимизироватьповерхность конфликта. Обе ветки от одного
origin/testtip (9229ee5),слияние — на человеке.
🤖 Generated with Claude Code
Cell.jsx: порядок спреда стилей — base → editable/not-editable → locked → invalid (INVALID_STYLES последним), чтобы красная рамка 2px не перетиралась EDITABLE_STYLES у вводимых ячеек с ошибкой. utils/wsErrorUtils.js: getWsErrorMessage(error) — строка возвращается как есть, объект берёт message || detail, известные технические префиксы (computed_field:, role_not_allowed:, window_closed:, org_not_assigned) заменяются понятным текстом, прочее отдаётся без "Server error:". RealtimeContext.js: toast.error(getWsErrorMessage(data.error)) вместо `Server error:${data.error.message}` || '', которое всегда давало undefined для ошибок-строк (|| не срабатывает на непустой строке). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>