@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.
- package/CHANGELOG.md +32 -0
- package/Combobox/Combobox.d.ts +1 -1
- package/Combobox/Combobox.d.ts.map +1 -1
- package/Combobox/Combobox.js +130 -228
- package/Combobox/Combobox.js.map +1 -1
- package/Combobox/Combobox.stories.js +113 -80
- package/Combobox/Combobox.stories.js.map +1 -1
- package/Combobox/Combobox.types.d.ts +35 -13
- package/Combobox/Combobox.types.d.ts.map +1 -1
- package/Combobox/Combobox.types.js +4 -1
- package/Combobox/Combobox.types.js.map +1 -1
- package/Combobox/ComboboxOptionItem.d.ts +1 -0
- package/Combobox/ComboboxOptionItem.d.ts.map +1 -1
- package/Combobox/ComboboxOptionItem.js +67 -38
- package/Combobox/ComboboxOptionItem.js.map +1 -1
- package/Combobox/ComboboxRenderContent.d.ts +13 -0
- package/Combobox/ComboboxRenderContent.d.ts.map +1 -0
- package/Combobox/ComboboxRenderContent.js +118 -0
- package/Combobox/ComboboxRenderContent.js.map +1 -0
- package/Combobox/{ComboboxOptions.d.ts → ComboboxRenderOptions.d.ts} +2 -2
- package/Combobox/ComboboxRenderOptions.d.ts.map +1 -0
- package/Combobox/ComboboxRenderOptions.js +53 -0
- package/Combobox/ComboboxRenderOptions.js.map +1 -0
- package/Combobox/ComboboxRenderTrigger.d.ts +13 -0
- package/Combobox/ComboboxRenderTrigger.d.ts.map +1 -0
- package/Combobox/ComboboxRenderTrigger.js +120 -0
- package/Combobox/ComboboxRenderTrigger.js.map +1 -0
- package/FormCombobox/FormCombobox.js +10 -10
- package/FormCombobox/FormCombobox.js.map +1 -1
- package/ScrollArea/ScrollArea.d.ts +5 -1
- package/ScrollArea/ScrollArea.d.ts.map +1 -1
- package/ScrollArea/ScrollArea.js +23 -17
- package/ScrollArea/ScrollArea.js.map +1 -1
- package/package.json +4 -4
- package/Combobox/ComboboxOptions.d.ts.map +0 -1
- package/Combobox/ComboboxOptions.js +0 -75
- 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
|
package/Combobox/Combobox.d.ts
CHANGED
|
@@ -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":"
|
|
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"}
|
package/Combobox/Combobox.js
CHANGED
|
@@ -1,250 +1,152 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as
|
|
3
|
-
import {
|
|
4
|
-
import "
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
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:
|
|
21
|
-
value:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
49
|
-
if (!
|
|
50
|
-
const
|
|
51
|
-
if (
|
|
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
|
|
27
|
+
return a;
|
|
54
28
|
});
|
|
55
29
|
};
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
return
|
|
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
|
-
}, [
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}, [
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
},
|
|
67
|
-
|
|
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
|
|
70
|
-
|
|
71
|
-
} catch (
|
|
72
|
-
console.error("Unexpected error while get option:",
|
|
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
|
-
|
|
56
|
+
O(!1);
|
|
75
57
|
}
|
|
76
|
-
}, [
|
|
58
|
+
}, [v]), U = X(P, 1e3, {
|
|
77
59
|
leading: !1,
|
|
78
60
|
trailing: !0
|
|
79
|
-
}),
|
|
80
|
-
|
|
81
|
-
}, []),
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
|
112
|
+
await M(S);
|
|
107
113
|
} finally {
|
|
108
|
-
|
|
114
|
+
D(!1);
|
|
109
115
|
}
|
|
110
116
|
}
|
|
111
|
-
}, [
|
|
112
|
-
return
|
|
113
|
-
|
|
114
|
-
}, []), /* @__PURE__ */
|
|
115
|
-
|
|
117
|
+
}, [M, S]);
|
|
118
|
+
return Q(() => {
|
|
119
|
+
$();
|
|
120
|
+
}, []), /* @__PURE__ */ k("div", { className: "w-full", children: /* @__PURE__ */ q(
|
|
121
|
+
W,
|
|
116
122
|
{
|
|
117
|
-
open:
|
|
118
|
-
onOpenChange:
|
|
119
|
-
R(e), e && ae();
|
|
120
|
-
},
|
|
123
|
+
open: C,
|
|
124
|
+
onOpenChange: N,
|
|
121
125
|
children: [
|
|
122
|
-
/* @__PURE__ */
|
|
123
|
-
|
|
126
|
+
/* @__PURE__ */ k(
|
|
127
|
+
Y,
|
|
124
128
|
{
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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__ */
|
|
170
|
-
|
|
138
|
+
),
|
|
139
|
+
/* @__PURE__ */ k(
|
|
140
|
+
Z,
|
|
171
141
|
{
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
|
|
157
|
+
re as Combobox
|
|
256
158
|
};
|
|
257
159
|
//# 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,\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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"}
|