"use client"; import { SettingsSection, SettingsSectionBody, SettingsSectionDescription, SettingsSectionForm, SettingsSectionHeader, SettingsSectionTitle } from "@app/components/Settings"; import { zodResolver } from "@hookform/resolvers/zod"; import { SwitchInput } from "@app/components/SwitchInput"; import { Tag, TagInput } from "@app/components/tags/tag-input"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "@app/components/ui/form"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@app/components/ui/select"; import { createPolicySchema, type PolicyFormValues } from "."; import { useTranslations } from "next-intl"; import { useEffect, useState } from "react"; import { type UseFormReturn, useForm, useWatch } from "react-hook-form"; // ─── CreatePolicyUsersRolesSectionForm ──────────────────────────────────────── export type CreatePolicyUsersRolesSectionFormProps = { form: UseFormReturn; allRoles: { id: string; text: string }[]; allUsers: { id: string; text: string }[]; allIdps: { id: number; text: string }[]; }; export function CreatePolicyUsersRolesSectionForm({ form: parentForm, allRoles, allUsers, allIdps }: CreatePolicyUsersRolesSectionFormProps) { const t = useTranslations(); const form = useForm({ resolver: zodResolver( createPolicySchema.pick({ sso: true, skipToIdpId: true, roles: true, users: true }) ), defaultValues: { sso: true, skipToIdpId: null, roles: [], users: [] } }); useEffect(() => { const subscription = form.watch((values) => { parentForm.setValue("sso", values.sso as boolean); parentForm.setValue("skipToIdpId", values.skipToIdpId as number | null); parentForm.setValue("roles", values.roles as [Tag, ...Tag[]]); parentForm.setValue("users", values.users as [Tag, ...Tag[]]); }); return () => subscription.unsubscribe(); }, [form, parentForm]); const ssoEnabled = useWatch({ control: form.control, name: "sso" }); const selectedIdpId = useWatch({ control: form.control, name: "skipToIdpId" }); const [activeRolesTagIndex, setActiveRolesTagIndex] = useState< number | null >(null); const [activeUsersTagIndex, setActiveUsersTagIndex] = useState< number | null >(null); return (
{t("resourceUsersRoles")} {t("resourcePolicyUsersRolesDescription")} { form.setValue("sso", val); }} /> {ssoEnabled && ( <> ( {t("roles")} { form.setValue( "roles", newRoles as [ Tag, ...Tag[] ] ); }} enableAutocomplete={true} autocompleteOptions={allRoles} allowDuplicates={false} restrictTagsToAutocompleteOptions={ true } sortTags={true} /> {t("resourceRoleDescription")} )} /> ( {t("users")} { form.setValue( "users", newUsers as [ Tag, ...Tag[] ] ); }} enableAutocomplete={true} autocompleteOptions={allUsers} allowDuplicates={false} restrictTagsToAutocompleteOptions={ true } sortTags={true} /> )} /> )} {ssoEnabled && allIdps.length > 0 && (

{t("defaultIdentityProviderDescription")}

)}
); }