Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
77924e7a2c | ||
|
|
61333c08e9 |
@@ -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
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@govoplan/dashboard-webui",
|
"name": "@govoplan/dashboard-webui",
|
||||||
"version": "0.1.15",
|
"version": "0.1.16",
|
||||||
"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.16",
|
||||||
"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
@@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "govoplan-dashboard"
|
name = "govoplan-dashboard"
|
||||||
version = "0.1.15"
|
version = "0.1.16"
|
||||||
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.16",
|
||||||
"govoplan-access>=0.1.15",
|
"govoplan-access>=0.1.16",
|
||||||
]
|
]
|
||||||
|
|
||||||
[tool.setuptools.packages.find]
|
[tool.setuptools.packages.find]
|
||||||
|
|||||||
@@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
__all__ = ["__version__"]
|
__all__ = ["__version__"]
|
||||||
|
|
||||||
__version__ = "0.1.15"
|
__version__ = "0.1.16"
|
||||||
|
|||||||
@@ -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.16",
|
||||||
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
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@govoplan/dashboard-webui",
|
"name": "@govoplan/dashboard-webui",
|
||||||
"version": "0.1.15",
|
"version": "0.1.16",
|
||||||
"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.16",
|
||||||
"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>}
|
||||||
</>);
|
</>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user