feat(admin): redesign dashboard into professional SaaS homepage

Replaced the placeholder dashboard with a real business homepage built
on 6 new reusable widget components (DashboardSection, DashboardCard,
DashboardMetric, DashboardStatusRow, DashboardTimeline,
DashboardShortcutCard), all wired through shared app-card/app-skeleton/
app-empty-state.

Sections: Welcome (tenant, env badge, current user, last publish/save -
all real facade signals, never blank), Quick Actions (large cards: add
product, create category, open builder, edit homepage, media, orders),
Draft Status (real dirty/modifiedFields/publish/discard from
ProjectEditorFacade), Marketplace Health (9 checks - config, product/
category counts, missing translations, draft, static-pages-unpublished,
homepage/theme configured, all real; images-without-alt shown as
'not tracked yet' rather than fabricated), Recent Activity (existing
localStorage-backed history service, loading/empty states), Useful
Shortcuts, Documentation (honest coming-soon list, no dead links).

12-column responsive grid: 3-across cards on desktop, 2-column on
tablet, single column on mobile, no horizontal scroll. Keyboard/focus/
ARIA per shortcut card and status row; health status never conveyed by
color alone (icon + text every time).

AdminDashboardHealthCheck (boolean 'healthy' shape) and its facade
signal are untouched - AdminMonitoringPageComponent also consumes them.
New richer status data lives in a separate homeHealthChecks signal/
AdminDashboardHomeHealthCheck type instead of widening the shared one.

Added ~50 new dashboard.* / kept existing i18n strings across ru/en/hy;
no raw keys.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
sdarbinyan
2026-07-18 08:59:29 +04:00
parent eb7b5c996d
commit 419cb9a32c
39 changed files with 1291 additions and 589 deletions

View File

@@ -732,6 +732,54 @@ export interface Translations {
comingSoonTitle: string;
comingSoonDescription: string;
backToDashboard: string;
welcomeEyebrow: string;
welcomeFallbackTenant: string;
envProduction: string;
envDevelopment: string;
factCurrentUser: string;
factTenant: string;
quickActionsDescription: string;
actionAddProduct: string;
actionAddProductDescription: string;
actionCreateCategory: string;
actionCreateCategoryDescription: string;
actionEditProjectDescription: string;
actionEditHomepage: string;
actionEditHomepageDescription: string;
actionMediaLibraryDescription: string;
actionOrdersDescription: string;
draftStatusTitle: string;
draftStatusHasChanges: string;
draftStatusAllPublished: string;
draftStatusMoreFields: string;
draftOpenBuilder: string;
draftPublish: string;
draftDiscard: string;
healthProductsCount: string;
healthCategoriesCount: string;
healthDraftExists: string;
healthImagesWithoutAlt: string;
healthStaticPagesUnpublished: string;
healthHomepageConfigured: string;
healthThemeConfigured: string;
statusHealthy: string;
statusAttention: string;
statusUnhealthy: string;
statusUnknown: string;
activityEmptyHint: string;
activityUnavailable: string;
activityUnavailableHint: string;
activityErrorHint: string;
shortcutsTitle: string;
shortcutsDescription: string;
shortcutMarketplaceBuilder: string;
shortcutSettings: string;
shortcutContent: string;
docTitle: string;
docDocumentation: string;
docKeyboardShortcuts: string;
docReportIssue: string;
docReleaseNotes: string;
};
staticPages: {
notFound: string;