- docs/TODO.md: checklist of every open item from KNOWN-ISSUES.md/ FRONTEND-ROADMAP.md/BACKEND_API_REMAINING_WORK.md/ANGULAR22_PLAN.md, re-verified against current repo state (git ahead count, package.json, app.routes.ts) rather than copied blind. Backend items kept but marked skipped per user request (doing together separately). - Deleted docs/archive/ (19 files) now that every open finding was confirmed already merged into KNOWN-ISSUES.md/FRONTEND-ROADMAP.md. Full original text recoverable via git history (git log --diff-filter=D -- docs/archive). - Fixed the resulting dangling docs/archive/* references in PROJECT_INDEX.md/KNOWN-ISSUES.md/FRONTEND-ROADMAP.md. Verification: tsc --noEmit clean, npm run build green, 0 broken markdown links across 49 files (checked programmatically). No application code touched. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
22 KiB
Known Issues (fix after sprint wrap-up)
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.
Open
-
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.tsor the widget components - not fixed this session, needs config-side investigation if it reproduces with real tenant data rather than mock config. -
~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.tshave noadminProducts.*,adminCategories.*,adminOrders.*,adminTransactions.*,adminUsers.*,adminMonitoring.*, oradminAnalytics.*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 (seetranslate.service.ts), so every templated string in these features (buttons, table headers, filters, badges, empty/placeholder text) renders literally as e.g.adminProducts.createinstead 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 undersrc/app/features/admin/**:adminProducts72,adminCategories23,adminOrders24,adminUsers21,adminMonitoring13,adminAnalytics12,adminTransactions13 (≈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.
- Counted by grepping all
-
Theme Mode selector has no runtime effect.
theme-section's light/dark/ system dropdown saves correctly andtheme-engine.service.tssets adata-theme-modeattribute 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-schemestrategy + amatchMedialistener 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).
- Found: 2026-07-17, project-editor bug-hunt audit (
-
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 owntypefield (homepage-section.component.ts'supdateSection(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.
-
HeaderConfig.showProfiletoggle has no corresponding UI. The header editor's "Profile" toggle updates a real config field, butheader.component.htmlnever referencesshowProfile— 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.
-
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 portedapp-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 sharedapp-dialogitself — 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)).
- Found: 2026-07-23, RC-Premium-01 (
-
Cart's
clearCart()uses nativeconfirm(), 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.
-
stars.componentrating glyph color and a few legacy hex literals inpages/category/pages/searchhave no exact design-token match. Left as literals to avoid an unintended visual shift; needs a deliberate token-extension decision before normalizing.- Found: 2026-07-23, RC-Premium-01.
-
Genuine brand-color contrast failures (WCAG AA).
--border-colorfails 3:1 UI-component contrast in every theme (1.24-1.42:1 measured);--success/--warning/--error/--info-colorfail 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)).
- Found: 2026-07-24, RC A11Y-01 (
-
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)).
- Found: 2026-07-24, Release Candidate walkthrough (
-
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.
-
primeng/primeiconsstill inpackage.jsonafter their only consumer was deleted.npm uninstallfails (ETARGET) on a pre-existing, unrelated brokenbarry-cachedevDependency 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)).
- Found: 2026-07-24, RC PERF-01 (
-
CRITICAL —
pages/category/*,pages/search/*,pages/item-detail/*,pages/info/**,pages/legal/**(40+ files) are entirely unrouted dead code, not live pages. Verified directly againstsrc/app/app.routes.ts:category/:idandcategory/:id/itemsredirectTo: 'catalog/:id'(served byCatalogContainerComponent);searchalso routes toCatalogContainerComponent;product/:idroutes toProductDetailsContainerComponent, notpages/item-detail;cmsContentRoutes(meant to routepages/info/**/pages/legal/**) is a literal empty array (app.routes.ts:292) behind a// TODO(CMS): Resolve informational/legal pages from backend content configuration herecomment — About/Contacts/FAQ/Delivery/Guarantee/ Company-Details/Payment-Terms/Return-Policy/Public-Offer/Privacy-Policy are all actually served by the catch-all:staticPathroute resolvingbootstrap.staticPages(pages/static-page/static-page.component.ts), confirmed independently bydocs/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 againstapp.routes.tsand 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: wirecmsContentRoutesback 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.
-
No
canDeactivateguard onadmin/products/:id/edit. Categories protect against navigating away with unsaved changes (adminCategoryDirtyGuard,app.routes.ts:121,131); products do not, despiteAdminProductsFacadehaving 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 currentapp.routes.ts— still true.
- Found: 2026-07-19 (
Fixed
-
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-barbuttons were plain unstyled<button>s (project-editor-save-bar.component.html/.scss) - now use the sharedapp-buttonprimitive. - Fixed:
.platform-nav-group(header.component.html/.scss) appliedplatform-nav-btn-leftto 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/-rightclasses. - 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 behindprefers-reduced-motion. - Polished:
admin-dashboard-card.component.scssandadmin-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-paginationprimitives 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 inadmin-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::beforeinset to expand the hit area without changing the visual badge size. - Fixed:
section.shared.scss(used by all 11 project-editor sections) had a barebutton/button.secondarystyle with zero hover, focus, or transition - added hover/active/focus-visible/disabled states plusprefers-reduced-motionguard, applied uniformly across every section. - Added:
project-editor-page.component.scss.project-editor-stack > *now fades/slides in (220ms) whenever@switchswaps 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 --noEmitclean 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 serveprocess died independently of these edits, confirmed viacurlconnection-refused before restart) - restarted vianpm 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).
- Fixed:
-
Project Editor footer: payment icons and social links had no validation.
footer-section.component.tsparsed both fields from pipe-delimited<textarea>strings (icon.src|icon.alt,link.id|link.label|link.url) with zero validation - malformed rows silently produced emptysrc/alt/urlvalues instead of surfacing an error.- Fixed: 2026-07-16, replaced both textareas with
app-key-value-editorrows (icon picked viaMediaPickerComponent, label/URL viaapp-input), added inline URL-format validation on social links (sameHTTP_URLpattern used inproject-validator.service.ts) and a missing footer-logo media picker.
- Fixed: 2026-07-16, replaced both textareas with
-
Project Editor navigation: nav link labels only editable for the default locale.
navigation-section.component.ts'slabelOfhelper (and the facade'supdateNavLinkLabel) always read/wrote the default locale's key on aNavigationLocalizedTextlabel 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-tabsto the section; the label input now reads/writes the active tab's locale via a neweditableLabel()helper, andProjectEditorFacade.updateNavLinkLabel()gained an optionallocaleparameter (defaults to the current default locale, so existing callers are unaffected).
- Fixed: 2026-07-16, added
-
Quick Actions: 3 untranslated raw i18n keys.
dashboard.actionUsers,dashboard.actionMonitoring,dashboard.actionAnalyticsrendered as literal key strings instead of translated labels on the admin dashboard's Quick Actions section, becauseadmin-dashboard.facade.tsreferenced them but they were never added totranslations.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.
- Found: 2026-07-15, manual browser verification of
-
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
localStoragepersistence 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
socialImageUrlfield (added earlier the same session) was never actually read bySeoService— 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.
- Footer social-link/payment-icon id generation reproducibly collided
(array-length-derived / fixed suffix), corrupting
-
admin/categoriesfacade: dead create-draft recovery + broken drag-reorder. Found via the same bug-hunt method as project-editor's audit, applied toadmin/products+admin/categories. Full detail (repro steps, fix, live verification) indocs/ADMIN.md's "Bug-hunt audit pass (2026-07-17)" section - summary:startCreate()generated a freshcategory-${Date.now()}id every call and keyed thelocalStorageautosave 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'sordervalue straight onto the dragged category, tying two siblings on the sameorderinstead of repositioning - and since every seeded category starts atorder: 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 viafacade.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-formhardcoded translation-tab locales to['en','ru','hy']instead of the tenant's actualsupportedLocales. Fixed by givingAdminProductsFacade/AdminCategoriesFacadeasupportedLocalescomputed +ensureLocalesLoaded()reading/lazily-loadingProjectEditorFacade.bootstrap()(same patternAdminDashboardFacade.ensureLoaded()already uses), threaded down to both form components via a newlocales@Input(). Verified live: rendered tab order changed from the hardcoded['en','ru','hy']to the real tenant order['ru','en','hy']in both editors.
-
pages/categoryandpages/searchhand-rolled skeleton markup replaced with sharedapp-skeleton. Both pages had their own.skeleton-card/.skeleton-image/.skeleton-lineshimmer CSS with hardcoded hex colors, duplicating whatapp-skeletonalready provides and whatcatalog-container/product-details-containeralready use.- Fixed: 2026-07-23, RC STORE-01 (
STORE_REVIEW.md(removed, see git history)). - Correction (2026-07-25): these files are unrouted dead code (Open
item 13) — the fix is real and harmless but currently has zero
production effect. Live category/search rendering goes through
CatalogContainerComponent, not these files.
- Fixed: 2026-07-23, RC STORE-01 (
-
Cart's dead
.email-formmarkup 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.
-
App-wide query-param routing broken (P0).
language.guard.ts's legacy-URL redirect built the target withrouter.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.
- Fixed: 2026-07-24, Release Candidate walkthrough (
-
Backoffice Categories CRUD completely broken end-to-end (P0).
admin-categories-gateway.token.tsresolved viaRuntimeProviderStrategyService.getBackofficeProviderMode(), which — unlikegetBootstrapProviderMode()— has noisLocalhost()fallback, so it always picked the real HTTPAdminCategoriesApiGatewayinstead of the local mock in an environment with no real backend. Combined withsaveDraft()having no error handler: every create/publish click silently failed,dirtynever 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 sameisLocalhost()fallbackgetBootstrapProviderMode()already had. Live-verified: create/edit/reorder all persist correctly now.
- Fixed: 2026-07-24, Release Candidate walkthrough, wired to the
already-defined
Notes (not bugs, just flag before shipping)
src/environments/environment.ts:useMockDatawas temporarily flipped totrueduring 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 tofalseafterward - matches its pre-session value.