import { Control, DeepPartial, FieldValues, Path, SubmitHandler, useForm, } from "react-hook-form"; import { H4 } from "@components/UI/Typography/H4.js"; import { Subtle } from "@components/UI/Typography/Subtle.js"; import { DynamicFormField, FieldProps } from "./DynamicFormField.js"; import { FieldWrapper } from "./FormWrapper.js"; import { Button } from "../UI/Button.js"; interface DisabledBy { fieldName: Path; selector?: number; invert?: boolean; } export interface BaseFormBuilderProps { name: Path; disabledBy?: DisabledBy[]; label: string; description?: string; properties?: {}; } export interface GenericFormElementProps { control: Control; disabled?: boolean; field: Y; } export interface DynamicFormProps { onSubmit: SubmitHandler; submitType?: "onChange" | "onSubmit"; hasSubmitButton?: boolean; defaultValues?: DeepPartial; fieldGroups: { label: string; description: string; fields: FieldProps[]; }[]; } export function DynamicForm({ onSubmit, submitType = "onChange", hasSubmitButton, defaultValues, fieldGroups, }: DynamicFormProps) { const { handleSubmit, control, getValues } = useForm({ mode: submitType, defaultValues: defaultValues, }); const isDisabled = (disabledBy?: DisabledBy[]): boolean => { if (!disabledBy) return false; return disabledBy.some((field) => { const value = getValues(field.fieldName); if (typeof value === "boolean") return field.invert ? value : !value; if (typeof value === "number") return field.invert ? field.selector !== value : field.selector === value; return false; }); }; return (
{fieldGroups.map((fieldGroup, index) => (

{fieldGroup.label}

{fieldGroup.description}
{fieldGroup.fields.map((field, index) => ( ))}
))} {hasSubmitButton && }
); }