@react-fabric/form 1.0.0-beta.0

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 (187) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/dist/cjs/builder/FileField.js +131 -0
  4. package/dist/cjs/builder/FormField.js +119 -0
  5. package/dist/cjs/form/Controller.js +64 -0
  6. package/dist/cjs/form/Form.js +128 -0
  7. package/dist/cjs/hooks/useFileUploader.js +204 -0
  8. package/dist/cjs/hooks/useFormBuilder.js +87 -0
  9. package/dist/cjs/i18n/ar.json.js +37 -0
  10. package/dist/cjs/i18n/en.json.js +38 -0
  11. package/dist/cjs/i18n/index.js +33 -0
  12. package/dist/cjs/index.js +56 -0
  13. package/dist/cjs/input/ArrayInput.js +189 -0
  14. package/dist/cjs/input/ArrayInput.module.css +1 -0
  15. package/dist/cjs/input/AvatarInput.js +141 -0
  16. package/dist/cjs/input/Checkbox.js +83 -0
  17. package/dist/cjs/input/ColorInput.js +100 -0
  18. package/dist/cjs/input/ColorPicker.js +122 -0
  19. package/dist/cjs/input/ColorPicker.module.css +1 -0
  20. package/dist/cjs/input/Field.js +31 -0
  21. package/dist/cjs/input/File.js +165 -0
  22. package/dist/cjs/input/File.module.css +1 -0
  23. package/dist/cjs/input/Hidden.js +54 -0
  24. package/dist/cjs/input/Input.js +79 -0
  25. package/dist/cjs/input/Number.js +80 -0
  26. package/dist/cjs/input/Password.js +104 -0
  27. package/dist/cjs/input/Radio.js +70 -0
  28. package/dist/cjs/input/RadioGroup.js +31 -0
  29. package/dist/cjs/input/Range.js +169 -0
  30. package/dist/cjs/input/Search.js +109 -0
  31. package/dist/cjs/input/Slider.js +172 -0
  32. package/dist/cjs/input/Switch.js +79 -0
  33. package/dist/cjs/input/Textarea.js +87 -0
  34. package/dist/cjs/internal/ErrorIcon.js +32 -0
  35. package/dist/cjs/internal/Field.module.css +1 -0
  36. package/dist/cjs/internal/FieldWrapper.js +78 -0
  37. package/dist/cjs/internal/InputWrapper.js +113 -0
  38. package/dist/cjs/ranger/index.js +352 -0
  39. package/dist/cjs/ranger/utils.js +49 -0
  40. package/dist/cjs/select/AutoComplete.js +268 -0
  41. package/dist/cjs/select/DualList.js +238 -0
  42. package/dist/cjs/select/List.js +241 -0
  43. package/dist/cjs/select/Options.js +76 -0
  44. package/dist/cjs/select/Select.js +283 -0
  45. package/dist/cjs/select/helpers.js +41 -0
  46. package/dist/cjs/select/useSelect.js +337 -0
  47. package/dist/cjs/utils/eventHandlers.js +50 -0
  48. package/dist/cjs/utils/getColor.js +40 -0
  49. package/dist/esm/builder/FileField.js +131 -0
  50. package/dist/esm/builder/FormField.js +119 -0
  51. package/dist/esm/form/Controller.js +64 -0
  52. package/dist/esm/form/Form.js +128 -0
  53. package/dist/esm/hooks/useFileUploader.js +204 -0
  54. package/dist/esm/hooks/useFormBuilder.js +87 -0
  55. package/dist/esm/i18n/ar.json.js +31 -0
  56. package/dist/esm/i18n/en.json.js +32 -0
  57. package/dist/esm/i18n/index.js +33 -0
  58. package/dist/esm/index.js +28 -0
  59. package/dist/esm/input/ArrayInput.js +189 -0
  60. package/dist/esm/input/ArrayInput.module.css +1 -0
  61. package/dist/esm/input/AvatarInput.js +141 -0
  62. package/dist/esm/input/Checkbox.js +83 -0
  63. package/dist/esm/input/ColorInput.js +100 -0
  64. package/dist/esm/input/ColorPicker.js +122 -0
  65. package/dist/esm/input/ColorPicker.module.css +1 -0
  66. package/dist/esm/input/Field.js +31 -0
  67. package/dist/esm/input/File.js +165 -0
  68. package/dist/esm/input/File.module.css +1 -0
  69. package/dist/esm/input/Hidden.js +54 -0
  70. package/dist/esm/input/Input.js +79 -0
  71. package/dist/esm/input/Number.js +80 -0
  72. package/dist/esm/input/Password.js +104 -0
  73. package/dist/esm/input/Radio.js +70 -0
  74. package/dist/esm/input/RadioGroup.js +31 -0
  75. package/dist/esm/input/Range.js +169 -0
  76. package/dist/esm/input/Search.js +109 -0
  77. package/dist/esm/input/Slider.js +172 -0
  78. package/dist/esm/input/Switch.js +79 -0
  79. package/dist/esm/input/Textarea.js +87 -0
  80. package/dist/esm/internal/ErrorIcon.js +32 -0
  81. package/dist/esm/internal/Field.module.css +1 -0
  82. package/dist/esm/internal/FieldWrapper.js +78 -0
  83. package/dist/esm/internal/InputWrapper.js +113 -0
  84. package/dist/esm/ranger/index.js +352 -0
  85. package/dist/esm/ranger/utils.js +47 -0
  86. package/dist/esm/select/AutoComplete.js +268 -0
  87. package/dist/esm/select/DualList.js +238 -0
  88. package/dist/esm/select/List.js +241 -0
  89. package/dist/esm/select/Options.js +76 -0
  90. package/dist/esm/select/Select.js +283 -0
  91. package/dist/esm/select/helpers.js +40 -0
  92. package/dist/esm/select/useSelect.js +337 -0
  93. package/dist/esm/utils/eventHandlers.js +50 -0
  94. package/dist/esm/utils/getColor.js +39 -0
  95. package/dist/types/builder/FileField.d.ts +8 -0
  96. package/dist/types/builder/FormField.d.ts +9 -0
  97. package/dist/types/form/Controller.d.ts +20 -0
  98. package/dist/types/form/Form.d.ts +33 -0
  99. package/dist/types/hooks/useFileUploader.d.ts +23 -0
  100. package/dist/types/hooks/useFormBuilder.d.ts +16 -0
  101. package/dist/types/i18n/index.d.ts +1 -0
  102. package/dist/types/index.d.ts +27 -0
  103. package/dist/types/input/ArrayInput.d.ts +64 -0
  104. package/dist/types/input/AvatarInput.d.ts +31 -0
  105. package/dist/types/input/Checkbox.d.ts +46 -0
  106. package/dist/types/input/ColorInput.d.ts +10 -0
  107. package/dist/types/input/ColorPicker.d.ts +24 -0
  108. package/dist/types/input/Field.d.ts +41 -0
  109. package/dist/types/input/File.d.ts +17 -0
  110. package/dist/types/input/Hidden.d.ts +16 -0
  111. package/dist/types/input/Input.d.ts +9 -0
  112. package/dist/types/input/Number.d.ts +17 -0
  113. package/dist/types/input/Password.d.ts +13 -0
  114. package/dist/types/input/Radio.d.ts +42 -0
  115. package/dist/types/input/RadioGroup.d.ts +30 -0
  116. package/dist/types/input/Range.d.ts +59 -0
  117. package/dist/types/input/Search.d.ts +17 -0
  118. package/dist/types/input/Slider.d.ts +63 -0
  119. package/dist/types/input/Switch.d.ts +42 -0
  120. package/dist/types/input/Textarea.d.ts +17 -0
  121. package/dist/types/internal/ErrorIcon.d.ts +1 -0
  122. package/dist/types/internal/FieldWrapper.d.ts +1 -0
  123. package/dist/types/internal/InputWrapper.d.ts +1 -0
  124. package/dist/types/ranger/index.d.ts +70 -0
  125. package/dist/types/ranger/utils.d.ts +25 -0
  126. package/dist/types/select/AutoComplete.d.ts +17 -0
  127. package/dist/types/select/DualList.d.ts +38 -0
  128. package/dist/types/select/List.d.ts +4 -0
  129. package/dist/types/select/Options.d.ts +14 -0
  130. package/dist/types/select/Select.d.ts +2 -0
  131. package/dist/types/select/helpers.d.ts +2 -0
  132. package/dist/types/select/useSelect.d.ts +50 -0
  133. package/dist/types/types/index.d.ts +169 -0
  134. package/dist/types/types/schema.d.ts +59 -0
  135. package/dist/types/utils/eventHandlers.d.ts +11 -0
  136. package/dist/types/utils/getColor.d.ts +4 -0
  137. package/dist/types/utils/index.d.ts +2 -0
  138. package/package.json +64 -0
  139. package/src/builder/FileField.tsx +122 -0
  140. package/src/builder/FormField.tsx +161 -0
  141. package/src/form/Controller.tsx +103 -0
  142. package/src/form/Form.tsx +160 -0
  143. package/src/hooks/useFileUploader.ts +234 -0
  144. package/src/hooks/useFormBuilder.tsx +128 -0
  145. package/src/i18n/ar.json +23 -0
  146. package/src/i18n/en.json +24 -0
  147. package/src/i18n/index.ts +28 -0
  148. package/src/index.ts +54 -0
  149. package/src/input/ArrayInput.module.css +41 -0
  150. package/src/input/ArrayInput.tsx +318 -0
  151. package/src/input/AvatarInput.tsx +150 -0
  152. package/src/input/Checkbox.tsx +165 -0
  153. package/src/input/ColorInput.tsx +157 -0
  154. package/src/input/ColorPicker.module.css +51 -0
  155. package/src/input/ColorPicker.tsx +210 -0
  156. package/src/input/Field.tsx +96 -0
  157. package/src/input/File.module.css +42 -0
  158. package/src/input/File.tsx +224 -0
  159. package/src/input/Hidden.tsx +65 -0
  160. package/src/input/Input.tsx +114 -0
  161. package/src/input/Number.tsx +126 -0
  162. package/src/input/Password.tsx +150 -0
  163. package/src/input/Radio.tsx +146 -0
  164. package/src/input/RadioGroup.tsx +75 -0
  165. package/src/input/Range.tsx +276 -0
  166. package/src/input/Search.tsx +160 -0
  167. package/src/input/Slider.tsx +282 -0
  168. package/src/input/Switch.tsx +168 -0
  169. package/src/input/Textarea.tsx +127 -0
  170. package/src/internal/ErrorIcon.tsx +61 -0
  171. package/src/internal/Field.module.css +139 -0
  172. package/src/internal/FieldWrapper.tsx +84 -0
  173. package/src/internal/InputWrapper.tsx +187 -0
  174. package/src/ranger/index.tsx +514 -0
  175. package/src/ranger/utils.ts +48 -0
  176. package/src/select/AutoComplete.tsx +354 -0
  177. package/src/select/DualList.tsx +286 -0
  178. package/src/select/List.tsx +288 -0
  179. package/src/select/Options.tsx +121 -0
  180. package/src/select/Select.tsx +350 -0
  181. package/src/select/helpers.ts +36 -0
  182. package/src/select/useSelect.tsx +413 -0
  183. package/src/types/index.ts +203 -0
  184. package/src/types/schema.ts +100 -0
  185. package/src/utils/eventHandlers.ts +72 -0
  186. package/src/utils/getColor.ts +47 -0
  187. package/src/utils/index.ts +25 -0
