@rjsf/daisyui 6.0.0-beta.9 → 6.0.1

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.
Files changed (99) hide show
  1. package/README.md +9 -16
  2. package/dist/chakra-ui.esm.js +382 -472
  3. package/dist/chakra-ui.esm.js.map +4 -4
  4. package/dist/chakra-ui.umd.js +194 -287
  5. package/dist/{index.js → index.cjs} +404 -496
  6. package/dist/index.cjs.map +7 -0
  7. package/lib/templates/ArrayFieldItemButtonsTemplate/ArrayFieldItemButtonsTemplate.d.ts +2 -2
  8. package/lib/templates/ArrayFieldItemButtonsTemplate/ArrayFieldItemButtonsTemplate.js +2 -7
  9. package/lib/templates/ArrayFieldItemButtonsTemplate/ArrayFieldItemButtonsTemplate.js.map +1 -1
  10. package/lib/templates/ArrayFieldItemTemplate/ArrayFieldItemTemplate.d.ts +3 -3
  11. package/lib/templates/ArrayFieldItemTemplate/ArrayFieldItemTemplate.js +1 -1
  12. package/lib/templates/ArrayFieldItemTemplate/ArrayFieldItemTemplate.js.map +1 -1
  13. package/lib/templates/ArrayFieldTemplate/ArrayFieldTemplate.js +3 -4
  14. package/lib/templates/ArrayFieldTemplate/ArrayFieldTemplate.js.map +1 -1
  15. package/lib/templates/ArrayFieldTitleTemplate/ArrayFieldTitleTemplate.js +7 -3
  16. package/lib/templates/ArrayFieldTitleTemplate/ArrayFieldTitleTemplate.js.map +1 -1
  17. package/lib/templates/BaseInputTemplate/BaseInputTemplate.js +8 -2
  18. package/lib/templates/BaseInputTemplate/BaseInputTemplate.js.map +1 -1
  19. package/lib/templates/ButtonTemplates/AddButton.js +1 -1
  20. package/lib/templates/ButtonTemplates/AddButton.js.map +1 -1
  21. package/lib/templates/ButtonTemplates/IconButton.js +4 -4
  22. package/lib/templates/ButtonTemplates/IconButton.js.map +1 -1
  23. package/lib/templates/FieldTemplate/FieldTemplate.js +6 -3
  24. package/lib/templates/FieldTemplate/FieldTemplate.js.map +1 -1
  25. package/lib/templates/MultiSchemaFieldTemplate/MultiSchemaFieldTemplate.d.ts +2 -0
  26. package/lib/templates/MultiSchemaFieldTemplate/MultiSchemaFieldTemplate.js +6 -0
  27. package/lib/templates/MultiSchemaFieldTemplate/MultiSchemaFieldTemplate.js.map +1 -0
  28. package/lib/templates/MultiSchemaFieldTemplate/index.d.ts +2 -0
  29. package/lib/templates/MultiSchemaFieldTemplate/index.js +3 -0
  30. package/lib/templates/MultiSchemaFieldTemplate/index.js.map +1 -0
  31. package/lib/templates/ObjectFieldTemplate/ObjectFieldTemplate.js +4 -3
  32. package/lib/templates/ObjectFieldTemplate/ObjectFieldTemplate.js.map +1 -1
  33. package/lib/templates/OptionalDataControlsTemplate/OptionalDataControlsTemplate.d.ts +10 -0
  34. package/lib/templates/OptionalDataControlsTemplate/OptionalDataControlsTemplate.js +23 -0
  35. package/lib/templates/OptionalDataControlsTemplate/OptionalDataControlsTemplate.js.map +1 -0
  36. package/lib/templates/OptionalDataControlsTemplate/index.d.ts +2 -0
  37. package/lib/templates/OptionalDataControlsTemplate/index.js +3 -0
  38. package/lib/templates/OptionalDataControlsTemplate/index.js.map +1 -0
  39. package/lib/templates/Templates.js +4 -0
  40. package/lib/templates/Templates.js.map +1 -1
  41. package/lib/templates/TitleField/TitleField.js +6 -2
  42. package/lib/templates/TitleField/TitleField.js.map +1 -1
  43. package/lib/templates/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.js +11 -11
  44. package/lib/templates/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.js.map +1 -1
  45. package/lib/tsconfig.tsbuildinfo +1 -1
  46. package/lib/widgets/AltDateWidget/AltDateWidget.d.ts +1 -1
  47. package/lib/widgets/AltDateWidget/AltDateWidget.js +5 -121
  48. package/lib/widgets/AltDateWidget/AltDateWidget.js.map +1 -1
  49. package/lib/widgets/CheckboxWidget/CheckboxWidget.js +2 -2
  50. package/lib/widgets/CheckboxWidget/CheckboxWidget.js.map +1 -1
  51. package/lib/widgets/CheckboxesWidget/CheckboxesWidget.d.ts +1 -1
  52. package/lib/widgets/CheckboxesWidget/CheckboxesWidget.js +2 -2
  53. package/lib/widgets/CheckboxesWidget/CheckboxesWidget.js.map +1 -1
  54. package/lib/widgets/DateTimeWidget/DateTimeWidget.js +2 -2
  55. package/lib/widgets/DateTimeWidget/DateTimeWidget.js.map +1 -1
  56. package/lib/widgets/DateWidget/DateWidget.js +2 -2
  57. package/lib/widgets/DateWidget/DateWidget.js.map +1 -1
  58. package/lib/widgets/RadioWidget/RadioWidget.d.ts +1 -1
  59. package/lib/widgets/RadioWidget/RadioWidget.js +2 -2
  60. package/lib/widgets/RadioWidget/RadioWidget.js.map +1 -1
  61. package/lib/widgets/TextareaWidget/TextareaWidget.js +2 -2
  62. package/lib/widgets/TextareaWidget/TextareaWidget.js.map +1 -1
  63. package/lib/widgets/Widgets.d.ts +1 -2
  64. package/lib/widgets/Widgets.js +1 -3
  65. package/lib/widgets/Widgets.js.map +1 -1
  66. package/package.json +24 -22
  67. package/src/templates/ArrayFieldItemButtonsTemplate/ArrayFieldItemButtonsTemplate.tsx +15 -20
  68. package/src/templates/ArrayFieldItemTemplate/ArrayFieldItemTemplate.tsx +3 -3
  69. package/src/templates/ArrayFieldTemplate/ArrayFieldTemplate.tsx +9 -13
  70. package/src/templates/ArrayFieldTitleTemplate/ArrayFieldTitleTemplate.tsx +12 -2
  71. package/src/templates/BaseInputTemplate/BaseInputTemplate.tsx +14 -6
  72. package/src/templates/ButtonTemplates/AddButton.tsx +1 -1
  73. package/src/templates/ButtonTemplates/IconButton.tsx +4 -4
  74. package/src/templates/FieldTemplate/FieldTemplate.tsx +48 -19
  75. package/src/templates/MultiSchemaFieldTemplate/MultiSchemaFieldTemplate.tsx +15 -0
  76. package/src/templates/MultiSchemaFieldTemplate/index.ts +2 -0
  77. package/src/templates/ObjectFieldTemplate/ObjectFieldTemplate.tsx +13 -9
  78. package/src/templates/OptionalDataControlsTemplate/OptionalDataControlsTemplate.tsx +46 -0
  79. package/src/templates/OptionalDataControlsTemplate/index.ts +2 -0
  80. package/src/templates/Templates.tsx +4 -0
  81. package/src/templates/TitleField/TitleField.tsx +12 -3
  82. package/src/templates/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.tsx +38 -34
  83. package/src/widgets/AltDateWidget/AltDateWidget.tsx +18 -253
  84. package/src/widgets/CheckboxWidget/CheckboxWidget.tsx +5 -3
  85. package/src/widgets/CheckboxesWidget/CheckboxesWidget.tsx +2 -1
  86. package/src/widgets/DateTimeWidget/DateTimeWidget.tsx +2 -2
  87. package/src/widgets/DateWidget/DateWidget.tsx +2 -2
  88. package/src/widgets/RadioWidget/RadioWidget.tsx +2 -1
  89. package/src/widgets/TextareaWidget/TextareaWidget.tsx +2 -1
  90. package/src/widgets/Widgets.tsx +0 -3
  91. package/dist/index.js.map +0 -7
  92. package/lib/widgets/FileWidget/FileWidget.d.ts +0 -12
  93. package/lib/widgets/FileWidget/FileWidget.js +0 -57
  94. package/lib/widgets/FileWidget/FileWidget.js.map +0 -1
  95. package/lib/widgets/FileWidget/index.d.ts +0 -2
  96. package/lib/widgets/FileWidget/index.js +0 -3
  97. package/lib/widgets/FileWidget/index.js.map +0 -1
  98. package/src/widgets/FileWidget/FileWidget.tsx +0 -86
  99. package/src/widgets/FileWidget/index.ts +0 -2
