@availity/mui-controlled-form 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { AsyncAutocomplete, AsyncAutocompleteProps } from '@availity/mui-autocomplete';
2
- import { useFormContext, RegisterOptions, FieldValues, Controller, ControllerProps } from 'react-hook-form';
2
+ import { RegisterOptions, FieldValues, Controller, ControllerProps } from 'react-hook-form';
3
3
  import { ChipTypeMap } from '@mui/material/Chip';
4
4
 
5
5
  export type ControlledAsyncAutocompleteProps<
@@ -35,12 +35,9 @@ export const ControlledAsyncAutocomplete = <
35
35
  FieldProps,
36
36
  ...rest
37
37
  }: ControlledAsyncAutocompleteProps<Option, Multiple, DisableClearable, FreeSolo, ChipComponent>) => {
38
- const { control, getFieldState } = useFormContext();
39
- const errorMessage = getFieldState(name).error?.message;
40
38
  return (
41
39
  <Controller
42
40
  name={name}
43
- control={control}
44
41
  defaultValue={rest.defaultValue}
45
42
  rules={{
46
43
  deps,
@@ -57,22 +54,22 @@ export const ControlledAsyncAutocomplete = <
57
54
  value,
58
55
  }}
59
56
  shouldUnregister={shouldUnregister}
60
- render={({ field: { onChange, value, onBlur } }) => (
57
+ render={({ field: { onChange, value, onBlur }, fieldState: { error } }) => (
61
58
  <AsyncAutocomplete
62
59
  {...rest}
63
60
  FieldProps={{
64
61
  ...FieldProps,
65
- error: !!errorMessage,
66
- helperText:
67
- errorMessage && typeof errorMessage === 'string' ? (
68
- <>
69
- {errorMessage}
70
- <br />
71
- {FieldProps?.helperText}
72
- </>
73
- ) : (
74
- FieldProps?.helperText
75
- ),
62
+ required: typeof required === 'object' ? required.value : !!required,
63
+ error: !!error,
64
+ helperText: error?.message ? (
65
+ <>
66
+ {error.message}
67
+ <br />
68
+ {FieldProps?.helperText}
69
+ </>
70
+ ) : (
71
+ FieldProps?.helperText
72
+ ),
76
73
  }}
77
74
  onChange={(event, value, reason) => {
78
75
  if (reason === 'clear') {
@@ -1,5 +1,5 @@
1
1
  import { Autocomplete, AutocompleteProps } from '@availity/mui-autocomplete';
2
- import { useFormContext, RegisterOptions, FieldValues, Controller, ControllerProps } from 'react-hook-form';
2
+ import { RegisterOptions, FieldValues, Controller, ControllerProps } from 'react-hook-form';
3
3
  import { ChipTypeMap } from '@mui/material/Chip';
4
4
 
5
5
  export type ControlledAutocompleteProps<
@@ -39,11 +39,8 @@ export const ControlledAutocomplete = <
39
39
  value,
40
40
  ...rest
41
41
  }: ControlledAutocompleteProps<T, Multiple, DisableClearable, FreeSolo, ChipComponent>) => {
42
- const { control, getFieldState } = useFormContext();
43
- const errorMessage = getFieldState(name).error?.message;
44
42
  return (
45
43
  <Controller
46
- control={control}
47
44
  name={name}
48
45
  defaultValue={defaultValue}
49
46
  rules={{
@@ -61,22 +58,22 @@ export const ControlledAutocomplete = <
61
58
  value,
62
59
  }}
63
60
  shouldUnregister={shouldUnregister}
64
- render={({ field: { onChange, value, onBlur } }) => (
61
+ render={({ field: { onChange, value, onBlur }, fieldState: { error } }) => (
65
62
  <Autocomplete
66
63
  {...rest}
67
64
  FieldProps={{
68
65
  ...FieldProps,
69
- error: !!errorMessage,
70
- helperText:
71
- errorMessage && typeof errorMessage === 'string' ? (
72
- <>
73
- {errorMessage}
74
- <br />
75
- {FieldProps?.helperText}
76
- </>
77
- ) : (
78
- FieldProps?.helperText
79
- ),
66
+ required: typeof required === 'object' ? required.value : !!required,
67
+ error: !!error,
68
+ helperText: error?.message ? (
69
+ <>
70
+ {error.message}
71
+ <br />
72
+ {FieldProps?.helperText}
73
+ </>
74
+ ) : (
75
+ FieldProps?.helperText
76
+ ),
80
77
  }}
81
78
  onChange={(event, value, reason) => {
82
79
  if (reason === 'clear') {
@@ -1,5 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
- import { ControlledCheckbox } from './Checkbox';
2
+ import { ControlledCheckbox, ControlledCheckboxProps } from './Checkbox';
3
3
  import { ControlledForm } from './ControlledForm';
4
4
  import { Button } from '@availity/mui-button';
5
5
  import { useFormContext } from 'react-hook-form';
@@ -17,7 +17,7 @@ const meta: Meta<typeof ControlledCheckbox> = {
17
17
  export default meta;
18
18
 
19
19
  export const _ControlledCheckbox: StoryObj<typeof ControlledCheckbox> = {
20
- render: () => {
20
+ render: (args: ControlledCheckboxProps) => {
21
21
  const SubmittedValues = () => {
22
22
  const {
23
23
  getValues,
@@ -39,19 +39,24 @@ export const _ControlledCheckbox: StoryObj<typeof ControlledCheckbox> = {
39
39
  } = useFormContext();
40
40
  return (
41
41
  <Grid container direction="row" justifyContent="space-between" marginTop={1}>
42
- <Button disabled={!isSubmitSuccessful} children="Reset" color="secondary" onClick={() => reset()} />
42
+ <Button
43
+ disabled={!isSubmitSuccessful}
44
+ children="Reset"
45
+ color="secondary"
46
+ onClick={() => reset({ [args.name]: false })}
47
+ />
43
48
  <Button type="submit" disabled={isSubmitSuccessful} children="Submit" />
44
49
  </Grid>
45
50
  );
46
51
  };
47
52
  return (
48
- <ControlledForm onSubmit={(data) => data} values={{ controlledCheckbox: undefined }}>
53
+ <ControlledForm onSubmit={(data) => data} values={{ [args.name]: false }} noValidate>
49
54
  <FormControl>
50
55
  <FormLabel id="radio-group" component="div">
51
56
  Radio Group
52
57
  </FormLabel>
53
58
  <FormGroup>
54
- <FormControlLabel label="Option 1" control={<ControlledCheckbox name="Option 1" />} />
59
+ <FormControlLabel label="Option 1" control={<ControlledCheckbox {...args} />} />
55
60
  <FormControlLabel label="Option 2" control={<ControlledCheckbox name="Option 2" />} />
56
61
  <FormControlLabel label="Option 3" control={<ControlledCheckbox name="Option 3" />} />
57
62
  </FormGroup>
@@ -1,37 +1,49 @@
1
1
  import { Checkbox, CheckboxProps } from '@availity/mui-checkbox';
2
- import { useFormContext, RegisterOptions, FieldValues } from 'react-hook-form';
2
+ import { RegisterOptions, FieldValues, Controller, ControllerProps } from 'react-hook-form';
3
3
 
4
- export type ControlledCheckboxProps = CheckboxProps & {
5
- name: string;
6
- } & Omit<
4
+ export type ControlledCheckboxProps = CheckboxProps &
5
+ Omit<
7
6
  RegisterOptions<FieldValues, string>,
8
- 'required' | 'max' | 'maxLength' | 'min' | 'minLength' | 'pattern' | 'validate'
9
- >;
7
+ | 'required'
8
+ | 'disabled'
9
+ | 'valueAsNumber'
10
+ | 'valueAsDate'
11
+ | 'setValueAs'
12
+ | 'max'
13
+ | 'maxLength'
14
+ | 'min'
15
+ | 'minLength'
16
+ | 'pattern'
17
+ > &
18
+ Pick<ControllerProps, 'defaultValue' | 'shouldUnregister' | 'name'>;
10
19
 
11
20
  export const ControlledCheckbox = ({
12
21
  name,
13
- setValueAs,
14
22
  disabled,
15
23
  onChange,
16
24
  onBlur,
17
25
  value,
26
+ defaultValue = false,
18
27
  shouldUnregister,
19
28
  deps,
20
29
  ...rest
21
30
  }: ControlledCheckboxProps) => {
22
- const { register } = useFormContext();
23
31
  return (
24
- <Checkbox
25
- {...rest}
26
- {...register(name, {
27
- setValueAs,
28
- disabled,
32
+ <Controller
33
+ name={name}
34
+ defaultValue={defaultValue}
35
+ disabled={disabled}
36
+ rules={{
29
37
  onChange,
30
38
  onBlur,
31
39
  value,
32
40
  shouldUnregister,
33
41
  deps,
34
- })}
42
+ }}
43
+ shouldUnregister={shouldUnregister}
44
+ render={({ field }) => (
45
+ <Checkbox {...rest} {...field} checked={field.value} onChange={(e) => field.onChange(e.target.checked)} />
46
+ )}
35
47
  />
36
48
  );
37
49
  };
@@ -1,5 +1,5 @@
1
1
  import { CodesAutocomplete, CodesAutocompleteProps } from '@availity/mui-autocomplete';
2
- import { useFormContext, Controller, RegisterOptions, ControllerProps, FieldValues } from 'react-hook-form';
2
+ import { Controller, RegisterOptions, ControllerProps, FieldValues } from 'react-hook-form';
3
3
 
4
4
  export type ControlledCodesAutocompleteProps = Omit<CodesAutocompleteProps, 'name'> &
5
5
  Omit<RegisterOptions<FieldValues, string>, 'disabled' | 'valueAsNumber' | 'valueAsDate' | 'setValueAs'> &
@@ -21,12 +21,9 @@ export const ControlledCodesAutocomplete = ({
21
21
  FieldProps,
22
22
  ...rest
23
23
  }: ControlledCodesAutocompleteProps) => {
24
- const { control, getFieldState } = useFormContext();
25
- const errorMessage = getFieldState(name).error?.message;
26
24
  return (
27
25
  <Controller
28
26
  name={name}
29
- control={control}
30
27
  defaultValue={defaultValue}
31
28
  rules={{
32
29
  deps,
@@ -41,22 +38,22 @@ export const ControlledCodesAutocomplete = ({
41
38
  value,
42
39
  }}
43
40
  shouldUnregister={shouldUnregister}
44
- render={({ field: { onChange, value, onBlur } }) => (
41
+ render={({ field: { onChange, value, onBlur }, fieldState: { error } }) => (
45
42
  <CodesAutocomplete
46
43
  {...rest}
47
44
  FieldProps={{
48
45
  ...FieldProps,
49
- error: !!errorMessage,
50
- helperText:
51
- errorMessage && typeof errorMessage === 'string' ? (
52
- <>
53
- {errorMessage}
54
- <br />
55
- {FieldProps?.helperText}
56
- </>
57
- ) : (
58
- FieldProps?.helperText
59
- ),
46
+ required: typeof required === 'object' ? required.value : !!required,
47
+ error: !!error,
48
+ helperText: error?.message ? (
49
+ <>
50
+ {error.message}
51
+ <br />
52
+ {FieldProps?.helperText}
53
+ </>
54
+ ) : (
55
+ FieldProps?.helperText
56
+ ),
60
57
  }}
61
58
  onChange={(event, value, reason) => {
62
59
  if (reason === 'clear') {
@@ -29,7 +29,7 @@ export const ControlledForm = ({ onSubmit, values, schema, validationResolver, .
29
29
 
30
30
  return (
31
31
  <FormProvider {...methods}>
32
- <form onSubmit={methods.handleSubmit(onSubmit)} {...rest} />
32
+ <form onSubmit={methods.handleSubmit(onSubmit)} noValidate {...rest} />
33
33
  </FormProvider>
34
34
  );
35
35
  };
@@ -1,5 +1,5 @@
1
1
  import { Datepicker, DatepickerProps } from '@availity/mui-datepicker';
2
- import { useFormContext, RegisterOptions, FieldValues, Controller, ControllerProps } from 'react-hook-form';
2
+ import { RegisterOptions, FieldValues, Controller, ControllerProps } from 'react-hook-form';
3
3
 
4
4
  export type ControlledDatepickerProps = DatepickerProps &
5
5
  Omit<RegisterOptions<FieldValues, string>, 'disabled' | 'valueAsNumber' | 'valueAsDate' | 'setValueAs'> &
@@ -20,13 +20,12 @@ export const ControlledDatepicker = ({
20
20
  shouldUnregister,
21
21
  validate,
22
22
  value,
23
+ FieldProps,
23
24
  ...rest
24
25
  }: ControlledDatepickerProps) => {
25
- const { control } = useFormContext();
26
26
  return (
27
27
  <Controller
28
28
  name={name}
29
- control={control}
30
29
  defaultValue={defaultValue}
31
30
  rules={{
32
31
  deps,
@@ -43,7 +42,27 @@ export const ControlledDatepicker = ({
43
42
  value,
44
43
  }}
45
44
  shouldUnregister={shouldUnregister}
46
- render={({ field: { onChange, value } }) => <Datepicker {...rest} onChange={onChange} value={value || null} />}
45
+ render={({ field: { onChange, value }, fieldState: { error } }) => (
46
+ <Datepicker
47
+ {...rest}
48
+ FieldProps={{
49
+ ...FieldProps,
50
+ required: typeof required === 'object' ? required.value : !!required,
51
+ error: !!error,
52
+ helperText: error?.message ? (
53
+ <>
54
+ {error?.message}
55
+ <br />
56
+ {FieldProps?.helperText}
57
+ </>
58
+ ) : (
59
+ FieldProps?.helperText
60
+ ),
61
+ }}
62
+ onChange={onChange}
63
+ value={value || null}
64
+ />
65
+ )}
47
66
  />
48
67
  );
49
68
  };
@@ -38,13 +38,18 @@ export const _ControlledInput: StoryObj<typeof ControlledInput> = {
38
38
  } = useFormContext();
39
39
  return (
40
40
  <Grid container direction="row" justifyContent="space-between" marginTop={1}>
41
- <Button disabled={!isSubmitSuccessful} children="Reset" color="secondary" onClick={() => reset()} />
41
+ <Button
42
+ disabled={!isSubmitSuccessful}
43
+ children="Reset"
44
+ color="secondary"
45
+ onClick={() => reset({ [args.name]: '' })}
46
+ />
42
47
  <Button type="submit" disabled={isSubmitSuccessful} children="Submit" />
43
48
  </Grid>
44
49
  );
45
50
  };
46
51
  return (
47
- <ControlledForm values={{ controlledInput: undefined }} onSubmit={(data) => data}>
52
+ <ControlledForm values={{ [args.name]: '' }} onSubmit={(data) => data}>
48
53
  <ControlledInput {...args} />
49
54
  <Actions />
50
55
  <SubmittedValues />
package/src/lib/Input.tsx CHANGED
@@ -1,10 +1,9 @@
1
1
  import { Input, InputProps } from '@availity/mui-form-utils';
2
- import { useFormContext, RegisterOptions, FieldValues } from 'react-hook-form';
2
+ import { RegisterOptions, FieldValues, Controller, ControllerProps } from 'react-hook-form';
3
3
 
4
- export type ControlledInputProps = Omit<InputProps, 'error' | 'name' | 'required'> & { name: string } & RegisterOptions<
5
- FieldValues,
6
- string
7
- >;
4
+ export type ControlledInputProps = Omit<InputProps, 'error' | 'name' | 'required'> &
5
+ Omit<RegisterOptions<FieldValues, string>, 'disabled' | 'valueAsNumber' | 'valueAsDate' | 'setValueAs'> &
6
+ Pick<ControllerProps, 'defaultValue' | 'shouldUnregister' | 'name'>;
8
7
 
9
8
  export const ControlledInput = ({
10
9
  name,
@@ -15,7 +14,7 @@ export const ControlledInput = ({
15
14
  min,
16
15
  pattern,
17
16
  validate,
18
- setValueAs,
17
+ defaultValue,
19
18
  disabled,
20
19
  onChange,
21
20
  onBlur,
@@ -24,13 +23,12 @@ export const ControlledInput = ({
24
23
  deps,
25
24
  ...rest
26
25
  }: ControlledInputProps) => {
27
- const { register, getFieldState } = useFormContext();
28
26
  return (
29
- <Input
30
- {...rest}
31
- error={!!getFieldState(name).error}
32
- required={!!required}
33
- {...register(name, {
27
+ <Controller
28
+ name={name}
29
+ defaultValue={defaultValue}
30
+ disabled={disabled}
31
+ rules={{
34
32
  required,
35
33
  maxLength,
36
34
  minLength,
@@ -38,14 +36,21 @@ export const ControlledInput = ({
38
36
  min,
39
37
  pattern,
40
38
  validate,
41
- setValueAs,
42
- disabled,
43
39
  onChange,
44
40
  onBlur,
45
41
  value,
46
42
  shouldUnregister,
47
43
  deps,
48
- })}
44
+ }}
45
+ shouldUnregister={shouldUnregister}
46
+ render={({ field, fieldState: { error } }) => (
47
+ <Input
48
+ {...rest}
49
+ {...field}
50
+ error={!!error}
51
+ required={typeof required === 'object' ? required.value : !!required}
52
+ />
53
+ )}
49
54
  />
50
55
  );
51
56
  };
@@ -1,5 +1,5 @@
1
1
  import { OrganizationAutocomplete, OrgAutocompleteProps } from '@availity/mui-autocomplete';
2
- import { useFormContext, Controller, RegisterOptions, FieldValues, ControllerProps } from 'react-hook-form';
2
+ import { Controller, RegisterOptions, FieldValues, ControllerProps } from 'react-hook-form';
3
3
 
4
4
  export type ControlledOrgAutocompleteProps = Omit<OrgAutocompleteProps, 'name'> &
5
5
  Omit<
@@ -22,12 +22,9 @@ export const ControlledOrganizationAutocomplete = ({
22
22
  FieldProps,
23
23
  ...rest
24
24
  }: ControlledOrgAutocompleteProps) => {
25
- const { control, getFieldState } = useFormContext();
26
- const errorMessage = getFieldState(name).error?.message;
27
25
  return (
28
26
  <Controller
29
27
  name={name}
30
- control={control}
31
28
  defaultValue={defaultValue}
32
29
  rules={{
33
30
  deps,
@@ -40,22 +37,22 @@ export const ControlledOrganizationAutocomplete = ({
40
37
  value,
41
38
  }}
42
39
  shouldUnregister={shouldUnregister}
43
- render={({ field: { onChange, value, onBlur } }) => (
40
+ render={({ field: { onChange, value, onBlur }, fieldState: { error } }) => (
44
41
  <OrganizationAutocomplete
45
42
  {...rest}
46
43
  FieldProps={{
47
44
  ...FieldProps,
48
- error: !!errorMessage,
49
- helperText:
50
- errorMessage && typeof errorMessage === 'string' ? (
51
- <>
52
- {errorMessage}
53
- <br />
54
- {FieldProps?.helperText}
55
- </>
56
- ) : (
57
- FieldProps?.helperText
58
- ),
45
+ required: typeof required === 'object' ? required.value : !!required,
46
+ error: !!error,
47
+ helperText: error?.message ? (
48
+ <>
49
+ {error.message}
50
+ <br />
51
+ {FieldProps?.helperText}
52
+ </>
53
+ ) : (
54
+ FieldProps?.helperText
55
+ ),
59
56
  }}
60
57
  onChange={(event, value, reason) => {
61
58
  if (reason === 'clear') {
@@ -1,5 +1,5 @@
1
1
  import { ProviderAutocomplete, ProviderAutocompleteProps } from '@availity/mui-autocomplete';
2
- import { useFormContext, Controller, RegisterOptions, FieldValues, ControllerProps } from 'react-hook-form';
2
+ import { Controller, RegisterOptions, FieldValues, ControllerProps } from 'react-hook-form';
3
3
 
4
4
  export type ControlledProviderAutocompleteProps = Omit<ProviderAutocompleteProps, 'name'> &
5
5
  Omit<RegisterOptions<FieldValues, string>, 'disabled' | 'valueAsNumber' | 'valueAsDate' | 'setValueAs'> &
@@ -23,12 +23,9 @@ export const ControlledProviderAutocomplete = ({
23
23
  FieldProps,
24
24
  ...rest
25
25
  }: ControlledProviderAutocompleteProps) => {
26
- const { control, getFieldState } = useFormContext();
27
- const errorMessage = getFieldState(name).error?.message;
28
26
  return (
29
27
  <Controller
30
28
  name={name}
31
- control={control}
32
29
  defaultValue={defaultValue}
33
30
  rules={{
34
31
  deps,
@@ -45,22 +42,22 @@ export const ControlledProviderAutocomplete = ({
45
42
  value,
46
43
  }}
47
44
  shouldUnregister={shouldUnregister}
48
- render={({ field: { onChange, value, onBlur } }) => (
45
+ render={({ field: { onChange, value, onBlur }, fieldState: { error } }) => (
49
46
  <ProviderAutocomplete
50
47
  {...rest}
51
48
  FieldProps={{
52
49
  ...FieldProps,
53
- error: !!errorMessage,
54
- helperText:
55
- errorMessage && typeof errorMessage === 'string' ? (
56
- <>
57
- {errorMessage}
58
- <br />
59
- {FieldProps?.helperText}
60
- </>
61
- ) : (
62
- FieldProps?.helperText
63
- ),
50
+ required: typeof required === 'object' ? required.value : !!required,
51
+ error: !!error,
52
+ helperText: error?.message ? (
53
+ <>
54
+ {error.message}
55
+ <br />
56
+ {FieldProps?.helperText}
57
+ </>
58
+ ) : (
59
+ FieldProps?.helperText
60
+ ),
64
61
  }}
65
62
  onChange={(event, value, reason) => {
66
63
  if (reason === 'clear') {
@@ -1,5 +1,5 @@
1
1
  import { RadioGroup, RadioGroupProps } from '@availity/mui-form-utils';
2
- import { useFormContext, ControllerProps, Controller, RegisterOptions, FieldValues } from 'react-hook-form';
2
+ import { ControllerProps, Controller, RegisterOptions, FieldValues } from 'react-hook-form';
3
3
  import { FormControl, FormLabel, FormHelperText } from '@availity/mui-form-utils';
4
4
 
5
5
  export type ControlledRadioGroupProps = RadioGroupProps & {
@@ -34,23 +34,20 @@ export const ControlledRadioGroup = ({
34
34
  value,
35
35
  ...rest
36
36
  }: ControlledRadioGroupProps) => {
37
- const { control, getFieldState } = useFormContext();
38
- const errorMessage = getFieldState(name).error?.message;
39
37
  return (
40
38
  <Controller
41
- control={control}
42
39
  name={name}
43
40
  defaultValue={defaultValue}
44
41
  rules={{ deps, onBlur, onChange, required, shouldUnregister, value }}
45
42
  shouldUnregister={shouldUnregister}
46
- render={({ field }) => (
47
- <FormControl error={!!errorMessage}>
48
- <FormLabel>{label}</FormLabel>
43
+ render={({ field, fieldState: { error } }) => (
44
+ <FormControl error={!!error}>
45
+ <FormLabel required={typeof required === 'object' ? required.value : !!required}>{label}</FormLabel>
49
46
  <RadioGroup {...field} {...rest} />
50
47
  <FormHelperText>
51
- {errorMessage && typeof errorMessage === 'string' ? (
48
+ {error?.message ? (
52
49
  <>
53
- {errorMessage}
50
+ {error.message}
54
51
  <br />
55
52
  {helperText}
56
53
  </>
@@ -44,7 +44,7 @@ export const _ControlledSelect: StoryObj<typeof ControlledSelect> = {
44
44
  disabled={!isSubmitSuccessful}
45
45
  children="Reset"
46
46
  color="secondary"
47
- onClick={() => reset({ controlledSelect: undefined })}
47
+ onClick={() => reset({ [args.name]: '' })}
48
48
  />
49
49
  <Button type="submit" disabled={isSubmitSuccessful} children="Submit" />
50
50
  </Grid>
@@ -52,7 +52,7 @@ export const _ControlledSelect: StoryObj<typeof ControlledSelect> = {
52
52
  };
53
53
 
54
54
  return (
55
- <ControlledForm values={{ controlledSelect: undefined }} onSubmit={(data) => data}>
55
+ <ControlledForm values={{ [args.name]: '' }} onSubmit={(data) => data} noValidate>
56
56
  <FormControl>
57
57
  <FormLabel id={`${args.id}-label`}>{args.label}</FormLabel>
58
58
  <ControlledSelect {...args} labelId={`${args.id}-label`}>
@@ -72,3 +72,63 @@ export const _ControlledSelect: StoryObj<typeof ControlledSelect> = {
72
72
  label: 'Select Label',
73
73
  },
74
74
  };
75
+
76
+ export const _ControlledMultiSelect: StoryObj<typeof ControlledSelect> = {
77
+ render: (args) => {
78
+ const SubmittedValues = () => {
79
+ const {
80
+ getValues,
81
+ formState: { isSubmitSuccessful },
82
+ } = useFormContext();
83
+
84
+ return isSubmitSuccessful ? (
85
+ <Paper sx={{ padding: '1.5rem', marginTop: '1.5rem' }}>
86
+ <Typography variant="h2">Submitted Values</Typography>
87
+ <pre>{JSON.stringify(getValues(), null, 2)}</pre>
88
+ </Paper>
89
+ ) : null;
90
+ };
91
+
92
+ const Actions = () => {
93
+ const {
94
+ reset,
95
+ formState: { isSubmitSuccessful },
96
+ } = useFormContext();
97
+ return (
98
+ <Grid container direction="row" justifyContent="space-between" marginTop={1}>
99
+ <Button
100
+ disabled={!isSubmitSuccessful}
101
+ children="Reset"
102
+ color="secondary"
103
+ onClick={() => reset({ [args.name]: [] })}
104
+ />
105
+ <Button type="submit" disabled={isSubmitSuccessful} children="Submit" />
106
+ </Grid>
107
+ );
108
+ };
109
+
110
+ return (
111
+ <ControlledForm values={{ [args.name]: [] }} onSubmit={(data) => data} noValidate>
112
+ <FormControl>
113
+ <FormLabel id={`${args.id}-label`}>{args.label}</FormLabel>
114
+ <ControlledSelect {...args} labelId={`${args.id}-label`}>
115
+ <MenuItem value={1}>Option 1</MenuItem>
116
+ <MenuItem value={2}>Option 2</MenuItem>
117
+ <MenuItem value={3}>Option 3</MenuItem>
118
+ <MenuItem value={4}>Option 4</MenuItem>
119
+ <MenuItem value={5}>Option 5</MenuItem>
120
+ <MenuItem value={6}>Option 6</MenuItem>
121
+ </ControlledSelect>
122
+ <Actions />
123
+ <SubmittedValues />
124
+ </FormControl>
125
+ </ControlledForm>
126
+ );
127
+ },
128
+ args: {
129
+ name: 'controlledMutliSelect',
130
+ required: 'This is required.',
131
+ label: 'Select Label',
132
+ multiple: true,
133
+ },
134
+ };