@oneplatformdev/ui 0.1.99-beta.26 → 0.1.99-beta.260

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 (240) hide show
  1. package/Accordion/Accordion.d.ts +1 -1
  2. package/Accordion/Accordion.d.ts.map +1 -1
  3. package/Accordion/Accordion.js +48 -26
  4. package/Accordion/Accordion.js.map +1 -1
  5. package/AlertDialog/AlertDialog.stories.js +67 -23
  6. package/AlertDialog/AlertDialog.stories.js.map +1 -1
  7. package/AlertDialog/AlertDialogRoot.d.ts.map +1 -1
  8. package/AlertDialog/AlertDialogRoot.js +20 -18
  9. package/AlertDialog/AlertDialogRoot.js.map +1 -1
  10. package/Button/Button.d.ts.map +1 -1
  11. package/Button/Button.js +43 -43
  12. package/Button/Button.js.map +1 -1
  13. package/Button/Button.stories.js +15 -12
  14. package/Button/Button.stories.js.map +1 -1
  15. package/Button/Button.utils.d.ts +3 -0
  16. package/Button/Button.utils.d.ts.map +1 -0
  17. package/Button/Button.utils.js +14 -0
  18. package/Button/Button.utils.js.map +1 -0
  19. package/Button/buttonVariants.d.ts +2 -2
  20. package/Button/buttonVariants.d.ts.map +1 -1
  21. package/Button/buttonVariants.js +38 -6
  22. package/Button/buttonVariants.js.map +1 -1
  23. package/Button/index.d.ts +1 -0
  24. package/Button/index.d.ts.map +1 -1
  25. package/Button/index.js +8 -6
  26. package/Button/index.js.map +1 -1
  27. package/ButtonIcon/ButtonIcon.d.ts.map +1 -1
  28. package/ButtonIcon/ButtonIcon.js +41 -39
  29. package/ButtonIcon/ButtonIcon.js.map +1 -1
  30. package/ButtonIcon/ButtonIcon.stories.js +35 -33
  31. package/ButtonIcon/ButtonIcon.stories.js.map +1 -1
  32. package/ButtonIcon/buttonIconVariants.d.ts +1 -1
  33. package/ButtonIcon/buttonIconVariants.d.ts.map +1 -1
  34. package/ButtonIcon/buttonIconVariants.js +3 -2
  35. package/ButtonIcon/buttonIconVariants.js.map +1 -1
  36. package/CHANGELOG.md +1503 -0
  37. package/Calendar/Calendar.js +5 -4
  38. package/Calendar/Calendar.js.map +1 -1
  39. package/Card/Card.d.ts.map +1 -1
  40. package/Card/Card.js +22 -21
  41. package/Card/Card.js.map +1 -1
  42. package/Checkbox/Checkbox.d.ts.map +1 -1
  43. package/Checkbox/Checkbox.js +36 -34
  44. package/Checkbox/Checkbox.js.map +1 -1
  45. package/Checkbox/Checkbox.stories.js +108 -0
  46. package/Checkbox/Checkbox.stories.js.map +1 -0
  47. package/Checkbox/Checkbox.types.d.ts +2 -1
  48. package/Checkbox/Checkbox.types.d.ts.map +1 -1
  49. package/Combobox/Combobox.d.ts +4 -2
  50. package/Combobox/Combobox.d.ts.map +1 -1
  51. package/Combobox/Combobox.js +222 -194
  52. package/Combobox/Combobox.js.map +1 -1
  53. package/Combobox/Combobox.stories.js +231 -85
  54. package/Combobox/Combobox.stories.js.map +1 -1
  55. package/Combobox/Combobox.types.d.ts +88 -24
  56. package/Combobox/Combobox.types.d.ts.map +1 -1
  57. package/Combobox/Combobox.types.js +4 -1
  58. package/Combobox/Combobox.types.js.map +1 -1
  59. package/Combobox/ComboboxOptionItem.d.ts +5 -3
  60. package/Combobox/ComboboxOptionItem.d.ts.map +1 -1
  61. package/Combobox/ComboboxOptionItem.js +81 -23
  62. package/Combobox/ComboboxOptionItem.js.map +1 -1
  63. package/Combobox/ComboboxRenderContent.d.ts +28 -0
  64. package/Combobox/ComboboxRenderContent.d.ts.map +1 -0
  65. package/Combobox/ComboboxRenderContent.js +143 -0
  66. package/Combobox/ComboboxRenderContent.js.map +1 -0
  67. package/Combobox/ComboboxRenderOptions.d.ts +4 -0
  68. package/Combobox/ComboboxRenderOptions.d.ts.map +1 -0
  69. package/Combobox/ComboboxRenderOptions.js +53 -0
  70. package/Combobox/ComboboxRenderOptions.js.map +1 -0
  71. package/Combobox/ComboboxRenderTrigger.d.ts +18 -0
  72. package/Combobox/ComboboxRenderTrigger.d.ts.map +1 -0
  73. package/Combobox/ComboboxRenderTrigger.js +120 -0
  74. package/Combobox/ComboboxRenderTrigger.js.map +1 -0
  75. package/Command/Command.d.ts +6 -1
  76. package/Command/Command.d.ts.map +1 -1
  77. package/Command/Command.js +61 -43
  78. package/Command/Command.js.map +1 -1
  79. package/ContextPopover/ContextDropdownMenu.d.ts +12 -0
  80. package/ContextPopover/ContextDropdownMenu.d.ts.map +1 -0
  81. package/ContextPopover/ContextDropdownMenu.js +41 -0
  82. package/ContextPopover/ContextDropdownMenu.js.map +1 -0
  83. package/ContextPopover/ContextPopover.d.ts +12 -0
  84. package/ContextPopover/ContextPopover.d.ts.map +1 -0
  85. package/ContextPopover/ContextPopover.js +34 -0
  86. package/ContextPopover/ContextPopover.js.map +1 -0
  87. package/ContextPopover/index.d.ts +4 -0
  88. package/ContextPopover/index.d.ts.map +1 -0
  89. package/ContextPopover/index.js +9 -0
  90. package/ContextPopover/index.js.map +1 -0
  91. package/ContextPopover/useContextPopoverHandler.d.ts +14 -0
  92. package/ContextPopover/useContextPopoverHandler.d.ts.map +1 -0
  93. package/ContextPopover/useContextPopoverHandler.js +21 -0
  94. package/ContextPopover/useContextPopoverHandler.js.map +1 -0
  95. package/DataTable/DataTable.js +16 -15
  96. package/DataTable/DataTable.js.map +1 -1
  97. package/Dialog/Dialog.d.ts +4 -1
  98. package/Dialog/Dialog.d.ts.map +1 -1
  99. package/Dialog/Dialog.js +83 -40
  100. package/Dialog/Dialog.js.map +1 -1
  101. package/Dialog/Dialog.stories.js +109 -0
  102. package/Dialog/Dialog.stories.js.map +1 -0
  103. package/Dialog/Dialog.types.d.ts +4 -0
  104. package/Dialog/Dialog.types.d.ts.map +1 -0
  105. package/Dialog/Dialog.types.js +2 -0
  106. package/Dialog/Dialog.types.js.map +1 -0
  107. package/Dialog/index.d.ts +1 -0
  108. package/Dialog/index.d.ts.map +1 -1
  109. package/Dialog/useDialogClosePosition.d.ts +11 -0
  110. package/Dialog/useDialogClosePosition.d.ts.map +1 -0
  111. package/Dialog/useDialogClosePosition.js +50 -0
  112. package/Dialog/useDialogClosePosition.js.map +1 -0
  113. package/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  114. package/DropdownMenu/DropdownMenu.js +33 -20
  115. package/DropdownMenu/DropdownMenu.js.map +1 -1
  116. package/Dropzone/Dropzone.d.ts.map +1 -1
  117. package/Dropzone/Dropzone.js +46 -28
  118. package/Dropzone/Dropzone.js.map +1 -1
  119. package/Dropzone/Dropzone.stories.js +100 -0
  120. package/Dropzone/Dropzone.stories.js.map +1 -0
  121. package/Dropzone/Dropzone.types.js +6 -6
  122. package/Dropzone/Dropzone.types.js.map +1 -1
  123. package/Form/FormRenderControl.d.ts +1 -1
  124. package/Form/FormRenderControl.d.ts.map +1 -1
  125. package/Form/FormRenderControl.js +55 -14
  126. package/Form/FormRenderControl.js.map +1 -1
  127. package/Form/FormRenderControl.types.d.ts +6 -2
  128. package/Form/FormRenderControl.types.d.ts.map +1 -1
  129. package/FormCombobox/FormCombobox.d.ts +4 -2
  130. package/FormCombobox/FormCombobox.d.ts.map +1 -1
  131. package/FormCombobox/FormCombobox.js +30 -17
  132. package/FormCombobox/FormCombobox.js.map +1 -1
  133. package/FormCombobox/FormCombobox.types.d.ts +6 -2
  134. package/FormCombobox/FormCombobox.types.d.ts.map +1 -1
  135. package/FormDatePicker/FormDatePicker.d.ts.map +1 -1
  136. package/FormDatePicker/FormDatePicker.js +18 -16
  137. package/FormDatePicker/FormDatePicker.js.map +1 -1
  138. package/FormDropzone/FormDropzone.d.ts.map +1 -1
  139. package/FormDropzone/FormDropzone.js +11 -9
  140. package/FormDropzone/FormDropzone.js.map +1 -1
  141. package/FormInput/FormInput.d.ts.map +1 -1
  142. package/FormInput/FormInput.js +47 -27
  143. package/FormInput/FormInput.js.map +1 -1
  144. package/FormInput/FormInput.stories.js +61 -0
  145. package/FormInput/FormInput.stories.js.map +1 -0
  146. package/FormInput/FormInput.types.d.ts +1 -0
  147. package/FormInput/FormInput.types.d.ts.map +1 -1
  148. package/FormSelect/FormSelect.d.ts.map +1 -1
  149. package/FormSelect/FormSelect.js +21 -17
  150. package/FormSelect/FormSelect.js.map +1 -1
  151. package/FormTextarea/FormTextarea.d.ts.map +1 -1
  152. package/FormTextarea/FormTextarea.js +15 -12
  153. package/FormTextarea/FormTextarea.js.map +1 -1
  154. package/InfoBlock/InfoBlock.d.ts +7 -0
  155. package/InfoBlock/InfoBlock.d.ts.map +1 -0
  156. package/InfoBlock/InfoBlock.js +28 -0
  157. package/InfoBlock/InfoBlock.js.map +1 -0
  158. package/InfoBlock/InfoBlock.stories.js +50 -0
  159. package/InfoBlock/InfoBlock.stories.js.map +1 -0
  160. package/InfoBlock/InfoBlock.types.d.ts +9 -0
  161. package/InfoBlock/InfoBlock.types.d.ts.map +1 -0
  162. package/InfoBlock/InfoBlock.types.js +2 -0
  163. package/InfoBlock/InfoBlock.types.js.map +1 -0
  164. package/InfoBlock/index.d.ts +3 -0
  165. package/InfoBlock/index.d.ts.map +1 -0
  166. package/InfoBlock/index.js +5 -0
  167. package/InfoBlock/index.js.map +1 -0
  168. package/InfoBlock/infoBlockVariants.d.ts +6 -0
  169. package/InfoBlock/infoBlockVariants.d.ts.map +1 -0
  170. package/InfoBlock/infoBlockVariants.js +27 -0
  171. package/InfoBlock/infoBlockVariants.js.map +1 -0
  172. package/Input/Input.d.ts.map +1 -1
  173. package/Input/Input.js +65 -51
  174. package/Input/Input.js.map +1 -1
  175. package/Input/Input.stories.js +154 -0
  176. package/Input/Input.stories.js.map +1 -0
  177. package/Input/Input.types.d.ts +1 -0
  178. package/Input/Input.types.d.ts.map +1 -1
  179. package/LoadingMask/LoadingMask.d.ts +1 -2
  180. package/LoadingMask/LoadingMask.d.ts.map +1 -1
  181. package/LoadingMask/LoadingMask.js +8 -8
  182. package/LoadingMask/LoadingMask.js.map +1 -1
  183. package/LoadingMask/LoadingMask.types.d.ts +1 -0
  184. package/LoadingMask/LoadingMask.types.d.ts.map +1 -1
  185. package/Popover/Popover.d.ts +3 -1
  186. package/Popover/Popover.d.ts.map +1 -1
  187. package/Popover/Popover.js +15 -10
  188. package/Popover/Popover.js.map +1 -1
  189. package/ScrollArea/ScrollArea.d.ts +5 -1
  190. package/ScrollArea/ScrollArea.d.ts.map +1 -1
  191. package/ScrollArea/ScrollArea.js +23 -17
  192. package/ScrollArea/ScrollArea.js.map +1 -1
  193. package/Search/Search.d.ts.map +1 -1
  194. package/Search/Search.js +40 -31
  195. package/Search/Search.js.map +1 -1
  196. package/Select/Select.d.ts.map +1 -1
  197. package/Select/Select.js +53 -48
  198. package/Select/Select.js.map +1 -1
  199. package/Select/Select.types.d.ts +4 -0
  200. package/Select/Select.types.d.ts.map +1 -1
  201. package/Select/SelectRoot.js +6 -6
  202. package/Select/SelectRoot.js.map +1 -1
  203. package/Switch/Switch.d.ts +1 -1
  204. package/Switch/Switch.d.ts.map +1 -1
  205. package/Switch/Switch.js +19 -9
  206. package/Switch/Switch.js.map +1 -1
  207. package/Switch/Switch.stories.js +62 -0
  208. package/Switch/Switch.stories.js.map +1 -0
  209. package/TablePagination/TablePagination.js +9 -8
  210. package/TablePagination/TablePagination.js.map +1 -1
  211. package/Textarea/Textarea.d.ts.map +1 -1
  212. package/Textarea/Textarea.js +50 -45
  213. package/Textarea/Textarea.js.map +1 -1
  214. package/Textarea/Textarea.types.d.ts +3 -1
  215. package/Textarea/Textarea.types.d.ts.map +1 -1
  216. package/Toast/Toast.d.ts +1 -1
  217. package/Toast/toastVariants.d.ts +1 -1
  218. package/Tooltip/QuestionMarkIcon.svg.js +6 -0
  219. package/Tooltip/QuestionMarkIcon.svg.js.map +1 -0
  220. package/Tooltip/Tooltip.d.ts.map +1 -1
  221. package/Tooltip/Tooltip.js +52 -32
  222. package/Tooltip/Tooltip.js.map +1 -1
  223. package/Tooltip/Tooltip.types.d.ts +10 -0
  224. package/Tooltip/Tooltip.types.d.ts.map +1 -1
  225. package/Tooltip/tooltipVariants.d.ts +4 -0
  226. package/Tooltip/tooltipVariants.d.ts.map +1 -0
  227. package/Tooltip/tooltipVariants.js +23 -0
  228. package/Tooltip/tooltipVariants.js.map +1 -0
  229. package/index.d.ts +2 -0
  230. package/index.d.ts.map +1 -1
  231. package/index.js +342 -332
  232. package/index.js.map +1 -1
  233. package/package.json +7 -5
  234. package/vite-env.d.js +2 -0
  235. package/vite-env.d.js.map +1 -0
  236. package/vite-env.d.ts +7 -0
  237. package/Combobox/ComboboxOptions.d.ts +0 -4
  238. package/Combobox/ComboboxOptions.d.ts.map +0 -1
  239. package/Combobox/ComboboxOptions.js +0 -65
  240. package/Combobox/ComboboxOptions.js.map +0 -1
