Sprint 21. - archived (soft archive/restore, distinct from visible) with an include-archived list filter - barcode field alongside sku - variants: lightweight name|price|quantity list, same textarea-parse convention as specifications/attributes - relatedProductIds: checkbox picker in the editor - gallery images now added/removed via the shared MediaPickerComponent instead of a raw URL textarea - read-only discounted-price preview in the editor - infinite-scroll toggle on the list (loadMore() appends a page instead of replacing it; pagination UI swaps for a Load more button) - category dropdown now sourced from AdminCategoriesGateway (Sprint 20) instead of AdminProductsLocalGateway's own BackofficeDataService seed docs/ADMIN.md + docs/BACKEND.md updated with the new field list and the known trade-off that related-products search is scoped to the currently loaded page, not the full catalog. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
84 lines
6.4 KiB
Markdown
84 lines
6.4 KiB
Markdown
# Sprint Plan (working doc, delete after release)
|
|
|
|
Repo already past old "Sprint 19" (dashboard). Renumbering user's Sprint7+ roadmap to continue actual sequence: **Sprint 20 = old "Sprint 7" (Categories)** ... **Sprint 30 = old "Sprint 17" (Final Release)**.
|
|
|
|
Pattern to follow (mirrors `admin/products`): `models/`, `services/<x>-gateway.interface.ts` + `<x>-local.gateway.ts` (IndexedDB via existing local-storage service), `facade/`, `pages/`, `components/`. Local-only until backend endpoint exists — log gap in `docs/BACKEND.md`.
|
|
|
|
Autonomy: no stop-and-ask except missing API contract / business decision / secrets / external config / legal / multi-valid-design-fork. Commit after each sprint, conventional commits, no push. Quality gate before marking sprint done: build, typecheck, lint (if configured), responsive check, a11y pass, docs updated, no dead code, arch:check green.
|
|
|
|
Notify user: **from Sprint 20 (Categories) once product↔category link + admin categories CRUD exist, catalog can start receiving real items** (currently admin-products already has categoryId field but no category source of truth — that's the point where "adding items to catalog" becomes real, not mocked dropdown).
|
|
|
|
---
|
|
|
|
## Sprint 20 — Category Management ✅ done
|
|
- [x] AdminCategory model (id, parentId, title, translations, slug, icon, image, seo, visible, order, draft/published status, soft-delete)
|
|
- [x] AdminCategoriesGateway interface + local (in-memory, seeded from BackofficeDataService) gateway, mirrors products gateway
|
|
- [x] AdminCategoriesFacade (signals, CRUD, tree ops, slug validation, draft recovery)
|
|
- [x] Categories list page: indented tree, native HTML5 DnD reorder, visibility toggle, item counter, empty state, include-deleted filter + restore
|
|
- [x] Category editor: name/slug (+ uniqueness validation), translations editor, icon field, image via MediaPickerComponent, SEO fields, breadcrumb preview
|
|
- [x] Delete validation (blocked if has children or itemsCount>0) + soft-delete/restore
|
|
- [x] Draft/publish workflow + localStorage draft recovery (mirrors Project Editor autosave) + unsaved-changes CanDeactivate guard (mirrors projectEditorDirtyGuard)
|
|
- [x] Wired into admin routing (`app.routes.ts`, replaced coming-soon placeholder)
|
|
- [x] Updated `docs/ADMIN.md` (new Sprint 20 section), `docs/BACKEND.md` (categories gap rewritten with real field list)
|
|
- [~] Responsive/a11y: reuses existing FormField/Input/Table/Button/EmptyState a11y wiring; live-browser click-through blocked by safety classifier on the guarded admin route (see below) — verified via tsc/build/arch:check only
|
|
- Commit: `feat(admin): complete category management`
|
|
- Note: `admin/products`' category dropdown still uses its own `AdminProductsGateway.loadCategories()`, not this new gateway — unification deferred to Sprint 21 (documented in BACKEND.md).
|
|
|
|
## Sprint 21 — Product Management completion ✅ done
|
|
- [x] Audit + add missing: `archived` (soft, list filter + archive/restore action), `barcode`, `variants` (lightweight name|price|quantity), `relatedProductIds` (checkbox picker)
|
|
- [x] Wired products to real `AdminCategoriesGateway` (`AdminProductsLocalGateway` now seeds from `AdminCategoriesLocalGateway`, replacing its own `BackofficeDataService` category seed)
|
|
- [x] Gallery via `MediaPickerComponent` (add/remove thumbnails); translation editor already existed (Sprint pre-19); preview (computed discounted price); infinite-scroll toggle on list (`facade.loadMore()` appends vs pagination)
|
|
- [x] Updated `docs/ADMIN.md` (new Sprint 21 section), `docs/BACKEND.md` (item 6 rewritten with real field list)
|
|
- Commit: `feat(admin): complete product management`
|
|
- Known trade-off: related-products picker sources from whatever page is currently loaded in `AdminProductsFacade.products()`, not a full catalog search — documented in ADMIN.md, fine at current mock scale.
|
|
|
|
## Sprint 22 — Media System hardening
|
|
- [ ] Folder support, tags, search in Media Manager
|
|
- [ ] Crop/resize/compression on upload, SVG + file-type validation
|
|
- [ ] Confirm reuse across category/product/logo/hero/static-page selectors
|
|
- [ ] Storage abstraction doc note (swap IndexedDB mock -> CDN later)
|
|
- Commit: `feat(media): reusable media management`
|
|
|
|
## Sprint 23 — Orders (mock/local, flag backend gap)
|
|
- [ ] Orders model + local gateway (seed mock data)
|
|
- [ ] List: filters, search, statuses, timeline, export
|
|
- [ ] Detail: customer/payment/shipping info, notes/internal notes, refund request, cancel, print invoice
|
|
- Commit: `feat(admin): order management`
|
|
|
|
## Sprint 24 — Transactions (mock/local)
|
|
- [ ] Payments/refunds/QR list, status, history, export, filters, search, retry, fraud flags, audit log view
|
|
- Commit: `feat(admin): transaction management`
|
|
|
|
## Sprint 25 — Users & Roles
|
|
- [ ] Users/roles/permissions models (local), marketplace vs office admin distinction
|
|
- [ ] Invitations, passwordless login (reuse existing Telegram QR pattern), session/device manager, audit trail
|
|
- Commit: `feat(admin): users and permissions`
|
|
|
|
## Sprint 26 — Monitoring
|
|
- [ ] Audit/security/login logs views (local), API/error/warning feed, queue/webhook placeholders, health page
|
|
- Commit: `feat(admin): monitoring center`
|
|
|
|
## Sprint 27 — Analytics
|
|
- [ ] Dashboard extensions: sales/revenue/orders/visitors/products/categories charts, date ranges, export
|
|
- Commit: `feat(admin): analytics dashboard`
|
|
|
|
## Sprint 28 — Marketplace Polish
|
|
- [ ] Lighthouse + a11y sweep, animations, skeletons/empty/error states, responsive fixes, SEO/meta/social preview/robots/sitemap
|
|
- Commit: `refactor: marketplace release polish`
|
|
|
|
## Sprint 29 — Release Candidate
|
|
- [ ] Dead code cleanup, remove TODOs/console logs/debug code, optimize imports/bundle/images/CSS, translation validation, build/type/lint validation, doc validation, arch review, CHANGELOG + release notes
|
|
- Commit: `chore: release candidate`
|
|
|
|
## Sprint 30 — Final Release
|
|
- [ ] Full verify pass (build, routing, responsive, translations, admin, marketplace, editor, media, login, bootstrap, APIs, security assumptions), final report
|
|
- Then (only after explicit go-ahead, push is a confirm-required action): `git push`
|
|
|
|
---
|
|
### Stop conditions (ask user)
|
|
- Real backend API contract needed (orders/transactions/users are local-mock by design per above — flagged, not blocking)
|
|
- Ambiguous business rule (e.g. category deletion policy specifics) not inferable from existing product-deletion pattern
|
|
- Credentials/external service config
|
|
- Legal/product-only decision
|
|
- Two equally valid architectures for same feature
|