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:
@@ -895,7 +895,9 @@ manifest = ModuleManifest(
|
|||||||
id="calendar.manage-calendars-and-events",
|
id="calendar.manage-calendars-and-events",
|
||||||
title="Use calendars and events",
|
title="Use calendars and events",
|
||||||
summary="Create calendar collections and work with all-day or timed events in continuous, month, week, workweek, and day views.",
|
summary="Create calendar collections and work with all-day or timed events in continuous, month, week, workweek, and day views.",
|
||||||
body="Calendar remembers the selected view and preferences. Events can be created, edited, moved, resized, repeated, imported, exported, or deleted when the current account has the corresponding permission. All-day events use dates rather than local clock times; timed events retain their timezone-aware start and end values. Scheduling may promote a selected tentative hold in place and submit unused holds for idempotent release through the neutral Calendar capability. Calendar owns the resulting local tombstone, synchronized outbox operation, retry and reconciliation evidence; an already released or absent event is an accepted replay rather than a duplicate failure.",
|
body="Documentation books sit beside Calendars, Calendar display, and the relevant event, source, "
|
||||||
|
"move, or recovery dialog title. Field help remains beside its label. "
|
||||||
|
"Calendar remembers the selected view and preferences. Events can be created, edited, moved, resized, repeated, imported, exported, or deleted when the current account has the corresponding permission. All-day events use dates rather than local clock times; timed events retain their timezone-aware start and end values. Scheduling may promote a selected tentative hold in place and submit unused holds for idempotent release through the neutral Calendar capability. Calendar owns the resulting local tombstone, synchronized outbox operation, retry and reconciliation evidence; an already released or absent event is an accepted replay rather than a duplicate failure.",
|
||||||
documentation_types=("user",),
|
documentation_types=("user",),
|
||||||
audience=("user", "calendar_manager"),
|
audience=("user", "calendar_manager"),
|
||||||
related_modules=("scheduling", "notifications"),
|
related_modules=("scheduling", "notifications"),
|
||||||
@@ -907,6 +909,9 @@ manifest = ModuleManifest(
|
|||||||
"Arbeitswochen- und Tagesansicht bearbeiten."
|
"Arbeitswochen- und Tagesansicht bearbeiten."
|
||||||
),
|
),
|
||||||
"body": (
|
"body": (
|
||||||
|
"Dokumentationsbücher stehen neben Kalender, Kalenderanzeige und dem jeweiligen Dialogtitel "
|
||||||
|
"für Ereignisse, Quellen, Verschiebungen oder Wiederherstellung. Feldhilfe bleibt neben der "
|
||||||
|
"Feldbezeichnung. "
|
||||||
"Calendar merkt sich gewählte Ansicht und Präferenzen. Ereignisse können mit der entsprechenden Berechtigung angelegt, "
|
"Calendar merkt sich gewählte Ansicht und Präferenzen. Ereignisse können mit der entsprechenden Berechtigung angelegt, "
|
||||||
"bearbeitet, verschoben, in ihrer Dauer geändert, wiederholt, importiert, exportiert oder gelöscht werden. Ganztägige "
|
"bearbeitet, verschoben, in ihrer Dauer geändert, wiederholt, importiert, exportiert oder gelöscht werden. Ganztägige "
|
||||||
"Ereignisse verwenden Datumswerte statt lokaler Uhrzeiten; zeitgebundene Ereignisse bewahren zeitzonenbezogene Start- und "
|
"Ereignisse verwenden Datumswerte statt lokaler Uhrzeiten; zeitgebundene Ereignisse bewahren zeitzonenbezogene Start- und "
|
||||||
@@ -939,7 +944,9 @@ manifest = ModuleManifest(
|
|||||||
id="calendar.external-sources-and-sync",
|
id="calendar.external-sources-and-sync",
|
||||||
title="Connect and synchronize external calendars",
|
title="Connect and synchronize external calendars",
|
||||||
summary="Calendar supports local collections, two-way CalDAV and Open-Xchange profiles, and read-only ICS/webcal, Microsoft Graph, and Exchange Web Services sources.",
|
summary="Calendar supports local collections, two-way CalDAV and Open-Xchange profiles, and read-only ICS/webcal, Microsoft Graph, and Exchange Web Services sources.",
|
||||||
body="Each external source keeps its URL, synchronization direction, status, and credential reference with the Calendar collection. Open-Xchange uses the proven CalDAV transport while retaining connector-profile, identity/group-mapping, and resource-calendar references. Manual or scheduled synchronization records bounded outcomes. Scheduled source and outbox workers partition work by tenant entitlement; disabling Calendar preserves accepted operations and reports operator action instead of contacting a remote provider. CalDAV writes use conditional requests and durable outbox state; conflicts and unknown outcomes require synchronization or explicit reconciliation instead of blind repetition. Moving between two-way CalDAV calendars is an administrator-authorized migration batch: all destination resources must be copied before any source resource is conditionally deleted with its recorded ETag. Calendar and event changes remain locked while progress, conflicts, cancellation eligibility, and evidence are visible. Removing an external source removes the connection, while deleting a local calendar deletes its owned events after confirmation or transfer.",
|
body="Documentation books sit beside Calendars, Calendar display, and the relevant event, source, "
|
||||||
|
"move, or recovery dialog title. Field help remains beside its label. "
|
||||||
|
"Each external source keeps its URL, synchronization direction, status, and credential reference with the Calendar collection. Open-Xchange uses the proven CalDAV transport while retaining connector-profile, identity/group-mapping, and resource-calendar references. Manual or scheduled synchronization records bounded outcomes. Scheduled source and outbox workers partition work by tenant entitlement; disabling Calendar preserves accepted operations and reports operator action instead of contacting a remote provider. CalDAV writes use conditional requests and durable outbox state; conflicts and unknown outcomes require synchronization or explicit reconciliation instead of blind repetition. Moving between two-way CalDAV calendars is an administrator-authorized migration batch: all destination resources must be copied before any source resource is conditionally deleted with its recorded ETag. Calendar and event changes remain locked while progress, conflicts, cancellation eligibility, and evidence are visible. Removing an external source removes the connection, while deleting a local calendar deletes its owned events after confirmation or transfer.",
|
||||||
documentation_types=("admin", "user"),
|
documentation_types=("admin", "user"),
|
||||||
audience=("user", "calendar_manager", "operator"),
|
audience=("user", "calendar_manager", "operator"),
|
||||||
related_modules=("connectors", "audit", "ops"),
|
related_modules=("connectors", "audit", "ops"),
|
||||||
@@ -951,6 +958,9 @@ manifest = ModuleManifest(
|
|||||||
"ICS-/webcal-, Microsoft-Graph- und Exchange-Web-Services-Quellen."
|
"ICS-/webcal-, Microsoft-Graph- und Exchange-Web-Services-Quellen."
|
||||||
),
|
),
|
||||||
"body": (
|
"body": (
|
||||||
|
"Dokumentationsbücher stehen neben Kalender, Kalenderanzeige und dem jeweiligen Dialogtitel "
|
||||||
|
"für Ereignisse, Quellen, Verschiebungen oder Wiederherstellung. Feldhilfe bleibt neben der "
|
||||||
|
"Feldbezeichnung. "
|
||||||
"Jede externe Quelle hält URL, Synchronisationsrichtung, Status und Zugangsdatenverweis gemeinsam mit der "
|
"Jede externe Quelle hält URL, Synchronisationsrichtung, Status und Zugangsdatenverweis gemeinsam mit der "
|
||||||
"Calendar-Sammlung. Open-Xchange verwendet den bewährten CalDAV-Transport und bewahrt dabei Connector-Profil-, "
|
"Calendar-Sammlung. Open-Xchange verwendet den bewährten CalDAV-Transport und bewahrt dabei Connector-Profil-, "
|
||||||
"Identitäts-/Gruppenzuordnungs- und Ressourcenkalenderverweise. Manuelle und geplante Synchronisation zeichnet begrenzte "
|
"Identitäts-/Gruppenzuordnungs- und Ressourcenkalenderverweise. Manuelle und geplante Synchronisation zeichnet begrenzte "
|
||||||
|
|||||||
@@ -104,17 +104,20 @@ class CalendarInterfaceDocumentationContractTests(unittest.TestCase):
|
|||||||
for component in (
|
for component in (
|
||||||
"ActionBlockerHint",
|
"ActionBlockerHint",
|
||||||
"ConfirmDialog",
|
"ConfirmDialog",
|
||||||
"DocumentationHelpLink",
|
"titleHelp={<DocumentationHelpLink reference={CALENDAR_DOCUMENTATION} />}",
|
||||||
"useUnsavedDraftGuard",
|
"useUnsavedDraftGuard",
|
||||||
):
|
):
|
||||||
self.assertIn(component, event_dialog)
|
self.assertIn(component, event_dialog)
|
||||||
for component in (
|
for component in (
|
||||||
"ActionBlockerHint",
|
"ActionBlockerHint",
|
||||||
"DocumentationHelpLink",
|
"titleHelp={<DocumentationHelpLink reference={CALENDAR_SOURCE_DOCUMENTATION} />}",
|
||||||
"useUnsavedDraftGuard",
|
"useUnsavedDraftGuard",
|
||||||
):
|
):
|
||||||
self.assertIn(component, collection_dialog)
|
self.assertIn(component, collection_dialog)
|
||||||
for component in ("DocumentationHelpLink", "useUnsavedDraftGuard"):
|
for component in (
|
||||||
|
"titleHelp={<DocumentationHelpLink reference={CALENDAR_DOCUMENTATION} />}",
|
||||||
|
"useUnsavedDraftGuard",
|
||||||
|
):
|
||||||
self.assertIn(component, settings_panel)
|
self.assertIn(component, settings_panel)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -352,6 +352,7 @@ export function CalendarCollectionDialog({
|
|||||||
<Dialog
|
<Dialog
|
||||||
open
|
open
|
||||||
title={isEdit ? "i18n:govoplan-calendar.edit_calendar.a47a2a7a" : "i18n:govoplan-calendar.add_calendar.8fadb5bc"}
|
title={isEdit ? "i18n:govoplan-calendar.edit_calendar.a47a2a7a" : "i18n:govoplan-calendar.add_calendar.8fadb5bc"}
|
||||||
|
titleHelp={<DocumentationHelpLink reference={CALENDAR_SOURCE_DOCUMENTATION} />}
|
||||||
size="large"
|
size="large"
|
||||||
footerClassName="calendar-event-dialog-footer"
|
footerClassName="calendar-event-dialog-footer"
|
||||||
closeDisabled={saving}
|
closeDisabled={saving}
|
||||||
@@ -373,9 +374,6 @@ export function CalendarCollectionDialog({
|
|||||||
}>
|
}>
|
||||||
|
|
||||||
<DialogForm id={formId} className="calendar-dialog-form" onSubmit={submit}>
|
<DialogForm id={formId} className="calendar-dialog-form" onSubmit={submit}>
|
||||||
<div className="calendar-dialog-documentation">
|
|
||||||
<DocumentationHelpLink reference={CALENDAR_SOURCE_DOCUMENTATION} />
|
|
||||||
</div>
|
|
||||||
{migrationLocked && (
|
{migrationLocked && (
|
||||||
<ActionBlockerHint
|
<ActionBlockerHint
|
||||||
reason={{
|
reason={{
|
||||||
@@ -675,6 +673,7 @@ export function CalendarCollectionDeleteDialog({
|
|||||||
open
|
open
|
||||||
role="alertdialog"
|
role="alertdialog"
|
||||||
title={`${actionLabel} calendar`}
|
title={`${actionLabel} calendar`}
|
||||||
|
titleHelp={<DocumentationHelpLink reference={CALENDAR_SOURCE_DOCUMENTATION} />}
|
||||||
className="calendar-delete-dialog"
|
className="calendar-delete-dialog"
|
||||||
footerClassName="calendar-event-dialog-footer"
|
footerClassName="calendar-event-dialog-footer"
|
||||||
closeDisabled={saving}
|
closeDisabled={saving}
|
||||||
@@ -689,9 +688,6 @@ export function CalendarCollectionDeleteDialog({
|
|||||||
}>
|
}>
|
||||||
|
|
||||||
<div className="calendar-delete-dialog-body">
|
<div className="calendar-delete-dialog-body">
|
||||||
<div className="calendar-dialog-documentation">
|
|
||||||
<DocumentationHelpLink reference={CALENDAR_SOURCE_DOCUMENTATION} />
|
|
||||||
</div>
|
|
||||||
<p className="calendar-delete-warning">
|
<p className="calendar-delete-warning">
|
||||||
{loadingEventCount ?
|
{loadingEventCount ?
|
||||||
"i18n:govoplan-calendar.loading_event_count.716ad3c2" :
|
"i18n:govoplan-calendar.loading_event_count.716ad3c2" :
|
||||||
|
|||||||
@@ -281,6 +281,7 @@ export function CalendarEventDialog({
|
|||||||
<Dialog
|
<Dialog
|
||||||
open
|
open
|
||||||
title={event ? "i18n:govoplan-calendar.edit_event.a7028454" : "i18n:govoplan-calendar.new_event.2ef3795c"}
|
title={event ? "i18n:govoplan-calendar.edit_event.a7028454" : "i18n:govoplan-calendar.new_event.2ef3795c"}
|
||||||
|
titleHelp={<DocumentationHelpLink reference={CALENDAR_DOCUMENTATION} />}
|
||||||
className="calendar-vevent-dialog"
|
className="calendar-vevent-dialog"
|
||||||
footerClassName="calendar-event-dialog-footer"
|
footerClassName="calendar-event-dialog-footer"
|
||||||
closeDisabled={saving}
|
closeDisabled={saving}
|
||||||
@@ -302,9 +303,6 @@ export function CalendarEventDialog({
|
|||||||
}>
|
}>
|
||||||
|
|
||||||
<DialogForm id={formId} className="calendar-dialog-form" onSubmit={submit}>
|
<DialogForm id={formId} className="calendar-dialog-form" onSubmit={submit}>
|
||||||
<div className="calendar-dialog-documentation">
|
|
||||||
<DocumentationHelpLink reference={CALENDAR_DOCUMENTATION} />
|
|
||||||
</div>
|
|
||||||
{!canWrite && (
|
{!canWrite && (
|
||||||
<ActionBlockerHint
|
<ActionBlockerHint
|
||||||
tone="info"
|
tone="info"
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ export function CalendarMigrationDialog({
|
|||||||
<Dialog
|
<Dialog
|
||||||
open
|
open
|
||||||
title="Remote calendar move"
|
title="Remote calendar move"
|
||||||
|
titleHelp={<DocumentationHelpLink reference={CALENDAR_SOURCE_DOCUMENTATION} />}
|
||||||
className="calendar-migration-dialog"
|
className="calendar-migration-dialog"
|
||||||
closeDisabled={working}
|
closeDisabled={working}
|
||||||
onClose={onClose}
|
onClose={onClose}
|
||||||
@@ -113,7 +114,6 @@ export function CalendarMigrationDialog({
|
|||||||
<LoadingFrame loading label="Loading remote move"><div /></LoadingFrame>
|
<LoadingFrame loading label="Loading remote move"><div /></LoadingFrame>
|
||||||
) : (
|
) : (
|
||||||
<div className="calendar-migration-body">
|
<div className="calendar-migration-body">
|
||||||
<DocumentationHelpLink reference={CALENDAR_SOURCE_DOCUMENTATION} />
|
|
||||||
{error && (
|
{error && (
|
||||||
<DismissibleAlert tone="danger" resetKey={error}>
|
<DismissibleAlert tone="danger" resetKey={error}>
|
||||||
{error}
|
{error}
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ export function CalendarOutboxDialog({
|
|||||||
<Dialog
|
<Dialog
|
||||||
open
|
open
|
||||||
title="i18n:govoplan-calendar.outbound_changes.7038a839"
|
title="i18n:govoplan-calendar.outbound_changes.7038a839"
|
||||||
|
titleHelp={<DocumentationHelpLink reference={CALENDAR_RECOVERY_DOCUMENTATION} />}
|
||||||
className="calendar-outbox-dialog"
|
className="calendar-outbox-dialog"
|
||||||
closeDisabled={Boolean(busyOperationId)}
|
closeDisabled={Boolean(busyOperationId)}
|
||||||
onClose={onClose}
|
onClose={onClose}
|
||||||
@@ -111,7 +112,6 @@ export function CalendarOutboxDialog({
|
|||||||
>
|
>
|
||||||
<div className="calendar-outbox-body">
|
<div className="calendar-outbox-body">
|
||||||
<p className="calendar-outbox-calendar-name">{calendar.name}</p>
|
<p className="calendar-outbox-calendar-name">{calendar.name}</p>
|
||||||
<DocumentationHelpLink reference={CALENDAR_RECOVERY_DOCUMENTATION} />
|
|
||||||
{error && <DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert>}
|
{error && <DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert>}
|
||||||
<ActionToolbar justify="between" className="calendar-outbox-toolbar">
|
<ActionToolbar justify="between" className="calendar-outbox-toolbar">
|
||||||
<SegmentedControl<OutboxFilter>
|
<SegmentedControl<OutboxFilter>
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import { ToolbarGroup, ActionToolbar,
|
|||||||
Button,
|
Button,
|
||||||
DismissibleAlert,
|
DismissibleAlert,
|
||||||
DocumentationHelpLink,
|
DocumentationHelpLink,
|
||||||
|
TextWithHelp,
|
||||||
LoadingFrame,
|
LoadingFrame,
|
||||||
SegmentedControl,
|
SegmentedControl,
|
||||||
TableActionGroup,
|
TableActionGroup,
|
||||||
@@ -799,7 +800,7 @@ export default function CalendarPage({ settings, auth }: {settings: ApiSettings;
|
|||||||
<LoadingFrame loading={loading} label="i18n:govoplan-calendar.loading_calendar.7eb8f548" className="calendar-loading-frame">
|
<LoadingFrame loading={loading} label="i18n:govoplan-calendar.loading_calendar.7eb8f548" className="calendar-loading-frame">
|
||||||
<div className="calendar-shell">
|
<div className="calendar-shell">
|
||||||
<aside className="calendar-sidebar">
|
<aside className="calendar-sidebar">
|
||||||
<div className="calendar-sidebar-heading">i18n:govoplan-calendar.calendars.94445018</div>
|
<TextWithHelp as="div" className="calendar-sidebar-heading" help={<DocumentationHelpLink reference={CALENDAR_DOCUMENTATION} />}>i18n:govoplan-calendar.calendars.94445018</TextWithHelp>
|
||||||
<div className="calendar-list">
|
<div className="calendar-list">
|
||||||
{calendars.map((calendar) => {
|
{calendars.map((calendar) => {
|
||||||
const source = syncSourceByCalendarId.get(calendar.id) ?? null;
|
const source = syncSourceByCalendarId.get(calendar.id) ?? null;
|
||||||
@@ -930,7 +931,6 @@ export default function CalendarPage({ settings, auth }: {settings: ApiSettings;
|
|||||||
</ToolbarGroup>
|
</ToolbarGroup>
|
||||||
|
|
||||||
<ToolbarGroup align="end" className="calendar-toolbar-right">
|
<ToolbarGroup align="end" className="calendar-toolbar-right">
|
||||||
<DocumentationHelpLink reference={CALENDAR_DOCUMENTATION} />
|
|
||||||
<AdminIconButton
|
<AdminIconButton
|
||||||
label="i18n:govoplan-calendar.refresh.56e3badc"
|
label="i18n:govoplan-calendar.refresh.56e3badc"
|
||||||
icon={<RefreshCw size={18} />}
|
icon={<RefreshCw size={18} />}
|
||||||
|
|||||||
@@ -125,10 +125,7 @@ export default function CalendarSettingsPanel({
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<ContentGrid columns={2} collapseAt="workspace" className="calendar-settings-panel">
|
<ContentGrid columns={2} collapseAt="workspace" className="calendar-settings-panel">
|
||||||
<div className="calendar-settings-documentation">
|
<Card title="Calendar display" titleHelp={<DocumentationHelpLink reference={CALENDAR_DOCUMENTATION} />}>
|
||||||
<DocumentationHelpLink reference={CALENDAR_DOCUMENTATION} />
|
|
||||||
</div>
|
|
||||||
<Card title="Calendar display">
|
|
||||||
<FormGrid columns={1} collapseAt="standard" className="">
|
<FormGrid columns={1} collapseAt="standard" className="">
|
||||||
<ToggleSwitch
|
<ToggleSwitch
|
||||||
label="Dim weekends"
|
label="Dim weekends"
|
||||||
|
|||||||
Reference in New Issue
Block a user