@react-fabric/form 1.0.0-beta.5 → 1.0.0-beta.52
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/{src/input/ArrayInput.module.css → css/_arrayInput.css} +8 -8
- package/css/_colorPicker.css +65 -0
- package/{src/internal/Field.module.css → css/_field.css} +64 -29
- package/{src/input/File.module.css → css/_file.css} +21 -6
- package/css/styles.css +27 -0
- package/dist/cjs/builder/FileField.js +37 -25
- package/dist/cjs/builder/FormField.js +50 -34
- package/dist/cjs/builder/SchemaEditor.js +72 -0
- package/dist/cjs/builder/components/AddSchemaFields.js +62 -0
- package/dist/cjs/builder/components/SchemaArrayForm.js +143 -0
- package/dist/cjs/builder/components/SchemaField.js +414 -0
- package/dist/cjs/form/Controller.js +46 -1
- package/dist/cjs/form/Form.js +43 -6
- package/dist/cjs/hooks/useFileUploader.js +16 -0
- package/dist/cjs/hooks/useFormBuilder.js +57 -15
- package/dist/cjs/i18n/ar.json.js +5 -4
- package/dist/cjs/i18n/en.json.js +5 -5
- package/dist/cjs/index.js +11 -2
- package/dist/cjs/input/ArrayInput.js +100 -33
- package/dist/cjs/input/AvatarInput.js +17 -8
- package/dist/cjs/input/Checkbox.js +15 -5
- package/dist/cjs/input/ColorInput.js +108 -56
- package/dist/cjs/input/ColorPicker.js +11 -35
- package/dist/cjs/input/DateInput.js +195 -0
- package/dist/cjs/input/Field.js +10 -4
- package/dist/cjs/input/File.js +14 -7
- package/dist/cjs/input/Hidden.js +11 -1
- package/dist/cjs/input/Input.js +19 -7
- package/dist/cjs/input/Number.js +17 -7
- package/dist/cjs/input/Password.js +16 -8
- package/dist/cjs/input/Radio.js +11 -2
- package/dist/cjs/input/RadioGroup.js +14 -3
- package/dist/cjs/input/{Range.js → RangeSlider.js} +14 -6
- package/dist/cjs/input/Search.js +25 -16
- package/dist/cjs/input/Slider.js +10 -4
- package/dist/cjs/input/Switch.js +39 -7
- package/dist/cjs/input/Textarea.js +23 -4
- package/dist/cjs/internal/ErrorIcon.js +1 -1
- package/dist/cjs/internal/FieldWrapper.js +11 -4
- package/dist/cjs/internal/InputWrapper.js +19 -16
- package/dist/cjs/select/AutoComplete.js +19 -8
- package/dist/cjs/select/DualList.js +15 -1
- package/dist/cjs/select/List.js +45 -20
- package/dist/cjs/select/Options.js +2 -2
- package/dist/cjs/select/Select.js +14 -4
- package/dist/cjs/select/useSelect.js +10 -6
- package/dist/cjs/types/schema.js +43 -0
- package/dist/cjs/utils/eventHandlers.js +11 -5
- package/dist/cjs/utils/getColor.js +6 -0
- package/dist/esm/builder/FileField.js +39 -27
- package/dist/esm/builder/FormField.js +50 -34
- package/dist/esm/builder/SchemaEditor.js +72 -0
- package/dist/esm/builder/components/AddSchemaFields.js +62 -0
- package/dist/esm/builder/components/SchemaArrayForm.js +143 -0
- package/dist/esm/builder/components/SchemaField.js +414 -0
- package/dist/esm/form/Controller.js +46 -1
- package/dist/esm/form/Form.js +43 -6
- package/dist/esm/hooks/useFileUploader.js +16 -0
- package/dist/esm/hooks/useFormBuilder.js +55 -13
- package/dist/esm/i18n/ar.json.js +5 -4
- package/dist/esm/i18n/en.json.js +5 -5
- package/dist/esm/index.js +5 -1
- package/dist/esm/input/ArrayInput.js +100 -33
- package/dist/esm/input/AvatarInput.js +17 -8
- package/dist/esm/input/Checkbox.js +15 -5
- package/dist/esm/input/ColorInput.js +110 -58
- package/dist/esm/input/ColorPicker.js +11 -35
- package/dist/esm/input/DateInput.js +195 -0
- package/dist/esm/input/Field.js +11 -5
- package/dist/esm/input/File.js +16 -9
- package/dist/esm/input/Hidden.js +11 -1
- package/dist/esm/input/Input.js +21 -9
- package/dist/esm/input/Number.js +19 -9
- package/dist/esm/input/Password.js +18 -10
- package/dist/esm/input/Radio.js +11 -2
- package/dist/esm/input/RadioGroup.js +15 -4
- package/dist/esm/input/{Range.js → RangeSlider.js} +14 -6
- package/dist/esm/input/Search.js +27 -18
- package/dist/esm/input/Slider.js +10 -4
- package/dist/esm/input/Switch.js +41 -9
- package/dist/esm/input/Textarea.js +24 -5
- package/dist/esm/internal/ErrorIcon.js +1 -1
- package/dist/esm/internal/FieldWrapper.js +11 -4
- package/dist/esm/internal/InputWrapper.js +19 -16
- package/dist/esm/select/AutoComplete.js +19 -8
- package/dist/esm/select/DualList.js +15 -1
- package/dist/esm/select/List.js +46 -21
- package/dist/esm/select/Options.js +2 -2
- package/dist/esm/select/Select.js +14 -4
- package/dist/esm/select/useSelect.js +11 -7
- package/{src/input/ColorPicker.module.css → dist/esm/types/schema.js} +18 -27
- package/dist/esm/utils/eventHandlers.js +11 -5
- package/dist/esm/utils/getColor.js +6 -1
- package/dist/types/builder/FileField.d.ts +4 -2
- package/dist/types/builder/FormField.d.ts +3 -1
- package/dist/types/builder/SchemaEditor.d.ts +9 -0
- package/dist/types/builder/components/AddSchemaFields.d.ts +2 -0
- package/dist/types/builder/components/SchemaArrayForm.d.ts +2 -0
- package/dist/types/builder/components/SchemaField.d.ts +10 -0
- package/dist/types/form/Controller.d.ts +47 -2
- package/dist/types/form/Form.d.ts +37 -2
- package/dist/types/hooks/useFileUploader.d.ts +16 -0
- package/dist/types/hooks/useFormBuilder.d.ts +32 -1
- package/dist/types/index.d.ts +5 -2
- package/dist/types/input/ArrayInput.d.ts +78 -6
- package/dist/types/input/AvatarInput.d.ts +14 -3
- package/dist/types/input/Checkbox.d.ts +13 -4
- package/dist/types/input/ColorInput.d.ts +15 -2
- package/dist/types/input/ColorPicker.d.ts +11 -1
- package/dist/types/input/DateInput.d.ts +28 -0
- package/dist/types/input/Field.d.ts +5 -1
- package/dist/types/input/File.d.ts +9 -0
- package/dist/types/input/Hidden.d.ts +8 -0
- package/dist/types/input/Input.d.ts +9 -1
- package/dist/types/input/Number.d.ts +9 -1
- package/dist/types/input/Password.d.ts +7 -1
- package/dist/types/input/Radio.d.ts +9 -1
- package/dist/types/input/RadioGroup.d.ts +26 -3
- package/dist/types/input/{Range.d.ts → RangeSlider.d.ts} +10 -2
- package/dist/types/input/Search.d.ts +14 -1
- package/dist/types/input/Slider.d.ts +7 -1
- package/dist/types/input/Switch.d.ts +16 -4
- package/dist/types/input/Textarea.d.ts +15 -1
- package/dist/types/internal/FieldWrapper.d.ts +1 -1
- package/dist/types/internal/InputWrapper.d.ts +1 -1
- package/dist/types/ranger/index.d.ts +2 -2
- package/dist/types/select/AutoComplete.d.ts +8 -1
- package/dist/types/select/DualList.d.ts +17 -2
- package/dist/types/select/List.d.ts +9 -1
- package/dist/types/select/Select.d.ts +9 -1
- package/dist/types/select/useSelect.d.ts +7 -6
- package/dist/types/types/index.d.ts +28 -7
- package/dist/types/types/schema.d.ts +78 -33
- package/dist/types/utils/eventHandlers.d.ts +1 -1
- package/package.json +15 -12
- package/src/builder/FileField.tsx +53 -27
- package/src/builder/FormField.tsx +52 -32
- package/src/builder/SchemaEditor.tsx +79 -0
- package/src/builder/components/AddSchemaFields.tsx +74 -0
- package/src/builder/components/SchemaArrayForm.tsx +158 -0
- package/src/builder/components/SchemaField.tsx +436 -0
- package/src/form/Controller.tsx +48 -3
- package/src/form/Form.tsx +45 -5
- package/src/hooks/useFileUploader.ts +16 -0
- package/src/hooks/useFormBuilder.tsx +58 -15
- package/src/i18n/ar.json +5 -4
- package/src/i18n/en.json +5 -5
- package/src/index.ts +11 -2
- package/src/input/ArrayInput.tsx +169 -54
- package/src/input/AvatarInput.tsx +20 -8
- package/src/input/Checkbox.tsx +15 -5
- package/src/input/ColorInput.tsx +126 -69
- package/src/input/ColorPicker.tsx +12 -36
- package/src/input/DateInput.tsx +259 -0
- package/src/input/Field.tsx +15 -11
- package/src/input/File.tsx +16 -14
- package/src/input/Hidden.tsx +12 -1
- package/src/input/Input.tsx +23 -10
- package/src/input/Number.tsx +18 -10
- package/src/input/Password.tsx +19 -12
- package/src/input/Radio.tsx +11 -2
- package/src/input/RadioGroup.tsx +35 -4
- package/src/input/{Range.tsx → RangeSlider.tsx} +13 -5
- package/src/input/Search.tsx +29 -19
- package/src/input/Slider.tsx +10 -4
- package/src/input/Switch.tsx +52 -7
- package/src/input/Textarea.tsx +29 -5
- package/src/internal/ErrorIcon.tsx +1 -1
- package/src/internal/FieldWrapper.tsx +8 -4
- package/src/internal/InputWrapper.tsx +36 -20
- package/src/select/AutoComplete.tsx +12 -1
- package/src/select/DualList.tsx +19 -0
- package/src/select/List.tsx +49 -8
- package/src/select/Options.tsx +1 -1
- package/src/select/Select.tsx +21 -3
- package/src/select/useSelect.tsx +13 -5
- package/src/types/index.ts +34 -8
- package/src/types/schema.ts +96 -41
- package/src/utils/eventHandlers.ts +9 -3
- package/dist/cjs/input/ArrayInput.module.css +0 -1
- package/dist/cjs/input/ColorPicker.module.css +0 -1
- package/dist/cjs/input/File.module.css +0 -1
- package/dist/cjs/internal/Field.module.css +0 -1
- package/dist/esm/input/ArrayInput.module.css +0 -1
- package/dist/esm/input/ColorPicker.module.css +0 -1
- package/dist/esm/input/File.module.css +0 -1
- package/dist/esm/internal/Field.module.css +0 -1
package/dist/cjs/form/Form.js
CHANGED
|
@@ -7,6 +7,7 @@ var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProp
|
|
|
7
7
|
var _regeneratorRuntime = require('@babel/runtime/regenerator');
|
|
8
8
|
var yup = require('@hookform/resolvers/yup');
|
|
9
9
|
var core = require('@react-fabric/core');
|
|
10
|
+
var utilities = require('@react-fabric/utilities');
|
|
10
11
|
var react = require('react');
|
|
11
12
|
var reactHookForm = require('react-hook-form');
|
|
12
13
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -17,13 +18,46 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
17
18
|
var DEFAULT_SUBMIT = function DEFAULT_SUBMIT() {
|
|
18
19
|
return undefined;
|
|
19
20
|
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Form component for managing form state and validation using react-hook-form and yup.
|
|
24
|
+
* It provides a simple interface for form handling, including submission, validation, and value management.
|
|
25
|
+
* It supports nested form structures and allows for custom validation schemas using Yup.
|
|
26
|
+
*
|
|
27
|
+
* @param {FormProps<K>} props - The properties for the Form component.
|
|
28
|
+
* @returns {JSX.Element} The rendered Form component.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```jsx
|
|
32
|
+
* <Form
|
|
33
|
+
* formRef={formRef}
|
|
34
|
+
* schema={yup.object().shape({
|
|
35
|
+
* name: yup.string().required("Name is required"),
|
|
36
|
+
* email: yup.string().email("Invalid email").required("Email is required"),
|
|
37
|
+
* })}
|
|
38
|
+
* defaultValues={{ name: "", email: "" }}
|
|
39
|
+
* onSubmit={(values) => {
|
|
40
|
+
* console.log("Form submitted with values:", values);
|
|
41
|
+
* }}
|
|
42
|
+
* >
|
|
43
|
+
* <input name="name" ref={form.register} placeholder="Name" />
|
|
44
|
+
* <input name="email" ref={form.register} placeholder="Email" />
|
|
45
|
+
* <button type="submit">Submit</button>
|
|
46
|
+
* </Form>
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* @see {@link https://adarshpastakia.github.io/react-fabric/?path=/docs/form-form--docs} for the properties that can be passed to this component.
|
|
50
|
+
* @see {@link https://react-hook-form.com/docs/useform} for more details on the properties.
|
|
51
|
+
* @see {@link https://github.com/jquense/yup} for more details on the Yup validation schema.
|
|
52
|
+
*/
|
|
20
53
|
var Form = function Form(_ref) {
|
|
21
54
|
var formRef = _ref.formRef,
|
|
22
55
|
schema = _ref.schema,
|
|
23
56
|
children = _ref.children,
|
|
24
|
-
defaultValues = _ref.defaultValues,
|
|
57
|
+
_ref$defaultValues = _ref.defaultValues,
|
|
58
|
+
defaultValues = _ref$defaultValues === void 0 ? utilities.EMPTY_OBJECT : _ref$defaultValues,
|
|
25
59
|
_ref$onSubmit = _ref.onSubmit,
|
|
26
|
-
|
|
60
|
+
_onSubmit = _ref$onSubmit === void 0 ? DEFAULT_SUBMIT : _ref$onSubmit,
|
|
27
61
|
onChange = _ref.onChange,
|
|
28
62
|
rest = _objectWithoutProperties(_ref, _excluded);
|
|
29
63
|
var ref = react.useRef(null);
|
|
@@ -35,7 +69,7 @@ var Form = function Form(_ref) {
|
|
|
35
69
|
var _useTransition = react.useTransition(),
|
|
36
70
|
_useTransition2 = _slicedToArray(_useTransition, 2),
|
|
37
71
|
startTransition = _useTransition2[1];
|
|
38
|
-
var changeHandler = core.useDebounce(onChange, [onChange]);
|
|
72
|
+
var changeHandler = core.useDebounce(onChange, [onChange], 300);
|
|
39
73
|
react.useEffect(function () {
|
|
40
74
|
var subscription = form.watch(function (value) {
|
|
41
75
|
startTransition(function () {
|
|
@@ -63,7 +97,7 @@ var Form = function Form(_ref) {
|
|
|
63
97
|
return handleReset();
|
|
64
98
|
},
|
|
65
99
|
submit: function submit() {
|
|
66
|
-
return form.handleSubmit(
|
|
100
|
+
return form.handleSubmit(_onSubmit);
|
|
67
101
|
},
|
|
68
102
|
validate: function () {
|
|
69
103
|
var _validate = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
@@ -102,7 +136,7 @@ var Form = function Form(_ref) {
|
|
|
102
136
|
}, 50);
|
|
103
137
|
}
|
|
104
138
|
};
|
|
105
|
-
}, [
|
|
139
|
+
}, [_onSubmit, form, form.formState, defaultValues]);
|
|
106
140
|
var onInvalid = react.useCallback(function (_, e) {
|
|
107
141
|
var el = e.target;
|
|
108
142
|
setTimeout(function () {
|
|
@@ -116,7 +150,10 @@ var Form = function Form(_ref) {
|
|
|
116
150
|
onReset: function onReset() {
|
|
117
151
|
return handleReset(defaultValues);
|
|
118
152
|
},
|
|
119
|
-
onSubmit:
|
|
153
|
+
onSubmit: function onSubmit(e) {
|
|
154
|
+
e.stopPropagation();
|
|
155
|
+
void form.handleSubmit(_onSubmit, onInvalid)(e);
|
|
156
|
+
},
|
|
120
157
|
"data-loading": form.formState.isSubmitting,
|
|
121
158
|
className: "contents",
|
|
122
159
|
autoComplete: "off"
|
|
@@ -12,6 +12,22 @@ var _excluded = ["progress", "abort"],
|
|
|
12
12
|
_excluded2 = ["file", "progress", "abort"];
|
|
13
13
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
14
14
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
15
|
+
/**
|
|
16
|
+
* useFileUploader hook provides a way to handle file uploads
|
|
17
|
+
* with progress tracking, error handling, and file management.
|
|
18
|
+
* It uses a reducer to manage the state of uploaded files and their statuses.
|
|
19
|
+
*
|
|
20
|
+
* @param uploader - The function that handles the file upload.
|
|
21
|
+
* @param initialList - Initial list of files to be managed by the uploader.
|
|
22
|
+
* @param multiple - Whether to allow multiple file uploads or not.
|
|
23
|
+
* @returns An object containing methods to upload, remove, retry files,
|
|
24
|
+
* and the current state of the uploader including pending uploads and file list.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```jsx
|
|
28
|
+
* const { upload, remove, retry, state } = useFileUploader(uploader, initialList, multiple);
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
15
31
|
var useFileUploader = function useFileUploader(uploader, initialList) {
|
|
16
32
|
var multiple = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
17
33
|
var _useReducer = react.useReducer(function (state, action) {
|
|
@@ -1,33 +1,42 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
|
|
4
|
+
var core = require('@react-fabric/core');
|
|
4
5
|
var utilities = require('@react-fabric/utilities');
|
|
5
6
|
var react = require('react');
|
|
6
7
|
var FormField = require('../builder/FormField.js');
|
|
8
|
+
var schema = require('../types/schema.js');
|
|
7
9
|
var jsxRuntime = require('react/jsx-runtime');
|
|
8
10
|
|
|
9
11
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
10
12
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
11
13
|
var makeYupField = function makeYupField(field) {
|
|
12
|
-
var yupField = utilities.yup.string();
|
|
13
|
-
if (field.datatype ===
|
|
14
|
+
var yupField = utilities.yup.string().trim();
|
|
15
|
+
if (field.datatype === schema.DATA_TYPES.SCHEMA) {
|
|
14
16
|
var child = Object.fromEntries(field.schema.map(function (field) {
|
|
15
17
|
return [field.id, makeYupField(field)];
|
|
16
18
|
}));
|
|
17
19
|
yupField = utilities.yup.object(child);
|
|
18
20
|
}
|
|
19
|
-
if (field.datatype ===
|
|
20
|
-
|
|
21
|
+
if (field.datatype === schema.DATA_TYPES.BOOL) {
|
|
22
|
+
yupField = utilities.yup["boolean"]();
|
|
23
|
+
if (field.required) yupField = yupField.test({
|
|
24
|
+
test: function test(value) {
|
|
25
|
+
return !!value;
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
if (field.datatype === schema.DATA_TYPES.NUMBER || field.datatype === schema.DATA_TYPES.RANGE) {
|
|
21
30
|
yupField = utilities.yup.number();
|
|
22
31
|
!utilities.isNil(field.min) && (yupField = yupField.min(field.min));
|
|
23
32
|
!utilities.isNil(field.max) && (yupField = yupField.max(field.max));
|
|
24
|
-
if (field.datatype ===
|
|
33
|
+
if (field.datatype === schema.DATA_TYPES.RANGE) yupField = utilities.yup.array(yupField);
|
|
25
34
|
}
|
|
26
|
-
if (field.datatype ===
|
|
27
|
-
field.options && (yupField = yupField.oneOf(field.options));
|
|
35
|
+
if (field.datatype === schema.DATA_TYPES.STRING) {
|
|
36
|
+
field.options && !field.allowCustom && (yupField = yupField.oneOf(field.options));
|
|
28
37
|
field.regex && (yupField = yupField.matches(new RegExp(field.regex)));
|
|
29
38
|
}
|
|
30
|
-
if (field.datatype ===
|
|
39
|
+
if (field.datatype === schema.DATA_TYPES.FILE) {
|
|
31
40
|
yupField = utilities.yup.object({
|
|
32
41
|
filename: utilities.yup.string().required(),
|
|
33
42
|
path: utilities.yup.string().required()
|
|
@@ -53,30 +62,63 @@ var makeYupField = function makeYupField(field) {
|
|
|
53
62
|
}
|
|
54
63
|
return yupField.label(field.label);
|
|
55
64
|
};
|
|
56
|
-
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* useFormBuilder hook to create a form definition based on a schema.
|
|
68
|
+
* It generates a Yup validation schema and a form definition component.
|
|
69
|
+
*
|
|
70
|
+
* @param {FormSchema} schema - The schema defining the form fields.
|
|
71
|
+
* @param {Object} options - Optional parameters for the form builder.
|
|
72
|
+
* @returns An object containing the form definition and the Yup validation schema.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```jsx
|
|
76
|
+
* const { formDef, schemaDef } = useFormBuilder(schema, {
|
|
77
|
+
* prefix: "form",
|
|
78
|
+
* inline: true,
|
|
79
|
+
* fileUrl: (path) => `/files/${path}`,
|
|
80
|
+
* uploadHandler: async (file) => {
|
|
81
|
+
* // handle file upload
|
|
82
|
+
* },
|
|
83
|
+
* optionLists: {
|
|
84
|
+
* // define option lists for select fields
|
|
85
|
+
* }
|
|
86
|
+
* * });
|
|
87
|
+
* <FormBuilder
|
|
88
|
+
* schema={schemaDef}
|
|
89
|
+
* onSubmit={(data) => console.log(data)}
|
|
90
|
+
* >
|
|
91
|
+
* {formDef}
|
|
92
|
+
* </FormBuilder>
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
var useFormBuilder = function useFormBuilder(schema$1) {
|
|
57
96
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
58
97
|
var filteredSchema = react.useMemo(function () {
|
|
59
98
|
var _schema$filter, _schema$filter2;
|
|
60
|
-
return (_schema$filter = (_schema$filter2 = schema.filter) === null || _schema$filter2 === void 0 ? void 0 : _schema$filter2.call(schema, function (schm) {
|
|
99
|
+
return (_schema$filter = (_schema$filter2 = schema$1.filter) === null || _schema$filter2 === void 0 ? void 0 : _schema$filter2.call(schema$1, function (schm) {
|
|
61
100
|
return !!schm.id;
|
|
62
101
|
})) !== null && _schema$filter !== void 0 ? _schema$filter : [];
|
|
63
|
-
}, [schema]);
|
|
102
|
+
}, [schema$1]);
|
|
64
103
|
var schemaDef = utilities.yup.object(Object.fromEntries(filteredSchema.map(function (field) {
|
|
65
104
|
return [field.id, makeYupField(field)];
|
|
66
105
|
})));
|
|
67
|
-
var formDef = /*#__PURE__*/jsxRuntime.
|
|
68
|
-
children: filteredSchema.map(function (field, idx) {
|
|
106
|
+
var formDef = /*#__PURE__*/jsxRuntime.jsxs(react.Fragment, {
|
|
107
|
+
children: [filteredSchema.map(function (field, idx) {
|
|
69
108
|
return /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
70
109
|
className: "mb-4",
|
|
71
|
-
children: field.datatype ===
|
|
110
|
+
children: field.datatype === schema.DATA_TYPES.SCHEMA ? null : /*#__PURE__*/jsxRuntime.jsx(FormField.FormField, _objectSpread(_objectSpread({}, field), {}, {
|
|
72
111
|
autoFocus: idx === 0,
|
|
73
112
|
fileUrl: options.fileUrl,
|
|
113
|
+
optionLists: options.optionLists,
|
|
74
114
|
uploadHandler: options.uploadHandler,
|
|
75
115
|
inline: options.inline,
|
|
76
116
|
prefix: options.prefix
|
|
77
117
|
}))
|
|
78
118
|
}, field.id);
|
|
79
|
-
})
|
|
119
|
+
}), filteredSchema.length === 0 && /*#__PURE__*/jsxRuntime.jsx(core.EmptyContent, {
|
|
120
|
+
message: "No schema defined"
|
|
121
|
+
})]
|
|
80
122
|
});
|
|
81
123
|
return {
|
|
82
124
|
formDef: formDef,
|
package/dist/cjs/i18n/ar.json.js
CHANGED
|
@@ -4,17 +4,18 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var addArray = "اضافة عنصر";
|
|
6
6
|
var password = {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
hide: "اخفاء كلمة المرور",
|
|
8
|
+
show: "عرض كلمة المرور"
|
|
9
9
|
};
|
|
10
10
|
var select = {
|
|
11
|
+
createOption: "إنشاء خيار جديد ل ",
|
|
11
12
|
emptyList: "لا توجد خيارات متاحة",
|
|
12
|
-
notFound: "لم يتم العثور على خيارات ل "
|
|
13
|
-
createOption: "إنشاء خيار جديد ل "
|
|
13
|
+
notFound: "لم يتم العثور على خيارات ل "
|
|
14
14
|
};
|
|
15
15
|
var yup = {
|
|
16
16
|
arrayMax: "{{label}} حدد ما يصل {{max}} غرض",
|
|
17
17
|
arrayMin: "{{label}} اختر على الأقل {{min}} غرض",
|
|
18
|
+
empty: "{{label}} يجب ألا يكون فارغًا",
|
|
18
19
|
invalid: "{{label}} نوع بيانات غير صالح",
|
|
19
20
|
invalidType: "{{label}} غير صالح",
|
|
20
21
|
numberMax: "{{label}} الحد الأقصى {{max}}",
|
package/dist/cjs/i18n/en.json.js
CHANGED
|
@@ -4,19 +4,19 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var addArray = "Add Item";
|
|
6
6
|
var password = {
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
hide: "Hide password",
|
|
8
|
+
show: "Show password"
|
|
9
9
|
};
|
|
10
10
|
var select = {
|
|
11
|
+
createOption: "Create new option for <0>{{query}}</0>",
|
|
11
12
|
emptyList: "No options available",
|
|
12
|
-
notFound: "No options found for <0>{{query}}</0>"
|
|
13
|
-
createOption: "Create new option for <0>{{query}}</0>"
|
|
13
|
+
notFound: "No options found for <0>{{query}}</0>"
|
|
14
14
|
};
|
|
15
15
|
var yup = {
|
|
16
16
|
arrayMax: "{{label}} must contain upto {{max}} item",
|
|
17
17
|
arrayMin: "{{label}} must contain atleast {{min}} item",
|
|
18
|
-
invalid: "{{label}} invalid",
|
|
19
18
|
empty: "{{label}} must not be empty",
|
|
19
|
+
invalid: "{{label}} invalid",
|
|
20
20
|
invalidType: "{{label}} invalid datatype",
|
|
21
21
|
numberMax: "{{label}} maximum {{max}}",
|
|
22
22
|
numberMin: "{{label}} minimum {{min}}",
|
package/dist/cjs/index.js
CHANGED
|
@@ -3,12 +3,16 @@
|
|
|
3
3
|
require('./i18n/index.js');
|
|
4
4
|
var Controller = require('./form/Controller.js');
|
|
5
5
|
var Form = require('./form/Form.js');
|
|
6
|
+
var SchemaEditor = require('./builder/SchemaEditor.js');
|
|
6
7
|
var useFileUploader = require('./hooks/useFileUploader.js');
|
|
7
8
|
var useFormBuilder = require('./hooks/useFormBuilder.js');
|
|
9
|
+
var schema = require('./types/schema.js');
|
|
8
10
|
var ArrayInput = require('./input/ArrayInput.js');
|
|
11
|
+
var AvatarInput = require('./input/AvatarInput.js');
|
|
9
12
|
var Checkbox = require('./input/Checkbox.js');
|
|
10
13
|
var ColorInput = require('./input/ColorInput.js');
|
|
11
14
|
var ColorPicker = require('./input/ColorPicker.js');
|
|
15
|
+
var DateInput = require('./input/DateInput.js');
|
|
12
16
|
var Field = require('./input/Field.js');
|
|
13
17
|
var File = require('./input/File.js');
|
|
14
18
|
var Hidden = require('./input/Hidden.js');
|
|
@@ -17,7 +21,7 @@ var Number = require('./input/Number.js');
|
|
|
17
21
|
var Password = require('./input/Password.js');
|
|
18
22
|
var Radio = require('./input/Radio.js');
|
|
19
23
|
var RadioGroup = require('./input/RadioGroup.js');
|
|
20
|
-
var
|
|
24
|
+
var RangeSlider = require('./input/RangeSlider.js');
|
|
21
25
|
var Search = require('./input/Search.js');
|
|
22
26
|
var Slider = require('./input/Slider.js');
|
|
23
27
|
var Switch = require('./input/Switch.js');
|
|
@@ -31,12 +35,17 @@ var Select = require('./select/Select.js');
|
|
|
31
35
|
|
|
32
36
|
exports.Controller = Controller.Controller;
|
|
33
37
|
exports.Form = Form.Form;
|
|
38
|
+
exports.SchemaEditor = SchemaEditor.SchemaEditor;
|
|
34
39
|
exports.useFileUploader = useFileUploader.useFileUploader;
|
|
35
40
|
exports.useFormBuilder = useFormBuilder.useFormBuilder;
|
|
41
|
+
exports.DATA_TYPES = schema.DATA_TYPES;
|
|
42
|
+
exports.SCHEMA_CUSTOM_LIST = schema.SCHEMA_CUSTOM_LIST;
|
|
36
43
|
exports.ArrayInput = ArrayInput.ArrayInput;
|
|
44
|
+
exports.AvatarInput = AvatarInput.AvatarInput;
|
|
37
45
|
exports.Checkbox = Checkbox.Checkbox;
|
|
38
46
|
exports.ColorInput = ColorInput.ColorInput;
|
|
39
47
|
exports.ColorPicker = ColorPicker.ColorPicker;
|
|
48
|
+
exports.DateInput = DateInput.DateInput;
|
|
40
49
|
exports.Field = Field.Field;
|
|
41
50
|
exports.FileInput = File.FileInput;
|
|
42
51
|
exports.HiddenInput = Hidden.HiddenInput;
|
|
@@ -45,7 +54,7 @@ exports.Number = Number.Number;
|
|
|
45
54
|
exports.Password = Password.Password;
|
|
46
55
|
exports.Radio = Radio.Radio;
|
|
47
56
|
exports.RadioGroup = RadioGroup.RadioGroup;
|
|
48
|
-
exports.
|
|
57
|
+
exports.RangeSlider = RangeSlider.RangeSlider;
|
|
49
58
|
exports.Search = Search.Search;
|
|
50
59
|
exports.Slider = Slider.Slider;
|
|
51
60
|
exports.Switch = Switch.Switch;
|
|
@@ -5,29 +5,71 @@ var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProp
|
|
|
5
5
|
var core = require('@dnd-kit/core');
|
|
6
6
|
var sortable = require('@dnd-kit/sortable');
|
|
7
7
|
var core$1 = require('@react-fabric/core');
|
|
8
|
-
var utilities
|
|
8
|
+
var utilities = require('@react-fabric/utilities');
|
|
9
9
|
var classNames = require('classnames');
|
|
10
10
|
var react = require('react');
|
|
11
11
|
var reactHookForm = require('react-hook-form');
|
|
12
12
|
var reactI18next = require('react-i18next');
|
|
13
13
|
var FieldWrapper = require('../internal/FieldWrapper.js');
|
|
14
|
-
var ArrayInput_module = require('./ArrayInput.module.css');
|
|
15
14
|
var modifiers = require('@dnd-kit/modifiers');
|
|
16
|
-
var utilities = require('@dnd-kit/utilities');
|
|
15
|
+
var utilities$1 = require('@dnd-kit/utilities');
|
|
17
16
|
var jsxRuntime = require('react/jsx-runtime');
|
|
18
17
|
|
|
19
|
-
var _excluded = ["name", "children", "addLabel", "fixedList", "focusName", "onAdd", "arrayRef", "enableSorting", "disabled", "readOnly", "minItems"];
|
|
18
|
+
var _excluded = ["name", "children", "addLabel", "fixedList", "focusName", "buttonPosition", "onAdd", "onRemove", "onBeforeRemove", "canRemove", "arrayRef", "enableSorting", "disabled", "readOnly", "minItems", "maxItems"];
|
|
20
19
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
21
20
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
21
|
+
/**
|
|
22
|
+
* ArrayInput component for managing an array of items in a form.
|
|
23
|
+
* It allows adding, removing, and sorting items within the array.
|
|
24
|
+
* It integrates with react-hook-form for form state management and validation.
|
|
25
|
+
* It supports fixed-length lists, custom add/remove handlers, and can display validation errors.
|
|
26
|
+
* It also provides options for inline display and custom button positioning.
|
|
27
|
+
*
|
|
28
|
+
* It uses the `useFieldArray` hook from `react-hook-form` to manage the array state and provides a simple interface for adding and removing items.
|
|
29
|
+
*
|
|
30
|
+
* It also supports drag-and-drop sorting using `@dnd-kit/core` and `@dnd-kit/sortable` for a better user experience when reordering items.
|
|
31
|
+
*
|
|
32
|
+
* @param {ArrayInputProps<T>} props - The properties for the ArrayInput component.
|
|
33
|
+
* @returns {JSX.Element} The rendered ArrayInput component.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```jsx
|
|
37
|
+
* <ArrayInput
|
|
38
|
+
* name="items"
|
|
39
|
+
* label="Items"
|
|
40
|
+
* addLabel="Add Item"
|
|
41
|
+
* onAdd={() => ({ name: "", value: "" })}
|
|
42
|
+
* onRemove={(item, index) => console.log("Removed item:", item, "at index:", index)}
|
|
43
|
+
* onBeforeRemove={(item, index) => confirm(`Are you sure you want to remove item at index ${index}?`)}
|
|
44
|
+
* canRemove={({ item, index, lastItem }) => !lastItem} // Prevent removing the last item
|
|
45
|
+
* >
|
|
46
|
+
* {({ index, name }) => (
|
|
47
|
+
* <Input
|
|
48
|
+
* name={name}
|
|
49
|
+
* label={`Item ${index + 1}`}
|
|
50
|
+
* placeholder="Enter item value"
|
|
51
|
+
* required={index === 0} // Make the first item required
|
|
52
|
+
* />
|
|
53
|
+
* )}
|
|
54
|
+
* </ArrayInput>
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @see {@link https://react-hook-form.com/api/usefieldarray} for more details on `useFieldArray`.
|
|
58
|
+
* @see {@link https://react-dnd.github.io/react-dnd/about} for more details on DnD context and sorting.
|
|
59
|
+
*/
|
|
22
60
|
var ArrayInput = function ArrayInput(_ref) {
|
|
23
|
-
var _error$values$label, _error$values, _error$values2;
|
|
24
61
|
var name = _ref.name,
|
|
25
62
|
children = _ref.children,
|
|
26
63
|
addLabel = _ref.addLabel,
|
|
27
64
|
fixedList = _ref.fixedList,
|
|
28
65
|
_ref$focusName = _ref.focusName,
|
|
29
66
|
focusName = _ref$focusName === void 0 ? "" : _ref$focusName,
|
|
67
|
+
_ref$buttonPosition = _ref.buttonPosition,
|
|
68
|
+
buttonPosition = _ref$buttonPosition === void 0 ? "bottom" : _ref$buttonPosition,
|
|
30
69
|
onAdd = _ref.onAdd,
|
|
70
|
+
onRemove = _ref.onRemove,
|
|
71
|
+
onBeforeRemove = _ref.onBeforeRemove,
|
|
72
|
+
canRemove = _ref.canRemove,
|
|
31
73
|
arrayRef = _ref.arrayRef,
|
|
32
74
|
enableSorting = _ref.enableSorting,
|
|
33
75
|
_ref$disabled = _ref.disabled,
|
|
@@ -36,6 +78,8 @@ var ArrayInput = function ArrayInput(_ref) {
|
|
|
36
78
|
readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
|
|
37
79
|
_ref$minItems = _ref.minItems,
|
|
38
80
|
minItems = _ref$minItems === void 0 ? 0 : _ref$minItems,
|
|
81
|
+
_ref$maxItems = _ref.maxItems,
|
|
82
|
+
maxItems = _ref$maxItems === void 0 ? Number.MAX_SAFE_INTEGER : _ref$maxItems,
|
|
39
83
|
rest = _objectWithoutProperties(_ref, _excluded);
|
|
40
84
|
var _useTranslation = reactI18next.useTranslation("form"),
|
|
41
85
|
t = _useTranslation.t;
|
|
@@ -43,6 +87,7 @@ var ArrayInput = function ArrayInput(_ref) {
|
|
|
43
87
|
if (!(form !== null && form !== void 0 && form.control)) throw new Error("ArrayInput must be contained within a Form element");
|
|
44
88
|
var _useFieldArray = reactHookForm.useFieldArray({
|
|
45
89
|
name: name,
|
|
90
|
+
keyName: "__ID__",
|
|
46
91
|
control: form.control
|
|
47
92
|
}),
|
|
48
93
|
fields = _useFieldArray.fields,
|
|
@@ -59,6 +104,15 @@ var ArrayInput = function ArrayInput(_ref) {
|
|
|
59
104
|
form.setFocus("".concat(name, ".").concat(fields.length).concat(focusName ? "." + focusName : ""));
|
|
60
105
|
}, 100);
|
|
61
106
|
}, [name, fields, focusName]);
|
|
107
|
+
var handleRemove = react.useCallback(function (item, index) {
|
|
108
|
+
var ret = onBeforeRemove === null || onBeforeRemove === void 0 ? void 0 : onBeforeRemove(item, index);
|
|
109
|
+
void Promise.resolve(ret).then(function (b) {
|
|
110
|
+
if (!utilities.isFalse(b)) {
|
|
111
|
+
remove(index);
|
|
112
|
+
onRemove === null || onRemove === void 0 || onRemove(item, index);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}, [remove, onRemove, onBeforeRemove]);
|
|
62
116
|
react.useImperativeHandle(arrayRef, function () {
|
|
63
117
|
return {
|
|
64
118
|
addItem: handleAdd,
|
|
@@ -70,7 +124,7 @@ var ArrayInput = function ArrayInput(_ref) {
|
|
|
70
124
|
if (enableSorting) {
|
|
71
125
|
// pass id list to dnd context
|
|
72
126
|
var idMap = fields.map(function (item) {
|
|
73
|
-
return item.
|
|
127
|
+
return item.__ID__;
|
|
74
128
|
});
|
|
75
129
|
var handleDragEnd = function handleDragEnd(e) {
|
|
76
130
|
if (e.over && e.active.id !== e.over.id) {
|
|
@@ -111,7 +165,7 @@ var ArrayInput = function ArrayInput(_ref) {
|
|
|
111
165
|
className: className,
|
|
112
166
|
ref: setNodeRef,
|
|
113
167
|
style: {
|
|
114
|
-
transform: utilities.CSS.Transform.toString(transform),
|
|
168
|
+
transform: utilities$1.CSS.Transform.toString(transform),
|
|
115
169
|
transition: transition
|
|
116
170
|
},
|
|
117
171
|
children: [/*#__PURE__*/jsxRuntime.jsx(core$1.Icon, _objectSpread(_objectSpread({
|
|
@@ -127,18 +181,46 @@ var ArrayInput = function ArrayInput(_ref) {
|
|
|
127
181
|
}, [enableSorting]);
|
|
128
182
|
// @ts-expect-error ignore
|
|
129
183
|
SortableItem.displayName = "SortableItem";
|
|
184
|
+
var addButton = react.useMemo(function () {
|
|
185
|
+
var _error$values$label, _error$values, _error$values2;
|
|
186
|
+
return /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
187
|
+
className: "flex justify-end",
|
|
188
|
+
children: /*#__PURE__*/jsxRuntime.jsx(core$1.Tooltip, {
|
|
189
|
+
color: "danger-200",
|
|
190
|
+
content: utilities.isString(error) ? "".concat(error) : t(error === null || error === void 0 ? void 0 : error.key, error !== null && error !== void 0 && error.values ? _objectSpread(_objectSpread({}, error === null || error === void 0 ? void 0 : error.values), {}, {
|
|
191
|
+
label: t((_error$values$label = (_error$values = error.values) === null || _error$values === void 0 ? void 0 : _error$values.label) !== null && _error$values$label !== void 0 ? _error$values$label : "form:badkey", (_error$values2 = error.values) === null || _error$values2 === void 0 ? void 0 : _error$values2.path)
|
|
192
|
+
}) : {}),
|
|
193
|
+
children: /*#__PURE__*/jsxRuntime.jsx(core$1.Button, {
|
|
194
|
+
size: "sm",
|
|
195
|
+
"aria-label": "Add item",
|
|
196
|
+
icon: core$1.CoreIcons.insert,
|
|
197
|
+
onClick: function onClick() {
|
|
198
|
+
return handleAdd(onAdd === null || onAdd === void 0 ? void 0 : onAdd());
|
|
199
|
+
},
|
|
200
|
+
"data-invalid": !!error,
|
|
201
|
+
disabled: !!disabled || readOnly || fields.length > maxItems,
|
|
202
|
+
className: classNames("fabric-addButton", "me-10"),
|
|
203
|
+
children: addLabel !== null && addLabel !== void 0 ? addLabel : t("addArray")
|
|
204
|
+
})
|
|
205
|
+
})
|
|
206
|
+
});
|
|
207
|
+
}, [error, fields, handleAdd, disabled, readOnly, addLabel, maxItems]);
|
|
130
208
|
return /*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
131
|
-
className:
|
|
209
|
+
className: "fabric-arrayInput",
|
|
132
210
|
children: [/*#__PURE__*/jsxRuntime.jsx(FieldWrapper.FieldWrapper, _objectSpread(_objectSpread({}, rest), {}, {
|
|
211
|
+
appendLabel: /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
212
|
+
className: "-me-2",
|
|
213
|
+
children: !fixedList && onAdd && buttonPosition !== "bottom" && addButton
|
|
214
|
+
}),
|
|
133
215
|
children: /*#__PURE__*/jsxRuntime.jsx(Wrapper, {
|
|
134
216
|
children: fields.map(function (item, index) {
|
|
135
217
|
return /*#__PURE__*/jsxRuntime.jsxs(SortableItem, {
|
|
136
|
-
id: item.
|
|
218
|
+
id: item.__ID__,
|
|
137
219
|
className: "flex items-center flex-nowrap gap-2 mb-1",
|
|
138
220
|
children: [typeof children === "function" ? children({
|
|
139
221
|
index: index,
|
|
140
222
|
name: "".concat(name, ".").concat(index)
|
|
141
|
-
}) :
|
|
223
|
+
}) : core$1.cloneChildren(children, function (child) {
|
|
142
224
|
return /*#__PURE__*/react.cloneElement(child, Object.assign({
|
|
143
225
|
disabled: disabled,
|
|
144
226
|
readOnly: readOnly,
|
|
@@ -155,34 +237,19 @@ var ArrayInput = function ArrayInput(_ref) {
|
|
|
155
237
|
color: "danger",
|
|
156
238
|
variant: "link",
|
|
157
239
|
className: "self-end",
|
|
158
|
-
disabled: disabled || readOnly || fields.length <= minItems
|
|
240
|
+
disabled: disabled || readOnly || fields.length <= minItems || (canRemove === null || canRemove === void 0 ? void 0 : canRemove({
|
|
241
|
+
item: item,
|
|
242
|
+
index: index,
|
|
243
|
+
lastItem: index + 1 === fields.length
|
|
244
|
+
})) !== false,
|
|
159
245
|
onClick: function onClick() {
|
|
160
|
-
return
|
|
246
|
+
return handleRemove(item, index);
|
|
161
247
|
}
|
|
162
248
|
})]
|
|
163
|
-
}, item.
|
|
164
|
-
})
|
|
165
|
-
})
|
|
166
|
-
})), !fixedList && onAdd && /*#__PURE__*/jsxRuntime.jsx("div", {
|
|
167
|
-
className: "flex justify-end",
|
|
168
|
-
children: /*#__PURE__*/jsxRuntime.jsx(core$1.Tooltip, {
|
|
169
|
-
color: "danger",
|
|
170
|
-
content: utilities$1.isString(error) ? "".concat(error) : t(error === null || error === void 0 ? void 0 : error.key, error !== null && error !== void 0 && error.values ? _objectSpread(_objectSpread({}, error === null || error === void 0 ? void 0 : error.values), {}, {
|
|
171
|
-
label: t((_error$values$label = (_error$values = error.values) === null || _error$values === void 0 ? void 0 : _error$values.label) !== null && _error$values$label !== void 0 ? _error$values$label : "form:badkey", (_error$values2 = error.values) === null || _error$values2 === void 0 ? void 0 : _error$values2.path)
|
|
172
|
-
}) : {}),
|
|
173
|
-
children: /*#__PURE__*/jsxRuntime.jsx(core$1.Button, {
|
|
174
|
-
"aria-label": "Add item",
|
|
175
|
-
icon: core$1.CoreIcons.insert,
|
|
176
|
-
onClick: function onClick() {
|
|
177
|
-
return handleAdd(onAdd());
|
|
178
|
-
},
|
|
179
|
-
"data-invalid": !!error,
|
|
180
|
-
disabled: !!disabled || readOnly,
|
|
181
|
-
className: classNames(ArrayInput_module.addButton, "me-10"),
|
|
182
|
-
children: addLabel !== null && addLabel !== void 0 ? addLabel : t("addArray")
|
|
249
|
+
}, item.__ID__);
|
|
183
250
|
})
|
|
184
251
|
})
|
|
185
|
-
})]
|
|
252
|
+
})), !fixedList && onAdd && buttonPosition !== "top" && addButton]
|
|
186
253
|
});
|
|
187
254
|
};
|
|
188
255
|
|
|
@@ -11,14 +11,23 @@ var useFileUploader = require('../hooks/useFileUploader.js');
|
|
|
11
11
|
var Hidden = require('./Hidden.js');
|
|
12
12
|
var jsxRuntime = require('react/jsx-runtime');
|
|
13
13
|
|
|
14
|
-
var _excluded = ["
|
|
14
|
+
var _excluded = ["size", "avatarName", "value", "fileUrl", "uploadHandler"];
|
|
15
15
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
16
16
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
17
|
+
/**
|
|
18
|
+
* Avatar input component for uploading and displaying user avatars.
|
|
19
|
+
* It allows users to select an image file, upload it, and display the avatar.
|
|
20
|
+
* It also provides a way to remove the uploaded file and shows upload progress.
|
|
21
|
+
*
|
|
22
|
+
* @param {Props} props - The properties for the AvatarInput component.
|
|
23
|
+
* @returns {JSX.Element} - The rendered AvatarInput component.
|
|
24
|
+
*/
|
|
17
25
|
var AvatarInput = function AvatarInput(_ref) {
|
|
18
26
|
var _list$;
|
|
19
|
-
var
|
|
20
|
-
_ref$size = _ref.size,
|
|
27
|
+
var _ref$size = _ref.size,
|
|
21
28
|
size = _ref$size === void 0 ? "6rem" : _ref$size,
|
|
29
|
+
avatarName = _ref.avatarName,
|
|
30
|
+
value = _ref.value,
|
|
22
31
|
fileUrl = _ref.fileUrl,
|
|
23
32
|
uploadHandler = _ref.uploadHandler,
|
|
24
33
|
rest = _objectWithoutProperties(_ref, _excluded);
|
|
@@ -40,7 +49,7 @@ var AvatarInput = function AvatarInput(_ref) {
|
|
|
40
49
|
return function (_x, _x2) {
|
|
41
50
|
return _ref2.apply(this, arguments);
|
|
42
51
|
};
|
|
43
|
-
}(),
|
|
52
|
+
}(), value, false),
|
|
44
53
|
files = _useFileUploader.files,
|
|
45
54
|
list = _useFileUploader.list,
|
|
46
55
|
upload = _useFileUploader.upload,
|
|
@@ -69,18 +78,18 @@ var AvatarInput = function AvatarInput(_ref) {
|
|
|
69
78
|
}, [files, list]);
|
|
70
79
|
react.useEffect(function () {
|
|
71
80
|
var _fileUrl;
|
|
72
|
-
|
|
73
|
-
}, [
|
|
81
|
+
value && setBase64((_fileUrl = fileUrl === null || fileUrl === void 0 ? void 0 : fileUrl(value)) !== null && _fileUrl !== void 0 ? _fileUrl : value);
|
|
82
|
+
}, [value]);
|
|
74
83
|
return /*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
75
84
|
className: "flex flex-nowrap items-end",
|
|
76
85
|
children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
77
86
|
className: "inline-block leading-none rounded-full relative outline overflow-hidden",
|
|
78
87
|
children: [/*#__PURE__*/jsxRuntime.jsx(core.Avatar, {
|
|
79
|
-
name: "temp",
|
|
88
|
+
name: avatarName !== null && avatarName !== void 0 ? avatarName : "temp",
|
|
80
89
|
size: size,
|
|
81
90
|
avatar: base64
|
|
82
91
|
}), /*#__PURE__*/jsxRuntime.jsxs("div", {
|
|
83
|
-
className: "absolute inset-x-0 bottom-0 cursor-pointer bg-
|
|
92
|
+
className: "absolute inset-x-0 bottom-0 cursor-pointer bg-black/20 hover:bg-black/50 text-white text-xs text-center py-1",
|
|
84
93
|
children: [/*#__PURE__*/jsxRuntime.jsx("span", {
|
|
85
94
|
children: "Edit"
|
|
86
95
|
}), /*#__PURE__*/jsxRuntime.jsx("input", {
|