@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.
- package/README.md +9 -16
- package/dist/chakra-ui.esm.js +382 -472
- package/dist/chakra-ui.esm.js.map +4 -4
- package/dist/chakra-ui.umd.js +194 -287
- package/dist/{index.js → index.cjs} +404 -496
- package/dist/index.cjs.map +7 -0
- package/lib/templates/ArrayFieldItemButtonsTemplate/ArrayFieldItemButtonsTemplate.d.ts +2 -2
- package/lib/templates/ArrayFieldItemButtonsTemplate/ArrayFieldItemButtonsTemplate.js +2 -7
- package/lib/templates/ArrayFieldItemButtonsTemplate/ArrayFieldItemButtonsTemplate.js.map +1 -1
- package/lib/templates/ArrayFieldItemTemplate/ArrayFieldItemTemplate.d.ts +3 -3
- package/lib/templates/ArrayFieldItemTemplate/ArrayFieldItemTemplate.js +1 -1
- package/lib/templates/ArrayFieldItemTemplate/ArrayFieldItemTemplate.js.map +1 -1
- package/lib/templates/ArrayFieldTemplate/ArrayFieldTemplate.js +3 -4
- package/lib/templates/ArrayFieldTemplate/ArrayFieldTemplate.js.map +1 -1
- package/lib/templates/ArrayFieldTitleTemplate/ArrayFieldTitleTemplate.js +7 -3
- package/lib/templates/ArrayFieldTitleTemplate/ArrayFieldTitleTemplate.js.map +1 -1
- package/lib/templates/BaseInputTemplate/BaseInputTemplate.js +8 -2
- package/lib/templates/BaseInputTemplate/BaseInputTemplate.js.map +1 -1
- package/lib/templates/ButtonTemplates/AddButton.js +1 -1
- package/lib/templates/ButtonTemplates/AddButton.js.map +1 -1
- package/lib/templates/ButtonTemplates/IconButton.js +4 -4
- package/lib/templates/ButtonTemplates/IconButton.js.map +1 -1
- package/lib/templates/FieldTemplate/FieldTemplate.js +6 -3
- package/lib/templates/FieldTemplate/FieldTemplate.js.map +1 -1
- package/lib/templates/MultiSchemaFieldTemplate/MultiSchemaFieldTemplate.d.ts +2 -0
- package/lib/templates/MultiSchemaFieldTemplate/MultiSchemaFieldTemplate.js +6 -0
- package/lib/templates/MultiSchemaFieldTemplate/MultiSchemaFieldTemplate.js.map +1 -0
- package/lib/templates/MultiSchemaFieldTemplate/index.d.ts +2 -0
- package/lib/templates/MultiSchemaFieldTemplate/index.js +3 -0
- package/lib/templates/MultiSchemaFieldTemplate/index.js.map +1 -0
- package/lib/templates/ObjectFieldTemplate/ObjectFieldTemplate.js +4 -3
- package/lib/templates/ObjectFieldTemplate/ObjectFieldTemplate.js.map +1 -1
- package/lib/templates/OptionalDataControlsTemplate/OptionalDataControlsTemplate.d.ts +10 -0
- package/lib/templates/OptionalDataControlsTemplate/OptionalDataControlsTemplate.js +23 -0
- package/lib/templates/OptionalDataControlsTemplate/OptionalDataControlsTemplate.js.map +1 -0
- package/lib/templates/OptionalDataControlsTemplate/index.d.ts +2 -0
- package/lib/templates/OptionalDataControlsTemplate/index.js +3 -0
- package/lib/templates/OptionalDataControlsTemplate/index.js.map +1 -0
- package/lib/templates/Templates.js +4 -0
- package/lib/templates/Templates.js.map +1 -1
- package/lib/templates/TitleField/TitleField.js +6 -2
- package/lib/templates/TitleField/TitleField.js.map +1 -1
- package/lib/templates/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.js +11 -11
- package/lib/templates/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.js.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/widgets/AltDateWidget/AltDateWidget.d.ts +1 -1
- package/lib/widgets/AltDateWidget/AltDateWidget.js +5 -121
- package/lib/widgets/AltDateWidget/AltDateWidget.js.map +1 -1
- package/lib/widgets/CheckboxWidget/CheckboxWidget.js +2 -2
- package/lib/widgets/CheckboxWidget/CheckboxWidget.js.map +1 -1
- package/lib/widgets/CheckboxesWidget/CheckboxesWidget.d.ts +1 -1
- package/lib/widgets/CheckboxesWidget/CheckboxesWidget.js +2 -2
- package/lib/widgets/CheckboxesWidget/CheckboxesWidget.js.map +1 -1
- package/lib/widgets/DateTimeWidget/DateTimeWidget.js +2 -2
- package/lib/widgets/DateTimeWidget/DateTimeWidget.js.map +1 -1
- package/lib/widgets/DateWidget/DateWidget.js +2 -2
- package/lib/widgets/DateWidget/DateWidget.js.map +1 -1
- package/lib/widgets/RadioWidget/RadioWidget.d.ts +1 -1
- package/lib/widgets/RadioWidget/RadioWidget.js +2 -2
- package/lib/widgets/RadioWidget/RadioWidget.js.map +1 -1
- package/lib/widgets/TextareaWidget/TextareaWidget.js +2 -2
- package/lib/widgets/TextareaWidget/TextareaWidget.js.map +1 -1
- package/lib/widgets/Widgets.d.ts +1 -2
- package/lib/widgets/Widgets.js +1 -3
- package/lib/widgets/Widgets.js.map +1 -1
- package/package.json +24 -22
- package/src/templates/ArrayFieldItemButtonsTemplate/ArrayFieldItemButtonsTemplate.tsx +15 -20
- package/src/templates/ArrayFieldItemTemplate/ArrayFieldItemTemplate.tsx +3 -3
- package/src/templates/ArrayFieldTemplate/ArrayFieldTemplate.tsx +9 -13
- package/src/templates/ArrayFieldTitleTemplate/ArrayFieldTitleTemplate.tsx +12 -2
- package/src/templates/BaseInputTemplate/BaseInputTemplate.tsx +14 -6
- package/src/templates/ButtonTemplates/AddButton.tsx +1 -1
- package/src/templates/ButtonTemplates/IconButton.tsx +4 -4
- package/src/templates/FieldTemplate/FieldTemplate.tsx +48 -19
- package/src/templates/MultiSchemaFieldTemplate/MultiSchemaFieldTemplate.tsx +15 -0
- package/src/templates/MultiSchemaFieldTemplate/index.ts +2 -0
- package/src/templates/ObjectFieldTemplate/ObjectFieldTemplate.tsx +13 -9
- package/src/templates/OptionalDataControlsTemplate/OptionalDataControlsTemplate.tsx +46 -0
- package/src/templates/OptionalDataControlsTemplate/index.ts +2 -0
- package/src/templates/Templates.tsx +4 -0
- package/src/templates/TitleField/TitleField.tsx +12 -3
- package/src/templates/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.tsx +38 -34
- package/src/widgets/AltDateWidget/AltDateWidget.tsx +18 -253
- package/src/widgets/CheckboxWidget/CheckboxWidget.tsx +5 -3
- package/src/widgets/CheckboxesWidget/CheckboxesWidget.tsx +2 -1
- package/src/widgets/DateTimeWidget/DateTimeWidget.tsx +2 -2
- package/src/widgets/DateWidget/DateWidget.tsx +2 -2
- package/src/widgets/RadioWidget/RadioWidget.tsx +2 -1
- package/src/widgets/TextareaWidget/TextareaWidget.tsx +2 -1
- package/src/widgets/Widgets.tsx +0 -3
- package/dist/index.js.map +0 -7
- package/lib/widgets/FileWidget/FileWidget.d.ts +0 -12
- package/lib/widgets/FileWidget/FileWidget.js +0 -57
- package/lib/widgets/FileWidget/FileWidget.js.map +0 -1
- package/lib/widgets/FileWidget/index.d.ts +0 -2
- package/lib/widgets/FileWidget/index.js +0 -3
- package/lib/widgets/FileWidget/index.js.map +0 -1
- package/src/widgets/FileWidget/FileWidget.tsx +0 -86
- 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
|
-
|
|
31
|
-
|
|
30
|
+
uiSchema,
|
|
31
|
+
onKeyRename,
|
|
32
|
+
onKeyRenameBlur,
|
|
33
|
+
onRemoveProperty,
|
|
32
34
|
registry,
|
|
33
35
|
...rest
|
|
34
36
|
} = props;
|
|
35
37
|
|
|
36
|
-
const
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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-
|
|
52
|
-
<
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
{
|
|
68
|
-
|
|
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
|
-
|
|
2
|
+
DateElement,
|
|
4
3
|
FormContextType,
|
|
5
4
|
RJSFSchema,
|
|
6
5
|
StrictRJSFSchema,
|
|
7
|
-
WidgetProps,
|
|
8
6
|
TranslatableString,
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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
|
|
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
|
-
{
|
|
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
|
|
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}
|
package/src/widgets/Widgets.tsx
CHANGED
|
@@ -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,
|