@egose/shadcn-theme 0.1.6 → 0.1.8
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/chunk-ELSPE6GB.mjs +43 -0
- package/chunk-ELSPE6GB.mjs.map +1 -0
- package/{chunk-3ZN766EW.js → chunk-G6WKPZTL.js} +3 -3
- package/{chunk-3ZN766EW.js.map → chunk-G6WKPZTL.js.map} +1 -1
- package/{chunk-AJLAS62X.js → chunk-LAIO3QZX.js} +4 -4
- package/{chunk-AJLAS62X.js.map → chunk-LAIO3QZX.js.map} +1 -1
- package/{chunk-MJT6B7OJ.js → chunk-LPDYWZN6.js} +3 -3
- package/{chunk-MJT6B7OJ.js.map → chunk-LPDYWZN6.js.map} +1 -1
- package/chunk-NCJI2DCV.mjs +130 -0
- package/chunk-NCJI2DCV.mjs.map +1 -0
- package/chunk-P6L4JTWO.js +44 -0
- package/chunk-P6L4JTWO.js.map +1 -0
- package/{chunk-432PQWGO.mjs → chunk-RJVQU443.mjs} +2 -2
- package/{components/ui/extension/multi-select.mjs → chunk-RNKMPQDZ.mjs} +66 -64
- package/chunk-RNKMPQDZ.mjs.map +1 -0
- package/chunk-RSFL2TUC.mjs +82 -0
- package/chunk-RSFL2TUC.mjs.map +1 -0
- package/chunk-S6HQ25BZ.js +83 -0
- package/chunk-S6HQ25BZ.js.map +1 -0
- package/chunk-WK4MG4VT.js +131 -0
- package/chunk-WK4MG4VT.js.map +1 -0
- package/{components/ui/extension/multi-select.js → chunk-WXEEDLLR.js} +78 -76
- package/chunk-WXEEDLLR.js.map +1 -0
- package/{chunk-HKZRXGJ7.mjs → chunk-YDRPNCWF.mjs} +4 -4
- package/{chunk-ZMMYQNQV.mjs → chunk-ZFBUIBJH.mjs} +2 -2
- package/components/form/hook-multi-select.d.mts +14 -0
- package/components/form/hook-multi-select.d.ts +14 -0
- package/components/form/hook-multi-select.js +76 -0
- package/components/form/hook-multi-select.js.map +1 -0
- package/components/form/hook-multi-select.mjs +75 -0
- package/components/form/hook-multi-select.mjs.map +1 -0
- package/components/form/hook-searchable-select.js +5 -5
- package/components/form/hook-searchable-select.mjs +4 -4
- package/components/form/hook-tag-picker.d.mts +12 -0
- package/components/form/hook-tag-picker.d.ts +12 -0
- package/components/form/hook-tag-picker.js +66 -0
- package/components/form/hook-tag-picker.js.map +1 -0
- package/components/form/hook-tag-picker.mjs +65 -0
- package/components/form/hook-tag-picker.mjs.map +1 -0
- package/components/form/multi-select.d.mts +25 -1
- package/components/form/multi-select.d.ts +25 -1
- package/components/form/multi-select.js +20 -1
- package/components/form/multi-select.js.map +1 -1
- package/components/form/multi-select.mjs +19 -0
- package/components/form/searchable-select.js +5 -5
- package/components/form/searchable-select.mjs +4 -4
- package/components/form/tag-picker.d.mts +21 -0
- package/components/form/tag-picker.d.ts +21 -0
- package/components/form/tag-picker.js +14 -0
- package/components/form/tag-picker.js.map +1 -0
- package/components/form/tag-picker.mjs +13 -0
- package/components/form/tag-picker.mjs.map +1 -0
- package/components/ui/combobox.js +5 -5
- package/components/ui/combobox.mjs +2 -2
- package/components/ui/command.js +4 -4
- package/components/ui/command.mjs +3 -3
- package/components/ui/input-group.js +3 -3
- package/components/ui/input-group.mjs +2 -2
- package/components/ui/multi-select.d.mts +54 -0
- package/components/ui/multi-select.d.ts +54 -0
- package/components/ui/multi-select.js +29 -0
- package/components/ui/multi-select.js.map +1 -0
- package/components/ui/multi-select.mjs +28 -0
- package/components/ui/multi-select.mjs.map +1 -0
- package/components/ui/tag-picker.d.mts +14 -0
- package/components/ui/tag-picker.d.ts +14 -0
- package/components/ui/tag-picker.js +12 -0
- package/components/ui/tag-picker.js.map +1 -0
- package/components/ui/tag-picker.mjs +11 -0
- package/components/ui/tag-picker.mjs.map +1 -0
- package/components/widgets/dialog-manager/index.js +1 -1
- package/components/widgets/dialog-manager/index.js.map +1 -1
- package/components/widgets/dialog-manager/index.mjs +1 -1
- package/layouts/sidebar1/app-sidebar.js +2 -2
- package/layouts/sidebar1/app-sidebar.mjs +2 -2
- package/layouts/sidebar1/context-switcher.js +1 -1
- package/layouts/sidebar1/context-switcher.mjs +1 -1
- package/layouts/sidebar1/index.js +3 -3
- package/layouts/sidebar1/index.js.map +1 -1
- package/layouts/sidebar1/index.mjs +3 -3
- package/layouts/sidebar1/nav-menus.js +1 -1
- package/layouts/sidebar1/nav-menus.mjs +1 -1
- package/layouts/sidebar1/nav-user.js +2 -2
- package/layouts/sidebar1/nav-user.mjs +2 -2
- package/layouts/simple/index.js +2 -2
- package/layouts/simple/index.mjs +3 -3
- package/package.json +1 -1
- package/components/ui/extension/multi-select.d.mts +0 -53
- package/components/ui/extension/multi-select.d.ts +0 -53
- package/components/ui/extension/multi-select.js.map +0 -1
- package/components/ui/extension/multi-select.mjs.map +0 -1
- /package/{chunk-432PQWGO.mjs.map → chunk-RJVQU443.mjs.map} +0 -0
- /package/{chunk-HKZRXGJ7.mjs.map → chunk-YDRPNCWF.mjs.map} +0 -0
- /package/{chunk-ZMMYQNQV.mjs.map → chunk-ZFBUIBJH.mjs.map} +0 -0
|
@@ -1,32 +1,26 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import {
|
|
3
|
-
Badge
|
|
4
|
-
} from "../../../chunk-WIISPZZE.mjs";
|
|
5
1
|
import {
|
|
6
2
|
Command,
|
|
7
3
|
CommandEmpty,
|
|
8
4
|
CommandItem,
|
|
9
5
|
CommandList
|
|
10
|
-
} from "
|
|
11
|
-
import
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import "../../../chunk-YQENFZOY.mjs";
|
|
15
|
-
import "../../../chunk-7BYWDRRI.mjs";
|
|
16
|
-
import "../../../chunk-3GHC4JQU.mjs";
|
|
6
|
+
} from "./chunk-ZFBUIBJH.mjs";
|
|
7
|
+
import {
|
|
8
|
+
Badge
|
|
9
|
+
} from "./chunk-WIISPZZE.mjs";
|
|
17
10
|
import {
|
|
18
11
|
cn
|
|
19
|
-
} from "
|
|
12
|
+
} from "./chunk-KGUUDFJE.mjs";
|
|
20
13
|
import {
|
|
21
14
|
__objRest,
|
|
22
15
|
__spreadProps,
|
|
23
16
|
__spreadValues
|
|
24
|
-
} from "
|
|
17
|
+
} from "./chunk-YOSPWY5K.mjs";
|
|
25
18
|
|
|
26
|
-
// components/ui/
|
|
27
|
-
import
|
|
19
|
+
// components/ui/multi-select.tsx
|
|
20
|
+
import * as React from "react";
|
|
21
|
+
import { IconCheck, IconX } from "@tabler/icons-react";
|
|
28
22
|
import { Command as CommandPrimitive } from "cmdk";
|
|
29
|
-
import
|
|
23
|
+
import { createContext, forwardRef, useCallback, useContext, useState } from "react";
|
|
30
24
|
var MultiSelectContext = createContext(null);
|
|
31
25
|
var useMultiSelect = () => {
|
|
32
26
|
const context = useContext(MultiSelectContext);
|
|
@@ -50,14 +44,16 @@ var MultiSelector = (_a) => {
|
|
|
50
44
|
loop = false,
|
|
51
45
|
className,
|
|
52
46
|
children,
|
|
53
|
-
dir
|
|
47
|
+
dir,
|
|
48
|
+
disabled = false
|
|
54
49
|
} = _b, props = __objRest(_b, [
|
|
55
50
|
"values",
|
|
56
51
|
"onValuesChange",
|
|
57
52
|
"loop",
|
|
58
53
|
"className",
|
|
59
54
|
"children",
|
|
60
|
-
"dir"
|
|
55
|
+
"dir",
|
|
56
|
+
"disabled"
|
|
61
57
|
]);
|
|
62
58
|
const [inputValue, setInputValue] = useState("");
|
|
63
59
|
const [open, setOpen] = useState(false);
|
|
@@ -65,20 +61,21 @@ var MultiSelector = (_a) => {
|
|
|
65
61
|
const inputRef = React.useRef(null);
|
|
66
62
|
const onValueChangeHandler = useCallback(
|
|
67
63
|
(val) => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
64
|
+
if (disabled) return;
|
|
65
|
+
const exists = value.some((currentValue) => currentValue.value === val.value);
|
|
66
|
+
if (exists) {
|
|
67
|
+
onValueChange(value.filter((currentValue) => currentValue.value !== val.value));
|
|
71
68
|
} else {
|
|
72
69
|
onValueChange([...value, val]);
|
|
73
70
|
}
|
|
74
71
|
},
|
|
75
|
-
|
|
76
|
-
[value]
|
|
72
|
+
[disabled, onValueChange, value]
|
|
77
73
|
);
|
|
78
74
|
const handleKeyDown = useCallback(
|
|
79
75
|
(e) => {
|
|
80
76
|
var _a2, _b2;
|
|
81
77
|
e.stopPropagation();
|
|
78
|
+
if (disabled) return;
|
|
82
79
|
const target = inputRef.current;
|
|
83
80
|
if (!target) return;
|
|
84
81
|
const selectionStart = (_a2 = target.selectionStart) != null ? _a2 : 0;
|
|
@@ -104,10 +101,8 @@ var MultiSelector = (_a) => {
|
|
|
104
101
|
if (value.length > 0 && (activeIndex !== -1 || loop)) {
|
|
105
102
|
moveNext();
|
|
106
103
|
}
|
|
107
|
-
} else {
|
|
108
|
-
|
|
109
|
-
movePrev();
|
|
110
|
-
}
|
|
104
|
+
} else if (value.length > 0 && target.selectionStart === 0) {
|
|
105
|
+
movePrev();
|
|
111
106
|
}
|
|
112
107
|
break;
|
|
113
108
|
case "ArrowRight":
|
|
@@ -115,10 +110,8 @@ var MultiSelector = (_a) => {
|
|
|
115
110
|
if (value.length > 0 && target.selectionStart === 0) {
|
|
116
111
|
movePrev();
|
|
117
112
|
}
|
|
118
|
-
} else {
|
|
119
|
-
|
|
120
|
-
moveNext();
|
|
121
|
-
}
|
|
113
|
+
} else if (value.length > 0 && (activeIndex !== -1 || loop)) {
|
|
114
|
+
moveNext();
|
|
122
115
|
}
|
|
123
116
|
break;
|
|
124
117
|
case "Backspace":
|
|
@@ -127,10 +120,8 @@ var MultiSelector = (_a) => {
|
|
|
127
120
|
if (activeIndex !== -1 && activeIndex < value.length) {
|
|
128
121
|
onValueChangeHandler(value[activeIndex]);
|
|
129
122
|
moveCurrent();
|
|
130
|
-
} else {
|
|
131
|
-
|
|
132
|
-
onValueChangeHandler(value[value.length - 1]);
|
|
133
|
-
}
|
|
123
|
+
} else if (target.selectionStart === 0) {
|
|
124
|
+
onValueChangeHandler(value[value.length - 1]);
|
|
134
125
|
}
|
|
135
126
|
}
|
|
136
127
|
break;
|
|
@@ -147,7 +138,7 @@ var MultiSelector = (_a) => {
|
|
|
147
138
|
break;
|
|
148
139
|
}
|
|
149
140
|
},
|
|
150
|
-
[
|
|
141
|
+
[activeIndex, dir, disabled, loop, onValueChangeHandler, open, value]
|
|
151
142
|
);
|
|
152
143
|
return /* @__PURE__ */ React.createElement(
|
|
153
144
|
MultiSelectContext.Provider,
|
|
@@ -161,14 +152,15 @@ var MultiSelector = (_a) => {
|
|
|
161
152
|
setInputValue,
|
|
162
153
|
activeIndex,
|
|
163
154
|
setActiveIndex,
|
|
164
|
-
ref: inputRef
|
|
155
|
+
ref: inputRef,
|
|
156
|
+
disabled
|
|
165
157
|
}
|
|
166
158
|
},
|
|
167
159
|
/* @__PURE__ */ React.createElement(
|
|
168
160
|
Command,
|
|
169
161
|
__spreadValues({
|
|
170
162
|
onKeyDown: handleKeyDown,
|
|
171
|
-
className: cn("
|
|
163
|
+
className: cn("flex flex-col overflow-visible bg-transparent", className),
|
|
172
164
|
dir
|
|
173
165
|
}, props),
|
|
174
166
|
children
|
|
@@ -178,7 +170,7 @@ var MultiSelector = (_a) => {
|
|
|
178
170
|
var MultiSelectorTrigger = forwardRef(
|
|
179
171
|
(_a, ref) => {
|
|
180
172
|
var _b = _a, { className, children } = _b, props = __objRest(_b, ["className", "children"]);
|
|
181
|
-
const { value, onValueChange, activeIndex } = useMultiSelect();
|
|
173
|
+
const { value, onValueChange, activeIndex, disabled } = useMultiSelect();
|
|
182
174
|
const mousePreventDefault = useCallback((e) => {
|
|
183
175
|
e.preventDefault();
|
|
184
176
|
e.stopPropagation();
|
|
@@ -188,10 +180,9 @@ var MultiSelectorTrigger = forwardRef(
|
|
|
188
180
|
__spreadValues({
|
|
189
181
|
ref,
|
|
190
182
|
className: cn(
|
|
191
|
-
"flex flex-wrap gap-1
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
},
|
|
183
|
+
"flex flex-wrap gap-1 rounded-lg border bg-background px-2 py-1",
|
|
184
|
+
activeIndex === -1 && "focus-within:ring-1 focus-within:ring-ring",
|
|
185
|
+
disabled && "cursor-not-allowed opacity-60",
|
|
195
186
|
className
|
|
196
187
|
)
|
|
197
188
|
}, props),
|
|
@@ -200,8 +191,8 @@ var MultiSelectorTrigger = forwardRef(
|
|
|
200
191
|
{
|
|
201
192
|
key: item.value,
|
|
202
193
|
className: cn(
|
|
203
|
-
"
|
|
204
|
-
activeIndex === index && "ring-2 ring-muted-foreground
|
|
194
|
+
"flex items-center gap-1 rounded-md px-1.5",
|
|
195
|
+
activeIndex === index && "ring-2 ring-muted-foreground"
|
|
205
196
|
),
|
|
206
197
|
variant: "secondary"
|
|
207
198
|
},
|
|
@@ -209,14 +200,19 @@ var MultiSelectorTrigger = forwardRef(
|
|
|
209
200
|
/* @__PURE__ */ React.createElement(
|
|
210
201
|
"button",
|
|
211
202
|
{
|
|
212
|
-
"aria-label": `Remove ${item} option`,
|
|
213
|
-
"aria-roledescription": "button to remove option",
|
|
203
|
+
"aria-label": `Remove ${item.label} option`,
|
|
214
204
|
type: "button",
|
|
205
|
+
disabled,
|
|
215
206
|
onMouseDown: mousePreventDefault,
|
|
216
|
-
onClick: () =>
|
|
207
|
+
onClick: (event) => {
|
|
208
|
+
event.preventDefault();
|
|
209
|
+
event.stopPropagation();
|
|
210
|
+
onValueChange(item);
|
|
211
|
+
},
|
|
212
|
+
className: "inline-flex cursor-pointer items-center justify-center rounded-md p-1 transition-colors hover:bg-red-50 hover:text-red-700 focus-visible:bg-red-100 focus-visible:outline-none disabled:cursor-not-allowed"
|
|
217
213
|
},
|
|
218
214
|
/* @__PURE__ */ React.createElement("span", { className: "sr-only" }, "Remove ", item.label, " option"),
|
|
219
|
-
/* @__PURE__ */ React.createElement(IconX, { className: "h-
|
|
215
|
+
/* @__PURE__ */ React.createElement(IconX, { className: "h-3.5 w-3.5" })
|
|
220
216
|
)
|
|
221
217
|
)),
|
|
222
218
|
children
|
|
@@ -225,14 +221,15 @@ var MultiSelectorTrigger = forwardRef(
|
|
|
225
221
|
);
|
|
226
222
|
MultiSelectorTrigger.displayName = "MultiSelectorTrigger";
|
|
227
223
|
var MultiSelectorInput = forwardRef((_a, ref) => {
|
|
228
|
-
var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
|
|
229
|
-
const { setOpen, inputValue, setInputValue, activeIndex, setActiveIndex, ref: inputRef } = useMultiSelect();
|
|
224
|
+
var _b = _a, { className, disabled: disabledProp } = _b, props = __objRest(_b, ["className", "disabled"]);
|
|
225
|
+
const { setOpen, inputValue, setInputValue, activeIndex, setActiveIndex, ref: inputRef, disabled } = useMultiSelect();
|
|
230
226
|
return /* @__PURE__ */ React.createElement(
|
|
231
227
|
CommandPrimitive.Input,
|
|
232
228
|
__spreadProps(__spreadValues({}, props), {
|
|
233
229
|
tabIndex: 0,
|
|
234
230
|
ref: inputRef,
|
|
235
231
|
value: inputValue,
|
|
232
|
+
disabled: disabled || disabledProp,
|
|
236
233
|
onValueChange: activeIndex === -1 ? setInputValue : void 0,
|
|
237
234
|
onBlur: () => {
|
|
238
235
|
setInputValue("");
|
|
@@ -241,7 +238,7 @@ var MultiSelectorInput = forwardRef((_a, ref) => {
|
|
|
241
238
|
onFocus: () => setOpen(true),
|
|
242
239
|
onClick: () => setActiveIndex(-1),
|
|
243
240
|
className: cn(
|
|
244
|
-
"
|
|
241
|
+
"flex-1 border-none bg-transparent p-0 text-sm outline-none placeholder:text-muted-foreground focus:outline-none focus:ring-0",
|
|
245
242
|
className,
|
|
246
243
|
activeIndex !== -1 && "caret-transparent"
|
|
247
244
|
)
|
|
@@ -251,7 +248,8 @@ var MultiSelectorInput = forwardRef((_a, ref) => {
|
|
|
251
248
|
MultiSelectorInput.displayName = "MultiSelectorInput";
|
|
252
249
|
var MultiSelectorContent = forwardRef(({ children }, ref) => {
|
|
253
250
|
const { open } = useMultiSelect();
|
|
254
|
-
|
|
251
|
+
if (!open) return null;
|
|
252
|
+
return /* @__PURE__ */ React.createElement("div", { ref, className: "relative" }, children);
|
|
255
253
|
});
|
|
256
254
|
MultiSelectorContent.displayName = "MultiSelectorContent";
|
|
257
255
|
var MultiSelectorList = forwardRef(({ className, children }, ref) => {
|
|
@@ -260,7 +258,7 @@ var MultiSelectorList = forwardRef(({ className, children }, ref) => {
|
|
|
260
258
|
{
|
|
261
259
|
ref,
|
|
262
260
|
className: cn(
|
|
263
|
-
"
|
|
261
|
+
"absolute top-0 z-100 flex w-full flex-col gap-2 rounded-md border border-muted bg-background p-2 shadow-md scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-lg scrollbar-thumb-muted-foreground transition-colors dark:scrollbar-thumb-muted",
|
|
264
262
|
className
|
|
265
263
|
)
|
|
266
264
|
},
|
|
@@ -270,22 +268,25 @@ var MultiSelectorList = forwardRef(({ className, children }, ref) => {
|
|
|
270
268
|
});
|
|
271
269
|
MultiSelectorList.displayName = "MultiSelectorList";
|
|
272
270
|
var MultiSelectorItem = forwardRef((_a, ref) => {
|
|
273
|
-
var _b = _a, { className, value, label, children } = _b, props = __objRest(_b, ["className", "value", "label", "children"]);
|
|
274
|
-
const { value:
|
|
271
|
+
var _b = _a, { className, value, label, children, disabled: disabledProp } = _b, props = __objRest(_b, ["className", "value", "label", "children", "disabled"]);
|
|
272
|
+
const { value: options, onValueChange, setInputValue, disabled } = useMultiSelect();
|
|
275
273
|
const mousePreventDefault = useCallback((e) => {
|
|
276
274
|
e.preventDefault();
|
|
277
275
|
e.stopPropagation();
|
|
278
276
|
}, []);
|
|
279
|
-
const isIncluded = searchForValue(
|
|
277
|
+
const isIncluded = searchForValue(options, {
|
|
280
278
|
value,
|
|
281
279
|
label
|
|
282
280
|
}) !== -1;
|
|
281
|
+
const isDisabled = disabled || disabledProp;
|
|
283
282
|
return /* @__PURE__ */ React.createElement(
|
|
284
283
|
CommandItem,
|
|
285
284
|
__spreadProps(__spreadValues({
|
|
286
285
|
ref
|
|
287
286
|
}, props), {
|
|
287
|
+
disabled: isDisabled,
|
|
288
288
|
onSelect: () => {
|
|
289
|
+
if (isDisabled) return;
|
|
289
290
|
onValueChange({
|
|
290
291
|
value,
|
|
291
292
|
label
|
|
@@ -293,10 +294,10 @@ var MultiSelectorItem = forwardRef((_a, ref) => {
|
|
|
293
294
|
setInputValue("");
|
|
294
295
|
},
|
|
295
296
|
className: cn(
|
|
296
|
-
"
|
|
297
|
+
"flex cursor-pointer justify-between rounded-md px-2 py-1 transition-colors",
|
|
297
298
|
className,
|
|
298
|
-
isIncluded && "opacity-50
|
|
299
|
-
|
|
299
|
+
isIncluded && "cursor-default opacity-50",
|
|
300
|
+
isDisabled && "cursor-not-allowed opacity-50"
|
|
300
301
|
),
|
|
301
302
|
onMouseDown: mousePreventDefault
|
|
302
303
|
}),
|
|
@@ -305,12 +306,13 @@ var MultiSelectorItem = forwardRef((_a, ref) => {
|
|
|
305
306
|
);
|
|
306
307
|
});
|
|
307
308
|
MultiSelectorItem.displayName = "MultiSelectorItem";
|
|
309
|
+
|
|
308
310
|
export {
|
|
309
311
|
MultiSelector,
|
|
310
|
-
|
|
312
|
+
MultiSelectorTrigger,
|
|
311
313
|
MultiSelectorInput,
|
|
312
|
-
|
|
314
|
+
MultiSelectorContent,
|
|
313
315
|
MultiSelectorList,
|
|
314
|
-
|
|
316
|
+
MultiSelectorItem
|
|
315
317
|
};
|
|
316
|
-
//# sourceMappingURL=
|
|
318
|
+
//# sourceMappingURL=chunk-RNKMPQDZ.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/ui/multi-select.tsx"],"sourcesContent":["\"use client\";\nimport * as React from 'react';\nimport { IconCheck, IconX } from '@tabler/icons-react';\nimport { Command as CommandPrimitive } from 'cmdk';\nimport { type KeyboardEvent, createContext, forwardRef, useCallback, useContext, useState } from 'react';\n\nimport { cn } from '../../utils/ui';\nimport { Badge } from './badge';\nimport { Command, CommandEmpty, CommandItem, CommandList } from './command';\n\nexport type MultiSelectValue = {\n value: string;\n label: string;\n};\n\ninterface MultiSelectorProps extends React.ComponentPropsWithoutRef<typeof CommandPrimitive> {\n values: MultiSelectValue[];\n onValuesChange: (value: MultiSelectValue[]) => void;\n loop?: boolean;\n className?: string;\n children?: React.ReactNode;\n dir?: 'ltr' | 'rtl';\n disabled?: boolean;\n}\n\ninterface MultiSelectContextProps {\n value: MultiSelectValue[];\n onValueChange: (value: MultiSelectValue) => void;\n open: boolean;\n setOpen: (value: boolean) => void;\n inputValue: string;\n setInputValue: React.Dispatch<React.SetStateAction<string>>;\n activeIndex: number;\n setActiveIndex: React.Dispatch<React.SetStateAction<number>>;\n ref: React.RefObject<HTMLInputElement | null>;\n disabled: boolean;\n}\n\nconst MultiSelectContext = createContext<MultiSelectContextProps | null>(null);\n\nconst useMultiSelect = () => {\n const context = useContext(MultiSelectContext);\n if (!context) {\n throw new Error('useMultiSelect must be used within MultiSelectProvider');\n }\n return context;\n};\n\nfunction searchForValue(source: MultiSelectValue[], value: MultiSelectValue) {\n for (let i = 0; i < source.length; i++) {\n if (source[i].value === value.value) {\n return i;\n }\n }\n return -1;\n}\n\nconst MultiSelector = ({\n values: value,\n onValuesChange: onValueChange,\n loop = false,\n className,\n children,\n dir,\n disabled = false,\n ...props\n}: MultiSelectorProps) => {\n const [inputValue, setInputValue] = useState('');\n const [open, setOpen] = useState<boolean>(false);\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const onValueChangeHandler = useCallback(\n (val: MultiSelectValue) => {\n if (disabled) return;\n\n const exists = value.some((currentValue) => currentValue.value === val.value);\n if (exists) {\n onValueChange(value.filter((currentValue) => currentValue.value !== val.value));\n } else {\n onValueChange([...value, val]);\n }\n },\n [disabled, onValueChange, value],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n e.stopPropagation();\n\n if (disabled) return;\n\n const target = inputRef.current;\n\n if (!target) return;\n\n const selectionStart = target.selectionStart ?? 0;\n const selectionEnd = target.selectionEnd ?? 0;\n\n if (selectionStart !== selectionEnd) {\n return;\n }\n\n const moveNext = () => {\n const nextIndex = activeIndex + 1;\n setActiveIndex(nextIndex > value.length - 1 ? (loop ? 0 : -1) : nextIndex);\n };\n\n const movePrev = () => {\n const prevIndex = activeIndex - 1;\n setActiveIndex(prevIndex < 0 ? value.length - 1 : prevIndex);\n };\n\n const moveCurrent = () => {\n const newIndex = activeIndex - 1 <= 0 ? (value.length - 1 === 0 ? -1 : 0) : activeIndex - 1;\n setActiveIndex(newIndex);\n };\n\n switch (e.key) {\n case 'ArrowLeft':\n if (dir === 'rtl') {\n if (value.length > 0 && (activeIndex !== -1 || loop)) {\n moveNext();\n }\n } else if (value.length > 0 && target.selectionStart === 0) {\n movePrev();\n }\n break;\n\n case 'ArrowRight':\n if (dir === 'rtl') {\n if (value.length > 0 && target.selectionStart === 0) {\n movePrev();\n }\n } else if (value.length > 0 && (activeIndex !== -1 || loop)) {\n moveNext();\n }\n break;\n\n case 'Backspace':\n case 'Delete':\n if (value.length > 0) {\n if (activeIndex !== -1 && activeIndex < value.length) {\n onValueChangeHandler(value[activeIndex]);\n moveCurrent();\n } else if (target.selectionStart === 0) {\n onValueChangeHandler(value[value.length - 1]);\n }\n }\n break;\n\n case 'Enter':\n setOpen(true);\n break;\n\n case 'Escape':\n if (activeIndex !== -1) {\n setActiveIndex(-1);\n } else if (open) {\n setInputValue('');\n setOpen(false);\n }\n break;\n }\n },\n [activeIndex, dir, disabled, loop, onValueChangeHandler, open, value],\n );\n\n return (\n <MultiSelectContext.Provider\n value={{\n value,\n onValueChange: onValueChangeHandler,\n open,\n setOpen,\n inputValue,\n setInputValue,\n activeIndex,\n setActiveIndex,\n ref: inputRef,\n disabled,\n }}\n >\n <Command\n onKeyDown={handleKeyDown}\n className={cn('flex flex-col overflow-visible bg-transparent', className)}\n dir={dir}\n {...props}\n >\n {children}\n </Command>\n </MultiSelectContext.Provider>\n );\n};\n\nconst MultiSelectorTrigger = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => {\n const { value, onValueChange, activeIndex, disabled } = useMultiSelect();\n\n const mousePreventDefault = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-wrap gap-1 rounded-lg border bg-background px-2 py-1',\n activeIndex === -1 && 'focus-within:ring-1 focus-within:ring-ring',\n disabled && 'cursor-not-allowed opacity-60',\n className,\n )}\n {...props}\n >\n {value.map((item, index) => (\n <Badge\n key={item.value}\n className={cn(\n 'flex items-center gap-1 rounded-md px-1.5',\n activeIndex === index && 'ring-2 ring-muted-foreground',\n )}\n variant=\"secondary\"\n >\n <span className=\"text-xs\">{item.label}</span>\n <button\n aria-label={`Remove ${item.label} option`}\n type=\"button\"\n disabled={disabled}\n onMouseDown={mousePreventDefault}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n\n onValueChange(item);\n }}\n className=\"inline-flex cursor-pointer items-center justify-center rounded-md p-1 transition-colors hover:bg-red-50 hover:text-red-700 focus-visible:bg-red-100 focus-visible:outline-none disabled:cursor-not-allowed\"\n >\n <span className=\"sr-only\">Remove {item.label} option</span>\n <IconX className=\"h-3.5 w-3.5\" />\n </button>\n </Badge>\n ))}\n {children}\n </div>\n );\n },\n);\n\nMultiSelectorTrigger.displayName = 'MultiSelectorTrigger';\n\nconst MultiSelectorInput = forwardRef<\n React.ElementRef<typeof CommandPrimitive.Input>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, disabled: disabledProp, ...props }, ref) => {\n const { setOpen, inputValue, setInputValue, activeIndex, setActiveIndex, ref: inputRef, disabled } = useMultiSelect();\n\n return (\n <CommandPrimitive.Input\n {...props}\n tabIndex={0}\n ref={inputRef}\n value={inputValue}\n disabled={disabled || disabledProp}\n onValueChange={activeIndex === -1 ? setInputValue : undefined}\n onBlur={() => {\n setInputValue('');\n setOpen(false);\n }}\n onFocus={() => setOpen(true)}\n onClick={() => setActiveIndex(-1)}\n className={cn(\n 'flex-1 border-none bg-transparent p-0 text-sm outline-none placeholder:text-muted-foreground focus:outline-none focus:ring-0',\n className,\n activeIndex !== -1 && 'caret-transparent',\n )}\n />\n );\n});\n\nMultiSelectorInput.displayName = 'MultiSelectorInput';\n\nconst MultiSelectorContent = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({ children }, ref) => {\n const { open } = useMultiSelect();\n\n if (!open) return null;\n\n return (\n <div ref={ref} className=\"relative\">\n {children}\n </div>\n );\n});\n\nMultiSelectorContent.displayName = 'MultiSelectorContent';\n\nconst MultiSelectorList = forwardRef<\n React.ElementRef<typeof CommandPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, children }, ref) => {\n return (\n <CommandList\n ref={ref}\n className={cn(\n 'absolute top-0 z-100 flex w-full flex-col gap-2 rounded-md border border-muted bg-background p-2 shadow-md scrollbar-thin scrollbar-track-transparent scrollbar-thumb-rounded-lg scrollbar-thumb-muted-foreground transition-colors dark:scrollbar-thumb-muted',\n className,\n )}\n >\n {children}\n <CommandEmpty>\n <span className=\"text-muted-foreground\">No results found</span>\n </CommandEmpty>\n </CommandList>\n );\n});\n\nMultiSelectorList.displayName = 'MultiSelectorList';\n\nconst MultiSelectorItem = forwardRef<\n React.ElementRef<typeof CommandPrimitive.Item>,\n { value: string; label: string } & React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, value, label, children, disabled: disabledProp, ...props }, ref) => {\n const { value: options, onValueChange, setInputValue, disabled } = useMultiSelect();\n\n const mousePreventDefault = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const isIncluded =\n searchForValue(options, {\n value,\n label,\n }) !== -1;\n\n const isDisabled = disabled || disabledProp;\n\n return (\n <CommandItem\n ref={ref}\n {...props}\n disabled={isDisabled}\n onSelect={() => {\n if (isDisabled) return;\n\n onValueChange({\n value,\n label,\n });\n setInputValue('');\n }}\n className={cn(\n 'flex cursor-pointer justify-between rounded-md px-2 py-1 transition-colors',\n className,\n isIncluded && 'cursor-default opacity-50',\n isDisabled && 'cursor-not-allowed opacity-50',\n )}\n onMouseDown={mousePreventDefault}\n >\n {children}\n {isIncluded && <IconCheck className=\"h-4 w-4\" />}\n </CommandItem>\n );\n});\n\nMultiSelectorItem.displayName = 'MultiSelectorItem';\n\nexport {\n MultiSelector,\n MultiSelectorTrigger,\n MultiSelectorInput,\n MultiSelectorContent,\n MultiSelectorList,\n MultiSelectorItem,\n};\n"],"mappings":"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","names":["_a","_b"]}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MultiSelector,
|
|
3
|
+
MultiSelectorInput,
|
|
4
|
+
MultiSelectorItem,
|
|
5
|
+
MultiSelectorList,
|
|
6
|
+
MultiSelectorTrigger
|
|
7
|
+
} from "./chunk-RNKMPQDZ.mjs";
|
|
8
|
+
import {
|
|
9
|
+
Popover,
|
|
10
|
+
PopoverContent,
|
|
11
|
+
PopoverTrigger
|
|
12
|
+
} from "./chunk-CSL3CTEN.mjs";
|
|
13
|
+
import {
|
|
14
|
+
Label
|
|
15
|
+
} from "./chunk-MM5OJOOR.mjs";
|
|
16
|
+
import {
|
|
17
|
+
cn
|
|
18
|
+
} from "./chunk-KGUUDFJE.mjs";
|
|
19
|
+
|
|
20
|
+
// components/form/multi-select.tsx
|
|
21
|
+
import _isString from "lodash-es/isString";
|
|
22
|
+
import _kebabCase from "lodash-es/kebabCase";
|
|
23
|
+
import React from "react";
|
|
24
|
+
function FormMultiSelect({
|
|
25
|
+
id,
|
|
26
|
+
name,
|
|
27
|
+
label,
|
|
28
|
+
placeholder = "Select options...",
|
|
29
|
+
data,
|
|
30
|
+
value = [],
|
|
31
|
+
onChange,
|
|
32
|
+
classNames,
|
|
33
|
+
required,
|
|
34
|
+
disabled,
|
|
35
|
+
loop = false
|
|
36
|
+
}) {
|
|
37
|
+
const options = React.useMemo(() => {
|
|
38
|
+
if (!data || data.length === 0) return [];
|
|
39
|
+
if (_isString(data[0])) {
|
|
40
|
+
return data.map((currentValue) => ({ label: currentValue, value: currentValue }));
|
|
41
|
+
}
|
|
42
|
+
return data;
|
|
43
|
+
}, [data]);
|
|
44
|
+
const selectedValues = React.useMemo(() => {
|
|
45
|
+
return value.map((currentValue) => options.find((option) => option.value === currentValue)).filter((option) => !!option);
|
|
46
|
+
}, [options, value]);
|
|
47
|
+
const handleValueChange = (newValues) => {
|
|
48
|
+
onChange(newValues.map((currentValue) => currentValue.value));
|
|
49
|
+
};
|
|
50
|
+
if (!id) id = _kebabCase(name);
|
|
51
|
+
return /* @__PURE__ */ React.createElement("div", { className: cn("flex flex-col gap-2", classNames == null ? void 0 : classNames.wrapper) }, label && /* @__PURE__ */ React.createElement(Label, { htmlFor: id, className: classNames == null ? void 0 : classNames.label, required }, label), /* @__PURE__ */ React.createElement(
|
|
52
|
+
MultiSelector,
|
|
53
|
+
{
|
|
54
|
+
values: selectedValues,
|
|
55
|
+
onValuesChange: handleValueChange,
|
|
56
|
+
loop,
|
|
57
|
+
disabled,
|
|
58
|
+
className: "p-0"
|
|
59
|
+
},
|
|
60
|
+
/* @__PURE__ */ React.createElement(Popover, null, /* @__PURE__ */ React.createElement(PopoverTrigger, { asChild: true }, /* @__PURE__ */ React.createElement(MultiSelectorTrigger, { className: cn("cursor-pointer", classNames == null ? void 0 : classNames.trigger) }, /* @__PURE__ */ React.createElement(
|
|
61
|
+
MultiSelectorInput,
|
|
62
|
+
{
|
|
63
|
+
id,
|
|
64
|
+
disabled,
|
|
65
|
+
placeholder: selectedValues.length === 0 ? placeholder : "",
|
|
66
|
+
className: classNames == null ? void 0 : classNames.input
|
|
67
|
+
}
|
|
68
|
+
))), /* @__PURE__ */ React.createElement(
|
|
69
|
+
PopoverContent,
|
|
70
|
+
{
|
|
71
|
+
align: "start",
|
|
72
|
+
className: cn("w-[var(--radix-popover-trigger-width)] p-0", classNames == null ? void 0 : classNames.content)
|
|
73
|
+
},
|
|
74
|
+
/* @__PURE__ */ React.createElement(MultiSelectorList, { className: "static relative border-none shadow-none" }, options.map((option) => /* @__PURE__ */ React.createElement(MultiSelectorItem, { key: option.value, value: option.value, label: option.label }, /* @__PURE__ */ React.createElement("span", null, option.label))))
|
|
75
|
+
))
|
|
76
|
+
));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export {
|
|
80
|
+
FormMultiSelect
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=chunk-RSFL2TUC.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/form/multi-select.tsx"],"sourcesContent":["\"use client\";\nimport _isString from 'lodash-es/isString';\nimport _kebabCase from 'lodash-es/kebabCase';\nimport React from 'react';\n\nimport { cn } from '../../utils/ui';\nimport { Label } from '../ui/label';\nimport {\n MultiSelector,\n MultiSelectorInput,\n MultiSelectorItem,\n MultiSelectorList,\n MultiSelectorTrigger,\n type MultiSelectValue,\n} from '../ui/multi-select';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\n\nexport interface FormMultiSelectProps {\n id?: string;\n name: string;\n label?: string;\n placeholder?: string;\n data: MultiSelectValue[] | string[];\n value: string[];\n onChange: (values: string[]) => void;\n classNames?: {\n wrapper?: string;\n label?: string;\n trigger?: string;\n input?: string;\n content?: string;\n };\n required?: boolean;\n disabled?: boolean;\n loop?: boolean;\n}\n\nexport function FormMultiSelect({\n id,\n name,\n label,\n placeholder = 'Select options...',\n data,\n value = [],\n onChange,\n classNames,\n required,\n disabled,\n loop = false,\n}: FormMultiSelectProps) {\n const options: MultiSelectValue[] = React.useMemo(() => {\n if (!data || data.length === 0) return [];\n if (_isString(data[0])) {\n return (data as string[]).map((currentValue) => ({ label: currentValue, value: currentValue }));\n }\n return data as MultiSelectValue[];\n }, [data]);\n\n const selectedValues = React.useMemo(() => {\n return value\n .map((currentValue) => options.find((option) => option.value === currentValue))\n .filter((option): option is MultiSelectValue => !!option);\n }, [options, value]);\n\n const handleValueChange = (newValues: MultiSelectValue[]) => {\n onChange(newValues.map((currentValue) => currentValue.value));\n };\n\n if (!id) id = _kebabCase(name);\n\n return (\n <div className={cn('flex flex-col gap-2', classNames?.wrapper)}>\n {label && (\n <Label htmlFor={id} className={classNames?.label} required={required}>\n {label}\n </Label>\n )}\n\n <MultiSelector\n values={selectedValues}\n onValuesChange={handleValueChange}\n loop={loop}\n disabled={disabled}\n className=\"p-0\"\n >\n <Popover>\n <PopoverTrigger asChild>\n <MultiSelectorTrigger className={cn('cursor-pointer', classNames?.trigger)}>\n <MultiSelectorInput\n id={id}\n disabled={disabled}\n placeholder={selectedValues.length === 0 ? placeholder : ''}\n className={classNames?.input}\n />\n </MultiSelectorTrigger>\n </PopoverTrigger>\n\n <PopoverContent\n align=\"start\"\n className={cn('w-[var(--radix-popover-trigger-width)] p-0', classNames?.content)}\n >\n <MultiSelectorList className=\"static relative border-none shadow-none\">\n {options.map((option) => (\n <MultiSelectorItem key={option.value} value={option.value} label={option.label}>\n <span>{option.label}</span>\n </MultiSelectorItem>\n ))}\n </MultiSelectorList>\n </PopoverContent>\n </Popover>\n </MultiSelector>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AACA,OAAO,eAAe;AACtB,OAAO,gBAAgB;AACvB,OAAO,WAAW;AAkCX,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,QAAQ,CAAC;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAAyB;AACvB,QAAM,UAA8B,MAAM,QAAQ,MAAM;AACtD,QAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO,CAAC;AACxC,QAAI,UAAU,KAAK,CAAC,CAAC,GAAG;AACtB,aAAQ,KAAkB,IAAI,CAAC,kBAAkB,EAAE,OAAO,cAAc,OAAO,aAAa,EAAE;AAAA,IAChG;AACA,WAAO;AAAA,EACT,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,iBAAiB,MAAM,QAAQ,MAAM;AACzC,WAAO,MACJ,IAAI,CAAC,iBAAiB,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,YAAY,CAAC,EAC7E,OAAO,CAAC,WAAuC,CAAC,CAAC,MAAM;AAAA,EAC5D,GAAG,CAAC,SAAS,KAAK,CAAC;AAEnB,QAAM,oBAAoB,CAAC,cAAkC;AAC3D,aAAS,UAAU,IAAI,CAAC,iBAAiB,aAAa,KAAK,CAAC;AAAA,EAC9D;AAEA,MAAI,CAAC,GAAI,MAAK,WAAW,IAAI;AAE7B,SACE,oCAAC,SAAI,WAAW,GAAG,uBAAuB,yCAAY,OAAO,KAC1D,SACC,oCAAC,SAAM,SAAS,IAAI,WAAW,yCAAY,OAAO,YAC/C,KACH,GAGF;AAAA,IAAC;AAAA;AAAA,MACC,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,MACA,WAAU;AAAA;AAAA,IAEV,oCAAC,eACC,oCAAC,kBAAe,SAAO,QACrB,oCAAC,wBAAqB,WAAW,GAAG,kBAAkB,yCAAY,OAAO,KACvE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,aAAa,eAAe,WAAW,IAAI,cAAc;AAAA,QACzD,WAAW,yCAAY;AAAA;AAAA,IACzB,CACF,CACF,GAEA;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,WAAW,GAAG,8CAA8C,yCAAY,OAAO;AAAA;AAAA,MAE/E,oCAAC,qBAAkB,WAAU,6CAC1B,QAAQ,IAAI,CAAC,WACZ,oCAAC,qBAAkB,KAAK,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,SACvE,oCAAC,cAAM,OAAO,KAAM,CACtB,CACD,CACH;AAAA,IACF,CACF;AAAA,EACF,CACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _chunkWXEEDLLRjs = require('./chunk-WXEEDLLR.js');
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
var _chunkQHCOMBHIjs = require('./chunk-QHCOMBHI.js');
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
var _chunkCKGMFUU2js = require('./chunk-CKGMFUU2.js');
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
var _chunkPSPAJNNBjs = require('./chunk-PSPAJNNB.js');
|
|
20
|
+
|
|
21
|
+
// components/form/multi-select.tsx
|
|
22
|
+
var _isString2 = require('lodash-es/isString'); var _isString3 = _interopRequireDefault(_isString2);
|
|
23
|
+
var _kebabCase2 = require('lodash-es/kebabCase'); var _kebabCase3 = _interopRequireDefault(_kebabCase2);
|
|
24
|
+
var _react = require('react'); var _react2 = _interopRequireDefault(_react);
|
|
25
|
+
function FormMultiSelect({
|
|
26
|
+
id,
|
|
27
|
+
name,
|
|
28
|
+
label,
|
|
29
|
+
placeholder = "Select options...",
|
|
30
|
+
data,
|
|
31
|
+
value = [],
|
|
32
|
+
onChange,
|
|
33
|
+
classNames,
|
|
34
|
+
required,
|
|
35
|
+
disabled,
|
|
36
|
+
loop = false
|
|
37
|
+
}) {
|
|
38
|
+
const options = _react2.default.useMemo(() => {
|
|
39
|
+
if (!data || data.length === 0) return [];
|
|
40
|
+
if (_isString3.default.call(void 0, data[0])) {
|
|
41
|
+
return data.map((currentValue) => ({ label: currentValue, value: currentValue }));
|
|
42
|
+
}
|
|
43
|
+
return data;
|
|
44
|
+
}, [data]);
|
|
45
|
+
const selectedValues = _react2.default.useMemo(() => {
|
|
46
|
+
return value.map((currentValue) => options.find((option) => option.value === currentValue)).filter((option) => !!option);
|
|
47
|
+
}, [options, value]);
|
|
48
|
+
const handleValueChange = (newValues) => {
|
|
49
|
+
onChange(newValues.map((currentValue) => currentValue.value));
|
|
50
|
+
};
|
|
51
|
+
if (!id) id = _kebabCase3.default.call(void 0, name);
|
|
52
|
+
return /* @__PURE__ */ _react2.default.createElement("div", { className: _chunkPSPAJNNBjs.cn.call(void 0, "flex flex-col gap-2", classNames == null ? void 0 : classNames.wrapper) }, label && /* @__PURE__ */ _react2.default.createElement(_chunkCKGMFUU2js.Label, { htmlFor: id, className: classNames == null ? void 0 : classNames.label, required }, label), /* @__PURE__ */ _react2.default.createElement(
|
|
53
|
+
_chunkWXEEDLLRjs.MultiSelector,
|
|
54
|
+
{
|
|
55
|
+
values: selectedValues,
|
|
56
|
+
onValuesChange: handleValueChange,
|
|
57
|
+
loop,
|
|
58
|
+
disabled,
|
|
59
|
+
className: "p-0"
|
|
60
|
+
},
|
|
61
|
+
/* @__PURE__ */ _react2.default.createElement(_chunkQHCOMBHIjs.Popover, null, /* @__PURE__ */ _react2.default.createElement(_chunkQHCOMBHIjs.PopoverTrigger, { asChild: true }, /* @__PURE__ */ _react2.default.createElement(_chunkWXEEDLLRjs.MultiSelectorTrigger, { className: _chunkPSPAJNNBjs.cn.call(void 0, "cursor-pointer", classNames == null ? void 0 : classNames.trigger) }, /* @__PURE__ */ _react2.default.createElement(
|
|
62
|
+
_chunkWXEEDLLRjs.MultiSelectorInput,
|
|
63
|
+
{
|
|
64
|
+
id,
|
|
65
|
+
disabled,
|
|
66
|
+
placeholder: selectedValues.length === 0 ? placeholder : "",
|
|
67
|
+
className: classNames == null ? void 0 : classNames.input
|
|
68
|
+
}
|
|
69
|
+
))), /* @__PURE__ */ _react2.default.createElement(
|
|
70
|
+
_chunkQHCOMBHIjs.PopoverContent,
|
|
71
|
+
{
|
|
72
|
+
align: "start",
|
|
73
|
+
className: _chunkPSPAJNNBjs.cn.call(void 0, "w-[var(--radix-popover-trigger-width)] p-0", classNames == null ? void 0 : classNames.content)
|
|
74
|
+
},
|
|
75
|
+
/* @__PURE__ */ _react2.default.createElement(_chunkWXEEDLLRjs.MultiSelectorList, { className: "static relative border-none shadow-none" }, options.map((option) => /* @__PURE__ */ _react2.default.createElement(_chunkWXEEDLLRjs.MultiSelectorItem, { key: option.value, value: option.value, label: option.label }, /* @__PURE__ */ _react2.default.createElement("span", null, option.label))))
|
|
76
|
+
))
|
|
77
|
+
));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
exports.FormMultiSelect = FormMultiSelect;
|
|
83
|
+
//# sourceMappingURL=chunk-S6HQ25BZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-S6HQ25BZ.js","../components/form/multi-select.tsx"],"names":[],"mappings":"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","file":"/home/jahn/projects/shadcn-theme/packages/react/dist/chunk-S6HQ25BZ.js","sourcesContent":[null,"\"use client\";\nimport _isString from 'lodash-es/isString';\nimport _kebabCase from 'lodash-es/kebabCase';\nimport React from 'react';\n\nimport { cn } from '../../utils/ui';\nimport { Label } from '../ui/label';\nimport {\n MultiSelector,\n MultiSelectorInput,\n MultiSelectorItem,\n MultiSelectorList,\n MultiSelectorTrigger,\n type MultiSelectValue,\n} from '../ui/multi-select';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\n\nexport interface FormMultiSelectProps {\n id?: string;\n name: string;\n label?: string;\n placeholder?: string;\n data: MultiSelectValue[] | string[];\n value: string[];\n onChange: (values: string[]) => void;\n classNames?: {\n wrapper?: string;\n label?: string;\n trigger?: string;\n input?: string;\n content?: string;\n };\n required?: boolean;\n disabled?: boolean;\n loop?: boolean;\n}\n\nexport function FormMultiSelect({\n id,\n name,\n label,\n placeholder = 'Select options...',\n data,\n value = [],\n onChange,\n classNames,\n required,\n disabled,\n loop = false,\n}: FormMultiSelectProps) {\n const options: MultiSelectValue[] = React.useMemo(() => {\n if (!data || data.length === 0) return [];\n if (_isString(data[0])) {\n return (data as string[]).map((currentValue) => ({ label: currentValue, value: currentValue }));\n }\n return data as MultiSelectValue[];\n }, [data]);\n\n const selectedValues = React.useMemo(() => {\n return value\n .map((currentValue) => options.find((option) => option.value === currentValue))\n .filter((option): option is MultiSelectValue => !!option);\n }, [options, value]);\n\n const handleValueChange = (newValues: MultiSelectValue[]) => {\n onChange(newValues.map((currentValue) => currentValue.value));\n };\n\n if (!id) id = _kebabCase(name);\n\n return (\n <div className={cn('flex flex-col gap-2', classNames?.wrapper)}>\n {label && (\n <Label htmlFor={id} className={classNames?.label} required={required}>\n {label}\n </Label>\n )}\n\n <MultiSelector\n values={selectedValues}\n onValuesChange={handleValueChange}\n loop={loop}\n disabled={disabled}\n className=\"p-0\"\n >\n <Popover>\n <PopoverTrigger asChild>\n <MultiSelectorTrigger className={cn('cursor-pointer', classNames?.trigger)}>\n <MultiSelectorInput\n id={id}\n disabled={disabled}\n placeholder={selectedValues.length === 0 ? placeholder : ''}\n className={classNames?.input}\n />\n </MultiSelectorTrigger>\n </PopoverTrigger>\n\n <PopoverContent\n align=\"start\"\n className={cn('w-[var(--radix-popover-trigger-width)] p-0', classNames?.content)}\n >\n <MultiSelectorList className=\"static relative border-none shadow-none\">\n {options.map((option) => (\n <MultiSelectorItem key={option.value} value={option.value} label={option.label}>\n <span>{option.label}</span>\n </MultiSelectorItem>\n ))}\n </MultiSelectorList>\n </PopoverContent>\n </Popover>\n </MultiSelector>\n </div>\n );\n}\n"]}
|