Персист модалок: черновики, восстановление после F5, предупреждение при выходе #30

Merged
gorbenko.pavel merged 7 commits from feature/form-drafts into main 2026-10-19 04:46:16 +00:00
Owner

Модалки по жёлтым кнопкам теряли введённое при случайном клике мимо окна.

Формы создания (типы заявок, доступ к заявкам, маршруты, шаги маршрута)

  • Черновик полей хранится в localStorage (useFormDraft) и переживает закрытие окна, «Отмену» и F5.
  • Окно, открытое в момент F5, открывается снова (usePersistedOpen); закрытие сбрасывает только признак, черновик остаётся.
  • Черновик стирается после успешного сохранения или кнопкой «Очистить» в подвале.

Формы редактирования

  • Не персистятся — открываются с данными сервера.
  • При выходе с несохранёнными правками (крестик, «Отмена», клик мимо) — диалог «Закрыть без сохранения?» (isDirty в FormModal).

Устойчивость к старым данным в localStorage

  • coerceStored приводит сохранённое значение к форме текущего дефолта по полям: новое поле — дефолт, удалённое отбрасывается, значение другого типа и null заменяются дефолтом. Покрыто тестами.

Прочее

  • Modal и ConfirmDialog рендерятся порталом в body поверх шапки SharePoint — на живой странице верх высокого окна уезжал под шапку.
  • Убраны Sass-предупреждения mixed-decls в Card.module.scss.

🤖 Generated with Claude Code

Модалки по жёлтым кнопкам теряли введённое при случайном клике мимо окна. **Формы создания** (типы заявок, доступ к заявкам, маршруты, шаги маршрута) - Черновик полей хранится в localStorage (useFormDraft) и переживает закрытие окна, «Отмену» и F5. - Окно, открытое в момент F5, открывается снова (usePersistedOpen); закрытие сбрасывает только признак, черновик остаётся. - Черновик стирается после успешного сохранения или кнопкой «Очистить» в подвале. **Формы редактирования** - Не персистятся — открываются с данными сервера. - При выходе с несохранёнными правками (крестик, «Отмена», клик мимо) — диалог «Закрыть без сохранения?» (isDirty в FormModal). **Устойчивость к старым данным в localStorage** - coerceStored приводит сохранённое значение к форме текущего дефолта по полям: новое поле — дефолт, удалённое отбрасывается, значение другого типа и null заменяются дефолтом. Покрыто тестами. **Прочее** - Modal и ConfirmDialog рендерятся порталом в body поверх шапки SharePoint — на живой странице верх высокого окна уезжал под шапку. - Убраны Sass-предупреждения mixed-decls в Card.module.scss. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
gorbenko.pavel added 1 commit 2026-10-15 12:38:58 +00:00
Черновики форм создания сохраняются в localStorage
Tests / backend-test (pull_request) Successful in 1m35s
Tests / frontend-test (pull_request) Successful in 1m31s
3d970bf461
Модалки по жёлтым кнопкам «Добавить» (типы заявок, доступ к заявкам,
маршруты, шаги маршрута) теряли введённое при случайном клике по
подложке. Теперь черновик живёт в localStorage (useFormDraft) и
переживает закрытие окна, «Отмену» и F5. Сбрасывается после успешного
сохранения или кнопкой «Очистить» в подвале модалки. Формы
редактирования не персистятся — всегда открываются с данными сервера.

