@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.
Files changed (215) hide show
  1. package/{src/input/ArrayInput.module.css → css/_arrayInput.css} +8 -8
  2. package/css/_colorPicker.css +95 -0
  3. package/{src/internal/Field.module.css → css/_field.css} +94 -33
  4. package/{src/input/File.module.css → css/_file.css} +21 -6
  5. package/css/styles.css +27 -0
  6. package/dist/cjs/builder/FileField.js +107 -78
  7. package/dist/cjs/builder/FormField.js +60 -39
  8. package/dist/cjs/builder/SchemaEditor.js +72 -0
  9. package/dist/cjs/builder/components/AddSchemaFields.js +64 -0
  10. package/dist/cjs/builder/components/SchemaArrayForm.js +146 -0
  11. package/dist/cjs/builder/components/SchemaField.js +423 -0
  12. package/dist/cjs/form/Controller.js +66 -19
  13. package/dist/cjs/form/Form.js +97 -39
  14. package/dist/cjs/form/useForm.js +32 -0
  15. package/dist/cjs/hooks/useFileUploader.js +74 -45
  16. package/dist/cjs/hooks/useFormBuilder.js +85 -31
  17. package/dist/cjs/i18n/{ar.json.js → ar/form.json.js} +5 -4
  18. package/dist/cjs/i18n/{en.json.js → en/form.json.js} +5 -5
  19. package/dist/cjs/i18n/index.js +4 -4
  20. package/dist/cjs/index.js +41 -2
  21. package/dist/cjs/input/ArrayInput.js +259 -135
  22. package/dist/cjs/input/AvatarInput.js +99 -63
  23. package/dist/cjs/input/Checkbox.js +24 -25
  24. package/dist/cjs/input/ColorInput.js +138 -81
  25. package/dist/cjs/input/ColorPicker.js +78 -95
  26. package/dist/cjs/input/DateInput.js +192 -0
  27. package/dist/cjs/input/Field.js +21 -20
  28. package/dist/cjs/input/File.js +85 -80
  29. package/dist/cjs/input/Hidden.js +27 -13
  30. package/dist/cjs/input/Input.js +49 -48
  31. package/dist/cjs/input/Number.js +46 -44
  32. package/dist/cjs/input/Password.js +51 -49
  33. package/dist/cjs/input/Radio.js +26 -16
  34. package/dist/cjs/input/RadioGroup.js +26 -11
  35. package/dist/cjs/input/{Range.js → RangeSlider.js} +61 -66
  36. package/dist/cjs/input/Search.js +58 -64
  37. package/dist/cjs/input/Slider.js +57 -66
  38. package/dist/cjs/input/Switch.js +29 -27
  39. package/dist/cjs/input/Textarea.js +65 -53
  40. package/dist/cjs/internal/ErrorIcon.js +9 -9
  41. package/dist/cjs/internal/FieldWrapper.js +23 -13
  42. package/dist/cjs/internal/InputWrapper.js +85 -87
  43. package/dist/cjs/ranger/index.js +7 -7
  44. package/dist/cjs/ranger/utils.js +9 -4
  45. package/dist/cjs/select/AutoComplete.js +93 -76
  46. package/dist/cjs/select/DualList.js +235 -154
  47. package/dist/cjs/select/List.js +122 -89
  48. package/dist/cjs/select/Options.js +58 -54
  49. package/dist/cjs/select/Select.js +119 -89
  50. package/dist/cjs/select/helpers.js +5 -5
  51. package/dist/cjs/select/useSelect.js +83 -58
  52. package/dist/cjs/types/schema.js +43 -0
  53. package/dist/cjs/utils/eventHandlers.js +16 -6
  54. package/dist/cjs/utils/getColor.js +6 -6
  55. package/dist/cjs/utils/getProps.js +49 -0
  56. package/dist/esm/builder/FileField.js +109 -80
  57. package/dist/esm/builder/FormField.js +60 -39
  58. package/dist/esm/builder/SchemaEditor.js +72 -0
  59. package/dist/esm/builder/components/AddSchemaFields.js +64 -0
  60. package/dist/esm/builder/components/SchemaArrayForm.js +146 -0
  61. package/dist/esm/builder/components/SchemaField.js +423 -0
  62. package/dist/esm/form/Controller.js +66 -19
  63. package/dist/esm/form/Form.js +97 -39
  64. package/dist/esm/form/useForm.js +32 -0
  65. package/dist/esm/hooks/useFileUploader.js +75 -46
  66. package/dist/esm/hooks/useFormBuilder.js +84 -30
  67. package/dist/esm/i18n/{ar.json.js → ar/form.json.js} +5 -4
  68. package/dist/esm/i18n/{en.json.js → en/form.json.js} +5 -5
  69. package/dist/esm/i18n/index.js +2 -2
  70. package/dist/esm/index.js +36 -1
  71. package/dist/esm/input/ArrayInput.js +260 -136
  72. package/dist/esm/input/AvatarInput.js +99 -63
  73. package/dist/esm/input/Checkbox.js +26 -27
  74. package/dist/esm/input/ColorInput.js +141 -84
  75. package/dist/esm/input/ColorPicker.js +80 -97
  76. package/dist/esm/input/DateInput.js +192 -0
  77. package/dist/esm/input/Field.js +21 -20
  78. package/dist/esm/input/File.js +89 -84
  79. package/dist/esm/input/Hidden.js +28 -14
  80. package/dist/esm/input/Input.js +51 -50
  81. package/dist/esm/input/Number.js +48 -46
  82. package/dist/esm/input/Password.js +54 -52
  83. package/dist/esm/input/Radio.js +27 -17
  84. package/dist/esm/input/RadioGroup.js +27 -12
  85. package/dist/esm/input/{Range.js → RangeSlider.js} +62 -67
  86. package/dist/esm/input/Search.js +61 -67
  87. package/dist/esm/input/Slider.js +58 -67
  88. package/dist/esm/input/Switch.js +31 -29
  89. package/dist/esm/input/Textarea.js +67 -55
  90. package/dist/esm/internal/ErrorIcon.js +11 -11
  91. package/dist/esm/internal/FieldWrapper.js +23 -13
  92. package/dist/esm/internal/InputWrapper.js +88 -90
  93. package/dist/esm/ranger/index.js +7 -7
  94. package/dist/esm/ranger/utils.js +9 -4
  95. package/dist/esm/select/AutoComplete.js +95 -78
  96. package/dist/esm/select/DualList.js +233 -152
  97. package/dist/esm/select/List.js +125 -92
  98. package/dist/esm/select/Options.js +58 -54
  99. package/dist/esm/select/Select.js +122 -92
  100. package/dist/esm/select/helpers.js +5 -5
  101. package/dist/esm/select/useSelect.js +84 -59
  102. package/{src/input/ColorPicker.module.css → dist/esm/types/schema.js} +18 -27
  103. package/dist/esm/utils/eventHandlers.js +16 -6
  104. package/dist/esm/utils/getColor.js +6 -6
  105. package/dist/esm/utils/getProps.js +49 -0
  106. package/dist/types/builder/FileField.d.ts +7 -4
  107. package/dist/types/builder/FormField.d.ts +4 -2
  108. package/dist/types/builder/SchemaEditor.d.ts +6 -0
  109. package/dist/types/builder/components/AddSchemaFields.d.ts +2 -0
  110. package/dist/types/builder/components/SchemaArrayForm.d.ts +2 -0
  111. package/dist/types/builder/components/SchemaField.d.ts +12 -0
  112. package/dist/types/form/Controller.d.ts +45 -3
  113. package/dist/types/form/Form.d.ts +38 -7
  114. package/dist/types/form/useForm.d.ts +6 -0
  115. package/dist/types/hooks/useFileUploader.d.ts +24 -3
  116. package/dist/types/hooks/useFormBuilder.d.ts +41 -3
  117. package/dist/types/index.d.ts +32 -2
  118. package/dist/types/input/ArrayInput.d.ts +68 -13
  119. package/dist/types/input/AvatarInput.d.ts +23 -6
  120. package/dist/types/input/Checkbox.d.ts +12 -10
  121. package/dist/types/input/ColorInput.d.ts +15 -5
  122. package/dist/types/input/ColorPicker.d.ts +10 -2
  123. package/dist/types/input/DateInput.d.ts +21 -0
  124. package/dist/types/input/Field.d.ts +9 -36
  125. package/dist/types/input/File.d.ts +16 -4
  126. package/dist/types/input/Hidden.d.ts +7 -6
  127. package/dist/types/input/Input.d.ts +11 -4
  128. package/dist/types/input/Number.d.ts +9 -4
  129. package/dist/types/input/Password.d.ts +9 -4
  130. package/dist/types/input/Radio.d.ts +9 -4
  131. package/dist/types/input/RadioGroup.d.ts +14 -6
  132. package/dist/types/input/{Range.d.ts → RangeSlider.d.ts} +11 -6
  133. package/dist/types/input/Search.d.ts +14 -4
  134. package/dist/types/input/Slider.d.ts +9 -6
  135. package/dist/types/input/Switch.d.ts +13 -8
  136. package/dist/types/input/Textarea.d.ts +15 -4
  137. package/dist/types/internal/ErrorIcon.d.ts +4 -1
  138. package/dist/types/internal/FieldWrapper.d.ts +10 -1
  139. package/dist/types/internal/InputWrapper.d.ts +19 -1
  140. package/dist/types/ranger/index.d.ts +7 -3
  141. package/dist/types/ranger/utils.d.ts +2 -2
  142. package/dist/types/select/AutoComplete.d.ts +7 -2
  143. package/dist/types/select/DualList.d.ts +11 -37
  144. package/dist/types/select/List.d.ts +7 -2
  145. package/dist/types/select/Options.d.ts +8 -7
  146. package/dist/types/select/Select.d.ts +7 -2
  147. package/dist/types/select/helpers.d.ts +2 -2
  148. package/dist/types/select/useSelect.d.ts +10 -28
  149. package/dist/types/types/index.d.ts +73 -39
  150. package/dist/types/types/schema.d.ts +78 -32
  151. package/dist/types/utils/eventHandlers.d.ts +4 -4
  152. package/dist/types/utils/getColor.d.ts +4 -4
  153. package/dist/types/utils/getProps.d.ts +26 -0
  154. package/dist/types/utils/index.d.ts +1 -0
  155. package/package.json +25 -25
  156. package/src/builder/FileField.tsx +73 -56
  157. package/src/builder/FormField.tsx +66 -58
  158. package/src/builder/SchemaEditor.tsx +78 -0
  159. package/src/builder/components/AddSchemaFields.tsx +64 -0
  160. package/src/builder/components/SchemaArrayForm.tsx +146 -0
  161. package/src/builder/components/SchemaField.tsx +405 -0
  162. package/src/form/Controller.tsx +61 -24
  163. package/src/form/Form.tsx +74 -50
  164. package/src/form/useForm.ts +53 -0
  165. package/src/hooks/useFileUploader.ts +115 -84
  166. package/src/hooks/useFormBuilder.tsx +80 -41
  167. package/src/i18n/{ar.json → ar/form.json} +5 -4
  168. package/src/i18n/{en.json → en/form.json} +5 -5
  169. package/src/i18n/index.ts +2 -2
  170. package/src/index.ts +34 -20
  171. package/src/input/ArrayInput.tsx +255 -173
  172. package/src/input/AvatarInput.tsx +82 -39
  173. package/src/input/Checkbox.tsx +30 -54
  174. package/src/input/ColorInput.tsx +146 -105
  175. package/src/input/ColorPicker.tsx +76 -102
  176. package/src/input/DateInput.tsx +225 -0
  177. package/src/input/Field.tsx +23 -65
  178. package/src/input/File.tsx +76 -98
  179. package/src/input/Hidden.tsx +36 -24
  180. package/src/input/Input.tsx +55 -53
  181. package/src/input/Number.tsx +49 -54
  182. package/src/input/Password.tsx +61 -66
  183. package/src/input/Radio.tsx +28 -37
  184. package/src/input/RadioGroup.tsx +30 -25
  185. package/src/input/{Range.tsx → RangeSlider.tsx} +81 -109
  186. package/src/input/Search.tsx +64 -77
  187. package/src/input/Slider.tsx +80 -109
  188. package/src/input/Switch.tsx +39 -53
  189. package/src/input/Textarea.tsx +72 -59
  190. package/src/internal/ErrorIcon.tsx +22 -21
  191. package/src/internal/FieldWrapper.tsx +33 -23
  192. package/src/internal/InputWrapper.tsx +132 -143
  193. package/src/ranger/index.tsx +37 -117
  194. package/src/ranger/utils.ts +12 -11
  195. package/src/select/AutoComplete.tsx +113 -123
  196. package/src/select/DualList.tsx +218 -204
  197. package/src/select/List.tsx +130 -97
  198. package/src/select/Options.tsx +59 -57
  199. package/src/select/Select.tsx +148 -122
  200. package/src/select/helpers.ts +13 -8
  201. package/src/select/useSelect.tsx +110 -127
  202. package/src/types/index.ts +76 -45
  203. package/src/types/schema.ts +97 -40
  204. package/src/utils/eventHandlers.ts +24 -26
  205. package/src/utils/getColor.ts +9 -8
  206. package/src/utils/getProps.ts +47 -0
  207. package/src/utils/index.ts +1 -0
  208. package/dist/cjs/input/ArrayInput.module.css +0 -1
  209. package/dist/cjs/input/ColorPicker.module.css +0 -1
  210. package/dist/cjs/input/File.module.css +0 -1
  211. package/dist/cjs/internal/Field.module.css +0 -1
  212. package/dist/esm/input/ArrayInput.module.css +0 -1
  213. package/dist/esm/input/ColorPicker.module.css +0 -1
  214. package/dist/esm/input/File.module.css +0 -1
  215. package/dist/esm/internal/Field.module.css +0 -1
