+
{($t.dashboard?.showing)
- .replace("{start}", String((currentPage - 1) * pageSize + 1))
- .replace("{end}", String(Math.min(currentPage * pageSize, total)))
- .replace("{total}", String(total))}
+ .replace("{start}", String((m.currentPage - 1) * m.pageSize + 1))
+ .replace("{end}", String(Math.min(m.currentPage * m.pageSize, m.total)))
+ .replace("{total}", String(m.total))}
- {#each getPaginationRange(currentPage, totalPages) as pageNum}
+ {#each getPaginationRange(m.currentPage, m.totalPages) as pageNum}
{#if pageNum === "..."}
- ...
+ ...
{:else}
{/if}
{/each}
- {#if selectedIds.size > 0}
+ {#if m.selectedIds.size > 0}
diff --git a/frontend/src/routes/dashboards/[id]/components/DashboardGitManager.svelte b/frontend/src/routes/dashboards/[id]/components/DashboardGitManager.svelte
index 6d5d68e9..5f34d676 100644
--- a/frontend/src/routes/dashboards/[id]/components/DashboardGitManager.svelte
+++ b/frontend/src/routes/dashboards/[id]/components/DashboardGitManager.svelte
@@ -8,7 +8,7 @@
* @PURPOSE: Git Repository block (status, ahead/behind, changes count, push/pull/sync buttons, and diff preview).
* @LAYER UI
*/
- import { t } from "$lib/i18n";
+ import { t } from "$lib/i18n/index.svelte.js";
let {
isGitStatusLoading,
diff --git a/frontend/src/routes/dashboards/[id]/components/DashboardHeader.svelte b/frontend/src/routes/dashboards/[id]/components/DashboardHeader.svelte
index 31147b32..47baa7cd 100644
--- a/frontend/src/routes/dashboards/[id]/components/DashboardHeader.svelte
+++ b/frontend/src/routes/dashboards/[id]/components/DashboardHeader.svelte
@@ -5,7 +5,7 @@
-
-
+
+
+
-
{$t.health?.title}
-
{$t.health?.subtitle}
+
{$t.health?.title || 'Dashboard Health Center'}
+
{$t.health?.subtitle || 'Monitor the latest validation status across your environments.'}
-
-
-
-
-
-
-
+
-
+
+
-
-
-
{$t.health?.validation_details}
+
+
+
+
+ {$t.health?.validation_details || 'Dashboards'}
+ {#if activeStatusFilter}
+ · filtered by {activeStatusFilter}
+ {/if}
+
+ {filteredItems.length} {filteredItems.length === 1 ? 'dashboard' : 'dashboards'}
-
-
-
-
- | {$t.health?.table_dashboard} |
- {$t.health?.table_environment} |
- {$t.health?.table_status} |
- {$t.health?.table_last_check} |
- {$t.health?.table_summary} |
-
- {$t.common?.actions}
- |
-
-
-
- {#if loading}
- {#each Array(3) as _, i (i)}
-
- |
- |
- |
- |
- |
- |
-
- {/each}
- {:else if healthData.items.length === 0}
-
- |
- {$t.health?.no_records}
- |
-
- {:else}
- {#each healthData.items as item (item.record_id || item.dashboard_id)}
-
-
-
+
+ {#if loading}
+
+ {#each Array(4) as _, i (i)}
+
+ {/each}
+
+ {:else if filteredItems.length === 0}
+
+
+ {$t.health?.no_records || 'No validation records found'}
+ {#if activeStatusFilter}
+
+ {/if}
+
+ {:else}
+
+ {#each filteredItems as item (item.record_id || item.dashboard_id)}
+ |
-
- {item.environment_id}
- |
-
-
- {item.status}
-
- |
-
- {formatDistanceToNow(new Date(item.last_check), { addSuffix: true })}
- |
-
- {item.summary || '-'}
- |
-
- {#if item.task_id}
-
- {$t.health?.view_report}
- {/if}
-
- |
-
- {/each}
- {/if}
-
-
-
+
+ {$t.health?.view_history || 'History'}
+
+
{item.environment_id}
+
+
+
+ {item.status}
+
+
+
+
+
+ {#if item.execution_path === 'screenshot'}
+ 📷 Screenshot
+ {:else if item.execution_path === 'text_only'}
+ 📝 Text
+ {:else}
+ —
+ {/if}
+ ·
+ {#if item.issues_count != null}
+
+ {item.issues_count} issue{item.issues_count !== 1 ? 's' : ''}
+
+ {:else}
+ —
+ {/if}
+ {#if item.chunk_count != null}
+ ·
+ {item.chunk_count} chunk{item.chunk_count > 1 ? 's' : ''}
+ {/if}
+ ·
+ {formatRelativeDate(item.last_check)}
+
+
+
+ {#if item.summary}
+
{item.summary}
+ {/if}
+
+
+
+
+ {/each}
+
+ {/if}
diff --git a/frontend/src/routes/dashboards/health/__tests__/health_page.integration.test.ts b/frontend/src/routes/dashboards/health/__tests__/health_page.integration.test.ts
index 1754e8a4..f7ce3cb3 100644
--- a/frontend/src/routes/dashboards/health/__tests__/health_page.integration.test.ts
+++ b/frontend/src/routes/dashboards/health/__tests__/health_page.integration.test.ts
@@ -17,7 +17,7 @@ describe('Dashboard health page contract', () => {
it('renders slug-first dashboard link bound to environment route context', () => {
const source = fs.readFileSync(PAGE_PATH, 'utf-8');
- expect(source).toContain("{$t.health?.table_dashboard}");
+ expect(source).toContain("{$t.health?.validation_details || 'Dashboards'}");
expect(source).toContain("item.dashboard_slug || item.dashboard_id");
expect(source).toContain("href={`/dashboards/${encodeURIComponent(String(item.dashboard_slug || item.dashboard_id))}?env_id=${encodeURIComponent(item.environment_id)}`}");
});
@@ -25,16 +25,16 @@ describe('Dashboard health page contract', () => {
it('keeps explicit delete report flow with confirm and DELETE request', () => {
const source = fs.readFileSync(PAGE_PATH, 'utf-8');
- expect(source).toContain('async function handleDeleteReport(item)');
+ expect(source).toContain('async function handleDeleteReport(item: HealthItem)');
expect(source).toContain("requestApi(`/health/summary/${item.record_id}`, 'DELETE')");
- expect(source).toContain("$t.health?.delete_confirm.replace('{slug}', item.dashboard_slug || item.dashboard_id)");
+ expect(source).toContain(".replace('{slug}', slug)");
expect(source).toContain("$t.common?.delete");
});
it('reuses global health store refresh for all-environment summary loads', () => {
const source = fs.readFileSync(PAGE_PATH, 'utf-8');
- expect(source).toContain("import { healthStore } from '$lib/stores/health.js';");
+ expect(source).toContain("import { healthStore } from '$lib/stores/health.svelte.js';");
expect(source).toContain('? getHealthSummary(selectedEnvId)');
expect(source).toContain(': healthStore.refresh();');
});
diff --git a/frontend/src/routes/datasets/+page.svelte b/frontend/src/routes/datasets/+page.svelte
index 3c95b521..70b28b27 100644
--- a/frontend/src/routes/datasets/+page.svelte
+++ b/frontend/src/routes/datasets/+page.svelte
@@ -2,8 +2,7 @@
diff --git a/frontend/src/routes/datasets/review/ReviewWorkspaceLeftSidebar.svelte b/frontend/src/routes/datasets/review/ReviewWorkspaceLeftSidebar.svelte
index 6c269200..7e45ae7f 100644
--- a/frontend/src/routes/datasets/review/ReviewWorkspaceLeftSidebar.svelte
+++ b/frontend/src/routes/datasets/review/ReviewWorkspaceLeftSidebar.svelte
@@ -2,7 +2,7 @@
diff --git a/frontend/src/routes/settings/MigrationMappingsTable.svelte b/frontend/src/routes/settings/MigrationMappingsTable.svelte
index 498f6c73..25d9f9f7 100644
--- a/frontend/src/routes/settings/MigrationMappingsTable.svelte
+++ b/frontend/src/routes/settings/MigrationMappingsTable.svelte
@@ -10,7 +10,7 @@
diff --git a/frontend/src/routes/settings/SystemSettings.svelte b/frontend/src/routes/settings/SystemSettings.svelte
index dbc2c1e7..761f5ff8 100644
--- a/frontend/src/routes/settings/SystemSettings.svelte
+++ b/frontend/src/routes/settings/SystemSettings.svelte
@@ -3,7 +3,7 @@
diff --git a/frontend/src/routes/tools/mapper/+page.svelte b/frontend/src/routes/tools/mapper/+page.svelte
index 6373a74a..c1c8bba6 100644
--- a/frontend/src/routes/tools/mapper/+page.svelte
+++ b/frontend/src/routes/tools/mapper/+page.svelte
@@ -18,7 +18,7 @@
import MapperTool from '../../../components/tools/MapperTool.svelte';
import TaskRunner from '../../../components/TaskRunner.svelte';
import { PageHeader } from '$lib/ui';
- import { t } from '$lib/i18n';
+ import { t } from '$lib/i18n/index.svelte.js';
diff --git a/frontend/src/routes/tools/storage/+page.svelte b/frontend/src/routes/tools/storage/+page.svelte
index c918a39f..8bbb8d74 100644
--- a/frontend/src/routes/tools/storage/+page.svelte
+++ b/frontend/src/routes/tools/storage/+page.svelte
@@ -19,8 +19,8 @@
import { onMount } from 'svelte';
import { page } from '$app/state';
import { listFiles, deleteFile } from '../../../services/storageService';
- import { addToast } from '../../../lib/toasts';
- import { t } from '../../../lib/i18n';
+ import { addToast } from '$lib/toasts.svelte.js';
+ import { t } from '$lib/i18n/index.svelte.js';
import FileList from '../../../components/storage/FileList.svelte';
import FileUpload from '../../../components/storage/FileUpload.svelte';
// [/SECTION: IMPORTS]
diff --git a/frontend/src/routes/translate/+page.svelte b/frontend/src/routes/translate/+page.svelte
index c244ba56..30d0e518 100644
--- a/frontend/src/routes/translate/+page.svelte
+++ b/frontend/src/routes/translate/+page.svelte
@@ -2,8 +2,8 @@