docs: RC-02 final release report
This commit is contained in:
123
docs/RELEASE_REPORT.md
Normal file
123
docs/RELEASE_REPORT.md
Normal file
@@ -0,0 +1,123 @@
|
|||||||
|
# Release Candidate RC-02 — Final Release Report
|
||||||
|
|
||||||
|
Date: 2026-07-26
|
||||||
|
Branch: `B2B`
|
||||||
|
|
||||||
|
## Completed
|
||||||
|
|
||||||
|
1. **Storefront localization.** Replaced remaining hardcoded English strings
|
||||||
|
(rating/discount aria-labels, hero-carousel dots, product-carousel prev/next
|
||||||
|
buttons, dialog close button, toast dismiss, QR-code alt text, bank-payment
|
||||||
|
iframe title, guest checkout fallback name) with `translate` pipe/service
|
||||||
|
calls, backed by new `common.*` i18n keys in en/ru/hy.
|
||||||
|
Commit: `1163bfd`.
|
||||||
|
|
||||||
|
2. **Empty-store wording.** Audited every empty-collection branch across
|
||||||
|
storefront, builder, and backoffice. Found and fixed one real defect: the
|
||||||
|
category/subcategory empty states used "Oops!"/"Упс!" apology framing for a
|
||||||
|
normal zero-results condition. Everywhere else in the codebase already
|
||||||
|
correctly separates a real `error()` branch from an empty-collection
|
||||||
|
branch with distinct, neutral wording (verified across catalog, product,
|
||||||
|
cart, wishlist/compare, admin list pages, dashboard, media, builder).
|
||||||
|
Commit: `1163bfd`.
|
||||||
|
|
||||||
|
3. **Merchant-friendly wording (Monitoring/Analytics/Reports/Diagnostics).**
|
||||||
|
Analytics, Reports (moderation/reports), and Diagnostics were already
|
||||||
|
clean — no raw HTTP/queue-worker strings found. Monitoring had three
|
||||||
|
developer-facing spots: background queue slugs, webhook event keys, and
|
||||||
|
the activity log's "api" category showing a raw
|
||||||
|
`GET /api/products responded 200 in 84ms` line as the primary message.
|
||||||
|
All three now show plain-language labels by default, with the raw string
|
||||||
|
for API/error/warning events moved behind a collapsed "Technical details"
|
||||||
|
`<details>`. Commit: `ca343c4`.
|
||||||
|
|
||||||
|
4. **Dialog consistency.** Replaced all 12 native `confirm()` calls and 4
|
||||||
|
native `alert()` calls across cart, media library, static-pages editor,
|
||||||
|
and 5 builder components. Confirms now use a new shared
|
||||||
|
`app-confirm-dialog` (composes the existing `app-dialog` + `app-button` —
|
||||||
|
no new dependency), following the same local-signal pattern already used
|
||||||
|
in admin-categories. Cart's alerts route through the existing
|
||||||
|
`UserNotificationService` toast pipeline instead. Zero native
|
||||||
|
`confirm`/`alert`/`prompt` remain in production code (verified by grep).
|
||||||
|
Commit: `6c6fa00`.
|
||||||
|
|
||||||
|
5. **Images.** Found and fixed a real defect: `getMainImage()`'s no-photo
|
||||||
|
fallback pointed at `/assets/images/placeholder.svg`, but that file (and
|
||||||
|
the whole `assets/images/` directory) never existed — any item with zero
|
||||||
|
photos rendered a browser broken-image icon. Added the asset. Also added
|
||||||
|
an `(error)` handler on every dynamic `<img>` that renders a
|
||||||
|
user/admin-supplied URL (product card, cart line item, cart payment QR,
|
||||||
|
product gallery main + thumbnails), so a 404'd image URL swaps to the
|
||||||
|
placeholder instead of shipping broken. Commit: `3e54e88`.
|
||||||
|
|
||||||
|
6. **Legacy cleanup.** Investigated `pages/category`, `pages/search`,
|
||||||
|
`pages/item-detail`, `pages/info/**`, `pages/legal/**` (40+ files) and
|
||||||
|
`dynamic-renderer/`. First five were confirmed unrouted dead code (each
|
||||||
|
had a live replacement already serving its traffic) — deleted outright.
|
||||||
|
`dynamic-renderer/` was confirmed **active** (it's the live homepage
|
||||||
|
rendering pipeline via `HomeComponent` → `WebsiteRuntimeFacade` →
|
||||||
|
`PageRendererService`/`PageResolverService` →
|
||||||
|
`DynamicPageLayoutComponent`) — a prior doc note calling it "unwired" was
|
||||||
|
stale and has been corrected. `docs/TODO.md`, `docs/KNOWN-ISSUES.md`,
|
||||||
|
`docs/FRONTEND-ROADMAP.md`, `docs/PROJECT_INDEX.md` updated accordingly.
|
||||||
|
Commit: `a670ca9`.
|
||||||
|
|
||||||
|
7. **Final QA.** `npx tsc --noEmit` clean after every commit above.
|
||||||
|
`ng serve` production-mode build compiles with no errors. Manually
|
||||||
|
smoke-tested in-browser: home page loads with zero console errors; cart
|
||||||
|
page loads with mock data; the new clear-cart confirm dialog opens with
|
||||||
|
correctly translated title/message/buttons, Cancel closes it without
|
||||||
|
side effects, zero console errors throughout. Backoffice route requires
|
||||||
|
an authenticated admin session (existing `adminAuthGuard` behavior,
|
||||||
|
unrelated to this pass) so the Monitoring page's new wording was verified
|
||||||
|
by reading the compiled template/component, not by an authenticated
|
||||||
|
click-through.
|
||||||
|
|
||||||
|
## Known limitations
|
||||||
|
|
||||||
|
- The i18n string audit and empty-state audit were scoped to storefront/
|
||||||
|
customer-facing surfaces per the task list; backoffice/builder templates
|
||||||
|
were spot-checked but not exhaustively re-audited for hardcoded strings.
|
||||||
|
- `app-confirm-dialog` is a new small shared component (composes existing
|
||||||
|
`app-dialog`/`app-button`, no new library). It intentionally does not
|
||||||
|
cover every dialog in the codebase — only the sites that were previously
|
||||||
|
using native `confirm()`/`alert()`.
|
||||||
|
- Backoffice Monitoring's Technical-details fix only touches the mock local
|
||||||
|
gateway (`AdminMonitoringLocalGateway`); once a real API-backed gateway
|
||||||
|
exists, it will need to populate `technicalDetail` the same way to keep
|
||||||
|
the "Technical details" affordance working.
|
||||||
|
- No new automated tests were added for this pass (none existed for the
|
||||||
|
touched components beforehand either); verification was typecheck +
|
||||||
|
manual smoke test as described above.
|
||||||
|
|
||||||
|
## Deferred items
|
||||||
|
|
||||||
|
- Everything already tracked in `docs/TODO.md` under "Backend — skipped,
|
||||||
|
doing together" remains deferred (bootstrap real content, builder
|
||||||
|
publish/validate backend, backoffice CRUD, media pipeline) — explicitly
|
||||||
|
out of scope per this task's "NO BACKEND CHANGES" instruction.
|
||||||
|
- Non-blocking pre-existing items from prior RC passes noted in
|
||||||
|
`docs/KNOWN-ISSUES.md` (genuine brand-color contrast failures needing
|
||||||
|
theme-owner sign-off, 2 large lazy chunks needing a dedicated split task,
|
||||||
|
`primeng`/`primeicons` removal blocked on an unrelated `barry-cache`
|
||||||
|
dependency issue) are unchanged by this pass.
|
||||||
|
|
||||||
|
## Launch recommendation
|
||||||
|
|
||||||
|
**Ready to ship** from a customer-demo-polish standpoint: no native browser
|
||||||
|
dialogs, no broken-image paths on the audited surfaces, no raw developer
|
||||||
|
jargon in Monitoring's default view, no apology-toned empty states, and the
|
||||||
|
five dead-code page directories are gone rather than lingering as
|
||||||
|
demo-confusing zombies. The remaining known limitations above are scope
|
||||||
|
boundaries (backend, exhaustive re-audit, test coverage) rather than found
|
||||||
|
defects — recommend proceeding, with the backoffice-auth-gated smoke test
|
||||||
|
as the one item worth a human doing a real authenticated click-through on
|
||||||
|
before the actual demo.
|
||||||
|
|
||||||
|
## Commits (this pass)
|
||||||
|
|
||||||
|
- `1163bfd` fix(storefront): replace hardcoded strings with i18n, neutral empty-state wording
|
||||||
|
- `a670ca9` chore(cleanup): delete unrouted legacy pages, update docs
|
||||||
|
- `6c6fa00` fix(ui): replace native confirm()/alert() with shared dialogs and toasts
|
||||||
|
- `3e54e88` fix(storefront): add missing placeholder image asset and onerror fallback
|
||||||
|
- `ca343c4` fix(backoffice): merchant-friendly wording in Monitoring
|
||||||
Reference in New Issue
Block a user