Adopt shared WebUI layout primitives

This commit is contained in:
2026-08-18 10:42:52 +02:00
parent 9bcd2de587
commit e9e8783cbd
2 changed files with 16 additions and 16 deletions
@@ -1,6 +1,6 @@
import { useCallback, useEffect, useMemo, useRef, useState, type FormEvent } from "react"; import { useCallback, useEffect, useMemo, useRef, useState, type FormEvent } from "react";
import { Check, Eye, Plus, RotateCcw, Undo2, X } from "lucide-react"; import { Check, Eye, Plus, RotateCcw, Undo2, X } from "lucide-react";
import { import { FormLayout,
AdminIconButton, AdminIconButton,
ApiError, ApiError,
Button, Button,
@@ -360,15 +360,15 @@ export default function FunctionAssignmentChangesPanel({ settings, auth, model,
</LoadingFrame> </LoadingFrame>
</Card> </Card>
<Dialog <Dialog variant="administration" size="wide"
open={createOpen} open={createOpen}
title="Start governed function change" title="Start governed function change"
className="admin-dialog admin-dialog-wide idm-change-dialog" className="idm-change-dialog"
onClose={closeCreate} onClose={closeCreate}
closeDisabled={busy} closeDisabled={busy}
footer={<><Button type="button" onClick={closeCreate} disabled={busy} disabledReason={idmDisabledReason(false, busy)}>Cancel</Button><Button type="submit" form="idm-change-create" variant="primary" disabled={busy || !draft.functionId || !draft.identityId || !draft.justification.trim()} disabledReason={idmDisabledReason(false, busy) ?? ((!draft.functionId || !draft.identityId || !draft.justification.trim()) ? IDM_INTERFACE_I18N.incomplete : undefined)}>Submit</Button></>} footer={<><Button type="button" onClick={closeCreate} disabled={busy} disabledReason={idmDisabledReason(false, busy)}>Cancel</Button><Button type="submit" form="idm-change-create" variant="primary" disabled={busy || !draft.functionId || !draft.identityId || !draft.justification.trim()} disabledReason={idmDisabledReason(false, busy) ?? ((!draft.functionId || !draft.identityId || !draft.justification.trim()) ? IDM_INTERFACE_I18N.incomplete : undefined)}>Submit</Button></>}
> >
<form id="idm-change-create" className="admin-form-grid two-columns" onSubmit={(event) => void submit(event)}> <FormLayout columns={2} gap="small" collapseAt="workspace" id="idm-change-create" className="" onSubmit={(event) => void submit(event)}>
<div className="wide"> <div className="wide">
<SegmentedControl <SegmentedControl
ariaLabel="Function change kind" ariaLabel="Function change kind"
@@ -414,10 +414,10 @@ export default function FunctionAssignmentChangesPanel({ settings, auth, model,
<textarea rows={3} value={draft.evidence} onChange={(event) => setDraft((current) => ({ ...current, evidence: event.target.value }))} disabled={busy} /> <textarea rows={3} value={draft.evidence} onChange={(event) => setDraft((current) => ({ ...current, evidence: event.target.value }))} disabled={busy} />
</FormField> </FormField>
</div> </div>
</form> </FormLayout>
</Dialog> </Dialog>
<Dialog <Dialog variant="administration" size="wide"
open={detailOpen && selected !== null} open={detailOpen && selected !== null}
title={selected title={selected
? i18nMessage( ? i18nMessage(
@@ -427,7 +427,7 @@ export default function FunctionAssignmentChangesPanel({ settings, auth, model,
{ function: functionById.get(selected.function_id)?.name ?? selected.function_id } { function: functionById.get(selected.function_id)?.name ?? selected.function_id }
) )
: "Function change"} : "Function change"}
className="admin-dialog admin-dialog-wide idm-change-dialog" className="idm-change-dialog"
onClose={() => !busy && setDetailOpen(false)} onClose={() => !busy && setDetailOpen(false)}
closeDisabled={busy} closeDisabled={busy}
footer={<Button type="button" onClick={() => setDetailOpen(false)} disabled={busy} disabledReason={idmDisabledReason(false, busy)}>Close</Button>} footer={<Button type="button" onClick={() => setDetailOpen(false)} disabled={busy} disabledReason={idmDisabledReason(false, busy)}>Close</Button>}
+9 -9
View File
@@ -1,6 +1,6 @@
import { useCallback, useEffect, useMemo, useRef, useState, type FormEvent } from "react"; import { useCallback, useEffect, useMemo, useRef, useState, type FormEvent } from "react";
import { Edit3, Plus, RefreshCw } from "lucide-react"; import { Edit3, Plus, RefreshCw } from "lucide-react";
import { import { FormLayout, ActionToolbar,
ActionBlockerHint, ActionBlockerHint,
AdminIconButton, AdminIconButton,
ApiError, ApiError,
@@ -624,7 +624,7 @@ export default function IdmPage({ settings, auth }: IdmPageProps) {
<PageTitle loading={loading}>i18n:govoplan-idm.idm.61f4a7a2</PageTitle> <PageTitle loading={loading}>i18n:govoplan-idm.idm.61f4a7a2</PageTitle>
<p>i18n:govoplan-idm.identity_links_intro.45fed9dd</p> <p>i18n:govoplan-idm.identity_links_intro.45fed9dd</p>
</div> </div>
<div className="idm-toolbar"> <ActionToolbar className="idm-toolbar">
<DocumentationHelpLink reference={IDM_DOCUMENTATION} /> <DocumentationHelpLink reference={IDM_DOCUMENTATION} />
<Button <Button
type="button" type="button"
@@ -635,7 +635,7 @@ export default function IdmPage({ settings, auth }: IdmPageProps) {
> >
<RefreshCw size={16} aria-hidden="true" /> i18n:govoplan-idm.reload.870ca3ec <RefreshCw size={16} aria-hidden="true" /> i18n:govoplan-idm.reload.870ca3ec
</Button> </Button>
</div> </ActionToolbar>
</div> </div>
{error && <DismissibleAlert tone="danger" resetKey={error} floating>{error}</DismissibleAlert>} {error && <DismissibleAlert tone="danger" resetKey={error} floating>{error}</DismissibleAlert>}
@@ -682,7 +682,7 @@ export default function IdmPage({ settings, auth }: IdmPageProps) {
collapseKey="idm.governance" collapseKey="idm.governance"
actions={<DocumentationHelpLink reference={IDM_GOVERNANCE_DOCUMENTATION} />} actions={<DocumentationHelpLink reference={IDM_GOVERNANCE_DOCUMENTATION} />}
> >
<form className="admin-form-grid two-columns" onSubmit={(event) => { event.preventDefault(); void submitSettings(); }}> <FormLayout columns={2} gap="small" collapseAt="workspace" className="" onSubmit={(event) => { event.preventDefault(); void submitSettings(); }}>
<div className="idm-check-list wide"> <div className="idm-check-list wide">
<ToggleSwitch label="i18n:govoplan-idm.require_assignment_change_requests.697718a1" checked={settingsDraft.require_assignment_change_requests} disabled={!canManageSettings || busy} help={idmDisabledReason(false, busy, canManageSettings)} onChange={(require_assignment_change_requests) => setSettingsDraft({ ...settingsDraft, require_assignment_change_requests })} /> <ToggleSwitch label="i18n:govoplan-idm.require_assignment_change_requests.697718a1" checked={settingsDraft.require_assignment_change_requests} disabled={!canManageSettings || busy} help={idmDisabledReason(false, busy, canManageSettings)} onChange={(require_assignment_change_requests) => setSettingsDraft({ ...settingsDraft, require_assignment_change_requests })} />
</div> </div>
@@ -716,7 +716,7 @@ export default function IdmPage({ settings, auth }: IdmPageProps) {
i18n:govoplan-idm.save_settings.4602c430 i18n:govoplan-idm.save_settings.4602c430
</Button> </Button>
</div> </div>
</form> </FormLayout>
</Card> </Card>
)} )}
@@ -748,12 +748,12 @@ export default function IdmPage({ settings, auth }: IdmPageProps) {
function renderAssignmentDialog() { function renderAssignmentDialog() {
const formId = "idm-assignment-editor"; const formId = "idm-assignment-editor";
return ( return (
<Dialog <Dialog variant="administration" size="wide"
open={assignmentEditorOpen} open={assignmentEditorOpen}
title={editingAssignmentId ? "i18n:govoplan-idm.update_assignment.e20f52aa" : "i18n:govoplan-idm.add_assignment.08f2a0d5"} title={editingAssignmentId ? "i18n:govoplan-idm.update_assignment.e20f52aa" : "i18n:govoplan-idm.add_assignment.08f2a0d5"}
onClose={closeAssignmentEditor} onClose={closeAssignmentEditor}
closeDisabled={busy} closeDisabled={busy}
className="admin-dialog admin-dialog-wide idm-editor-dialog" className="idm-editor-dialog"
footer={( footer={(
<> <>
<Button type="button" onClick={closeAssignmentEditor} disabled={busy} disabledReason={idmDisabledReason(false, busy)}>i18n:govoplan-idm.cancel_edit.ea4781e0</Button> <Button type="button" onClick={closeAssignmentEditor} disabled={busy} disabledReason={idmDisabledReason(false, busy)}>i18n:govoplan-idm.cancel_edit.ea4781e0</Button>
@@ -769,7 +769,7 @@ export default function IdmPage({ settings, auth }: IdmPageProps) {
</> </>
)} )}
> >
<form id={formId} className="admin-form-grid two-columns" onSubmit={(event) => void submitAssignment(event)}> <FormLayout columns={2} gap="small" collapseAt="workspace" id={formId} className="" onSubmit={(event) => void submitAssignment(event)}>
<FormField label="i18n:govoplan-idm.identity_search.d3460fcf" documentation={IDM_FIELD_DOCUMENTATION}> <FormField label="i18n:govoplan-idm.identity_search.d3460fcf" documentation={IDM_FIELD_DOCUMENTATION}>
<input <input
value={identitySearch} value={identitySearch}
@@ -886,7 +886,7 @@ export default function IdmPage({ settings, auth }: IdmPageProps) {
{identityLoading && <p className="idm-muted wide">i18n:govoplan-idm.loading_identities.f3b84693</p>} {identityLoading && <p className="idm-muted wide">i18n:govoplan-idm.loading_identities.f3b84693</p>}
{actingForLoading && <p className="idm-muted wide">i18n:govoplan-idm.loading_acting_for_accounts.c9894b1e</p>} {actingForLoading && <p className="idm-muted wide">i18n:govoplan-idm.loading_acting_for_accounts.c9894b1e</p>}
{!model.functions.length && <p className="idm-muted wide">i18n:govoplan-idm.no_functions_available.51ba08eb</p>} {!model.functions.length && <p className="idm-muted wide">i18n:govoplan-idm.no_functions_available.51ba08eb</p>}
</form> </FormLayout>
</Dialog> </Dialog>
); );
} }