@oneplatformdev/ui 0.1.99-beta.213 → 0.1.99-beta.215

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 (37) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/Combobox/Combobox.d.ts +1 -1
  3. package/Combobox/Combobox.d.ts.map +1 -1
  4. package/Combobox/Combobox.js +130 -228
  5. package/Combobox/Combobox.js.map +1 -1
  6. package/Combobox/Combobox.stories.js +113 -80
  7. package/Combobox/Combobox.stories.js.map +1 -1
  8. package/Combobox/Combobox.types.d.ts +35 -13
  9. package/Combobox/Combobox.types.d.ts.map +1 -1
  10. package/Combobox/Combobox.types.js +4 -1
  11. package/Combobox/Combobox.types.js.map +1 -1
  12. package/Combobox/ComboboxOptionItem.d.ts +1 -0
  13. package/Combobox/ComboboxOptionItem.d.ts.map +1 -1
  14. package/Combobox/ComboboxOptionItem.js +67 -38
  15. package/Combobox/ComboboxOptionItem.js.map +1 -1
  16. package/Combobox/ComboboxRenderContent.d.ts +13 -0
  17. package/Combobox/ComboboxRenderContent.d.ts.map +1 -0
  18. package/Combobox/ComboboxRenderContent.js +118 -0
  19. package/Combobox/ComboboxRenderContent.js.map +1 -0
  20. package/Combobox/{ComboboxOptions.d.ts → ComboboxRenderOptions.d.ts} +2 -2
  21. package/Combobox/ComboboxRenderOptions.d.ts.map +1 -0
  22. package/Combobox/ComboboxRenderOptions.js +53 -0
  23. package/Combobox/ComboboxRenderOptions.js.map +1 -0
  24. package/Combobox/ComboboxRenderTrigger.d.ts +13 -0
  25. package/Combobox/ComboboxRenderTrigger.d.ts.map +1 -0
  26. package/Combobox/ComboboxRenderTrigger.js +120 -0
  27. package/Combobox/ComboboxRenderTrigger.js.map +1 -0
  28. package/FormCombobox/FormCombobox.js +10 -10
  29. package/FormCombobox/FormCombobox.js.map +1 -1
  30. package/ScrollArea/ScrollArea.d.ts +5 -1
  31. package/ScrollArea/ScrollArea.d.ts.map +1 -1
  32. package/ScrollArea/ScrollArea.js +23 -17
  33. package/ScrollArea/ScrollArea.js.map +1 -1
  34. package/package.json +4 -4
  35. package/Combobox/ComboboxOptions.d.ts.map +0 -1
  36. package/Combobox/ComboboxOptions.js +0 -75
  37. package/Combobox/ComboboxOptions.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,35 @@