@@ -4,19 +4,19 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var addArray = "Add Item";
6
6
  var password = {
7
- show: "Show password",
8
- hide: "Hide password"
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}}",
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var core = require('@react-fabric/core');
4
- var ar = require('./ar.json.js');
5
- var en = require('./en.json.js');
4
+ var form = require('./ar/form.json.js');
5
+ var form$1 = require('./en/form.json.js');
6
6
 
7
7
  /*
8
8
  * React Fabric
@@ -28,6 +28,6 @@ var en = require('./en.json.js');
28
28
  */
29
29
 
30
30
  core.addTranslationBundle("form", {
31
- en: en.default,
32
- ar: ar.default
31
+ en: form$1.default,
32
+ ar: form.default
33
33
  });
package/dist/cjs/index.js CHANGED
@@ -3,12 +3,15 @@
3
3
  require('./i18n/index.js');
4
4
  var Controller = require('./form/Controller.js');
5
5
  var Form = require('./form/Form.js');
6
+ var useForm = require('./form/useForm.js');
6
7
  var useFileUploader = require('./hooks/useFileUploader.js');
7
8
  var useFormBuilder = require('./hooks/useFormBuilder.js');
8
9
  var ArrayInput = require('./input/ArrayInput.js');
10
+ var AvatarInput = require('./input/AvatarInput.js');
9
11
  var Checkbox = require('./input/Checkbox.js');
