docs: final project closeout - classify TODO, backend spec, status
Classified every TODO.md item into one of DONE/BACKEND/PRODUCT DECISION/FUTURE VERSION/BUG, verified against source, not against prior docs: - BACKEND items (bootstrap content, builder draft/publish, 6 admin CRUD domains, media pipeline) confirmed already covered by BACKEND_INTEGRATION.md; appended a mapping appendix rather than duplicating raw bullets. Fixed 22 stale internal BACKEND_API.md cross-references left over from before that file was archived. - PRODUCT DECISION items (dark mode, brand-color WCAG contrast, stars.component token gap, footer Contacts content, advanced analytics, payment providers) moved to new docs/PRODUCT_BACKLOG.md. - FUTURE VERSION items (Angular 22, bundle splitting, cart-modal composition cleanup, hero-spacing investigation) moved to new docs/FUTURE_FEATURES.md. - BUG: rewrote docs/KNOWN-ISSUES.md down to the one real, verified, currently-reproducible frontend bug (Ed25519 admin-auth error codes session-expired/invalid-signature are unreachable - toAuthErrorShape() never reads a body error code, only maps HTTP status, and no status ever produces those two codes - confirmed by reading auth.service.ts + auth-error.model.ts). Condensed the "Fixed" history instead of carrying full verbose repro text forward. - DONE items removed outright (dead-code deletion, dashboard false positive, RC-02 fixes, stale "dynamic-renderer unwired"/"178 missing keys" claims already disproven by source). docs/TODO.md rewritten to the exact "no blockers" template - nothing left qualifies as a release blocker. New docs/PROJECT_STATUS.md: honest per-area status (frontend/backend/ docs/auth/builder/storefront/admin), known limitations, and explicit production/backend/demo readiness calls - including correcting an initial draft's unpushed-commit count (53, not 10, per git log origin/B2B..HEAD). New docs/NEXT_PHASE.md: work that can only start once a real backend exists (gateway swap-in, mock removal, dormant-auth activation, role enforcement, integration/E2E tests, perf profiling, monitoring, maintenance-mode UI). docs/PROJECT_INDEX.md (the stated entry point) updated to link the new doc set and stop pointing at the now-archived BACKEND_API.md/AUTH.md. docs/FRONTEND-ROADMAP.md's "Known open items" replaced with pointers to the new category-split docs instead of a duplicated mixed list. Not swept: a handful of low-traffic docs (architecture ADRs, FRONTEND.md, EDITOR.md, ARCHITECTURE.md, PROJECT-STRUCTURE.md, StaticPages.md, ADMIN.md) still reference the old BACKEND_API.md/ AUTH.md filenames - noted as a known gap in PROJECT_STATUS.md rather than touched blindly, since they're historical-context docs, not the navigation entry point.
This commit is contained in:
@@ -1,368 +1,41 @@
|
||||
# Known Issues (fix after sprint wrap-up)
|
||||
# Known Issues
|
||||
|
||||
Running list of bugs spotted during manual verification, deferred until the
|
||||
current sprint's feature work is done. Add to this list as more are found;
|
||||
don't fix inline unless asked.
|
||||
Real, reproducible, currently-open frontend bugs only. Everything that needed a product/business decision moved to `docs/PRODUCT_BACKLOG.md`; everything nice-to-have moved to `docs/FUTURE_FEATURES.md`; everything backend-shaped moved to `docs/BACKEND_INTEGRATION.md`. Re-verified against source 2026-07-26.
|
||||
|
||||
## Open
|
||||
|
||||
1. **Homepage hero-to-categories dead space gap on the storefront home
|
||||
page.** Traces to bootstrap mock config (widget/section padding values
|
||||
in the dev bootstrap fixture), not a code defect in
|
||||
`dynamic-page-layout.component.ts` or the widget components - not fixed
|
||||
this session, needs config-side investigation if it reproduces with
|
||||
real tenant data rather than mock config.
|
||||
1. **Ed25519 admin-auth error codes `session-expired` and `invalid-signature` are unreachable — dead UI.**
|
||||
`AuthError.code` is documented as routing to a dedicated recovery screen per code
|
||||
(`core/auth/models/auth-error.model.ts:1-4`), but `toAuthErrorShape()` in
|
||||
`core/auth/services/auth.service.ts:110-118` derives the code for any real
|
||||
`HttpErrorResponse` *exclusively* from `authErrorCodeFromStatus(error.status)`
|
||||
(line 112) — it never reads the caller-supplied `fallbackCode` parameter for
|
||||
real HTTP errors, and never reads any body-level error code from the response.
|
||||
`authErrorCodeFromStatus()` (`auth-error.model.ts:21-32`) only ever returns
|
||||
`'unauthorized'`, `'forbidden'`, or `'backend-unavailable'` — there is no status
|
||||
or body condition anywhere in the codebase that produces `'session-expired'` or
|
||||
`'invalid-signature'`. Both screens exist and are wired, but are permanently
|
||||
unreachable from any real backend response today.
|
||||
- **Fix requires both sides**: a backend that returns a distinguishable
|
||||
`error.code` in the response body (see `docs/ERROR_CONTRACT.md`), and a small
|
||||
frontend change to `toAuthErrorShape()` to prefer that body code over the
|
||||
blanket status-based fallback.
|
||||
- Found: 2026-07-26, Backend Finalization Sprint documentation pass (traced while
|
||||
writing `docs/AUTHENTICATION.md`/`docs/ERROR_CONTRACT.md`).
|
||||
|
||||
2. **~179 untranslated raw i18n keys across the entire admin backoffice CRUD
|
||||
UI (products/categories/orders/transactions/users/monitoring/analytics).**
|
||||
`translations.ts`/`en.ts`/`ru.ts`/`hy.ts` have no `adminProducts.*`,
|
||||
`adminCategories.*`, `adminOrders.*`, `adminTransactions.*`,
|
||||
`adminUsers.*`, `adminMonitoring.*`, or `adminAnalytics.*` sections at all
|
||||
(confirmed: zero matches for any of these prefixes in any of the 4 i18n
|
||||
files). `TranslateService.t()` falls through to returning the raw dotted
|
||||
key string when a key isn't found (see `translate.service.ts`), so every
|
||||
templated string in these features (buttons, table headers, filters,
|
||||
badges, empty/placeholder text) renders literally as e.g.
|
||||
`adminProducts.create` instead of real copy - same root cause as the
|
||||
already-fixed dashboard Quick Actions bug below, just at the scale of
|
||||
almost the entire admin backoffice built across Sprints 20-27.
|
||||
- Counted by grepping all `'adminXxx.yyy'` translate-pipe usages under
|
||||
`src/app/features/admin/**`: `adminProducts` 72, `adminCategories` 23,
|
||||
`adminOrders` 24, `adminUsers` 21, `adminMonitoring` 13,
|
||||
`adminAnalytics` 12, `adminTransactions` 13 (≈178 distinct keys, ×3
|
||||
locales ≈ 534 strings to author).
|
||||
- Likely why it was never caught: every affected Sprint (20-27) explicitly
|
||||
noted live-browser click-through was blocked on the guarded admin route
|
||||
and verification was tsc/build/arch:check only - none of those catch
|
||||
missing i18n keys (pipe arguments are plain strings, not type-checked).
|
||||
- Found: 2026-07-15, during Sprint 28 manual audit (reading templates +
|
||||
grepping i18n files, not live browser).
|
||||
- **Deferred to Sprint 29** ("translation validation" is explicit Sprint 29
|
||||
scope per `SPRINT-PLAN.md` (removed, see git history)) rather than fixed inline during Sprint
|
||||
28 polish - authoring ~534 correct strings across 3 languages is a large,
|
||||
separate, mechanical pass of its own and shouldn't be rushed inside a
|
||||
polish sprint. Sprint 28 only adds the handful of new keys it introduces
|
||||
itself (empty-state copy for the skeleton/empty-state consistency fix),
|
||||
it does not touch the ~178 pre-existing gap.
|
||||
## Fixed (this cycle)
|
||||
|
||||
3. **Theme Mode selector has no runtime effect.** `theme-section`'s light/dark/
|
||||
system dropdown saves correctly and `theme-engine.service.ts` sets a
|
||||
`data-theme-mode` attribute on `<html>`, but no CSS anywhere in the app
|
||||
reads that attribute — picking Dark or System changes nothing visually
|
||||
today. Theme palette colors are unaffected (they're real CSS custom
|
||||
properties, genuinely live). Fixing this means implementing actual
|
||||
dark-mode CSS (a dark palette + `[data-theme-mode]`/`prefers-color-scheme`
|
||||
strategy + a `matchMedia` listener for "system", since that can change
|
||||
without a reload) — a real feature project, not a wiring fix.
|
||||
- Found: 2026-07-17, project-editor bug-hunt audit (`docs/EDITOR.md`).
|
||||
Condensed — full detail in commit history and `docs/RELEASE_REPORT.md`.
|
||||
|
||||
4. **`dynamic-renderer/` pipeline exists but is never wired up.**
|
||||
`src/app/dynamic-renderer/{page-renderer,section-renderer,section-engine,
|
||||
page-resolver,widget-host}` has services and models but zero components
|
||||
or templates (every directory has only a `.gitkeep`). The storefront
|
||||
homepage renders through a separate, older path that doesn't consume it.
|
||||
Two editor fields feed this dead pipeline with no visible effect:
|
||||
`layout.type` (Theme section, "Site Layout") and the homepage section's
|
||||
own `type` field (`homepage-section.component.ts`'s
|
||||
`updateSection(id, 'type', ...)` has no UI calling it, because of this).
|
||||
Needs a decision: finish wiring it in (if it's WIP for a planned
|
||||
replacement) or delete it as abandoned scaffolding.
|
||||
- Found: 2026-07-17, project-editor bug-hunt audit.
|
||||
|
||||
5. **`HeaderConfig.showProfile` toggle has no corresponding UI.** The header
|
||||
editor's "Profile" toggle updates a real config field, but
|
||||
`header.component.html` never references `showProfile` — there's no
|
||||
profile/account menu in the storefront header to show or hide. Needs an
|
||||
auth-system check first (does one exist yet?) before building the menu.
|
||||
- Found: 2026-07-17, project-editor bug-hunt audit.
|
||||
|
||||
6. **Payment modal / bank-payment iframe on Cart still custom, not `app-dialog`.**
|
||||
Correction (2026-07-24, RC A11Y-01): the "already has focus-trap" assumption
|
||||
below was wrong — it had none. RC A11Y-01 ported `app-dialog`'s confirmed-
|
||||
correct focus-trap/Escape/return-focus pattern directly onto it
|
||||
(`ACCESSIBILITY_REPORT.md` (removed, see git history)), so the accessibility gap is closed. It's
|
||||
still a separate custom component, not the shared `app-dialog` itself —
|
||||
migrating it to the actual primitive remains a composition change,
|
||||
deliberately left out of every polish pass so far.
|
||||
- Found: 2026-07-23, RC-Premium-01 (`STORE_FRONT_UX_REVIEW.md` (removed, see git history)).
|
||||
|
||||
7. **Cart's `clearCart()` uses native `confirm()`, no styled confirm dialog.**
|
||||
No existing storefront pattern for a confirm-remove dialog to follow yet —
|
||||
introducing the first one is an architecture decision, not polish.
|
||||
- Found: 2026-07-23, RC-Premium-01.
|
||||
|
||||
8. ~~`stars.component` rating glyph color and a few legacy hex literals in
|
||||
`pages/category`/`pages/search` have no exact design-token match.`~~
|
||||
**Resolved 2026-07-25 (RC-02 task 6):** `pages/category`/`pages/search`
|
||||
deleted as unrouted dead code (see item 13). `stars.component` literals
|
||||
remain, tracked separately if still relevant.
|
||||
- Found: 2026-07-23, RC-Premium-01.
|
||||
|
||||
9. **Genuine brand-color contrast failures (WCAG AA).** `--border-color`
|
||||
fails 3:1 UI-component contrast in every theme (1.24-1.42:1 measured);
|
||||
`--success/--warning/--error/--info-color` fail 4.5:1 when used as plain
|
||||
text-on-white in a handful of places. Real palette colors, not a token
|
||||
bug — fixing means visibly changing the brand, needs theme-owner sign-off.
|
||||
- Found: 2026-07-24, RC A11Y-01 (`ACCESSIBILITY_REPORT.md` (removed, see git history)).
|
||||
|
||||
10. **Footer "Contacts" link has no static-page content in mock data.**
|
||||
Unlike the "About" link (which was a route-name mismatch, fixed), no
|
||||
content exists for Contacts at all — needs a content decision, not a
|
||||
code fix.
|
||||
- Found: 2026-07-24, Release Candidate walkthrough (`RELEASE_REPORT.md` (removed, see git history)).
|
||||
|
||||
11. **Builder's static-page body editor is hidden and mislabeled.** The
|
||||
actual WYSIWYG content editor isn't on the "Content" tab (title/image
|
||||
only) — it's inside a collapsed `<details>` under "Advanced", labeled
|
||||
"Source HTML (advanced)" though it's the only way to edit page content.
|
||||
Works correctly once found; relocating/relabeling is a navigation
|
||||
decision, not a bug fix.
|
||||
- Found: 2026-07-24, Release Candidate walkthrough.
|
||||
|
||||
12. **`primeng`/`primeicons` still in `package.json` after their only
|
||||
consumer was deleted.** `npm uninstall` fails (`ETARGET`) on a
|
||||
pre-existing, unrelated broken `barry-cache` devDependency resolution —
|
||||
fix that first, then drop the now-fully-unused dependency (likely closes
|
||||
most of the remaining bundle-budget overage in one move).
|
||||
- Found: 2026-07-24, RC PERF-01 (`PERFORMANCE_REPORT.md` (removed, see git history)).
|
||||
|
||||
13. **RESOLVED 2026-07-25 (RC-02 task 6) — `pages/category/*`, `pages/search/*`,
|
||||
`pages/item-detail/*`, `pages/info/**`, `pages/legal/**` (40+ files) were
|
||||
entirely unrouted dead code, not live pages.** Decision: delete (not
|
||||
wire up) — each had a live replacement already serving its traffic.
|
||||
Verified directly against `src/app/app.routes.ts`:
|
||||
`category/:id` and `category/:id/items` `redirectTo: 'catalog/:id'`
|
||||
(served by `CatalogContainerComponent`); `search` also routes to
|
||||
`CatalogContainerComponent`; `product/:id` routes to
|
||||
`ProductDetailsContainerComponent`, not `pages/item-detail`;
|
||||
`cmsContentRoutes` (meant to route `pages/info/**`/`pages/legal/**`) is a
|
||||
literal empty array (`app.routes.ts:292`) behind a
|
||||
`// TODO(CMS): Resolve informational/legal pages from backend content
|
||||
configuration here` comment — About/Contacts/FAQ/Delivery/Guarantee/
|
||||
Company-Details/Payment-Terms/Return-Policy/Public-Offer/Privacy-Policy
|
||||
are all actually served by the catch-all `:staticPath` route resolving
|
||||
`bootstrap.staticPages` (`pages/static-page/static-page.component.ts`),
|
||||
confirmed independently by `docs/FRONTEND.md`'s own routing section
|
||||
("Static/CMS pages resolve dynamically... no hardcoded page list").
|
||||
**This means several "fixes" earlier in this document and in
|
||||
since-deleted audit reports (see git history) were applied to dead code
|
||||
with zero production effect**
|
||||
— see the correction note on Fixed item 7 below. This was missed by
|
||||
three separate passes this cycle (RC-Premium-01, RC STORE-01, and the
|
||||
dead-code cleanup sprint, which manually re-verified against
|
||||
`app.routes.ts` and still concluded these files were live — an error in
|
||||
that verification, not a tooling blind spot this time) before being
|
||||
caught during the documentation-consolidation pass. Needs a decision:
|
||||
wire `cmsContentRoutes` back up (restoring 10 hardcoded per-locale pages
|
||||
that duplicate what the CMS static-page renderer already does), or
|
||||
delete all 40+ files as genuinely dead now that the duplication is
|
||||
confirmed intentional-by-omission rather than accidental.
|
||||
- Found: 2026-07-25, Documentation Cleanup pass.
|
||||
|
||||
14. **No `canDeactivate` guard on `admin/products/:id/edit`.** Categories
|
||||
protect against navigating away with unsaved changes
|
||||
(`adminCategoryDirtyGuard`, `app.routes.ts:121,131`); products do not,
|
||||
despite `AdminProductsFacade` having its own dirty-tracking draft logic.
|
||||
Inconsistent, low-effort fix (mirror the categories guard) but not
|
||||
applied here — this pass is documentation-only.
|
||||
- Found: 2026-07-19 (`PROJECT-STATE.md` (removed, see git history)), re-verified
|
||||
2026-07-25 against current `app.routes.ts` — still true.
|
||||
|
||||
## Fixed
|
||||
|
||||
1. **Full-project UX/UI + motion pass across storefront, admin dashboard,
|
||||
admin CRUD, and project-editor.**
|
||||
User asked (2026-07-16) for a full UX/UI audit across admin, dashboard,
|
||||
and storefront, sequenced: storefront -> admin dashboard -> admin CRUD ->
|
||||
project-editor. All 4 phases completed:
|
||||
- Fixed: `project-editor-save-bar` buttons were plain unstyled `<button>`s
|
||||
(`project-editor-save-bar.component.html/.scss`) - now use the shared
|
||||
`app-button` primitive.
|
||||
- Fixed: `.platform-nav-group` (`header.component.html/.scss`) applied
|
||||
`platform-nav-btn-left` to every nav button regardless of position,
|
||||
causing double borders and wrong end-radius; replaced with
|
||||
`:first-child`/`:last-child`/`:not(:first-child)` structural selectors,
|
||||
dropped the dead `-middle`/`-right` classes.
|
||||
- Polished: storefront widgets used on every page -
|
||||
`hero-widget.component.ts`, `categories-widget.component.ts`,
|
||||
`product-carousel-widget.component.ts`,
|
||||
`footer-navigation-widget.component.ts` - added design tokens, hover/
|
||||
focus states, 44px touch targets, entrance motion, all gated behind
|
||||
`prefers-reduced-motion`.
|
||||
- Polished: `admin-dashboard-card.component.scss` and
|
||||
`admin-dashboard-quick-actions.component.scss` - hover lift, entrance
|
||||
animation, reduced-motion guard.
|
||||
- Audited: admin backoffice CRUD (products/categories/orders/users/
|
||||
transactions/monitoring/analytics) - already consistently built on the
|
||||
shared `app-button`/`app-table`/`app-badge`/`app-empty-state`/
|
||||
`app-pagination` primitives from earlier sprints; grepped all 7 areas
|
||||
for raw unstyled `<button>`s (the save-bar bug pattern) and found only
|
||||
one: the gallery-image remove badge in
|
||||
`admin-product-form.component.scss` (`.gallery-item button`) had no
|
||||
hover/focus state and a 20x20px hit area below the 44px touch-target
|
||||
minimum - fixed with hover/focus-visible states and an invisible
|
||||
`::before` inset to expand the hit area without changing the visual
|
||||
badge size.
|
||||
- Fixed: `section.shared.scss` (used by all 11 project-editor sections)
|
||||
had a bare `button`/`button.secondary` style with zero hover, focus, or
|
||||
transition - added hover/active/focus-visible/disabled states plus
|
||||
`prefers-reduced-motion` guard, applied uniformly across every section.
|
||||
- Added: `project-editor-page.component.scss` `.project-editor-stack > *`
|
||||
now fades/slides in (220ms) whenever `@switch` swaps the active
|
||||
section component; `.project-editor-section-actions button` (reset
|
||||
section) got the same hover/focus treatment as the rest of the shared
|
||||
button styles.
|
||||
- Verified: `tsc --noEmit` clean after every batch of edits; live-checked
|
||||
in browser at each phase (homepage nav-group render, save-bar render,
|
||||
dashboard cards, project-editor section switch + reset button).
|
||||
- One dev-server crash occurred mid-session (unrelated pre-existing
|
||||
`ng serve` process died independently of these edits, confirmed via
|
||||
`curl` connection-refused before restart) - restarted via
|
||||
`npm run dexar`, not a regression from this work.
|
||||
- See item 1 below (homepage dead-space gap) for the one issue found
|
||||
but not fixed (config data, not code).
|
||||
|
||||
2. **Project Editor footer: payment icons and social links had no validation.**
|
||||
`footer-section.component.ts` parsed both fields from pipe-delimited
|
||||
`<textarea>` strings (`icon.src|icon.alt`, `link.id|link.label|link.url`)
|
||||
with zero validation - malformed rows silently produced empty `src`/`alt`/
|
||||
`url` values instead of surfacing an error.
|
||||
- Fixed: 2026-07-16, replaced both textareas with `app-key-value-editor`
|
||||
rows (icon picked via `MediaPickerComponent`, label/URL via `app-input`),
|
||||
added inline URL-format validation on social links (same `HTTP_URL`
|
||||
pattern used in `project-validator.service.ts`) and a missing footer-logo
|
||||
media picker.
|
||||
|
||||
3. **Project Editor navigation: nav link labels only editable for the default locale.**
|
||||
`navigation-section.component.ts`'s `labelOf` helper (and the facade's
|
||||
`updateNavLinkLabel`) always read/wrote the default locale's key on a
|
||||
`NavigationLocalizedText` label map, so switching locales elsewhere in the
|
||||
editor had no effect on nav link text - other locales' translations could
|
||||
only be edited by hand-editing the exported JSON.
|
||||
- Fixed: 2026-07-16, added `app-locale-tabs` to the section; the label
|
||||
input now reads/writes the active tab's locale via a new
|
||||
`editableLabel()` helper, and `ProjectEditorFacade.updateNavLinkLabel()`
|
||||
gained an optional `locale` parameter (defaults to the current default
|
||||
locale, so existing callers are unaffected).
|
||||
|
||||
4. **Quick Actions: 3 untranslated raw i18n keys.**
|
||||
`dashboard.actionUsers`, `dashboard.actionMonitoring`,
|
||||
`dashboard.actionAnalytics` rendered as literal key strings instead of
|
||||
translated labels on the admin dashboard's Quick Actions section, because
|
||||
`admin-dashboard.facade.ts` referenced them but they were never added to
|
||||
`translations.ts`/`en.ts`/`ru.ts`/`hy.ts`.
|
||||
- Found: 2026-07-15, manual browser verification of
|
||||
`/:lang/backoffice/dashboard?devBypassAdmin=true`.
|
||||
- Fixed: 2026-07-15, added the 3 keys to the interface + all 3 locales.
|
||||
|
||||
5. **Project Editor: 9 real correctness bugs across footer, features,
|
||||
widgets, languages, preview, static-pages, general, branding/SEO, and the
|
||||
shared media picker.** Found via a section-by-section "does this control
|
||||
actually do what it claims at runtime" audit, not a feature pass. Full
|
||||
detail (repro steps, fix, live verification) in `docs/EDITOR.md`'s
|
||||
"Bug-hunt audit pass (2026-07-17)" section — summary:
|
||||
- Footer social-link/payment-icon id generation reproducibly collided
|
||||
(array-length-derived / fixed suffix), corrupting `@for (track item.id)`
|
||||
identity on the public storefront footer.
|
||||
- Features' wishlist/compare toggle only drove one of the two flags that
|
||||
actually gate visibility at runtime.
|
||||
- Widgets' JSON-fallback textarea silently discarded invalid edits instead
|
||||
of showing an error.
|
||||
- Languages' add-locale silently no-opped on a duplicate code.
|
||||
- Preview's import bypassed undo history and draft `localStorage`
|
||||
persistence entirely.
|
||||
- Static Pages' create/duplicate-page slug generation had the same
|
||||
collision bug as the footer one.
|
||||
- General's free-text language fields bypassed `LocaleSyncService`
|
||||
(no translation-entry propagation) and had no guard against an
|
||||
unsupported default locale.
|
||||
- Branding's `socialImageUrl` field (added earlier the same session) was
|
||||
never actually read by `SeoService` — dead on arrival until wired in.
|
||||
- The shared `app-media-picker`'s backing facade is a root singleton;
|
||||
search/folder/page filters leaked between independently-opened picker
|
||||
dialogs on the same page.
|
||||
- Found & fixed: 2026-07-17. Each bug was reproduced live via
|
||||
`window.ng.getComponent()` before fixing and re-verified after.
|
||||
- 3 further gaps were found but are real feature work, not wiring bugs —
|
||||
moved to Open (items 3-5 above) rather than fixed inline: Theme Mode
|
||||
has no runtime effect, the `dynamic-renderer/` pipeline is unwired,
|
||||
and the header's Profile toggle has no corresponding menu.
|
||||
|
||||
6. **`admin/categories` facade: dead create-draft recovery + broken
|
||||
drag-reorder.** Found via the same bug-hunt method as project-editor's
|
||||
audit, applied to `admin/products` + `admin/categories`. Full detail
|
||||
(repro steps, fix, live verification) in `docs/ADMIN.md`'s "Bug-hunt audit
|
||||
pass (2026-07-17)" section - summary:
|
||||
- `startCreate()` generated a fresh `category-${Date.now()}` id every
|
||||
call and keyed the `localStorage` autosave draft off it, so create-mode
|
||||
draft recovery could never find a match (even within the same tab,
|
||||
seconds apart) and orphaned an entry every abandoned attempt.
|
||||
- `reorder(id, targetOrder)` wrote the dropped-on row's `order` value
|
||||
straight onto the dragged category, tying two siblings on the same
|
||||
`order` instead of repositioning - and since every seeded category
|
||||
starts at `order: 0`, every drag on fresh data was a silent no-op.
|
||||
- Found & fixed: 2026-07-17. Each reproduced live via
|
||||
`window.ng.getComponent()` before fixing, re-verified after (real
|
||||
backend unreachable in this environment, so via
|
||||
`facade.categories.set([...])` synthetic siblings feeding the same
|
||||
facade methods/gateway calls the UI drives).
|
||||
- A third bug from the same audit pass, fixed in a follow-up commit:
|
||||
`admin-product-form`/`admin-category-form` hardcoded translation-tab
|
||||
locales to `['en','ru','hy']` instead of the tenant's actual
|
||||
`supportedLocales`. Fixed by giving `AdminProductsFacade`/
|
||||
`AdminCategoriesFacade` a `supportedLocales` computed +
|
||||
`ensureLocalesLoaded()` reading/lazily-loading
|
||||
`ProjectEditorFacade.bootstrap()` (same pattern
|
||||
`AdminDashboardFacade.ensureLoaded()` already uses), threaded down to
|
||||
both form components via a new `locales` `@Input()`. Verified live:
|
||||
rendered tab order changed from the hardcoded `['en','ru','hy']` to the
|
||||
real tenant order `['ru','en','hy']` in both editors.
|
||||
|
||||
7. **`pages/category` and `pages/search` hand-rolled skeleton markup
|
||||
replaced with shared `app-skeleton`.** Both pages had their own
|
||||
`.skeleton-card`/`.skeleton-image`/`.skeleton-line` shimmer CSS with
|
||||
hardcoded hex colors, duplicating what `app-skeleton` already provides
|
||||
and what `catalog-container`/`product-details-container` already use.
|
||||
- Fixed: 2026-07-23, RC STORE-01 (`STORE_REVIEW.md` (removed, see git history)).
|
||||
- **Superseded 2026-07-25 (RC-02 task 6):** these files were confirmed
|
||||
unrouted dead code (item 13) and deleted outright, making this fix
|
||||
moot. Live category/search rendering goes through
|
||||
`CatalogContainerComponent`, not these files.
|
||||
|
||||
8. **Cart's dead `.email-form` markup and CSS removed.** Post-payment
|
||||
email/phone-capture form was commented-out markup with a matching
|
||||
~90-line dead CSS block still shipping in the bundle.
|
||||
- Fixed: 2026-07-23, RC STORE-01.
|
||||
|
||||
9. **App-wide query-param routing broken (P0).** `language.guard.ts`'s
|
||||
legacy-URL redirect built the target with `router.createUrlTree([...])`
|
||||
using a single path-segment string with the query string baked in, so it
|
||||
got percent-encoded into the path instead of parsed as query params
|
||||
(`/edit/branding?devBypassAdmin=true` → `/ru/edit/branding%3FdevBypassAdmin%3Dtrue`,
|
||||
a dead route). This guard runs on every top-level route app-wide, so any
|
||||
bookmarked/shared deep link with query params was silently broken —
|
||||
found during the Builder RC walkthrough but affects all 3 surfaces.
|
||||
- Fixed: 2026-07-24, Release Candidate walkthrough (`RELEASE_REPORT.md` (removed, see git history)),
|
||||
`router.parseUrl()` instead of a hand-built path segment.
|
||||
|
||||
10. **Backoffice Categories CRUD completely broken end-to-end (P0).**
|
||||
`admin-categories-gateway.token.ts` resolved via
|
||||
`RuntimeProviderStrategyService.getBackofficeProviderMode()`, which —
|
||||
unlike `getBootstrapProviderMode()` — has no `isLocalhost()` fallback,
|
||||
so it always picked the real HTTP `AdminCategoriesApiGateway` instead of
|
||||
the local mock in an environment with no real backend. Combined with
|
||||
`saveDraft()` having no error handler: every create/publish click
|
||||
silently failed, `dirty` never cleared, and the unsaved-changes guard
|
||||
then blocked navigation with zero feedback.
|
||||
- Fixed: 2026-07-24, Release Candidate walkthrough, wired to the
|
||||
already-defined `getCategoryProviderMode()` + added the same
|
||||
`isLocalhost()` fallback `getBootstrapProviderMode()` already had.
|
||||
Live-verified: create/edit/reorder all persist correctly now.
|
||||
|
||||
## Notes (not bugs, just flag before shipping)
|
||||
|
||||
- `src/environments/environment.ts`: `useMockData` was temporarily flipped to
|
||||
`true` during this session's manual verification (so Categories/Products
|
||||
dashboard cards showed mock counts instead of erroring against a
|
||||
nonexistent local `/api/backoffice/*` backend), then reverted back to
|
||||
`false` afterward - matches its pre-session value.
|
||||
- App-wide query-param routing broken (P0) — `language.guard.ts` legacy redirect percent-encoded query strings into the path.
|
||||
- Backoffice Categories CRUD broken end-to-end (P0) — wrong provider-mode fallback always picked the real HTTP gateway with no backend present.
|
||||
- Cart/builder native `confirm()`/`alert()` (16 call sites) replaced with shared `app-confirm-dialog` / toast service.
|
||||
- `getMainImage()` no-photo fallback and footer payment-icon assets referenced files that didn't exist — both fixed, `onerror` fallback added everywhere.
|
||||
- Backoffice Monitoring showed raw HTTP/queue/webhook strings by default — now friendly wording with technical detail collapsed behind a `<details>`.
|
||||
- Category/subcategory empty states used apology wording ("Oops!") for a normal zero-results state.
|
||||
- `pages/category`, `pages/search`, `pages/item-detail`, `pages/info/**`, `pages/legal/**` (40+ files) were unrouted dead code — deleted.
|
||||
- `dynamic-renderer/` was believed unwired — verified it's the live homepage rendering pipeline, no action needed.
|
||||
- `admin/products/:id/edit` missing `canDeactivate` guard — added, mirrors categories.
|
||||
- `primeng`/`primeicons` unused dependency — removed.
|
||||
- Builder static-page body editor hidden inside a mislabeled collapsed section — un-hidden, relabeled.
|
||||
- Several project-editor/admin-categories correctness bugs (footer icon id collisions, features toggle only driving one flag, languages silent duplicate no-op, static-pages slug collision, branding `socialImageUrl` never read, media-picker facade filter leakage between dialogs, categories draft-recovery/drag-reorder bugs, hardcoded locale-tab order) — see git history for the full per-bug list.
|
||||
|
||||
Reference in New Issue
Block a user