@@ -1,11 +1,11 @@
1
- import { useCallback } from 'react';
2
1
  import {
3
2
  WrapIfAdditionalTemplateProps,
4
3
  StrictRJSFSchema,
5
4
  RJSFSchema,
6
5
  FormContextType,
7
- TranslatableString,
8
6
  buttonId,
7
+ ADDITIONAL_PROPERTY_FLAG,
8
+ TranslatableString,
9
9
  } from '@rjsf/utils';
10
10
 
11
11
  /** The `WrapIfAdditional` component is used by the `FieldTemplate` to rename, or remove properties that are
@@ -27,48 +27,52 @@ export default function WrapIfAdditionalTemplate<
27
27
  readonly,
28
28
  required,
29
29
  schema,
30
- onKeyChange,
31
- onDropPropertyClick,
30
+ uiSchema,
31
+ onKeyRename,
32
+ onKeyRenameBlur,
33
+ onRemoveProperty,
32
34
  registry,
33
35
  ...rest
34
36
  } = props;
35
37
 
36
- const { translateString } = registry;
38
+ const additional = ADDITIONAL_PROPERTY_FLAG in schema;
39
+ const { templates, translateString } = registry;
40
+ // Button templates are not overridden in the uiSchema
41
+ const { RemoveButton } = templates.ButtonTemplates;
42
+ const keyLabel = translateString(TranslatableString.KeyLabel, [label]);
37
43
 
38
- const handleBlur = useCallback(
39
- (event: React.FocusEvent<HTMLInputElement>) => {
40
- onKeyChange(event.target.value);
41
- },
42
- [onKeyChange],
43
- );
44
-
45
- const handleRemove = useCallback(() => {
46
- onDropPropertyClick(label)();
47
- }, [onDropPropertyClick, label]);
44
+ if (!additional) {
45
+ return <div className={classNames}>{children}</div>;
46
+ }
48
47
 
49
48
  return (
50
49
  <div className={`wrap-if-additional-template ${classNames}`} {...rest}>
51
- <div className='flex items-center'>
52
- <input
53
- type='text'
54
- className='input input-bordered'
55
- id={`${id}-key`}
56
- onBlur={handleBlur}
57
- defaultValue={label}
58
- disabled={disabled || readonly}
59
- />
60
- {schema.additionalProperties && (
61
- <button
62
- id={buttonId<T>(id, 'remove')}
63
- className='rjsf-array-item-remove btn btn-danger ml-2'
64
- onClick={handleRemove}
50
+ <div className='flex items-baseline' style={{ justifyContent: 'space-between' }}>
51
+ <div>
52
+ <label htmlFor={`${id}-key`} className='label'>
53
+ <span className='label-text'>{keyLabel}</span>
54
+ </label>
55
+ <input
56
+ type='text'
57
+ className='input input-bordered'
58
+ id={`${id}-key`}
59
+ onBlur={onKeyRenameBlur}
60
+ defaultValue={label}
61
+ disabled={disabled || readonly}
62
+ />
63
+ </div>
64
+ {children}
65
+ <div className='flex self-center'>
66
+ <RemoveButton
67
+ id={buttonId(id, 'remove')}
68
+ className='rjsf-object-property-remove'
65
69
  disabled={disabled || readonly}
66
- >
67
- {translateString(TranslatableString.RemoveButton)}
68
- </button>
69
- )}
70
+ onClick={onRemoveProperty}
71
+ uiSchema={uiSchema}
72
+ registry={registry}
73
+ />
74
+ </div>
70
75
  </div>
71
- {children}
72
76
  </div>
73
77
  );
74
78
  }
@@ -1,187 +1,13 @@
1
- import { MouseEvent, useCallback, useEffect, useReducer, useState } from 'react';
2
1
  import {
3
- ariaDescribedByIds,
2
+ DateElement,
4
3
  FormContextType,
5
4
  RJSFSchema,
6
5
  StrictRJSFSchema,
7
- WidgetProps,
8
6
  TranslatableString,
9
- parseDateString,
10
- toDateString,
11
- dateRangeOptions,
12
- DateObject as RJSFDateObject,
13
- Registry,
7
+ useAltDateWidgetProps,
8
+ WidgetProps,
14
9
  } from '@rjsf/utils';
15
10
 
16
- /** Interface for date object with optional string fields for each date/time component */
17
- interface DateObject {
18
- year?: string;
19
- month?: string;
20
- day?: string;
21
- hour?: string;
22
- minute?: string;
23
- second?: string;
24
- }
25
-
26
- /** Determines if the date object has all required fields to form a valid date
27
- *
28
- * @param state - The date object to check
29
- * @param time - Whether to check time fields as well
30
- * @returns True if all required fields are present
31
- */
32
- function readyForChange(state: DateObject, time = false) {
33
- return state.year && state.month && state.day && (!time || (state.hour && state.minute && state.second));
34
- }
35
-
36
- /** Supported date element display formats */
37
- type DateElementFormat = 'YMD' | 'MDY' | 'DMY';
38
-
39
- /** Gets configuration for date elements based on format and ranges
40
- *
41
- * @param state - The current date object state
42
- * @param time - Whether to include time elements
43
- * @param yearsRange - Optional range of years to display
44
- * @param format - Format for ordering date elements (year, month, day)
45
- * @returns Array of element properties for rendering
46
- */
47
- function getDateElementProps(
48
- state: DateObject,
49
- time: boolean,
50
- yearsRange?: [number, number],
51
- format: DateElementFormat = 'YMD',
52
- ) {
53
- const rangeOptions = yearsRange ?? [1900, new Date().getFullYear() + 2];
54
- // Define the order based on the format
55
- const formats: Record<DateElementFormat, Array<keyof DateObject>> = {
56
- YMD: ['year', 'month', 'day'],
57
- MDY: ['month', 'day', 'year'],
58
- DMY: ['day', 'month', 'year'],
59
- };
60
-
61
- // Get the elements in the specified order
62
- const dateElements = formats[format].map((key) => ({
63
- type: key,
64
- value: state[key],
65
- range:
66
- key === 'year'
67
- ? (rangeOptions as [number, number])
68
- : key === 'month'
69
- ? ([1, 12] as [number, number])
70
- : key === 'day'
71
- ? ([1, 31] as [number, number])
72
- : ([0, 59] as [number, number]),
73
- }));
74
-
75
- // Add time elements if needed
76
- if (time) {
77
- dateElements.push(
78
- { type: 'hour', value: state.hour, range: [0, 23] as [number, number] },
79
- { type: 'minute', value: state.minute, range: [0, 59] as [number, number] },
80
- { type: 'second', value: state.second, range: [0, 59] as [number, number] },
81
- );
82
- }
83
-
84
- return dateElements;
85
- }
86
-
87
- /** Props for the DateElement component */
88
- interface DateElementProps<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any> {
89
- /** Type of date element (year, month, day, etc.) */
90
- type: string;
91
- /** Min/max range for the element values */
92
- range: [number, number];
93
- /** Current value */
94
- value?: string;
95
- /** Function to call when value is selected */
96
- select: (property: keyof DateObject, value: any) => void;
97
- /** Base ID for the form element */
98
- rootId: string;
99
- /** Name attribute for the form element */
100
- name: string;
101
- /** Whether the input is disabled */
102
- disabled?: boolean;
103
- /** Whether the input is readonly */
104
- readonly?: boolean;
105
- /** Whether the input should autofocus */
106
- autofocus?: boolean;
107
- /** Registry containing widgets and templates */
108
- registry: Registry<T, S, F>;
109
- /** Function called when input loses focus */
110
- onBlur: (id: string, value: string) => void;
111
- /** Function called when input gains focus */
112
- onFocus: (id: string, value: string) => void;
113
- }
114
-
115
- /** Component for rendering individual date/time elements (year, month, day, etc.)
116
- *
117
- * Renders a select input for each date component with appropriate options.
118
- *
119
- * @param props - The props for the component
120
- */
121
- function DateElement<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>({
122
- type,
123
- range,
124
- value,
125
- select,
126
- rootId,
127
- name,
128
- disabled,
129
- readonly,
130
- autofocus,
131
- registry,
132
- onBlur,
133
- onFocus,
134
- }: DateElementProps<T, S, F>) {
135
- const id = `${rootId}_${type}`;
136
- const { SelectWidget } = registry.widgets as Registry<T, S, F>['widgets'];
137
-
138
- // Memoize the onChange handler
139
- const handleChange = useCallback(
140
- (value: any) => {
141
- select(type as keyof DateObject, value);
142
- },
143
- [select, type],
144
- );
145
-
146
- return (
147
- <SelectWidget
148
- schema={{ type: 'integer' } as S}
149
- id={id}
150
- name={name}
151
- className='select select-bordered select-sm w-full'
152
- options={{ enumOptions: dateRangeOptions<S>(range[0], range[1]) }}
153
- placeholder={type}
154
- value={value}
155
- disabled={disabled}
156
- readonly={readonly}
157
- autofocus={autofocus}
158
- onChange={handleChange}
159
- onBlur={onBlur}
160
- onFocus={onFocus}
161
- registry={registry}
162
- label=''
163
- aria-describedby={ariaDescribedByIds<T>(rootId)}
164
- required={false}
165
- />
166
- );
167
- }
168
-
169
- /** Converts our DateObject to the expected format for toDateString
170
- *
171
- * @param dateObj - The internal DateObject
172
- * @returns A properly formatted object for the utils toDateString function
173
- */
174
- function convertToRJSFDateObject(dateObj: DateObject): RJSFDateObject {
175
- return {
176
- year: dateObj.year ? parseInt(dateObj.year) : 0,
177
- month: dateObj.month ? parseInt(dateObj.month) : 0,
178
- day: dateObj.day ? parseInt(dateObj.day) : 0,
179
- hour: dateObj.hour ? parseInt(dateObj.hour) : 0,
180
- minute: dateObj.minute ? parseInt(dateObj.minute) : 0,
181
- second: dateObj.second ? parseInt(dateObj.second) : 0,
182
- };
183
- }
184
-
185
11
  /** The `AltDateWidget` component provides an alternative date/time input
186
12
  * with individual fields for year, month, day, and optionally time components.
187
13
  *
@@ -199,87 +25,25 @@ export default function AltDateWidget<
199
25
  T = any,
200
26
  S extends StrictRJSFSchema = RJSFSchema,
201
27
  F extends FormContextType = any,
202
- >({
203
- time = false,
204
- disabled = false,
205
- readonly = false,
206
- autofocus = false,
207
- options = {},
208
- id,
209
- name,
210
- registry,
211
- onBlur,
212
- onFocus,
213
- onChange,
214
- value,
215
- }: WidgetProps<T, S, F>) {
28
+ >(props: WidgetProps<T, S, F>) {
29
+ const {
30
+ disabled = false,
31
+ readonly = false,
32
+ autofocus = false,
33
+ options = {},
34
+ id,
35
+ name,
36
+ registry,
37
+ onBlur,
38
+ onFocus,
39
+ } = props;
216
40
  const { translateString } = registry;
217
- const [lastValue, setLastValue] = useState(value);
218
-
219
- // Use a type-safe version of parseDateString result
220
- const initialState = parseDateString(value, time) as unknown as DateObject;
221
-
222
- // Create a reducer for date objects
223
- const dateReducer = (state: DateObject, action: Partial<DateObject>): DateObject => {
224
- return { ...state, ...action };
225
- };
226
-
227
- const [state, setState] = useReducer(dateReducer, initialState);
228
-
229
- // Handle changes in props or state
230
- useEffect(() => {
231
- const rjsfDateObj = convertToRJSFDateObject(state);
232
- const stateValue = toDateString(rjsfDateObj, time);
233
- if (readyForChange(state, time) && stateValue !== value) {
234
- // Valid date changed via the selects
235
- onChange(stateValue);
236
- } else if (lastValue !== value) {
237
- // New value from props
238
- setLastValue(value);
239
- setState(parseDateString(value, time) as unknown as DateObject);
240
- }
241
- }, [time, value, onChange, state, lastValue]);
242
-
243
- // Handle individual field changes
244
- const handleChange = useCallback((property: keyof DateObject, value: string) => {
245
- setState({ [property]: value });
246
- }, []);
247
-
248
- // Set current date
249
- const handleSetNow = useCallback(
250
- (event: MouseEvent<HTMLButtonElement>) => {
251
- event.preventDefault();
252
- if (disabled || readonly) {
253
- return;
254
- }
255
- const nextState = parseDateString(new Date().toJSON(), time) as unknown as DateObject;
256
- const rjsfDateObj = convertToRJSFDateObject(nextState);
257
- onChange(toDateString(rjsfDateObj, time));
258
- },
259
- [disabled, readonly, time, onChange],
260
- );
261
-
262
- // Clear the date
263
- const handleClear = useCallback(
264
- (event: MouseEvent<HTMLButtonElement>) => {
265
- event.preventDefault();
266
- if (disabled || readonly) {
267
- return;
268
- }
269
- onChange(undefined);
270
- },
271
- [disabled, readonly, onChange],
272
- );
41
+ const { elements, handleChange, handleClear, handleSetNow } = useAltDateWidgetProps(props);
273
42
 
274
43
  return (
275
44
  <div className='space-y-3'>
276
45
  <div className='grid grid-cols-3 gap-2'>
277
- {getDateElementProps(
278
- state,
279
- time,
280
- options.yearsRange as [number, number] | undefined,
281
- options.format as DateElementFormat | undefined,
282
- ).map((elemProps, i) => (
46
+ {elements.map((elemProps, i) => (
283
47
  <div key={i} className='form-control'>
284
48
  <label className='label'>
285
49
  <span className='label-text capitalize'>{elemProps.type}</span>
@@ -287,6 +51,7 @@ export default function AltDateWidget<
287
51
  <DateElement
288
52
  rootId={id}
289
53
  name={name}
54
+ className='select select-bordered select-sm'
290
55
  select={handleChange}
291
56
  type={elemProps.type}
292
57
  range={elemProps.range}
@@ -19,6 +19,7 @@ export default function CheckboxWidget<
19
19
  >(props: WidgetProps<T, S, F>) {
20
20
  const {
21
21
  id,
22
+ htmlName,
22
23
  value,
23
24
  required,
24
25
  disabled,
@@ -42,7 +43,7 @@ export default function CheckboxWidget<
42
43
 
43
44
  /** Handle focus events
44
45
  */