@@ -1,202 +1,230 @@
1
- import { jsx as e, jsxs as d, Fragment as j } from "react/jsx-runtime";
2
- import { forwardRef as oe, useState as s, useCallback as p, useEffect as re, useMemo as M, useLayoutEffect as ae } from "react";
3
- import { LoadingMask as V } from "../LoadingMask/LoadingMask.js";
4
- import "../LoadingMask/RenderLoadingMask.js";
5
- import { Popover as ie, PopoverTrigger as se, PopoverContent as le } from "../Popover/Popover.js";
6
- import { Button as ce } from "../Button/Button.js";
7
- import "../Button/buttonVariants.js";
8
- import { Command as de, CommandInput as pe, CommandList as me, CommandGroup as fe, CommandEmpty as X, CommandItem as ue } from "../Command/Command.js";
9
- import { cn as R } from "@oneplatformdev/utils";
10
- import { useDebounceCallback as he } from "@oneplatformdev/hooks";
11
- import { X as ge, ChevronsUpDown as be } from "lucide-react";
12
- import { ComboboxOptions as ye } from "./ComboboxOptions.js";
13
- const ve = (S) => {
14
- const { value: m, flattenOptions: n = [], selectedOption: L } = S;
15
- if (!m) return "No value for render label";
16
- const v = [n.find((f) => String(f.value).toLowerCase() === String(m).toLowerCase()), L].filter(Boolean).map((f) => f.label).find(Boolean);
17
- return v || m;
18
- }, Ee = oe(
19
- (S, m) => {
20
- const {
21
- value: n,
22
- onChange: L,
23
- placeholder: T,
24
- disabled: v,
25
- searchLabel: f = "Type to search...",
26
- fetchOptions: _,
27
- options: N,
28
- emptyLabel: A = "No options",
29
- emptyAction: C,
30
- commandInputAction: I,
31
- listHeadAction: w,
32
- onMount: k
33
- } = S, [F, G] = s(!1), [l, B] = s(!1), [a, P] = s(""), [u, D] = s(), [o, c] = s(!1), [r, J] = s([]), [K, Q] = s([]), h = p((t) => {
34
- const b = (E) => {
35
- const i = [], H = (x) => {
36
- if (x)
37
- for (const y of x)
38
- i.push(y), y.items && y.items.length && H(y.items);
39
- };
40
- H(E), Q((x) => {
41
- if (!i.find((O) => !!n && String(O.value) === String(n))) {
42
- const O = u || x.find((ne) => !!n && String(ne.value) === String(n));
43
- if (O) return [O, ...i];
44
- }
45
- return i;
46
- });
1
+ import { jsx as q, jsxs as be } from "react/jsx-runtime";
2
+ import { useState as d, useCallback as u, useEffect as $, useRef as J, useMemo as H, useImperativeHandle as Ce, useLayoutEffect as Me } from "react";
3
+ import { Popover as Ae } from "../Popover/Popover.js";
4
+ import { useDebounceCallback as xe } from "@oneplatformdev/hooks";
5
+ import { DEFAULT_COMBOBOX_TYPE as Le } from "./Combobox.types.js";
6
+ import { ComboboxRenderTrigger as Re } from "./ComboboxRenderTrigger.js";
7
+ import { ComboboxRenderContent as Ee } from "./ComboboxRenderContent.js";
8
+ function Be(o) {
9
+ const {
10
+ value: f,
11
+ options: N,
12
+ placeholder: T,
13
+ disabled: K,
14
+ searchLabel: Q,
15
+ emptyLabel: W,
16
+ loadData: y,
17
+ renderTrigger: Z,
18
+ commandInputAction: ee,
19
+ renderList: te,
20
+ listHeadAction: ne,
21
+ listFooterAction: oe,
22
+ emptyAction: re,
23
+ slotProps: P,
24
+ defaultNodeOpen: ae,
25
+ defaultNodeDisabled: se,
26
+ defaultNodeMatched: ce,
27
+ defaultNodeMuted: ie,
28
+ defaultNodeInteractive: le,
29
+ forcePointerSelect: ue
30
+ } = o, v = o.type ?? Le, [fe, z] = d(!1), [h, b] = d(!1), [k, A] = d(!1), [C, x] = d(!1), [g, L] = d(""), [S, O] = d(/* @__PURE__ */ new Map()), [p, de] = d([]), [he, me] = d([]), M = u((t) => {
31
+ const r = (e) => {
32
+ const n = [], s = (c) => {
33
+ if (c)
34
+ for (const l of c)
35
+ n.push(l), l.items && l.items.length && s(l.items);
47
36
  };
48
- J((E) => {
49
- const i = typeof t == "function" ? t(E) : t;
50
- return b(i), i;
37
+ s(e), me((c) => {
38
+ if (!n.find((a) => !!f && String(a.value) === String(f))) {
39
+ const i = ((S.size ? Array.from(S.values()) : void 0) || c).find((j) => !!f && String(j.value) === String(f));
40
+ if (i) return [i, ...n];
41
+ }
42
+ return n;
51
43
  });
52
- }, [u, n]);
53
- re(() => {
54
- N?.length && h(N);
55
- }, [N]);
56
- const Y = async () => {
57
- l || (U(), P(""));
58
- }, U = p(async (t) => {
59
- c(!0);
44
+ };
45
+ de((e) => {
46
+ const n = typeof t == "function" ? t(e) : t;
47
+ return r(n), O((s) => {
48
+ const c = new Map(s), l = Array.isArray(f) ? f : [f];
49
+ for (const a of l) {
50
+ if (!a || c.has(a)) continue;
51
+ const i = n.find((j) => String(j.value).toLowerCase() === String(a).toLowerCase());
52
+ i && c.set(i.value, i);
53
+ }
54
+ return c;
55
+ }), n;
56
+ });
57
+ }, [S, f]), [ge, G] = d(0), [F, V] = d(0), B = F < ge;
58
+ $(() => {
59
+ N?.length && M(N);
60
+ }, [N]);
61
+ const w = J(0), R = J(null), E = u(() => {
62
+ w.current += 1, R.current?.abort();
63
+ const t = new AbortController();
64
+ return R.current = t, { id: w.current, signal: t.signal };
65
+ }, []);
66
+ $(() => () => R.current?.abort(), []);
67
+ const X = H(() => !!g && !p.length && !h, [h, p.length, g]), U = H(() => !p.length && !h, [h, p.length, g]), I = u((t) => {
68
+ o.type === "single" && (O((r) => {
69
+ let e = new Map(r);
70
+ const n = e.has(t.value);
71
+ return e.has(t.value) ? e = /* @__PURE__ */ new Map() : e.set(t.value, t), n ? o.onChange?.(void 0) : o.onChange?.(t.value), e;
72
+ }), x(!1)), o.type === "multi" && O((r) => {
73
+ const e = new Map(r);
74
+ return e.has(t.value) ? e.delete(t.value) : e.set(t.value, t), o.onChange?.(Array.from(e.keys())), e;
75
+ });
76
+ }, [o.type, o.onChange]), m = H(() => {
77
+ const t = {
78
+ options: p,
79
+ setOptions: M,
80
+ search: g || "",
81
+ setSearch: L,
82
+ onChangeOption: I,
83
+ open: C,
84
+ setOpen: x,
85
+ loading: h,
86
+ setLoading: b,
87
+ isEmptyList: U,
88
+ isSearchedEmptyList: X,
89
+ placeholder: T
90
+ }, r = Array.from(S.values());
91
+ if (v === "multi")
92
+ return { ...t, type: "multi", selectedOption: r, setSelectedOption: (s) => {
93
+ O((c) => {
94
+ const l = Array.from(c.values()), a = typeof s == "function" ? s(l) : s;
95
+ return a ? new Map(a.map((i) => [i.value, i])) : /* @__PURE__ */ new Map();
96
+ });
97
+ } };
98
+ if (v === "single") {
99
+ const e = r[0];
100
+ return { ...t, type: "single", selectedOption: e, setSelectedOption: (s) => {
101
+ O((c) => {
102
+ const [l] = Array.from(c.values()), a = typeof s == "function" ? s(l) : s, i = /* @__PURE__ */ new Map();
103
+ return a && i.set(a.value, a), i;
104
+ });
105
+ } };
106
+ }
107
+ throw new Error(`Combobox type ${v} is not supported`);
108
+ }, [T, h, C, p, g, S, U, X, M, I, o.type]);
109
+ Ce(o.imperativeRef, () => m, [m]);
110
+ const D = u(async (t, r) => {
111
+ const e = await y(t, r, m);
112
+ if (!e) throw new Error("Expected loadData to return data");
113
+ return Array.isArray(e) ? { data: e, total: e.length } : e;
114
+ }, [y, m]), _ = u(async (t = "") => {
115
+ if (!y) return;
116
+ const { id: r, signal: e } = E();
117
+ try {
118
+ b(!0), A(!1);
119
+ const n = await D({ search: t }, e);
120
+ if (r !== w.current) return;
121
+ M(n.data), G(n.total), V(n.data.length);
122
+ } catch (n) {
123
+ console.error("Unexpected error while get option:", n);
124
+ } finally {
125
+ r === w.current && b(!1);
126
+ }
127
+ }, [E, D, y]), pe = u(async () => {
128
+ if (!y || !B || h || k) return;
129
+ const { id: t, signal: r } = E();
130
+ try {
131
+ A(!0);
132
+ const e = await D(
133
+ { search: g, offset: F },
134
+ r
135
+ );
136
+ M((n) => [...n, ...e.data]), G(e.total), V((n) => n + e.data.length);
137
+ } catch (e) {
138
+ console.error("Unexpected error while load more option:", e);
139
+ } finally {
140
+ t === w.current && A(!1);
141
+ }
142
+ }, [E, D, B, y, h, k, F, g]), ye = xe(_, 600, {
143
+ leading: !1,
144
+ trailing: !0
145
+ }), ve = u((t) => {
146
+ b(!0), L(t), ye(t);
147
+ }, []), Se = u(() => {
148
+ o.onChange(void 0), O(/* @__PURE__ */ new Map()), x(!1);
149
+ }, [o.onChange]), Y = u(() => {
150
+ R.current?.abort(), w.current += 1, L(""), b(!1), A(!1);
151
+ }, []), Oe = u(async (t) => {
152
+ if (x(t), !t) return Y();
153
+ _(), L("");
154
+ }, [Y, _]), we = u(async () => {
155
+ if (o.onMount) {
156
+ z(!0);
60
157
  try {
61
- const b = await _(t);
62
- h(b);
63
- } catch (b) {
64
- console.error("Unexpected error while get option:", b);
158
+ v === "multi" ? await o.onMount?.(m) : await o.onMount?.(m);
65
159
  } finally {
66
- c(!1);
160
+ z(!1);
67
161
  }
68
- }, [h]), Z = he(U, 1e3, {
69
- leading: !1,
70
- trailing: !0
71
- }), $ = p((t) => {
72
- c(!0), P(t), Z(t);
73
- }, []), W = p((t) => {
74
- L(t.value), D(t), c(!1);
75
- }, []), ee = p(() => {
76
- W({ value: "", label: "" }), D(void 0), c(!1);
77
- }, []), q = M(() => !!a && !r.length && !o, [o, r.length, a]), z = M(() => !r.length && !o, [o, r.length, a]), g = M(() => ({
78
- options: r,
79
- setOptions: h,
80
- selectedOption: u,
81
- setSelectedOption: D,
82
- search: a || "",
83
- setSearch: P,
84
- open: l,
85
- setOpen: B,
86
- loading: o,
87
- setLoading: c,
88
- isEmptyList: z,
89
- isSearchedEmptyList: q
90
- }), [o, l, r, a, u, z, q, h]), te = p(async () => {
91
- if (k) {
92
- G(!0);
93
- try {
94
- await k(g);
95
- } finally {
96
- G(!1);
97
- }
98
- }
99
- }, [k, g]);
100
- return ae(() => {
101
- te();
102
- }, []), /* @__PURE__ */ e("div", { className: "w-full", ref: m, children: /* @__PURE__ */ d(
103
- ie,
104
- {
105
- open: l,
106
- onOpenChange: (t) => {
107
- B(t), t && Y();
108
- },
109
- children: [
110
- /* @__PURE__ */ e(se, { asChild: !0, className: "border-input", children: /* @__PURE__ */ e(
111
- ce,
112
- {
113
- color: "secondary",
114
- role: "combobox",
115
- "aria-expanded": l,
116
- className: R(
117
- "relative w-full justify-between font-normal text-sm bg-transparent",
118
- "border border-border",
119
- l && "border-2 outline-hidden ring-1 ring-ring",
120
- "focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring"
121
- ),
122
- disabled: v || F,
123
- children: F ? /* @__PURE__ */ e(V, { fullWidth: !0 }) : /* @__PURE__ */ d(j, { children: [
124
- /* @__PURE__ */ e("span", { className: "truncate max-w-[calc(100%-1.5rem)] overflow-hidden whitespace-nowrap", children: n ? ve({ value: n, flattenOptions: K, selectedOption: u }) : /* @__PURE__ */ e("span", { className: "text-gray-400", children: T }) }),
125
- n ? /* @__PURE__ */ e(
126
- "div",
127
- {
128
- className: R(
129
- "absolute top-0 right-1",
130
- "flex items-center justify-center",
131
- "w-9 aspect-square [&_svg]:size-5",
132
- "opacity-50 cursor-pointer hover:opacity-100"
133
- ),
134
- onClick: (t) => {
135
- t.stopPropagation(), ee();
136
- },
137
- children: /* @__PURE__ */ e(ge, {})
138
- }
139
- ) : /* @__PURE__ */ e(be, { className: "opacity-50 w-4 h-4" })
140
- ] })
141
- }
142
- ) }),
143
- /* @__PURE__ */ e(
144
- le,
145
- {
146
- className: "w-(--radix-popper-anchor-width) max-w-none p-0",
147
- align: "start",
148
- children: /* @__PURE__ */ d(de, { shouldFilter: !1, children: [
149
- /* @__PURE__ */ e(
150
- pe,
151
- {
152
- placeholder: f,
153
- value: a,
154
- onValueChange: $
155
- }
156
- ),
157
- typeof I == "function" ? I(g) : I,
158
- /* @__PURE__ */ e(me, { children: /* @__PURE__ */ d(
159
- fe,
160
- {
161
- className: R(!r.length && "p-0 shadow-none"),
162
- children: [
163
- o && /* @__PURE__ */ e(V, { fullWidth: !0 }),
164
- !o && !!a && /* @__PURE__ */ e(j, { children: C ? /* @__PURE__ */ d(X, { className: "flex flex-col gap-3 py-5 px-3 items-center", children: [
165
- /* @__PURE__ */ e("span", { children: A }),
166
- typeof C == "function" ? C(g) : C
167
- ] }) : /* @__PURE__ */ e(X, { children: A }) }),
168
- !o && /* @__PURE__ */ d(j, { children: [
169
- !!r.length && w && /* @__PURE__ */ e(
170
- ue,
171
- {
172
- asChild: !0,
173
- className: "w-full",
174
- children: typeof w == "function" ? w(g) : w
175
- },
176
- "combobox-list-head-action"
177
- ),
178
- /* @__PURE__ */ e(
179
- ye,
180
- {
181
- value: n,
182
- options: r,
183
- onChangeOption: W,
184
- setOpen: B
185
- }
186
- )
187
- ] })
188
- ]
189
- }
190
- ) })
191
- ] })
192
- }
193
- )
194
- ]
195
- }
196
- ) });
197
- }
198
- );
162
+ }
163
+ }, [o.onMount, m]);
164
+ return Me(() => {
165
+ we();
166
+ }, []), /* @__PURE__ */ q("div", { className: "w-full", children: /* @__PURE__ */ be(
167
+ Ae,
168
+ {
169
+ open: C,
170
+ onOpenChange: Oe,
171
+ modal: P?.popover?.modal,
172
+ children: [
173
+ /* @__PURE__ */ q(
174
+ Re,
175
+ {
176
+ value: f,
177
+ type: v,
178
+ open: C,
179
+ initialLoading: fe,
180
+ selectedOptions: S,
181
+ flattenOptions: he,
182
+ onSelect: I,
183
+ onClearSelections: Se,
184
+ callbackStateParams: m,
185
+ renderTrigger: Z,
186
+ placeholder: T,
187
+ disabled: K
188
+ }
189
+ ),
190
+ /* @__PURE__ */ q(
191
+ Ee,
192
+ {
193
+ open: C,
194
+ value: f,
195
+ type: v,
196
+ options: p,
197
+ search: g,
198
+ onSearch: ve,
199
+ onSelect: I,
200
+ onLoadMore: pe,
201
+ hasNext: B,
202
+ loading: h,
203
+ loadingMore: k,
204
+ isEmptyList: U,
205
+ callbackStateParams: m,
206
+ commandInputAction: ee,
207
+ renderList: te,
208
+ listHeadAction: ne,
209
+ listFooterAction: oe,
210
+ emptyAction: re,
211
+ slotProps: P,
212
+ searchLabel: Q,
213
+ emptyLabel: W,
214
+ defaultNodeOpen: ae,
215
+ defaultNodeDisabled: se,
216
+ defaultNodeMatched: ce,
217
+ defaultNodeMuted: ie,
218
+ defaultNodeInteractive: le,
219
+ forcePointerSelect: ue,
220
+ popoverContainer: P?.popover?.container
221
+ }
222
+ )
223
+ ]
224
+ }
225
+ ) });
226
+ }
199
227
  export {
200
- Ee as Combobox
228
+ Be as Combobox
201
229
  };
202
230
  //# sourceMappingURL=Combobox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.js","sources":["../../src/Combobox/Combobox.tsx"],"sourcesContent":["import {\n Dispatch,\n forwardRef, SetStateAction,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n} from 'react';\nimport { LoadingMask } from '../LoadingMask';\nimport { Popover, PopoverContent, PopoverTrigger } from '../Popover';\nimport { Button } from '../Button';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from '../Command';\nimport { cn } from '@oneplatformdev/utils';\nimport { useDebounceCallback } from '@oneplatformdev/hooks';\nimport { ChevronsUpDown, X } from 'lucide-react';\nimport {\n ComboboxCallbackStateParams,\n ComboboxOption,\n ComboboxProps,\n} from './Combobox.types';\nimport { ComboboxOptions } from './ComboboxOptions'; // TODO: refactor next component | nlt code\n\n\nconst getSelectRenderLabel = (params: {\n value: ComboboxProps['value'];\n flattenOptions: ComboboxOption[];\n selectedOption?: ComboboxOption;\n}): string => {\n const { value, flattenOptions = [], selectedOption } = params;\n if(!value) return 'No value for render label';\n const flattenedOption = flattenOptions.find(o => String(o.value).toLowerCase() === String(value).toLowerCase());\n const label = [flattenedOption, selectedOption]\n .filter(Boolean)\n .map(o => o!.label)\n .find(Boolean);\n if(!label) return value;\n return label;\n}\n\n// TODO: refactor next component | nlt code\nexport const Combobox = forwardRef<HTMLDivElement, ComboboxProps>(\n (props, ref) => {\n const {\n value,\n onChange,\n placeholder,\n disabled,\n searchLabel = 'Type to search...',\n fetchOptions,\n options: itemOptions,\n emptyLabel = 'No options',\n emptyAction,\n commandInputAction,\n listHeadAction,\n onMount,\n } = props;\n const [initialLoading, setInitialLoading] = useState(false);\n const [open, setOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const [selectedOption, setSelectedOption] = useState<ComboboxOption>();\n const [loading, setLoading] = useState(false);\n\n const [options, setOptionsDispatch] = useState<ComboboxOption[]>([]);\n const [flattenOptions, setFlattenOptions] = useState<ComboboxOption[]>([]);\n const setOptions: Dispatch<SetStateAction<ComboboxOption[]>> = useCallback((stater) => {\n const flatten = (next: ComboboxOption[]) => {\n const res: ComboboxOption[] = [];\n const walk = (nodes?: ComboboxOption[]) => {\n if (!nodes) return;\n for (const node of nodes) {\n res.push(node);\n if (node.items && node.items.length) walk(node.items);\n }\n };\n walk(next);\n setFlattenOptions((prev) => {\n const isIncludedInRes = res.find(o => !!value && String(o.value) === String(value));\n\n if(!isIncludedInRes) {\n const current = selectedOption || prev.find(o => !!value && String(o.value) === String(value))\n if(current) return [current, ...res];\n }\n\n return res;\n });\n }\n setOptionsDispatch((prev) => {\n const next: ComboboxOption[] = typeof stater === 'function' ? stater(prev) : stater;\n flatten(next);\n return next;\n });\n }, [selectedOption, value])\n\n useEffect(() => {\n itemOptions?.length && setOptions(itemOptions);\n }, [itemOptions]);\n\n const handlePopoverOpen = async () => {\n if (!open) {\n void getData();\n setSearchTerm('');\n }\n };\n\n const getData = useCallback(async (search?: string) => {\n setLoading(true);\n try {\n const fetchedOptions = await fetchOptions(search);\n setOptions(fetchedOptions);\n } catch (error) {\n console.error('Unexpected error while get option:', error);\n } finally {\n setLoading(false);\n }\n }, [setOptions]);\n\n const debouncedGetData = useDebounceCallback(getData, 1000, {\n leading: false,\n trailing: true,\n });\n\n const handleSearchChange = useCallback((value: string) => {\n setLoading(true);\n setSearchTerm(value);\n debouncedGetData(value);\n }, []);\n\n const onChangeOption = useCallback((option: ComboboxOption) => {\n onChange(option.value);\n setSelectedOption(option);\n setLoading(false);\n }, []);\n\n const handleClearSelection = useCallback(() => {\n onChangeOption({ value: '', label: '' });\n setSelectedOption(undefined);\n setLoading(false);\n }, []);\n\n const isSearchedEmptyList = useMemo(() => {\n return Boolean(searchTerm) && !options.length && !loading;\n }, [loading, options.length, searchTerm])\n\n const isEmptyList = useMemo(() => {\n return !options.length && !loading;\n }, [loading, options.length, searchTerm])\n\n const comboboxCallbackStateParams =\n useMemo((): ComboboxCallbackStateParams => {\n return {\n options,\n setOptions,\n selectedOption,\n setSelectedOption,\n search: searchTerm || '',\n setSearch: setSearchTerm,\n open,\n setOpen,\n loading,\n setLoading,\n isEmptyList,\n isSearchedEmptyList,\n };\n }, [loading, open, options, searchTerm, selectedOption, isEmptyList, isSearchedEmptyList, setOptions]);\n\n const runOnMount = useCallback(async () => {\n if (!onMount) return;\n setInitialLoading(true);\n try {\n await onMount(comboboxCallbackStateParams);\n } finally {\n setInitialLoading(false);\n }\n }, [onMount, comboboxCallbackStateParams]);\n\n useLayoutEffect(() => {\n runOnMount();\n }, []);\n\n return (\n <div className=\"w-full\" ref={ref}>\n <Popover\n open={open}\n onOpenChange={(newOpen) => {\n setOpen(newOpen);\n if (newOpen) handlePopoverOpen();\n }}\n >\n <PopoverTrigger asChild className=\"border-input\">\n <Button\n color='secondary'\n role=\"combobox\"\n aria-expanded={open}\n className={cn(\n 'relative w-full justify-between font-normal text-sm bg-transparent',\n 'border border-border',\n open && 'border-2 outline-hidden ring-1 ring-ring',\n 'focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring'\n )}\n disabled={disabled || initialLoading}\n >\n {initialLoading ? (\n <LoadingMask fullWidth />\n ) : (\n <>\n <span className=\"truncate max-w-[calc(100%-1.5rem)] overflow-hidden whitespace-nowrap\">\n {value\n ? getSelectRenderLabel({ value, flattenOptions, selectedOption })\n : <span className=\"text-gray-400\">{placeholder}</span>\n }\n </span>\n {value ? (\n <div\n className={cn(\n 'absolute top-0 right-1',\n 'flex items-center justify-center',\n 'w-9 aspect-square [&_svg]:size-5',\n 'opacity-50 cursor-pointer hover:opacity-100'\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleClearSelection();\n }}\n >\n <X />\n </div>\n ) : (\n <ChevronsUpDown className=\"opacity-50 w-4 h-4\" />\n )}\n </>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-(--radix-popper-anchor-width) max-w-none p-0\"\n align=\"start\"\n >\n <Command shouldFilter={false}>\n <CommandInput\n placeholder={searchLabel}\n value={searchTerm}\n onValueChange={handleSearchChange}\n />\n {typeof commandInputAction === 'function'\n ? commandInputAction(comboboxCallbackStateParams)\n : commandInputAction}\n <CommandList>\n <CommandGroup\n className={cn(!options.length && 'p-0 shadow-none')}\n >\n {loading && <LoadingMask fullWidth />}\n {!loading && Boolean(searchTerm) && (\n <>\n {emptyAction ? (\n <CommandEmpty className=\"flex flex-col gap-3 py-5 px-3 items-center\">\n <span>{emptyLabel}</span>\n {typeof emptyAction === 'function'\n ? emptyAction(comboboxCallbackStateParams)\n : emptyAction}\n </CommandEmpty>\n ) : (\n <CommandEmpty>{emptyLabel}</CommandEmpty>\n )}\n </>\n )}\n {!loading && (\n <>\n {Boolean(options.length) && listHeadAction && (\n <CommandItem\n key='combobox-list-head-action'\n asChild\n className='w-full'\n >\n {typeof listHeadAction === 'function'\n ? listHeadAction(comboboxCallbackStateParams)\n : listHeadAction}\n </CommandItem>\n )}\n <ComboboxOptions\n value={value}\n options={options}\n onChangeOption={onChangeOption}\n setOpen={setOpen}\n />\n </>\n )}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n </div>\n );\n }\n);\n"],"names":["getSelectRenderLabel","params","value","flattenOptions","selectedOption","label","o","Combobox","forwardRef","props","ref","onChange","placeholder","disabled","searchLabel","fetchOptions","itemOptions","emptyLabel","emptyAction","commandInputAction","listHeadAction","onMount","initialLoading","setInitialLoading","useState","open","setOpen","searchTerm","setSearchTerm","setSelectedOption","loading","setLoading","options","setOptionsDispatch","setFlattenOptions","setOptions","useCallback","stater","flatten","next","res","walk","nodes","node","prev","current","useEffect","handlePopoverOpen","getData","search","fetchedOptions","error","debouncedGetData","useDebounceCallback","handleSearchChange","onChangeOption","option","handleClearSelection","isSearchedEmptyList","useMemo","isEmptyList","comboboxCallbackStateParams","runOnMount","useLayoutEffect","jsx","jsxs","Popover","newOpen","PopoverTrigger","Button","cn","LoadingMask","Fragment","e","X","ChevronsUpDown","PopoverContent","Command","CommandInput","CommandList","CommandGroup","CommandEmpty","CommandItem","ComboboxOptions"],"mappings":"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"}
1
+ {"version":3,"file":"Combobox.js","sources":["../../src/Combobox/Combobox.tsx"],"sourcesContent":["import {\n Dispatch, JSX,\n SetStateAction,\n useCallback,\n useEffect, useImperativeHandle,\n useLayoutEffect,\n useMemo, useRef,\n useState,\n} from 'react';\nimport { Popover } from '../Popover';\nimport { useDebounceCallback } from '@oneplatformdev/hooks';\nimport {\n ComboboxCallbackStateParams, ComboboxCallbackStateParamsRenderHandler,\n ComboboxOption,\n ComboboxProps, ComboboxSelectedType,\n DEFAULT_COMBOBOX_TYPE, MultiComboboxProps, SingleComboboxProps,\n} from './Combobox.types';\nimport { ComboboxRenderTrigger } from \"./ComboboxRenderTrigger\";\nimport { ComboboxRenderContent } from \"./ComboboxRenderContent\";\n\nexport function Combobox<Data extends object>(props: SingleComboboxProps<Data>): JSX.Element;\nexport function Combobox<Data extends object>(props: MultiComboboxProps<Data>): JSX.Element;\n\nexport function Combobox<Data extends object = object>(\n props: ComboboxProps<Data, 'single'> | ComboboxProps<Data, 'multi'>\n): JSX.Element {\n const {\n value,\n options: itemOptions,\n placeholder,\n disabled,\n searchLabel,\n emptyLabel,\n loadData,\n renderTrigger,\n commandInputAction,\n renderList,\n listHeadAction,\n listFooterAction,\n emptyAction,\n slotProps,\n defaultNodeOpen,\n defaultNodeDisabled,\n defaultNodeMatched,\n defaultNodeMuted,\n defaultNodeInteractive,\n forcePointerSelect,\n } = props;\n\n const type: ComboboxSelectedType = props.type ?? DEFAULT_COMBOBOX_TYPE;\n type StateSingle = ComboboxCallbackStateParams<Data, 'single'>;\n type StateMulti = ComboboxCallbackStateParams<Data, 'multi'>;\n type State = StateSingle | StateMulti;\n\n const [ initialLoading, setInitialLoading ] = useState(false);\n const [ loading, setLoading ] = useState(false);\n const [loadingMore, setLoadingMore] = useState(false);\n\n const [ open, setOpen ] = useState(false);\n const [ searchTerm, setSearchTerm ] = useState('');\n\n const [ selectedOptions, setSelectedOptions ] = useState<\n Map<ComboboxOption<Data>['value'], ComboboxOption<Data>>\n >(new Map());\n\n const [ options, _setOptions ] = useState<ComboboxOption<Data>[]>([]);\n const [ flattenOptions, setFlattenOptions ] = useState<ComboboxOption<Data>[]>([]);\n const setOptions: Dispatch<SetStateAction<ComboboxOption<Data>[]>> = useCallback((stater) => {\n const flatten = (next: ComboboxOption<Data>[]) => {\n const res: ComboboxOption<Data>[] = [];\n const walk = (nodes?: ComboboxOption<Data>[]) => {\n if (!nodes) return;\n for (const node of nodes) {\n res.push(node);\n if (node.items && node.items.length) walk(node.items);\n }\n };\n walk(next);\n setFlattenOptions((prev) => {\n const isIncludedInRes = res.find(o => !!value && String(o.value) === String(value));\n\n if (!isIncludedInRes) {\n const selectedOption = selectedOptions.size ? Array.from(selectedOptions.values()) : undefined;\n const current = (selectedOption || prev).find(o => !!value && String(o.value) === String(value))\n if (current) return [ current, ...res ];\n }\n\n return res;\n });\n }\n _setOptions((prev) => {\n const next: ComboboxOption<Data>[] = typeof stater === 'function' ? stater(prev) : stater;\n flatten(next);\n setSelectedOptions(prevSelections => {\n const nextSelections = new Map(prevSelections);\n const vls = Array.isArray(value) ? value : [value];\n for (const v of vls) {\n if(!v) continue;\n if(nextSelections.has(v)) continue;\n const o = next.find(o => String(o.value).toLowerCase() === String(v).toLowerCase());\n if(!o) continue;\n nextSelections.set(o.value, o);\n }\n return nextSelections;\n })\n return next;\n });\n }, [ selectedOptions, value ])\n\n const [total, setTotal] = useState<number>(0);\n const [offset, setOffset] = useState<number>(0);\n const hasNext = offset < total;\n\n useEffect(() => {\n itemOptions?.length && setOptions(itemOptions);\n }, [ itemOptions ]);\n\n const requestIdRef = useRef(0);\n const abortRef = useRef<AbortController>(null);\n const beginRequest = useCallback(() => {\n requestIdRef.current += 1;\n abortRef.current?.abort();\n const ac = new AbortController();\n abortRef.current = ac;\n return { id: requestIdRef.current, signal: ac.signal };\n }, []);\n useEffect(() => {\n return () => abortRef.current?.abort();\n }, []);\n\n const isSearchedEmptyList = useMemo(() => {\n return Boolean(searchTerm) && !options.length && !loading;\n }, [ loading, options.length, searchTerm ])\n\n const isEmptyList = useMemo(() => {\n return !options.length && !loading;\n }, [ loading, options.length, searchTerm ])\n\n const onChangeOption = useCallback((option: ComboboxOption<Data>) => {\n if(props.type === 'single') {\n setSelectedOptions(prev => {\n let next = new Map(prev);\n const isSelected = next.has(option.value);\n\n if(next.has(option.value)) next = new Map();\n else next.set(option.value, option);\n\n if(isSelected) props.onChange?.(undefined);\n else props.onChange?.(option.value);\n\n return next;\n });\n setOpen(false);\n }\n\n if(props.type === 'multi') {\n setSelectedOptions(prev => {\n const next = new Map(prev);\n if(next.has(option.value)) next.delete(option.value);\n else next.set(option.value, option);\n props.onChange?.(Array.from(next.keys()));\n return next;\n });\n }\n }, [props.type, props.onChange]);\n\n const callbackStateParams = useMemo((): State => {\n const base = {\n options,\n setOptions,\n search: searchTerm || '',\n setSearch: setSearchTerm,\n onChangeOption,\n open,\n setOpen,\n loading,\n setLoading,\n isEmptyList,\n isSearchedEmptyList,\n placeholder,\n }\n\n const selectedOptionArray = Array.from(selectedOptions.values());\n\n if(type === 'multi') {\n const selectedOption = selectedOptionArray\n const setSelectedOption: Dispatch<SetStateAction<ComboboxOption<Data>[] | undefined>> = (value) => {\n setSelectedOptions((prevSet) => {\n const prevStateArray = Array.from(prevSet.values());\n const nextStateArray = typeof value === 'function'\n ? (value as (prev: ComboboxOption<Data>[]) => ComboboxOption<Data>[])(prevStateArray)\n : value;\n if (!nextStateArray) return new Map();\n return new Map(nextStateArray.map(o => [o.value, o]));\n });\n };\n return { ...base, type: 'multi', selectedOption, setSelectedOption } satisfies StateMulti;\n }\n\n if(type === 'single') {\n const selectedOption = selectedOptionArray[0]\n const setSelectedOption: Dispatch<SetStateAction<ComboboxOption<Data> | undefined>> = (value) => {\n setSelectedOptions((prevSet) => {\n const [currentSingle] = Array.from(prevSet.values());\n const nextValue = typeof value === 'function'\n ? (value as (prev: ComboboxOption<Data> | undefined) => ComboboxOption<Data> | undefined)(currentSingle)\n : value;\n\n const nextMap = new Map<ComboboxOption<Data>['value'], ComboboxOption<Data>>();\n if (nextValue) nextMap.set(nextValue.value, nextValue);\n return nextMap;\n });\n };\n return { ...base, type: 'single', selectedOption, setSelectedOption } satisfies StateSingle;\n }\n\n throw new Error(`Combobox type ${type} is not supported`);\n }, [ placeholder, loading, open, options, searchTerm, selectedOptions, isEmptyList, isSearchedEmptyList, setOptions, onChangeOption, props.type ]);\n useImperativeHandle(props.imperativeRef, () => callbackStateParams, [callbackStateParams]);\n\n const fetchData = useCallback(async (\n params: Parameters<typeof loadData>[0],\n signal: AbortSignal,\n ) => {\n const fetchedData = await loadData(params, signal, callbackStateParams);\n if (!fetchedData) throw new Error('Expected loadData to return data');\n return Array.isArray(fetchedData)\n ? { data: fetchedData, total: fetchedData.length }\n : fetchedData;\n }, [loadData, callbackStateParams]);\n\n const loadFirst = useCallback(async (value: string = '') => {\n if (!loadData) return;\n const { id, signal } = beginRequest();\n try {\n setLoading(true);\n setLoadingMore(false);\n\n const result = await fetchData({ search: value }, signal);\n if (id !== requestIdRef.current) return;\n\n setOptions(result.data);\n setTotal(result.total);\n setOffset(result.data.length);\n } catch (error) {\n console.error('Unexpected error while get option:', error);\n } finally {\n if (id === requestIdRef.current) setLoading(false);\n }\n }, [beginRequest, fetchData, loadData]);\n\n const loadMore = useCallback(async () => {\n if (!loadData) return;\n if (!hasNext || loading || loadingMore) return;\n const { id, signal } = beginRequest();\n try {\n setLoadingMore(true);\n const result = await fetchData(\n { search: searchTerm, offset },\n signal\n );\n setOptions((prev) => [...prev, ...result.data]);\n setTotal(result.total);\n setOffset((prev) => prev + result.data.length);\n } catch (error) {\n console.error('Unexpected error while load more option:', error);\n } finally {\n if (id === requestIdRef.current) setLoadingMore(false);\n }\n }, [beginRequest, fetchData, hasNext, loadData, loading, loadingMore, offset, searchTerm]);\n\n const debouncedGetData = useDebounceCallback(loadFirst, 600, {\n leading: false,\n trailing: true,\n });\n\n const handleSearchChange = useCallback((value: string) => {\n setLoading(true);\n setSearchTerm(value);\n debouncedGetData(value);\n }, []);\n\n const handleClearSelections = useCallback(() => {\n props.onChange(undefined);\n setSelectedOptions(new Map());\n setOpen(false);\n }, [props.onChange]);\n\n const handleReset = useCallback(() => {\n abortRef.current?.abort();\n requestIdRef.current += 1;\n setSearchTerm(\"\");\n setLoading(false);\n setLoadingMore(false);\n }, []);\n\n const handlePopoverOpen = useCallback(async (next: boolean) => {\n setOpen(next);\n if(!next) return handleReset();\n void loadFirst();\n setSearchTerm('');\n }, [handleReset, loadFirst]);\n\n const runOnMount = useCallback(async () => {\n if (!props.onMount) return;\n setInitialLoading(true);\n try {\n if (type === 'multi') {\n await (props as MultiComboboxProps<Data>).onMount?.(callbackStateParams as StateMulti);\n } else {\n await (props as SingleComboboxProps<Data>).onMount?.(callbackStateParams as StateSingle);\n }\n } finally {\n setInitialLoading(false);\n }\n }, [ props.onMount, callbackStateParams ]);\n useLayoutEffect(() => {\n runOnMount();\n }, []);\n\n return (\n <div className=\"w-full\">\n <Popover\n open={open}\n onOpenChange={handlePopoverOpen}\n modal={slotProps?.popover?.modal}\n >\n <ComboboxRenderTrigger\n value={value}\n type={type}\n open={open}\n initialLoading={initialLoading}\n selectedOptions={selectedOptions}\n flattenOptions={flattenOptions}\n onSelect={onChangeOption}\n onClearSelections={handleClearSelections}\n callbackStateParams={callbackStateParams}\n renderTrigger={renderTrigger as ComboboxCallbackStateParamsRenderHandler<Data>}\n placeholder={placeholder}\n disabled={disabled}\n />\n\n <ComboboxRenderContent\n open={open}\n value={value}\n type={type}\n options={options}\n search={searchTerm}\n onSearch={handleSearchChange}\n onSelect={onChangeOption}\n onLoadMore={loadMore}\n hasNext={hasNext}\n loading={loading}\n loadingMore={loadingMore}\n isEmptyList={isEmptyList}\n callbackStateParams={callbackStateParams}\n commandInputAction={commandInputAction as ComboboxCallbackStateParamsRenderHandler<Data>}\n renderList={renderList as ComboboxCallbackStateParamsRenderHandler<Data>}\n listHeadAction={listHeadAction as ComboboxCallbackStateParamsRenderHandler<Data>}\n listFooterAction={listFooterAction as ComboboxCallbackStateParamsRenderHandler<Data>}\n emptyAction={emptyAction as ComboboxCallbackStateParamsRenderHandler<Data>}\n slotProps={slotProps}\n searchLabel={searchLabel}\n emptyLabel={emptyLabel}\n defaultNodeOpen={defaultNodeOpen}\n defaultNodeDisabled={defaultNodeDisabled}\n defaultNodeMatched={defaultNodeMatched}\n defaultNodeMuted={defaultNodeMuted}\n defaultNodeInteractive={defaultNodeInteractive}\n forcePointerSelect={forcePointerSelect}\n popoverContainer={slotProps?.popover?.container}\n />\n </Popover>\n </div>\n );\n}\n"],"names":["Combobox","props","value","itemOptions","placeholder","disabled","searchLabel","emptyLabel","loadData","renderTrigger","commandInputAction","renderList","listHeadAction","listFooterAction","emptyAction","slotProps","defaultNodeOpen","defaultNodeDisabled","defaultNodeMatched","defaultNodeMuted","defaultNodeInteractive","forcePointerSelect","type","DEFAULT_COMBOBOX_TYPE","initialLoading","setInitialLoading","useState","loading","setLoading","loadingMore","setLoadingMore","open","setOpen","searchTerm","setSearchTerm","selectedOptions","setSelectedOptions","options","_setOptions","flattenOptions","setFlattenOptions","setOptions","useCallback","stater","flatten","next","res","walk","nodes","node","prev","o","current","prevSelections","nextSelections","vls","v","total","setTotal","offset","setOffset","hasNext","useEffect","requestIdRef","useRef","abortRef","beginRequest","ac","isSearchedEmptyList","useMemo","isEmptyList","onChangeOption","option","isSelected","callbackStateParams","base","selectedOptionArray","prevSet","prevStateArray","nextStateArray","selectedOption","currentSingle","nextValue","nextMap","useImperativeHandle","fetchData","params","signal","fetchedData","loadFirst","id","result","error","loadMore","debouncedGetData","useDebounceCallback","handleSearchChange","handleClearSelections","handleReset","handlePopoverOpen","runOnMount","useLayoutEffect","jsx","jsxs","Popover","ComboboxRenderTrigger","ComboboxRenderContent"],"mappings":"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"}