@react-fabric/form 1.0.0-beta.9 → 1.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/{src/input/ArrayInput.module.css → css/_arrayInput.css} +8 -8
- package/css/_colorPicker.css +95 -0
- package/{src/internal/Field.module.css → css/_field.css} +94 -33
- package/{src/input/File.module.css → css/_file.css} +21 -6
- package/css/styles.css +27 -0
- package/dist/cjs/builder/FileField.js +107 -78
- package/dist/cjs/builder/FormField.js +60 -39
- package/dist/cjs/builder/SchemaEditor.js +72 -0
- package/dist/cjs/builder/components/AddSchemaFields.js +64 -0
- package/dist/cjs/builder/components/SchemaArrayForm.js +146 -0
- package/dist/cjs/builder/components/SchemaField.js +423 -0
- package/dist/cjs/form/Controller.js +66 -19
- package/dist/cjs/form/Form.js +97 -39
- package/dist/cjs/form/useForm.js +32 -0
- package/dist/cjs/hooks/useFileUploader.js +74 -45
- package/dist/cjs/hooks/useFormBuilder.js +85 -31
- package/dist/cjs/i18n/{ar.json.js → ar/form.json.js} +5 -4
- package/dist/cjs/i18n/{en.json.js → en/form.json.js} +5 -5
- package/dist/cjs/i18n/index.js +4 -4
- package/dist/cjs/index.js +41 -2
- package/dist/cjs/input/ArrayInput.js +259 -135
- package/dist/cjs/input/AvatarInput.js +99 -63
- package/dist/cjs/input/Checkbox.js +24 -25
- package/dist/cjs/input/ColorInput.js +138 -81
- package/dist/cjs/input/ColorPicker.js +78 -95
- package/dist/cjs/input/DateInput.js +192 -0
- package/dist/cjs/input/Field.js +21 -20
- package/dist/cjs/input/File.js +85 -80
- package/dist/cjs/input/Hidden.js +27 -13
- package/dist/cjs/input/Input.js +49 -48
- package/dist/cjs/input/Number.js +46 -44
- package/dist/cjs/input/Password.js +51 -49
- package/dist/cjs/input/Radio.js +26 -16
- package/dist/cjs/input/RadioGroup.js +26 -11
- package/dist/cjs/input/{Range.js → RangeSlider.js} +61 -66
- package/dist/cjs/input/Search.js +58 -64
- package/dist/cjs/input/Slider.js +57 -66
- package/dist/cjs/input/Switch.js +29 -27
- package/dist/cjs/input/Textarea.js +65 -53
- package/dist/cjs/internal/ErrorIcon.js +9 -9
- package/dist/cjs/internal/FieldWrapper.js +23 -13
- package/dist/cjs/internal/InputWrapper.js +85 -87
- package/dist/cjs/ranger/index.js +7 -7
- package/dist/cjs/ranger/utils.js +9 -4
- package/dist/cjs/select/AutoComplete.js +93 -76
- package/dist/cjs/select/DualList.js +235 -154
- package/dist/cjs/select/List.js +122 -89
- package/dist/cjs/select/Options.js +58 -54
- package/dist/cjs/select/Select.js +119 -89
- package/dist/cjs/select/helpers.js +5 -5
- package/dist/cjs/select/useSelect.js +83 -58
- package/dist/cjs/types/schema.js +43 -0
- package/dist/cjs/utils/eventHandlers.js +16 -6
- package/dist/cjs/utils/getColor.js +6 -6
- package/dist/cjs/utils/getProps.js +49 -0
- package/dist/esm/builder/FileField.js +109 -80
- package/dist/esm/builder/FormField.js +60 -39
- package/dist/esm/builder/SchemaEditor.js +72 -0
- package/dist/esm/builder/components/AddSchemaFields.js +64 -0
- package/dist/esm/builder/components/SchemaArrayForm.js +146 -0
- package/dist/esm/builder/components/SchemaField.js +423 -0
- package/dist/esm/form/Controller.js +66 -19
- package/dist/esm/form/Form.js +97 -39
- package/dist/esm/form/useForm.js +32 -0
- package/dist/esm/hooks/useFileUploader.js +75 -46
- package/dist/esm/hooks/useFormBuilder.js +84 -30
- package/dist/esm/i18n/{ar.json.js → ar/form.json.js} +5 -4
- package/dist/esm/i18n/{en.json.js → en/form.json.js} +5 -5
- package/dist/esm/i18n/index.js +2 -2
- package/dist/esm/index.js +36 -1
- package/dist/esm/input/ArrayInput.js +260 -136
- package/dist/esm/input/AvatarInput.js +99 -63
- package/dist/esm/input/Checkbox.js +26 -27
- package/dist/esm/input/ColorInput.js +141 -84
- package/dist/esm/input/ColorPicker.js +80 -97
- package/dist/esm/input/DateInput.js +192 -0
- package/dist/esm/input/Field.js +21 -20
- package/dist/esm/input/File.js +89 -84
- package/dist/esm/input/Hidden.js +28 -14
- package/dist/esm/input/Input.js +51 -50
- package/dist/esm/input/Number.js +48 -46
- package/dist/esm/input/Password.js +54 -52
- package/dist/esm/input/Radio.js +27 -17
- package/dist/esm/input/RadioGroup.js +27 -12
- package/dist/esm/input/{Range.js → RangeSlider.js} +62 -67
- package/dist/esm/input/Search.js +61 -67
- package/dist/esm/input/Slider.js +58 -67
- package/dist/esm/input/Switch.js +31 -29
- package/dist/esm/input/Textarea.js +67 -55
- package/dist/esm/internal/ErrorIcon.js +11 -11
- package/dist/esm/internal/FieldWrapper.js +23 -13
- package/dist/esm/internal/InputWrapper.js +88 -90
- package/dist/esm/ranger/index.js +7 -7
- package/dist/esm/ranger/utils.js +9 -4
- package/dist/esm/select/AutoComplete.js +95 -78
- package/dist/esm/select/DualList.js +233 -152
- package/dist/esm/select/List.js +125 -92
- package/dist/esm/select/Options.js +58 -54
- package/dist/esm/select/Select.js +122 -92
- package/dist/esm/select/helpers.js +5 -5
- package/dist/esm/select/useSelect.js +84 -59
- package/{src/input/ColorPicker.module.css → dist/esm/types/schema.js} +18 -27
- package/dist/esm/utils/eventHandlers.js +16 -6
- package/dist/esm/utils/getColor.js +6 -6
- package/dist/esm/utils/getProps.js +49 -0
- package/dist/types/builder/FileField.d.ts +7 -4
- package/dist/types/builder/FormField.d.ts +4 -2
- package/dist/types/builder/SchemaEditor.d.ts +6 -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 +12 -0
- package/dist/types/form/Controller.d.ts +45 -3
- package/dist/types/form/Form.d.ts +38 -7
- package/dist/types/form/useForm.d.ts +6 -0
- package/dist/types/hooks/useFileUploader.d.ts +24 -3
- package/dist/types/hooks/useFormBuilder.d.ts +41 -3
- package/dist/types/index.d.ts +32 -2
- package/dist/types/input/ArrayInput.d.ts +68 -13
- package/dist/types/input/AvatarInput.d.ts +23 -6
- package/dist/types/input/Checkbox.d.ts +12 -10
- package/dist/types/input/ColorInput.d.ts +15 -5
- package/dist/types/input/ColorPicker.d.ts +10 -2
- package/dist/types/input/DateInput.d.ts +21 -0
- package/dist/types/input/Field.d.ts +9 -36
- package/dist/types/input/File.d.ts +16 -4
- package/dist/types/input/Hidden.d.ts +7 -6
- package/dist/types/input/Input.d.ts +11 -4
- package/dist/types/input/Number.d.ts +9 -4
- package/dist/types/input/Password.d.ts +9 -4
- package/dist/types/input/Radio.d.ts +9 -4
- package/dist/types/input/RadioGroup.d.ts +14 -6
- package/dist/types/input/{Range.d.ts → RangeSlider.d.ts} +11 -6
- package/dist/types/input/Search.d.ts +14 -4
- package/dist/types/input/Slider.d.ts +9 -6
- package/dist/types/input/Switch.d.ts +13 -8
- package/dist/types/input/Textarea.d.ts +15 -4
- package/dist/types/internal/ErrorIcon.d.ts +4 -1
- package/dist/types/internal/FieldWrapper.d.ts +10 -1
- package/dist/types/internal/InputWrapper.d.ts +19 -1
- package/dist/types/ranger/index.d.ts +7 -3
- package/dist/types/ranger/utils.d.ts +2 -2
- package/dist/types/select/AutoComplete.d.ts +7 -2
- package/dist/types/select/DualList.d.ts +11 -37
- package/dist/types/select/List.d.ts +7 -2
- package/dist/types/select/Options.d.ts +8 -7
- package/dist/types/select/Select.d.ts +7 -2
- package/dist/types/select/helpers.d.ts +2 -2
- package/dist/types/select/useSelect.d.ts +10 -28
- package/dist/types/types/index.d.ts +73 -39
- package/dist/types/types/schema.d.ts +78 -32
- package/dist/types/utils/eventHandlers.d.ts +4 -4
- package/dist/types/utils/getColor.d.ts +4 -4
- package/dist/types/utils/getProps.d.ts +26 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/package.json +25 -25
- package/src/builder/FileField.tsx +73 -56
- package/src/builder/FormField.tsx +66 -58
- package/src/builder/SchemaEditor.tsx +78 -0
- package/src/builder/components/AddSchemaFields.tsx +64 -0
- package/src/builder/components/SchemaArrayForm.tsx +146 -0
- package/src/builder/components/SchemaField.tsx +405 -0
- package/src/form/Controller.tsx +61 -24
- package/src/form/Form.tsx +74 -50
- package/src/form/useForm.ts +53 -0
- package/src/hooks/useFileUploader.ts +115 -84
- package/src/hooks/useFormBuilder.tsx +80 -41
- package/src/i18n/{ar.json → ar/form.json} +5 -4
- package/src/i18n/{en.json → en/form.json} +5 -5
- package/src/i18n/index.ts +2 -2
- package/src/index.ts +34 -20
- package/src/input/ArrayInput.tsx +255 -173
- package/src/input/AvatarInput.tsx +82 -39
- package/src/input/Checkbox.tsx +30 -54
- package/src/input/ColorInput.tsx +146 -105
- package/src/input/ColorPicker.tsx +76 -102
- package/src/input/DateInput.tsx +225 -0
- package/src/input/Field.tsx +23 -65
- package/src/input/File.tsx +76 -98
- package/src/input/Hidden.tsx +36 -24
- package/src/input/Input.tsx +55 -53
- package/src/input/Number.tsx +49 -54
- package/src/input/Password.tsx +61 -66
- package/src/input/Radio.tsx +28 -37
- package/src/input/RadioGroup.tsx +30 -25
- package/src/input/{Range.tsx → RangeSlider.tsx} +81 -109
- package/src/input/Search.tsx +64 -77
- package/src/input/Slider.tsx +80 -109
- package/src/input/Switch.tsx +39 -53
- package/src/input/Textarea.tsx +72 -59
- package/src/internal/ErrorIcon.tsx +22 -21
- package/src/internal/FieldWrapper.tsx +33 -23
- package/src/internal/InputWrapper.tsx +132 -143
- package/src/ranger/index.tsx +37 -117
- package/src/ranger/utils.ts +12 -11
- package/src/select/AutoComplete.tsx +113 -123
- package/src/select/DualList.tsx +218 -204
- package/src/select/List.tsx +130 -97
- package/src/select/Options.tsx +59 -57
- package/src/select/Select.tsx +148 -122
- package/src/select/helpers.ts +13 -8
- package/src/select/useSelect.tsx +110 -127
- package/src/types/index.ts +76 -45
- package/src/types/schema.ts +97 -40
- package/src/utils/eventHandlers.ts +24 -26
- package/src/utils/getColor.ts +9 -8
- package/src/utils/getProps.ts +47 -0
- package/src/utils/index.ts +1 -0
- 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
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
var addArray = "Add Item";
|
|
4
4
|
var password = {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
hide: "Hide password",
|
|
6
|
+
show: "Show password"
|
|
7
7
|
};
|
|
8
8
|
var select = {
|
|
9
|
+
createOption: "Create new option for <0>{{query}}</0>",
|
|
9
10
|
emptyList: "No options available",
|
|
10
|
-
notFound: "No options found for <0>{{query}}</0>"
|
|
11
|
-
createOption: "Create new option for <0>{{query}}</0>"
|
|
11
|
+
notFound: "No options found for <0>{{query}}</0>"
|
|
12
12
|
};
|
|
13
13
|
var yup = {
|
|
14
14
|
arrayMax: "{{label}} must contain upto {{max}} item",
|
|
15
15
|
arrayMin: "{{label}} must contain atleast {{min}} item",
|
|
16
|
-
invalid: "{{label}} invalid",
|
|
17
16
|
empty: "{{label}} must not be empty",
|
|
17
|
+
invalid: "{{label}} invalid",
|
|
18
18
|
invalidType: "{{label}} invalid datatype",
|
|
19
19
|
numberMax: "{{label}} maximum {{max}}",
|
|
20
20
|
numberMin: "{{label}} minimum {{min}}",
|
package/dist/esm/i18n/index.js
CHANGED
package/dist/esm/index.js
CHANGED
|
@@ -3,12 +3,15 @@
|
|
|
3
3
|
import './i18n/index.js';
|
|
4
4
|
export { Controller } from './form/Controller.js';
|
|
5
5
|
export { Form } from './form/Form.js';
|
|
6
|
+
export { useForm } from './form/useForm.js';
|
|
6
7
|
export { useFileUploader } from './hooks/useFileUploader.js';
|
|
7
8
|
export { useFormBuilder } from './hooks/useFormBuilder.js';
|
|
8
9
|
export { ArrayInput } from './input/ArrayInput.js';
|
|
10
|
+
export { AvatarInput } from './input/AvatarInput.js';
|
|
9
11
|
export { Checkbox } from './input/Checkbox.js';
|
|
10
12
|
export { ColorInput } from './input/ColorInput.js';
|
|
11
13
|
export { ColorPicker } from './input/ColorPicker.js';
|
|
14
|
+
export { DateInput } from './input/DateInput.js';
|
|
12
15
|
export { Field } from './input/Field.js';
|
|
13
16
|
export { FileInput } from './input/File.js';
|
|
14
17
|
export { HiddenInput } from './input/Hidden.js';
|
|
@@ -17,7 +20,7 @@ export { Number } from './input/Number.js';
|
|
|
17
20
|
export { Password } from './input/Password.js';
|
|
18
21
|
export { Radio } from './input/Radio.js';
|
|
19
22
|
export { RadioGroup } from './input/RadioGroup.js';
|
|
20
|
-
export {
|
|
23
|
+
export { RangeSlider } from './input/RangeSlider.js';
|
|
21
24
|
export { Search } from './input/Search.js';
|
|
22
25
|
export { Slider } from './input/Slider.js';
|
|
23
26
|
export { Switch } from './input/Switch.js';
|
|
@@ -26,3 +29,35 @@ export { AutoComplete } from './select/AutoComplete.js';
|
|
|
26
29
|
export { DualList } from './select/DualList.js';
|
|
27
30
|
export { List } from './select/List.js';
|
|
28
31
|
export { Select } from './select/Select.js';
|
|
32
|
+
export { SchemaEditor } from './builder/SchemaEditor.js';
|
|
33
|
+
export { DATA_TYPES, SCHEMA_CUSTOM_LIST } from './types/schema.js';
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* React Fabric
|
|
37
|
+
* @version 1.0.0
|
|
38
|
+
* @license MIT
|
|
39
|
+
* @copyright 2024 Adarsh Pastakia
|
|
40
|
+
*
|
|
41
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
42
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
43
|
+
* in the Software without restriction, including without limitation the rights
|
|
44
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
45
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
46
|
+
* furnished to do so, subject to the following conditions:
|
|
47
|
+
*
|
|
48
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
49
|
+
* copies or substantial portions of the Software.
|
|
50
|
+
*
|
|
51
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
52
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
53
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
54
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
55
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
56
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
57
|
+
* SOFTWARE.
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
var FORM_PACKAGE = "@react-fabric/form";
|
|
61
|
+
var FORM_VERSION = "1.0.1";
|
|
62
|
+
|
|
63
|
+
export { FORM_PACKAGE, FORM_VERSION };
|
|
@@ -1,189 +1,313 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
4
|
+
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
|
|
5
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
4
6
|
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
10
|
-
import {
|
|
7
|
+
import _regeneratorRuntime from '@babel/runtime/regenerator';
|
|
8
|
+
import { RestrictToVerticalAxis } from '@dnd-kit/abstract/modifiers';
|
|
9
|
+
import { DragDropProvider } from '@dnd-kit/react';
|
|
10
|
+
import { useSortable } from '@dnd-kit/react/sortable';
|
|
11
|
+
import { Tooltip, Button, cloneChildren, Icon } from '@react-fabric/core';
|
|
12
|
+
import { isFalse, cn, isObject, isString } from '@react-fabric/utilities';
|
|
13
|
+
import { useState, useEffect, useMemo, useCallback, useImperativeHandle, isValidElement, cloneElement } from 'react';
|
|
11
14
|
import { useFormContext, useFieldArray } from 'react-hook-form';
|
|
12
15
|
import { useTranslation } from 'react-i18next';
|
|
13
16
|
import { FieldWrapper } from '../internal/FieldWrapper.js';
|
|
14
|
-
import classes from './ArrayInput.module.css';
|
|
15
|
-
import { restrictToVerticalAxis } from '@dnd-kit/modifiers';
|
|
16
|
-
import { CSS } from '@dnd-kit/utilities';
|
|
17
17
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
18
18
|
|
|
19
|
-
var _excluded = ["name", "children", "addLabel", "
|
|
19
|
+
var _excluded = ["name", "children", "addLabel", "focusName", "buttonPosition", "onAdd", "onRemove", "onBeforeRemove", "canRemove", "arrayRef", "enableSorting", "disabled", "readOnly", "minItems", "maxItems"];
|
|
20
20
|
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
|
-
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t),
|
|
22
|
-
|
|
23
|
-
var
|
|
24
|
-
|
|
21
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).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; }
|
|
22
|
+
function SortableItem(_ref) {
|
|
23
|
+
var id = _ref.id,
|
|
24
|
+
index = _ref.index,
|
|
25
25
|
children = _ref.children,
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
26
|
+
className = _ref.className,
|
|
27
|
+
enableSorting = _ref.enableSorting;
|
|
28
|
+
var _useSortable = useSortable({
|
|
29
|
+
id: id,
|
|
30
|
+
index: index,
|
|
31
|
+
disabled: !enableSorting
|
|
32
|
+
}),
|
|
33
|
+
ref = _useSortable.ref,
|
|
34
|
+
handleRef = _useSortable.handleRef,
|
|
35
|
+
isDragging = _useSortable.isDragging;
|
|
36
|
+
if (enableSorting) {
|
|
37
|
+
return /*#__PURE__*/jsxs("div", {
|
|
38
|
+
className: className,
|
|
39
|
+
ref: ref,
|
|
40
|
+
children: [/*#__PURE__*/jsx(Icon, {
|
|
41
|
+
ref: handleRef,
|
|
42
|
+
className: isDragging ? "cursor-grabbing" : "cursor-grab",
|
|
43
|
+
icon: "icon-[mdi--drag-vertical]"
|
|
44
|
+
}), children]
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return /*#__PURE__*/jsx("div", {
|
|
48
|
+
className: className,
|
|
49
|
+
children: children
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function Wrapper(_ref2) {
|
|
53
|
+
var children = _ref2.children,
|
|
54
|
+
fields = _ref2.fields,
|
|
55
|
+
enableSorting = _ref2.enableSorting,
|
|
56
|
+
onMove = _ref2.onMove;
|
|
57
|
+
if (enableSorting) {
|
|
58
|
+
// pass id list to dnd context
|
|
59
|
+
var idMap = fields.map(function (item) {
|
|
60
|
+
return item.__ID__;
|
|
61
|
+
});
|
|
62
|
+
var handleDragEnd = function handleDragEnd(e) {
|
|
63
|
+
var _e$operation$source, _e$operation$target;
|
|
64
|
+
if (((_e$operation$source = e.operation.source) === null || _e$operation$source === void 0 ? void 0 : _e$operation$source.id) !== ((_e$operation$target = e.operation.target) === null || _e$operation$target === void 0 ? void 0 : _e$operation$target.id)) {
|
|
65
|
+
var _e$operation$source2, _e$operation$target2;
|
|
66
|
+
// find index of item and drop over
|
|
67
|
+
var active = idMap.indexOf("".concat((_e$operation$source2 = e.operation.source) === null || _e$operation$source2 === void 0 ? void 0 : _e$operation$source2.id));
|
|
68
|
+
var end = idMap.indexOf("".concat((_e$operation$target2 = e.operation.target) === null || _e$operation$target2 === void 0 ? void 0 : _e$operation$target2.id));
|
|
69
|
+
onMove(active, end);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
return /*#__PURE__*/jsx(DragDropProvider, {
|
|
73
|
+
onDragEnd: handleDragEnd,
|
|
74
|
+
modifiers: [RestrictToVerticalAxis],
|
|
75
|
+
children: children
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return children;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* ArrayInput component for managing an array of items in a form.
|
|
83
|
+
* It allows adding, removing, and sorting items within the array.
|
|
84
|
+
* It integrates with react-hook-form for form state management and validation.
|
|
85
|
+
* It supports fixed-length lists, custom add/remove handlers, and can display validation errors.
|
|
86
|
+
* It also provides options for inline display and custom button positioning.
|
|
87
|
+
*
|
|
88
|
+
* It uses the `useFieldArray` hook from `react-hook-form` to manage the array state and provides a simple interface for adding and removing items.
|
|
89
|
+
*
|
|
90
|
+
* It also supports drag-and-drop sorting using `@dnd-kit/core` and `@dnd-kit/sortable` for a better user experience when reordering items.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```jsx
|
|
94
|
+
* <ArrayInput
|
|
95
|
+
* name="items"
|
|
96
|
+
* label="Items"
|
|
97
|
+
* addLabel="Add Item"
|
|
98
|
+
* onAdd={() => ({ name: "", value: "" })}
|
|
99
|
+
* onRemove={(item, index) => console.log("Removed item:", item, "at index:", index)}
|
|
100
|
+
* onBeforeRemove={(item, index) => confirm(`Are you sure you want to remove item at index ${index}?`)}
|
|
101
|
+
* canRemove={({ item, index, lastItem }) => !lastItem} // Prevent removing the last item
|
|
102
|
+
* >
|
|
103
|
+
* {({ index, name }) => (
|
|
104
|
+
* <Input
|
|
105
|
+
* name={name}
|
|
106
|
+
* label={`Item ${index + 1}`}
|
|
107
|
+
* placeholder="Enter item value"
|
|
108
|
+
* required={index === 0} // Make the first item required
|
|
109
|
+
* />
|
|
110
|
+
* )}
|
|
111
|
+
* </ArrayInput>
|
|
112
|
+
* ```
|
|
113
|
+
*
|
|
114
|
+
* @see {@link https://react-hook-form.com/api/usefieldarray} for more details on `useFieldArray`.
|
|
115
|
+
* @see {@link https://react-dnd.github.io/react-dnd/about} for more details on DnD context and sorting.
|
|
116
|
+
*/
|
|
117
|
+
function ArrayInput(_ref3) {
|
|
118
|
+
var name = _ref3.name,
|
|
119
|
+
children = _ref3.children,
|
|
120
|
+
addLabel = _ref3.addLabel,
|
|
121
|
+
_ref3$focusName = _ref3.focusName,
|
|
122
|
+
focusName = _ref3$focusName === void 0 ? "" : _ref3$focusName,
|
|
123
|
+
_ref3$buttonPosition = _ref3.buttonPosition,
|
|
124
|
+
buttonPosition = _ref3$buttonPosition === void 0 ? "bottom" : _ref3$buttonPosition,
|
|
125
|
+
onAdd = _ref3.onAdd,
|
|
126
|
+
onRemove = _ref3.onRemove,
|
|
127
|
+
onBeforeRemove = _ref3.onBeforeRemove,
|
|
128
|
+
canRemove = _ref3.canRemove,
|
|
129
|
+
arrayRef = _ref3.arrayRef,
|
|
130
|
+
enableSorting = _ref3.enableSorting,
|
|
131
|
+
_ref3$disabled = _ref3.disabled,
|
|
132
|
+
disabled = _ref3$disabled === void 0 ? false : _ref3$disabled,
|
|
133
|
+
_ref3$readOnly = _ref3.readOnly,
|
|
134
|
+
readOnly = _ref3$readOnly === void 0 ? false : _ref3$readOnly,
|
|
135
|
+
_ref3$minItems = _ref3.minItems,
|
|
136
|
+
minItems = _ref3$minItems === void 0 ? 0 : _ref3$minItems,
|
|
137
|
+
_ref3$maxItems = _ref3.maxItems,
|
|
138
|
+
maxItems = _ref3$maxItems === void 0 ? Number.MAX_SAFE_INTEGER : _ref3$maxItems,
|
|
139
|
+
rest = _objectWithoutProperties(_ref3, _excluded);
|
|
40
140
|
var _useTranslation = useTranslation("form"),
|
|
41
141
|
t = _useTranslation.t;
|
|
42
142
|
var form = useFormContext();
|
|
43
143
|
if (!(form !== null && form !== void 0 && form.control)) throw new Error("ArrayInput must be contained within a Form element");
|
|
44
144
|
var _useFieldArray = useFieldArray({
|
|
45
145
|
name: name,
|
|
146
|
+
keyName: "__ID__",
|
|
46
147
|
control: form.control
|
|
47
148
|
}),
|
|
48
149
|
fields = _useFieldArray.fields,
|
|
49
150
|
append = _useFieldArray.append,
|
|
50
151
|
remove = _useFieldArray.remove,
|
|
51
152
|
move = _useFieldArray.move;
|
|
153
|
+
var _useState = useState(function () {
|
|
154
|
+
return [];
|
|
155
|
+
}),
|
|
156
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
157
|
+
initialList = _useState2[0],
|
|
158
|
+
setInitialList = _useState2[1];
|
|
159
|
+
useEffect(function () {
|
|
160
|
+
// eslint-disable-next-line @eslint-react/set-state-in-effect
|
|
161
|
+
setInitialList(fields.map(function (f) {
|
|
162
|
+
return f.__ID__;
|
|
163
|
+
}));
|
|
164
|
+
}, [fields]);
|
|
52
165
|
var error = useMemo(function () {
|
|
53
166
|
var _form$formState$error, _form$formState$error2, _form$formState$error3;
|
|
54
167
|
return (_form$formState$error = (_form$formState$error2 = form.formState.errors[name]) === null || _form$formState$error2 === void 0 ? void 0 : _form$formState$error2.message) !== null && _form$formState$error !== void 0 ? _form$formState$error : (_form$formState$error3 = form.formState.errors[name]) === null || _form$formState$error3 === void 0 || (_form$formState$error3 = _form$formState$error3.root) === null || _form$formState$error3 === void 0 ? void 0 : _form$formState$error3.message;
|
|
55
|
-
}, [form.formState.errors]);
|
|
56
|
-
var
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
|
|
168
|
+
}, [form.formState.errors, name]);
|
|
169
|
+
var removeCheck = useCallback(function (item, index) {
|
|
170
|
+
if (canRemove === false) return false;
|
|
171
|
+
if (canRemove === "newonly") {
|
|
172
|
+
return !initialList.includes(item.__ID__);
|
|
173
|
+
}
|
|
174
|
+
if (typeof canRemove === "function") {
|
|
175
|
+
return canRemove({
|
|
176
|
+
item: item,
|
|
177
|
+
index: index,
|
|
178
|
+
lastItem: index + 1 === fields.length
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
182
|
+
}, [canRemove, initialList, fields]);
|
|
183
|
+
var handleAdd = useCallback(/*#__PURE__*/function () {
|
|
184
|
+
var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(item) {
|
|
185
|
+
var _t;
|
|
186
|
+
return _regeneratorRuntime.wrap(function (_context) {
|
|
187
|
+
while (1) switch (_context.prev = _context.next) {
|
|
188
|
+
case 0:
|
|
189
|
+
if (item) {
|
|
190
|
+
_context.next = 1;
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
return _context.abrupt("return");
|
|
194
|
+
case 1:
|
|
195
|
+
_t = append;
|
|
196
|
+
_context.next = 2;
|
|
197
|
+
return item;
|
|
198
|
+
case 2:
|
|
199
|
+
_t(_context.sent);
|
|
200
|
+
setTimeout(function () {
|
|
201
|
+
form.setFocus("".concat(name, ".").concat(fields.length).concat(focusName ? "." + focusName : ""));
|
|
202
|
+
}, 100);
|
|
203
|
+
case 3:
|
|
204
|
+
case "end":
|
|
205
|
+
return _context.stop();
|
|
206
|
+
}
|
|
207
|
+
}, _callee);
|
|
208
|
+
}));
|
|
209
|
+
return function (_x) {
|
|
210
|
+
return _ref4.apply(this, arguments);
|
|
211
|
+
};
|
|
212
|
+
}(), [append, form, name, fields.length, focusName]);
|
|
213
|
+
var handleRemove = useCallback(function (item, index) {
|
|
214
|
+
var ret = onBeforeRemove === null || onBeforeRemove === void 0 ? void 0 : onBeforeRemove(item, index);
|
|
215
|
+
void Promise.resolve(ret).then(function (b) {
|
|
216
|
+
if (!isFalse(b)) {
|
|
217
|
+
remove(index);
|
|
218
|
+
onRemove === null || onRemove === void 0 || onRemove(item, index);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}, [remove, onRemove, onBeforeRemove]);
|
|
62
222
|
useImperativeHandle(arrayRef, function () {
|
|
63
223
|
return {
|
|
64
|
-
addItem:
|
|
224
|
+
addItem: function addItem(t) {
|
|
225
|
+
return handleAdd(Promise.resolve(t));
|
|
226
|
+
},
|
|
65
227
|
removeItem: remove
|
|
66
228
|
};
|
|
67
229
|
});
|
|
68
|
-
var
|
|
69
|
-
var
|
|
70
|
-
if (enableSorting) {
|
|
71
|
-
// pass id list to dnd context
|
|
72
|
-
var idMap = fields.map(function (item) {
|
|
73
|
-
return item.id;
|
|
74
|
-
});
|
|
75
|
-
var handleDragEnd = function handleDragEnd(e) {
|
|
76
|
-
if (e.over && e.active.id !== e.over.id) {
|
|
77
|
-
// find index of item and drop over
|
|
78
|
-
var active = idMap.indexOf("".concat(e.active.id));
|
|
79
|
-
var end = idMap.indexOf("".concat(e.over.id));
|
|
80
|
-
move(active, end);
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
return /*#__PURE__*/jsx(DndContext, {
|
|
84
|
-
onDragEnd: handleDragEnd,
|
|
85
|
-
modifiers: [restrictToVerticalAxis],
|
|
86
|
-
children: /*#__PURE__*/jsx(SortableContext, {
|
|
87
|
-
items: idMap,
|
|
88
|
-
children: children
|
|
89
|
-
})
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
return children;
|
|
93
|
-
}, [enableSorting, fields]);
|
|
94
|
-
// @ts-expect-error ignore
|
|
95
|
-
Wrapper.displayName = "SortableWrapper";
|
|
96
|
-
var SortableItem = useCallback(function (_ref3) {
|
|
97
|
-
var id = _ref3.id,
|
|
98
|
-
children = _ref3.children,
|
|
99
|
-
className = _ref3.className;
|
|
100
|
-
if (enableSorting) {
|
|
101
|
-
var _useSortable = useSortable({
|
|
102
|
-
id: id
|
|
103
|
-
}),
|
|
104
|
-
attributes = _useSortable.attributes,
|
|
105
|
-
listeners = _useSortable.listeners,
|
|
106
|
-
setNodeRef = _useSortable.setNodeRef,
|
|
107
|
-
transform = _useSortable.transform,
|
|
108
|
-
transition = _useSortable.transition,
|
|
109
|
-
isDragging = _useSortable.isDragging;
|
|
110
|
-
return /*#__PURE__*/jsxs("div", {
|
|
111
|
-
className: className,
|
|
112
|
-
ref: setNodeRef,
|
|
113
|
-
style: {
|
|
114
|
-
transform: CSS.Transform.toString(transform),
|
|
115
|
-
transition: transition
|
|
116
|
-
},
|
|
117
|
-
children: [/*#__PURE__*/jsx(Icon, _objectSpread(_objectSpread({
|
|
118
|
-
className: isDragging ? "cursor-grabbing" : "cursor-grab",
|
|
119
|
-
icon: CoreIcons.dragHandle
|
|
120
|
-
}, attributes), listeners)), children]
|
|
121
|
-
});
|
|
122
|
-
}
|
|
230
|
+
var addButton = useMemo(function () {
|
|
231
|
+
var _error$values$label;
|
|
123
232
|
return /*#__PURE__*/jsx("div", {
|
|
124
|
-
className:
|
|
125
|
-
children:
|
|
233
|
+
className: "flex justify-end",
|
|
234
|
+
children: /*#__PURE__*/jsx(Tooltip, {
|
|
235
|
+
color: "danger",
|
|
236
|
+
content: isObject(error) ? t(error.key, isObject(error.values) ? _objectSpread(_objectSpread({}, error.values), {}, {
|
|
237
|
+
label: t((_error$values$label = error.values.label) !== null && _error$values$label !== void 0 ? _error$values$label : "form:badkey", error.values.path)
|
|
238
|
+
}) : {}) : isString(error) ? error : "",
|
|
239
|
+
children: /*#__PURE__*/jsx(Button, {
|
|
240
|
+
size: "sm",
|
|
241
|
+
"aria-label": "Add item",
|
|
242
|
+
icon: "icon-[mdi--plus-circle-outline]",
|
|
243
|
+
onClick: function onClick() {
|
|
244
|
+
return handleAdd(Promise.resolve(onAdd === null || onAdd === void 0 ? void 0 : onAdd()));
|
|
245
|
+
},
|
|
246
|
+
"data-invalid": !!error,
|
|
247
|
+
disabled: !!disabled || readOnly || fields.length > maxItems,
|
|
248
|
+
className: cn("fabric-addButton", canRemove !== false && "me-10"),
|
|
249
|
+
children: addLabel !== null && addLabel !== void 0 ? addLabel : t("form:addArray")
|
|
250
|
+
})
|
|
251
|
+
})
|
|
126
252
|
});
|
|
127
|
-
}, [
|
|
128
|
-
// @ts-expect-error ignore
|
|
129
|
-
SortableItem.displayName = "SortableItem";
|
|
253
|
+
}, [error, t, disabled, readOnly, fields.length, maxItems, canRemove, addLabel, handleAdd, onAdd]);
|
|
130
254
|
return /*#__PURE__*/jsxs("div", {
|
|
131
|
-
className:
|
|
255
|
+
className: "fabric-arrayInput",
|
|
132
256
|
children: [/*#__PURE__*/jsx(FieldWrapper, _objectSpread(_objectSpread({}, rest), {}, {
|
|
257
|
+
appendLabel: /*#__PURE__*/jsx("div", {
|
|
258
|
+
className: "-me-2",
|
|
259
|
+
children: onAdd && buttonPosition !== "bottom" && addButton
|
|
260
|
+
}),
|
|
133
261
|
children: /*#__PURE__*/jsx(Wrapper, {
|
|
262
|
+
onMove: move,
|
|
263
|
+
enableSorting: enableSorting,
|
|
264
|
+
fields: fields,
|
|
134
265
|
children: fields.map(function (item, index) {
|
|
266
|
+
var _cloneChildren;
|
|
135
267
|
return /*#__PURE__*/jsxs(SortableItem, {
|
|
136
|
-
id: item.
|
|
268
|
+
id: item.__ID__,
|
|
269
|
+
index: index,
|
|
270
|
+
enableSorting: enableSorting,
|
|
137
271
|
className: "flex items-center flex-nowrap gap-2 mb-1",
|
|
138
272
|
children: [typeof children === "function" ? children({
|
|
139
273
|
index: index,
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
274
|
+
item: item,
|
|
275
|
+
name: "".concat(name, ".").concat(index),
|
|
276
|
+
onChange: function onChange(val) {
|
|
277
|
+
void Promise.resolve(val).then(function (result) {
|
|
278
|
+
if (result) form.setValue("".concat(name, ".").concat(index), result);
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}) : (_cloneChildren = cloneChildren(children)) === null || _cloneChildren === void 0 ? void 0 : _cloneChildren.map(function (child) {
|
|
282
|
+
if (/*#__PURE__*/isValidElement(child)) {
|
|
283
|
+
var childEl = child;
|
|
284
|
+
return /*#__PURE__*/cloneElement(childEl, Object.assign({
|
|
285
|
+
disabled: disabled,
|
|
286
|
+
readOnly: readOnly,
|
|
287
|
+
"data-inner": true,
|
|
288
|
+
name: "".concat(name, ".").concat(index).concat(childEl.props.name ? "." + childEl.props.name : "")
|
|
289
|
+
}, index > 0 && {
|
|
290
|
+
label: undefined,
|
|
291
|
+
required: undefined,
|
|
292
|
+
appendLabel: undefined
|
|
293
|
+
}));
|
|
294
|
+
}
|
|
295
|
+
}), canRemove !== false && /*#__PURE__*/jsx(Button, {
|
|
153
296
|
"aria-label": "Remove item",
|
|
154
|
-
icon:
|
|
297
|
+
icon: "icon-[mdi--minus-circle-outline]",
|
|
155
298
|
color: "danger",
|
|
156
299
|
variant: "link",
|
|
157
300
|
className: "self-end",
|
|
158
|
-
disabled: disabled || readOnly || fields.length <= minItems,
|
|
301
|
+
disabled: disabled || readOnly || fields.length <= minItems || !removeCheck(item, index),
|
|
159
302
|
onClick: function onClick() {
|
|
160
|
-
return
|
|
303
|
+
return handleRemove(item, index);
|
|
161
304
|
}
|
|
162
305
|
})]
|
|
163
|
-
}, item.
|
|
164
|
-
})
|
|
165
|
-
})
|
|
166
|
-
})), !fixedList && onAdd && /*#__PURE__*/jsx("div", {
|
|
167
|
-
className: "flex justify-end",
|
|
168
|
-
children: /*#__PURE__*/jsx(Tooltip, {
|
|
169
|
-
color: "danger",
|
|
170
|
-
content: 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__*/jsx(Button, {
|
|
174
|
-
"aria-label": "Add item",
|
|
175
|
-
icon: CoreIcons.insert,
|
|
176
|
-
onClick: function onClick() {
|
|
177
|
-
return handleAdd(onAdd());
|
|
178
|
-
},
|
|
179
|
-
"data-invalid": !!error,
|
|
180
|
-
disabled: !!disabled || readOnly,
|
|
181
|
-
className: classNames(classes.addButton, "me-10"),
|
|
182
|
-
children: addLabel !== null && addLabel !== void 0 ? addLabel : t("addArray")
|
|
306
|
+
}, item.__ID__);
|
|
183
307
|
})
|
|
184
308
|
})
|
|
185
|
-
})]
|
|
309
|
+
})), onAdd && buttonPosition !== "top" && addButton]
|
|
186
310
|
});
|
|
187
|
-
}
|
|
311
|
+
}
|
|
188
312
|
|
|
189
313
|
export { ArrayInput };
|