45
- const handleFocus = useCallback(() => {
46
+ const handleFocus: React.FocusEventHandler<HTMLInputElement> = useCallback(() => {
46
47
  if (onFocus) {
47
48
  onFocus(id, value);
48
49
  }
@@ -50,7 +51,7 @@ export default function CheckboxWidget<
50
51
 
51
52
  /** Handle blur events
52
53
  */
53
- const handleBlur = useCallback(() => {
54
+ const handleBlur: React.FocusEventHandler<HTMLInputElement> = useCallback(() => {
54
55
  if (onBlur) {
55
56
  onBlur(id, value);
56
57
  }
@@ -71,6 +72,7 @@ export default function CheckboxWidget<
71
72
  <input
72
73
  type='checkbox'
73
74
  id={id}
75
+ name={htmlName || id}
74
76
  checked={value}
75
77
  required={required}
76
78
  disabled={disabled || readonly}
@@ -85,7 +87,7 @@ export default function CheckboxWidget<
85
87
  <div className='form-control'>
86
88
  {!hideLabel && description && (
87
89
  <DescriptionFieldTemplate
88
- id={descriptionId<T>(id)}
90
+ id={descriptionId(id)}
89
91
  description={description}
90
92
  schema={schema}
91
93
  uiSchema={uiSchema}
@@ -17,6 +17,7 @@ import { WidgetProps, StrictRJSFSchema, RJSFSchema, FormContextType } from '@rjs
17
17
  */
18
18
  export default function CheckboxesWidget<T, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>({
19
19
  id,
20
+ htmlName,
20
21
  disabled,
21
22
  options,
22
23
  value,
@@ -106,7 +107,7 @@ export default function CheckboxesWidget<T, S extends StrictRJSFSchema = RJSFSch
106
107
  type='checkbox'
107
108
  id={`${id}-${option.value}`}
108
109
  className='checkbox'
109
- name={id}
110
+ name={htmlName || id}
110
111
  checked={isChecked(option)}
111
112
  required={required}
112
113
  disabled={disabled || readonly}
@@ -277,7 +277,7 @@ export default function DateTimeWidget<
277
277
  // Need to use native DOM events since we're attaching to document
278
278
  document.addEventListener('keydown', handleEscape as (e: KeyboardEvent) => void);
279
279
  return () => document.removeEventListener('keydown', handleEscape as (e: KeyboardEvent) => void);
280
- }, [id, isOpen, onBlur, value]);
280
+ }, [id, isOpen, setIsOpen, onBlur, value]);
281
281
 
282
282
  // Add the handleDoneClick callback near the top of the component, with the other event handlers
283
283
  /** Handle clicking the "Done" button
@@ -289,7 +289,7 @@ export default function DateTimeWidget<
289
289
  onBlur(id, value);
290
290
  }
291
291
  inputRef.current?.focus();
292
- }, [localDate, onChange, onBlur, id, value]);
292
+ }, [localDate, onChange, onBlur, id, value, setIsOpen]);
293
293
 
294
294
  return (
295
295
  <div className='form-control my-4 w-full relative'>
@@ -320,7 +320,7 @@ export default function DateWidget<T = any, S extends StrictRJSFSchema = RJSFSch
320
320
 
321
321
  document.addEventListener('keydown', handleEscape);
322
322
  return () => document.removeEventListener('keydown', handleEscape);
323
- }, [id, isOpen, onBlur, value]);
323
+ }, [id, isOpen, setIsOpen, onBlur, value]);
324
324
 
325
325
  // Add the handleDoneClick callback near the top of the component, with the other event handlers
326
326
  /** Handle clicking the "Done" button
@@ -332,7 +332,7 @@ export default function DateWidget<T = any, S extends StrictRJSFSchema = RJSFSch
332
332
  onBlur(id, value);
333
333
  }
334
334
  inputRef.current?.focus();
335
- }, [localDate, onChange, onBlur, id, value]);
335
+ }, [localDate, onChange, onBlur, id, value, setIsOpen]);
336
336
 
337
337
  return (
338
338
  <div className='form-control my-4 w-full relative'>
@@ -15,6 +15,7 @@ import { WidgetProps, StrictRJSFSchema, FormContextType, RJSFSchema } from '@rjs
15
15
  */
16
16
  export default function RadioWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>({
17
17
  id,
18
+ htmlName,
18
19
  options,
19
20
  value,
20
21
  required,
@@ -95,7 +96,7 @@ export default function RadioWidget<T = any, S extends StrictRJSFSchema = RJSFSc
95
96
  type='radio'
96
97
  id={`${id}-${option.value}`}
97
98
  className='radio'
98
- name={id}
99
+ name={htmlName || id}
99
100
  value={getValue(option)}
100
101
  checked={isChecked(option)}
101
102
  required={required}
@@ -16,7 +16,7 @@ export default function TextareaWidget<
16
16
  S extends StrictRJSFSchema = RJSFSchema,
17
17
  F extends FormContextType = any,
18
18
  >(props: WidgetProps<T, S, F>) {
19
- const { id, value, required, disabled, readonly, onChange, onFocus, onBlur, options } = props;
19
+ const { id, htmlName, value, required, disabled, readonly, onChange, onFocus, onBlur, options } = props;
20
20
 
21
21
  /** Handle focus events
22
22
  *
@@ -62,6 +62,7 @@ export default function TextareaWidget<
62
62
  <div className='form-control'>
63
63
  <textarea
64
64
  id={id}
65
+ name={htmlName || id}
65
66
  value={value || ''}
66
67
  required={required}
67
68
  disabled={disabled || readonly}
@@ -6,7 +6,6 @@ import CheckboxWidget from './CheckboxWidget/CheckboxWidget';
6
6
  import CheckboxesWidget from './CheckboxesWidget/CheckboxesWidget';
7
7
  import DateTimeWidget from './DateTimeWidget/DateTimeWidget';
8
8
  import DateWidget from './DateWidget/DateWidget';
9
- import FileWidget from './FileWidget/FileWidget';
10
9
  import RadioWidget from './RadioWidget/RadioWidget';
11
10
  import RangeWidget from './RangeWidget/RangeWidget';
12
11
  import RatingWidget from './RatingWidget/RatingWidget';
@@ -22,7 +21,6 @@ export {
22
21
  CheckboxWidget,
23
22
  DateTimeWidget,
24
23
  DateWidget,
25
- FileWidget,
26
24
  RadioWidget,
27
25
  RangeWidget,
28
26
  RatingWidget,
@@ -44,7 +42,6 @@ export function generateWidgets<
44
42
  CheckboxWidget,
45
43
  DateTimeWidget,
46
44
  DateWidget,
47
- FileWidget,
48
45
  RadioWidget,
49
46
  RangeWidget,
50
47
  RatingWidget,