diff --git a/webui/src/features/admin/RolesPanel.tsx b/webui/src/features/admin/RolesPanel.tsx index e25fd98..56ffa01 100644 --- a/webui/src/features/admin/RolesPanel.tsx +++ b/webui/src/features/admin/RolesPanel.tsx @@ -8,7 +8,7 @@ import { Dialog } from "@govoplan/core-webui"; import { FormField } from "@govoplan/core-webui"; import { StatusBadge } from "@govoplan/core-webui"; import { ConfirmDialog } from "@govoplan/core-webui"; -import { AdminIconButton, AdminPageLayout, TableActionGroup, adminErrorMessage } from "@govoplan/core-webui"; +import { AdminIconButton, AdminPageLayout, AdminSelectionList, TableActionGroup, adminErrorMessage } from "@govoplan/core-webui"; import { hasTenantWildcard, i18nMessage, useDeltaWatermarks, useUnsavedDraftGuard } from "@govoplan/core-webui"; import { loadDeltaRows } from "./utils/deltaRows"; @@ -78,10 +78,12 @@ export default function RolesPanel({ settings, auth, canDefine, onAuthRefresh }: setDraft(emptyDraft); setSavedDraftKey(draftKey(emptyDraft)); } - function togglePermission(scope: string, checked: boolean) { - const next = new Set(draft.permissions); - if (checked) next.add(scope);else next.delete(scope); - setDraft({ ...draft, permissions: Array.from(next) }); + function setPermissionGroup(scopes: string[], selected: string[]) { + const groupScopes = new Set(scopes); + setDraft({ + ...draft, + permissions: [...draft.permissions.filter((scope) => !groupScopes.has(scope)), ...selected] + }); } async function save(): Promise { @@ -142,7 +144,10 @@ export default function RolesPanel({ settings, auth, canDefine, onAuthRefresh }: