diff --git a/webui/src/features/dashboard/DashboardPage.tsx b/webui/src/features/dashboard/DashboardPage.tsx
index 30f1d70..72e10a9 100644
--- a/webui/src/features/dashboard/DashboardPage.tsx
+++ b/webui/src/features/dashboard/DashboardPage.tsx
@@ -1,6 +1,7 @@
import { useEffect, useMemo, useState } from "react";
import { RefreshCw, RotateCcw, SlidersHorizontal } from "lucide-react";
import {
+ AdminSelectionList,
Button,
Card,
MetricCard,
@@ -50,14 +51,9 @@ export default function DashboardPage({ settings, auth }: { settings: ApiSetting
writeLayout(storageKey, next);
}
- function setWidgetVisible(widgetId: string, visible: boolean) {
+ function setVisibleWidgets(selected: string[]) {
const allIds = widgets.map((widget) => widget.id);
- const nextVisible = new Set(visibleWidgetIds);
- if (visible) {
- nextVisible.add(widgetId);
- } else {
- nextVisible.delete(widgetId);
- }
+ const nextVisible = new Set(selected);
saveLayout({
known: allIds,
visible: allIds.filter((id) => nextVisible.has(id))
@@ -93,21 +89,11 @@ export default function DashboardPage({ settings, auth }: { settings: ApiSetting
title="Dashboard widgets"
actions={}>
{widgets.length === 0 ?
No installed module exposes dashboard widgets yet.
:
-
- {widgets.map((widget) =>
-
- )}
-
+ ({ id: widget.id, label: widget.title, description: widget.description ?? widget.id }))}
+ selected={visibleWidgetIds}
+ onChange={setVisibleWidgets}
+ />
}
}
@@ -183,4 +169,3 @@ function moduleLabels(modules: Array<{ id: string }>): string {
if (!modules.length) return "Core shell only";
return modules.slice(0, 4).map((module) => module.id).join(", ");
}
-
diff --git a/webui/src/styles/dashboard.css b/webui/src/styles/dashboard.css
index fe1d709..bee8c89 100644
--- a/webui/src/styles/dashboard.css
+++ b/webui/src/styles/dashboard.css
@@ -32,39 +32,6 @@
grid-column: 1 / -1;
}
-.dashboard-widget-picker {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
- gap: 12px;
-}
-
-.dashboard-widget-toggle {
- min-width: 0;
- display: grid;
- grid-template-columns: auto minmax(0, 1fr);
- gap: 10px;
- align-items: start;
- border: var(--border-line);
- border-radius: var(--radius-sm);
- background: var(--panel-soft);
- padding: 12px;
-}
-
-.dashboard-widget-toggle input {
- margin-top: 3px;
-}
-
-.dashboard-widget-toggle strong,
-.dashboard-widget-toggle small {
- display: block;
-}
-
-.dashboard-widget-toggle small {
- color: var(--muted);
- margin-top: 4px;
- line-height: 1.35;
-}
-
.dashboard-compact-list.detail-list div {
grid-template-columns: minmax(92px, auto) minmax(0, 1fr);
}
@@ -82,7 +49,6 @@
@media (max-width: 900px) {
.dashboard-widget-grid,
- .dashboard-widget-picker,
.dashboard-widget-metrics.metric-grid {
grid-template-columns: 1fr;
}
@@ -94,4 +60,3 @@
grid-column: 1;
}
}
-