Files
marketplaces/docs/KNOWN-ISSUES.md
sdarbinyan 6be3c5892d docs(admin): move locale-hardcoding gap from Open to Fixed
Follow-up to ff4fba3 - the admin/products + admin/categories
translation-tab locale-hardcoding gap flagged as deferred in the
bug-hunt audit docs is now fixed; updates docs/ADMIN.md's audit
section and moves docs/KNOWN-ISSUES.md's item from Open to Fixed.
2026-07-17 22:25:58 +04:00

236 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
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.
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 `docs/SPRINT-PLAN.md`) 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.
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`).
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.
## 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.
## 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.