10
12
  var ColorInput = require('./input/ColorInput.js');
11
13
  var ColorPicker = require('./input/ColorPicker.js');
14
+ var DateInput = require('./input/DateInput.js');
12
15
  var Field = require('./input/Field.js');
13
16
  var File = require('./input/File.js');
14
17
  var Hidden = require('./input/Hidden.js');
@@ -17,7 +20,7 @@ var Number = require('./input/Number.js');
17
20
  var Password = require('./input/Password.js');
18
21
  var Radio = require('./input/Radio.js');
19
22
  var RadioGroup = require('./input/RadioGroup.js');
20
- var Range = require('./input/Range.js');
23
+ var RangeSlider = require('./input/RangeSlider.js');
21
24
  var Search = require('./input/Search.js');
22
25
  var Slider = require('./input/Slider.js');
23
26
  var Switch = require('./input/Switch.js');
@@ -26,17 +29,48 @@ var AutoComplete = require('./select/AutoComplete.js');
26
29
  var DualList = require('./select/DualList.js');
27
30
  var List = require('./select/List.js');
28
31
  var Select = require('./select/Select.js');
32
+ var SchemaEditor = require('./builder/SchemaEditor.js');
33
+ var schema = require('./types/schema.js');
29
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
+ */
30
59
 
60
+ var FORM_PACKAGE = "@react-fabric/form";
61
+ var FORM_VERSION = "1.0.1";
31
62
 
