From 64032b1ed1fe5f10f70e3cc88a257c514dbc5735 Mon Sep 17 00:00:00 2001 From: Albrecht Degering Date: Tue, 28 Jul 2026 21:04:54 +0200 Subject: [PATCH] Filter dashboard widgets by View --- src/govoplan_dashboard/backend/manifest.py | 10 ++++++++++ webui/src/features/dashboard/DashboardPage.tsx | 10 +++++++++- webui/src/module.ts | 11 ++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/govoplan_dashboard/backend/manifest.py b/src/govoplan_dashboard/backend/manifest.py index 1914f76..4e3e41d 100644 --- a/src/govoplan_dashboard/backend/manifest.py +++ b/src/govoplan_dashboard/backend/manifest.py @@ -2,6 +2,7 @@ from __future__ import annotations from govoplan_core.core.access import CAPABILITY_AUTH_PERMISSION_EVALUATOR, CAPABILITY_AUTH_PRINCIPAL_RESOLVER from govoplan_core.core.modules import DocumentationTopic, FrontendModule, FrontendRoute, ModuleManifest, NavItem +from govoplan_core.core.views import ViewSurface manifest = ModuleManifest( @@ -16,6 +17,15 @@ manifest = ModuleManifest( package_name="@govoplan/dashboard-webui", routes=(FrontendRoute(path="/dashboard", component="DashboardPage", order=10),), nav_items=(NavItem(path="/dashboard", label="Dashboard", icon="dashboard", order=10),), + view_surfaces=( + ViewSurface( + id="dashboard.widget.installed-modules", + module_id="dashboard", + kind="section", + label="Installed modules widget", + order=10, + ), + ), ), documentation=( DocumentationTopic( diff --git a/webui/src/features/dashboard/DashboardPage.tsx b/webui/src/features/dashboard/DashboardPage.tsx index 72e10a9..cde256d 100644 --- a/webui/src/features/dashboard/DashboardPage.tsx +++ b/webui/src/features/dashboard/DashboardPage.tsx @@ -9,6 +9,7 @@ import { dashboardWidgetsForModules, hasAnyScope, hasScope, + useEffectiveView, usePlatformModules, type ApiSettings, type AuthInfo, @@ -23,7 +24,14 @@ type DashboardLayout = { export default function DashboardPage({ settings, auth }: { settings: ApiSettings; auth: AuthInfo }) { const modules = usePlatformModules(); - const widgets = useMemo(() => dashboardWidgetsForModules(modules).filter((widget) => canUseWidget(auth, widget)), [auth, modules]); + const effectiveView = useEffectiveView(); + const widgets = useMemo( + () => + dashboardWidgetsForModules(modules, effectiveView).filter((widget) => + canUseWidget(auth, widget) + ), + [auth, effectiveView, modules] + ); const widgetSignature = widgets.map((widget) => widget.id).join("|"); const storageKey = `govoplan.dashboard.layout:${auth.active_tenant?.id ?? auth.tenant.id}:${auth.user.id}`; const [layout, setLayout] = useState(() => defaultLayout(widgets)); diff --git a/webui/src/module.ts b/webui/src/module.ts index e236541..edac3e2 100644 --- a/webui/src/module.ts +++ b/webui/src/module.ts @@ -10,6 +10,7 @@ const dashboardWidgets: DashboardWidgetsUiCapability = { widgets: [ { id: "dashboard.installed-modules", + surfaceId: "dashboard.widget.installed-modules", title: "Installed modules", description: "Enabled WebUI modules in this browser session.", moduleId: "dashboard", @@ -33,6 +34,15 @@ export const dashboardModule: PlatformWebModule = { dependencies: ["access"], optionalDependencies: ["ops", "campaigns", "files", "mail", "tasks", "notifications", "reporting"], translations, + viewSurfaces: [ + { + id: "dashboard.widget.installed-modules", + moduleId: "dashboard", + kind: "section", + label: "Installed modules widget", + order: 10 + } + ], navItems: [{ to: "/dashboard", label: "i18n:govoplan-dashboard.dashboard.3f8b4df2", iconName: "dashboard", order: 10 }], routes: [ { path: "/dashboard", order: 10, render: ({ settings, auth }) => createElement(DashboardPage, { settings, auth }) } @@ -43,4 +53,3 @@ export const dashboardModule: PlatformWebModule = { }; export default dashboardModule; -