4 Commits
Author SHA1 Message Date
zemion ede16c5439 Release v0.1.18
Module Package Release / publish-packages (push) Successful in 12s
2026-08-05 21:07:44 +02:00
zemion d80e4db3ec Release v0.1.17
Module Package Release / publish-packages (push) Successful in 12s
2026-08-05 20:33:58 +02:00
zemion 77924e7a2c Release v0.1.16
Module Package Release / publish-packages (push) Successful in 11s
2026-08-05 19:52:00 +02:00
zemion 61333c08e9 fix: clarify active interface module count 2026-08-05 00:03:31 +02:00
10 changed files with 28 additions and 20 deletions
+6
View File
@@ -15,6 +15,12 @@ active View. Configure mode supports adding, removing, ordering, sizing, and
widget-specific settings. Existing browser-only layouts are used as a migration widget-specific settings. Existing browser-only layouts are used as a migration
fallback until the first server save. 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: Widget providers can declare supported sizes and a small configuration schema:
```ts ```ts
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@govoplan/dashboard-webui", "name": "@govoplan/dashboard-webui",
"version": "0.1.15", "version": "0.1.18",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "webui/src/index.ts", "main": "webui/src/index.ts",
@@ -18,7 +18,7 @@
"README.md" "README.md"
], ],
"peerDependencies": { "peerDependencies": {
"@govoplan/core-webui": "^0.1.15", "@govoplan/core-webui": "^0.1.18",
"lucide-react": "^1.23.0", "lucide-react": "^1.23.0",
"react": ">=19.2.7 <20", "react": ">=19.2.7 <20",
"react-dom": ">=19.2.7 <20", "react-dom": ">=19.2.7 <20",
+3 -3
View File
@@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "govoplan-dashboard" name = "govoplan-dashboard"
version = "0.1.15" version = "0.1.18"
description = "GovOPlaN configurable dashboard module." description = "GovOPlaN configurable dashboard module."
readme = "README.md" readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"
authors = [{ name = "GovOPlaN" }] authors = [{ name = "GovOPlaN" }]
dependencies = [ dependencies = [
"govoplan-core>=0.1.15", "govoplan-core>=0.1.18",
"govoplan-access>=0.1.15", "govoplan-access>=0.1.18",
] ]
[tool.setuptools.packages.find] [tool.setuptools.packages.find]
+1 -1
View File
@@ -2,4 +2,4 @@
__all__ = ["__version__"] __all__ = ["__version__"]
__version__ = "0.1.15" __version__ = "0.1.18"
+5 -3
View File
@@ -40,7 +40,7 @@ def _tenant_summary(session, tenant_id: str) -> dict[str, int]:
manifest = ModuleManifest( manifest = ModuleManifest(
id="dashboard", id="dashboard",
name="Dashboard", name="Dashboard",
version="0.1.15", version="0.1.18",
required_capabilities=(CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR), required_capabilities=(CAPABILITY_AUTH_PRINCIPAL_RESOLVER, CAPABILITY_AUTH_PERMISSION_EVALUATOR),
optional_dependencies=("ops", "campaigns", "files", "mail", "tasks", "notifications", "reporting"), optional_dependencies=("ops", "campaigns", "files", "mail", "tasks", "notifications", "reporting"),
route_factory=_dashboard_router, route_factory=_dashboard_router,
@@ -115,7 +115,7 @@ manifest = ModuleManifest(
id="dashboard.widget.installed-modules", id="dashboard.widget.installed-modules",
module_id="dashboard", module_id="dashboard",
kind="section", kind="section",
label="Installed modules widget", label="Active interface modules widget",
parent_id="dashboard.grid", parent_id="dashboard.grid",
order=10, order=10,
), ),
@@ -129,7 +129,9 @@ manifest = ModuleManifest(
body=( body=(
"Core only provides a minimal fallback home when the dashboard module is absent. " "Core only provides a minimal fallback home when the dashboard module is absent. "
"Dashboard widgets must be contributed through core contracts, not by importing sibling module components directly. " "Dashboard widgets must be contributed through core contracts, not by importing sibling module components directly. "
"Personal layouts are stored per tenant, account, and active View." "Personal layouts are stored per tenant, account, and active View. The active interface-module count includes only "
"tenant-enabled modules whose WebUI loaded in the current browser session. It intentionally differs from the "
"Administration package catalogue, which includes discovered backend-only and headless module manifests."
), ),
layer="configured", layer="configured",
documentation_types=("admin", "user"), documentation_types=("admin", "user"),
+2 -2
View File
@@ -1,6 +1,6 @@
{ {
"name": "@govoplan/dashboard-webui", "name": "@govoplan/dashboard-webui",
"version": "0.1.15", "version": "0.1.18",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "src/index.ts", "main": "src/index.ts",
@@ -17,7 +17,7 @@
"test:dashboard-layout": "node --experimental-strip-types tests/dashboard-layout.test.ts" "test:dashboard-layout": "node --experimental-strip-types tests/dashboard-layout.test.ts"
}, },
"peerDependencies": { "peerDependencies": {
"@govoplan/core-webui": "^0.1.15", "@govoplan/core-webui": "^0.1.18",
"lucide-react": "^1.23.0", "lucide-react": "^1.23.0",
"react": ">=19.2.7 <20", "react": ">=19.2.7 <20",
"react-dom": ">=19.2.7 <20", "react-dom": ">=19.2.7 <20",
@@ -505,7 +505,7 @@ export default function DashboardPage({
<div className="metric-grid dashboard-summary-grid"> <div className="metric-grid dashboard-summary-grid">
<MetricCard <MetricCard
label="Installed modules" label="Active interface modules"
value={modules.length} value={modules.length}
tone="info" tone="info"
detail={moduleLabels(modules)} detail={moduleLabels(modules)}
@@ -11,7 +11,7 @@ export default function InstalledModulesWidget({
modules: PlatformWebModule[]; modules: PlatformWebModule[];
configuration: DashboardWidgetConfiguration; configuration: DashboardWidgetConfiguration;
}) { }) {
if (!modules.length) return <p className="muted">No WebUI modules are active.</p>; if (!modules.length) return <p className="muted">No interface modules are active.</p>;
const maxItems = clampNumber(configuration.maxItems, 1, 50, 8); const maxItems = clampNumber(configuration.maxItems, 1, 50, 8);
const showVersions = configuration.showVersions !== false; const showVersions = configuration.showVersions !== false;
const sortBy = configuration.sortBy === "label" ? "label" : "module"; const sortBy = configuration.sortBy === "label" ? "label" : "module";
@@ -37,7 +37,7 @@ export default function InstalledModulesWidget({
</div> </div>
)} )}
</dl> </dl>
{remaining > 0 && <p className="muted dashboard-widget-overflow">+{remaining} more active modules</p>} {remaining > 0 && <p className="muted dashboard-widget-overflow">+{remaining} more active interface modules</p>}
</>); </>);
} }
+4 -4
View File
@@ -6,7 +6,7 @@ const en = {
"i18n:govoplan-dashboard.library": "Widget library", "i18n:govoplan-dashboard.library": "Widget library",
"i18n:govoplan-dashboard.grid": "Dashboard grid", "i18n:govoplan-dashboard.grid": "Dashboard grid",
"i18n:govoplan-dashboard.widget_settings": "Widget settings", "i18n:govoplan-dashboard.widget_settings": "Widget settings",
"i18n:govoplan-dashboard.installed_modules_widget": "Installed modules widget", "i18n:govoplan-dashboard.installed_modules_widget": "Active interface modules widget",
"i18n:govoplan-dashboard.loading_reason": "The saved Dashboard layout is still loading.", "i18n:govoplan-dashboard.loading_reason": "The saved Dashboard layout is still loading.",
"i18n:govoplan-dashboard.saving_reason": "The Dashboard layout is still being saved.", "i18n:govoplan-dashboard.saving_reason": "The Dashboard layout is still being saved.",
"i18n:govoplan-dashboard.no_changes_reason": "There are no unsaved Dashboard changes.", "i18n:govoplan-dashboard.no_changes_reason": "There are no unsaved Dashboard changes.",
@@ -21,7 +21,7 @@ const en = {
"Cancel": "Cancel", "Cancel": "Cancel",
"Save layout": "Save layout", "Save layout": "Save layout",
"Saving...": "Saving...", "Saving...": "Saving...",
"Installed modules": "Installed modules", "Active interface modules": "Active interface modules",
"Available widgets": "Available widgets", "Available widgets": "Available widgets",
"On dashboard": "On dashboard", "On dashboard": "On dashboard",
"Layout": "Layout", "Layout": "Layout",
@@ -41,7 +41,7 @@ const de: Record<keyof typeof en, string> = {
"i18n:govoplan-dashboard.library": "Widget-Bibliothek", "i18n:govoplan-dashboard.library": "Widget-Bibliothek",
"i18n:govoplan-dashboard.grid": "Übersichtsraster", "i18n:govoplan-dashboard.grid": "Übersichtsraster",
"i18n:govoplan-dashboard.widget_settings": "Widget-Einstellungen", "i18n:govoplan-dashboard.widget_settings": "Widget-Einstellungen",
"i18n:govoplan-dashboard.installed_modules_widget": "Widget für installierte Module", "i18n:govoplan-dashboard.installed_modules_widget": "Widget für aktive Oberflächenmodule",
"i18n:govoplan-dashboard.loading_reason": "Die gespeicherte Übersichtsanordnung wird noch geladen.", "i18n:govoplan-dashboard.loading_reason": "Die gespeicherte Übersichtsanordnung wird noch geladen.",
"i18n:govoplan-dashboard.saving_reason": "Die Übersichtsanordnung wird noch gespeichert.", "i18n:govoplan-dashboard.saving_reason": "Die Übersichtsanordnung wird noch gespeichert.",
"i18n:govoplan-dashboard.no_changes_reason": "Es gibt keine ungespeicherten Änderungen an der Übersicht.", "i18n:govoplan-dashboard.no_changes_reason": "Es gibt keine ungespeicherten Änderungen an der Übersicht.",
@@ -56,7 +56,7 @@ const de: Record<keyof typeof en, string> = {
"Cancel": "Abbrechen", "Cancel": "Abbrechen",
"Save layout": "Anordnung speichern", "Save layout": "Anordnung speichern",
"Saving...": "Speichert...", "Saving...": "Speichert...",
"Installed modules": "Installierte Module", "Active interface modules": "Aktive Oberflächenmodule",
"Available widgets": "Verfügbare Widgets", "Available widgets": "Verfügbare Widgets",
"On dashboard": "Auf der Übersicht", "On dashboard": "Auf der Übersicht",
"Layout": "Anordnung", "Layout": "Anordnung",
+2 -2
View File
@@ -11,8 +11,8 @@ const dashboardWidgets: DashboardWidgetsUiCapability = {
{ {
id: "dashboard.installed-modules", id: "dashboard.installed-modules",
surfaceId: "dashboard.widget.installed-modules", surfaceId: "dashboard.widget.installed-modules",
title: "Installed modules", title: "Active interface modules",
description: "Enabled WebUI modules in this browser session.", description: "Tenant-enabled modules with a loaded WebUI in this browser session.",
moduleId: "dashboard", moduleId: "dashboard",
category: "Platform", category: "Platform",
order: 10, order: 10,