Some checks failed
CI / Backend (.NET 8) (push) Has been cancelled
CI / Web (React + Vite) (push) Has been cancelled
CI / POS (WPF, Windows) (push) Has been cancelled
Docker Web / Build + push Web (push) Has been cancelled
Docker Web / Deploy Web on stage (push) Has been cancelled
S10-4: script-патчер обработал 29 файлов (pages + components).
Подход: посимвольный скан каждой строки с className. Если есть
text-slate-{500..900} / bg-white / bg-slate-{50,100} / border-slate-{100,200,300}
БЕЗ dark:* для того же префикса (text/bg/border/divide/hover-bg) — добавляем
соответствующий dark-companion рядом. Идемпотентен.
Стратегия маппинга:
- text-slate-500 → +dark:text-slate-400
- text-slate-700 → +dark:text-slate-200
- text-slate-900 → +dark:text-slate-100
- bg-white → +dark:bg-slate-900
- bg-slate-50 → +dark:bg-slate-800/60
- border-slate-200 → +dark:border-slate-800
- hover:bg-slate-50 → +dark:hover:bg-slate-800/50
- … и аналогичные.
Skip если на той же строке уже есть dark:<prefix>-* (например
dark:bg-blue-500) — не трогаем чужие осознанные dark-выборы.
stage-ui-s10-dark-audit.spec.ts снимает 20 скриншотов (10 страниц
× light/dark) в reports/dark-mode/. Визуально проверены Dashboard,
ABC-report, Products — контраст ок, brand-зелёный сохранён,
sidebar/таблицы/виджеты читаемы.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
93 lines
6.2 KiB
Markdown
93 lines
6.2 KiB
Markdown
# Sprint 10 — расширенный seed + UX-полировка
|
||
|
||
Цель: реалистичные год-данные для отчётов + дашборд-виджеты +
|
||
глобальный Cmd+K-поиск + dark-mode полировка.
|
||
|
||
Старт: 2026-06-06. Исполнитель: Claude Opus 4.7 (автономный режим).
|
||
|
||
## Принципы
|
||
|
||
- Multi-tenant обязателен.
|
||
- Каждый пункт: build + локальные тесты + `~/deploy-stage.sh` + retest
|
||
на `https://test.admin.food-market.kz`.
|
||
- НЕ трогать: `global.json`, прод-стек, POS WPF.
|
||
|
||
## Чек-лист
|
||
|
||
- [x] **1. Расширенный SeedDemoData --years=1** — `YearDemoSeeder.cs`,
|
||
POST `/api/admin/seed-demo?years=1`. Маркер `Y1-`, идемпотентен,
|
||
жёсткий гард «tenant has activity» когда уже есть Supply/RetailSale.
|
||
Реально создаёт: 8 групп / 200 товаров (25 на группу) / 30 контрагентов
|
||
(15 поставщиков + 15 покупателей) / 80 приёмок равномерно по году /
|
||
**1500 розничных продаж с месячной сезонностью** (Dec пик ×1.6,
|
||
Jul-Aug спад ×0.7..0.75) / 20 customer-returns / 8 wholesale-demands /
|
||
10 списаний / 3 перемещения / 5 инвентаризаций. Stocks пересчитываются
|
||
bulk'ом из StockMovement (5535 шт.). 16.5s на dev-vm. Проверено:
|
||
Sales-stats показывает «revenuePrevMonth 789750», ABC даёт top
|
||
«Колбаса сервелат» класс A с 3.1% доли.
|
||
- [x] **2. Dashboard виджеты** — новый `DashboardController` с 4 endpoint'ами:
|
||
`/api/dashboard/top-products`, `/low-stock`, `/recent-sales`, `/margin`.
|
||
`SalesStatsResponse` расширен `revenueThisWeek/transactionsThisWeek`.
|
||
UI: `components/DashboardWidgets.tsx` — TopProductsWidget, LowStockWidget,
|
||
RecentSalesWidget, MarginWidget; все 4 lazy через `React.lazy` + Suspense
|
||
с Skeleton-плейсхолдером. SignalR `SalePosted` инвалидирует все 4 виджета
|
||
+ sales-stats. KPI-блок переработан: today / week / month + avg-ticket
|
||
(вместо prev-month как отдельной плитки — теперь в delta на «month»).
|
||
Каталог-плитки (товары/контрагенты/склады/точки) остаются ниже.
|
||
- [x] **3. Глобальный search Cmd+K** — backend `GET /api/search/global?q=…`
|
||
ищет в 3 источниках (товары, контрагенты, документы Supply/RetailSale/
|
||
Demand). Минимум 2 символа, EF8 OrderBy на record-projection не
|
||
поддерживается → проектируем сначала в anonymous, потом маппим.
|
||
UI: `components/CommandPalette.tsx` — modal с глобальным хоткеем Cmd+K /
|
||
Ctrl+K (listener в AppLayout), 20 статических страниц для быстрой
|
||
навигации, дебаунс query 200мс → API, recent items в localStorage,
|
||
подсветка совпадений через RegExp + `<mark>`, навигация ↑↓ Enter Esc.
|
||
Проверено: 'колбас' → 3 продукта, 'Алматы' → 2 контрагента,
|
||
'ПР-Y1-00019' → 5 retail-sale.
|
||
- [x] **4. Dark mode полировка** — script-патчер `/tmp/dark-mode-fix.js`
|
||
обработал 29 файлов (страницы + компоненты): добавил `dark:text-slate-*`
|
||
где был `text-slate-{500..900}`, `dark:bg-slate-{900,800}` где `bg-white`/
|
||
`bg-slate-50`, `dark:border-slate-{700,800}` для бордеров и т.д. Без
|
||
ломки уже существующих dark-классов (skip-if-prefix-already-dark).
|
||
Audit-spec `stage-ui-s10-dark-audit.spec.ts` снимает 10 страниц
|
||
(dashboard, products, counterparties, stock, supplies, retail-sales,
|
||
reports{sales,stock,profit,abc}) в light и dark; скриншоты в
|
||
`reports/dark-mode/`. Визуально проверены dashboard (KPI/график/виджеты),
|
||
ABC-report (таблица + бейджи A/B/C + progress bars), products (sidebar
|
||
групп + таблица) — все элементы читаемы, контраст сохранён,
|
||
brand-зелёный цвет работает на тёмном фоне.
|
||
|
||
## Журнал
|
||
|
||
### 2026-06-06 старт
|
||
Прошёл verify-sprint (78/78 stage-ui specs ✓), `~/.fm-watchdog/DONE` снят.
|
||
Поехали по чек-листу.
|
||
|
||
### 2026-06-06 п.1
|
||
`YearDemoSeeder` создан. Идемпотентен через маркер `Y1-`, жёсткий гард на
|
||
свежем tenant'е. Bulk stock-agg вместо per-document SaveChanges — 16.5s.
|
||
|
||
### 2026-06-06 п.2
|
||
4 dashboard endpoint'a + lazy виджеты + week-stats в существующем
|
||
`/api/sales/retail/stats`. Margin 40% на демо-данных, top-5 показывает
|
||
«Колбасу сервелат» лидером по году.
|
||
|
||
### 2026-06-06 п.3
|
||
Глобальный Cmd+K + `/api/search/global`. Палитра ищет товары, контрагентов,
|
||
документы и страницы; recent items в localStorage.
|
||
|
||
### 2026-06-06 п.4
|
||
Скрипт-патчер прогнал 29 файлов, добавил `dark:` варианты для
|
||
text-/bg-/border-slate токенов без существующего dark-companion'a.
|
||
Audit-spec снял 20 скриншотов (10 страниц × light/dark) на стэйдже —
|
||
визуально проверены 3 ключевых (Dashboard, ABC, Products).
|
||
|
||
### Итог
|
||
Все 4 пункта ✓. Stage:
|
||
- POST `/api/admin/seed-demo?years=1` → 200 товаров / 1500 продаж
|
||
с сезонностью.
|
||
- 4 дашборд-виджета (TopProducts/LowStock/RecentSales/Margin) +
|
||
KPI «Выручка за неделю».
|
||
- Cmd+K палитра с 20 страницами + поиск товаров/контрагентов/документов.
|
||
- Dark mode выглядит читаемо на топ-10 ключевых страниц.
|