import { useMemo, useState } from "react"; import { Button, Dialog, DocumentationHelpLink, DismissibleAlert, FormField, ToggleSwitch, useUnsavedChanges, useUnsavedDraftGuard, type ApiSettings } from "@govoplan/core-webui"; import { createApproval, type ApprovalDraft, type ApprovalRequest } from "../../api/approvals"; import ApprovalStepsEditor, { emptyApprovalStep } from "./ApprovalStepsEditor"; import { APPROVALS_FIELD_DOCUMENTATION, APPROVALS_I18N } from "./interfacePatterns"; export default function ApprovalRequestDialog({ settings, onClose, onSaved }: { settings: ApiSettings; onClose: () => void; onSaved: (value: ApprovalRequest) => void }) { const [baseline] = useState(() => initialDraft()); const [draft, setDraft] = useState(baseline); const [busy, setBusy] = useState(false); const [error, setError] = useState(""); const { requestDiscard } = useUnsavedChanges(); const valid = useMemo(() => Boolean(draft.title.trim() && draft.subject_module.trim() && draft.subject_type.trim() && draft.subject_id.trim() && /^[0-9a-f]{64}$/.test(draft.subject_digest) && draft.steps.every((step) => step.key.trim() && step.label.trim() && step.selectors.every((selector) => selector.value.trim()))), [draft]); const dirty = draftKey(draft) !== draftKey(baseline); async function save(): Promise { setBusy(true); setError(""); try { onSaved(await createApproval(settings, draft)); return true; } catch (reason) { setError(reason instanceof Error ? reason.message : "The Approval request could not be created."); return false; } finally { setBusy(false); } } useUnsavedDraftGuard({ dirty, onSave: save, onDiscard: () => setDraft(baseline), title: "i18n:govoplan-approvals.unsaved_title", message: "i18n:govoplan-approvals.unsaved_message" }); function requestClose() { if (busy) return; if (dirty) requestDiscard(onClose); else onClose(); } return }>
{error && {error}}
setDraft({ ...draft, title: event.target.value })} /> setDraft({ ...draft, subject_module: event.target.value })} /> setDraft({ ...draft, subject_type: event.target.value })} /> setDraft({ ...draft, subject_id: event.target.value })} /> setDraft({ ...draft, subject_version: event.target.value })} /> setDraft({ ...draft, subject_digest: event.target.value.trim().toLowerCase() })} />