32
63
  exports.Controller = Controller.Controller;
33
64
  exports.Form = Form.Form;
65
+ exports.useForm = useForm.useForm;
34
66
  exports.useFileUploader = useFileUploader.useFileUploader;
35
67
  exports.useFormBuilder = useFormBuilder.useFormBuilder;
36
68
  exports.ArrayInput = ArrayInput.ArrayInput;
69
+ exports.AvatarInput = AvatarInput.AvatarInput;
37
70
  exports.Checkbox = Checkbox.Checkbox;
38
71
  exports.ColorInput = ColorInput.ColorInput;
39
72
  exports.ColorPicker = ColorPicker.ColorPicker;
73
+ exports.DateInput = DateInput.DateInput;
40
74
  exports.Field = Field.Field;
41
75
  exports.FileInput = File.FileInput;
42
76
  exports.HiddenInput = Hidden.HiddenInput;
@@ -45,7 +79,7 @@ exports.Number = Number.Number;
45
79
  exports.Password = Password.Password;
46
80
  exports.Radio = Radio.Radio;
47
81
  exports.RadioGroup = RadioGroup.RadioGroup;
48
- exports.Range = Range.Range;
82
+ exports.RangeSlider = RangeSlider.RangeSlider;
49
83
  exports.Search = Search.Search;
