@rjsf/daisyui 6.0.0-beta.2
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 +231 -0
- package/dist/chakra-ui.esm.js +2192 -0
- package/dist/chakra-ui.esm.js.map +7 -0
- package/dist/chakra-ui.umd.js +2011 -0
- package/dist/index.js +2180 -0
- package/dist/index.js.map +7 -0
- package/lib/DaisyUIForm.d.ts +5 -0
- package/lib/DaisyUIForm.js +8 -0
- package/lib/DaisyUIForm.js.map +1 -0
- package/lib/DaisyUIFrameProvider.d.ts +35 -0
- package/lib/DaisyUIFrameProvider.js +93 -0
- package/lib/DaisyUIFrameProvider.js.map +1 -0
- package/lib/daisyForm/DaisyForm.d.ts +12 -0
- package/lib/daisyForm/DaisyForm.js +15 -0
- package/lib/daisyForm/DaisyForm.js.map +1 -0
- package/lib/daisyForm/index.d.ts +2 -0
- package/lib/daisyForm/index.js +3 -0
- package/lib/daisyForm/index.js.map +1 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -0
- package/lib/templates/ArrayFieldDescriptionTemplate/ArrayFieldDescriptionTemplate.d.ts +7 -0
- package/lib/templates/ArrayFieldDescriptionTemplate/ArrayFieldDescriptionTemplate.js +11 -0
- package/lib/templates/ArrayFieldDescriptionTemplate/ArrayFieldDescriptionTemplate.js.map +1 -0
- package/lib/templates/ArrayFieldDescriptionTemplate/index.d.ts +2 -0
- package/lib/templates/ArrayFieldDescriptionTemplate/index.js +3 -0
- package/lib/templates/ArrayFieldDescriptionTemplate/index.js.map +1 -0
- package/lib/templates/ArrayFieldItemButtonsTemplate/ArrayFieldItemButtonsTemplate.d.ts +5 -0
- package/lib/templates/ArrayFieldItemButtonsTemplate/ArrayFieldItemButtonsTemplate.js +20 -0
- package/lib/templates/ArrayFieldItemButtonsTemplate/ArrayFieldItemButtonsTemplate.js.map +1 -0
- package/lib/templates/ArrayFieldItemButtonsTemplate/index.d.ts +2 -0
- package/lib/templates/ArrayFieldItemButtonsTemplate/index.js +3 -0
- package/lib/templates/ArrayFieldItemButtonsTemplate/index.js.map +1 -0
- package/lib/templates/ArrayFieldItemTemplate/ArrayFieldItemTemplate.d.ts +14 -0
- package/lib/templates/ArrayFieldItemTemplate/ArrayFieldItemTemplate.js +27 -0
- package/lib/templates/ArrayFieldItemTemplate/ArrayFieldItemTemplate.js.map +1 -0
- package/lib/templates/ArrayFieldItemTemplate/index.d.ts +2 -0
- package/lib/templates/ArrayFieldItemTemplate/index.js +3 -0
- package/lib/templates/ArrayFieldItemTemplate/index.js.map +1 -0
- package/lib/templates/ArrayFieldTemplate/ArrayFieldTemplate.d.ts +15 -0
- package/lib/templates/ArrayFieldTemplate/ArrayFieldTemplate.js +37 -0
- package/lib/templates/ArrayFieldTemplate/ArrayFieldTemplate.js.map +1 -0
- package/lib/templates/ArrayFieldTemplate/index.d.ts +2 -0
- package/lib/templates/ArrayFieldTemplate/index.js +3 -0
- package/lib/templates/ArrayFieldTemplate/index.js.map +1 -0
- package/lib/templates/ArrayFieldTitleTemplate/ArrayFieldTitleTemplate.d.ts +7 -0
- package/lib/templates/ArrayFieldTitleTemplate/ArrayFieldTitleTemplate.js +11 -0
- package/lib/templates/ArrayFieldTitleTemplate/ArrayFieldTitleTemplate.js.map +1 -0
- package/lib/templates/ArrayFieldTitleTemplate/index.d.ts +2 -0
- package/lib/templates/ArrayFieldTitleTemplate/index.js +3 -0
- package/lib/templates/ArrayFieldTitleTemplate/index.js.map +1 -0
- package/lib/templates/BaseInputTemplate/BaseInputTemplate.d.ts +16 -0
- package/lib/templates/BaseInputTemplate/BaseInputTemplate.js +33 -0
- package/lib/templates/BaseInputTemplate/BaseInputTemplate.js.map +1 -0
- package/lib/templates/BaseInputTemplate/index.d.ts +2 -0
- package/lib/templates/BaseInputTemplate/index.js +3 -0
- package/lib/templates/BaseInputTemplate/index.js.map +1 -0
- package/lib/templates/ButtonTemplates/AddButton.d.ts +6 -0
- package/lib/templates/ButtonTemplates/AddButton.js +15 -0
- package/lib/templates/ButtonTemplates/AddButton.js.map +1 -0
- package/lib/templates/ButtonTemplates/DaisyUIButton.d.ts +18 -0
- package/lib/templates/ButtonTemplates/DaisyUIButton.js +15 -0
- package/lib/templates/ButtonTemplates/DaisyUIButton.js.map +1 -0
- package/lib/templates/ButtonTemplates/IconButton.d.ts +5 -0
- package/lib/templates/ButtonTemplates/IconButton.js +21 -0
- package/lib/templates/ButtonTemplates/IconButton.js.map +1 -0
- package/lib/templates/ButtonTemplates/SubmitButton.d.ts +4 -0
- package/lib/templates/ButtonTemplates/SubmitButton.js +12 -0
- package/lib/templates/ButtonTemplates/SubmitButton.js.map +1 -0
- package/lib/templates/ButtonTemplates/index.d.ts +15 -0
- package/lib/templates/ButtonTemplates/index.js +17 -0
- package/lib/templates/ButtonTemplates/index.js.map +1 -0
- package/lib/templates/DescriptionField/DescriptionField.d.ts +8 -0
- package/lib/templates/DescriptionField/DescriptionField.js +16 -0
- package/lib/templates/DescriptionField/DescriptionField.js.map +1 -0
- package/lib/templates/DescriptionField/index.d.ts +2 -0
- package/lib/templates/DescriptionField/index.js +3 -0
- package/lib/templates/DescriptionField/index.js.map +1 -0
- package/lib/templates/ErrorList/ErrorList.d.ts +7 -0
- package/lib/templates/ErrorList/ErrorList.js +11 -0
- package/lib/templates/ErrorList/ErrorList.js.map +1 -0
- package/lib/templates/ErrorList/index.d.ts +2 -0
- package/lib/templates/ErrorList/index.js +3 -0
- package/lib/templates/ErrorList/index.js.map +1 -0
- package/lib/templates/FieldErrorTemplate/FieldErrorTemplate.d.ts +10 -0
- package/lib/templates/FieldErrorTemplate/FieldErrorTemplate.js +15 -0
- package/lib/templates/FieldErrorTemplate/FieldErrorTemplate.js.map +1 -0
- package/lib/templates/FieldErrorTemplate/index.d.ts +2 -0
- package/lib/templates/FieldErrorTemplate/index.js +3 -0
- package/lib/templates/FieldErrorTemplate/index.js.map +1 -0
- package/lib/templates/FieldHelpTemplate/FieldHelpTemplate.d.ts +11 -0
- package/lib/templates/FieldHelpTemplate/FieldHelpTemplate.js +15 -0
- package/lib/templates/FieldHelpTemplate/FieldHelpTemplate.js.map +1 -0
- package/lib/templates/FieldHelpTemplate/index.d.ts +2 -0
- package/lib/templates/FieldHelpTemplate/index.js +3 -0
- package/lib/templates/FieldHelpTemplate/index.js.map +1 -0
- package/lib/templates/FieldTemplate/FieldTemplate.d.ts +15 -0
- package/lib/templates/FieldTemplate/FieldTemplate.js +23 -0
- package/lib/templates/FieldTemplate/FieldTemplate.js.map +1 -0
- package/lib/templates/FieldTemplate/index.d.ts +2 -0
- package/lib/templates/FieldTemplate/index.js +3 -0
- package/lib/templates/FieldTemplate/index.js.map +1 -0
- package/lib/templates/GridTemplate/GridTemplate.d.ts +7 -0
- package/lib/templates/GridTemplate/GridTemplate.js +16 -0
- package/lib/templates/GridTemplate/GridTemplate.js.map +1 -0
- package/lib/templates/GridTemplate/index.d.ts +2 -0
- package/lib/templates/GridTemplate/index.js +3 -0
- package/lib/templates/GridTemplate/index.js.map +1 -0
- package/lib/templates/ObjectFieldTemplate/ObjectFieldTemplate.d.ts +13 -0
- package/lib/templates/ObjectFieldTemplate/ObjectFieldTemplate.js +25 -0
- package/lib/templates/ObjectFieldTemplate/ObjectFieldTemplate.js.map +1 -0
- package/lib/templates/ObjectFieldTemplate/index.d.ts +2 -0
- package/lib/templates/ObjectFieldTemplate/index.js +3 -0
- package/lib/templates/ObjectFieldTemplate/index.js.map +1 -0
- package/lib/templates/Templates.d.ts +19 -0
- package/lib/templates/Templates.js +56 -0
- package/lib/templates/Templates.js.map +1 -0
- package/lib/templates/TitleField/TitleField.d.ts +13 -0
- package/lib/templates/TitleField/TitleField.js +19 -0
- package/lib/templates/TitleField/TitleField.js.map +1 -0
- package/lib/templates/TitleField/index.d.ts +2 -0
- package/lib/templates/TitleField/index.js +3 -0
- package/lib/templates/TitleField/index.js.map +1 -0
- package/lib/templates/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.d.ts +7 -0
- package/lib/templates/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.js +20 -0
- package/lib/templates/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.js.map +1 -0
- package/lib/templates/WrapIfAdditionalTemplate/index.d.ts +2 -0
- package/lib/templates/WrapIfAdditionalTemplate/index.js +3 -0
- package/lib/templates/WrapIfAdditionalTemplate/index.js.map +1 -0
- package/lib/templates/index.d.ts +19 -0
- package/lib/templates/index.js +20 -0
- package/lib/templates/index.js.map +1 -0
- package/lib/theme/Theme.d.ts +43 -0
- package/lib/theme/Theme.js +68 -0
- package/lib/theme/Theme.js.map +1 -0
- package/lib/theme/index.d.ts +2 -0
- package/lib/theme/index.js +3 -0
- package/lib/theme/index.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/lib/types/DaisyProps.d.ts +5 -0
- package/lib/types/DaisyProps.js +2 -0
- package/lib/types/DaisyProps.js.map +1 -0
- package/lib/utils.d.ts +13 -0
- package/lib/utils.js +5 -0
- package/lib/utils.js.map +1 -0
- package/lib/widgets/AltDateTimeWidget/AltDateTimeWidget.d.ts +6 -0
- package/lib/widgets/AltDateTimeWidget/AltDateTimeWidget.js +10 -0
- package/lib/widgets/AltDateTimeWidget/AltDateTimeWidget.js.map +1 -0
- package/lib/widgets/AltDateTimeWidget/index.d.ts +2 -0
- package/lib/widgets/AltDateTimeWidget/index.js +3 -0
- package/lib/widgets/AltDateTimeWidget/index.js.map +1 -0
- package/lib/widgets/AltDateWidget/AltDateWidget.d.ts +15 -0
- package/lib/widgets/AltDateWidget/AltDateWidget.js +138 -0
- package/lib/widgets/AltDateWidget/AltDateWidget.js.map +1 -0
- package/lib/widgets/AltDateWidget/index.d.ts +2 -0
- package/lib/widgets/AltDateWidget/index.js +3 -0
- package/lib/widgets/AltDateWidget/index.js.map +1 -0
- package/lib/widgets/CheckboxWidget/CheckboxWidget.d.ts +13 -0
- package/lib/widgets/CheckboxWidget/CheckboxWidget.js +43 -0
- package/lib/widgets/CheckboxWidget/CheckboxWidget.js.map +1 -0
- package/lib/widgets/CheckboxWidget/index.d.ts +2 -0
- package/lib/widgets/CheckboxWidget/index.js +3 -0
- package/lib/widgets/CheckboxWidget/index.js.map +1 -0
- package/lib/widgets/CheckboxesWidget/CheckboxesWidget.d.ts +16 -0
- package/lib/widgets/CheckboxesWidget/CheckboxesWidget.js +73 -0
- package/lib/widgets/CheckboxesWidget/CheckboxesWidget.js.map +1 -0
- package/lib/widgets/CheckboxesWidget/index.d.ts +2 -0
- package/lib/widgets/CheckboxesWidget/index.js +3 -0
- package/lib/widgets/CheckboxesWidget/index.js.map +1 -0
- package/lib/widgets/DateTimeWidget/DateTimeWidget.d.ts +14 -0
- package/lib/widgets/DateTimeWidget/DateTimeWidget.js +207 -0
- package/lib/widgets/DateTimeWidget/DateTimeWidget.js.map +1 -0
- package/lib/widgets/DateTimeWidget/index.d.ts +2 -0
- package/lib/widgets/DateTimeWidget/index.js +3 -0
- package/lib/widgets/DateTimeWidget/index.js.map +1 -0
- package/lib/widgets/DateWidget/DateWidget.d.ts +14 -0
- package/lib/widgets/DateWidget/DateWidget.js +274 -0
- package/lib/widgets/DateWidget/DateWidget.js.map +1 -0
- package/lib/widgets/DateWidget/index.d.ts +2 -0
- package/lib/widgets/DateWidget/index.js +3 -0
- package/lib/widgets/DateWidget/index.js.map +1 -0
- package/lib/widgets/FileWidget/FileWidget.d.ts +12 -0
- package/lib/widgets/FileWidget/FileWidget.js +57 -0
- package/lib/widgets/FileWidget/FileWidget.js.map +1 -0
- package/lib/widgets/FileWidget/index.d.ts +2 -0
- package/lib/widgets/FileWidget/index.js +3 -0
- package/lib/widgets/FileWidget/index.js.map +1 -0
- package/lib/widgets/RadioWidget/RadioWidget.d.ts +14 -0
- package/lib/widgets/RadioWidget/RadioWidget.js +67 -0
- package/lib/widgets/RadioWidget/RadioWidget.js.map +1 -0
- package/lib/widgets/RadioWidget/index.d.ts +2 -0
- package/lib/widgets/RadioWidget/index.js +3 -0
- package/lib/widgets/RadioWidget/index.js.map +1 -0
- package/lib/widgets/RangeWidget/RangeWidget.d.ts +13 -0
- package/lib/widgets/RangeWidget/RangeWidget.js +42 -0
- package/lib/widgets/RangeWidget/RangeWidget.js.map +1 -0
- package/lib/widgets/RangeWidget/index.d.ts +2 -0
- package/lib/widgets/RangeWidget/index.js +3 -0
- package/lib/widgets/RangeWidget/index.js.map +1 -0
- package/lib/widgets/RatingWidget/RatingWidget.d.ts +17 -0
- package/lib/widgets/RatingWidget/RatingWidget.js +64 -0
- package/lib/widgets/RatingWidget/RatingWidget.js.map +1 -0
- package/lib/widgets/RatingWidget/index.d.ts +2 -0
- package/lib/widgets/RatingWidget/index.js +3 -0
- package/lib/widgets/RatingWidget/index.js.map +1 -0
- package/lib/widgets/SelectWidget/SelectWidget.d.ts +14 -0
- package/lib/widgets/SelectWidget/SelectWidget.js +74 -0
- package/lib/widgets/SelectWidget/SelectWidget.js.map +1 -0
- package/lib/widgets/SelectWidget/index.d.ts +2 -0
- package/lib/widgets/SelectWidget/index.js +3 -0
- package/lib/widgets/SelectWidget/index.js.map +1 -0
- package/lib/widgets/TextareaWidget/TextareaWidget.d.ts +12 -0
- package/lib/widgets/TextareaWidget/TextareaWidget.js +44 -0
- package/lib/widgets/TextareaWidget/TextareaWidget.js.map +1 -0
- package/lib/widgets/TextareaWidget/index.d.ts +2 -0
- package/lib/widgets/TextareaWidget/index.js +3 -0
- package/lib/widgets/TextareaWidget/index.js.map +1 -0
- package/lib/widgets/TimeWidget/TimeWidget.d.ts +12 -0
- package/lib/widgets/TimeWidget/TimeWidget.js +42 -0
- package/lib/widgets/TimeWidget/TimeWidget.js.map +1 -0
- package/lib/widgets/TimeWidget/index.d.ts +2 -0
- package/lib/widgets/TimeWidget/index.js +3 -0
- package/lib/widgets/TimeWidget/index.js.map +1 -0
- package/lib/widgets/ToggleWidget/ToggleWidget.d.ts +13 -0
- package/lib/widgets/ToggleWidget/ToggleWidget.js +40 -0
- package/lib/widgets/ToggleWidget/ToggleWidget.js.map +1 -0
- package/lib/widgets/ToggleWidget/index.d.ts +2 -0
- package/lib/widgets/ToggleWidget/index.js +3 -0
- package/lib/widgets/ToggleWidget/index.js.map +1 -0
- package/lib/widgets/Widgets.d.ts +18 -0
- package/lib/widgets/Widgets.js +35 -0
- package/lib/widgets/Widgets.js.map +1 -0
- package/lib/widgets/index.d.ts +2 -0
- package/lib/widgets/index.js +3 -0
- package/lib/widgets/index.js.map +1 -0
- package/package.json +95 -0
- package/src/DaisyUIForm.tsx +9 -0
- package/src/DaisyUIFrameProvider.tsx +107 -0
- package/src/daisyForm/DaisyForm.tsx +20 -0
- package/src/daisyForm/index.ts +2 -0
- package/src/index.ts +13 -0
- package/src/styles.css +9 -0
- package/src/templates/ArrayFieldDescriptionTemplate/ArrayFieldDescriptionTemplate.tsx +19 -0
- package/src/templates/ArrayFieldDescriptionTemplate/index.ts +2 -0
- package/src/templates/ArrayFieldItemButtonsTemplate/ArrayFieldItemButtonsTemplate.tsx +89 -0
- package/src/templates/ArrayFieldItemButtonsTemplate/index.ts +2 -0
- package/src/templates/ArrayFieldItemTemplate/ArrayFieldItemTemplate.tsx +55 -0
- package/src/templates/ArrayFieldItemTemplate/index.ts +2 -0
- package/src/templates/ArrayFieldTemplate/ArrayFieldTemplate.tsx +120 -0
- package/src/templates/ArrayFieldTemplate/index.ts +2 -0
- package/src/templates/ArrayFieldTitleTemplate/ArrayFieldTitleTemplate.tsx +15 -0
- package/src/templates/ArrayFieldTitleTemplate/index.ts +2 -0
- package/src/templates/BaseInputTemplate/BaseInputTemplate.tsx +104 -0
- package/src/templates/BaseInputTemplate/index.ts +2 -0
- package/src/templates/ButtonTemplates/AddButton.tsx +38 -0
- package/src/templates/ButtonTemplates/DaisyUIButton.tsx +31 -0
- package/src/templates/ButtonTemplates/IconButton.tsx +62 -0
- package/src/templates/ButtonTemplates/SubmitButton.tsx +25 -0
- package/src/templates/ButtonTemplates/index.ts +19 -0
- package/src/templates/DescriptionField/DescriptionField.tsx +26 -0
- package/src/templates/DescriptionField/index.ts +2 -0
- package/src/templates/ErrorList/ErrorList.tsx +21 -0
- package/src/templates/ErrorList/index.ts +2 -0
- package/src/templates/FieldErrorTemplate/FieldErrorTemplate.tsx +22 -0
- package/src/templates/FieldErrorTemplate/index.ts +2 -0
- package/src/templates/FieldHelpTemplate/FieldHelpTemplate.tsx +23 -0
- package/src/templates/FieldHelpTemplate/index.ts +2 -0
- package/src/templates/FieldTemplate/FieldTemplate.tsx +66 -0
- package/src/templates/FieldTemplate/index.ts +2 -0
- package/src/templates/GridTemplate/GridTemplate.tsx +26 -0
- package/src/templates/GridTemplate/index.ts +2 -0
- package/src/templates/ObjectFieldTemplate/ObjectFieldTemplate.tsx +108 -0
- package/src/templates/ObjectFieldTemplate/index.ts +2 -0
- package/src/templates/Templates.tsx +63 -0
- package/src/templates/TitleField/TitleField.tsx +26 -0
- package/src/templates/TitleField/index.ts +2 -0
- package/src/templates/WrapIfAdditionalTemplate/WrapIfAdditionalTemplate.tsx +74 -0
- package/src/templates/WrapIfAdditionalTemplate/index.ts +2 -0
- package/src/templates/index.ts +22 -0
- package/src/theme/Theme.tsx +93 -0
- package/src/theme/index.ts +2 -0
- package/src/tsconfig.json +26 -0
- package/src/types/DaisyProps.ts +5 -0
- package/src/types.d.ts +4 -0
- package/src/utils.ts +18 -0
- package/src/widgets/AltDateTimeWidget/AltDateTimeWidget.tsx +14 -0
- package/src/widgets/AltDateTimeWidget/index.ts +2 -0
- package/src/widgets/AltDateWidget/AltDateWidget.tsx +328 -0
- package/src/widgets/AltDateWidget/index.ts +2 -0
- package/src/widgets/CheckboxWidget/CheckboxWidget.tsx +108 -0
- package/src/widgets/CheckboxWidget/index.ts +2 -0
- package/src/widgets/CheckboxesWidget/CheckboxesWidget.tsx +124 -0
- package/src/widgets/CheckboxesWidget/index.ts +2 -0
- package/src/widgets/DateTimeWidget/DateTimeWidget.tsx +343 -0
- package/src/widgets/DateTimeWidget/index.ts +2 -0
- package/src/widgets/DateWidget/DateWidget.tsx +393 -0
- package/src/widgets/DateWidget/index.ts +2 -0
- package/src/widgets/FileWidget/FileWidget.tsx +86 -0
- package/src/widgets/FileWidget/index.ts +2 -0
- package/src/widgets/RadioWidget/RadioWidget.tsx +114 -0
- package/src/widgets/RadioWidget/index.ts +2 -0
- package/src/widgets/RangeWidget/RangeWidget.tsx +78 -0
- package/src/widgets/RangeWidget/index.ts +2 -0
- package/src/widgets/RatingWidget/RatingWidget.tsx +120 -0
- package/src/widgets/RatingWidget/index.ts +2 -0
- package/src/widgets/SelectWidget/SelectWidget.tsx +161 -0
- package/src/widgets/SelectWidget/index.ts +2 -0
- package/src/widgets/TextareaWidget/TextareaWidget.tsx +77 -0
- package/src/widgets/TextareaWidget/index.ts +2 -0
- package/src/widgets/TimeWidget/TimeWidget.tsx +72 -0
- package/src/widgets/TimeWidget/index.ts +2 -0
- package/src/widgets/ToggleWidget/ToggleWidget.tsx +70 -0
- package/src/widgets/ToggleWidget/index.ts +2 -0
- package/src/widgets/Widgets.tsx +58 -0
- package/src/widgets/index.ts +2 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { createContext, ReactNode, useCallback, useContext, useState } from 'react';
|
|
2
|
+
import { getDefaultRegistry, ThemeProps } from '@rjsf/core';
|
|
3
|
+
import { FormContextType, RJSFSchema, StrictRJSFSchema } from '@rjsf/utils';
|
|
4
|
+
|
|
5
|
+
import { generateTemplates } from '../templates/Templates';
|
|
6
|
+
import { generateWidgets } from '../widgets/Widgets';
|
|
7
|
+
|
|
8
|
+
/** Generates a complete theme configuration for RJSF with DaisyUI styling
|
|
9
|
+
*
|
|
10
|
+
* Combines templates and widgets with default fields to create a complete theme
|
|
11
|
+
* that can be used with react-jsonschema-form.
|
|
12
|
+
*
|
|
13
|
+
* @returns A ThemeProps object containing all necessary components for the theme
|
|
14
|
+
*/
|
|
15
|
+
export function generateTheme<
|
|
16
|
+
T = any,
|
|
17
|
+
S extends StrictRJSFSchema = RJSFSchema,
|
|
18
|
+
F extends FormContextType = any,
|
|
19
|
+
>(): ThemeProps<T, S, F> {
|
|
20
|
+
const { fields } = getDefaultRegistry<T, S, F>();
|
|
21
|
+
const generatedWidgets = generateWidgets<T, S, F>();
|
|
22
|
+
const templates = generateTemplates<T, S, F>();
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
templates,
|
|
26
|
+
widgets: {
|
|
27
|
+
...generatedWidgets,
|
|
28
|
+
boolean: generatedWidgets.toggle,
|
|
29
|
+
},
|
|
30
|
+
fields,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Default theme export with pre-generated theme components */
|
|
35
|
+
const Theme = generateTheme();
|
|
36
|
+
|
|
37
|
+
export default Theme;
|
|
38
|
+
|
|
39
|
+
/** Interface for the theme context that manages and provides the current DaisyUI theme */
|
|
40
|
+
interface ThemeContextType {
|
|
41
|
+
/** Current DaisyUI theme name */
|
|
42
|
+
theme: string;
|
|
43
|
+
/** Function to update the current theme */
|
|
44
|
+
setTheme: (theme: string) => void;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** React context for sharing theme information throughout the application */
|
|
48
|
+
export const ThemeContext = createContext<ThemeContextType>({
|
|
49
|
+
theme: 'night',
|
|
50
|
+
setTheme: () => {},
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
/** Props for the ThemeProvider component */
|
|
54
|
+
interface ThemeProviderProps {
|
|
55
|
+
/** React components to be wrapped by the provider */
|
|
56
|
+
children: ReactNode;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** ThemeProvider component that manages DaisyUI theme state and persistence
|
|
60
|
+
*
|
|
61
|
+
* This provider:
|
|
62
|
+
* - Loads the theme from localStorage
|
|
63
|
+
* - Provides theme state via context
|
|
64
|
+
* - Persists theme changes to localStorage
|
|
65
|
+
*
|
|
66
|
+
* @param props - The props for the component
|
|
67
|
+
*/
|
|
68
|
+
export function ThemeProvider({ children }: ThemeProviderProps) {
|
|
69
|
+
const [theme, setTheme] = useState(() => {
|
|
70
|
+
try {
|
|
71
|
+
return localStorage.getItem('daisyui-theme') || 'cupcake';
|
|
72
|
+
} catch {
|
|
73
|
+
return 'cupcake';
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const handleSetTheme = useCallback((newTheme: string) => {
|
|
78
|
+
try {
|
|
79
|
+
localStorage.setItem('daisyui-theme', newTheme);
|
|
80
|
+
setTheme(newTheme);
|
|
81
|
+
} catch {
|
|
82
|
+
// Ignore localStorage errors
|
|
83
|
+
}
|
|
84
|
+
}, []);
|
|
85
|
+
|
|
86
|
+
return <ThemeContext.Provider value={{ theme, setTheme: handleSetTheme }}>{children}</ThemeContext.Provider>;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Custom hook for accessing the current theme and theme setter function
|
|
90
|
+
*
|
|
91
|
+
* @returns The current theme context with theme name and setter function
|
|
92
|
+
*/
|
|
93
|
+
export const useTheme = () => useContext(ThemeContext);
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../../tsconfig.base.json",
|
|
3
|
+
"include": [
|
|
4
|
+
"./"
|
|
5
|
+
],
|
|
6
|
+
"compilerOptions": {
|
|
7
|
+
"rootDir": "./",
|
|
8
|
+
"outDir": "../lib",
|
|
9
|
+
"baseUrl": "../",
|
|
10
|
+
"jsx": "react-jsx",
|
|
11
|
+
"moduleResolution": "node",
|
|
12
|
+
"allowSyntheticDefaultImports": true,
|
|
13
|
+
"esModuleInterop": true
|
|
14
|
+
},
|
|
15
|
+
"references": [
|
|
16
|
+
{
|
|
17
|
+
"path": "../../core"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"path": "../../utils"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"path": "../../validator-ajv8"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
package/src/types.d.ts
ADDED
package/src/utils.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { UiSchema } from '@rjsf/utils';
|
|
2
|
+
|
|
3
|
+
import { DaisyProps } from './types/DaisyProps';
|
|
4
|
+
|
|
5
|
+
export interface DaisyUiSchema extends Omit<UiSchema, 'ui:options'> {
|
|
6
|
+
'ui:options'?: DaisyUiOptions;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
type DaisyUiOptions = UiSchema['ui:options'] & { daisy?: DaisyProps };
|
|
10
|
+
|
|
11
|
+
interface GetDaisyProps {
|
|
12
|
+
uiSchema?: DaisyUiSchema;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function getDaisy({ uiSchema = {} }: GetDaisyProps): DaisyProps {
|
|
16
|
+
const daisyProps = (uiSchema['ui:options'] && uiSchema['ui:options'].daisy) || {};
|
|
17
|
+
return daisyProps;
|
|
18
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FormContextType, RJSFSchema, StrictRJSFSchema, WidgetProps } from '@rjsf/utils';
|
|
2
|
+
|
|
3
|
+
/** The `AltDateTimeWidget` is an alternative widget for rendering datetime properties.
|
|
4
|
+
* It uses the AltDateWidget for rendering, with the `time` prop set to true by default.
|
|
5
|
+
*/
|
|
6
|
+
function AltDateTimeWidget<T = any, S extends StrictRJSFSchema = RJSFSchema, F extends FormContextType = any>({
|
|
7
|
+
time = true,
|
|
8
|
+
...props
|
|
9
|
+
}: WidgetProps<T, S, F>) {
|
|
10
|
+
const { AltDateWidget } = props.registry.widgets;
|
|
11
|
+
return <AltDateWidget time={time} {...props} />;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default AltDateTimeWidget;
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { MouseEvent, useCallback, useEffect, useReducer, useState } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
ariaDescribedByIds,
|
|
4
|
+
FormContextType,
|
|
5
|
+
RJSFSchema,
|
|
6
|
+
StrictRJSFSchema,
|
|
7
|
+
WidgetProps,
|
|
8
|
+
TranslatableString,
|
|
9
|
+
parseDateString,
|
|
10
|
+
toDateString,
|
|
11
|
+
dateRangeOptions,
|
|
12
|
+
DateObject as RJSFDateObject,
|
|
13
|
+
Registry,
|
|
14
|
+
} from '@rjsf/utils';
|
|
15
|
+
|
|
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
|
+
/** The `AltDateWidget` component provides an alternative date/time input
|
|
186
|
+
* with individual fields for year, month, day, and optionally time components.
|
|
187
|
+
*
|
|
188
|
+
* Features:
|
|
189
|
+
* - Supports different date formats (YMD, MDY, DMY)
|
|
190
|
+
* - Optional time selection (hours, minutes, seconds)
|
|
191
|
+
* - "Set to now" and "Clear" buttons
|
|
192
|
+
* - Configurable year ranges
|
|
193
|
+
* - Accessible controls with proper labeling
|
|
194
|
+
* - DaisyUI styling for all elements
|
|
195
|
+
*
|
|
196
|
+
* @param props - The `WidgetProps` for this component
|
|
197
|
+
*/
|
|
198
|
+
export default function AltDateWidget<
|
|
199
|
+
T = any,
|
|
200
|
+
S extends StrictRJSFSchema = RJSFSchema,
|
|
201
|
+
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>) {
|
|
216
|
+
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
|
+
);
|
|
273
|
+
|
|
274
|
+
return (
|
|
275
|
+
<div className='space-y-3'>
|
|
276
|
+
<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) => (
|
|
283
|
+
<div key={i} className='form-control'>
|
|
284
|
+
<label className='label'>
|
|
285
|
+
<span className='label-text capitalize'>{elemProps.type}</span>
|
|
286
|
+
</label>
|
|
287
|
+
<DateElement
|
|
288
|
+
rootId={id}
|
|
289
|
+
name={name}
|
|
290
|
+
select={handleChange}
|
|
291
|
+
type={elemProps.type}
|
|
292
|
+
range={elemProps.range}
|
|
293
|
+
value={elemProps.value}
|
|
294
|
+
disabled={disabled}
|
|
295
|
+
readonly={readonly}
|
|
296
|
+
registry={registry}
|
|
297
|
+
onBlur={onBlur}
|
|
298
|
+
onFocus={onFocus}
|
|
299
|
+
autofocus={autofocus && i === 0}
|
|
300
|
+
/>
|
|
301
|
+
</div>
|
|
302
|
+
))}
|
|
303
|
+
</div>
|
|
304
|
+
<div className='flex justify-start space-x-2'>
|
|
305
|
+
{(options.hideNowButton !== undefined ? !options.hideNowButton : true) && (
|
|
306
|
+
<button
|
|
307
|
+
type='button'
|
|
308
|
+
className='btn btn-sm btn-primary'
|
|
309
|
+
onClick={handleSetNow}
|
|
310
|
+
disabled={disabled || readonly}
|
|
311
|
+
>
|
|
312
|
+
{translateString(TranslatableString.NowLabel)}
|
|
313
|
+
</button>
|
|
314
|
+
)}
|
|
315
|
+
{(options.hideClearButton !== undefined ? !options.hideClearButton : true) && (
|
|
316
|
+
<button
|
|
317
|
+
type='button'
|
|
318
|
+
className='btn btn-sm btn-secondary'
|
|
319
|
+
onClick={handleClear}
|
|
320
|
+
disabled={disabled || readonly}
|
|
321
|
+
>
|
|
322
|
+
{translateString(TranslatableString.ClearLabel)}
|
|
323
|
+
</button>
|
|
324
|
+
)}
|
|
325
|
+
</div>
|
|
326
|
+
</div>
|
|
327
|
+
);
|
|
328
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { useCallback } from 'react';
|
|
2
|
+
import { WidgetProps, StrictRJSFSchema, RJSFSchema, FormContextType, getTemplate, descriptionId } from '@rjsf/utils';
|
|
3
|
+
|
|
4
|
+
/** The `CheckboxWidget` component renders a single checkbox input with DaisyUI styling.
|
|
5
|
+
*
|
|
6
|
+
* Features:
|
|
7
|
+
* - Simple boolean input with DaisyUI checkbox styling
|
|
8
|
+
* - Handles required, disabled, and readonly states
|
|
9
|
+
* - No label rendering (handled by the parent FieldTemplate)
|
|
10
|
+
* - Proper onChange handling for boolean values
|
|
11
|
+
* - Manages focus and blur events for accessibility
|
|
12
|
+
*
|
|
13
|
+
* @param props - The `WidgetProps` for this component
|
|
14
|
+
*/
|
|
15
|
+
export default function CheckboxWidget<
|
|
16
|
+
T = any,
|
|
17
|
+
S extends StrictRJSFSchema = RJSFSchema,
|
|
18
|
+
F extends FormContextType = any,
|
|
19
|
+
>(props: WidgetProps<T, S, F>) {
|
|
20
|
+
const {
|
|
21
|
+
id,
|
|
22
|
+
value,
|
|
23
|
+
required,
|
|
24
|
+
disabled,
|
|
25
|
+
hideLabel,
|
|
26
|
+
label,
|
|
27
|
+
readonly,
|
|
28
|
+
registry,
|
|
29
|
+
options,
|
|
30
|
+
schema,
|
|
31
|
+
uiSchema,
|
|
32
|
+
onChange,
|
|
33
|
+
onFocus,
|
|
34
|
+
onBlur,
|
|
35
|
+
} = props;
|
|
36
|
+
const DescriptionFieldTemplate = getTemplate<'DescriptionFieldTemplate', T, S, F>(
|
|
37
|
+
'DescriptionFieldTemplate',
|
|
38
|
+
registry,
|
|
39
|
+
options,
|
|
40
|
+
);
|
|
41
|
+
const description = options.description || schema.description;
|
|
42
|
+
|
|
43
|
+
/** Handle focus events
|
|
44
|
+
*/
|
|
45
|
+
const handleFocus = useCallback(() => {
|
|
46
|
+
if (onFocus) {
|
|
47
|
+
onFocus(id, value);
|
|
48
|
+
}
|
|
49
|
+
}, [onFocus, id, value]);
|
|
50
|
+
|
|
51
|
+
/** Handle blur events
|
|
52
|
+
*/
|
|
53
|
+
const handleBlur = useCallback(() => {
|
|
54
|
+
if (onBlur) {
|
|
55
|
+
onBlur(id, value);
|
|
56
|
+
}
|
|
57
|
+
}, [onBlur, id, value]);
|
|
58
|
+
|
|
59
|
+
/** Handle change events
|
|
60
|
+
*
|
|
61
|
+
* @param event - The change event
|
|
62
|
+
*/
|
|
63
|
+
const handleChange = useCallback(
|
|
64
|
+
(event: React.ChangeEvent<HTMLInputElement>) => {
|
|
65
|
+
onChange(event.target.checked);
|
|
66
|
+
},
|
|
67
|
+
[onChange],
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
const input = (
|
|
71
|
+
<input
|
|
72
|
+
type='checkbox'
|
|
73
|
+
id={id}
|
|
74
|
+
checked={value}
|
|
75
|
+
required={required}
|
|
76
|
+
disabled={disabled || readonly}
|
|
77
|
+
onChange={handleChange}
|
|
78
|
+
onFocus={handleFocus}
|
|
79
|
+
onBlur={handleBlur}
|
|
80
|
+
className='checkbox'
|
|
81
|
+
/>
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<div className='form-control'>
|
|
86
|
+
{!hideLabel && description && (
|
|
87
|
+
<DescriptionFieldTemplate
|
|
88
|
+
id={descriptionId<T>(id)}
|
|
89
|
+
description={description}
|
|
90
|
+
schema={schema}
|
|
91
|
+
uiSchema={uiSchema}
|
|
92
|
+
registry={registry}
|
|
93
|
+
/>
|
|
94
|
+
)}
|
|
95
|
+
{hideLabel || !label ? (
|
|
96
|
+
input
|
|
97
|
+
) : (
|
|
98
|
+
<label className='label cursor-pointer justify-start'>
|
|
99
|
+
<div className='mr-2'>{input}</div>
|
|
100
|
+
<span className='label-text'>
|
|
101
|
+
{label}
|
|
102
|
+
{required && <span className='text-error ml-1'>*</span>}
|
|
103
|
+
</span>
|
|
104
|
+
</label>
|
|
105
|
+
)}
|
|
106
|
+
</div>
|
|
107
|
+
);
|
|
108
|
+
}
|