|
@@ -1,25 +1,34 @@
|
|
|
-import {
|
|
|
|
|
- FormControl,
|
|
|
|
|
- FormDescription,
|
|
|
|
|
- FormItem,
|
|
|
|
|
- FormLabel,
|
|
|
|
|
- FormMessage,
|
|
|
|
|
- FormField,
|
|
|
|
|
-} from '../ui/form.js';
|
|
|
|
|
-import { FieldValues, FieldPath } from 'react-hook-form';
|
|
|
|
|
|
|
+import { FieldPath, FieldValues } from 'react-hook-form';
|
|
|
|
|
+import { FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from '../ui/form.js';
|
|
|
|
|
|
|
|
export type FormFieldWrapperProps<
|
|
export type FormFieldWrapperProps<
|
|
|
TFieldValues extends FieldValues = FieldValues,
|
|
TFieldValues extends FieldValues = FieldValues,
|
|
|
- TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
|
|
|
|
|
|
|
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
|
> = React.ComponentProps<typeof FormField<TFieldValues, TName>> & {
|
|
> = React.ComponentProps<typeof FormField<TFieldValues, TName>> & {
|
|
|
label?: React.ReactNode;
|
|
label?: React.ReactNode;
|
|
|
description?: React.ReactNode;
|
|
description?: React.ReactNode;
|
|
|
|
|
+ /**
|
|
|
|
|
+ * @description
|
|
|
|
|
+ * Whether to render the form control.
|
|
|
|
|
+ * If false, the form control will not be rendered.
|
|
|
|
|
+ * This is useful when you want to render the form control in a custom way, e.g. for <Select/> components,
|
|
|
|
|
+ * where the FormControl needs to nested in the root component.
|
|
|
|
|
+ * @default true
|
|
|
|
|
+ */
|
|
|
|
|
+ renderFormControl?: boolean;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
export function FormFieldWrapper<
|
|
export function FormFieldWrapper<
|
|
|
TFieldValues extends FieldValues = FieldValues,
|
|
TFieldValues extends FieldValues = FieldValues,
|
|
|
- TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
|
|
|
|
|
->({ control, name, render, label, description }: FormFieldWrapperProps<TFieldValues, TName>) {
|
|
|
|
|
|
|
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
|
|
|
|
|
+>({
|
|
|
|
|
+ control,
|
|
|
|
|
+ name,
|
|
|
|
|
+ render,
|
|
|
|
|
+ label,
|
|
|
|
|
+ description,
|
|
|
|
|
+ renderFormControl = true,
|
|
|
|
|
+}: FormFieldWrapperProps<TFieldValues, TName>) {
|
|
|
return (
|
|
return (
|
|
|
<FormField
|
|
<FormField
|
|
|
control={control}
|
|
control={control}
|
|
@@ -27,7 +36,7 @@ export function FormFieldWrapper<
|
|
|
render={renderArgs => (
|
|
render={renderArgs => (
|
|
|
<FormItem>
|
|
<FormItem>
|
|
|
{label && <FormLabel>{label}</FormLabel>}
|
|
{label && <FormLabel>{label}</FormLabel>}
|
|
|
- <FormControl>{render(renderArgs)}</FormControl>
|
|
|
|
|
|
|
+ {renderFormControl ? <FormControl>{render(renderArgs)}</FormControl> : render(renderArgs)}
|
|
|
{description && <FormDescription>{description}</FormDescription>}
|
|
{description && <FormDescription>{description}</FormDescription>}
|
|
|
<FormMessage />
|
|
<FormMessage />
|
|
|
</FormItem>
|
|
</FormItem>
|