refactor(webui): adopt semantic workspace actions

This commit is contained in:
2026-08-19 18:47:45 +02:00
parent 2efe574f18
commit fd7f05ffc9
+19 -11
View File
@@ -1,7 +1,6 @@
import { Search } from "lucide-react"; import { Search } from "lucide-react";
import { useEffect, useMemo, useState, type FormEvent } from "react"; import { useEffect, useMemo, useState, type FormEvent } from "react";
import { ActionToolbar, import { Button,
Button,
DocumentationHelpLink, DocumentationHelpLink,
DismissibleAlert, DismissibleAlert,
FilterBar, FilterBar,
@@ -14,6 +13,7 @@ import { ActionToolbar,
StatusBadge, StatusBadge,
i18nMessage, i18nMessage,
useGuardedNavigate, useGuardedNavigate,
WorkspaceActionBar,
WorkspaceFrame, WorkspaceFrame,
type PlatformRouteContext type PlatformRouteContext
} from "@govoplan/core-webui"; } from "@govoplan/core-webui";
@@ -36,6 +36,7 @@ export default function CasesPage({ settings }: PlatformRouteContext) {
const [total, setTotal] = useState(0); const [total, setTotal] = useState(0);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [error, setError] = useState(""); const [error, setError] = useState("");
const [reloadKey, setReloadKey] = useState(0);
useEffect(() => { useEffect(() => {
const controller = new AbortController(); const controller = new AbortController();
@@ -61,7 +62,7 @@ export default function CasesPage({ settings }: PlatformRouteContext) {
}). }).
finally(() => setLoading(false)); finally(() => setLoading(false));
return () => controller.abort(); return () => controller.abort();
}, [settings, status, submittedQuery]); }, [reloadKey, settings, status, submittedQuery]);
const statusLabels = useMemo( const statusLabels = useMemo(
() => new Map(catalog.statuses.map((item) => [item.status_key, item])), () => new Map(catalog.statuses.map((item) => [item.status_key, item])),
@@ -80,8 +81,14 @@ export default function CasesPage({ settings }: PlatformRouteContext) {
return ( return (
<main className="cases-page"> <main className="cases-page">
<WorkspaceFrame className="cases-shell" label="Cases" interfaceId="cases.catalogue" helpContextId="cases.page.catalogue" helpModuleId="cases"> <WorkspaceFrame className="cases-shell" label="Cases" interfaceId="cases.catalogue" helpContextId="cases.page.catalogue" helpModuleId="cases">
<ActionToolbar surface="panel-header" className="cases-toolbar"> <WorkspaceActionBar
<FilterBar as="form" surface="control" wrap="never" width="default" className="cases-search" onSubmit={submit}> scope="collection-pane"
variant="collection"
refreshable
reloadAction={{ onReload: () => setReloadKey((value) => value + 1), loading }}
className="cases-toolbar"
contextActions={<>
<FilterBar as="form" surface="control" wrap="never" width="default" className="cases-search" onSubmit={submit}>
<Search size={17} aria-hidden="true" /> <Search size={17} aria-hidden="true" />
<input <input
value={query} value={query}
@@ -96,8 +103,8 @@ export default function CasesPage({ settings }: PlatformRouteContext) {
> >
Search Search
</Button> </Button>
</FilterBar> </FilterBar>
<label className="cases-status-filter"> <label className="cases-status-filter">
<span>Status</span> <span>Status</span>
<select value={status} onChange={(event) => setStatus(event.target.value)}> <select value={status} onChange={(event) => setStatus(event.target.value)}>
<option value="">All statuses</option> <option value="">All statuses</option>
@@ -105,10 +112,11 @@ export default function CasesPage({ settings }: PlatformRouteContext) {
<option key={item.status_key} value={item.status_key}>{item.label}</option> <option key={item.status_key} value={item.status_key}>{item.label}</option>
)} )}
</select> </select>
</label> </label>
<span className="cases-count">{i18nMessage("i18n:govoplan-cases.case_count", { value0: total })}</span> <span className="cases-count">{i18nMessage("i18n:govoplan-cases.case_count", { value0: total })}</span>
<DocumentationHelpLink reference={CASES_DOCUMENTATION} /> </>}
</ActionToolbar> helpAction={<DocumentationHelpLink reference={CASES_DOCUMENTATION} />}
/>
<PageScrollViewport className="cases-list-viewport"> <PageScrollViewport className="cases-list-viewport">
{error && {error &&
<DismissibleAlert tone="error" onDismiss={() => setError("")}> <DismissibleAlert tone="error" onDismiss={() => setError("")}>