50
84
  exports.Slider = Slider.Slider;
51
85
  exports.Switch = Switch.Switch;
@@ -54,3 +88,8 @@ exports.AutoComplete = AutoComplete.AutoComplete;
54
88
  exports.DualList = DualList.DualList;
55
89
  exports.List = List.List;
56
90
  exports.Select = Select.Select;
91
+ exports.SchemaEditor = SchemaEditor.SchemaEditor;
92
+ exports.DATA_TYPES = schema.DATA_TYPES;
93
+ exports.SCHEMA_CUSTOM_LIST = schema.SCHEMA_CUSTOM_LIST;
94
+ exports.FORM_PACKAGE = FORM_PACKAGE;
95
+ exports.FORM_VERSION = FORM_VERSION;
@@ -1,189 +1,313 @@
1
1
  'use strict';
2
2
 
3
3
  var _defineProperty = require('@babel/runtime/helpers/defineProperty');
4
+ var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
5
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
4
6
  var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
5
- var core = require('@dnd-kit/core');
6
- var sortable = require('@dnd-kit/sortable');
7
- var core$1 = require('@react-fabric/core');
8
- var utilities$1 = require('@react-fabric/utilities');
9
- var classNames = require('classnames');
7
+ var _regeneratorRuntime = require('@babel/runtime/regenerator');
8
+ var modifiers = require('@dnd-kit/abstract/modifiers');
9
+ var react$1 = require('@dnd-kit/react');
10
+ var sortable = require('@dnd-kit/react/sortable');
11
+ var core = require('@react-fabric/core');
12
+ var utilities = require('@react-fabric/utilities');
10
13
  var react = require('react');
