Release govoplan-scheduling v0.1.22: unify interface contracts and documentation

This commit is contained in:
2026-09-08 01:32:52 +02:00
parent 44e53ce2ce
commit 2081bd18c3
8 changed files with 39 additions and 68 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@govoplan/scheduling-webui",
"version": "0.1.21",
"version": "0.1.22",
"private": true,
"type": "module",
"main": "src/index.ts",
@@ -18,7 +18,7 @@
"test:ui-structure": "node scripts/test-scheduling-page-structure.mjs"
},
"peerDependencies": {
"@govoplan/core-webui": "^0.1.18",
"@govoplan/core-webui": "^0.1.45",
"lucide-react": "^1.23.0",
"react": ">=19.2.7 <20",
"react-dom": ">=19.2.7 <20",
@@ -26,7 +26,12 @@ assert.match(page, /ActionBlockerHint,[\s\S]*DocumentationHelpLink,[\s\S]*StageR
assert.match(page, /className="scheduling-workspace-layout"/);
assert.match(page, /<aside className="scheduling-request-sidebar">/);
assert.match(page, /<section className="scheduling-main-panel">/);
assert.match(page, /title=\{I18N\.requests\}[\s\S]*<Plus aria-hidden="true" size=\{16\} \/> \{I18N\.add\}/);
const workspaceBar = page.slice(page.indexOf('<section className="scheduling-workspace">'), page.indexOf('<div className="scheduling-workspace-layout">'));
assert.match(workspaceBar, /scope="workspace"[\s\S]*variant="collection"[\s\S]*reloadAction=/);
assert.match(workspaceBar, /createAction=\{<Button[\s\S]*disabled=\{!canCreateOrWrite \|\| saving\}[\s\S]*I18N\.newRequest/);
assert.doesNotMatch(workspaceBar, /createAction=\{canCreateOrWrite \?/);
assert.match(workspaceBar, /!canCreateOrWrite \? I18N\.createPermissionRequired : undefined/);
assert.doesNotMatch(page, /scheduling-sidebar-actions/);
assert.match(page, /title=\{I18N\.myRequests\}/);
assert.match(page, /title=\{I18N\.invitedRequests\}/);
assert.ok(page.indexOf("title={I18N.myRequests}") < page.indexOf("title={I18N.invitedRequests}"));
@@ -140,6 +140,7 @@ const I18N = {
actions: "i18n:govoplan-core.actions.c3cd636a",
add: "i18n:govoplan-core.add.61cc55aa",
addRequest: "i18n:govoplan-scheduling.add_scheduling_request.3c71be15",
createPermissionRequired: "i18n:govoplan-scheduling.create_permission_required",
addParticipant: "i18n:govoplan-scheduling.add_participant.6cff957d",
addSlot: "i18n:govoplan-scheduling.add_slot.9fcff3ed",
answered: "i18n:govoplan-scheduling.answered.e0aafffa",
@@ -933,39 +934,17 @@ export default function SchedulingPage({ settings, auth }: { settings: ApiSettin
return (
<WorkspaceFrame as="main" height="viewport" surface="plain" className="scheduling-page" label="Scheduling workspace">
<section className="scheduling-workspace">
<WorkspaceActionBar
scope="workspace"
variant="collection"
refreshable
reloadAction={{ onReload: () => void loadRequests(selected?.id), loading: loading || saving, disabledReason: saving ? I18N.saving : undefined, label: I18N.refresh }}
helpAction={<DocumentationHelpLink reference={{ topicId: "scheduling.find-and-decide-meeting-time", documentationType: "user" }} />}
createAction={<Button type="button" variant="primary" onClick={beginCreate} disabled={!canCreateOrWrite || saving} disabledReason={saving ? I18N.saving : !canCreateOrWrite ? I18N.createPermissionRequired : undefined}><Plus aria-hidden="true" size={16} /> {I18N.newRequest}</Button>}
/>
<div className="scheduling-workspace-layout">
<aside className="scheduling-request-sidebar">
<Card
title={I18N.requests}
actions={(
<WorkspaceActionBar
scope="collection-pane"
variant="collection"
refreshable
reloadAction={{
onReload: () => void loadRequests(selected?.id),
loading: loading || saving,
disabledReason: saving ? I18N.saving : undefined,
label: I18N.refresh
}}
className="scheduling-sidebar-actions"
helpAction={<DocumentationHelpLink
reference={{
topicId: "scheduling.find-and-decide-meeting-time",
documentationType: "user"
}} />}
createAction={canCreateOrWrite ? (
<Button
type="button"
variant="primary"
onClick={beginCreate}
disabled={saving}
disabledReason={saving ? I18N.saving : undefined}>
<Plus aria-hidden="true" size={16} /> {I18N.add}
</Button>
) : undefined}
/>
)}>
<Card title={I18N.requests}>
{loading ? <p className="scheduling-note" role="status">{I18N.loading}</p> : null}
<RequestGroup
title={I18N.myRequests}
@@ -1003,7 +982,6 @@ export default function SchedulingPage({ settings, auth }: { settings: ApiSettin
scope="editor-pane"
variant="editor"
state={saving ? "saving" : draftDirty && !title.trim() ? "invalid" : draftDirty ? "dirty" : "clean"}
className="scheduling-page-header"
contextActions={<div className="scheduling-page-title">
<CalendarCheck aria-hidden="true" size={20} />
<div>
+2
View File
@@ -206,6 +206,7 @@ export const generatedTranslations = {
"i18n:govoplan-scheduling.the_response_replaces_your_previous_availability_choices.74c16d53": "The response replaces your previous availability choices.",
"i18n:govoplan-scheduling.title.768e0c1c": "Title",
"i18n:govoplan-scheduling.unavailable.2c9c1f79": "Unavailable",
"i18n:govoplan-scheduling.create_permission_required": "Creating a scheduling request requires Scheduling write or administration permission. Ask an Access or tenant administrator to grant it.",
"i18n:govoplan-scheduling.unchecked.1b927dec": "Unchecked",
"i18n:govoplan-scheduling.update_response.346233cf": "Update response",
"i18n:govoplan-scheduling.use_a_calendar_for_availability_checks_tentative_holds_a.20ccc1fa": "Use a calendar for availability checks, tentative holds, and the final event.",
@@ -424,6 +425,7 @@ export const generatedTranslations = {
"i18n:govoplan-scheduling.the_response_replaces_your_previous_availability_choices.74c16d53": "Die Antwort ersetzt Ihre vorherige Verfügbarkeitsauswahl.",
"i18n:govoplan-scheduling.title.768e0c1c": "Titel",
"i18n:govoplan-scheduling.unavailable.2c9c1f79": "Nicht verfügbar",
"i18n:govoplan-scheduling.create_permission_required": "Zum Anlegen einer Terminanfrage benötigen Sie Schreib- oder Administrationsrechte für Scheduling. Bitten Sie die Access- oder Mandantenadministration um diese Berechtigung.",
"i18n:govoplan-scheduling.unchecked.1b927dec": "Nicht geprüft",
"i18n:govoplan-scheduling.update_response.346233cf": "Antwort aktualisieren",
"i18n:govoplan-scheduling.use_a_calendar_for_availability_checks_tentative_holds_a.20ccc1fa": "Einen Kalender für Verfügbarkeitsprüfungen, vorläufige Reservierungen und den endgültigen Termin verwenden.",
-29
View File
@@ -145,18 +145,6 @@
padding: 10px 12px;
}
.scheduling-sidebar-actions {
display: flex;
align-items: center;
gap: 6px;
}
.scheduling-sidebar-actions .btn {
display: inline-flex;
align-items: center;
gap: 5px;
}
.scheduling-main-panel {
display: flex;
flex-direction: column;
@@ -176,18 +164,6 @@
overflow: hidden;
}
.scheduling-page-header {
min-height: 58px;
flex: 0 0 auto;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 14px;
border-bottom: var(--border-line);
background: var(--panel-header);
}
.scheduling-page-title,
.scheduling-page-actions,
.scheduling-card-actions,
@@ -468,11 +444,6 @@
border-bottom: var(--border-line);
}
.scheduling-page-header {
align-items: flex-start;
flex-wrap: wrap;
}
.scheduling-page-actions,
.scheduling-card-actions,
.scheduling-actions {