Add governed public form intake

This commit is contained in:
2026-08-06 12:42:20 +02:00
parent d4bbdd079f
commit 3c292b8c07
25 changed files with 4715 additions and 47 deletions
+13 -2
View File
@@ -1,4 +1,4 @@
import { RefreshCw } from "lucide-react";
import { Link2, RefreshCw } from "lucide-react";
import { useCallback, useEffect, useState } from "react";
import {
Button,
@@ -7,6 +7,7 @@ import {
LoadingIndicator,
PageScrollViewport,
StatusBadge,
hasScope,
i18nMessage,
useGuardedNavigate,
usePlatformLanguage,
@@ -14,11 +15,12 @@ import {
} from "@govoplan/core-webui";
import { listFormInstances, type FormInstance } from "../../api/formsRuntime";
import { FORMS_RUNTIME_DOCUMENTATION, FORMS_RUNTIME_I18N } from "./interfacePatterns";
import IntakeProfilesDialog from "./IntakeProfilesDialog";
const OPEN_STATUSES = ["started", "draft", "submitted", "validated", "needs_review"];
export default function FormsRuntimePage({ settings }: PlatformRouteContext) {
export default function FormsRuntimePage({ settings, auth }: PlatformRouteContext) {
const navigate = useGuardedNavigate();
const { language } = usePlatformLanguage();
const [items, setItems] = useState<FormInstance[]>([]);
@@ -26,6 +28,8 @@ export default function FormsRuntimePage({ settings }: PlatformRouteContext) {
const [status, setStatus] = useState("open");
const [loading, setLoading] = useState(true);
const [error, setError] = useState("");
const [intakeOpen, setIntakeOpen] = useState(false);
const canAdmin = hasScope(auth, "forms_runtime:workspace:admin");
const load = useCallback((signal?: AbortSignal) => {
setLoading(true);
@@ -59,6 +63,12 @@ export default function FormsRuntimePage({ settings }: PlatformRouteContext) {
<RefreshCw size={16} aria-hidden="true" />
Refresh
</Button>
{canAdmin &&
<Button onClick={() => setIntakeOpen(true)}>
<Link2 size={16} aria-hidden="true" />
Public intake
</Button>
}
<label>
<span>Status</span>
<select value={status} onChange={(event) => setStatus(event.target.value)}>
@@ -107,6 +117,7 @@ export default function FormsRuntimePage({ settings }: PlatformRouteContext) {
}
</PageScrollViewport>
</div>
<IntakeProfilesDialog open={intakeOpen} settings={settings} onClose={() => setIntakeOpen(false)} />
</main>
);
}