From c452d28eca702f75f91c9025acc2ffa0a3533a2a Mon Sep 17 00:00:00 2001 From: sdarbinyan Date: Sun, 19 Jul 2026 08:25:29 +0400 Subject: [PATCH] fix(admin): P0 user-reported bugs - raw keys, table overflow, builder escape route Co-Authored-By: Claude Fable 5 - Transactions: 'adminTransactions.flag'/'clearFlag' raw keys rendered on the fraud toggle button (missed by earlier audit because the key sits inside a ternary); added en/ru/hy strings with merchant wording ('Flag as suspicious') - Table overflow on Customers/Transactions root-caused: app-table host is a grid item with default min-width:auto, so wide tables stretched their parent card instead of scrolling inside the wrapper; shared TableComponent now declares display:block/min-width:0/max-width:100% on its element selector (encapsulation None - :host would not match), fixing every admin table at once; verified in browser: cards contained, wrapper scrolls internally - Builder trap root-caused: section editor pages (/:lang/edit/
) had zero routes to the backoffice - only a link back to the builder overview - so admins inside a section could not return to the dashboard; sidebar now has a persistent 'Back to dashboard' link (new builder.backToDashboard key, en/ru/hy); verified navigation lands on /ru/backoffice/dashboard --- .../pages/project-editor-page.component.html | 4 ++++ .../pages/project-editor-page.component.scss | 22 +++++++++++++++++++ .../pages/project-editor-page.component.ts | 3 +++ src/app/i18n/en.ts | 3 +++ src/app/i18n/hy.ts | 3 +++ src/app/i18n/ru.ts | 3 +++ src/app/i18n/translations.ts | 3 +++ src/app/shared/ui/table/table.component.scss | 12 ++++++++++ 8 files changed, 53 insertions(+) diff --git a/src/app/features/project-editor/pages/project-editor-page.component.html b/src/app/features/project-editor/pages/project-editor-page.component.html index 1d62e76..f12ac53 100644 --- a/src/app/features/project-editor/pages/project-editor-page.component.html +++ b/src/app/features/project-editor/pages/project-editor-page.component.html @@ -8,6 +8,10 @@ {{ 'builder.appName' | translate }} + + + {{ 'builder.backToDashboard' | translate }} + diff --git a/src/app/features/project-editor/pages/project-editor-page.component.scss b/src/app/features/project-editor/pages/project-editor-page.component.scss index 999ff9a..16af4cc 100644 --- a/src/app/features/project-editor/pages/project-editor-page.component.scss +++ b/src/app/features/project-editor/pages/project-editor-page.component.scss @@ -51,6 +51,28 @@ } } +.project-editor-layout__dashboard-link { + display: flex; + align-items: center; + gap: var(--space-xs); + padding: var(--space-sm); + margin-bottom: var(--space-md); + border-radius: var(--radius-sm); + color: var(--text-secondary); + font-size: 0.85rem; + text-decoration: none; + + &:hover { + background: var(--bg-tertiary); + color: var(--text-primary); + } + + &:focus-visible { + outline: 2px solid var(--primary-color); + outline-offset: 2px; + } +} + .project-editor-layout__content { min-width: 0; padding: var(--space-lg); diff --git a/src/app/features/project-editor/pages/project-editor-page.component.ts b/src/app/features/project-editor/pages/project-editor-page.component.ts index 22e234e..1bdba4b 100644 --- a/src/app/features/project-editor/pages/project-editor-page.component.ts +++ b/src/app/features/project-editor/pages/project-editor-page.component.ts @@ -95,6 +95,9 @@ export class ProjectEditorPageComponent { readonly overviewRoute = computed(() => ['/', this.languageService.currentLanguage(), 'edit']); + /** Persistent escape hatch back to the admin dashboard - section editors previously had no route to the backoffice at all. */ + readonly dashboardRoute = computed(() => ['/', this.languageService.currentLanguage(), 'backoffice', 'dashboard']); + constructor() { this.facade.loadBootstrap(); effect(() => { diff --git a/src/app/i18n/en.ts b/src/app/i18n/en.ts index d9636e3..19011b2 100644 --- a/src/app/i18n/en.ts +++ b/src/app/i18n/en.ts @@ -686,6 +686,7 @@ export const en: Translations = { linkUrlDesc: 'Path or URL this navigation link points to.', linkVisibleDesc: 'Whether this navigation link is shown to shoppers.', appName: 'Marketplace Builder', + backToDashboard: 'Back to dashboard', breadcrumbRoot: 'Marketplace Builder', statusComplete: 'Complete', statusInProgress: 'In progress', @@ -1628,6 +1629,8 @@ export const en: Translations = { method: 'Payment method', fraud: 'Fraud check', flagged: 'Flagged', + flag: 'Flag as suspicious', + clearFlag: 'Clear flag', retry: 'Retry', audit: 'History', emptyTitle: 'No transactions found', diff --git a/src/app/i18n/hy.ts b/src/app/i18n/hy.ts index 87f0953..2ac2229 100644 --- a/src/app/i18n/hy.ts +++ b/src/app/i18n/hy.ts @@ -686,6 +686,7 @@ export const hy: Translations = { linkUrlDesc: 'Ուղին կամ URL-ը, որին ուղղորդում է այս նավիգացիոն հղումը։', linkVisibleDesc: 'Արդյո՞ք այս նավիգացիոն հղումը ցուցադրվում է գնորդներին։', appName: 'Մարկետփլեյսի կոնստրուկտոր', + backToDashboard: 'Վերադառնալ կառավարման վահանակ', breadcrumbRoot: 'Մարկետփլեյսի կոնստրուկտոր', statusComplete: 'Ավարտված', statusInProgress: 'Ընթացքի մեջ', @@ -1623,6 +1624,8 @@ export const hy: Translations = { method: 'Վճարման եղանակ', fraud: 'Խարդախության ստուգում', flagged: 'Նշված', + flag: 'Նշել որպես կասկածելի', + clearFlag: 'Հանել նշումը', retry: 'Կրկնել', audit: 'Պատմություն', emptyTitle: 'Գործարքներ չեն գտնվել', diff --git a/src/app/i18n/ru.ts b/src/app/i18n/ru.ts index d9bfe4c..386e8a7 100644 --- a/src/app/i18n/ru.ts +++ b/src/app/i18n/ru.ts @@ -686,6 +686,7 @@ export const ru: Translations = { linkUrlDesc: 'Путь или URL, на который ведёт эта ссылка навигации.', linkVisibleDesc: 'Показывать ли эту ссылку навигации покупателям.', appName: 'Конструктор маркетплейса', + backToDashboard: 'Назад в панель управления', breadcrumbRoot: 'Конструктор маркетплейса', statusComplete: 'Готово', statusInProgress: 'В процессе', @@ -1623,6 +1624,8 @@ export const ru: Translations = { method: 'Способ оплаты', fraud: 'Проверка на мошенничество', flagged: 'Помечено', + flag: 'Пометить как подозрительную', + clearFlag: 'Снять пометку', retry: 'Повторить', audit: 'История', emptyTitle: 'Транзакции не найдены', diff --git a/src/app/i18n/translations.ts b/src/app/i18n/translations.ts index ab2200e..66b4c1d 100644 --- a/src/app/i18n/translations.ts +++ b/src/app/i18n/translations.ts @@ -684,6 +684,7 @@ export interface Translations { linkUrlDesc: string; linkVisibleDesc: string; appName: string; + backToDashboard: string; breadcrumbRoot: string; statusComplete: string; statusInProgress: string; @@ -1635,6 +1636,8 @@ export interface Translations { method: string; fraud: string; flagged: string; + flag: string; + clearFlag: string; retry: string; audit: string; emptyTitle: string; diff --git a/src/app/shared/ui/table/table.component.scss b/src/app/shared/ui/table/table.component.scss index 35651fe..7bb317b 100644 --- a/src/app/shared/ui/table/table.component.scss +++ b/src/app/shared/ui/table/table.component.scss @@ -1,3 +1,15 @@ +/* Block-level host that is allowed to shrink inside grid/flex parents. + Without min-width: 0 a wide table forces its parent card to grow past + its container (grid items default to min-width: auto), which is exactly + the "table overflows the card" bug on Customers/Transactions. */ +/* Encapsulation is None, so target the element selector directly + (:host would not match). */ +app-table { + display: block; + min-width: 0; + max-width: 100%; +} + .app-table-wrapper { width: 100%; overflow-x: auto;