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",
"version": "0.1.21",
"version": "0.1.22",
"private": true,
"type": "module",
"main": "webui/src/index.ts",
+2 -2
View File
@@ -4,14 +4,14 @@ build-backend = "setuptools.build_meta"
[project]
name = "govoplan-reporting"
version = "0.1.21"
version = "0.1.22"
description = "GovOPlaN governed reporting and semantic BI module."
readme = "README.md"
requires-python = ">=3.12"
license = { text = "AGPL-3.0-or-later" }
authors = [{ name = "GovOPlaN" }]
dependencies = [
"govoplan-core>=0.1.45",
"govoplan-core>=0.1.46",
"govoplan-access>=0.1.18",
]
+1 -1
View File
@@ -1,3 +1,3 @@
"""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.orm import Query, Session
from govoplan_core.core.principal_helpers import principal_actor_ids as _actor_ids
from govoplan_core.core.events import (
EventActorRef,
EventObjectRef,
@@ -884,22 +885,6 @@ def _actor(principal: object) -> str | 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:
tenant_id = str(getattr(principal, "tenant_id", "") or "").strip()
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_NAME = "Reporting"
MODULE_VERSION = "0.1.21"
MODULE_VERSION = "0.1.22"
def _permission(scope: str, label: str, description: str) -> PermissionDefinition:
@@ -597,6 +597,8 @@ manifest = ModuleManifest(
title="Governed reporting and semantic BI",
summary="Build reproducible reports over provider-owned datasets without bypassing module or row-level access.",
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 "
"definition hashes, source fingerprints, policy provenance, quality evidence, "
"authorized result rows, diagnostics, and output hashes. Safe dimensions, "
@@ -658,6 +660,9 @@ manifest = ModuleManifest(
"ohne Modul- oder Zeilenberechtigungen zu umgehen."
),
"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 "
"Berichten. Ausführungen bewahren Definitionsprüfsummen, Quellfingerabdrücke, "
"Richtlinienherkunft, Qualitätsnachweise, berechtigte Ergebniszeilen, Diagnosen "
+1 -1
View File
@@ -92,7 +92,7 @@ class _Provider:
del session
return ReportProviderResult(
report_id=request.report_id,
generated_at=datetime(2026, 8, 2, 10, 0, tzinfo=UTC),
generated_at=datetime.now(UTC),
payload={"metric": 12},
source_revisions=(
{
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@govoplan/reporting-webui",
"version": "0.1.21",
"version": "0.1.22",
"private": true,
"type": "module",
"main": "src/index.ts",
@@ -275,7 +275,9 @@ export default function ReportingPage({ settings, auth }: PlatformRouteContext)
</FilterBar>
<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" }}
label="Open reporting documentation"
/>}
@@ -323,7 +325,7 @@ export default function ReportingPage({ settings, auth }: PlatformRouteContext)
<header className="reporting-result-header">
<div className="reporting-title">
<span>{selected.definition_key} · revision {selected.revision}</span>
<h1>{selected.name}</h1>
<h2>{selected.name}</h2>
</div>
<div className="reporting-run-actions">
{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 type { DashboardWidgetsUiCapability, PlatformWebModule } from "@govoplan/core-webui";
import ReportingReportsWidget from "./features/reporting/ReportingReportsWidget";
import { generatedTranslations } from "./i18n/generatedTranslations";
import "./styles/reporting.css";
@@ -42,6 +43,7 @@ const reportingDashboardWidgets: DashboardWidgetsUiCapability = {
};
export const reportingModule: PlatformWebModule = {
translations: generatedTranslations,
id: "reporting",
label: "Reporting",
version: "0.1.14",
+1 -1
View File
@@ -109,7 +109,7 @@
font-size: 0.75rem;
}
.reporting-title h1 {
.reporting-title h2 {
overflow: hidden;
margin: 2px 0 0;
font-size: 1.05rem;