11
14
  var reactHookForm = require('react-hook-form');
12
15
  var reactI18next = require('react-i18next');
13
16
  var FieldWrapper = require('../internal/FieldWrapper.js');
14
- var ArrayInput_module = require('./ArrayInput.module.css');
15
- var modifiers = require('@dnd-kit/modifiers');
16
- var utilities = require('@dnd-kit/utilities');
17
17
  var jsxRuntime = require('react/jsx-runtime');
18
18
 
19
- var _excluded = ["name", "children", "addLabel", "fixedList", "focusName", "onAdd", "arrayRef", "enableSorting", "disabled", "readOnly", "minItems"];
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), !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; }
22
- var ArrayInput = function ArrayInput(_ref) {
23
- var _error$values$label, _error$values, _error$values2;
24
- var name = _ref.name,
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
- addLabel = _ref.addLabel,
27
- fixedList = _ref.fixedList,
28
- _ref$focusName = _ref.focusName,
29
- focusName = _ref$focusName === void 0 ? "" : _ref$focusName,
30
- onAdd = _ref.onAdd,
31
- arrayRef = _ref.arrayRef,
32
- enableSorting = _ref.enableSorting,
33
- _ref$disabled = _ref.disabled,
34
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
35
- _ref$readOnly = _ref.readOnly,
36
- readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
37
- _ref$minItems = _ref.minItems,
38
- minItems = _ref$minItems === void 0 ? 0 : _ref$minItems,
39
- rest = _objectWithoutProperties(_ref, _excluded);
26
+ className = _ref.className,
27
+ enableSorting = _ref.enableSorting;
28
+ var _useSortable = sortable.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__*/jsxRuntime.jsxs("div", {
38
+ className: className,
39
+ ref: ref,
40
+ children: [/*#__PURE__*/jsxRuntime.jsx(core.Icon, {
41
+ ref: handleRef,
42
+ className: isDragging ? "cursor-grabbing" : "cursor-grab",
43
+ icon: "icon-[mdi--drag-vertical]"
44
+ }), children]
45
+ });
46
+ }
47
+ return /*#__PURE__*/jsxRuntime.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__*/jsxRuntime.jsx(react$1.DragDropProvider, {
73
+ onDragEnd: handleDragEnd,
74
+ modifiers: [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 = reactI18next.useTranslation("form"),
41
141
  t = _useTranslation.t;
42
142
  var form = reactHookForm.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 = reactHookForm.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 = react.useState(function () {
154
+ return [];
155
+ }),
156
+ _useState2 = _slicedToArray(_useState, 2),
157
+ initialList = _useState2[0],
158
+ setInitialList = _useState2[1];
159
+ react.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 = react.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 handleAdd = react.useCallback(function (item) {
57
- append(item);
58
- setTimeout(function () {
59
- form.setFocus("".concat(name, ".").concat(fields.length).concat(focusName ? "." + focusName : ""));
60
- }, 100);
61
- }, [name, fields, focusName]);
168
+ }, [form.formState.errors, name]);
169
+ var removeCheck = react.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 = react.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 = react.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 (!utilities.isFalse(b)) {
217
+ remove(index);
218
+ onRemove === null || onRemove === void 0 || onRemove(item, index);
219
+ }
220
+ });
221
+ }, [remove, onRemove, onBeforeRemove]);
62
222
  react.useImperativeHandle(arrayRef, function () {
63
223
  return {
64
- addItem: handleAdd,
224
+ addItem: function addItem(t) {
225
+ return handleAdd(Promise.resolve(t));
226
+ },
65
227
  removeItem: remove
66
228
  };
67
229
  });
