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.
This commit is contained in:
2026-09-09 02:04:24 +02:00
parent 2be4a0c598
commit b11162d5f1
5 changed files with 25 additions and 4 deletions
+6 -1
View File
@@ -207,6 +207,8 @@ DOCUMENTATION = (
title="Tickets module boundary", title="Tickets module boundary",
summary="Operational requests, incidents, problems, reports, queue work, service targets, and auditable resolution.", summary="Operational requests, incidents, problems, reports, queue work, service targets, and auditable resolution.",
body=( body=(
"Documentation books sit immediately beside the visible heading or contextual label for "
"Tickets, not among operational action buttons. Field help remains beside its label. "
"Tickets owns the operational service record and its lifecycle. Cases remains authoritative for formal procedures; " "Tickets owns the operational service record and its lifecycle. Cases remains authoritative for formal procedures; "
"Helpdesk may contribute routing and service-target policy without creating a second ticket store. Attachments and " "Helpdesk may contribute routing and service-target policy without creating a second ticket store. Attachments and "
"related work are typed references. Soft deletion removes a ticket from ordinary work and Search while retaining its immutable history." "related work are typed references. Soft deletion removes a ticket from ordinary work and Search while retaining its immutable history."
@@ -218,7 +220,10 @@ DOCUMENTATION = (
"de": { "de": {
"title": "Modulgrenze von Tickets", "title": "Modulgrenze von Tickets",
"summary": "Operative Anfragen, Störungen, Probleme, Meldungen, Warteschlangenarbeit, Serviceziele und nachvollziehbare Lösungen.", "summary": "Operative Anfragen, Störungen, Probleme, Meldungen, Warteschlangenarbeit, Serviceziele und nachvollziehbare Lösungen.",
"body": "Tickets verantwortet den operativen Servicevorgang und seinen Lebenszyklus. Cases bleibt für förmliche Verfahren maßgeblich; Helpdesk kann Weiterleitung und Serviceziele beisteuern, ohne einen zweiten Ticketspeicher anzulegen. Anhänge und verbundene Arbeit sind typisierte Verweise. Eine weiche Löschung entfernt ein Ticket aus der normalen Arbeit und Suche, erhält aber die unveränderliche Historie.", "body": "Dokumentationsbücher stehen unmittelbar neben der sichtbaren Überschrift oder "
"Kontextbezeichnung für Tickets, nicht zwischen ausführbaren Aktionsschaltflächen. Feldhilfe "
"bleibt neben der Feldbezeichnung. "
"Tickets verantwortet den operativen Servicevorgang und seinen Lebenszyklus. Cases bleibt für förmliche Verfahren maßgeblich; Helpdesk kann Weiterleitung und Serviceziele beisteuern, ohne einen zweiten Ticketspeicher anzulegen. Anhänge und verbundene Arbeit sind typisierte Verweise. Eine weiche Löschung entfernt ein Ticket aus der normalen Arbeit und Suche, erhält aber die unveränderliche Historie.",
} }
}, },
related_modules=OPTIONAL_DEPENDENCIES, related_modules=OPTIONAL_DEPENDENCIES,
+4 -2
View File
@@ -338,7 +338,9 @@ export default function TicketsPage({ settings, auth }: PlatformRouteContext) {
</label> </label>
<span className="tickets-count">{total} tickets</span> <span className="tickets-count">{total} tickets</span>
</>} </>}
helpAction={<DocumentationHelpLink reference={{ topicId: "tickets.operational-workflow", documentationType: "user" }} label="Open Tickets documentation" />} title="Tickets"
titleLevel={1}
titleHelp={<DocumentationHelpLink reference={{ topicId: "tickets.operational-workflow", documentationType: "user" }} label="Open Tickets documentation" />}
createAction={canReport ? createAction={canReport ?
<Button type="button" variant="primary" onClick={() => { <Button type="button" variant="primary" onClick={() => {
setEditing(null); setEditing(null);
@@ -450,7 +452,7 @@ function TicketDetail({ record, availability, history, canTriage, canAssign, can
<header className="ticket-detail-header"> <header className="ticket-detail-header">
<div> <div>
<span className="ticket-eyebrow">{record.ticket_number} · {humanize(record.ticket_type)}</span> <span className="ticket-eyebrow">{record.ticket_number} · {humanize(record.ticket_type)}</span>
<h1>{record.title}</h1> <h2>{record.title}</h2>
</div> </div>
<div className="ticket-detail-badges"> <div className="ticket-detail-badges">
<StatusBadge status={priorityTone(record.priority)} label={humanize(record.priority)} /> <StatusBadge status={priorityTone(record.priority)} label={humanize(record.priority)} />
+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: {
"Tickets": "Tickets",
},
de: {
"Tickets": "Tickets",
},
};
+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/tickets.css"; import "./styles/tickets.css";
const TicketsPage = lazy(() => import("./features/tickets/TicketsPage")); const TicketsPage = lazy(() => import("./features/tickets/TicketsPage"));
export const ticketsModule: PlatformWebModule = { export const ticketsModule: PlatformWebModule = {
translations: generatedTranslations,
id: "tickets", id: "tickets",
label: "Tickets", label: "Tickets",
version: "0.1.20", version: "0.1.20",
+1 -1
View File
@@ -74,7 +74,7 @@
border-bottom: 1px solid var(--border); border-bottom: 1px solid var(--border);
} }
.ticket-detail-header h1 { .ticket-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;