3421922a0801b93bb157842b49a24866562e36cb
Канву 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>
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
Description
Languages
C#
57.2%
TypeScript
38.1%
SCSS
3.3%
PowerShell
1.2%