| Version | Date (UTC) | Summary |
|---|
| 1.0.0 | 2026-05-13 | Initial sheet — vendor/banners, vendor/gallery, UI routes under marketing + products |
- HTTP:
vendor/banners · vendor/gallery — multipart upload, list query, delete, batch delete (apps/backend/src/modules/vendor/*).
- App:
apps/vendor-web — VENDOR_ROUTES.marketing.banners, VENDOR_ROUTES.products.gallery; modals BannerModal, CategoryModal, VendorGalleryImagePickerModal (Frontend applications).
- Pair with: Vendor customers, staff & settings for nav-only smoke; this sheet owns TC-VMG- detail.
| ID | Class | Scenario | Automation |
|---|
| TC-VMG-001 | Happy | Banners list loads; create opens modal with valid defaults | E2E* |
| TC-VMG-002 | Happy | Edit banner saves image/title fields; list refetches | E2E* |
| TC-VMG-003 | Unhappy | Validation error from API maps to toast / field (module guard 403 if missing) | E2E* |
| TC-VMG-004 | Unhappy | Delete banner confirms then handles API error | E2E* |
| TC-VMG-005 | Happy | Banner modal gallery picker opens; selecting image closes modal with selection | E2E* |
| TC-VMG-006 | Happy | Banner modal adds multiple slide images (reorder/remove); save persists data.slider_images (max 12) and image = first slide | E2E* |
| TC-VMG-007 | Happy | Active retail banners feed POS customer display idle slideshow (sale-page → useVendorCustomerDisplayBannerSlides) | E2E* |
Banner slider contract: URLs live in banners.data under key slider_images; legacy image remains the first slide for list thumbnails. Create/update requires at least one image (400 when empty). Shared helpers: packages/shared/src/lib/banner-slider-data.ts; backend normalize: apps/backend/src/common/banner-slider-persist.util.ts.
| ID | Class | Scenario | Automation |
|---|
| TC-VMG-010 | Happy | GET /vendor/gallery — list paginates; search + MIME filter query params match UI | Unit✓ (apps/backend/src/modules/vendor/vendor-gallery.controller.spec.ts) + E2E* |
| TC-VMG-011 | Happy | Upload file → POST /vendor/gallery multipart → row appears; TanStack invalidates ["vendor","gallery"] | E2E* |
| TC-VMG-012 | Happy | Single delete + batch delete; response shows deleted / skipped counts | E2E* |
| TC-VMG-013 | Unhappy | Upload rejects oversize or invalid MIME → error toast (no silent failure) | E2E* |
| TC-VMG-014 | Unhappy | Read-only user sees readOnlyHint; upload / delete disabled | E2E* |
| TC-VMG-015 | Happy | Grid vs table view toggles without losing selection state (where implemented) | E2E* |
| ID | Class | Scenario | Automation |
|---|
| TC-VMG-020 | Happy | Picker loads search results; pick applies file_key / URL rules (apps/vendor-web/src/lib/product-image-for-save.ts) | E2E* |
| TC-VMG-021 | Unhappy | Picker load error shows getApiErrorMessage fallback string | E2E* |
Parent index: System test cases (index)