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

@@ -720,7 +720,7 @@ export const en: Translations = {
actionAnalytics: 'Analytics',
actionPreviewMarketplace: 'Preview Marketplace',
activityTitle: 'Recent Activity',
activityEmpty: 'No activity yet. Save or publish a change to see it here.',
activityEmpty: 'No activity yet',
activityDraftSaved: 'Draft saved',
activityPublished: 'Published',
healthTitle: 'System Health',
@@ -734,6 +734,54 @@ export const en: Translations = {
comingSoonTitle: 'Coming soon',
comingSoonDescription: 'This section is not built yet. Check back in a future update.',
backToDashboard: 'Back to dashboard',
welcomeEyebrow: 'Welcome back',
welcomeFallbackTenant: 'Your marketplace',
envProduction: 'Production',
envDevelopment: 'Development',
factCurrentUser: 'Current user',
factTenant: 'Store',
quickActionsDescription: 'Your most common tasks - start here',
actionAddProduct: 'Add product',
actionAddProductDescription: 'Create a new product listing',
actionCreateCategory: 'Create category',
actionCreateCategoryDescription: 'Add a category to the catalog',
actionEditProjectDescription: 'Open the marketplace builder',
actionEditHomepage: 'Edit homepage',
actionEditHomepageDescription: 'Configure the homepage widgets',
actionMediaLibraryDescription: 'Upload and organize files',
actionOrdersDescription: 'Review recent orders',
draftStatusTitle: 'Draft status',
draftStatusHasChanges: 'There are unpublished changes waiting to go live.',
draftStatusAllPublished: 'Everything published. No draft in progress.',
draftStatusMoreFields: '+{{count}} more',
draftOpenBuilder: 'Open builder',
draftPublish: 'Publish',
draftDiscard: 'Discard draft',
healthProductsCount: 'Products',
healthCategoriesCount: 'Categories',
healthDraftExists: 'Draft',
healthImagesWithoutAlt: 'Images missing alt text',
healthStaticPagesUnpublished: 'Unpublished static pages',
healthHomepageConfigured: 'Homepage configured',
healthThemeConfigured: 'Theme configured',
statusHealthy: 'Healthy',
statusAttention: 'Needs attention',
statusUnhealthy: 'Issue',
statusUnknown: 'Not tracked yet',
activityEmptyHint: 'Save or publish a change to see it appear here.',
activityUnavailable: 'Activity history unavailable',
activityUnavailableHint: "Couldn't reach the activity data source. Try refreshing later.",
activityErrorHint: "Couldn't load recent activity.",
shortcutsTitle: 'Useful shortcuts',
shortcutsDescription: 'Frequently used destinations across the admin panel',
shortcutMarketplaceBuilder: 'Marketplace Builder',
shortcutSettings: 'Settings',
shortcutContent: 'Content',
docTitle: 'Documentation',
docDocumentation: 'Documentation',
docKeyboardShortcuts: 'Keyboard shortcuts',
docReportIssue: 'Report an issue',
docReleaseNotes: 'Release notes',
},
staticPages: {
notFound: 'Page not found',

View File

@@ -720,7 +720,7 @@ export const hy: Translations = {
actionAnalytics: 'Վերլուծություն',
actionPreviewMarketplace: 'Դիտել մարքեթփլեյսը',
activityTitle: 'Վերջին ակտիվություն',
activityEmpty: 'Դեռ ակտիվություն չկա։ Պահպանեք կամ հրապարակեք փոփոխություն՝ այն այստեղ տեսնելու համար։',
activityEmpty: 'Դեռ ակտիվություն չկա',
activityDraftSaved: 'Սևագիրը պահպանվեց',
activityPublished: 'Հրապարակվեց',
healthTitle: 'Համակարգի վիճակ',
@@ -734,6 +734,54 @@ export const hy: Translations = {
comingSoonTitle: 'Շուտով',
comingSoonDescription: 'Այս բաժինը դեռ կառուցված չէ։ Ստուգեք ավելի ուշ։',
backToDashboard: 'Վերադառնալ վահանակ',
welcomeEyebrow: 'Բարի վերադարձ',
welcomeFallbackTenant: 'Ձեր մարկետփլեյսը',
envProduction: 'Պրոդակշն',
envDevelopment: 'Մշակում',
factCurrentUser: 'Ընթացիկ օգտատեր',
factTenant: 'Խանութ',
quickActionsDescription: 'Ձեր ամենահաճախակի առաջադրանքները՝ սկսեք այստեղից',
actionAddProduct: 'Ավելացնել ապրանք',
actionAddProductDescription: 'Ստեղծել նոր ապրանքի քարտ',
actionCreateCategory: 'Ստեղծել կատեգորիա',
actionCreateCategoryDescription: 'Ավելացնել կատեգորիա կատալոգում',
actionEditProjectDescription: 'Բացել մարկետփլեյսի կոնստրուկտորը',
actionEditHomepage: 'Խմբագրել գլխավոր էջը',
actionEditHomepageDescription: 'Կարգավորել գլխավոր էջի վիջեթները',
actionMediaLibraryDescription: 'Վերբեռնեք և կազմակերպեք ֆայլերը',
actionOrdersDescription: 'Դիտեք վերջին պատվերները',
draftStatusTitle: 'Սևագրի կարգավիճակ',
draftStatusHasChanges: 'Կան չհրապարակված փոփոխություններ։',
draftStatusAllPublished: 'Ամեն ինչ հրապարակված է։ Սևագիր չկա։',
draftStatusMoreFields: '+{{count}} ևս',
draftOpenBuilder: 'Բացել կոնստրուկտորը',
draftPublish: 'Հրապարակել',
draftDiscard: 'Չեղարկել սևագիրը',
healthProductsCount: 'Ապրանքներ',
healthCategoriesCount: 'Կատեգորիաներ',
healthDraftExists: 'Սևագիր',
healthImagesWithoutAlt: 'Alt տեքստ չունեցող պատկերներ',
healthStaticPagesUnpublished: 'Չհրապարակված ստատիկ էջեր',
healthHomepageConfigured: 'Գլխավոր էջը կարգավորված է',
healthThemeConfigured: 'Թեման կարգավորված է',
statusHealthy: 'Կարգին է',
statusAttention: 'Ուշադրություն է պահանջում',
statusUnhealthy: 'Խնդիր',
statusUnknown: 'Դեռ չի հետևվում',
activityEmptyHint: 'Պահպանեք կամ հրապարակեք փոփոխություն՝ այն այստեղ տեսնելու համար։',
activityUnavailable: 'Ակտիվության պատմությունը հասանելի չէ',
activityUnavailableHint: 'Չհաջողվեց միանալ տվյալների աղբյուրին։ Փորձեք թարմացնել ավելի ուշ։',
activityErrorHint: 'Չհաջողվեց բեռնել վերջին ակտիվությունը։',
shortcutsTitle: 'Օգտակար հղումներ',
shortcutsDescription: 'Ադմին վահանակի հաճախակի օգտագործվող բաժինները',
shortcutMarketplaceBuilder: 'Մարկետփլեյսի կոնստրուկտոր',
shortcutSettings: 'Կարգավորումներ',
shortcutContent: 'Բովանդակություն',
docTitle: 'Փաստաթղթեր',
docDocumentation: 'Փաստաթղթեր',
docKeyboardShortcuts: 'Ստեղնաշարի դյուրանցումներ',
docReportIssue: 'Հայտնել խնդրի մասին',
docReleaseNotes: 'Թողարկման նշումներ',
},
staticPages: {
notFound: 'Էջը չի գտնվել',

View File

@@ -720,7 +720,7 @@ export const ru: Translations = {
actionAnalytics: 'Аналитика',
actionPreviewMarketplace: 'Просмотр маркетплейса',
activityTitle: 'Недавняя активность',
activityEmpty: 'Пока нет активности. Сохраните или опубликуйте изменение, чтобы увидеть его здесь.',
activityEmpty: 'Пока нет активности',
activityDraftSaved: 'Черновик сохранён',
activityPublished: 'Опубликовано',
healthTitle: 'Состояние системы',
@@ -734,6 +734,54 @@ export const ru: Translations = {
comingSoonTitle: 'Скоро',
comingSoonDescription: 'Этот раздел ещё не реализован. Загляните позже.',
backToDashboard: 'Вернуться на панель управления',
welcomeEyebrow: 'С возвращением',
welcomeFallbackTenant: 'Ваш маркетплейс',
envProduction: 'Продакшн',
envDevelopment: 'Разработка',
factCurrentUser: 'Текущий пользователь',
factTenant: 'Магазин',
quickActionsDescription: 'Самые частые задачи — начните здесь',
actionAddProduct: 'Добавить товар',
actionAddProductDescription: 'Создать новую карточку товара',
actionCreateCategory: 'Создать категорию',
actionCreateCategoryDescription: 'Добавить категорию в каталог',
actionEditProjectDescription: 'Открыть конструктор маркетплейса',
actionEditHomepage: 'Редактировать главную',
actionEditHomepageDescription: 'Настроить виджеты главной страницы',
actionMediaLibraryDescription: 'Загрузить и организовать файлы',
actionOrdersDescription: 'Просмотреть последние заказы',
draftStatusTitle: 'Статус черновика',
draftStatusHasChanges: 'Есть несохранённые изменения, ожидающие публикации.',
draftStatusAllPublished: 'Всё опубликовано. Черновика нет.',
draftStatusMoreFields: 'ещё {{count}}',
draftOpenBuilder: 'Открыть конструктор',
draftPublish: 'Опубликовать',
draftDiscard: 'Отменить черновик',
healthProductsCount: 'Товары',
healthCategoriesCount: 'Категории',
healthDraftExists: 'Черновик',
healthImagesWithoutAlt: 'Изображения без alt-текста',
healthStaticPagesUnpublished: 'Неопубликованные статические страницы',
healthHomepageConfigured: 'Главная страница настроена',
healthThemeConfigured: 'Тема настроена',
statusHealthy: 'В порядке',
statusAttention: 'Требует внимания',
statusUnhealthy: 'Проблема',
statusUnknown: 'Пока не отслеживается',
activityEmptyHint: 'Сохраните или опубликуйте изменение, чтобы увидеть его здесь.',
activityUnavailable: 'История активности недоступна',
activityUnavailableHint: 'Не удалось подключиться к источнику данных. Попробуйте обновить страницу позже.',
activityErrorHint: 'Не удалось загрузить недавнюю активность.',
shortcutsTitle: 'Полезные ссылки',
shortcutsDescription: 'Часто используемые разделы админ-панели',
shortcutMarketplaceBuilder: 'Конструктор маркетплейса',
shortcutSettings: 'Настройки',
shortcutContent: 'Контент',
docTitle: 'Документация',
docDocumentation: 'Документация',
docKeyboardShortcuts: 'Горячие клавиши',
docReportIssue: 'Сообщить о проблеме',
docReleaseNotes: 'Список изменений',
},
staticPages: {
notFound: 'Страница не найдена',

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;