@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
@@ -3,59 +3,66 @@
3
3
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
4
  import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
5
5
  import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
6
- import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
7
- import { ButtonGroup, Button, CoreIcons } from '@react-fabric/core';
8
- import { useState, useDeferredValue, useEffect, useMemo, useCallback } from 'react';
6
+ import { RestrictToHorizontalAxis } from '@dnd-kit/abstract/modifiers';
7
+ import { DragDropProvider, DragOverlay, useDraggable, useDroppable } from '@dnd-kit/react';
8
+ import { Icon, ButtonGroup, Button } from '@react-fabric/core';
9
+ import { mergeRefs, cn } from '@react-fabric/utilities';
10
+ import { useState, useRef, useDeferredValue, useEffect, useMemo, useCallback, useImperativeHandle } from 'react';
9
11
  import { Field } from '../input/Field.js';
12
+ import '@floating-ui/react';
13
+ import { getWrapperProps } from '../utils/getProps.js';
10
14
  import { List } from './List.js';
11
- import { restrictToHorizontalAxis } from '@dnd-kit/modifiers';
12
- import { useDraggable, useDroppable, DndContext, DragOverlay } from '@dnd-kit/core';
13
- import { mergeRefs } from '@react-fabric/utilities';
14
- import { jsx, jsxs } from 'react/jsx-runtime';
15
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
15
16
 
16
- var _excluded = ["ref", "value", "options", "groupProperty", "height", "labelProperty", "valueProperty", "renderer", "onChange", "name", "invalid", "readOnly", "disabled", "placeholder", "autoFocus", "error"];
17
17
  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; }
18
- 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; }
19
- var DualList = function DualList(_ref) {
20
- var ref = _ref.ref,
21
- value = _ref.value,
22
- options = _ref.options,
23
- groupProperty = _ref.groupProperty,
24
- _ref$height = _ref.height,
25
- height = _ref$height === void 0 ? "18rem" : _ref$height,
26
- _ref$labelProperty = _ref.labelProperty,
27
- labelProperty = _ref$labelProperty === void 0 ? "label" : _ref$labelProperty,
28
- _ref$valueProperty = _ref.valueProperty,
29
- valueProperty = _ref$valueProperty === void 0 ? "id" : _ref$valueProperty,
30
- renderer = _ref.renderer,
31
- onChange = _ref.onChange,
32
- name = _ref.name,
33
- invalid = _ref.invalid,
34
- readOnly = _ref.readOnly,
35
- disabled = _ref.disabled,
36
- placeholder = _ref.placeholder,
37
- autoFocus = _ref.autoFocus,
38
- error = _ref.error,
39
- rest = _objectWithoutProperties(_ref, _excluded);
40
- var _useState = useState([]),
18
+ 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; }
19
+ function DualListComponent(props) {
20
+ var ref = props.ref,
21
+ value = props.value,
22
+ options = props.options,
23
+ emptyDisplay = props.emptyDisplay,
24
+ groupProperty = props.groupProperty,
25
+ _props$height = props.height,
26
+ height = _props$height === void 0 ? "18rem" : _props$height,
27
+ labelProperty = props.labelProperty,
28
+ _props$valueProperty = props.valueProperty,
29
+ valueProperty = _props$valueProperty === void 0 ? "value" : _props$valueProperty,
30
+ renderer = props.renderer,
31
+ onChange = props.onChange,
32
+ name = props.name,
33
+ invalid = props.invalid,
34
+ readOnly = props.readOnly,
35
+ disabled = props.disabled,
36
+ autoFocus = props.autoFocus,
37
+ error = props.error,
38
+ dualRef = props.dualRef,
39
+ onSelectedChange = props.onSelectedChange;
40
+ var _useState = useState(function () {
41
+ return [];
42
+ }),
41
43
  _useState2 = _slicedToArray(_useState, 2),
42
44
  actualValue = _useState2[0],
43
45
  setActualValue = _useState2[1];
44
- var _useState3 = useState([]),
46
+ var _useState3 = useState(function () {
47
+ return [];
48
+ }),
45
49
  _useState4 = _slicedToArray(_useState3, 2),
46
50
  leftSelected = _useState4[0],
47
51
  setLeftSelected = _useState4[1];
48
- var _useState5 = useState([]),
52
+ var _useState5 = useState(function () {
53
+ return [];
54
+ }),
49
55
  _useState6 = _slicedToArray(_useState5, 2),
50
56
  rightSelected = _useState6[0],
51
57
  setRightSelected = _useState6[1];
52
58
  var deferred = useDeferredValue(value);
53
59
  useEffect(function () {
60
+ // eslint-disable-next-line @eslint-react/set-state-in-effect
54
61
  setActualValue(options.filter(function (opt) {
55
62
  var _opt$valueProperty;
56
63
  return deferred === null || deferred === void 0 ? void 0 : deferred.includes((_opt$valueProperty = opt[valueProperty]) !== null && _opt$valueProperty !== void 0 ? _opt$valueProperty : opt);
57
64
  }));
58
- }, [deferred, options]);
65
+ }, [deferred, options, valueProperty]);
59
66
  var _useMemo = useMemo(function () {
60
67
  return [options.filter(function (opt) {
61
68
  return !(actualValue !== null && actualValue !== void 0 && actualValue.includes(opt));
@@ -87,7 +94,7 @@ var DualList = function DualList(_ref) {
87
94
  return "".concat((_opt$valueProperty3 = opt[valueProperty]) !== null && _opt$valueProperty3 !== void 0 ? _opt$valueProperty3 : opt);
88
95
  }));
89
96
  setLeftSelected([]);
90
- }, [onChange, leftSelected, actualValue]);
97
+ }, [actualValue, leftSelected, onChange, valueProperty]);
91
98
  var moveRightSelected = useCallback(function () {
92
99
  var selected = actualValue.filter(function (opt) {
93
100
  return !rightSelected.includes(opt);
@@ -98,141 +105,215 @@ var DualList = function DualList(_ref) {
98
105
  return "".concat((_opt$valueProperty4 = opt[valueProperty]) !== null && _opt$valueProperty4 !== void 0 ? _opt$valueProperty4 : opt);
99
106
  }));
100
107
  setRightSelected([]);
101
- }, [onChange, rightSelected, actualValue]);
102
- var _useState7 = useState([]),
103
- _useState8 = _slicedToArray(_useState7, 2),
104
- dragItems = _useState8[0],
105
- setDragItems = _useState8[1];
108
+ }, [actualValue, onChange, rightSelected, valueProperty]);
106
109
  var dragLeft = useDraggable({
107
110
  id: "unselected",
108
- disabled: !leftSelected.length,
109
- data: {
110
- supports: ["selected"]
111
- },
112
- attributes: {
113
- role: "none"
114
- }
111
+ type: "unselected",
112
+ disabled: !leftSelected.length
115
113
  });
