diff --git a/src/Fields/FieldWrapper.tsx b/src/Fields/FieldWrapper.tsx index f726a326..cefa8de1 100644 --- a/src/Fields/FieldWrapper.tsx +++ b/src/Fields/FieldWrapper.tsx @@ -5,7 +5,6 @@ import { UseControllerProps, FieldPathValue, FieldPath, - UnpackNestedValue, } from 'react-hook-form'; import { Form, FormItemProps } from '../Form'; @@ -14,20 +13,20 @@ import { useFieldContext } from './FieldProvider'; export type FieldWrapperProps< TFieldValues extends FieldValues, - TName extends FieldPath, + TFieldPath extends FieldPath, > = { children: ReactNode; - controller: UseControllerProps; - formItem?: FormItemProps< - UnpackNestedValue> - >; + controller: UseControllerProps; + formItem?: FormItemProps>; }; export function FieldWrapper< TFieldValues extends FieldValues, - TName extends FieldPath, ->(props: FieldWrapperProps) { - const { fieldState } = useController(props.controller); + TFieldPath extends FieldPath, +>(props: FieldWrapperProps) { + const { fieldState } = useController( + props.controller, + ); const { formItemProps } = useFieldContext(); diff --git a/src/Fields/SelectField.tsx b/src/Fields/SelectField.tsx index c4c10ae7..511f7446 100644 --- a/src/Fields/SelectField.tsx +++ b/src/Fields/SelectField.tsx @@ -1,4 +1,3 @@ -import { BaseOptionType, DefaultOptionType } from 'antd/lib/select'; import React from 'react'; import { useController, @@ -6,38 +5,41 @@ import { FieldPathValue, FieldValues, UseControllerProps, - UnpackNestedValue, } from 'react-hook-form'; -import { Select, SelectProps } from '../Select'; +import { Select, SelectProps, MaybeGroupedInputOption } from '../Select'; import { useFieldContext } from './FieldProvider'; import { FieldWrapper, FieldWrapperProps } from './FieldWrapper'; +type UnpackArray = T extends Array ? U : T; + type SelectFieldProps< TFieldValues extends FieldValues, - TName extends FieldPath, - TOption extends BaseOptionType | DefaultOptionType, -> = UseControllerProps & - Pick, 'formItem'> & { - component?: SelectProps< - UnpackNestedValue>, - TOption - >; + TFieldPath extends FieldPath, + TFieldPathValue extends UnpackArray>, + TOption extends MaybeGroupedInputOption, +> = UseControllerProps & + Pick, 'formItem'> & { + component?: SelectProps; }; export function SelectField< TFieldValues extends FieldValues = FieldValues, - TName extends FieldPath = FieldPath, - TOption extends BaseOptionType | DefaultOptionType = DefaultOptionType, + TFieldPath extends FieldPath = FieldPath, + TFieldPathValue extends UnpackArray< + FieldPathValue + > = UnpackArray>, + TOption extends + MaybeGroupedInputOption = MaybeGroupedInputOption, >({ formItem, component, ...controller -}: SelectFieldProps) { +}: SelectFieldProps) { const { field: { onChange, ...fieldProps }, - } = useController(controller); + } = useController(controller); const { disabled } = useFieldContext(); diff --git a/src/Fields/index.stories.tsx b/src/Fields/index.stories.tsx index 5e44de38..3043b8db 100644 --- a/src/Fields/index.stories.tsx +++ b/src/Fields/index.stories.tsx @@ -31,11 +31,12 @@ export default { type FormType = { autocomplete: string; checkbox: boolean; - checkboxGroup: Array; + checkbox_group: Array; input: string; input_number: number; radio_group: 1 | 2; select: 'a' | 'b'; + select_multiple: Array; switch: boolean; text_area: string; date_range: string; @@ -117,12 +118,13 @@ export const NestedProviders: Story = }; function AllFields() { - const formMethods = useFormContext(); + const { control } = useFormContext(); + return (
+ diff --git a/src/Form/formInput.ts b/src/Form/formInput.ts index b9fd94ce..f0810bfc 100644 --- a/src/Form/formInput.ts +++ b/src/Form/formInput.ts @@ -1,6 +1,9 @@ import { ReactNode } from 'react'; -export type FormInputOption = { +export type FormInputOption< + TValue = unknown, + TLabel extends ReactNode = ReactNode, +> = { value: TValue; label: TLabel; disabled?: boolean; diff --git a/src/Select/index.stories.tsx b/src/Select/index.stories.tsx index 6396e525..669c2bd8 100644 --- a/src/Select/index.stories.tsx +++ b/src/Select/index.stories.tsx @@ -31,7 +31,7 @@ export const Multiple: Story = function Multiple(args) { return ; }; -export const Group: Story = function Group(args) { +export const OptGroup: Story = function OptGroup(args) { return ( ); }; +export const OptionsGroup: Story = function OptionsGroups(args) { + return ( +