-
+
-
+
+
+
+
{{ 'dashboard.welcomeEyebrow' | translate }}
+
+ {{ (tenantName() ?? ('dashboard.welcomeFallbackTenant' | translate)) }}
+
+
+ {{ (facade.isProductionEnvironment ? 'dashboard.envProduction' : 'dashboard.envDevelopment') | translate }}
+
+
-
+
+
+
+
+
+
+ @for (action of quickActions(); track action.labelKey) {
+
+ }
+
+
+
+
+
+ @if (facade.dirty()) {
+ {{ 'dashboard.draftStatusHasChanges' | translate }}
+ @if (facade.modifiedFieldLabelKeys().length > 0) {
+
+ @for (labelKey of facade.modifiedFieldLabelKeys(); track labelKey) {
+ - {{ labelKey | translate }}
+ }
+ @if (facade.modifiedFieldsOverflowCount() > 0) {
+ -
+ {{ 'dashboard.draftStatusMoreFields' | translate: { count: facade.modifiedFieldsOverflowCount() } }}
+
+ }
+
+ }
+ {{ 'dashboard.cardLastDraftSave' | translate }}: {{ lastSavedText() ?? ('dashboard.never' | translate) }}
+
+ } @else {
+
+
+ {{ 'dashboard.draftStatusAllPublished' | translate }}
+
+ }
+
+
+
+
+ @for (check of facade.homeHealthChecks(); track check.code) {
+
+ }
+
+
+
+
+
+
+
+
+
+
+ @for (shortcut of shortcuts(); track shortcut.labelKey) {
+
+ }
+
+
+
+
+
+
+ @for (link of documentationLinks; track link.id) {
+ -
+
+
+ }
+
+
-
diff --git a/src/app/features/admin/dashboard/pages/admin-dashboard-page.component.scss b/src/app/features/admin/dashboard/pages/admin-dashboard-page.component.scss
index f448564..8695ade 100644
--- a/src/app/features/admin/dashboard/pages/admin-dashboard-page.component.scss
+++ b/src/app/features/admin/dashboard/pages/admin-dashboard-page.component.scss
@@ -1,64 +1,222 @@
.dashboard-page {
- display: flex;
- flex-direction: column;
- gap: 24px;
- padding: 20px;
- max-width: 1280px;
- margin: 0 auto;
+ display: block;
}
-.dashboard-page__header {
+.dashboard-page__grid {
+ display: grid;
+ grid-template-columns: repeat(12, minmax(0, 1fr));
+ gap: var(--space-lg);
+ align-items: stretch;
+}
+
+/* ---------- Welcome ---------- */
+
+.dashboard-welcome {
+ grid-column: span 12;
+ display: flex;
+ flex-wrap: wrap;
+ align-items: flex-end;
+ justify-content: space-between;
+ gap: var(--space-lg);
+ padding: var(--space-lg);
+ border: 1px solid var(--border-color);
+ border-radius: var(--radius-md);
+ background: var(--gradient-primary);
+ color: #fff;
+}
+
+.dashboard-welcome__intro {
display: flex;
flex-direction: column;
gap: 4px;
+ min-width: 0;
}
-.dashboard-page__title {
+.dashboard-welcome__eyebrow {
margin: 0;
- font-size: 26px;
- font-weight: 800;
- color: var(--text-primary, #1e3c38);
+ font-size: 0.7rem;
+ font-weight: 600;
+ letter-spacing: 0.4px;
+ text-transform: uppercase;
+ color: rgba(255, 255, 255, 0.75);
}
-.dashboard-page__subtitle {
+.dashboard-welcome__title {
margin: 0;
- font-size: 14px;
- color: var(--text-secondary, #667a77);
+ font-size: clamp(1.5rem, 3vw, 2rem);
+ font-weight: 700;
+ line-height: 1.25;
+ display: flex;
+ align-items: center;
+ gap: var(--space-sm);
+ flex-wrap: wrap;
}
-.dashboard-page__cards {
+.dashboard-welcome__env-badge {
+ font-size: 0.7rem;
+ font-weight: 600;
+ letter-spacing: 0.4px;
+ text-transform: uppercase;
+ padding: 2px 10px;
+ border-radius: var(--radius-sm);
+ align-self: center;
+}
+
+.dashboard-welcome__env-badge--production {
+ background: color-mix(in srgb, #fff 25%, transparent);
+ color: #fff;
+}
+
+.dashboard-welcome__env-badge--development {
+ background: color-mix(in srgb, #fff 90%, transparent);
+ color: var(--warning-color);
+}
+
+.dashboard-welcome__facts {
display: grid;
- grid-template-columns: repeat(4, 1fr);
- gap: 16px;
+ grid-template-columns: repeat(4, minmax(120px, 1fr));
+ gap: var(--space-lg);
}
-.dashboard-page__section {
- display: block;
- padding: 18px;
- border: 1px solid var(--border-color, #d3dad9);
- border-radius: var(--radius-md, 12px);
- background: var(--bg-primary, #fff);
+.dashboard-welcome__facts app-dashboard-metric {
+ --text-primary: #fff;
+ --text-light: rgba(255, 255, 255, 0.75);
}
-.dashboard-page__row {
+/* ---------- Shortcut / quick-action grids ---------- */
+
+.dashboard-shortcut-grid {
display: grid;
- grid-template-columns: 1.4fr 1fr;
- gap: 16px;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: var(--space-md);
}
-@media (max-width: 1100px) {
- .dashboard-page__cards { grid-template-columns: repeat(3, 1fr); }
+.dashboard-shortcut-grid--compact {
+ grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
}
-@media (max-width: 900px) {
- .dashboard-page__row { grid-template-columns: 1fr; }
+/* ---------- Draft status ---------- */
+
+.dashboard-draft__lead {
+ margin: 0;
+ font-size: 1rem;
+ color: var(--text-primary);
}
-@media (max-width: 720px) {
- .dashboard-page__cards { grid-template-columns: repeat(2, 1fr); }
+.dashboard-draft__all-clear {
+ display: flex;
+ align-items: center;
+ gap: var(--space-xs);
+ margin: 0;
+ font-size: 1rem;
+ color: var(--success-color);
+ font-weight: 600;
}
-@media (max-width: 480px) {
- .dashboard-page { padding: 12px; gap: 16px; }
- .dashboard-page__cards { grid-template-columns: 1fr; }
+.dashboard-draft__fields {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--space-xs);
+}
+
+.dashboard-draft__field-chip {
+ font-size: 0.75rem;
+ padding: 2px 8px;
+ border-radius: var(--radius-lg);
+ background: color-mix(in srgb, var(--primary-color) 8%, transparent);
+ color: var(--primary-color);
+}
+
+.dashboard-draft__field-chip--muted {
+ background: var(--bg-tertiary);
+ color: var(--text-light);
+}
+
+.dashboard-draft__saved-at {
+ margin: 0;
+ font-size: 0.75rem;
+ color: var(--text-secondary);
+}
+
+.dashboard-draft__actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--space-sm);
+ margin-top: var(--space-xs);
+}
+
+/* ---------- Documentation ---------- */
+
+.dashboard-doc-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 2px;
+}
+
+.dashboard-doc-list__item {
+ display: flex;
+ align-items: center;
+ gap: var(--space-sm);
+ width: 100%;
+ padding: var(--space-xs) 0;
+ border: none;
+ background: none;
+ font-size: 1rem;
+ color: var(--text-light);
+ text-align: left;
+ cursor: not-allowed;
+
+ .pi {
+ color: var(--text-light);
+ }
+}
+
+.dashboard-doc-list__badge {
+ margin-left: auto;
+ font-size: 0.7rem;
+ font-weight: 600;
+ padding: 2px 8px;
+ border-radius: var(--radius-lg);
+ background: var(--bg-tertiary);
+ color: var(--text-light);
+}
+
+/* ---------- Responsive ---------- */
+
+/* Tablet: the three-across health/draft/activity/doc row becomes 2 columns instead of 3. */
+@media (max-width: 1023px) and (min-width: 640px) {
+ .dashboard-page__grid > app-dashboard-card {
+ grid-column: span 6 !important;
+ }
+
+ .dashboard-welcome__facts {
+ grid-template-columns: repeat(2, minmax(120px, 1fr));
+ }
+}
+
+/* Mobile: everything is a single column, nothing scrolls sideways. */
+@media (max-width: 639px) {
+ .dashboard-page__grid > * {
+ grid-column: span 12 !important;
+ }
+
+ .dashboard-welcome {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+
+ .dashboard-welcome__facts {
+ grid-template-columns: 1fr;
+ }
+
+ .dashboard-shortcut-grid,
+ .dashboard-shortcut-grid--compact {
+ grid-template-columns: 1fr;
+ }
}
diff --git a/src/app/features/admin/dashboard/pages/admin-dashboard-page.component.ts b/src/app/features/admin/dashboard/pages/admin-dashboard-page.component.ts
index b941293..1b920cd 100644
--- a/src/app/features/admin/dashboard/pages/admin-dashboard-page.component.ts
+++ b/src/app/features/admin/dashboard/pages/admin-dashboard-page.component.ts
@@ -1,33 +1,56 @@
import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';
-import { CommonModule } from '@angular/common';
-import { TranslateService } from '../../../../i18n/translate.service';
+import { RouterLink } from '@angular/router';
import { TranslatePipe } from '../../../../i18n/translate.pipe';
+import { TranslateService } from '../../../../i18n/translate.service';
import { LanguageService } from '../../../../services/language.service';
import { AdminDashboardFacade } from '../facade/admin-dashboard.facade';
-import { AdminDashboardCardComponent } from '../components/admin-dashboard-card.component';
-import { AdminDashboardQuickActionsComponent } from '../components/admin-dashboard-quick-actions.component';
-import { AdminDashboardActivityComponent, AdminDashboardActivityViewEntry } from '../components/admin-dashboard-activity.component';
-import { AdminDashboardHealthComponent } from '../components/admin-dashboard-health.component';
-import { AdminDashboardCardStatus, AdminDashboardQuickAction } from '../models/admin-dashboard.model';
+import { DashboardSectionComponent } from '../components/dashboard-section.component';
+import { DashboardCardComponent } from '../components/dashboard-card.component';
+import { DashboardMetricComponent } from '../components/dashboard-metric.component';
+import { DashboardStatusRowComponent } from '../components/dashboard-status-row.component';
+import { DashboardShortcutCardComponent } from '../components/dashboard-shortcut-card.component';
+import { DashboardTimelineComponent, DashboardTimelineEntry, DashboardTimelineStatus } from '../components/dashboard-timeline.component';
+import { ButtonComponent } from '../../../../shared/ui/button/button.component';
+import { AdminDashboardQuickAction, AdminDashboardShortcut } from '../models/admin-dashboard.model';
-interface DashboardCardViewModel {
- id: string;
- titleKey: string;
- status: AdminDashboardCardStatus;
- value: string | null;
- subtitle: string | null;
+interface LinkedAction {
+ icon: string;
+ labelKey: string;
+ descriptionKey?: string;
+ route: string[];
+ comingSoon: boolean;
}
+const ACTIVITY_ICON: Record
= {
+ 'draft-saved': 'pi-save',
+ published: 'pi-upload',
+};
+
+const ACTIVITY_LABEL_KEY: Record = {
+ 'draft-saved': 'dashboard.activityDraftSaved',
+ published: 'dashboard.activityPublished',
+};
+
+const DOCUMENTATION_LINKS = [
+ { id: 'documentation', icon: 'pi-book', labelKey: 'dashboard.docDocumentation' },
+ { id: 'shortcuts', icon: 'pi-bolt', labelKey: 'dashboard.docKeyboardShortcuts' },
+ { id: 'report-issue', icon: 'pi-flag', labelKey: 'dashboard.docReportIssue' },
+ { id: 'release-notes', icon: 'pi-megaphone', labelKey: 'dashboard.docReleaseNotes' },
+];
+
@Component({
selector: 'app-admin-dashboard-page',
standalone: true,
imports: [
- CommonModule,
+ RouterLink,
TranslatePipe,
- AdminDashboardCardComponent,
- AdminDashboardQuickActionsComponent,
- AdminDashboardActivityComponent,
- AdminDashboardHealthComponent,
+ DashboardSectionComponent,
+ DashboardCardComponent,
+ DashboardMetricComponent,
+ DashboardStatusRowComponent,
+ DashboardShortcutCardComponent,
+ DashboardTimelineComponent,
+ ButtonComponent,
],
templateUrl: './admin-dashboard-page.component.html',
styleUrls: ['./admin-dashboard-page.component.scss'],
@@ -38,134 +61,60 @@ export class AdminDashboardPageComponent {
private readonly translate = inject(TranslateService);
private readonly languageService = inject(LanguageService);
- readonly quickActions = computed(() => {
- const lang = this.languageService.currentLanguage();
- return this.facade.quickActions.map(action => ({
- ...action,
- route: ['/', lang, ...action.route.filter(segment => segment !== '')],
- }));
- });
+ readonly documentationLinks = DOCUMENTATION_LINKS;
- readonly activityEntries = computed(() =>
- this.facade.activityEntries().map(entry => ({
- id: entry.id,
- labelKey: entry.type === 'published' ? 'dashboard.activityPublished' : 'dashboard.activityDraftSaved',
- timeText: new Date(entry.timestamp).toLocaleString(),
- })),
+ private toLinkedAction(action: AdminDashboardQuickAction | AdminDashboardShortcut): LinkedAction {
+ const lang = this.languageService.currentLanguage();
+ const comingSoon = 'comingSoon' in action ? !!action.comingSoon : action.route.length === 0;
+ return {
+ icon: action.icon,
+ labelKey: action.labelKey,
+ descriptionKey: 'descriptionKey' in action ? action.descriptionKey : undefined,
+ route: comingSoon ? [] : ['/', lang, ...action.route],
+ comingSoon,
+ };
+ }
+
+ readonly quickActions = computed(() =>
+ this.facade.quickActions.map(action => this.toLinkedAction(action)),
);
- readonly healthChecks = this.facade.healthChecks;
+ readonly shortcuts = computed(() =>
+ this.facade.shortcuts.map(action => this.toLinkedAction(action)),
+ );
- readonly cards = computed(() => {
- const bootstrap = this.facade.bootstrap();
- const bootstrapLoading: AdminDashboardCardStatus = bootstrap ? 'ready' : 'loading';
- const metrics = this.facade.metrics();
- const locales = bootstrap?.localization.supportedLocales ?? [];
+ readonly previewRoute = computed(() => ['/', this.languageService.currentLanguage()]);
- return [
- {
- id: 'marketplace-status',
- titleKey: 'dashboard.cardMarketplaceStatus',
- status: bootstrapLoading,
- value: bootstrap ? this.translate.t(this.facade.status() === 'published' ? 'builder.statusPublished' : 'builder.statusDraft') : null,
- subtitle: null,
- },
- {
- id: 'project-name',
- titleKey: 'dashboard.cardProjectName',
- status: bootstrapLoading,
- value: bootstrap?.tenant.name ?? null,
- subtitle: null,
- },
- {
- id: 'current-theme',
- titleKey: 'dashboard.cardCurrentTheme',
- status: bootstrapLoading,
- value: bootstrap?.theme.themeId ?? null,
- subtitle: null,
- },
- {
- id: 'languages',
- titleKey: 'dashboard.cardLanguages',
- status: bootstrapLoading === 'loading' ? 'loading' : (locales.length === 0 ? 'empty' : 'ready'),
- value: locales.length ? locales.join(', ').toUpperCase() : null,
- subtitle: null,
- },
- {
- id: 'categories-count',
- titleKey: 'dashboard.cardCategoriesCount',
- status: metrics.status,
- value: metrics.value ? String(metrics.value.categoriesCount) : null,
- subtitle: null,
- },
- {
- id: 'products-count',
- titleKey: 'dashboard.cardProductsCount',
- status: metrics.status,
- value: metrics.value ? String(metrics.value.productsCount) : null,
- subtitle: null,
- },
- {
- id: 'orders',
- titleKey: 'dashboard.cardOrders',
- status: 'pending-backend',
- value: null,
- subtitle: null,
- },
- {
- id: 'revenue',
- titleKey: 'dashboard.cardRevenue',
- status: 'pending-backend',
- value: null,
- subtitle: null,
- },
- {
- id: 'last-publish',
- titleKey: 'dashboard.cardLastPublish',
- status: bootstrapLoading,
- value: bootstrap ? this.formatTimestamp(this.facade.lastPublishedAt()) : null,
- subtitle: null,
- },
- {
- id: 'last-draft-save',
- titleKey: 'dashboard.cardLastDraftSave',
- status: bootstrapLoading,
- value: bootstrap ? this.formatTimestamp(this.facade.lastSavedAt()) : null,
- subtitle: null,
- },
- {
- id: 'bootstrap-version',
- titleKey: 'dashboard.cardBootstrapVersion',
- status: bootstrapLoading,
- value: bootstrap?.schemaVersion ?? null,
- subtitle: null,
- },
- {
- id: 'active-layout',
- titleKey: 'dashboard.cardActiveLayout',
- status: bootstrapLoading,
- value: bootstrap ? (bootstrap.layout?.type ?? 'default') : null,
- subtitle: null,
- },
- {
- id: 'enabled-widgets',
- titleKey: 'dashboard.cardEnabledWidgets',
- status: bootstrapLoading,
- value: bootstrap ? String(this.facade.enabledWidgetsCount()) : null,
- subtitle: null,
- },
- ];
- });
+ readonly tenantName = computed(() => this.facade.bootstrap()?.tenant.name ?? null);
+ readonly bootstrapLoading = computed(() => !this.facade.bootstrap());
+
+ readonly lastPublishedText = computed(() => this.formatTimestamp(this.facade.lastPublishedAt()));
+ readonly lastSavedText = computed(() => this.formatTimestamp(this.facade.lastSavedAt()));
+
+ readonly activityStatus = computed(() => (this.bootstrapLoading() ? 'loading' : 'ready'));
+
+ readonly activityTimelineEntries = computed(() =>
+ this.facade.activityEntries().map(entry => ({
+ id: entry.id,
+ labelKey: ACTIVITY_LABEL_KEY[entry.type] ?? entry.type,
+ timeText: new Date(entry.timestamp).toLocaleString(this.languageService.currentLanguage()),
+ icon: ACTIVITY_ICON[entry.type] ?? 'pi-circle',
+ })),
+ );
constructor() {
this.facade.ensureLoaded();
}
- cardTitle(titleKey: string): string {
- return this.translate.t(titleKey);
+ private formatTimestamp(timestamp: number | null): string | null {
+ return timestamp ? new Date(timestamp).toLocaleString(this.languageService.currentLanguage()) : null;
}
- private formatTimestamp(timestamp: number | null): string {
- return timestamp ? new Date(timestamp).toLocaleString() : this.translate.t('dashboard.never');
+ publishDraft(): void {
+ this.facade.publishDraft();
+ }
+
+ discardDraft(): void {
+ this.facade.discardDraft();
}
}
diff --git a/src/app/i18n/en.ts b/src/app/i18n/en.ts
index dbc4701..3e3e42f 100644
--- a/src/app/i18n/en.ts
+++ b/src/app/i18n/en.ts
@@ -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',
diff --git a/src/app/i18n/hy.ts b/src/app/i18n/hy.ts
index adf0fe0..5741517 100644
--- a/src/app/i18n/hy.ts
+++ b/src/app/i18n/hy.ts
@@ -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: 'Էջը չի գտնվել',
diff --git a/src/app/i18n/ru.ts b/src/app/i18n/ru.ts
index 31239c2..8fe0b14 100644
--- a/src/app/i18n/ru.ts
+++ b/src/app/i18n/ru.ts
@@ -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: 'Страница не найдена',
diff --git a/src/app/i18n/translations.ts b/src/app/i18n/translations.ts
index c851308..c074ec8 100644
--- a/src/app/i18n/translations.ts
+++ b/src/app/i18n/translations.ts
@@ -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;