food-market/docs/sprint10-progress.md
nns 786dacb081
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
feat(s10-4): dark mode полировка + Cmd+K палитра + аудит-spec
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>
2026-06-06 01:30:41 +05:00

6.2 KiB
Raw Permalink Blame History

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.

Чек-лист

  • 1. Расширенный SeedDemoData --years=1YearDemoSeeder.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% доли.
  • 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»). Каталог-плитки (товары/контрагенты/склады/точки) остаются ниже.
  • 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.
  • 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 ключевых страниц.