Перенос, декомпозиция и перекраска форм CT/KPS/OID на @tnsu/ui-kit, config-driven дашборд-реестр по трём типам документов. Из отслеживания исключены артефакты сборки (lib-commonjs/jest-output/release) — забыты в .gitignore ранее.
9.7 KiB
REPAINT-MAP — перекраска форм CT/OID/KPS на @tnsu/ui-kit
Живая карта работ по переводу форм портала на общий UI-пакет. Ведётся по ходу.
Связано: docs/BEHAVIORS.md (инвентарь поведения форм).
Принцип
Красим один раз в ui-kit через токены, утверждаем в Storybook. В проекте —
только композиция + узкодоменное. «Все цвета в ui-kit» = ui-kit это источник правды
по токенам; потребитель (ct-forms-portal) держит зеркало src/styles/_design-tokens.scss
(heft не резолвит scss из node_modules), формы красятся из него.
Компоненты не «для KPS», а «для семейства СТ-форм»: API проектируем сразу под 3 формы (CT/OID используют те же Fluent-примитивы). Правило аддитивности: не хватает пропа для CT/OID → добавляем опциональный (не ломает KPS, semver minor/patch). Escape hatch: не ложится на 3 формы без уродства → оставляем локальным.
Архитектура токенов
@tnsu/ui-kit src/tokens/_tokens.scss ← ИСТОЧНИК ПРАВДЫ (navy/gold, radius, shadow, bp, миксины)
│ (копия при изменении)
▼
ct-forms-portal src/styles/_design-tokens.scss ← зеркало для SPFx-сборки
▲ (импортят свои .scss: Dashboard, CtFormsPortal, …)
│
forms/kps/components/common/_theme.scss ← МОСТ: семантика формы ($accent,$ok,$supplier-bg…)
▲ → бренд-токены. Имена сохранены.
│ @import '../common/theme'
12 доменных *.module.scss шагов ← перекрашиваются БЕЗ своих правок
Три корзины (по инвентарю KPS-формы)
A. Уже есть в ui-kit → заменить импорт (мгновенная перекраска)
| Было (Fluent/локальное) | Стало (ui-kit) |
|---|---|
TextField |
TextInput / TextArea / MoneyInput (числа) |
DefaultButton / PrimaryButton |
Button (variant secondary/primary) |
низ StepShell (кнопки Назад/Далее) |
FormActions |
MessageBar (+Type) |
Alert (map severity) |
Icon |
Icon / IconSprite |
локальный Pill |
Badge |
локальный Breadcrumbs |
Stepper |
локальный common/FormHeader |
FormHeader |
B. Создать в ui-kit (нужны и CT/OID)
| Новый компонент | Драйвер / где нужен |
|---|---|
Checkbox (+ строчный вариант) |
RequestRow, RequestLines, Step1ReadOnlyView (Шаг 1) |
Spinner / Loader |
KpFileList, CurrencyRatesForm, AiCommentBlock, Step4Approval |
IconButton |
UploadedKpList, AiCommentBlock, CurrencyRatesForm, Step4Approval |
Dialog / Modal (generic, с телом+полями) |
Step3BuildCt, Step4Approval, InlineApprovalChain (ConfirmDialog не тянет) |
Link |
UploadedKpList (скачать) |
C. Доменное — остаётся в проекте (красим токенами + примитивами ui-kit)
Step3BuildCt/ComparisonMatrix,MatrixRowView,OfferCells— матрица сравнения СТ.Step3BuildCt/CriteriaTable— таблица критериев.common/ApprovalChain,Step4Approval/InlineApprovalChain— цепочки (пилюли изBadge).Step2LoadKp/KpFileList,UploadedKpList— список файлов КП (статусы обработки Syntex/поток). Загрузку можно частично наFileDropzone+AttachmentList.
Семантические токены формы (мост _theme.scss)
| Переменная | Бренд-токен | Было (Fluent) |
|---|---|---|
$accent |
$navy-800 |
#0078d4 |
$accent-bg |
$navy-50 |
#eff6fc |
$accent-border |
$navy-100 |
#c7e0f4 |
$accent-dark |
$navy-950 |
#004578 |
$accent-hover |
$navy-700 |
#106ebe |
$ok / $ok-bg |
$green-600 / $green-50 |
#107c10 / #dff6dd |
$danger / $danger-bg |
$red-500 / $red-50 |
#a4262c / #fde7e9 |
$warn-fg / $warn-bg |
$amber-700 / $amber-50 |
#7d5900 / — |
$text / $muted / $muted-2 |
$gray-900 / $gray-500 / $gray-400 |
#323130 / #605e5c / #a19f9d |
$border / $border-strong |
$gray-200 / $gray-300 |
#edebe9 / #c8c6c4 |
$head-bg / $hover / $surface |
$gray-50 / $gray-100 / $white |
#faf9f8 / #f3f2f1 / #fff |
$supplier-bg / $supplier-border |
$gold-50 / $gold-100 |
#fffdf0 / #f2e9b8 |
Роадмап и статус
- Фаза 0 — Токены.
$amber-50в ui-kit; зеркалоsrc/styles/_design-tokens.scss; мостforms/kps/components/common/_theme.scss→ бренд. heft build ок. Осталось в рамках гигиены: перевестиDashboard.module.scss/CtFormsPortal.module.scss(шелл) с хардкодов на зеркало — не блокер. - Фаза 1 — Примитивы (корзина B) собраны в ui-kit (build ок, 68 модулей):
Checkbox(checked/indeterminate/disabled/readOnly/label/ariaLabel),Spinner(xSmall/small/medium/large, label, block),IconButton(icon: IconName, title, danger, size),Dialog(open/title/subText/onDismiss/footer/width, Esc+overlay close),Link(href/onClick/target/download). В спрайт добавлены иконкиarrow-up,arrow-down,swap,refresh. Осталось: Storybook-утверждение дизайна → релиз ui-kit (skill publish-ui-kit) →npm i @tnsu/ui-kit@latestв ct-forms-portal. - [~] Фаза 2 — Перекраска KPS (по шагам; heft build после каждого):
- Шаг 1 (
Step1SelectPositions): Checkbox/Icon → ui-kit (+ariaLabel),Pill→адаптер надBadge(перекрасил все 6 мест сразу),#ffffff→$surface. build ок. - Шаг 2 (
Step2LoadKp/*): MessageBar→Alert, Spinner/IconButton/Link/Icon→ui-kit, DefaultButton→Button, TextField→TextInput (в обёртке для className), литералы→токены. build ок. Косметика: TextInput без suffix/ariaLabel (KZT→placeholder); dropzone оставлен доменным. Долг: перед Шагом 4 добавить в Alert вариантinfo(MessageBarType.info) + переиздать ui-kit. - Шаг 3 (
Step3BuildCt/*): AiCommentBlock (IconButton/Spinner/Alert), AddExtraRow + supplier toolbar (Button/TextInput), OfferCells/CriteriaTable (borderless TextInput/TextArea в обёртке.input), Dialog AI-промпта (ui-kit Dialog + footer). Матрица/критерии — домен, все литералы→токены ($accent-border/-bg/-dark/-hover, $supplier-bg, $warn-bg/-fg, $surface, $danger). Микро-кнопки в ячейках (×/+/удалить поставщика) оставлены доменными. build ок. Потребовало ui-kit 0.11.0: TextInput/TextAreaborderless+ariaLabel+onKeyDown+autoFocus, Alert вариантinfo, иконкаinfo. - Шаг 4 (
Step4Approval.tsx+InlineApprovalChain.tsx): MessageBar→Alert (ok/err/info/warn), IconButton (arrow-up/down/trash/swap), Button (approve=primary, reject=danger, send/refresh с иконками), Dialog×2 (решение/замена) → ui-kit Dialog+footer, TextField→TextInput/TextArea, литералы→токены ($surface,$sh-2). Цепочки — домен, пилюли через Pill→Badge. build ок. - common:
StepShellкнопки→Button(split-раскладка сохранена),common/FormHeader→адаптер над ui-kitFormHeader(right=Pill→Badge),Breadcrumbs→адаптер надStepper(адаптивный), убран@fluentui References.scssизKpsCtForm.module.scss, #a4262c→$danger. ОсиротевшиеFormHeader.module.scss/Breadcrumbs.module.scssудалены. - ✅ Fluent полностью удалён из KPS-формы (0 импортов @fluentui). Фаза 2 завершена, build ок.
- KPS = двойной эталон (структура + примитивы).
- Шаг 1 (
- Фаза 3 — CT, затем OID. НЕ только перекраска: декомпозиция god-компонентов
(
Step3ComparisonTable.tsx~2200–2500 стр) в структуру KPS + сборка из ui-kit + сохранить 100% поведения. Инвентарь поведения → резка → build/workbench на каждом шаге.
Заметки / риски
- Декомпозиция CT/OID — самая рискованная часть; KPS = готовый чертёж (тот же скелет Step1→Step2→Step3 матрица→Step4; отличия доменные: CT disciplineCode/SMR/agskCode, OID parentGroup/priceSmeta).
- При изменении токенов в ui-kit — синхронизировать зеркало
src/styles/_design-tokens.scss.