@@ -0,0 +1,268 @@
1
+ 'use client';
2
+
3
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
5
+ import { useFloating, autoUpdate, shift, flip, offset, useDismiss, useListNavigation, useTypeahead, useInteractions, FloatingPortal, FloatingFocusManager } from '@floating-ui/react';
6
+ import { Chip, Icon, CoreIcons } from '@react-fabric/core';
7
+ import { isArray, isEmpty } from '@react-fabric/utilities';
8
+ import classNames from 'classnames';
9
+ import { useRef, useId, useMemo, useCallback, useLayoutEffect } from 'react';
10
+ import { InputWrapper } from '../internal/InputWrapper.js';
11
+ import { Options } from './Options.js';
12
+ import { useSelect } from './useSelect.js';
13
+ import { jsx, jsxs } from 'react/jsx-runtime';
14
+
15
+ var _excluded = ["ref", "name", "value", "invalid", "readOnly", "disabled", "required", "placeholder", "autoFocus", "expandOnEdit", "error", "history", "multiple", "onChange", "onSelect", "onInput", "onFocus", "onBlur", "onEnterPressed"];
16
+ 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; }
17
+ 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; }
18
+ var AutoComplete = function AutoComplete(_ref) {
19
+ var _refs$reference$curre;
20
+ _ref.ref;
21
+ var name = _ref.name,
22
+ value = _ref.value,
23
+ invalid = _ref.invalid,
24
+ readOnly = _ref.readOnly,
25
+ disabled = _ref.disabled,
26
+ required = _ref.required,
27
+ placeholder = _ref.placeholder;
28
+ _ref.autoFocus;
29
+ var expandOnEdit = _ref.expandOnEdit,
30
+ error = _ref.error,
31
+ history = _ref.history,
32
+ multiple = _ref.multiple,
33
+ onChange = _ref.onChange,
34
+ onSelect = _ref.onSelect,
35
+ onInput = _ref.onInput,
36
+ onFocus = _ref.onFocus,
37
+ _onBlur = _ref.onBlur,
38
+ onEnterPressed = _ref.onEnterPressed,
39
+ rest = _objectWithoutProperties(_ref, _excluded);
40
+ var options = useRef(history);
41
+ var submitRef = useRef(null);
42
+ var _useSelect = useSelect({
43
+ value: value,
44
+ autoComplete: true,
45
+ options: options.current,
46
+ multiple: multiple,
47
+ onChange: onChange,
48
+ onSelect: onSelect
49
+ }),
50
+ state = _useSelect.state,
51
+ listRef = _useSelect.listRef,
52
+ listContentRef = _useSelect.listContentRef,
53
+ setOpen = _useSelect.setOpen,
54
+ macthOption = _useSelect.macthOption,
55
+ handleChange = _useSelect.handleChange,
56
+ handleRemove = _useSelect.handleRemove,
57
+ handleQuery = _useSelect.handleQuery,
58
+ setItemRef = _useSelect.setItemRef,
59
+ setActiveIndex = _useSelect.setActiveIndex;
60
+ var dropdownKey = useId();
61
+ var _useFloating = useFloating({
62
+ open: state.open,
63
+ onOpenChange: function onOpenChange(open, evt, reason) {
64
+ !open && (listRef.current = []);
65
+ setOpen(open);
66
+ },
67
+ strategy: "fixed",
68
+ placement: "bottom",
69
+ whileElementsMounted: autoUpdate,
70
+ middleware: [shift({
71
+ padding: 8
72
+ }), flip(), offset(2)]
73
+ }),
74
+ context = _useFloating.context,
75
+ floatingStyles = _useFloating.floatingStyles,
76
+ refs = _useFloating.refs;
77
+
78
+ // floating interactions
79
+ var dismiss = useDismiss(context, {
80
+ // referencePress: true,
81
+ });
82
+ var navigation = useListNavigation(context, {
83
+ listRef: listRef,
84
+ activeIndex: state.activeIndex,
85
+ selectedIndex: state.selectedIndex,
86
+ loop: true,
87
+ virtual: true,
88
+ focusItemOnOpen: false,
89
+ onNavigate: setActiveIndex
90
+ });
91
+ var typeahead = useTypeahead(context, {
92
+ listRef: listContentRef,
93
+ activeIndex: state.activeIndex,
94
+ selectedIndex: state.selectedIndex,
95
+ findMatch: function findMatch(list, typedString) {
96
+ return list.find(function (item) {
97
+ return macthOption(item, typedString);
98
+ });
99
+ },
100
+ onMatch: function onMatch(index) {
101
+ state.open && setActiveIndex(index);
102
+ }
103
+ });
104
+ var _useInteractions = useInteractions([dismiss, navigation, typeahead]),
105
+ getReferenceProps = _useInteractions.getReferenceProps,
106
+ getFloatingProps = _useInteractions.getFloatingProps,
107
+ getItemProps = _useInteractions.getItemProps;
108
+ var referenceProps = useMemo(function () {
109
+ var props = getReferenceProps();
110
+ return _objectSpread(_objectSpread({}, props), {}, {
111
+ onFocus: onFocus,
112
+ onBlur: function onBlur(evt) {
113
+ var _evt$relatedTarget;
114
+ if ((_evt$relatedTarget = evt.relatedTarget) !== null && _evt$relatedTarget !== void 0 && _evt$relatedTarget.closest("[data-select-dropdown=\"".concat(dropdownKey, "\"]"))) {
115
+ var _refs$domReference$cu;
116
+ (_refs$domReference$cu = refs.domReference.current) === null || _refs$domReference$cu === void 0 || (_refs$domReference$cu = _refs$domReference$cu.querySelector("input")) === null || _refs$domReference$cu === void 0 || _refs$domReference$cu.focus();
117
+ return;
118
+ }
119
+ state.open && handleChange(state.query);
120
+ handleQuery("");
121
+ setOpen(false);
122
+ _onBlur === null || _onBlur === void 0 || _onBlur(evt);
123
+ },
124
+ onKeyDown: function onKeyDown(evt) {
125
+ if (evt.key === "Enter") {
126
+ evt.preventDefault();
127
+ if (state.activeIndex !== null) {
128
+ handleChange(listContentRef.current[state.activeIndex]);
129
+ evt.stopPropagation();
130
+ return false;
131
+ } else if (state.query !== undefined) {
132
+ handleChange("");
133
+ return false;
134
+ } else {
135
+ var _submitRef$current;
136
+ onEnterPressed === null || onEnterPressed === void 0 || onEnterPressed(evt);
137
+ (_submitRef$current = submitRef.current) === null || _submitRef$current === void 0 || _submitRef$current.click();
138
+ }
139
+ } else if (evt.key === "Backspace") {
140
+ !state.query && multiple && handleRemove();
141
+ } else if (["ArrowUp", "ArrowDown"].includes(evt.key)) {
142
+ if (["ArrowUp", "ArrowDown"].includes(evt.key) && state.activeIndex === null) {
143
+ setActiveIndex(state.selectedIndex);
144
+ }
145
+ setTimeout(function () {
146
+ var _props$onKeyDown;
147
+ (_props$onKeyDown = props.onKeyDown) === null || _props$onKeyDown === void 0 || _props$onKeyDown.call(props, evt);
148
+ }, 50);
149
+ }
150
+ }
151
+ });
152
+ }, [getReferenceProps, onEnterPressed, handleQuery, onFocus, _onBlur, multiple, refs, state.query, state.activeIndex]);
153
+ var floatingProps = useMemo(function () {
154
+ return getFloatingProps({
155
+ "data-select-dropdown": dropdownKey
156
+ });
157
+ }, [getFloatingProps]);
158
+ var makeItemProps = useCallback(function (item) {
159
+ var _state$value, _state$value$includes;
160
+ var selected = isArray(state.value) ? (_state$value = state.value) === null || _state$value === void 0 || (_state$value$includes = _state$value.includes) === null || _state$value$includes === void 0 ? void 0 : _state$value$includes.call(_state$value, item) : state.value === item;
161
+ return getItemProps({
162
+ "data-selected": selected ? true : undefined,
163
+ onClick: function onClick() {
164
+ handleChange(item);
165
+ }
166
+ });
167
+ }, [getItemProps, handleChange, state.value]);
168
+ var displayValue = useMemo(function () {
169
+ if (isArray(state.value)) {
170
+ return state.value.map(function (item, index) {
171
+ return /*#__PURE__*/jsx(Chip, {
172
+ onRemove: function onRemove() {
173
+ return handleRemove(index);
174
+ },
175
+ children: item
176
+ }, index);
177
+ });
178
+ }
179
+ }, [state.value, state.query, placeholder]);
180
+ useLayoutEffect(function () {
181
+ state.open && setTimeout(function () {
182
+ var _listRef$current$stat;
183
+ state.selectedIndex && ((_listRef$current$stat = listRef.current[state.selectedIndex]) === null || _listRef$current$stat === void 0 ? void 0 : _listRef$current$stat.scrollIntoView({
184
+ block: "center"
185
+ }));
186
+ }, 100);
187
+ }, [state.open]);
188
+ var inputValue = useMemo(function () {
189
+ var _state$query, _ref2, _state$query2;
190
+ if (multiple) return (_state$query = state.query) !== null && _state$query !== void 0 ? _state$query : "";
191
+ return (_ref2 = (_state$query2 = state.query) !== null && _state$query2 !== void 0 ? _state$query2 : state.value) !== null && _ref2 !== void 0 ? _ref2 : "";
192
+ }, [multiple, state.query, state.value]);
193
+ return /*#__PURE__*/jsxs(InputWrapper, _objectSpread(_objectSpread({
194
+ showClear: !isEmpty(state.value),
195
+ onClear: handleChange,
196
+ invalid: invalid,
197
+ readOnly: readOnly,
198
+ disabled: disabled,
199
+ required: required,
200
+ error: error,
201
+ wrapperRef: refs.setReference,
202
+ className: !multiple && expandOnEdit && state.open ? "!z-[99]" : "",
203
+ floatingExpand: !multiple && expandOnEdit && state.open
204
+ }, rest), {}, {
205
+ children: [/*#__PURE__*/jsxs("div", {
206
+ role: "none",
207
+ "data-select-display": "true",
208
+ className: classNames("group flex-1 py-1 px-2 truncate text-start flex gap-1 relative min-h-5 justify-start", multiple ? "flex-wrap" : "flex-nowrap overflow-hidden"),
209
+ onMouseUp: function onMouseUp(e) {
210
+ var _e$currentTarget$quer;
211
+ return (_e$currentTarget$quer = e.currentTarget.querySelector("input")) === null || _e$currentTarget$quer === void 0 ? void 0 : _e$currentTarget$quer.focus();
212
+ },
213
+ children: [displayValue, /*#__PURE__*/jsx("textarea", _objectSpread(_objectSpread({
214
+ readOnly: readOnly,
215
+ disabled: disabled,
216
+ value: inputValue,
217
+ "aria-invalid": invalid,
218
+ "data-testid": name,
219
+ name: name,
220
+ size: 1,
221
+ onInput: onInput,
222
+ rows: !multiple && expandOnEdit && state.open ? 5 : 1,
223
+ className: classNames("appearance-none bg-transparent outline-none border-none ring-0 flex-1 resize-none", disabled && "cursor-not-allowed pointer-events-none", multiple && "min-w-24 overflow-hidden", !state.open && "overflow-hidden whitespace-nowrap"),
224
+ placeholder: isEmpty(state.value) ? placeholder : ""
225
+ }, referenceProps), {}, {
226
+ onChange: function onChange(evt) {
227
+ return handleQuery(evt.target.value);
228
+ }
229
+ })), /*#__PURE__*/jsx("button", {
230
+ type: "submit",
231
+ ref: submitRef,
232
+ tabIndex: -1,
233
+ className: "opacity-0 absolute"
234
+ })]
235
+ }), state.loading && /*#__PURE__*/jsx(Icon, {
236
+ animate: "spin",
237
+ className: classNames("flex-content p-2 z-0 order-9 text-muted pointer-events-none"),
238
+ icon: CoreIcons.spinner
239
+ }), state.open && !state.loading && /*#__PURE__*/jsx(FloatingPortal, {
240
+ children: /*#__PURE__*/jsx(FloatingFocusManager, {
241
+ context: context,
242
+ initialFocus: -1,
243
+ visuallyHiddenDismiss: true,
244
+ children: /*#__PURE__*/jsx(Options, _objectSpread(_objectSpread({
245
+ ref: refs.setFloating,
246
+ className: "outline shadow-lg max-h-[40vh] z-[var(--z-popover)]",
247
+ style: _objectSpread({
248
+ width: (_refs$reference$curre = refs.reference.current) === null || _refs$reference$curre === void 0 ? void 0 : _refs$reference$curre.getBoundingClientRect().width
249
+ }, floatingStyles)
250
+ }, floatingProps), {}, {
251
+ items: state.items,
252
+ active: state.activeIndex,
253
+ itemRef: setItemRef,
254
+ itemProps: makeItemProps,
255
+ empty: /*#__PURE__*/jsx("div", {
256
+ className: "text-muted text-sm px-2 py-1",
257
+ children: "No history available"
258
+ }),
259
+ children: function children(item) {
260
+ return item;
261
+ }
262
+ }))
263
+ })
264
+ })]
265
+ }));
266
+ };
267
+
268
+ export { AutoComplete };
@@ -0,0 +1,238 @@
1
+ 'use client';
2
+
3
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
4
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
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';
9
+ import { Field } from '../input/Field.js';
10
+ 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
+
16
+ var _excluded = ["ref", "value", "options", "groupProperty", "height", "labelProperty", "valueProperty", "renderer", "onChange", "name", "invalid", "readOnly", "disabled", "placeholder", "autoFocus", "error"];
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([]),
41
+ _useState2 = _slicedToArray(_useState, 2),
42
+ actualValue = _useState2[0],
43
+ setActualValue = _useState2[1];
44
+ var _useState3 = useState([]),
45
+ _useState4 = _slicedToArray(_useState3, 2),
46
+ leftSelected = _useState4[0],
47
+ setLeftSelected = _useState4[1];
48
+ var _useState5 = useState([]),
49
+ _useState6 = _slicedToArray(_useState5, 2),
50
+ rightSelected = _useState6[0],
51
+ setRightSelected = _useState6[1];
52
+ var deferred = useDeferredValue(value);
53
+ useEffect(function () {
54
+ setActualValue(options.filter(function (opt) {
55
+ var _opt$valueProperty;
56
+ return deferred === null || deferred === void 0 ? void 0 : deferred.includes((_opt$valueProperty = opt[valueProperty]) !== null && _opt$valueProperty !== void 0 ? _opt$valueProperty : opt);
57
+ }));
58
+ }, [deferred, options]);
59
+ var _useMemo = useMemo(function () {
60
+ return [options.filter(function (opt) {
61
+ return !(actualValue !== null && actualValue !== void 0 && actualValue.includes(opt));
62
+ }), actualValue];
63
+ }, [options, actualValue]),
64
+ _useMemo2 = _slicedToArray(_useMemo, 2),
65
+ leftOptions = _useMemo2[0],
66
+ rightOptions = _useMemo2[1];
67
+ var moveAllLeft = useCallback(function () {
68
+ setLeftSelected([]);
69
+ setRightSelected([]);
70
+ setActualValue([]);
71
+ onChange === null || onChange === void 0 || onChange([]);
72
+ }, [onChange]);
73
+ var moveAllRight = useCallback(function () {
74
+ setLeftSelected([]);
75
+ setRightSelected([]);
76
+ setActualValue(options);
77
+ onChange === null || onChange === void 0 || onChange(options.map(function (opt) {
78
+ var _opt$valueProperty2;
79
+ return "".concat((_opt$valueProperty2 = opt[valueProperty]) !== null && _opt$valueProperty2 !== void 0 ? _opt$valueProperty2 : opt);
80
+ }));
81
+ }, [onChange, options, valueProperty]);
82
+ var moveLeftSelected = useCallback(function () {
83
+ var selected = [].concat(_toConsumableArray(actualValue), _toConsumableArray(leftSelected));
84
+ setActualValue(selected);
85
+ onChange === null || onChange === void 0 || onChange(selected.map(function (opt) {
86
+ var _opt$valueProperty3;
87
+ return "".concat((_opt$valueProperty3 = opt[valueProperty]) !== null && _opt$valueProperty3 !== void 0 ? _opt$valueProperty3 : opt);
88
+ }));
89
+ setLeftSelected([]);
90
+ }, [onChange, leftSelected, actualValue]);
91
+ var moveRightSelected = useCallback(function () {
92
+ var selected = actualValue.filter(function (opt) {
93
+ return !rightSelected.includes(opt);
94
+ });
95
+ setActualValue(selected);
96
+ onChange === null || onChange === void 0 || onChange(selected.map(function (opt) {
97
+ var _opt$valueProperty4;
98
+ return "".concat((_opt$valueProperty4 = opt[valueProperty]) !== null && _opt$valueProperty4 !== void 0 ? _opt$valueProperty4 : opt);
99
+ }));
100
+ setRightSelected([]);
101
+ }, [onChange, rightSelected, actualValue]);
102
+ var _useState7 = useState([]),
103
+ _useState8 = _slicedToArray(_useState7, 2),
104
+ dragItems = _useState8[0],
105
+ setDragItems = _useState8[1];
106
+ var dragLeft = useDraggable({
107
+ id: "unselected",
108
+ disabled: !leftSelected.length,
109
+ data: {
110
+ supports: ["selected"]
111
+ },
112
+ attributes: {
113
+ role: "none"
114
+ }
115
+ });
116
+ var dragRight = useDraggable({
117
+ id: "selected",
118
+ disabled: !rightSelected.length,
119
+ data: {
120
+ supports: ["unselected"]
121
+ },
122
+ attributes: {
123
+ role: "none"
124
+ }
125
+ });
126
+ var dropLeft = useDroppable({
127
+ id: "unselected",
128
+ data: {
129
+ accepts: ["selected"]
130
+ }
131
+ });
132
+ var dropRight = useDroppable({
133
+ id: "selected",
134
+ data: {
135
+ accepts: ["unselected"]
136
+ }
137
+ });
138
+ return /*#__PURE__*/jsx(Field, _objectSpread(_objectSpread({}, rest), {}, {
139
+ noOutline: true,
140
+ plain: true,
141
+ children: /*#__PURE__*/jsxs(DndContext, {
142
+ modifiers: [restrictToHorizontalAxis],
143
+ onDragStart: function onDragStart(e) {
144
+ setDragItems(e.active.id === "selected" ? rightSelected : leftSelected);
145
+ },
146
+ onDragEnd: function onDragEnd(e) {
147
+ setDragItems([]);
148
+ },
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
+ })
233
+ })]
234
+ })
235
+ }));
236
+ };
237
+
238
+ export { DualList };