68
- var Wrapper = react.useCallback(function (_ref2) {
69
- var children = _ref2.children;
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__*/jsxRuntime.jsx(core.DndContext, {
84
- onDragEnd: handleDragEnd,
85
- modifiers: [modifiers.restrictToVerticalAxis],
86
- children: /*#__PURE__*/jsxRuntime.jsx(sortable.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 = react.useCallback(function (_ref3) {
97
- var id = _ref3.id,
98
- children = _ref3.children,
99
- className = _ref3.className;
100
- if (enableSorting) {
101
- var _useSortable = sortable.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__*/jsxRuntime.jsxs("div", {
111
- className: className,
112
- ref: setNodeRef,
113
- style: {
114
- transform: utilities.CSS.Transform.toString(transform),
115
- transition: transition
116
- },
117
- children: [/*#__PURE__*/jsxRuntime.jsx(core$1.Icon, _objectSpread(_objectSpread({
118
- className: isDragging ? "cursor-grabbing" : "cursor-grab",
119
- icon: core$1.CoreIcons.dragHandle
120
- }, attributes), listeners)), children]
121
- });
122
- }
230
+ var addButton = react.useMemo(function () {
231
+ var _error$values$label;
123
232
  return /*#__PURE__*/jsxRuntime.jsx("div", {
124
- className: className,
125
- children: children
233
+ className: "flex justify-end",
234
+ children: /*#__PURE__*/jsxRuntime.jsx(core.Tooltip, {
235
+ color: "danger",
236
+ content: utilities.isObject(error) ? t(error.key, utilities.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
+ }) : {}) : utilities.isString(error) ? error : "",
239
+ children: /*#__PURE__*/jsxRuntime.jsx(core.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: utilities.cn("fabric-addButton", canRemove !== false && "me-10"),
249
+ children: addLabel !== null && addLabel !== void 0 ? addLabel : t("form:addArray")
250
+ })
251
+ })
126
252
  });
127
- }, [enableSorting]);
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__*/jsxRuntime.jsxs("div", {
131
- className: ArrayInput_module.arrayInput,
255
+ className: "fabric-arrayInput",
132
256
  children: [/*#__PURE__*/jsxRuntime.jsx(FieldWrapper.FieldWrapper, _objectSpread(_objectSpread({}, rest), {}, {
257
+ appendLabel: /*#__PURE__*/jsxRuntime.jsx("div", {
258
+ className: "-me-2",
259
+ children: onAdd && buttonPosition !== "bottom" && addButton
260
+ }),
133
261
  children: /*#__PURE__*/jsxRuntime.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__*/jsxRuntime.jsxs(SortableItem, {
136
- id: item.id,
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
- name: "".concat(name, ".").concat(index)
141
- }) : react.Children.map(children, function (child) {
142
- return /*#__PURE__*/react.cloneElement(child, Object.assign({
143
- disabled: disabled,
144
- readOnly: readOnly,
145
- "data-inner": true,
146
- name: "".concat(name, ".").concat(index).concat(child.props.name ? "." + child.props.name : "")
147
- }, index > 0 && {
148
- label: undefined,
149
- required: undefined,
150
- appendLabel: undefined
151
- }));
152
- }), !fixedList && /*#__PURE__*/jsxRuntime.jsx(core$1.Button, {
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 = core.cloneChildren(children)) === null || _cloneChildren === void 0 ? void 0 : _cloneChildren.map(function (child) {
282
+ if (/*#__PURE__*/react.isValidElement(child)) {
283
+ var childEl = child;
284
+ return /*#__PURE__*/react.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__*/jsxRuntime.jsx(core.Button, {
153
296
  "aria-label": "Remove item",
154
- icon: core$1.CoreIcons.remove,
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 remove(index);
303
+ return handleRemove(item, index);
161
304
  }
162
305
  })]
163
- }, item.id);
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")
306
+ }, item.__ID__);
183
307
  })
184
308
  })
185
- })]
309
+ })), onAdd && buttonPosition !== "top" && addButton]
186
310
  });
187
- };
311
+ }
188
312
 
189
313
  exports.ArrayInput = ArrayInput;