1
+ ## 0.1.99-beta.215 (2026-02-19)
2
+
3
+ ### 🩹 Fixes
4
+
5
+ - **Combobox:** rename `ref` to `comboboxRef` to resolve prop destructuring conflict ([e211cb0](https://github.com/oneplatformdev/core-web/commit/e211cb0))
6
+
7
+ ### 🧱 Updated Dependencies
8
+
9
+ - Updated @oneplatformdev/utils to 0.1.99-beta.215
10
+ - Updated @oneplatformdev/hooks to 0.1.99-beta.215
11
+ - Updated @oneplatformdev/tokens to 0.1.99-beta.215
12
+
13
+ ### ❤️ Thank You
14
+
15
+ - Bohdan Radchenko
16
+
17
+ ## 0.1.99-beta.214 (2026-02-19)
18
+
19
+ ### 🚀 Features
20
+
21
+ - **Combobox:** add support for `ref` prop in component props ([75c4f4b](https://github.com/oneplatformdev/core-web/commit/75c4f4b))
22
+
23
+ ### 🧱 Updated Dependencies
24
+
25
+ - Updated @oneplatformdev/utils to 0.1.99-beta.214
26
+ - Updated @oneplatformdev/hooks to 0.1.99-beta.214
27
+ - Updated @oneplatformdev/tokens to 0.1.99-beta.214
28
+
29
+ ### ❤️ Thank You
30
+
31
+ - Bohdan Radchenko
32
+
1
33
  ## 0.1.99-beta.213 (2026-02-19)
2
34
 
3
35
  ### 🚀 Features
@@ -1,3 +1,3 @@
1
1
  import { ComboboxProps } from './Combobox.types';
2
- export declare const Combobox: <Data extends object>(props: ComboboxProps<Data>) => import("react/jsx-runtime").JSX.Element;
2
+ export declare const Combobox: <Data extends object = object>(props: ComboboxProps<Data>) => import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=Combobox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.d.ts","sourceRoot":"","sources":["../../src/Combobox/Combobox.tsx"],"names":[],"mappings":"AAuBA,OAAO,EAGL,aAAa,EACd,MAAM,kBAAkB,CAAC;AAqB1B,eAAO,MAAM,QAAQ,GAAI,IAAI,SAAS,MAAM,EAAI,OAAO,aAAa,CAAC,IAAI,CAAC,4CAiTzE,CAAA"}
1
+ {"version":3,"file":"Combobox.d.ts","sourceRoot":"","sources":["../../src/Combobox/Combobox.tsx"],"names":[],"mappings":"AAWA,OAAO,EAGL,aAAa,EACd,MAAM,kBAAkB,CAAC;AAK1B,eAAO,MAAM,QAAQ,GAAI,IAAI,SAAS,MAAM,GAAG,MAAM,EAAI,OAAO,aAAa,CAAC,IAAI,CAAC,4CAgPlF,CAAA"}
@@ -1,250 +1,152 @@
1
- import { jsx as t, jsxs as p, Fragment as q } from "react/jsx-runtime";
2
- import { useState as f, useCallback as m, useEffect as pe, useMemo as z, useImperativeHandle as fe, useLayoutEffect as ue } from "react";
3
- import { LoadingMask as K } from "../LoadingMask/LoadingMask.js";
4
- import "../LoadingMask/RenderLoadingMask.js";
5
- import { Popover as me, PopoverTrigger as he, PopoverContent as ge } from "../Popover/Popover.js";
6
- import { Button as be } from "../Button/Button.js";
7
- import "../Button/buttonVariants.js";
8
- import { Command as ye, CommandInput as ve, CommandList as xe, CommandGroup as Ce, CommandEmpty as Q, CommandItem as we } from "../Command/Command.js";
9
- import { cn as C } from "@oneplatformdev/utils";
10
- import { useDebounceCallback as Ne } from "@oneplatformdev/hooks";
11
- import { X as Oe, ChevronDown as Se } from "lucide-react";
12
- import { ComboboxOptions as Le } from "./ComboboxOptions.js";
13
- const Ie = (k) => {
14
- const { value: h, flattenOptions: n = [], selectedOption: D } = k;
15
- if (!h) return "No value for render label";
16
- const N = [n.find((g) => String(g.value).toLowerCase() === String(h).toLowerCase()), D].filter(Boolean).map((g) => g.label).find(Boolean);
17
- return N || h;
18
- }, He = (k) => {
1
+ import { jsx as k, jsxs as q } from "react/jsx-runtime";
2
+ import { useState as h, useCallback as m, useEffect as J, useMemo as E, useImperativeHandle as K, useLayoutEffect as Q } from "react";
3
+ import { Popover as W } from "../Popover/Popover.js";
4
+ import { useDebounceCallback as X } from "@oneplatformdev/hooks";
5
+ import { ComboboxRenderTrigger as Y } from "./ComboboxRenderTrigger.js";
6
+ import { ComboboxRenderContent as Z } from "./ComboboxRenderContent.js";
7
+ const re = (n) => {
19
8
  const {
20
- ref: h,
21
- value: n,
22
- onChange: D,
23
- placeholder: w,
24
- disabled: N,
25
- searchLabel: g = "Type to search...",
26
- fetchOptions: Y,
27
- options: M,
28
- emptyLabel: J = "No options",
29
- emptyAction: O,
30
- commandInputAction: E,
31
- listHeadAction: S,
32
- listFooterAction: L,
33
- slotProps: T = {},
34
- onMount: j,
35
- defaultNodeDisabled: Z,
36
- defaultNodeMatched: $,
37
- defaultNodeMuted: ee,
38
- defaultNodeInteractive: te,
39
- renderTrigger: i,
40
- renderList: B
41
- } = k, [I, U] = f(!1), [s, R] = f(!1), [l, G] = f(""), [b, H] = f(), [o, u] = f(!1), [a, ne] = f([]), [oe, re] = f([]), y = m((e) => {
42
- const c = (W) => {
43
- const d = [], _ = (F) => {
44
- if (F)
45
- for (const x of F)
46
- d.push(x), x.items && x.items.length && _(x.items);
9
+ ref: j,
10
+ value: u,
11
+ placeholder: R,
12
+ fetchOptions: z,
13
+ options: x,
14
+ onMount: M
15
+ } = n, [B, D] = h(!1), [f, O] = h(!1), [C, w] = h(!1), [g, A] = h(""), [y, p] = h(/* @__PURE__ */ new Map()), [d, F] = h([]), [G, H] = h([]), v = m((e) => {
16
+ const s = (t) => {
17
+ const a = [], r = (i) => {
18
+ if (i)
19
+ for (const l of i)
20
+ a.push(l), l.items && l.items.length && r(l.items);
47
21
  };
48
- _(W), re((F) => {
49
- if (!d.find((P) => !!n && String(P.value) === String(n))) {
50
- const P = b || F.find((de) => !!n && String(de.value) === String(n));
51
- if (P) return [P, ...d];
22
+ r(t), H((i) => {
23
+ if (!a.find((o) => !!u && String(o.value) === String(u))) {
24
+ const c = ((y.size ? Array.from(y.values()) : void 0) || i).find((I) => !!u && String(I.value) === String(u));
25
+ if (c) return [c, ...a];
52
26
  }
53
- return d;
27
+ return a;
54
28
  });
55
29
  };
56
- ne((W) => {
57
- const d = typeof e == "function" ? e(W) : e;
58
- return c(d), d;
30
+ F((t) => {
31
+ const a = typeof e == "function" ? e(t) : e;
32
+ return s(a), p((r) => {
33
+ const i = new Map(r), l = Array.isArray(u) ? u : [u];
34
+ for (const o of l) {
35
+ if (!o || i.has(o)) continue;
36
+ const c = a.find((I) => String(I.value).toLowerCase() === String(o).toLowerCase());
37
+ c && i.set(c.value, c);
38
+ }
39
+ return i;
40
+ }), a;
59
41
  });
60
- }, [b, n]);
61
- pe(() => {
62
- M?.length && y(M);
63
- }, [M]);
64
- const ae = async () => {
65
- s || (V(), G(""));
66
- }, V = m(async (e) => {
67
- u(!0);
42
+ }, [y, u]);
43
+ J(() => {
44
+ x?.length && v(x);
45
+ }, [x]);
46
+ const N = m(async (e) => {
47
+ w(e), e && (P(), A(""));
48
+ }, []), P = m(async (e) => {
49
+ O(!0);
68
50
  try {
69
- const c = await Y(e);
70
- y(c);
71
- } catch (c) {
72
- console.error("Unexpected error while get option:", c);
51
+ const s = await z(e);
52
+ v(s);
53
+ } catch (s) {
54
+ console.error("Unexpected error while get option:", s);
73
55
  } finally {
74
- u(!1);
56
+ O(!1);
75
57
  }
76
- }, [y]), ie = Ne(V, 1e3, {
58
+ }, [v]), U = X(P, 1e3, {
77
59
  leading: !1,
78
60
  trailing: !0
79
- }), se = m((e) => {
80
- u(!0), G(e), ie(e);
81
- }, []), A = m((e) => {
82
- D(e.value), H(e), u(!1);
83
- }, []), le = m(() => {
84
- A({ value: "", label: "" }), H(void 0), u(!1);
85
- }, []), X = z(() => !!l && !a.length && !o, [o, a.length, l]), v = z(() => !a.length && !o, [o, a.length, l]), r = z(() => ({
86
- options: a,
87
- setOptions: y,
88
- selectedOption: b,
89
- setSelectedOption: H,
90
- search: l || "",
91
- setSearch: G,
92
- onChangeOption: A,
93
- open: s,
94
- setOpen: R,
95
- loading: o,
96
- setLoading: u,
97
- isEmptyList: v,
98
- isSearchedEmptyList: X,
99
- placeholder: w
100
- }), [w, o, s, a, l, b, v, X, y, A]);
101
- fe(h, () => r, [r]);
102
- const ce = m(async () => {
103
- if (j) {
104
- U(!0);
61
+ }), V = m((e) => {
62
+ O(!0), A(e), U(e);
63
+ }, []), b = m((e) => {
64
+ n.type === "single" && (p((s) => {
65
+ let t = new Map(s);
66
+ const a = t.has(e.value);
67
+ return t.has(e.value) ? t = /* @__PURE__ */ new Map() : t.set(e.value, e), a ? n.onChange?.(void 0) : n.onChange?.(e.value), t;
68
+ }), w(!1)), n.type === "multi" && p((s) => {
69
+ const t = new Map(s);
70
+ return t.has(e.value) ? t.delete(e.value) : t.set(e.value, e), n.onChange?.(Array.from(t.keys())), t;
71
+ });
72
+ }, [n.type, n.onChange]), _ = m(() => {
73
+ n.onChange(void 0), p(/* @__PURE__ */ new Map()), w(!1);
74
+ }, [n.onChange]), T = E(() => !!g && !d.length && !f, [f, d.length, g]), L = E(() => !d.length && !f, [f, d.length, g]), S = E(() => {
75
+ const e = {
76
+ options: d,
77
+ setOptions: v,
78
+ search: g || "",
79
+ setSearch: A,
80
+ onChangeOption: b,
81
+ open: C,
82
+ setOpen: w,
83
+ loading: f,
84
+ setLoading: O,
85
+ isEmptyList: L,
86
+ isSearchedEmptyList: T,
87
+ placeholder: R
88
+ }, s = Array.from(y.values());
89
+ if (n.type === "multi")
90
+ return { ...e, type: "multi", selectedOption: s, setSelectedOption: (r) => {
91
+ p((i) => {
92
+ const l = Array.from(i.values()), o = typeof r == "function" ? r(l) : r;
93
+ return o ? new Map(o.map((c) => [c.value, c])) : /* @__PURE__ */ new Map();
94
+ });
95
+ } };
96
+ if (n.type === "single") {
97
+ const t = s[0];
98
+ return { ...e, type: "single", selectedOption: t, setSelectedOption: (r) => {
99
+ p((i) => {
100
+ const [l] = Array.from(i.values()), o = typeof r == "function" ? r(l) : r, c = /* @__PURE__ */ new Map();
101
+ return o && c.set(o.value, o), c;
102
+ });
103
+ } };
104
+ }
105
+ throw new Error(`Combobox type ${n.type} is not supported`);
106
+ }, [R, f, C, d, g, y, L, T, v, b, n.type]);
107
+ K(j, () => S, [S]);
108
+ const $ = m(async () => {
109
+ if (M) {
110
+ D(!0);
105
111
  try {
106
- await j(r);
112
+ await M(S);
107
113
  } finally {
108
- U(!1);
114
+ D(!1);
109
115
  }
110
116
  }
111
- }, [j, r]);
112
- return ue(() => {
113
- ce();
114
- }, []), /* @__PURE__ */ t("div", { className: "w-full", children: /* @__PURE__ */ p(
115
- me,
117
+ }, [M, S]);
118
+ return Q(() => {
119
+ $();
120
+ }, []), /* @__PURE__ */ k("div", { className: "w-full", children: /* @__PURE__ */ q(
121
+ W,
116
122
  {
117
- open: s,
118
- onOpenChange: (e) => {
119
- R(e), e && ae();
120
- },
123
+ open: C,
124
+ onOpenChange: N,
121
125
  children: [
122
- /* @__PURE__ */ t(he, { asChild: !0, className: "border-input", children: /* @__PURE__ */ p(
123
- be,
126
+ /* @__PURE__ */ k(
127
+ Y,
124
128
  {
125
- variant: i ? "none" : "contained",
126
- color: "secondary",
127
- role: "combobox",
128
- "aria-expanded": s,
129
- className: C(
130
- "relative w-full justify-between bg-transparent",
131
- !i && "font-normal text-sm",
132
- "border border-border",
133
- s && "border-2 outline-hidden ring-1 ring-ring",
134
- "focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring",
135
- i && "p-0",
136
- i && s && "p-0 border-1 ring-0 ring-transparent"
137
- ),
138
- disabled: N || I,
139
- children: [
140
- I && /* @__PURE__ */ t(K, { fullWidth: !0 }),
141
- !I && i && i(r),
142
- !I && !i && /* @__PURE__ */ p(q, { children: [
143
- /* @__PURE__ */ t(
144
- "span",
145
- {
146
- className: "truncate max-w-[calc(100%-1.5rem)] overflow-hidden whitespace-nowrap",
147
- children: n ? Ie({ value: n, flattenOptions: oe, selectedOption: b }) : /* @__PURE__ */ t("span", { className: "text-gray-400", children: w })
148
- }
149
- ),
150
- n ? /* @__PURE__ */ t(
151
- "div",
152
- {
153
- className: C(
154
- "absolute top-0 right-1",
155
- "flex items-center justify-center",
156
- "w-9 aspect-square [&_svg]:size-5",
157
- "opacity-50 cursor-pointer hover:opacity-100"
158
- ),
159
- onClick: (e) => {
160
- e.stopPropagation(), le();
161
- },
162
- children: /* @__PURE__ */ t(Oe, {})
163
- }
164
- ) : /* @__PURE__ */ t(Se, { className: "opacity-50 w-4 h-4" })
165
- ] })
166
- ]
129
+ ...n,
130
+ open: C,
131
+ initialLoading: B,
132
+ callbackStateParams: S,
133
+ flattenOptions: G,
134
+ onSelect: b,
135
+ onClearSelections: _,
136
+ selectedOptions: y
167
137
  }
168
- ) }),
169
- /* @__PURE__ */ t(
170
- ge,
138
+ ),
139
+ /* @__PURE__ */ k(
140
+ Z,
171
141
  {
172
- className: C(
173
- "w-(--radix-popper-anchor-width) max-w-none p-2"
174
- ),
175
- align: "start",
176
- children: /* @__PURE__ */ p(ye, { shouldFilter: !1, children: [
177
- /* @__PURE__ */ t(
178
- ve,
179
- {
180
- placeholder: g,
181
- value: l,
182
- onValueChange: se
183
- }
184
- ),
185
- typeof E == "function" ? E(r) : E,
186
- /* @__PURE__ */ t(xe, { children: /* @__PURE__ */ p(
187
- Ce,
188
- {
189
- className: C(
190
- !a.length && "p-0 shadow-none",
191
- "px-0 py-2"
192
- ),
193
- children: [
194
- o && /* @__PURE__ */ t(K, { fullWidth: !0 }),
195
- !o && v && /* @__PURE__ */ t(q, { children: O ? /* @__PURE__ */ p(Q, { className: "flex flex-col gap-3 py-5 px-3 items-center", children: [
196
- /* @__PURE__ */ t("span", { children: J }),
197
- typeof O == "function" ? O(r) : O
198
- ] }) : /* @__PURE__ */ t(Q, { children: J }) }),
199
- !o && !v && /* @__PURE__ */ p(q, { children: [
200
- S && /* @__PURE__ */ t(
201
- we,
202
- {
203
- asChild: !0,
204
- className: "w-full",
205
- children: typeof S == "function" ? S(r) : S
206
- },
207
- "combobox-list-head-action"
208
- ),
209
- B && B(r),
210
- !B && /* @__PURE__ */ t(
211
- Le,
212
- {
213
- searchTerm: l,
214
- value: n,
215
- options: a,
216
- onChangeOption: A,
217
- setOpen: R,
218
- defaultNodeDisabled: Z,
219
- defaultNodeMatched: $,
220
- defaultNodeMuted: ee,
221
- defaultNodeInteractive: te
222
- }
223
- )
224
- ] })
225
- ]
226
- }
227
- ) }),
228
- !o && L && !v && /* @__PURE__ */ t(
229
- "div",
230
- {
231
- "data-slot": "command-footer-wrapper",
232
- ...(() => {
233
- const { bordered: e = !0, ...c } = T?.listFooterAction || {};
234
- return {
235
- ...c,
236
- "data-slot-bordered": JSON.stringify(e)
237
- };
238
- })(),
239
- className: C(
240
- "flex w-full items-center gap-2 px-0",
241
- (T?.listFooterAction?.bordered ?? !0) && "border-t px-0 pt-2",
242
- T?.listFooterAction?.className
243
- ),
244
- children: typeof L == "function" ? L(r) : L
245
- }
246
- )
247
- ] })
142
+ ...n,
143
+ options: d,
144
+ search: g,
145
+ onSearch: V,
146
+ onSelect: b,
147
+ callbackStateParams: S,
148
+ loading: f,
149
+ isEmptyList: L
248
150
  }
249
151
  )
250
152
  ]
@@ -252,6 +154,6 @@ const Ie = (k) => {
252
154
  ) });
253
155
  };
254
156
  export {
255
- He as Combobox
157
+ re as Combobox
256
158
  };
257
159
  //# sourceMappingURL=Combobox.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Combobox.js","sources":["../../src/Combobox/Combobox.tsx"],"sourcesContent":["import {\n Dispatch,\n SetStateAction,\n useCallback,\n useEffect, useImperativeHandle,\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 { ChevronDown, X } from 'lucide-react';\nimport {\n ComboboxCallbackStateParams,\n ComboboxOption,\n ComboboxProps,\n} from './Combobox.types';\nimport { ComboboxOptions } from './ComboboxOptions';\n\n// TODO: refactor next component | nlt code\nconst getSelectRenderLabel = <Data extends object>(params: {\n value: ComboboxProps<Data>['value'];\n flattenOptions: ComboboxOption<Data>[];\n selectedOption?: ComboboxOption<Data>;\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 = <Data extends object, >(props: ComboboxProps<Data>) => {\n const {\n ref,\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 listFooterAction,\n slotProps = {},\n onMount,\n defaultNodeDisabled,\n defaultNodeMatched,\n defaultNodeMuted,\n defaultNodeInteractive,\n renderTrigger,\n renderList,\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<Data>>();\n const [ loading, setLoading ] = useState(false);\n\n const [ options, setOptionsDispatch ] = 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 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<Data>[] = 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<Data>) => {\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<Data> => {\n return {\n options,\n setOptions,\n selectedOption,\n setSelectedOption,\n search: searchTerm || '',\n setSearch: setSearchTerm,\n onChangeOption,\n open,\n setOpen,\n loading,\n setLoading,\n isEmptyList,\n isSearchedEmptyList,\n placeholder\n };\n }, [ placeholder, loading, open, options, searchTerm, selectedOption, isEmptyList, isSearchedEmptyList, setOptions, onChangeOption ]);\n useImperativeHandle(ref, () => comboboxCallbackStateParams, [comboboxCallbackStateParams]);\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\">\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 variant={renderTrigger ? 'none' : 'contained'}\n color='secondary'\n role=\"combobox\"\n aria-expanded={open}\n className={cn(\n 'relative w-full justify-between bg-transparent',\n !renderTrigger && 'font-normal text-sm',\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 renderTrigger && 'p-0',\n renderTrigger && open && 'p-0 border-1 ring-0 ring-transparent',\n )}\n disabled={disabled || initialLoading}\n >\n {initialLoading && <LoadingMask fullWidth/>}\n {!initialLoading && renderTrigger && renderTrigger(comboboxCallbackStateParams)}\n {!initialLoading && !renderTrigger && (\n <>\n <span\n 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 <ChevronDown className=\"opacity-50 w-4 h-4\"/>\n )}\n </>\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"w-(--radix-popper-anchor-width) max-w-none p-2\"\n )}\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(\n !options.length && 'p-0 shadow-none',\n 'px-0 py-2',\n )}\n >\n {loading && <LoadingMask fullWidth/>}\n {!loading && isEmptyList && (\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 && !isEmptyList && (\n <>\n {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 {renderList && renderList(comboboxCallbackStateParams)}\n {!renderList && (\n <ComboboxOptions\n searchTerm={searchTerm}\n value={value}\n options={options}\n onChangeOption={onChangeOption}\n setOpen={setOpen}\n defaultNodeDisabled={defaultNodeDisabled}\n defaultNodeMatched={defaultNodeMatched}\n defaultNodeMuted={defaultNodeMuted}\n defaultNodeInteractive={defaultNodeInteractive}\n />\n )}\n </>\n )}\n </CommandGroup>\n </CommandList>\n\n {/*LIST FOOTER ACTION*/}\n {!loading && listFooterAction && !isEmptyList && (\n <div\n data-slot=\"command-footer-wrapper\"\n {...((() => {\n const { bordered = true, ...rest } = slotProps?.listFooterAction || {};\n return {\n ...rest,\n 'data-slot-bordered': JSON.stringify(bordered)\n }\n })())}\n className={cn(\n \"flex w-full items-center gap-2 px-0\",\n (slotProps?.listFooterAction?.bordered ?? true) && 'border-t px-0 pt-2',\n slotProps?.listFooterAction?.className,\n )}\n >\n {typeof listFooterAction === 'function'\n ? listFooterAction(comboboxCallbackStateParams)\n : listFooterAction}\n </div>\n )}\n </Command>\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n"],"names":["getSelectRenderLabel","params","value","flattenOptions","selectedOption","label","o","Combobox","props","ref","onChange","placeholder","disabled","searchLabel","fetchOptions","itemOptions","emptyLabel","emptyAction","commandInputAction","listHeadAction","listFooterAction","slotProps","onMount","defaultNodeDisabled","defaultNodeMatched","defaultNodeMuted","defaultNodeInteractive","renderTrigger","renderList","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","useImperativeHandle","runOnMount","useLayoutEffect","jsx","jsxs","Popover","newOpen","PopoverTrigger","Button","cn","LoadingMask","Fragment","X","ChevronDown","PopoverContent","Command","CommandInput","CommandList","CommandGroup","CommandEmpty","CommandItem","ComboboxOptions","bordered","rest"],"mappings":"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"}
1
+ {"version":3,"file":"Combobox.js","sources":["../../src/Combobox/Combobox.tsx"],"sourcesContent":["import {\n Dispatch,\n SetStateAction,\n useCallback,\n useEffect, useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useState,\n} from 'react';\nimport { Popover } from '../Popover';\nimport { useDebounceCallback } from '@oneplatformdev/hooks';\nimport {\n ComboboxCallbackStateParams,\n ComboboxOption,\n ComboboxProps, MultiCComboboxCallbackStateParams, SingleComboboxCallbackStateParams,\n} from './Combobox.types';\nimport { ComboboxRenderTrigger } from \"./ComboboxRenderTrigger\";\nimport { ComboboxRenderContent } from \"./ComboboxRenderContent\";\n\n// TODO: refactor next component | nlt code\nexport const Combobox = <Data extends object = object, >(props: ComboboxProps<Data>) => {\n const {\n ref,\n value,\n placeholder,\n fetchOptions,\n options: itemOptions,\n onMount,\n } = props;\n\n const [ initialLoading, setInitialLoading ] = useState(false);\n const [ loading, setLoading ] = 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 useEffect(() => {\n itemOptions?.length && setOptions(itemOptions);\n }, [ itemOptions ]);\n\n const handlePopoverOpen = useCallback(async (next: boolean) => {\n setOpen(next);\n if(next) {\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 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<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 handleClearSelections = useCallback(() => {\n props.onChange(undefined);\n setSelectedOptions(new Map());\n setOpen(false);\n }, [props.onChange]);\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 callbackStateParams =\n useMemo((): ComboboxCallbackStateParams<Data> => {\n\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(props.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 MultiCComboboxCallbackStateParams<Data>;\n }\n\n if(props.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 SingleComboboxCallbackStateParams<Data>;\n }\n\n throw new Error(`Combobox type ${props.type} is not supported`);\n\n }, [ placeholder, loading, open, options, searchTerm, selectedOptions, isEmptyList, isSearchedEmptyList, setOptions, onChangeOption, props.type ]);\n useImperativeHandle(ref, () => callbackStateParams, [callbackStateParams]);\n\n const runOnMount = useCallback(async () => {\n if (!onMount) return;\n setInitialLoading(true);\n try {\n await onMount(callbackStateParams);\n } finally {\n setInitialLoading(false);\n }\n }, [ onMount, callbackStateParams ]);\n useLayoutEffect(() => {\n runOnMount();\n }, []);\n\n return (\n <div className=\"w-full\">\n <Popover\n open={open}\n onOpenChange={handlePopoverOpen}\n >\n <ComboboxRenderTrigger\n {...props}\n open={open}\n initialLoading={initialLoading}\n callbackStateParams={callbackStateParams}\n flattenOptions={flattenOptions}\n onSelect={onChangeOption}\n onClearSelections={handleClearSelections}\n selectedOptions={selectedOptions}\n />\n\n <ComboboxRenderContent\n {...props}\n options={options}\n search={searchTerm}\n onSearch={handleSearchChange}\n onSelect={onChangeOption}\n callbackStateParams={callbackStateParams}\n loading={loading}\n isEmptyList={isEmptyList}\n />\n </Popover>\n </div>\n );\n}\n"],"names":["Combobox","props","ref","value","placeholder","fetchOptions","itemOptions","onMount","initialLoading","setInitialLoading","useState","loading","setLoading","open","setOpen","searchTerm","setSearchTerm","selectedOptions","setSelectedOptions","options","_setOptions","flattenOptions","setFlattenOptions","setOptions","useCallback","stater","flatten","next","res","walk","nodes","node","prev","current","o","prevSelections","nextSelections","vls","v","useEffect","handlePopoverOpen","getData","search","fetchedOptions","error","debouncedGetData","useDebounceCallback","handleSearchChange","onChangeOption","option","isSelected","handleClearSelections","isSearchedEmptyList","useMemo","isEmptyList","callbackStateParams","base","selectedOptionArray","prevSet","prevStateArray","nextStateArray","selectedOption","currentSingle","nextValue","nextMap","useImperativeHandle","runOnMount","useLayoutEffect","jsx","jsxs","Popover","ComboboxRenderTrigger","ComboboxRenderContent"],"mappings":"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"}