gorbenko.pavel f3b0f0ad48
Tests / frontend-test (push) Successful in 1m39s
Tests / backend-test (push) Successful in 9m27s
Персист модалок: черновики, восстановление после F5, предупреждение при выходе (#30)
Модалки по жёлтым кнопкам теряли введённое при случайном клике мимо окна.

**Формы создания** (типы заявок, доступ к заявкам, маршруты, шаги маршрута)
- Черновик полей хранится в 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)

---------

Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/30
2026-10-19 04:46:16 +00:00
2026-08-13 04:44:08 +00:00
2026-08-27 11:43:45 +00:00
2026-08-13 04:44:08 +00:00
2026-08-13 04:44:08 +00:00

Tnsu.ApprovalRoute

Сервис маршрутов согласования: типы заявок (RequestType) и шаблонные маршруты согласования (TemplateRoute → TemplateRouteStep) с разрешением подходящего маршрута под конкретные параметры (проект, тип заявки, сумма и т.д.).

Архитектура повторяет tnsu-inventory: 4 слоя (Api / Application / Domain / Infrastructure), MediatR-стиль сервисов, EF Core + PostgreSQL.

Стек

Компонент Технология
Backend .NET 10, ASP.NET Core (MVC controllers), EF Core
БД PostgreSQL
Авторизация Entra ID (JWT Bearer) либо dev-схема (X-Dev-User-Email) при отсутствии конфигурации Entra
API-документация Scalar (/scalar) на основе OpenAPI
Интеграция api.tnsu.kz (портал 1С)
Frontend SPFx-веб-парт (React + FluentUI) — админка маршрутов согласования на портале SharePoint

Структура

backend/
  Directory.Build.props       # общие настройки таргета (net10.0, nullable, etc.)
  Directory.Packages.props    # централизованные версии пакетов
  Tnsu.ApprovalRoute.sln
  Tnsu.ApprovalRoute.Domain/          # сущности и enum'ы домена
  Tnsu.ApprovalRoute.Application/     # сервисы, DTO, валидаторы
  Tnsu.ApprovalRoute.Infrastructure/  # EF Core DbContext, миграции, клиент tnsu-portal
  Tnsu.ApprovalRoute.Api/             # ASP.NET Core Controllers, Program.cs, авторизация
  tests/
    Tnsu.ApprovalRoute.IntegrationTests/
frontend/
  src/webparts/approvalAdmin/  # SPFx веб-парт «ApprovalAdmin» (React, FluentUI)
docker-compose.yml

Frontend (SPFx)

Админка маршрутов согласования встраивается веб-частью SPFx на портал SharePoint (аналогично tnsu-inventory).

cd frontend
npm install
npm run start        # heft start — локальный SharePoint Workbench
npm run build         # heft test + package-solution --production

Свойства веб-части: apiBaseUrl, useDevAuth, devUserEmail, aadResourceId, portalBaseUrl.

API

Метод Путь Описание
CRUD /api/request-types Типы заявок
CRUD /api/template-routes Шаблонные маршруты согласования
GET /api/template-routes/resolve Подбор подходящего маршрута по параметрам
CRUD /api/template-routes/{routeId}/steps Шаги шаблонного маршрута
GET /health Health-check

Запуск локально

cd backend
dotnet run --project Tnsu.ApprovalRoute.Api

Требуется PostgreSQL (строка подключения — ConnectionStrings:Postgres в appsettings.json).

Авторизация:

  • Entra ID — задать Entra:TenantId и Entra:Audience в конфигурации
  • Без Entra — используется dev-схема, текущий пользователь передаётся заголовком X-Dev-User-Email

После запуска документация API доступна на /scalar.

Запуск через Docker Compose

cp .env.example .env
docker compose up --build

Поднимает postgres и api.

Сервис URL
API http://localhost:8082
API health http://localhost:8082/health
Postgres localhost:5435

Тесты

cd backend
dotnet test
S
Description
No description provided
Readme 5.7 MiB
Languages
C# 57.2%
TypeScript 38.1%
SCSS 3.3%
PowerShell 1.2%