food-market/docs/menu-links-progress.md
nns 17374c3943
Some checks are pending
Auto-tag / Create date-tag (push) Waiting to run
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker Web / Build + push Web (push) Waiting to run
Docker Web / Deploy Web on stage (push) Blocked by required conditions
test(menu): e2e-прогон 5/5 на stage + финал в progress-doc
- stage-ui-menu-links.spec.ts: убрали describe.configure({mode:'serial'})
  — одна фоновая 403 на кладовщике скрывала остальные три теста.
  Расширили expected4xxContains на /api/organization/employees,
  /api/super-admin/, /api/dashboard/widgets — это пробы, которые
  sidebar делает всегда, и на ограниченных ролях они ожидаемо 403.

- docs/menu-links-progress.md: 6/6 ✓, протокол выполнения с
  результатами e2e-прогона (5/5 passed, 60s против test.admin).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-10-04 22:58:12 +05:00

113 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Menu links: достижимость новых страниц Sprint 31
**Проблема (от координатора).** Маршруты `/purchases/invoices`,
`/purchases/invoices/:id`, `/purchases/supplies/scan` и
`/inventory/mobile` объявлены в `App.tsx`, но пользователь к ним
никак не доберётся: ни в sidebar (`AppLayout.tsx`), ни в
`CommandPalette`, ни в `QuickActionsPalette` ссылок нет. На страницах
`/purchases/supplies` и `/inventory/inventories` тоже нет кнопок,
которые бы вели на новые UX-ветки.
**Условия задачи.**
- Админ + Кладовщик видят новые пункты; Кассир — нет.
- Пункты видны в простом режиме (`isAdvancedMode === false`) тоже —
это базовые приёмка/инвентаризация, а не расширенные фичи.
- i18n: ru обязательно, en — потому что меню переводится.
- Playwright-проход «кликами с главной» на desktop (1280×800) +
mobile (375×667) под demo-keeper и demo-admin; плюс негатив-проход
для demo-cashier.
- Аудит сирот: диффим `<Route path>` из `App.tsx` против
фактических точек входа.
**Границы.** Не трогаем прод, `global.json`, `deploy/*/nginx`.
## Чек-лист
- [x] 1. Главное меню `AppLayout` — пункты «Накладные (по фото)» (`/purchases/invoices`) в разделе «Закупки» и «Инвентаризация с телефона» (`/inventory/mobile`) в разделе «Остатки» для ролей Admin / Storekeeper; видны в простом режиме; i18n ru + en.
- [x] 2. Dropdown-кнопки входа на `/purchases/supplies` и `/inventory/inventories`: «Новая приёмка ▾» → Вручную / По фото накладной / Сканированием; «Новая инвентаризация ▾» → Вручную / С телефона.
- [x] 3. CommandPalette (Cmd+K) + QuickActionsPalette (Cmd+J): добавить `invoices`, `supply-scan`, `inventory-mobile` в соответствующие списки.
- [x] 4. ПРОВЕРКА ГЛАЗАМИ — Playwright `stage-ui-menu-links.spec.ts`: 3 новых страницы кликами с главной под demo-keeper и demo-admin, desktop + mobile; скриншоты в `tests/e2e/reports/`. Негатив для demo-cashier.
- [x] 5. Аудит «сирот» — скрипт `tests/scripts/menu-orphans-audit.mjs`, отчёт в `docs/menu-orphans-report.md`.
- [x] 6. `~/deploy-stage.sh` + ретест п.4 на свежем stage.
## Протокол выполнения
### 1. Главное меню (AppLayout)
`src/food-market.web/src/components/AppLayout.tsx`:
- В секцию «Остатки» (`section_inventory`) добавлен пункт
`nav.inventoryMobile → /inventory/mobile` (icon `Smartphone`),
виден под условием `isAdmin || isStorekeeper` — т.е. без
`isCashier` — и в простом режиме, не завязан на `advanced`.
- В секцию «Закупки» (`section_purchases`) — пункт
`nav.invoices → /purchases/invoices` (icon `Camera`), те же
роли, без advanced-гарда.
- Параллельно вскрылся сирота `/admin/diagnostic` (см. п.5) —
добавлен в `section_admin` под Admin'ом (icon `Stethoscope`).
- i18n: обновили `locales/ru.json` + `locales/en.json`
(`nav.inventoryMobile`, `nav.invoices`, `nav.diagnostic`).
### 2. Split-кнопки на list-страницах
Новый компонент `src/food-market.web/src/components/SplitButtonMenu.tsx`
— dropdown-кнопка «Новая …» с клавиатурной навигацией (↑↓/Enter/Esc,
click-outside). Использована:
- `SuppliesPage.tsx`: «Новая приёмка ▾» → **Вручную** (`/purchases/supplies/new`),
**По фото накладной** (`/purchases/invoices`),
**Сканированием** (`/purchases/supplies/scan`).
- `InventoriesPage.tsx`: «Новая инвентаризация ▾» → **Вручную**
(`/inventory/inventories/new`), **С телефона** (`/inventory/mobile`).
Селекторы `data-testid=supplies-new-dropdown`, `inventories-new-dropdown`,
плюс каждый пункт меню — для e2e.
### 3. CommandPalette + QuickActions
`components/CommandPalette.tsx`: добавлены `page:invoices`,
`page:supply-scan`, `page:inventories` (ранее отсутствовал),
`page:inventory-mobile` в `STATIC_PAGES`. Иконки `Camera`, `ScanLine`,
`ClipboardCheck`, `Smartphone`.
`components/QuickActionsPalette.tsx`: действия `invoice-new`,
`supply-scan`, `inventory-mobile` в `ACTIONS`.
### 4. Playwright-проверка глазами
`tests/e2e/scenarios/stage-ui-menu-links.spec.ts` — 5 тестов:
- `demo-keeper / desktop` — ✓ 10.5s
- `demo-keeper / mobile` — ✓ 24.1s (drawer открывается hamburger'ом)
- `demo-admin / desktop` — ✓ 10.5s
- `demo-admin / mobile` — ✓ 10.3s
- `demo-cashier` negative — ✓ 3.9s (нет пунктов «Накладные (по фото)»,
«Инвентаризация с телефона», и раздела «Приёмки»)
Итого **5/5 passed** за 60 секунд против свежего stage
(`https://test.admin.food-market.kz`). Логин через sentinel-пароль
`__QUICK_LOGIN_PWLESS__` (тот же механизм, что SPA использует при
клике по карточке demo-аккаунта).
Скриншоты в `tests/e2e/reports/`:
`menu-links-{demo-admin|demo-keeper}-{desktop|mobile}-{invoices|supply-scan|inventory-mobile}.png`
(12 позитивных) + `menu-links-demo-cashier-desktop-sidebar.png`.
### 5. Orphan-audit
`tests/scripts/menu-orphans-audit.mjs` — парсит `App.tsx`,
диффит все `<Route path="…">` из tenant-ветки против всех строк,
встречающихся в sidebar / CommandPalette / QuickActionsPalette /
split-кнопках `SuppliesPage.tsx` + `InventoriesPage.tsx`.
Классификация: 57 tenant-маршрутов → 20 служебных
(`/login`, `/auth-bridge`, `/:id`-формы, `/new`-формы, супер-админ),
37 проверяемых. **После всех правок: 0 сирот.** Отчёт —
`docs/menu-orphans-report.md`.
Первый прогон обнаружил `/admin/diagnostic` — исправлено в п.1.
### 6. Deploy stage + retest
`~/deploy-stage.sh` → `[stage] OK — https://test.admin.food-market.kz`.
После деплоя тот же `stage-ui-menu-links.spec.ts` — **5/5 passed**.
## Итог
Все 6 шагов выполнены. Новые экраны Sprint 31 полноценно встроены в
навигацию: sidebar + Cmd+K + Cmd+J + split-кнопки на list-страницах.
Автоматический orphan-audit в `tests/scripts/menu-orphans-audit.mjs`
можно гонять в CI как регрессионную защиту от повторения проблемы.
Прод, `global.json`, `deploy/nginx*` — не трогались.