116
114
  var dragRight = useDraggable({
117
115
  id: "selected",
118
- disabled: !rightSelected.length,
119
- data: {
120
- supports: ["unselected"]
121
- },
122
- attributes: {
123
- role: "none"
124
- }
116
+ type: "selected",
117
+ disabled: !rightSelected.length
125
118
  });
126
119
  var dropLeft = useDroppable({
127
120
  id: "unselected",
128
- data: {
129
- accepts: ["selected"]
130
- }
121
+ accept: ["selected"]
131
122
  });
132
123
  var dropRight = useDroppable({
133
124
  id: "selected",
134
- data: {
135
- accepts: ["unselected"]
136
- }
125
+ accept: ["unselected"]
126
+ });
127
+ useImperativeHandle(dualRef, function () {
128
+ return {
129
+ moveLeftSelected: moveLeftSelected,
130
+ moveRightSelected: moveRightSelected
131
+ };
132
+ }, [moveLeftSelected, moveRightSelected]);
133
+ useEffect(function () {
134
+ onSelectedChange(leftSelected, rightSelected);
135
+ }, [leftSelected, onSelectedChange, rightSelected]);
136
+ return /*#__PURE__*/jsxs(Fragment, {
137
+ children: [/*#__PURE__*/jsx("div", {
138
+ className: cn("flex-1 flex flex-col overflow-hidden p-px border-none!", dropLeft.isDropTarget && "outline outline-primary-500 rounded-capped!"),
139
+ "data-id": "unselected",
140
+ ref: mergeRefs(dragLeft.ref, dropLeft.ref),
141
+ children: /*#__PURE__*/jsx(List, {
142
+ ref: ref,
143
+ multiple: true,
144
+ allowClear: true,
145
+ name: name,
146
+ invalid: invalid,
147
+ readOnly: readOnly,
148
+ disabled: disabled,
149
+ autoFocus: autoFocus,
150
+ error: error,
151
+ height: height,
152
+ options: leftOptions,
153
+ emptyDisplay: emptyDisplay,
154
+ groupProperty: groupProperty,
155
+ labelProperty: labelProperty,
156
+ searchable: true,
157
+ placeholder: "Filter",
158
+ decorateStart: /*#__PURE__*/jsx(Icon, {
159
+ icon: "icon-[mdi--filter-variant]",
160
+ className: "ps-2"
161
+ })
162
+ // @ts-expect-error ignore
163
+ ,
164
+ valueProperty: valueProperty,
165
+ renderer: renderer,
166
+ onSelect: setLeftSelected,
167
+ "data-inner": true,
168
+ "data-hide-selected": true
169
+ })
170
+ }), /*#__PURE__*/jsx("div", {
171
+ className: "self-center mx-2",
172
+ children: /*#__PURE__*/jsxs(ButtonGroup, {
173
+ vertical: true,
174
+ className: "outline overflow-hidden bg-default",
175
+ children: [/*#__PURE__*/jsx(Button, {
176
+ size: "sm",
177
+ variant: "link",
178
+ "aria-label": "scroll to top",
179
+ onClick: moveAllLeft,
180
+ icon: {
181
+ icon: "icon-[mdi--chevron-double-left]",
182
+ rtlFlip: true
183
+ },
184
+ disabled: !rightOptions.length
185
+ }), /*#__PURE__*/jsx(Button, {
186
+ size: "sm",
187
+ variant: "link",
188
+ "aria-label": "scroll up",
189
+ onClick: moveRightSelected,
190
+ icon: {
191
+ icon: "icon-[mdi--chevron-left]",
192
+ rtlFlip: true
193
+ },
194
+ disabled: !rightSelected.length
195
+ }), /*#__PURE__*/jsx(Button, {
196
+ size: "sm",
197
+ variant: "link",
198
+ "aria-label": "scroll down",
199
+ onClick: moveLeftSelected,
200
+ icon: {
201
+ icon: "icon-[mdi--chevron-right]",
202
+ rtlFlip: true
203
+ },
204
+ disabled: !leftSelected.length
205
+ }), /*#__PURE__*/jsx(Button, {
206
+ size: "sm",
207
+ variant: "link",
208
+ "aria-label": "scroll to bottom",
209
+ onClick: moveAllRight,
210
+ icon: {
211
+ icon: "icon-[mdi--chevron-double-right]",
212
+ rtlFlip: true
213
+ },
214
+ disabled: !leftOptions.length
215
+ })]
216
+ })
217
+ }), /*#__PURE__*/jsx("div", {
218
+ className: cn("flex-1 flex flex-col overflow-hidden p-px border-none!", dropRight.isDropTarget && "outline outline-primary-500 rounded-capped!"),
219
+ "data-id": "selected",
220
+ ref: mergeRefs(dropRight.ref, dragRight.ref),
221
+ children: /*#__PURE__*/jsx(List, {
222
+ multiple: true,
223
+ allowClear: true,
224
+ height: height,
225
+ options: rightOptions,
226
+ emptyDisplay: emptyDisplay,
227
+ groupProperty: groupProperty,
228
+ labelProperty: labelProperty,
229
+ placeholder: "Filter",
230
+ decorateStart: /*#__PURE__*/jsx(Icon, {
231
+ icon: "icon-[mdi--filter-variant]",
232
+ className: "ps-2"
233
+ })
234
+ // @ts-expect-error ignore
235
+ ,
236
+ valueProperty: valueProperty,
237
+ searchable: true,
238
+ renderer: renderer,
239
+ onSelect: setRightSelected,
240
+ "data-inner": true,
241
+ "data-hide-selected": true
242
+ })
243
+ })]
137
244
  });
