@oneplatformdev/ui 0.1.99-beta.251 → 0.1.99-beta.252
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.
- package/CHANGELOG.md +8 -0
- package/Combobox/Combobox.js +193 -158
- package/Combobox/Combobox.js.map +1 -1
- package/Combobox/Combobox.stories.js +152 -107
- package/Combobox/Combobox.stories.js.map +1 -1
- package/Combobox/Combobox.types.d.ts +12 -1
- package/Combobox/Combobox.types.d.ts.map +1 -1
- package/Combobox/Combobox.types.js.map +1 -1
- package/Combobox/ComboboxRenderContent.d.ts +4 -0
- package/Combobox/ComboboxRenderContent.d.ts.map +1 -1
- package/Combobox/ComboboxRenderContent.js +88 -66
- package/Combobox/ComboboxRenderContent.js.map +1 -1
- package/package.json +5 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
## 0.1.99-beta.252 (2026-03-12)
|
|
2
|
+
|
|
3
|
+
### 🧱 Updated Dependencies
|
|
4
|
+
|
|
5
|
+
- Updated @oneplatformdev/utils to 0.1.99-beta.252
|
|
6
|
+
- Updated @oneplatformdev/hooks to 0.1.99-beta.252
|
|
7
|
+
- Updated @oneplatformdev/tokens to 0.1.99-beta.252
|
|
8
|
+
|
|
1
9
|
## 0.1.99-beta.251 (2026-03-11)
|
|
2
10
|
|
|
3
11
|
### 🧱 Updated Dependencies
|
package/Combobox/Combobox.js
CHANGED
|
@@ -1,184 +1,219 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as
|
|
3
|
-
import { Popover as
|
|
4
|
-
import { useDebounceCallback as
|
|
5
|
-
import { DEFAULT_COMBOBOX_TYPE as
|
|
6
|
-
import { ComboboxRenderTrigger as
|
|
7
|
-
import { ComboboxRenderContent as
|
|
8
|
-
function
|
|
1
|
+
import { jsx as j, jsxs as we } from "react/jsx-runtime";
|
|
2
|
+
import { useState as d, useCallback as u, useEffect as Y, useRef as $, useMemo as q, useImperativeHandle as be, useLayoutEffect as Me } from "react";
|
|
3
|
+
import { Popover as Ce } from "../Popover/Popover.js";
|
|
4
|
+
import { useDebounceCallback as Ae } from "@oneplatformdev/hooks";
|
|
5
|
+
import { DEFAULT_COMBOBOX_TYPE as xe } from "./Combobox.types.js";
|
|
6
|
+
import { ComboboxRenderTrigger as Le } from "./ComboboxRenderTrigger.js";
|
|
7
|
+
import { ComboboxRenderContent as Re } from "./ComboboxRenderContent.js";
|
|
8
|
+
function Fe(o) {
|
|
9
9
|
const {
|
|
10
|
-
value:
|
|
11
|
-
options:
|
|
12
|
-
placeholder:
|
|
13
|
-
disabled:
|
|
14
|
-
searchLabel:
|
|
15
|
-
emptyLabel:
|
|
16
|
-
|
|
17
|
-
renderTrigger:
|
|
18
|
-
commandInputAction:
|
|
19
|
-
renderList:
|
|
20
|
-
listHeadAction:
|
|
21
|
-
listFooterAction:
|
|
22
|
-
emptyAction:
|
|
23
|
-
slotProps:
|
|
24
|
-
defaultNodeOpen:
|
|
25
|
-
defaultNodeDisabled:
|
|
26
|
-
defaultNodeMatched:
|
|
27
|
-
defaultNodeMuted:
|
|
28
|
-
defaultNodeInteractive:
|
|
29
|
-
} =
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
if (
|
|
33
|
-
for (const l of
|
|
34
|
-
|
|
10
|
+
value: f,
|
|
11
|
+
options: N,
|
|
12
|
+
placeholder: T,
|
|
13
|
+
disabled: J,
|
|
14
|
+
searchLabel: K,
|
|
15
|
+
emptyLabel: Q,
|
|
16
|
+
loadData: p,
|
|
17
|
+
renderTrigger: W,
|
|
18
|
+
commandInputAction: Z,
|
|
19
|
+
renderList: ee,
|
|
20
|
+
listHeadAction: te,
|
|
21
|
+
listFooterAction: ne,
|
|
22
|
+
emptyAction: oe,
|
|
23
|
+
slotProps: re,
|
|
24
|
+
defaultNodeOpen: ae,
|
|
25
|
+
defaultNodeDisabled: se,
|
|
26
|
+
defaultNodeMatched: ce,
|
|
27
|
+
defaultNodeMuted: ie,
|
|
28
|
+
defaultNodeInteractive: le
|
|
29
|
+
} = o, O = o.type ?? xe, [ue, H] = d(!1), [h, b] = d(!1), [k, A] = d(!1), [M, x] = d(!1), [m, L] = d(""), [S, v] = d(/* @__PURE__ */ new Map()), [y, fe] = d([]), [de, he] = d([]), C = u((t) => {
|
|
30
|
+
const r = (e) => {
|
|
31
|
+
const n = [], s = (c) => {
|
|
32
|
+
if (c)
|
|
33
|
+
for (const l of c)
|
|
34
|
+
n.push(l), l.items && l.items.length && s(l.items);
|
|
35
35
|
};
|
|
36
|
-
|
|
37
|
-
if (!
|
|
38
|
-
const
|
|
39
|
-
if (
|
|
36
|
+
s(e), he((c) => {
|
|
37
|
+
if (!n.find((a) => !!f && String(a.value) === String(f))) {
|
|
38
|
+
const i = ((S.size ? Array.from(S.values()) : void 0) || c).find((_) => !!f && String(_.value) === String(f));
|
|
39
|
+
if (i) return [i, ...n];
|
|
40
40
|
}
|
|
41
|
-
return
|
|
41
|
+
return n;
|
|
42
42
|
});
|
|
43
43
|
};
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
return
|
|
47
|
-
const
|
|
48
|
-
for (const
|
|
49
|
-
if (!
|
|
50
|
-
const
|
|
51
|
-
|
|
44
|
+
fe((e) => {
|
|
45
|
+
const n = typeof t == "function" ? t(e) : t;
|
|
46
|
+
return r(n), v((s) => {
|
|
47
|
+
const c = new Map(s), l = Array.isArray(f) ? f : [f];
|
|
48
|
+
for (const a of l) {
|
|
49
|
+
if (!a || c.has(a)) continue;
|
|
50
|
+
const i = n.find((_) => String(_.value).toLowerCase() === String(a).toLowerCase());
|
|
51
|
+
i && c.set(i.value, i);
|
|
52
52
|
}
|
|
53
|
-
return
|
|
54
|
-
}),
|
|
53
|
+
return c;
|
|
54
|
+
}), n;
|
|
55
55
|
});
|
|
56
|
-
}, [
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}, [
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
trailing: !0
|
|
75
|
-
}), oe = g((e) => {
|
|
76
|
-
C(!0), L(e), ne(e);
|
|
77
|
-
}, []), b = g((e) => {
|
|
78
|
-
n.type === "single" && (S((s) => {
|
|
79
|
-
let t = new Map(s);
|
|
80
|
-
const a = t.has(e.value);
|
|
81
|
-
return t.has(e.value) ? t = /* @__PURE__ */ new Map() : t.set(e.value, e), a ? n.onChange?.(void 0) : n.onChange?.(e.value), t;
|
|
82
|
-
}), M(!1)), n.type === "multi" && S((s) => {
|
|
83
|
-
const t = new Map(s);
|
|
84
|
-
return t.has(e.value) ? t.delete(e.value) : t.set(e.value, e), n.onChange?.(Array.from(t.keys())), t;
|
|
56
|
+
}, [S, f]), [ge, z] = d(0), [P, G] = d(0), F = P < ge;
|
|
57
|
+
Y(() => {
|
|
58
|
+
N?.length && C(N);
|
|
59
|
+
}, [N]);
|
|
60
|
+
const w = $(0), R = $(null), E = u(() => {
|
|
61
|
+
w.current += 1, R.current?.abort();
|
|
62
|
+
const t = new AbortController();
|
|
63
|
+
return R.current = t, { id: w.current, signal: t.signal };
|
|
64
|
+
}, []);
|
|
65
|
+
Y(() => () => R.current?.abort(), []);
|
|
66
|
+
const V = q(() => !!m && !y.length && !h, [h, y.length, m]), B = q(() => !y.length && !h, [h, y.length, m]), I = u((t) => {
|
|
67
|
+
o.type === "single" && (v((r) => {
|
|
68
|
+
let e = new Map(r);
|
|
69
|
+
const n = e.has(t.value);
|
|
70
|
+
return e.has(t.value) ? e = /* @__PURE__ */ new Map() : e.set(t.value, t), n ? o.onChange?.(void 0) : o.onChange?.(t.value), e;
|
|
71
|
+
}), x(!1)), o.type === "multi" && v((r) => {
|
|
72
|
+
const e = new Map(r);
|
|
73
|
+
return e.has(t.value) ? e.delete(t.value) : e.set(t.value, t), o.onChange?.(Array.from(e.keys())), e;
|
|
85
74
|
});
|
|
86
|
-
}, [
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
setOptions: v,
|
|
92
|
-
search: y || "",
|
|
75
|
+
}, [o.type, o.onChange]), g = q(() => {
|
|
76
|
+
const t = {
|
|
77
|
+
options: y,
|
|
78
|
+
setOptions: C,
|
|
79
|
+
search: m || "",
|
|
93
80
|
setSearch: L,
|
|
94
|
-
onChangeOption:
|
|
95
|
-
open:
|
|
96
|
-
setOpen:
|
|
97
|
-
loading:
|
|
98
|
-
setLoading:
|
|
99
|
-
isEmptyList:
|
|
100
|
-
isSearchedEmptyList:
|
|
101
|
-
placeholder:
|
|
102
|
-
},
|
|
103
|
-
if (
|
|
104
|
-
return { ...
|
|
105
|
-
|
|
106
|
-
const l = Array.from(
|
|
107
|
-
return
|
|
81
|
+
onChangeOption: I,
|
|
82
|
+
open: M,
|
|
83
|
+
setOpen: x,
|
|
84
|
+
loading: h,
|
|
85
|
+
setLoading: b,
|
|
86
|
+
isEmptyList: B,
|
|
87
|
+
isSearchedEmptyList: V,
|
|
88
|
+
placeholder: T
|
|
89
|
+
}, r = Array.from(S.values());
|
|
90
|
+
if (O === "multi")
|
|
91
|
+
return { ...t, type: "multi", selectedOption: r, setSelectedOption: (s) => {
|
|
92
|
+
v((c) => {
|
|
93
|
+
const l = Array.from(c.values()), a = typeof s == "function" ? s(l) : s;
|
|
94
|
+
return a ? new Map(a.map((i) => [i.value, i])) : /* @__PURE__ */ new Map();
|
|
108
95
|
});
|
|
109
96
|
} };
|
|
110
|
-
if (
|
|
111
|
-
const
|
|
112
|
-
return { ...
|
|
113
|
-
|
|
114
|
-
const [l] = Array.from(
|
|
115
|
-
return
|
|
97
|
+
if (O === "single") {
|
|
98
|
+
const e = r[0];
|
|
99
|
+
return { ...t, type: "single", selectedOption: e, setSelectedOption: (s) => {
|
|
100
|
+
v((c) => {
|
|
101
|
+
const [l] = Array.from(c.values()), a = typeof s == "function" ? s(l) : s, i = /* @__PURE__ */ new Map();
|
|
102
|
+
return a && i.set(a.value, a), i;
|
|
116
103
|
});
|
|
117
104
|
} };
|
|
118
105
|
}
|
|
119
|
-
throw new Error(`Combobox type ${
|
|
120
|
-
}, [
|
|
121
|
-
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
|
|
106
|
+
throw new Error(`Combobox type ${O} is not supported`);
|
|
107
|
+
}, [T, h, M, y, m, S, B, V, C, I, o.type]);
|
|
108
|
+
be(o.imperativeRef, () => g, [g]);
|
|
109
|
+
const D = u(async (t, r) => {
|
|
110
|
+
const e = await p(t, r, g);
|
|
111
|
+
if (!e) throw new Error("Expected loadData to return data");
|
|
112
|
+
return Array.isArray(e) ? { data: e, total: e.length } : e;
|
|
113
|
+
}, [p, g]), U = u(async (t = "") => {
|
|
114
|
+
if (!p) return;
|
|
115
|
+
const { id: r, signal: e } = E();
|
|
116
|
+
try {
|
|
117
|
+
b(!0), A(!1);
|
|
118
|
+
const n = await D({ search: t }, e);
|
|
119
|
+
if (r !== w.current) return;
|
|
120
|
+
C(n.data), z(n.total), G(n.data.length);
|
|
121
|
+
} catch (n) {
|
|
122
|
+
console.error("Unexpected error while get option:", n);
|
|
123
|
+
} finally {
|
|
124
|
+
r === w.current && b(!1);
|
|
125
|
+
}
|
|
126
|
+
}, [E, D, p]), me = u(async () => {
|
|
127
|
+
if (!p || !F || h || k) return;
|
|
128
|
+
const { id: t, signal: r } = E();
|
|
129
|
+
try {
|
|
130
|
+
A(!0);
|
|
131
|
+
const e = await D(
|
|
132
|
+
{ search: m, offset: P },
|
|
133
|
+
r
|
|
134
|
+
);
|
|
135
|
+
C((n) => [...n, ...e.data]), z(e.total), G((n) => n + e.data.length);
|
|
136
|
+
} catch (e) {
|
|
137
|
+
console.error("Unexpected error while load more option:", e);
|
|
138
|
+
} finally {
|
|
139
|
+
t === w.current && A(!1);
|
|
140
|
+
}
|
|
141
|
+
}, [E, D, F, p, h, k, P, m]), ye = Ae(U, 600, {
|
|
142
|
+
leading: !1,
|
|
143
|
+
trailing: !0
|
|
144
|
+
}), pe = u((t) => {
|
|
145
|
+
b(!0), L(t), ye(t);
|
|
146
|
+
}, []), Oe = u(() => {
|
|
147
|
+
o.onChange(void 0), v(/* @__PURE__ */ new Map()), x(!1);
|
|
148
|
+
}, [o.onChange]), X = u(() => {
|
|
149
|
+
R.current?.abort(), w.current += 1, L(""), b(!1), A(!1);
|
|
150
|
+
}, []), Se = u(async (t) => {
|
|
151
|
+
if (x(t), !t) return X();
|
|
152
|
+
U(), L("");
|
|
153
|
+
}, [X, U]), ve = u(async () => {
|
|
154
|
+
if (o.onMount) {
|
|
155
|
+
H(!0);
|
|
125
156
|
try {
|
|
126
|
-
|
|
157
|
+
O === "multi" ? await o.onMount?.(g) : await o.onMount?.(g);
|
|
127
158
|
} finally {
|
|
128
|
-
|
|
159
|
+
H(!1);
|
|
129
160
|
}
|
|
130
161
|
}
|
|
131
|
-
}, [
|
|
132
|
-
return
|
|
133
|
-
|
|
134
|
-
}, []), /* @__PURE__ */
|
|
135
|
-
|
|
162
|
+
}, [o.onMount, g]);
|
|
163
|
+
return Me(() => {
|
|
164
|
+
ve();
|
|
165
|
+
}, []), /* @__PURE__ */ j("div", { className: "w-full", children: /* @__PURE__ */ we(
|
|
166
|
+
Ce,
|
|
136
167
|
{
|
|
137
|
-
open:
|
|
138
|
-
onOpenChange:
|
|
168
|
+
open: M,
|
|
169
|
+
onOpenChange: Se,
|
|
139
170
|
children: [
|
|
140
|
-
/* @__PURE__ */
|
|
141
|
-
|
|
171
|
+
/* @__PURE__ */ j(
|
|
172
|
+
Le,
|
|
142
173
|
{
|
|
143
|
-
value:
|
|
144
|
-
type:
|
|
145
|
-
open:
|
|
146
|
-
initialLoading:
|
|
147
|
-
selectedOptions:
|
|
148
|
-
flattenOptions:
|
|
149
|
-
onSelect:
|
|
150
|
-
onClearSelections:
|
|
151
|
-
callbackStateParams:
|
|
152
|
-
renderTrigger:
|
|
153
|
-
placeholder:
|
|
154
|
-
disabled:
|
|
174
|
+
value: f,
|
|
175
|
+
type: O,
|
|
176
|
+
open: M,
|
|
177
|
+
initialLoading: ue,
|
|
178
|
+
selectedOptions: S,
|
|
179
|
+
flattenOptions: de,
|
|
180
|
+
onSelect: I,
|
|
181
|
+
onClearSelections: Oe,
|
|
182
|
+
callbackStateParams: g,
|
|
183
|
+
renderTrigger: W,
|
|
184
|
+
placeholder: T,
|
|
185
|
+
disabled: J
|
|
155
186
|
}
|
|
156
187
|
),
|
|
157
|
-
/* @__PURE__ */
|
|
158
|
-
|
|
188
|
+
/* @__PURE__ */ j(
|
|
189
|
+
Re,
|
|
159
190
|
{
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
191
|
+
open: M,
|
|
192
|
+
value: f,
|
|
193
|
+
type: O,
|
|
194
|
+
options: y,
|
|
195
|
+
search: m,
|
|
196
|
+
onSearch: pe,
|
|
197
|
+
onSelect: I,
|
|
198
|
+
onLoadMore: me,
|
|
199
|
+
hasNext: F,
|
|
200
|
+
loading: h,
|
|
201
|
+
loadingMore: k,
|
|
202
|
+
isEmptyList: B,
|
|
203
|
+
callbackStateParams: g,
|
|
204
|
+
commandInputAction: Z,
|
|
205
|
+
renderList: ee,
|
|
206
|
+
listHeadAction: te,
|
|
207
|
+
listFooterAction: ne,
|
|
208
|
+
emptyAction: oe,
|
|
209
|
+
slotProps: re,
|
|
210
|
+
searchLabel: K,
|
|
211
|
+
emptyLabel: Q,
|
|
212
|
+
defaultNodeOpen: ae,
|
|
213
|
+
defaultNodeDisabled: se,
|
|
214
|
+
defaultNodeMatched: ce,
|
|
215
|
+
defaultNodeMuted: ie,
|
|
216
|
+
defaultNodeInteractive: le
|
|
182
217
|
}
|
|
183
218
|
)
|
|
184
219
|
]
|
|
@@ -186,6 +221,6 @@ function we(n) {
|
|
|
186
221
|
) });
|
|
187
222
|
}
|
|
188
223
|
export {
|
|
189
|
-
|
|
224
|
+
Fe as Combobox
|
|
190
225
|
};
|
|
191
226
|
//# sourceMappingURL=Combobox.js.map
|
package/Combobox/Combobox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,\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 fetchOptions,\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 } = 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\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 = 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\n }, [ placeholder, loading, open, options, searchTerm, selectedOptions, isEmptyList, isSearchedEmptyList, setOptions, onChangeOption, props.type ]);\n useImperativeHandle(props.imperativeRef, () => callbackStateParams, [callbackStateParams]);\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 >\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 value={value}\n type={type}\n options={options}\n search={searchTerm}\n onSearch={handleSearchChange}\n onSelect={onChangeOption}\n loading={loading}\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 />\n </Popover>\n </div>\n );\n}\n"],"names":["Combobox","props","value","itemOptions","placeholder","disabled","searchLabel","emptyLabel","fetchOptions","renderTrigger","commandInputAction","renderList","listHeadAction","listFooterAction","emptyAction","slotProps","defaultNodeOpen","defaultNodeDisabled","defaultNodeMatched","defaultNodeMuted","defaultNodeInteractive","type","DEFAULT_COMBOBOX_TYPE","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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"}
|
|
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 } = 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 >\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 />\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","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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"}
|