2 Commits
Author SHA1 Message Date
zemion bad3418a7c 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:03 +02:00
zemion a8bfdbf20c fix(packaging): expose immutable WebUI Git package for v0.1.20
Module Package Release / publish-packages (push) Successful in 11s
2026-09-08 02:06:10 +02:00
9 changed files with 74 additions and 9 deletions
+18
View File
@@ -36,3 +36,21 @@ PYTHONPATH=src:/mnt/DATA/git/govoplan-core/src \
The module migration is applied through the platform migration runner when the The module migration is applied through the platform migration runner when the
module is enabled. Destructive retirement requires the normal snapshot and module is enabled. Destructive retirement requires the normal snapshot and
uninstall-guard process because it removes planning history and events. uninstall-guard process because it removes planning history and events.
## Git-source WebUI package
The repository root exposes `@govoplan/projects-webui` for Git-tagged release
dependencies. It mirrors the owning `webui/package.json` version, public
TypeScript/CSS exports and peer requirements, with entry paths under
`webui/src`. Consumers provide the shared Core/React peers; the facade runs no
development or install scripts. The source archive contains `webui/src`, this
README and any repository license file. Run module development checks from `webui/`; Python
installation remains governed by `pyproject.toml`.
Das Repository stellt `@govoplan/projects-webui` am Wurzelpfad für versionierte
Git-Abhängigkeiten bereit. Version, öffentliche TypeScript-/CSS-Exporte und
Peer-Anforderungen entsprechen `webui/package.json`; die Einstiegspfade liegen
unter `webui/src`. Gemeinsame Core-/React-Peers stellt die einbindende Anwendung
bereit. Die Fassade führt keine Entwicklungs- oder Installationsskripte aus.
Entwicklungsprüfungen bleiben in `webui/`, die Python-Installation weiterhin in
`pyproject.toml` definiert.
+29 -3
View File
@@ -1,8 +1,34 @@
{ {
"name": "@govoplan/projects", "name": "@govoplan/projects-webui",
"version": "0.1.19", "version": "0.1.20",
"private": true, "private": true,
"description": "GovOPlaN Projects domain module.", "description": "GovOPlaN Projects domain module.",
"type": "module", "type": "module",
"peerDependencies": {} "peerDependencies": {
"@govoplan/core-webui": "^0.1.18",
"lucide-react": "^1.23.0",
"react": ">=19.2.7 <20",
"react-dom": ">=19.2.7 <20",
"react-router": ">=8.3.0 <9"
},
"main": "webui/src/index.ts",
"module": "webui/src/index.ts",
"types": "webui/src/index.ts",
"exports": {
".": {
"types": "./webui/src/index.ts",
"import": "./webui/src/index.ts"
},
"./styles/projects.css": "./webui/src/styles/projects.css"
},
"peerDependenciesMeta": {
"@govoplan/core-webui": {
"optional": true
}
},
"files": [
"webui/src",
"README.md",
"LICENSE"
]
} }
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "govoplan-projects" name = "govoplan-projects"
version = "0.1.19" version = "0.1.20"
description = "GovOPlaN Projects domain module." description = "GovOPlaN Projects domain module."
readme = "README.md" readme = "README.md"
requires-python = ">=3.12" requires-python = ">=3.12"
+6 -1
View File
@@ -51,7 +51,7 @@ from govoplan_projects.backend.service import (
MODULE_ID = "projects" MODULE_ID = "projects"
MODULE_NAME = "Projects" MODULE_NAME = "Projects"
MODULE_VERSION = "0.1.19" MODULE_VERSION = "0.1.20"
READ_SCOPE = "projects:project:read" READ_SCOPE = "projects:project:read"
WRITE_SCOPE = "projects:project:write" WRITE_SCOPE = "projects:project:write"
ADMIN_SCOPE = "projects:project:admin" ADMIN_SCOPE = "projects:project:admin"
@@ -216,6 +216,8 @@ DOCUMENTATION = (
"capacity assumptions, outcomes, and benefit reviews without absorbing work-item ownership." "capacity assumptions, outcomes, and benefit reviews without absorbing work-item ownership."
), ),
body=( body=(
"Documentation books sit immediately beside the visible heading or contextual label for "
"Projects, not among operational action buttons. Field help remains beside its label. "
"Projects owns native portfolio and project context, immutable revisions of goals and intended outcomes, " "Projects owns native portfolio and project context, immutable revisions of goals and intended outcomes, "
"milestones, participants, status, dependencies, capacity assumptions, benefit reviews, and governed resource references. " "milestones, participants, status, dependencies, capacity assumptions, benefit reviews, and governed resource references. "
"Create or revise the planning context, review its impact, and link provider-owned work and evidence without copying it. " "Create or revise the planning context, review its impact, and link provider-owned work and evidence without copying it. "
@@ -291,6 +293,9 @@ DOCUMENTATION = (
"Ergebnisse und Nutzenprüfungen koordinieren, ohne die Eigentümerschaft an Arbeitselementen zu übernehmen." "Ergebnisse und Nutzenprüfungen koordinieren, ohne die Eigentümerschaft an Arbeitselementen zu übernehmen."
), ),
"body": ( "body": (
"Dokumentationsbücher stehen unmittelbar neben der sichtbaren Überschrift oder "
"Kontextbezeichnung für Projekte, nicht zwischen ausführbaren Aktionsschaltflächen. Feldhilfe "
"bleibt neben der Feldbezeichnung. "
"Projects führt den nativen Portfolio- und Projektkontext, unveränderliche Revisionen von Zielen und " "Projects führt den nativen Portfolio- und Projektkontext, unveränderliche Revisionen von Zielen und "
"beabsichtigten Ergebnissen, Meilensteine, Beteiligte, Status, Abhängigkeiten, Kapazitätsannahmen, " "beabsichtigten Ergebnissen, Meilensteine, Beteiligte, Status, Abhängigkeiten, Kapazitätsannahmen, "
"Nutzenprüfungen und gesteuerte Ressourcenreferenzen. Planungskontext wird angelegt oder revidiert, " "Nutzenprüfungen und gesteuerte Ressourcenreferenzen. Planungskontext wird angelegt oder revidiert, "
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@govoplan/projects-webui", "name": "@govoplan/projects-webui",
"version": "0.1.19", "version": "0.1.20",
"private": true, "private": true,
"type": "module", "type": "module",
"main": "src/index.ts", "main": "src/index.ts",
+4 -2
View File
@@ -241,7 +241,9 @@ export default function ProjectsPage({ settings, auth }: PlatformRouteContext) {
</label> </label>
<span className="projects-count">{total} objects</span> <span className="projects-count">{total} objects</span>
</>} </>}
helpAction={<DocumentationHelpLink title="Projects"
titleLevel={1}
titleHelp={<DocumentationHelpLink
reference={{ topicId: "projects.module-boundary", documentationType: "user" }} reference={{ topicId: "projects.module-boundary", documentationType: "user" }}
label="Open Projects documentation" label="Open Projects documentation"
/>} />}
@@ -309,7 +311,7 @@ function ProjectDetail({ record, canWrite, onEdit }: {
<header className="project-detail-header"> <header className="project-detail-header">
<div> <div>
<span className="project-eyebrow">{humanize(record.object_kind)} · {record.object_key}</span> <span className="project-eyebrow">{humanize(record.object_kind)} · {record.object_key}</span>
<h1>{record.title}</h1> <h2>{record.title}</h2>
</div> </div>
<div className="project-detail-actions"> <div className="project-detail-actions">
<StatusBadge status={statusTone(record.state)} label={humanize(record.state)} /> <StatusBadge status={statusTone(record.state)} label={humanize(record.state)} />
+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: {
"Projects": "Projects",
},
de: {
"Projects": "Projekte",
},
};
+2
View File
@@ -1,11 +1,13 @@
import { createElement, lazy } from "react"; import { createElement, lazy } from "react";
import type { PlatformWebModule } from "@govoplan/core-webui"; import type { PlatformWebModule } from "@govoplan/core-webui";
import { generatedTranslations } from "./i18n/generatedTranslations";
import "./styles/projects.css"; import "./styles/projects.css";
const ProjectsPage = lazy(() => import("./features/projects/ProjectsPage")); const ProjectsPage = lazy(() => import("./features/projects/ProjectsPage"));
export const projectsModule: PlatformWebModule = { export const projectsModule: PlatformWebModule = {
translations: generatedTranslations,
id: "projects", id: "projects",
label: "Projects", label: "Projects",
version: "0.1.14", version: "0.1.14",
+1 -1
View File
@@ -62,7 +62,7 @@
border-bottom: 1px solid var(--border); border-bottom: 1px solid var(--border);
} }
.project-detail-header h1 { .project-detail-header h2 {
margin: 4px 0 0; margin: 4px 0 0;
font-size: 1.4rem; font-size: 1.4rem;
letter-spacing: 0; letter-spacing: 0;