44 lines
1.7 KiB
Markdown
44 lines
1.7 KiB
Markdown
# GovOPlaN Dashboard
|
|
|
|
<!-- govoplan-repository-type:start -->
|
|
**Repository type:** module (platform).
|
|
<!-- govoplan-repository-type:end -->
|
|
|
|
Configurable dashboard module for GovOPlaN.
|
|
|
|
The module owns the `/dashboard` route when installed. Core keeps only a minimal
|
|
fallback home for installations where this module is absent.
|
|
|
|
Modules contribute widgets through the `dashboard.widgets` WebUI capability.
|
|
Personal widget layouts are stored by the backend for each tenant, account, and
|
|
active View. Configure mode supports adding, removing, ordering, sizing, and
|
|
widget-specific settings. Existing browser-only layouts are used as a migration
|
|
fallback until the first server save.
|
|
|
|
The Dashboard's **Active interface modules** metric and widget count only
|
|
tenant-enabled modules whose WebUI is loaded in the current browser session.
|
|
The Administration module catalogue has a different operator-facing scope: it
|
|
also includes discovered backend-only and headless module manifests. The two
|
|
figures therefore need not match.
|
|
|
|
Widget providers can declare supported sizes and a small configuration schema:
|
|
|
|
```ts
|
|
{
|
|
id: "example.summary",
|
|
surfaceId: "example.dashboard.summary",
|
|
title: "Example summary",
|
|
supportedSizes: ["small", "medium", "wide"],
|
|
defaultConfiguration: { limit: 10, showDetails: true },
|
|
configurationFields: [
|
|
{ id: "limit", label: "Rows", kind: "number", min: 1, max: 50 },
|
|
{ id: "showDetails", label: "Show details", kind: "boolean" }
|
|
],
|
|
render: ({ configuration }) => <ExampleWidget configuration={configuration} />
|
|
}
|
|
```
|
|
|
|
Every widget needs a matching View surface. The Dashboard catalogue filters
|
|
contributions through the effective View before rendering them, while saved
|
|
placements remain intact when a View or module temporarily hides a widget.
|