2 Commits
Author SHA1 Message Date
zemion 13f389ff2c 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:03:40 +02:00
zemion 2be7232c83 docs: complete German structured documentation
Module Package Release / publish-packages (push) Successful in 11s
2026-08-24 01:23:35 +02:00
9 changed files with 52 additions and 7 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@govoplan/helpdesk-webui",
"version": "0.1.20",
"version": "0.1.21",
"private": true,
"description": "GovOPlaN Helpdesk service-profile and ticket-routing policy module.",
"type": "module",
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "govoplan-helpdesk"
version = "0.1.20"
version = "0.1.21"
description = "GovOPlaN Helpdesk service-profile and ticket-routing policy module."
readme = "README.md"
requires-python = ">=3.12"
@@ -0,0 +1,18 @@
"""German translations for public structured documentation metadata."""
from __future__ import annotations
from typing import Any
GERMAN_STRUCTURED_TRANSLATIONS: dict[str, dict[str, Any]] = {'helpdesk.module-boundary': {'consequence_classes': {'policy_overlay': 'Wendet Warteschlangen- '
'und '
'Service-Zielrichtlinien '
'an, ohne den '
'Ticket-Status zu '
'duplizieren.',
'reduced_installation': 'Manuelles '
'Ticket-Routing '
'bleibt verfügbar, '
'wenn Helpdesk '
'deaktiviert ist.'}}}
+14 -2
View File
@@ -1,5 +1,8 @@
from __future__ import annotations
from govoplan_core.core.modules import with_documentation_structured_translations
from govoplan_helpdesk.backend.german_structured_documentation import GERMAN_STRUCTURED_TRANSLATIONS
from pathlib import Path
from govoplan_core.core.access import CAPABILITY_AUTH_PERMISSION_EVALUATOR, CAPABILITY_AUTH_PRINCIPAL_RESOLVER
@@ -31,7 +34,7 @@ from govoplan_helpdesk.backend.service import SqlHelpdeskRoutingProvider
MODULE_ID = "helpdesk"
MODULE_NAME = "Helpdesk"
MODULE_VERSION = "0.1.20"
MODULE_VERSION = "0.1.21"
READ_SCOPE = "helpdesk:workspace:read"
WRITE_SCOPE = "helpdesk:workspace:write"
ADMIN_SCOPE = "helpdesk:workspace:admin"
@@ -113,6 +116,8 @@ DOCUMENTATION = (
title="Configure Helpdesk routing and service-target profiles",
summary="Match bounded Ticket types and priorities to one queue and a priority-specific target.",
body=(
"Open the documentation book immediately beside Helpdesk profiles for routing-profile "
"guidance. "
"Each active tenant profile has a stable key, ordered precedence, supported Ticket types and priorities, a queue reference, and optional target minutes by priority or default. "
"At Ticket intake Helpdesk evaluates active profiles in order. An explicit profile key or queue hint narrows the match. The selected profile revision, queue, target duration, and explanation are recorded with the Ticket. "
"If no profile matches, intake succeeds without an automatic target and authorized Ticket staff choose queue and target manually. Profile edits are revision-guarded, replay-safe, and append immutable configuration history."
@@ -125,7 +130,9 @@ DOCUMENTATION = (
"de": {
"title": "Helpdesk-Profile für Weiterleitung und Serviceziele konfigurieren",
"summary": "Begrenzte Ticketarten und Prioritäten einer Warteschlange und einem prioritätsabhängigen Ziel zuordnen.",
"body": "Jedes aktive Mandantenprofil besitzt einen stabilen Schlüssel, eine Reihenfolge, unterstützte Ticketarten und Prioritäten, einen Warteschlangenverweis und optionale Zielminuten je Priorität oder als Standard. Bei der Ticketaufnahme wertet Helpdesk aktive Profile der Reihe nach aus. Ein ausdrücklicher Profilschlüssel oder Warteschlangenhinweis grenzt die Auswahl ein. Profilrevision, Warteschlange, Zieldauer und Begründung werden am Ticket festgehalten. Trifft kein Profil zu, gelingt die Aufnahme ohne automatisches Ziel; berechtigte Ticket-Bearbeitende wählen Warteschlange und Ziel manuell. Profiländerungen sind revisionsgeschützt, wiederholungssicher und erzeugen unveränderliche Konfigurationshistorie.",
"body": "Öffnen Sie das Dokumentationsbuch unmittelbar neben Helpdesk-Profile für Hinweise zu "
"Routing-Profilen. "
"Jedes aktive Mandantenprofil besitzt einen stabilen Schlüssel, eine Reihenfolge, unterstützte Ticketarten und Prioritäten, einen Warteschlangenverweis und optionale Zielminuten je Priorität oder als Standard. Bei der Ticketaufnahme wertet Helpdesk aktive Profile der Reihe nach aus. Ein ausdrücklicher Profilschlüssel oder Warteschlangenhinweis grenzt die Auswahl ein. Profilrevision, Warteschlange, Zieldauer und Begründung werden am Ticket festgehalten. Trifft kein Profil zu, gelingt die Aufnahme ohne automatisches Ziel; berechtigte Ticket-Bearbeitende wählen Warteschlange und Ziel manuell. Profiländerungen sind revisionsgeschützt, wiederholungssicher und erzeugen unveränderliche Konfigurationshistorie.",
}
},
related_modules=("tickets",),
@@ -220,5 +227,10 @@ manifest = ModuleManifest(
)
manifest = with_documentation_structured_translations(
manifest, locale="de", translations=GERMAN_STRUCTURED_TRANSLATIONS
)
def get_manifest() -> ModuleManifest:
return manifest
+1 -1
View File
@@ -11,7 +11,7 @@ class ManifestTests(unittest.TestCase):
def test_manifest_registers_helpdesk_policy_overlay(self) -> None:
manifest = get_manifest()
self.assertEqual("helpdesk", manifest.id)
self.assertEqual("0.1.20", manifest.version)
self.assertEqual("0.1.21", manifest.version)
self.assertEqual({READ_SCOPE, WRITE_SCOPE, ADMIN_SCOPE}, {item.scope for item in manifest.permissions})
self.assertEqual({"helpdesk_manager", "helpdesk_viewer", "helpdesk_administrator"}, {item.slug for item in manifest.role_templates})
self.assertIsNotNone(manifest.route_factory)
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@govoplan/helpdesk-webui",
"version": "0.1.20",
"version": "0.1.21",
"private": true,
"type": "module",
"main": "src/index.ts",
@@ -114,12 +114,13 @@ export default function HelpdeskProfilesPage({ settings, auth }: PlatformRouteCo
<main className="helpdesk-page">
<WorkspaceFrame className="helpdesk-shell" label="Helpdesk profiles" interfaceId="helpdesk.route.profiles" helpContextId="helpdesk.route.profiles" helpModuleId="helpdesk">
<WorkspaceActionBar
title="Helpdesk profiles"
titleHelp={<DocumentationHelpLink reference={{ topicId: "helpdesk.configure-routing-profiles", documentationType: "admin" }} label="Open Helpdesk profile documentation" />}
scope="workspace"
variant="collection"
refreshable
reloadAction={{ onReload: () => void reload(), loading }}
contextActions={<span className="helpdesk-count">{profiles.length} profiles · ordered first match wins</span>}
helpAction={<DocumentationHelpLink reference={{ topicId: "helpdesk.configure-routing-profiles", documentationType: "admin" }} label="Open Helpdesk profile documentation" />}
createAction={<Button type="button" variant="primary" onClick={() => { setEditing(null); setEditorError(""); setEditorOpen(true); }}><Plus size={16} /> New profile</Button>}
/>
{error && <DismissibleAlert tone="danger" onDismiss={() => setError("")}>{error}</DismissibleAlert>}
+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: {
"Helpdesk profiles": "Helpdesk profiles",
},
de: {
"Helpdesk profiles": "Helpdesk-Profile",
},
};
+2
View File
@@ -1,11 +1,13 @@
import { createElement, lazy } from "react";
import type { PlatformWebModule } from "@govoplan/core-webui";
import { generatedTranslations } from "./i18n/generatedTranslations";
import "./styles/helpdesk.css";
const HelpdeskProfilesPage = lazy(() => import("./features/helpdesk/HelpdeskProfilesPage"));
export const helpdeskModule: PlatformWebModule = {
translations: generatedTranslations,
id: "helpdesk",
label: "Helpdesk",
version: "0.1.20",