diff --git a/.gitignore b/.gitignore index a069fb5..fd6bff9 100755 --- a/.gitignore +++ b/.gitignore @@ -59,8 +59,9 @@ keyring passwords.py *github* *tech_spec* -dashboards -backend/mappings.db +/dashboards +dashboards_example/**/dashboards/ +backend/mappings.db backend/tasks.db diff --git a/frontend/src/routes/dashboards/+page.svelte b/frontend/src/routes/dashboards/+page.svelte new file mode 100644 index 0000000..348546d --- /dev/null +++ b/frontend/src/routes/dashboards/+page.svelte @@ -0,0 +1,1258 @@ + + + +
+ +
+

{$t.nav?.dashboard || "Dashboards"}

+
+ + +
+
+ + + {#if error} +
+ {error} + +
+ {/if} + + + {#if isLoading} +
+
+
+
+
+
+
+
+ {#each Array(5) as _} +
+
+
+
+
+
+
+ {/each} +
+ {:else if dashboards.length === 0} + +
+ + + +

{$t.dashboards?.empty || "No dashboards found"}

+
+ {:else} + +
+
+ + + {#if selectedIds.size > 0} + + {selectedIds.size} selected + + {/if} +
+
+ +
+
+ + +
+ +
+
+
{$t.dashboards?.title || "Title"}
+
{$t.dashboards?.git_status || "Git Status"}
+
{$t.dashboards?.last_task || "Last Task"}
+
{$t.dashboards?.actions || "Actions"}
+
+ + + {#each dashboards as dashboard} +
+ +
+ handleCheckboxChange(dashboard, e)} + /> +
+ + +
+ +
+ + +
+ {#if dashboard.gitStatus} + + {#if dashboard.gitStatus.toLowerCase() === "ok"} + ✓ {$t.dashboards?.status_synced || "Synced"} + {:else if dashboard.gitStatus.toLowerCase() === "diff"} + ! {$t.dashboards?.status_diff || "Diff"} + {/if} + + {:else} + - + {/if} +
+ + +
+ {#if dashboard.lastTask} +
handleTaskStatusClick(dashboard)} + on:keydown={(e) => + (e.key === "Enter" || e.key === " ") && + handleTaskStatusClick(dashboard)} + role="button" + tabindex="0" + aria-label={$t.dashboards?.view_task || "View task"} + > + {@html getTaskStatusIcon(dashboard.lastTask.status)} + + {#if dashboard.lastTask.status.toLowerCase() === "running"} + {$t.dashboards?.task_running || "Running..."} + {:else if dashboard.lastTask.status.toLowerCase() === "success"} + {$t.dashboards?.task_done || "Done"} + {:else if dashboard.lastTask.status.toLowerCase() === "error"} + {$t.dashboards?.task_failed || "Failed"} + {:else if dashboard.lastTask.status.toLowerCase() === "waiting_input"} + {$t.dashboards?.task_waiting || "Waiting"} + {/if} + +
+ {:else} + - + {/if} +
+ + +
+
+ + + +
+
+
+ {/each} +
+ + + {#if totalPages > 1} +
+
+ Showing {(currentPage - 1) * pageSize + 1}-{Math.min( + currentPage * pageSize, + total, + )} of {total} +
+
+ + + {#each getPaginationRange(currentPage, totalPages) as pageNum} + {#if pageNum === "..."} + ... + {:else} + + {/if} + {/each} + + +
+
+ +
+
+ {/if} + + + {#if selectedIds.size > 0} +
+
+
+ + ✓ {selectedIds.size} selected + +
+
+ + + +
+
+
+ {/if} + {/if} + + + {#if showMigrateModal} +
(showMigrateModal = false)} + on:keydown={(e) => e.key === "Escape" && (showMigrateModal = false)} + role="presentation" + > + +
+ {/if} + + + {#if showBackupModal} +
(showBackupModal = false)} + on:keydown={(e) => e.key === "Escape" && (showBackupModal = false)} + role="presentation" + > + +
+ {/if} +
+ + diff --git a/frontend/src/routes/dashboards/[id]/+page.svelte b/frontend/src/routes/dashboards/[id]/+page.svelte new file mode 100644 index 0000000..4a840fc --- /dev/null +++ b/frontend/src/routes/dashboards/[id]/+page.svelte @@ -0,0 +1,208 @@ + + + +
+
+
+ +

+ {dashboard?.title || "Dashboard Overview"} +

+

+ ID: {dashboardId}{#if dashboard?.slug} • {dashboard.slug}{/if} +

+
+ +
+ + {#if error} +
+ {error} + +
+ {/if} + + {#if isLoading} +
+ {#each Array(3) as _} +
+ {/each} +
+
+ {:else if dashboard} +
+
+

Last modified

+

{formatDate(dashboard.last_modified)}

+
+
+

Charts

+

{dashboard.chart_count || 0}

+
+
+

Datasets

+

{dashboard.dataset_count || 0}

+
+
+ + {#if dashboard.description} +
+

Overview

+

{dashboard.description}

+
+ {/if} + +
+
+

Charts

+
+ {#if dashboard.charts && dashboard.charts.length > 0} +
+ + + + + + + + + + + {#each dashboard.charts as chart} + + + + + + + {/each} + +
ChartDatasetOverviewLast modified
+
{chart.title}
+
ID: {chart.id}{#if chart.viz_type} • {chart.viz_type}{/if}
+
+ {#if chart.dataset_id} + + {:else} + - + {/if} + {chart.overview || "-"}{formatDate(chart.last_modified)}
+
+ {:else} +
No charts found for this dashboard.
+ {/if} +
+ +
+
+

Datasets

+
+ {#if dashboard.datasets && dashboard.datasets.length > 0} +
+ {#each dashboard.datasets as dataset} + + {/each} +
+ {:else} +
No datasets found for this dashboard.
+ {/if} +
+ {/if} +
+ +