diff --git a/web/src/components/confirm-delete-dialog.tsx b/web/src/components/confirm-delete-dialog.tsx index cc85e8153..22ac73fcb 100644 --- a/web/src/components/confirm-delete-dialog.tsx +++ b/web/src/components/confirm-delete-dialog.tsx @@ -45,7 +45,7 @@ export function ConfirmDeleteDialog({ const { t } = useTranslation(); if (hidden) { - return children; + return children || <>; } return ( @@ -54,7 +54,7 @@ export function ConfirmDeleteDialog({ open={open} defaultOpen={defaultOpen} > - {children} + {children && {children}} { e.stopPropagation(); @@ -109,23 +109,28 @@ export function ConfirmDeleteDialog({ export const ConfirmDeleteDialogNode = ({ avatar, name, + warnText, children, }: { avatar?: { avatar?: string; name?: string; isPerson?: boolean }; name?: string; + warnText?: string; children?: React.ReactNode; }) => { return ( -
- {avatar && ( - - )} - {name &&
{name}
} +
+
+ {avatar && ( + + )} + {name &&
{name}
} +
+ {warnText &&
{warnText}
} {children}
); diff --git a/web/src/components/dynamic-form.tsx b/web/src/components/dynamic-form.tsx index 2fdc55af0..2926f32b6 100644 --- a/web/src/components/dynamic-form.tsx +++ b/web/src/components/dynamic-form.tsx @@ -110,7 +110,7 @@ export interface DynamicFormRef { } // Generate Zod validation schema based on field configurations -const generateSchema = (fields: FormFieldConfig[]): ZodSchema => { +export const generateSchema = (fields: FormFieldConfig[]): ZodSchema => { const schema: Record = {}; const nestedSchemas: Record> = {}; @@ -311,6 +311,271 @@ const generateDefaultValues = ( return defaultValues as DefaultValues; }; +// Render form fields +export const RenderField = ({ + field, + labelClassName, +}: { + field: FormFieldConfig; + labelClassName?: string; +}) => { + const form = useFormContext(); + if (field.render) { + if (field.type === FormFieldType.Custom && field.hideLabel) { + return
{field.render({})}
; + } + return ( + + {(fieldProps) => { + const finalFieldProps = field.onChange + ? { + ...fieldProps, + onChange: (e: any) => { + fieldProps.onChange(e); + field.onChange?.(e.target?.value ?? e); + }, + } + : fieldProps; + return field.render?.(finalFieldProps); + }} + + ); + } + switch (field.type) { + case FormFieldType.Textarea: + return ( + + {(fieldProps) => { + const finalFieldProps = field.onChange + ? { + ...fieldProps, + onChange: (e: any) => { + fieldProps.onChange(e); + field.onChange?.(e.target.value); + }, + } + : fieldProps; + return ( +