2 Commits
Author SHA1 Message Date
zemion a3593dc5ee fix(ui): align contextual documentation with headings
Verified with the coordinated workspace changes by devkit full run
2026-09-08T225814-186389-0000-3e3ed7cd (all seven phases passed).
This shared UI pass does not mark the individual module reviews complete.
2026-09-09 02:04:05 +02:00
zemion 8253bd0dd6 refactor(reporting): reuse exact principal projection contract
Module Package Release / publish-packages (push) Successful in 15s
Release v0.1.22. Coordinated integrity review: GovOPlaN/govoplan-core#298.
2026-09-08 12:19:40 +02:00
11 changed files with 32 additions and 26 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@govoplan/reporting-webui", "name": "@govoplan/reporting-webui",
"version": "0.1.21", "version": "0.1.22",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "webui/src/index.ts", "main": "webui/src/index.ts",
+2 -2
View File
@@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "govoplan-reporting" name = "govoplan-reporting"
version = "0.1.21" version = "0.1.22"
description = "GovOPlaN governed reporting and semantic BI module." description = "GovOPlaN governed reporting and semantic BI module."
readme = "README.md" readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"
license = { text = "AGPL-3.0-or-later" } license = { text = "AGPL-3.0-or-later" }
authors = [{ name = "GovOPlaN" }] authors = [{ name = "GovOPlaN" }]
dependencies = [ dependencies = [
"govoplan-core>=0.1.45", "govoplan-core>=0.1.46",
"govoplan-access>=0.1.18", "govoplan-access>=0.1.18",
] ]
+1 -1
View File
@@ -1,3 +1,3 @@
"""GovOPlaN Reporting module.""" """GovOPlaN Reporting module."""
__version__ = "0.1.21" __version__ = "0.1.22"
+1 -16
View File
@@ -10,6 +10,7 @@ import uuid
from sqlalchemy import and_, exists, func, or_ from sqlalchemy import and_, exists, func, or_
from sqlalchemy.orm import Query, Session from sqlalchemy.orm import Query, Session
from govoplan_core.core.principal_helpers import principal_actor_ids as _actor_ids
from govoplan_core.core.events import ( from govoplan_core.core.events import (
EventActorRef, EventActorRef,
EventObjectRef, EventObjectRef,
@@ -884,22 +885,6 @@ def _actor(principal: object) -> str | None:
return None return None
def _actor_ids(principal: object) -> tuple[str, ...]:
user = getattr(principal, "user", None)
return tuple(
dict.fromkeys(
str(value)
for value in (
getattr(principal, "account_id", None),
getattr(principal, "identity_id", None),
getattr(principal, "membership_id", None),
getattr(user, "id", None),
)
if str(value or "").strip()
)
)
def _principal_tenant(principal: object) -> str: def _principal_tenant(principal: object) -> str:
tenant_id = str(getattr(principal, "tenant_id", "") or "").strip() tenant_id = str(getattr(principal, "tenant_id", "") or "").strip()
if not tenant_id: if not tenant_id:
+6 -1
View File
@@ -83,7 +83,7 @@ from govoplan_reporting.backend.search_source import create_reporting_search_sou
MODULE_ID = "reporting" MODULE_ID = "reporting"
MODULE_NAME = "Reporting" MODULE_NAME = "Reporting"
MODULE_VERSION = "0.1.21" MODULE_VERSION = "0.1.22"
def _permission(scope: str, label: str, description: str) -> PermissionDefinition: def _permission(scope: str, label: str, description: str) -> PermissionDefinition:
@@ -597,6 +597,8 @@ manifest = ModuleManifest(
title="Governed reporting and semantic BI", title="Governed reporting and semantic BI",
summary="Build reproducible reports over provider-owned datasets without bypassing module or row-level access.", summary="Build reproducible reports over provider-owned datasets without bypassing module or row-level access.",
body=( body=(
"Documentation books sit immediately beside the visible heading or contextual label for "
"Reporting, not among operational action buttons. Field help remains beside its label. "
"Reporting pins dataset, semantic-model, and report revisions. Runs retain " "Reporting pins dataset, semantic-model, and report revisions. Runs retain "
"definition hashes, source fingerprints, policy provenance, quality evidence, " "definition hashes, source fingerprints, policy provenance, quality evidence, "
"authorized result rows, diagnostics, and output hashes. Safe dimensions, " "authorized result rows, diagnostics, and output hashes. Safe dimensions, "
@@ -658,6 +660,9 @@ manifest = ModuleManifest(
"ohne Modul- oder Zeilenberechtigungen zu umgehen." "ohne Modul- oder Zeilenberechtigungen zu umgehen."
), ),
"body": ( "body": (
"Dokumentationsbücher stehen unmittelbar neben der sichtbaren Überschrift oder "
"Kontextbezeichnung für Berichtswesen, nicht zwischen ausführbaren Aktionsschaltflächen. "
"Feldhilfe bleibt neben der Feldbezeichnung. "
"Reporting fixiert Revisionen von Datensätzen, semantischen Modellen und " "Reporting fixiert Revisionen von Datensätzen, semantischen Modellen und "
"Berichten. Ausführungen bewahren Definitionsprüfsummen, Quellfingerabdrücke, " "Berichten. Ausführungen bewahren Definitionsprüfsummen, Quellfingerabdrücke, "
"Richtlinienherkunft, Qualitätsnachweise, berechtigte Ergebniszeilen, Diagnosen " "Richtlinienherkunft, Qualitätsnachweise, berechtigte Ergebniszeilen, Diagnosen "
+1 -1
View File
@@ -92,7 +92,7 @@ class _Provider:
del session del session
return ReportProviderResult( return ReportProviderResult(
report_id=request.report_id, report_id=request.report_id,
generated_at=datetime(2026, 8, 2, 10, 0, tzinfo=UTC), generated_at=datetime.now(UTC),
payload={"metric": 12}, payload={"metric": 12},
source_revisions=( source_revisions=(
{ {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@govoplan/reporting-webui", "name": "@govoplan/reporting-webui",
"version": "0.1.21", "version": "0.1.22",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "src/index.ts", "main": "src/index.ts",
@@ -275,7 +275,9 @@ export default function ReportingPage({ settings, auth }: PlatformRouteContext)
</FilterBar> </FilterBar>
<span className="reporting-count">{reports.length + providerReports.length} reports</span> <span className="reporting-count">{reports.length + providerReports.length} reports</span>
</>} </>}
helpAction={<DocumentationHelpLink title="Reporting"
titleLevel={1}
titleHelp={<DocumentationHelpLink
reference={{ topicId: "reporting.governed-bi", documentationType: "user" }} reference={{ topicId: "reporting.governed-bi", documentationType: "user" }}
label="Open reporting documentation" label="Open reporting documentation"
/>} />}
@@ -323,7 +325,7 @@ export default function ReportingPage({ settings, auth }: PlatformRouteContext)
<header className="reporting-result-header"> <header className="reporting-result-header">
<div className="reporting-title"> <div className="reporting-title">
<span>{selected.definition_key} · revision {selected.revision}</span> <span>{selected.definition_key} · revision {selected.revision}</span>
<h1>{selected.name}</h1> <h2>{selected.name}</h2>
</div> </div>
<div className="reporting-run-actions"> <div className="reporting-run-actions">
{canSchedule && {canSchedule &&
+12
View File
@@ -0,0 +1,12 @@
import type { PlatformTranslations } from "@govoplan/core-webui";
/** Module-owned translations for contextual headings. */
export const generatedTranslations: PlatformTranslations = {
en: {
"Reporting": "Reporting",
},
de: {
"Reporting": "Reporting",
},
};
+2
View File
@@ -1,6 +1,7 @@
import { createElement, lazy } from "react"; import { createElement, lazy } from "react";
import type { DashboardWidgetsUiCapability, PlatformWebModule } from "@govoplan/core-webui"; import type { DashboardWidgetsUiCapability, PlatformWebModule } from "@govoplan/core-webui";
import ReportingReportsWidget from "./features/reporting/ReportingReportsWidget"; import ReportingReportsWidget from "./features/reporting/ReportingReportsWidget";
import { generatedTranslations } from "./i18n/generatedTranslations";
import "./styles/reporting.css"; import "./styles/reporting.css";
@@ -42,6 +43,7 @@ const reportingDashboardWidgets: DashboardWidgetsUiCapability = {
}; };
export const reportingModule: PlatformWebModule = { export const reportingModule: PlatformWebModule = {
translations: generatedTranslations,
id: "reporting", id: "reporting",
label: "Reporting", label: "Reporting",
version: "0.1.14", version: "0.1.14",
+1 -1
View File
@@ -109,7 +109,7 @@
font-size: 0.75rem; font-size: 0.75rem;
} }
.reporting-title h1 { .reporting-title h2 {
overflow: hidden; overflow: hidden;
margin: 2px 0 0; margin: 2px 0 0;
font-size: 1.05rem; font-size: 1.05rem;