usePersistedOpen хранит в localStorage признак «модалка создания открыта»
для типов заявок, доступа к заявкам, маршрутов и шагов маршрута (ключ
шага — по id маршрута). После F5 окно открывается снова с полями из
черновика; любое закрытие сбрасывает признак, а сам черновик остаётся до
сохранения или «Очистить». Редактирование не восстанавливается.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Раньше сохранённое значение только мёржилось с дефолтом: удалённые поля
оставались в состоянии, а значение другого типа (или null вместо
объекта) роняло рендер. coerceStored отбрасывает лишние ключи и заменяет
значения не того типа дефолтом; покрыто тестами.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
FormModal получил isDirty: если в форме редактирования существующей
записи что-то изменили, крестик, «Отмена» и клик мимо окна сначала
показывают диалог «Закрыть без сохранения?». Подключено к редактированию
типа заявки, маршрута, шага маршрута и согласующего в заявке. Формы
создания не затронуты — их черновик и так сохраняется.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
На живой странице оверлей модалки жил внутри канвы веб-части, чей
контекст наложения ниже шапки SharePoint: верх высокого окна (например,
«Новый шаг маршрута») уезжал под шапку. В workbench шапки нет, поэтому
там было незаметно. Теперь Modal и ConfirmDialog рендерят подложку через
ModalOverlay (портал в document.body) с z-index выше шапки; меню
выпадающих списков подняты над ним.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Модалки по жёлтым кнопкам «Добавить» (типы заявок, доступ к заявкам,
маршруты, шаги маршрута) теряли введённое при случайном клике по
подложке. Теперь черновик живёт в localStorage (useFormDraft) и
переживает закрытие окна, «Отмену» и F5. Сбрасывается после успешного
сохранения или кнопкой «Очистить» в подвале модалки. Формы
редактирования не персистятся — всегда открываются с данными сервера.
Попутно убраны Sass-предупреждения mixed-decls в Card.module.scss.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Права на заявку выдаёт бэкенд по вебхуку на изменение элемента списка данных.
Массовая и одиночная замена писали только в список согласования, вебхук не
приходил, и новый человек видел «Элемент не найден». Теперь после смены
(и добавления шага) в заявку пишется её текущий RequestStatus — появляется
новая версия элемента.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
---------
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/28
Канву SharePoint мы и раньше разжимали (тот же :global хак + supportsFullBleed
в манифесте), но содержимое упиралось в max-width: 1080px у .content и
центрировалось — визуально это читалось как «не открывается на всю ширину».
Переношу раскладку портала (RequestPortal.module.scss):
- корень .approvalAdmin — width: 100%, padding: 0;
- .shell больше не карточка: без рамки, тени, скруглений и overflow: hidden
(последний ломает sticky), align-items: flex-start, min-height: 78vh;
- .side — заливка $navy-800 на колонке (align-self: stretch), сам Sidebar
внутри sticky на 100vh: градиент не плывёт от высоты соседа, и под рейлом
на длинных таблицах нет белого провала, если sticky не включился;
- .content — сняты max-width и margin: auto, остались только отступы;
- мобильный брейкпоинт обновлён под новую схему: десктопные правила рейла
снимаются явно, иначе sticky+100vh спорил бы с position: fixed, который
ui-kit ставит drawer'у, при равной специфичности.
Разметка AdminApp.tsx не менялась — структура уже совпадала с портальной.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/17
Правила из frontend/.gitignore перенесены в корневой .gitignore,
дублирующий файл удалён. README дополнен описанием SPFx frontend
(ApprovalAdmin), который ранее был ошибочно указан как отсутствующий.