Попутно убраны Sass-предупреждения mixed-decls в Card.module.scss.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gorbenko.pavel added 1 commit 2026-10-16 04:42:00 +00:00
Модалки рендерятся порталом в body поверх шапки SharePoint
Tests / frontend-test (pull_request) Successful in 1m31s
Tests / backend-test (pull_request) Successful in 1m38s
b94e6e60f5
На живой странице оверлей модалки жил внутри канвы веб-части, чей
контекст наложения ниже шапки SharePoint: верх высокого окна (например,
«Новый шаг маршрута») уезжал под шапку. В workbench шапки нет, поэтому
там было незаметно. Теперь Modal и ConfirmDialog рендерят подложку через
ModalOverlay (портал в document.body) с z-index выше шапки; меню
выпадающих списков подняты над ним.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gorbenko.pavel added 1 commit 2026-10-16 05:02:44 +00:00
Предупреждение при выходе из формы редактирования с несохранёнными правками
Tests / frontend-test (pull_request) Successful in 1m31s
Tests / backend-test (pull_request) Successful in 1m35s
872686e855
FormModal получил isDirty: если в форме редактирования существующей
записи что-то изменили, крестик, «Отмена» и клик мимо окна сначала
показывают диалог «Закрыть без сохранения?». Подключено к редактированию
типа заявки, маршрута, шага маршрута и согласующего в заявке. Формы
создания не затронуты — их черновик и так сохраняется.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
gorbenko.pavel added 1 commit 2026-10-16 05:16:40 +00:00
Старая запись в localStorage приводится к форме текущей формы
Tests / frontend-test (pull_request) Successful in 1m32s
Tests / backend-test (pull_request) Successful in 2m13s
6deebf9507
Раньше сохранённое значение только мёржилось с дефолтом: удалённые поля
оставались в состоянии, а значение другого типа (или null вместо
объекта) роняло рендер. coerceStored отбрасывает лишние ключи и заменяет
значения не того типа дефолтом; покрыто тестами.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
gorbenko.pavel added 1 commit 2026-10-16 05:30:46 +00:00
Окно создания восстанавливается после F5 вместе с черновиком
Tests / frontend-test (pull_request) Successful in 1m30s
Tests / backend-test (pull_request) Successful in 1m46s
08dc484d03
usePersistedOpen хранит в localStorage признак «модалка создания открыта»
для типов заявок, доступа к заявкам, маршрутов и шагов маршрута (ключ
шага — по id маршрута). После F5 окно открывается снова с полями из
черновика; любое закрытие сбрасывает признак, а сам черновик остаётся до
сохранения или «Очистить». Редактирование не восстанавливается.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
gorbenko.pavel changed title from Черновики форм создания сохраняются в localStorage to Персист модалок: черновики, восстановление после F5, предупреждение при выходе 2026-10-16 05:32:56 +00:00
gorbenko.pavel added 1 commit 2026-10-16 05:39:57 +00:00
Предупреждения резолва маршрута — на русском вместо имён enum
Tests / frontend-test (pull_request) Successful in 1m32s
Tests / backend-test (pull_request) Successful in 1m39s
547c51ca3c
В сообщениях «не найден руководитель типа DirectionHead» и в конфликте
ролей шага пользователь видел имена enum'ов. Теперь везде русские
названия из общего справочника StepLabels (его же использует выгрузка
маршрутов): «Не найден руководитель «Руководитель направления»: не
указан у инициатора в справочнике сотрудников». Для директора Tansu и
управляющего директора, которые берутся из настроек сервиса, —
«Не проставлен «…»: email не задан в настройках сервиса». Так же
исправлены ошибки о дубле шага с типом руководителя.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
gorbenko.pavel added 1 commit 2026-10-16 05:44:30 +00:00
Краткие тексты предупреждений: «Не найден руководитель направления»
Tests / frontend-test (pull_request) Successful in 1m37s
Tests / backend-test (pull_request) Successful in 2m22s
2eccd304bb
Вместо длинных пояснений — короткие фразы: «Не найден руководитель
направления.», «В проекте не найден руководитель проекта.», «Не проставлен
директор Tansu.». Для роли «Безопасность» — «сотрудник службы
безопасности», чтобы не получилось «найден безопасность».

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
gorbenko.pavel merged commit f3b0f0ad48 into main 2026-10-19 04:46:16 +00:00
gorbenko.pavel deleted branch feature/form-drafts 2026-10-19 04:46:16 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gorbenko.pavel/tnsu-approval-route#30