# Sprint 17 — onboarding wizard + help + self-diagnostic + changelog Цель: «новый пользователь не должен теряться» — onboarding wizard за 4 шага, контекстная help-tooltip-ы, knowledge-base /help, feedback, admin self-diagnostic /admin/diagnostic, /whats-new из CHANGELOG. Старт: 2026-06-07 (после Sprint 16). Исполнитель: Claude Opus 4.7. ## Принципы - Wizard — skip каждого шага доступен. - Help-tooltip-ы — короткие (≤2 предложения) с deep-link на /help. - Diagnostic — 7 проверок, async параллельный прогон <1с. - НЕ трогать: `global.json`, prod admin.food-market.kz, POS WPF. ## Чек-лист - [x] **1. Onboarding wizard** — `/onboarding-wizard` page с 4 шагами (магазин → товар → сотрудник → demo-seed). Каждый skip'абельный. После — `localStorage.fm.wizardCompleted=1` и redirect на /dashboard. Playwright тесты 9.1-9.3 (smoke + skip + сохранение). - [x] **2. HelpTooltip + topics** — `src/lib/help-topics.ts` с 13 topics. `` — popover с title + short + deep-link на /help#key. Click-outside / Esc / aria-expanded. - [x] **3. /help knowledge base** — `/help` страница, 7 markdown topics в `src/help/*.md`, загружаются через `import.meta.glob`, custom mini-markdown-renderer (headings, lists, bold, code). Поиск по title + body на клиенте. - [x] **4. In-app feedback widget** — `` в sidebar footer. Modal с 3 категориями (Bug/Suggestion/Question). POST `/api/feedback` → email на FromEmail из PlatformSettings + Telegram (опц.). Rate-limit 5/час per-user. - [x] **5. /admin/diagnostic** — `/admin/diagnostic` page для Admin/SuperAdmin. 7 параллельных проверок (Database, SMTP, MinIO, Hangfire, Disk, Certificates, Backup), `Task.WhenAll`, ~1с прогон. 🟢/🟡/🔴 индикаторы + Details. Опц. `sendTestEmail` чекбокс. - [x] **6. /whats-new + CHANGELOG** — `scripts/generate-changelog.sh` генерирует `CHANGELOG.md` из `git log --grep='feat\|fix'`. Endpoint `/api/whats-new` парсит markdown → последние 30 дней. UI `/whats-new` с группировкой по дате + icon (Sparkles=feat, Bug=fix). Dockerfile.api копирует `CHANGELOG.md` в content-root + создаёт `VERSION` файл из `GIT_SHA` build-arg'a. - [x] **7. Empty-states CTA** — `` reusable component с placeholder'ом для будущих видео-демо и fallback на /help#topic. ## Замеры ### Wizard UX-screenshots Сохранены в `docs/sprint17-screenshots/`: - `wizard-step-1.png` — магазин (название + адрес) - `wizard-step-2.png` — первый товар (имя + цена + штрихкод) - `wizard-step-3.png` — первый сотрудник (Ф.И.О. + email + роль) - `wizard-step-4.png` — demo-данные («Заполнить» / «Не нужно») - `help-page.png` — `/help` с sidebar групп + body topic'ов - `admin-diagnostic.png` — `/admin/diagnostic` с результатом 7 проверок ### Diagnostic результат на stage'е (вживую) | Check | Status | Duration | Details | |---|---|---|---| | Database | 🟢 Ok | ~50ms | все миграции применены | | SMTP | 🟡 Warning | ~10ms | SMTP не настроен (PlatformSettings пуст) | | MinIO | ⚪ Skipped | <10ms | Storage:Type ≠ minio, локальный FS | | Hangfire | 🟢 Ok | ~10ms | 5 recurring jobs зарегистрировано | | Disk | 🟢 Ok | ~5ms | свободно > 5 GB | | Certificates | 🟢 Ok | ~10ms | dev-режим OpenIddict-ключей | | Backup | 🟡 Warning | <5ms | папка `/opt/food-market-data/backups` не существует на dev-vm (нормально) | | **Overall** | **🟡 Warning** | ~80ms | 2 warning'a (SMTP + backup) | ### Regression-test suite расширен Sprint 16 baseline (35 тестов) + Sprint 17 добавил 7 flow-тестов в `flows/09-onboarding-wizard.spec.ts`: - 9.1 wizard рендерится с progress-bar - 9.2 skip всех 4 шагов → /dashboard + wizardCompleted=1 - 9.3 сохранение названия магазина → org.name обновлён в API - 9.4 /help рендерит topic'и + поиск работает - 9.5 /api/admin/diagnostic/run возвращает 7 проверок - 9.6 POST /api/feedback ok с минимальным payload - 9.7 /api/whats-new возвращает buildVersion + items **Result**: 7/7 ✓ за ~20 секунд. Suite теперь **42 flow + 60 visual + 6 wizard-screenshots**. ### Bundle impact | | До Sprint 17 | После | Δ | |---|---|---|---| | Initial JS (raw) | 706.76 KB | **723.37 KB** | +17 KB | | Initial JS (gzip) | 196.50 KB | **200.53 KB** | +4 KB | Новые страницы (HelpPage, WhatsNewPage, AdminDiagnosticPage, OnboardingWizardPage) — все lazy chunks. В initial bundle только `` (Modal-обёртка), `` и `` (~4 КБ gzip суммарно). ## Журнал ### 2026-06-07 старт Sprint 16 закрыт (6/6 ✓). Поехали по onboarding-чек-листу. ### 2026-06-07 п.5,6 (backend endpoints) DiagnosticController с 7 параллельными проверками + FeedbackController с rate-limit + WhatsNewController парсер CHANGELOG.md. ### 2026-06-07 п.1 (wizard) `OnboardingWizardPage` с 4 step-компонентами. State через useState, api-mutate через TanStack Query. `/onboarding-wizard` маршрут. Skip-кнопка в footer'е каждого шага. `fm.wizardCompleted` в localStorage предотвращает повторный показ. ### 2026-06-07 п.2-3 (HelpTooltip + /help) `help-topics.ts` с 13 keys. `` с click-popover, aria-label, Esc/click-outside dismiss. `/help` страница — `import.meta.glob` на `src/help/*.md` + парсер front-matter + mini-markdown renderer без зависимости от markdown-it. ### 2026-06-07 п.4 (feedback widget) `` в sidebar footer. Modal с 3 категориями. API возвращает `deliveredEmail`/`deliveredTelegram` булевые — фронт показывает «отправлено через {каналы}» в toast. ### 2026-06-07 п.7 (empty-state) `` reusable. Placeholder для видео-демо (`demoVideoUrl` prop) — пока показывает кнопку «Подробнее в базе знаний» ссылкой на `/help#topic`. ### 2026-06-07 deploy + retest - Сначала упал TS build из-за апострофа в строке single-quoted (`refresh'е` ломал литерал) — исправил переключением на двойные. - Неиспользуемый interface `OrgSettings` — удалил. - DiagnosticController вернул `overall: 2` (enum как int) — добавил `[JsonStringEnumConverter]` на CheckStatus enum. - 7/7 wizard/help/diagnostic/feedback/whats-new e2e тестов ✓. - 6 wizard-screenshots сохранены в `docs/sprint17-screenshots/`. ## Итог Все 7 пунктов ✓. Локальные числа: - **Wizard**: 4 шага + skip, 7 Playwright тестов ✓ за 20 секунд. - **Help**: 7 markdown topics + 13 keys в HelpTooltip mapping. - **Diagnostic**: 7 проверок, прогон ~80ms на stage'е, на текущий момент 🟡 (2 warning'a — SMTP не настроен + нет backup-папки). - **Feedback**: email + Telegram дубль, 5/час rate-limit. - **CHANGELOG**: 307 строк из git log за 90 дней. - **/whats-new**: возвращает buildVersion + items до 30 дней назад. - **Regression suite**: **42 flows + 60 visual + 6 wizard-shots** ✓. Следующее расширение (TODO для будущих спринтов): - Расставить `` рядом с заголовком на Loyalty, Promotions и других новых страницах — компонент готов. - Banner «Появились новые функции» при mismatch'е `localStorage.fm.lastSeenBuildVersion` с фактическим `BuildVersion` — endpoint готов, нужно вписать в AppLayout. - Видео-демо в `` — placeholder есть, ждём скрин-капсы / видео.