138
- return /*#__PURE__*/jsx(Field, _objectSpread(_objectSpread({}, rest), {}, {
139
- noOutline: true,
140
- plain: true,
141
- children: /*#__PURE__*/jsxs(DndContext, {
142
- modifiers: [restrictToHorizontalAxis],
245
+ }
246
+
247
+ /**
248
+ * DualList component allows users to select items from two lists.
249
+ * It displays two lists side by side, one for unselected items and one for selected items.
250
+ * Users can move items between the lists using buttons or drag-and-drop functionality.
251
+ * It supports multiple selections and provides options for grouping, labeling, and rendering items.
252
+ * It also includes features for handling empty states and custom rendering of items.
253
+ * This component is useful for scenarios where users need to manage selections from a larger set of options, such as in forms or settings.
254
+ */
255
+ function DualList(props) {
256
+ var _useState7 = useState(0),
257
+ _useState8 = _slicedToArray(_useState7, 2),
258
+ dragCount = _useState8[0],
259
+ setDragCount = _useState8[1];
260
+ var _useState9 = useState(function () {
261
+ return [];
262
+ }),
263
+ _useState0 = _slicedToArray(_useState9, 2),
264
+ leftSelected = _useState0[0],
265
+ setLeftSelected = _useState0[1];
266
+ var _useState1 = useState(function () {
267
+ return [];
268
+ }),
269
+ _useState10 = _slicedToArray(_useState1, 2),
270
+ rightSelected = _useState10[0],
271
+ setRightSelected = _useState10[1];
272
+ var dualRef = useRef(null);
273
+ return /*#__PURE__*/jsx(Field, _objectSpread(_objectSpread({}, getWrapperProps(props)), {}, {
274
+ borderless: true,
275
+ children: /*#__PURE__*/jsxs(DragDropProvider, {
276
+ modifiers: [RestrictToHorizontalAxis],
143
277
  onDragStart: function onDragStart(e) {
144
- setDragItems(e.active.id === "selected" ? rightSelected : leftSelected);
278
+ var _e$operation$source;
279
+ setDragCount(((_e$operation$source = e.operation.source) === null || _e$operation$source === void 0 ? void 0 : _e$operation$source.id) === "selected" ? rightSelected.length : leftSelected.length);
145
280
  },
146
281
  onDragEnd: function onDragEnd(e) {
147
- setDragItems([]);
282
+ var _e$operation$source2, _dualRef$current, _e$operation$source3, _dualRef$current2;
283
+ if (((_e$operation$source2 = e.operation.source) === null || _e$operation$source2 === void 0 ? void 0 : _e$operation$source2.id) === "selected") (_dualRef$current = dualRef.current) === null || _dualRef$current === void 0 || _dualRef$current.moveRightSelected();
284
+ if (((_e$operation$source3 = e.operation.source) === null || _e$operation$source3 === void 0 ? void 0 : _e$operation$source3.id) === "unselected") (_dualRef$current2 = dualRef.current) === null || _dualRef$current2 === void 0 || _dualRef$current2.moveLeftSelected();
285
+ setDragCount(0);
148
286
  },
149
- children: [/*#__PURE__*/jsx("div", _objectSpread(_objectSpread(_objectSpread({
150
- className: "flex-1 flex flex-col overflow-hidden p-px",
151
- ref: mergeRefs(dragLeft.setNodeRef, dropLeft.setNodeRef)
152
- }, dragLeft.attributes), dragLeft.listeners), {}, {
153
- children: /*#__PURE__*/jsx(List, {
154
- ref: ref,
155
- multiple: true,
156
- allowClear: true,
157
- name: name,
158
- invalid: invalid,
159
- readOnly: readOnly,
160
- disabled: disabled,
161
- placeholder: placeholder,
162
- autoFocus: autoFocus,
163
- error: error,
164
- height: height,
165
- options: leftOptions,
166
- groupProperty: groupProperty,
167
- labelProperty: labelProperty,
168
- valueProperty: valueProperty,
169
- renderer: renderer,
170
- onSelect: setLeftSelected,
171
- "data-inner": true,
172
- "data-hide-selected": true
173
- })
174
- })), /*#__PURE__*/jsx("div", {
175
- className: "self-center mx-2",
176
- children: /*#__PURE__*/jsxs(ButtonGroup, {
177
- vertical: true,
178
- className: "outline overflow-hidden bg-base",
179
- children: [/*#__PURE__*/jsx(Button, {
180
- rtlFlip: true,
181
- size: "sm",
182
- variant: "link",
183
- "aria-label": "scroll to top",
184
- onClick: moveAllLeft,
185
- icon: CoreIcons.chevronsLeft,
186
- disabled: !rightOptions.length
187
- }), /*#__PURE__*/jsx(Button, {
188
- rtlFlip: true,
189
- size: "sm",
190
- variant: "link",
191
- "aria-label": "scroll up",
192
- onClick: moveRightSelected,
193
- icon: CoreIcons.chevronLeft,
194
- disabled: !rightSelected.length
195
- }), /*#__PURE__*/jsx(Button, {
196
- rtlFlip: true,
197
- size: "sm",
198
- variant: "link",
199
- "aria-label": "scroll down",
200
- onClick: moveLeftSelected,
201
- icon: CoreIcons.chevronRight,
202
- disabled: !leftSelected.length
203
- }), /*#__PURE__*/jsx(Button, {
204
- rtlFlip: true,
205
- size: "sm",
206
- variant: "link",
207
- "aria-label": "scroll to bottom",
208
- onClick: moveAllRight,
209
- icon: CoreIcons.chevronsRight,
210
- disabled: !leftOptions.length
211
- })]
212
- })
213
- }), /*#__PURE__*/jsx("div", {
214
- className: "flex-1 flex flex-col overflow-hidden p-px",
215
- ref: mergeRefs(dropRight.setNodeRef, dragRight.setNodeRef),
216
- children: /*#__PURE__*/jsx(List, {
217
- multiple: true,
218
- allowClear: true,
219
- height: height,
220
- options: rightOptions,
221
- groupProperty: groupProperty,
222
- labelProperty: labelProperty,
223
- valueProperty: valueProperty,
224
- renderer: renderer,
225
- onSelect: setRightSelected,
226
- "data-inner": true,
227
- "data-hide-selected": true
228
- })
229
- }), /*#__PURE__*/jsx(DragOverlay, {
230
- children: dragItems.length > 0 && /*#__PURE__*/jsxs("span", {
231
- children: [dragItems.length, " Item(s)"]
232
- })
287
+ children: [/*#__PURE__*/jsx(DualListComponent, _objectSpread(_objectSpread({}, props), {}, {
288
+ dualRef: dualRef,
289
+ onSelectedChange: function onSelectedChange(l, r) {
290
+ return setLeftSelected(l), setRightSelected(r);
291
+ }
292
+ })), /*#__PURE__*/jsx(DragOverlay, {
293
+ className: "mt-8! w-fit! h-fit!",
294
+ dropAnimation: function dropAnimation(_ref) {
295
+ var _element$parentElemen, _targetRect$left, _targetRect$top;
296
+ var element = _ref.element,
297
+ feedbackElement = _ref.feedbackElement,
298
+ source = _ref.source;
299
+ var target = (_element$parentElemen = element.parentElement) === null || _element$parentElemen === void 0 ? void 0 : _element$parentElemen.querySelector("[data-id=\"".concat(source.id === "selected" ? "unselected" : "selected", "\"]"));
300
+ var overlayRect = element.getBoundingClientRect();
301
+ var targetRect = target === null || target === void 0 ? void 0 : target.getBoundingClientRect();
302
+ var deltaX = ((_targetRect$left = targetRect === null || targetRect === void 0 ? void 0 : targetRect.left) !== null && _targetRect$left !== void 0 ? _targetRect$left : 0) - overlayRect.left;
303
+ var deltaY = ((_targetRect$top = targetRect === null || targetRect === void 0 ? void 0 : targetRect.top) !== null && _targetRect$top !== void 0 ? _targetRect$top : 0) - overlayRect.top;
304
+ feedbackElement.style.setProperty("--dnd-translate", "".concat(deltaX, "px ").concat(deltaY, "px 0"));
305
+ },
306
+ children: function children(evt) {
307
+ if (!evt) return null;
308
+ // Render a clean visual preview without the drag hook styles
309
+ return /*#__PURE__*/jsxs("div", {
310
+ className: "bg-default text-xs outline px-2 py-1 size-fit rounded!",
311
+ children: ["Moving ", dragCount, " item(s)"]
312
+ });
313
+ }
233
314
  })]
234
315
  })
235
316
  }));
236
- };
317
+ }
237
318
 
238
319
  export { DualList };