maquinaweb-ui 2.60.0 → 2.62.0
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/dist/container-animation.d.ts +2 -2
- package/dist/date-field.d.ts +2 -2
- package/dist/date-hour-field.d.ts +2 -2
- package/dist/input-suggest.d.ts +2 -2
- package/dist/page-header.d.ts +2 -2
- package/dist/remote-selector.d.ts +5 -3
- package/dist/remote-selector.d.ts.map +1 -1
- package/dist/remote-selector.js +83 -21
- package/dist/remote-selector.js.map +1 -1
- package/dist/text-field.d.ts +5 -5
- package/dist/toggle-field.d.ts +2 -2
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ComponentProps, ElementType } from "react";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime4 from "react/jsx-runtime";
|
|
3
3
|
|
|
4
4
|
//#region src/components/container-animation/container-animation.d.ts
|
|
5
5
|
type ContainerAnimationProps<T extends ElementType = 'div'> = ComponentProps<'div'> & ComponentProps<T> & {
|
|
@@ -23,7 +23,7 @@ declare const ContainerAnimation: <T extends ElementType = "div">({
|
|
|
23
23
|
distance,
|
|
24
24
|
hideNotInView,
|
|
25
25
|
...props
|
|
26
|
-
}: ContainerAnimationProps<T>) =>
|
|
26
|
+
}: ContainerAnimationProps<T>) => react_jsx_runtime4.JSX.Element;
|
|
27
27
|
//#endregion
|
|
28
28
|
export { ContainerAnimation, type ContainerAnimationProps };
|
|
29
29
|
//# sourceMappingURL=container-animation.d.ts.map
|
package/dist/date-field.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FieldPath, FieldValues, UseControllerProps } from "react-hook-form";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
3
|
import { Matcher } from "react-day-picker";
|
|
4
4
|
|
|
5
5
|
//#region src/components/date-field/DateField.d.ts
|
|
@@ -29,7 +29,7 @@ declare function DateField<TFieldValues extends FieldValues = FieldValues, TFiel
|
|
|
29
29
|
required,
|
|
30
30
|
help,
|
|
31
31
|
dateOnly
|
|
32
|
-
}: DateFieldProps<TFieldValues, TFieldName>):
|
|
32
|
+
}: DateFieldProps<TFieldValues, TFieldName>): react_jsx_runtime0.JSX.Element;
|
|
33
33
|
//#endregion
|
|
34
34
|
export { DateField, type DateFieldProps };
|
|
35
35
|
//# sourceMappingURL=date-field.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FieldPath, FieldValues, UseControllerProps } from "react-hook-form";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime5 from "react/jsx-runtime";
|
|
3
3
|
import { Matcher } from "react-day-picker";
|
|
4
4
|
|
|
5
5
|
//#region src/components/date-hour-field/DateHourField.d.ts
|
|
@@ -29,7 +29,7 @@ declare function DateHourField<TFieldValues extends FieldValues = FieldValues, T
|
|
|
29
29
|
help,
|
|
30
30
|
hourPlaceholder,
|
|
31
31
|
valueType
|
|
32
|
-
}: DateHourFieldProps<TFieldValues, TFieldName>):
|
|
32
|
+
}: DateHourFieldProps<TFieldValues, TFieldName>): react_jsx_runtime5.JSX.Element;
|
|
33
33
|
//#endregion
|
|
34
34
|
export { DateHourField, type DateHourFieldProps };
|
|
35
35
|
//# sourceMappingURL=date-hour-field.d.ts.map
|
package/dist/input-suggest.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { n as Options, t as Mask } from "./with-mask-BLZS7b9k.js";
|
|
2
2
|
import { FieldPath, FieldValues, UseControllerProps } from "react-hook-form";
|
|
3
3
|
import { Dispatch, SetStateAction } from "react";
|
|
4
|
-
import * as
|
|
4
|
+
import * as react_jsx_runtime8 from "react/jsx-runtime";
|
|
5
5
|
import { PopoverProps } from "@radix-ui/react-popover";
|
|
6
6
|
|
|
7
7
|
//#region src/components/input-suggest/input-suggest.d.ts
|
|
@@ -71,7 +71,7 @@ declare function InputSuggest<TFieldValues extends FieldValues = FieldValues, TF
|
|
|
71
71
|
debounceTime,
|
|
72
72
|
maxWait,
|
|
73
73
|
...props
|
|
74
|
-
}: InputSuggestProps<TFieldValues, TFieldName> & PopoverProps):
|
|
74
|
+
}: InputSuggestProps<TFieldValues, TFieldName> & PopoverProps): react_jsx_runtime8.JSX.Element;
|
|
75
75
|
//#endregion
|
|
76
76
|
export { InputSuggest, type InputSuggestProps };
|
|
77
77
|
//# sourceMappingURL=input-suggest.d.ts.map
|
package/dist/page-header.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime9 from "react/jsx-runtime";
|
|
2
2
|
|
|
3
3
|
//#region src/components/page-header/page-header.d.ts
|
|
4
4
|
interface PageHeaderProps {
|
|
@@ -10,7 +10,7 @@ declare function PageHeader({
|
|
|
10
10
|
title,
|
|
11
11
|
help,
|
|
12
12
|
description
|
|
13
|
-
}: PageHeaderProps):
|
|
13
|
+
}: PageHeaderProps): react_jsx_runtime9.JSX.Element;
|
|
14
14
|
//#endregion
|
|
15
15
|
export { PageHeader, type PageHeaderProps };
|
|
16
16
|
//# sourceMappingURL=page-header.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FieldPath, FieldPathValue, FieldValues, UseControllerProps } from "react-hook-form";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime6 from "react/jsx-runtime";
|
|
3
3
|
import { Options } from "nuqs";
|
|
4
4
|
import { PopoverProps } from "@radix-ui/react-popover";
|
|
5
5
|
|
|
@@ -20,6 +20,7 @@ type SelectorProps<T> = {
|
|
|
20
20
|
groupBy?: keyof T;
|
|
21
21
|
treeRender?: boolean;
|
|
22
22
|
fieldChildren?: keyof T;
|
|
23
|
+
fieldParent?: keyof T;
|
|
23
24
|
fieldDisabled?: keyof T;
|
|
24
25
|
disabled?: boolean;
|
|
25
26
|
searchPlaceholder?: string;
|
|
@@ -39,6 +40,7 @@ type SelectorProps<T> = {
|
|
|
39
40
|
imageField?: keyof T;
|
|
40
41
|
disabledField?: keyof T;
|
|
41
42
|
onDisabledClick?: (item: T) => void;
|
|
43
|
+
itemRightElement?: (item: T) => React.ReactNode;
|
|
42
44
|
loadMore?: () => void;
|
|
43
45
|
hasMore?: boolean;
|
|
44
46
|
isLoading?: boolean;
|
|
@@ -79,7 +81,7 @@ declare function RemoteSelectorField<T, TFieldValues extends FieldValues = Field
|
|
|
79
81
|
...props
|
|
80
82
|
}: RemoteSelectorFieldProps<TFieldValues, TFieldName> & BaseRemoteSelectorProps<T> & {
|
|
81
83
|
withPortal?: boolean;
|
|
82
|
-
}):
|
|
84
|
+
}): react_jsx_runtime6.JSX.Element;
|
|
83
85
|
interface RemoteSelectorQueryProps<T> extends BaseRemoteSelectorProps<T> {
|
|
84
86
|
name: string;
|
|
85
87
|
defaultValue?: string;
|
|
@@ -99,7 +101,7 @@ declare function RemoteSelectorQuery<T>({
|
|
|
99
101
|
fieldLabel,
|
|
100
102
|
type,
|
|
101
103
|
...props
|
|
102
|
-
}: RemoteSelectorQueryProps<T>):
|
|
104
|
+
}: RemoteSelectorQueryProps<T>): react_jsx_runtime6.JSX.Element;
|
|
103
105
|
//#endregion
|
|
104
106
|
export { type BaseRemoteSelectorProps, RemoteSelectorField as RemoteSelector, RemoteSelectorField, type RemoteSelectorFieldProps, RemoteSelectorQuery, type RemoteSelectorQueryProps, type TUseData };
|
|
105
107
|
//# sourceMappingURL=remote-selector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-selector.d.ts","names":[],"sources":["../src/components/ui/selector.tsx","../src/components/remote-selector/remote-selector.tsx"],"sourcesContent":[],"mappings":";;;;;;;AAqCc,KAFF,aAEE,CAAA,CAAA,CAAA,GAAA;EACM,IAAA,CAAA,EAAA,QAAA,GAAA,UAAA;EAAI,KAAA,CAAA,EADd,CACc,GADV,CACU,EAAA;EAId,QAAM,CAAA,EAAA,CAAA,IAAA,EAJI,CAIJ,GAJQ,CAIR,EAAA,GAAA,SAAA,GAAA,IAAA,EAAA,GAAA,IAAA;EACP,MAAA,CAAA,EAAA,MAAA;EACW,QAAA,CAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,GAAA,IAAA;EAED,WAAA,CAAA,EAAA,MAAA;EACD,KAAA,CAAA,EALR,KAAA,CAAM,SAKE;EAEM,KAAA,EANf,CAMe,EAAA;
|
|
1
|
+
{"version":3,"file":"remote-selector.d.ts","names":[],"sources":["../src/components/ui/selector.tsx","../src/components/remote-selector/remote-selector.tsx"],"sourcesContent":[],"mappings":"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"}
|
package/dist/remote-selector.js
CHANGED
|
@@ -150,9 +150,16 @@ function CommandItem({ className,...props }) {
|
|
|
150
150
|
|
|
151
151
|
//#endregion
|
|
152
152
|
//#region src/components/ui/tree-item-renderer.tsx
|
|
153
|
-
const TreeItemRendererComponent = ({ items, itemKey, labelKey, childrenKey, disabledKey, isMultiple = false, isItemSelected, onSelect, level = 0 }) => {
|
|
154
|
-
return /* @__PURE__ */ jsx(Fragment$1, { children:
|
|
153
|
+
const TreeItemRendererComponent = ({ items, itemKey, labelKey, childrenKey, parentKey, groupBy, disabledKey, isMultiple = false, isItemSelected, onSelect, level = 0 }) => {
|
|
154
|
+
return /* @__PURE__ */ jsx(Fragment$1, { children: useMemo(() => level === 0 ? normalizeTreeItems(items, itemKey, childrenKey, parentKey || "parent") : items, [
|
|
155
|
+
level,
|
|
156
|
+
items,
|
|
157
|
+
itemKey,
|
|
158
|
+
childrenKey,
|
|
159
|
+
parentKey
|
|
160
|
+
]).map((item) => {
|
|
155
161
|
const children = Array.isArray(item[childrenKey]) ? item[childrenKey] : [];
|
|
162
|
+
const childrenGroups = buildGroups$1(children, groupBy);
|
|
156
163
|
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
|
|
157
164
|
className: "relative",
|
|
158
165
|
children: [level > 0 && /* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute left-0 top-1/2 -translate-y-1/2 w-4 h-px bg-gray-300" }), /* @__PURE__ */ jsx(CommandItem, {
|
|
@@ -174,36 +181,85 @@ const TreeItemRendererComponent = ({ items, itemKey, labelKey, childrenKey, disa
|
|
|
174
181
|
}, `item-${String(item[itemKey])}`)]
|
|
175
182
|
}), /* @__PURE__ */ jsx("div", {
|
|
176
183
|
className: cn(children.length > 0 && "ml-4 relative before:absolute before:left-0 before:top-0 before:bottom-4 before:border-l before:border-gray-300"),
|
|
177
|
-
children: children.length > 0 && /* @__PURE__ */ jsx(
|
|
184
|
+
children: children.length > 0 && /* @__PURE__ */ jsx(Fragment$1, { children: childrenGroups.map((group) => /* @__PURE__ */ jsxs("div", { children: [groupBy && /* @__PURE__ */ jsx("div", {
|
|
185
|
+
className: "px-2 py-1 ml-4 text-[11px] font-medium text-muted-foreground/90 uppercase tracking-wide",
|
|
186
|
+
children: group.heading || "Outros"
|
|
187
|
+
}), /* @__PURE__ */ jsx(TreeItemRenderer, {
|
|
178
188
|
childrenKey,
|
|
179
189
|
disabledKey,
|
|
190
|
+
groupBy,
|
|
180
191
|
isItemSelected,
|
|
181
192
|
isMultiple,
|
|
182
193
|
itemKey,
|
|
183
|
-
items:
|
|
194
|
+
items: group.items,
|
|
184
195
|
labelKey,
|
|
185
196
|
level: level + 1,
|
|
186
|
-
onSelect
|
|
187
|
-
|
|
197
|
+
onSelect,
|
|
198
|
+
parentKey
|
|
199
|
+
})] }, `tree-group-${String(item[itemKey])}-${group.id}`)) })
|
|
188
200
|
})] }, `tree-item-${String(item[itemKey])}-${level}`);
|
|
189
201
|
}) });
|
|
190
202
|
};
|
|
191
203
|
const TreeItemRenderer = memo(TreeItemRendererComponent);
|
|
204
|
+
const DEFAULT_GROUP_ID$1 = "tree-group-default";
|
|
205
|
+
const UNDEFINED_GROUP_ID$1 = "tree-group-undefined";
|
|
206
|
+
const buildGroups$1 = (items, groupBy) => {
|
|
207
|
+
if (!groupBy) return [{
|
|
208
|
+
id: DEFAULT_GROUP_ID$1,
|
|
209
|
+
items
|
|
210
|
+
}];
|
|
211
|
+
return Object.values(items.reduce((acc, item) => {
|
|
212
|
+
const rawValue = item[groupBy];
|
|
213
|
+
const heading = rawValue == null ? void 0 : String(rawValue);
|
|
214
|
+
const groupId = heading ?? UNDEFINED_GROUP_ID$1;
|
|
215
|
+
if (!acc[groupId]) acc[groupId] = {
|
|
216
|
+
id: groupId,
|
|
217
|
+
heading,
|
|
218
|
+
items: []
|
|
219
|
+
};
|
|
220
|
+
acc[groupId].items.push(item);
|
|
221
|
+
return acc;
|
|
222
|
+
}, {}));
|
|
223
|
+
};
|
|
224
|
+
const normalizeTreeItems = (items, itemKey, childrenKey, parentKey) => {
|
|
225
|
+
if (items.length === 0) return items;
|
|
226
|
+
if (items.some((item) => Array.isArray(item[childrenKey]) && item[childrenKey].length > 0)) return items;
|
|
227
|
+
if (!items.some((item) => Object.prototype.hasOwnProperty.call(item, parentKey))) return items;
|
|
228
|
+
const nodes = /* @__PURE__ */ new Map();
|
|
229
|
+
const roots = [];
|
|
230
|
+
for (const item of items) nodes.set(String(item[itemKey]), {
|
|
231
|
+
...item,
|
|
232
|
+
[childrenKey]: []
|
|
233
|
+
});
|
|
234
|
+
for (const item of items) {
|
|
235
|
+
const node = nodes.get(String(item[itemKey]));
|
|
236
|
+
if (!node) continue;
|
|
237
|
+
const parentValue = item[parentKey];
|
|
238
|
+
if (!(parentValue !== null && parentValue !== void 0 && String(parentValue) !== "")) {
|
|
239
|
+
roots.push(node);
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
const parentNode = nodes.get(String(parentValue));
|
|
243
|
+
if (!parentNode) {
|
|
244
|
+
roots.push(node);
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
parentNode[childrenKey].push(node);
|
|
248
|
+
}
|
|
249
|
+
return roots;
|
|
250
|
+
};
|
|
192
251
|
var tree_item_renderer_default = TreeItemRenderer;
|
|
193
252
|
|
|
194
253
|
//#endregion
|
|
195
254
|
//#region src/components/ui/selector.tsx
|
|
196
|
-
function Selector({ type = "single", value, onChange, search, onSearch, items, withPortal = true, label, placeholder, fieldLabel, fieldKey, groupBy, treeRender = false, fieldChildren, fieldDisabled, searchPlaceholder, name, empty = "Nenhuma opção encontrada...", disabled = false, className, required, error, selectFirstIsOne, help, extra, extraOnClick, open, setOpen, maxVisibleBadges = 3, id, imageField, disabledField, onDisabledClick, loadMore, hasMore, isLoading,...props }) {
|
|
255
|
+
function Selector({ type = "single", value, onChange, search, onSearch, items, withPortal = true, label, placeholder, fieldLabel, fieldKey, groupBy, treeRender = false, fieldChildren, fieldParent, fieldDisabled, searchPlaceholder, name, empty = "Nenhuma opção encontrada...", disabled = false, className, required, error, selectFirstIsOne, help, extra, extraOnClick, open, setOpen, maxVisibleBadges = 3, id, imageField, disabledField, onDisabledClick, itemRightElement, loadMore, hasMore, isLoading,...props }) {
|
|
197
256
|
const itemKey = fieldKey || fieldLabel;
|
|
198
257
|
const childrenKey = fieldChildren || "children";
|
|
258
|
+
const parentKey = fieldParent || "parent";
|
|
199
259
|
const isMultiple = type === "multiple";
|
|
200
260
|
const selectedItems = isMultiple && Array.isArray(value) ? value : [];
|
|
201
261
|
const singleValue = !isMultiple && !Array.isArray(value) ? value : void 0;
|
|
202
|
-
const itensGroups = useMemo(() =>
|
|
203
|
-
items,
|
|
204
|
-
groupBy,
|
|
205
|
-
treeRender
|
|
206
|
-
]);
|
|
262
|
+
const itensGroups = useMemo(() => buildGroups(items, groupBy), [items, groupBy]);
|
|
207
263
|
const { ref: loadMoreRef, inView } = useInView({
|
|
208
264
|
threshold: 0,
|
|
209
265
|
rootMargin: "100px",
|
|
@@ -315,10 +371,10 @@ function Selector({ type = "single", value, onChange, search, onSearch, items, w
|
|
|
315
371
|
className: "max-h-none overflow-visible",
|
|
316
372
|
onWheel: (e) => e.stopPropagation(),
|
|
317
373
|
children: /* @__PURE__ */ jsxs(ScrollArea, {
|
|
318
|
-
className: "h-fit max-h-
|
|
374
|
+
className: "h-fit max-h-75",
|
|
319
375
|
id: "scroll",
|
|
320
376
|
children: [/* @__PURE__ */ jsxs(ScrollAreaViewport, {
|
|
321
|
-
className: "w-full h-fit max-h-
|
|
377
|
+
className: "w-full h-fit max-h-75 relative",
|
|
322
378
|
children: [
|
|
323
379
|
/* @__PURE__ */ jsx(CommandEmpty, {
|
|
324
380
|
className: "text-sm p-3 text-foreground/60",
|
|
@@ -327,18 +383,20 @@ function Selector({ type = "single", value, onChange, search, onSearch, items, w
|
|
|
327
383
|
treeRender ? items.length > 0 && /* @__PURE__ */ jsx(CommandGroup, { children: /* @__PURE__ */ jsx(tree_item_renderer_default, {
|
|
328
384
|
childrenKey,
|
|
329
385
|
disabledKey: fieldDisabled,
|
|
386
|
+
groupBy,
|
|
330
387
|
isItemSelected,
|
|
331
388
|
isMultiple,
|
|
332
389
|
itemKey,
|
|
333
390
|
items,
|
|
334
391
|
labelKey: fieldLabel,
|
|
335
|
-
onSelect: handleItemSelect
|
|
392
|
+
onSelect: handleItemSelect,
|
|
393
|
+
parentKey
|
|
336
394
|
}) }) : itensGroups.length > 0 && itensGroups.some((group) => group.items.length > 0) && itensGroups.map((group) => /* @__PURE__ */ jsx(CommandGroup, {
|
|
337
395
|
heading: group.heading || group.id === UNDEFINED_GROUP_ID && "Outros",
|
|
338
396
|
children: group.items.map((item) => {
|
|
339
397
|
const isDisabled = disabledField ? !!item[disabledField] : false;
|
|
340
398
|
return /* @__PURE__ */ jsxs(CommandItem, {
|
|
341
|
-
className: cn("transition-all p-2", isMultiple && "gap-2", !isMultiple && isItemSelected(item) && "bg-accent! text-accent-foreground", isDisabled && "opacity-50"),
|
|
399
|
+
className: cn("transition-all p-2", isMultiple && "gap-2", !isMultiple && isItemSelected(item) && "bg-accent! text-accent-foreground", isDisabled && !onDisabledClick && !itemRightElement && "opacity-50"),
|
|
342
400
|
onSelect: () => {
|
|
343
401
|
if (isDisabled && onDisabledClick) {
|
|
344
402
|
onDisabledClick(item);
|
|
@@ -354,15 +412,19 @@ function Selector({ type = "single", value, onChange, search, onSearch, items, w
|
|
|
354
412
|
className: "relative w-8 h-8 overflow-hidden rounded-md border bg-muted shrink-0",
|
|
355
413
|
children: item[imageField] ? /* @__PURE__ */ jsx("img", {
|
|
356
414
|
alt: item[fieldLabel],
|
|
357
|
-
|
|
358
|
-
|
|
415
|
+
src: item[imageField],
|
|
416
|
+
className: "w-full h-full object-cover"
|
|
359
417
|
}) : /* @__PURE__ */ jsx("div", {
|
|
360
418
|
className: "w-full h-full flex items-center justify-center",
|
|
361
419
|
children: /* @__PURE__ */ jsx(Package, { className: "h-4 w-4 text-muted-foreground" })
|
|
362
420
|
})
|
|
363
421
|
}),
|
|
364
|
-
|
|
365
|
-
|
|
422
|
+
/* @__PURE__ */ jsx("span", {
|
|
423
|
+
className: cn("flex-1 text-left min-w-0 pr-2", isDisabled && "opacity-50"),
|
|
424
|
+
children: item[fieldLabel]
|
|
425
|
+
}),
|
|
426
|
+
itemRightElement?.(item),
|
|
427
|
+
!isMultiple && isItemSelected(item) && !isDisabled && /* @__PURE__ */ jsx(Check, { className: "ml-auto h-4 w-4 shrink-0" })
|
|
366
428
|
]
|
|
367
429
|
}, `item-${item[itemKey]}`);
|
|
368
430
|
})
|
|
@@ -376,8 +438,8 @@ function Selector({ type = "single", value, onChange, search, onSearch, items, w
|
|
|
376
438
|
children: extra
|
|
377
439
|
}),
|
|
378
440
|
hasMore && /* @__PURE__ */ jsx("div", {
|
|
379
|
-
ref: loadMoreRef,
|
|
380
441
|
className: "flex justify-center py-2",
|
|
442
|
+
ref: loadMoreRef,
|
|
381
443
|
children: isLoading && /* @__PURE__ */ jsx(Loader2, { className: "h-4 w-4 animate-spin text-muted-foreground" })
|
|
382
444
|
})
|
|
383
445
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-selector.js","names":["Checkbox","CheckboxPrimitive","CheckboxIndicatorPrimitive","Command","CommandPrimitive","Checkbox","Command","TreeItemRenderer","Checkbox","id"],"sources":["../src/components/ui/badge.tsx","../src/components/ui/checkbox.tsx","../src/components/ui/command.tsx","../src/components/ui/tree-item-renderer.tsx","../src/components/ui/selector.tsx","../src/components/remote-selector/remote-selector.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive:\n 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\n warning: 'border-transparent bg-warning text-warning-foreground',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };\n","'use client';\n\nimport * as React from 'react';\n\nimport {\n Indicator as CheckboxIndicatorPrimitive,\n Checkbox as CheckboxPrimitive,\n} from '@radix-ui/react-checkbox';\n\nimport { cn } from '@/lib/utils';\nimport type { HTMLMotionProps } from 'motion/react';\nimport * as motion from 'motion/react-m';\n\ntype CheckboxProps = React.ComponentProps<typeof CheckboxPrimitive> &\n HTMLMotionProps<'button'>;\n\nfunction Checkbox({ className, onCheckedChange, ...props }: CheckboxProps) {\n const [isChecked, setIsChecked] = React.useState(\n props?.checked ?? props?.defaultChecked ?? false\n );\n\n React.useEffect(() => {\n if (props?.checked !== undefined) setIsChecked(props.checked);\n }, [props?.checked]);\n\n const handleCheckedChange = React.useCallback(\n (checked: boolean) => {\n setIsChecked(checked);\n onCheckedChange?.(checked);\n },\n [onCheckedChange]\n );\n\n return (\n <CheckboxPrimitive {...props} asChild onCheckedChange={handleCheckedChange}>\n <motion.span\n className={cn(\n 'peer size-4 flex items-center justify-center shrink-0 rounded-[3px] border border-primary transition-colors duration-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground cursor-pointer',\n className\n )}\n data-slot=\"checkbox\"\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n {...props}\n >\n <CheckboxIndicatorPrimitive asChild forceMount>\n <motion.svg\n animate={isChecked ? 'checked' : 'unchecked'}\n className={cn('size-3', isChecked && 'text-primary-foreground')}\n data-slot=\"checkbox-indicator\"\n fill=\"none\"\n initial=\"unchecked\"\n stroke=\"currentColor\"\n strokeWidth=\"3.5\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <motion.path\n d=\"M4.5 12.75l6 6 9-13.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n variants={{\n checked: {\n pathLength: 1,\n opacity: 1,\n transition: {\n duration: 0.2,\n delay: 0.2,\n },\n },\n unchecked: {\n pathLength: 0,\n opacity: 0,\n transition: {\n duration: 0.2,\n },\n },\n }}\n />\n </motion.svg>\n </CheckboxIndicatorPrimitive>\n </motion.span>\n </CheckboxPrimitive>\n );\n}\n\nexport { Checkbox, type CheckboxProps };\n","'use client';\n\nimport * as React from 'react';\n\nimport { SearchIcon } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { Command as CommandPrimitive } from 'cmdk';\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n className={cn(\n 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md',\n className\n )}\n data-slot=\"command\"\n {...props}\n />\n );\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n className=\"flex h-9 items-center gap-2 border-b px-3\"\n data-slot=\"command-input-wrapper\"\n >\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n className={cn(\n 'placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n data-slot=\"command-input\"\n {...props}\n />\n </div>\n );\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n className={cn(\n 'max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto',\n className\n )}\n data-slot=\"command-list\"\n {...props}\n />\n );\n}\n\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n className=\"py-6 text-center text-sm\"\n data-slot=\"command-empty\"\n {...props}\n />\n );\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n className={cn(\n 'text-foreground **:[[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium',\n className\n )}\n data-slot=\"command-group\"\n {...props}\n />\n );\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n className={cn('bg-border -mx-1 h-px', className)}\n data-slot=\"command-separator\"\n {...props}\n />\n );\n}\n\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n data-slot=\"command-item\"\n {...props}\n />\n );\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n <span\n className={cn(\n 'text-muted-foreground ml-auto text-xs tracking-widest',\n className\n )}\n data-slot=\"command-shortcut\"\n {...props}\n />\n );\n}\n\nexport {\n Command,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n","'use client';\n\nimport { Fragment, memo } from 'react';\n\nimport { Check } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { Checkbox } from './checkbox';\nimport { CommandItem } from './command';\n\ntype TreeItemRendererProps<T> = {\n items: T[];\n itemKey: keyof T;\n labelKey: keyof T;\n childrenKey: keyof T;\n disabledKey?: keyof T;\n isMultiple?: boolean;\n isItemSelected: (item: T) => boolean;\n onSelect: (item: T) => void;\n level?: number;\n};\n\nconst TreeItemRendererComponent = <T,>({\n items,\n itemKey,\n labelKey,\n childrenKey,\n disabledKey,\n isMultiple = false,\n isItemSelected,\n onSelect,\n level = 0,\n}: TreeItemRendererProps<T>) => {\n return (\n <>\n {items.map((item) => {\n const children = Array.isArray(item[childrenKey])\n ? (item[childrenKey] as T[])\n : [];\n\n return (\n <Fragment key={`tree-item-${String(item[itemKey])}-${level}`}>\n <div className=\"relative\">\n {level > 0 && (\n <div className=\"pointer-events-none absolute left-0 top-1/2 -translate-y-1/2 w-4 h-px bg-gray-300\" />\n )}\n <CommandItem\n className={cn(\n 'transition-all p-2',\n level > 0 && 'ml-4',\n !isMultiple &&\n isItemSelected(item) &&\n 'bg-accent! text-accent-foreground'\n )}\n disabled={disabledKey ? Boolean(item[disabledKey]) : false}\n key={`item-${String(item[itemKey])}`}\n onSelect={() => onSelect(item)}\n value={String(item[itemKey])}\n >\n <div\n className={cn(\n 'flex items-center w-full gap-2',\n level > 0 && 'pl-2'\n )}\n >\n {isMultiple && <Checkbox checked={isItemSelected(item)} />}\n <span className=\"truncate\">\n {String(item[labelKey] || '')}\n </span>\n {!isMultiple && isItemSelected(item) && (\n <Check className=\"ml-auto h-4 w-4\" />\n )}\n </div>\n </CommandItem>\n </div>\n <div\n className={cn(\n children.length > 0 &&\n 'ml-4 relative before:absolute before:left-0 before:top-0 before:bottom-4 before:border-l before:border-gray-300'\n )}\n >\n {children.length > 0 && (\n <TreeItemRenderer\n childrenKey={childrenKey}\n disabledKey={disabledKey}\n isItemSelected={isItemSelected}\n isMultiple={isMultiple}\n itemKey={itemKey}\n items={children}\n labelKey={labelKey}\n level={level + 1}\n onSelect={onSelect}\n />\n )}\n </div>\n </Fragment>\n );\n })}\n </>\n );\n};\n\nconst TreeItemRenderer = memo(\n TreeItemRendererComponent\n) as typeof TreeItemRendererComponent;\n\nexport default TreeItemRenderer;\n","'use client';\n\nimport { useEffect, useMemo } from 'react';\n\nimport type { PopoverProps } from '@radix-ui/react-popover';\nimport { ScrollArea, ScrollAreaViewport } from '@radix-ui/react-scroll-area';\n\nimport { Check, ChevronsUpDown, Loader2, Package, X } from 'lucide-react';\nimport { useInView } from 'react-intersection-observer';\n\nimport { cn } from '@/lib/utils';\nimport { Badge } from './badge';\nimport { Button } from './button';\nimport { Checkbox } from './checkbox';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from './command';\nimport { InputHelp } from './input-help';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { ScrollBar } from './scroll-area';\nimport TreeItemRenderer from './tree-item-renderer';\n\nexport type SelectorOption = {\n id: string | number;\n name: string;\n value?: any;\n children?: SelectorOption[];\n disabled?: boolean;\n};\n\nexport type SelectorProps<T> = {\n type?: 'single' | 'multiple';\n value?: T | T[];\n onChange?: (item: T | T[] | undefined | null) => void;\n search?: string;\n onSearch?: (search: string) => void;\n placeholder?: string;\n empty?: React.ReactNode;\n items: T[];\n fieldLabel: keyof T;\n withPortal?: boolean;\n fieldKey?: keyof T;\n groupBy?: keyof T;\n treeRender?: boolean;\n fieldChildren?: keyof T;\n fieldDisabled?: keyof T;\n disabled?: boolean;\n searchPlaceholder?: string;\n label?: string;\n name?: string;\n className?: string;\n required?: boolean;\n error?: React.ReactNode;\n selectFirstIsOne?: boolean;\n help?: string;\n extra?: string;\n extraOnClick?: (\n onChange?: (item: T | T[] | undefined | null) => void\n ) => Promise<void> | void;\n open?: boolean;\n setOpen?: (open: boolean) => void;\n maxVisibleBadges?: number;\n id?: string;\n imageField?: keyof T;\n disabledField?: keyof T;\n onDisabledClick?: (item: T) => void;\n loadMore?: () => void;\n hasMore?: boolean;\n isLoading?: boolean;\n} & PopoverProps;\n\ntype SelectorGroup<T> = {\n id: string;\n heading?: string;\n items: T[];\n};\n\nexport function Selector<T>({\n type = 'single',\n value,\n onChange,\n search,\n onSearch,\n items,\n withPortal = true,\n label,\n placeholder,\n fieldLabel,\n fieldKey,\n groupBy,\n treeRender = false,\n fieldChildren,\n fieldDisabled,\n searchPlaceholder,\n name,\n empty = 'Nenhuma opção encontrada...',\n disabled = false,\n className,\n required,\n error,\n selectFirstIsOne,\n help,\n extra,\n extraOnClick,\n open,\n setOpen,\n maxVisibleBadges = 3,\n id,\n imageField,\n disabledField,\n onDisabledClick,\n loadMore,\n hasMore,\n isLoading,\n ...props\n}: SelectorProps<T>) {\n const itemKey = fieldKey || fieldLabel;\n const childrenKey = (fieldChildren || 'children') as keyof T;\n\n const isMultiple = type === 'multiple';\n const selectedItems = isMultiple && Array.isArray(value) ? value : [];\n const singleValue = !isMultiple && !Array.isArray(value) ? value : undefined;\n const itensGroups = useMemo(\n () => (treeRender ? [] : buildGroups(items, groupBy)),\n [items, groupBy, treeRender]\n );\n\n // Infinite scroll\n const { ref: loadMoreRef, inView } = useInView({\n threshold: 0,\n rootMargin: '100px',\n skip: !hasMore || isLoading,\n });\n\n useEffect(() => {\n if (inView && hasMore && loadMore && !isLoading) {\n loadMore();\n }\n }, [inView, hasMore, loadMore, isLoading]);\n\n const isItemSelected = (item: T): boolean => {\n if (isMultiple) {\n return selectedItems.some(\n (selected) => selected[itemKey] === item[itemKey]\n );\n }\n return singleValue?.[itemKey] === item[itemKey];\n };\n\n const handleItemSelect = (item: T) => {\n if (isMultiple) {\n const isSelected = isItemSelected(item);\n const newValue = isSelected\n ? selectedItems.filter(\n (selected) => selected[itemKey] !== item[itemKey]\n )\n : [...selectedItems, item];\n onChange?.(newValue.length > 0 ? newValue : null);\n } else {\n onChange?.(item);\n setOpen?.(false);\n }\n };\n\n useEffect(() => {\n if (selectFirstIsOne && items && items.length === 1 && !value) {\n onChange?.(items[0] as any);\n }\n }, [items]);\n\n return (\n <div\n className={cn('w-full flex flex-col gap-1', className)}\n id={id || `selector-${name}`}\n >\n {label && (\n <div className=\"flex items-end gap-1.5\">\n <label\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n htmlFor={id || name}\n >\n {label}:\n {required && (\n <span className=\"text-red-500 text-lg leading-px\">*</span>\n )}\n </label>\n\n <InputHelp help={help} name={name} />\n </div>\n )}\n <div className=\"flex flex-col gap-1\">\n <Popover onOpenChange={setOpen} open={open} {...props}>\n <PopoverTrigger asChild>\n <Button\n aria-expanded={open}\n aria-label=\"Carregando opções...\"\n className={cn(\n 'mt-0! justify-between w-full hover:bg-transparent cursor-pointer',\n !value && 'text-muted-foreground',\n error && 'border-destructive'\n )}\n disabled={disabled}\n id={id || name}\n role=\"combobox\"\n variant=\"outline\"\n >\n {isMultiple && selectedItems.length > 0 ? (\n <div className=\"flex gap-1 flex-1 min-w-0 overflow-hidden\">\n {selectedItems\n .slice(0, maxVisibleBadges)\n .map((item, index) => (\n <Badge\n className=\"truncate shrink min-w-0\"\n key={`badge-${item[itemKey]}-${index}`}\n variant=\"secondary\"\n >\n <span className=\"truncate block\">\n {item[fieldLabel] as string}\n </span>\n </Badge>\n ))}\n {selectedItems.length > maxVisibleBadges && (\n <Badge className=\"shrink-0\" variant=\"secondary\">\n +{selectedItems.length - maxVisibleBadges}\n </Badge>\n )}\n </div>\n ) : (\n <span className=\"truncate\">\n {!isMultiple && singleValue\n ? (singleValue[fieldLabel] as string)\n : placeholder || `Selecione a ${label?.toLowerCase()}`}\n </span>\n )}\n <div className=\"flex items-center shrink-0\">\n <div className=\"relative size-4\">\n {((isMultiple && selectedItems.length > 0) ||\n (!isMultiple && singleValue !== undefined)) && (\n <div\n className=\"absolute left-1/2 -translate-x-1/2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onChange?.(null);\n }}\n >\n <X className=\"size-4\" />\n </div>\n )}\n </div>\n <ChevronsUpDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-(--radix-popover-trigger-width) max-w-2xl p-0\" withPortal={withPortal}>\n <Command shouldFilter={false}>\n <CommandInput\n onValueChange={onSearch}\n placeholder={\n searchPlaceholder ||\n `Pesquise por uma ${label?.toLowerCase()}`\n }\n value={search}\n />\n <CommandList\n className=\"max-h-none overflow-visible\"\n onWheel={(e) => e.stopPropagation()}\n >\n <ScrollArea className=\"h-fit max-h-[300px]\" id=\"scroll\">\n <ScrollAreaViewport className=\"w-full h-fit max-h-[300px] relative\">\n <CommandEmpty className=\"text-sm p-3 text-foreground/60\">\n {empty}\n </CommandEmpty>\n {treeRender ? (\n items.length > 0 && (\n <CommandGroup>\n <TreeItemRenderer\n childrenKey={childrenKey}\n disabledKey={fieldDisabled}\n isItemSelected={isItemSelected}\n isMultiple={isMultiple}\n itemKey={itemKey}\n items={items}\n labelKey={fieldLabel}\n onSelect={handleItemSelect}\n />\n </CommandGroup>\n )\n ) : (\n itensGroups.length > 0 &&\n itensGroups.some((group) => group.items.length > 0) &&\n itensGroups.map((group) => (\n <CommandGroup\n heading={\n group.heading ||\n (group.id === UNDEFINED_GROUP_ID && 'Outros')\n }\n key={`group-${group.id}`}\n >\n {group.items.map((item) => {\n const isDisabled = disabledField\n ? !!item[disabledField]\n : false;\n\n return (\n <CommandItem\n className={cn(\n 'transition-all p-2',\n isMultiple && 'gap-2',\n !isMultiple &&\n isItemSelected(item) &&\n 'bg-accent! text-accent-foreground',\n isDisabled && 'opacity-50'\n )}\n key={`item-${item[itemKey]}`}\n onSelect={() => {\n if (isDisabled && onDisabledClick) {\n onDisabledClick(item);\n return;\n }\n\n if (isDisabled) return;\n handleItemSelect(item);\n }}\n value={String(item[itemKey])}\n >\n {isMultiple && (\n <Checkbox checked={isItemSelected(item)} />\n )}\n {isMultiple && imageField && (\n <div className=\"relative w-8 h-8 overflow-hidden rounded-md border bg-muted shrink-0\">\n {item[imageField] ? (\n <img\n alt={item[fieldLabel] as string}\n className=\"w-full h-full object-cover\"\n src={item[imageField] as string}\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <Package className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n )}\n </div>\n )}\n {item[fieldLabel] as string}\n {!isMultiple && isItemSelected(item) && (\n <Check className=\"ml-auto h-4 w-4\" />\n )}\n </CommandItem>\n );\n })}\n </CommandGroup>\n ))\n )}\n {extra && (\n <CommandItem\n className={cn(\n 'transition-all p-2 sticky bottom-0 bg-white hover:bg-accent! aria-selected:bg-accent!'\n )}\n onSelect={() => {\n extraOnClick?.(onChange);\n setOpen?.(false);\n }}\n >\n {extra}\n </CommandItem>\n )}\n {/* Infinite scroll sentinel */}\n {hasMore && (\n <div ref={loadMoreRef} className=\"flex justify-center py-2\">\n {isLoading && (\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n )}\n </div>\n )}\n </ScrollAreaViewport>\n <ScrollBar />\n </ScrollArea>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n {error && error}\n </div>\n </div>\n );\n}\n\nconst DEFAULT_GROUP_ID = 'selector-default-group';\nconst UNDEFINED_GROUP_ID = 'selector-undefined-group';\n\nconst buildGroups = <T,>(items: T[], groupBy?: keyof T): SelectorGroup<T>[] => {\n if (!groupBy) return [{ id: DEFAULT_GROUP_ID, items }];\n\n return Object.values(\n items.reduce<Record<string, SelectorGroup<T>>>((acc, item) => {\n const rawValue = item[groupBy];\n const heading = rawValue == null ? undefined : String(rawValue);\n const groupId = heading ?? UNDEFINED_GROUP_ID;\n\n if (!acc[groupId]) {\n acc[groupId] = { id: groupId, heading, items: [] };\n }\n\n acc[groupId].items.push(item);\n return acc;\n }, {})\n );\n};\n","'use client';\n\nimport { useEffect, useId, useMemo, useState } from 'react';\n\nimport {\n type FieldPath,\n type FieldPathValue,\n type FieldValues,\n type UseControllerProps,\n useController,\n useFormContext,\n} from 'react-hook-form';\nimport { useDebounce } from 'use-debounce';\n\nimport { FormItem, FormMessage } from '@/components/ui/form';\nimport { Selector, type SelectorProps } from '../ui/selector';\n\nimport {\n type Options,\n parseAsArrayOf,\n parseAsString,\n useQueryState,\n} from 'nuqs';\n\nexport type TUseData<T> = (\n search?: string,\n initialParams?: any,\n disabled?: boolean\n) => {\n data: T[];\n loadMore?: () => void;\n hasMore?: boolean;\n isLoading?: boolean;\n};\n\nexport type BaseRemoteSelectorProps<T> = {\n useData: TUseData<T>;\n initialParams?: Parameters<TUseData<T>>[1];\n initialRequest?: boolean;\n forceToggle?: boolean;\n} & Omit<\n SelectorProps<T>,\n 'items' | 'value' | 'onChange' | 'search' | 'onSearch' | 'open' | 'setOpen' | 'loadMore' | 'hasMore' | 'isLoading'\n>;\n\nexport interface RemoteSelectorFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> extends UseControllerProps<TFieldValues, TFieldName> {\n disabled?: boolean;\n required?: boolean;\n defaultValue?: FieldPathValue<TFieldValues, TFieldName>;\n onChange?: (value: any) => Promise<void> | void;\n nameValue?: string;\n}\n\nexport function RemoteSelectorField<\n T,\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n name,\n nameValue,\n className,\n required,\n defaultValue,\n onChange: onChangeCallback,\n useData,\n initialParams,\n withPortal = true,\n initialRequest = false,\n forceToggle = false,\n ...props\n}: RemoteSelectorFieldProps<TFieldValues, TFieldName> &\n BaseRemoteSelectorProps<T> & {\n withPortal?: boolean;\n }) {\n type TItem = NonNullable<ReturnType<TUseData<T>>['data']>[number];\n\n const { control, setValue } = useFormContext();\n const { field, fieldState } = useController({\n control,\n name,\n rules: { required: required ? 'Campo obrigatório' : false },\n defaultValue,\n });\n\n const id = useId();\n\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [searchDebounced] = useDebounce(search, 100, {\n maxWait: 200,\n });\n\n const { data, loadMore, hasMore, isLoading } = useData(\n searchDebounced,\n initialParams,\n !open && !initialRequest\n );\n\n const handleChange = (value: any) => {\n field.onChange(value as TItem);\n if (nameValue && props.fieldKey) {\n if (value) {\n if (Array.isArray(value)) {\n setValue(\n nameValue,\n value.map((item) => item[props.fieldKey] as string)\n );\n } else {\n setValue(nameValue, value[props.fieldKey] as string);\n }\n } else {\n setValue(nameValue, null);\n }\n }\n onChangeCallback?.(value as TItem);\n };\n\n useEffect(() => {\n setOpen(forceToggle);\n }, [forceToggle]);\n\n return (\n <FormItem className={className}>\n <Selector\n {...props}\n withPortal={withPortal}\n error={fieldState?.error && <FormMessage />}\n hasMore={hasMore}\n id={`${id}-${name.replaceAll('.', '-')}`}\n isLoading={isLoading}\n items={data as TItem[]}\n loadMore={loadMore}\n name={name}\n onChange={handleChange}\n onSearch={setSearch}\n open={open}\n required={required}\n search={search}\n setOpen={setOpen}\n value={field.value as TItem}\n />\n </FormItem>\n );\n}\n\nexport interface RemoteSelectorQueryProps<T>\n extends BaseRemoteSelectorProps<T> {\n name: string;\n defaultValue?: string;\n options?: Options;\n onChange?: (value: T | T[] | null) => void;\n}\n\nexport function RemoteSelectorQuery<T>({\n name,\n defaultValue,\n options,\n useData,\n initialParams,\n initialRequest = false,\n forceToggle = false,\n onChange: onChangeCallback,\n fieldKey,\n fieldLabel,\n type = 'single',\n ...props\n}: RemoteSelectorQueryProps<T>) {\n type TItem = NonNullable<ReturnType<TUseData<T>>['data']>[number];\n\n const id = useId();\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [searchDebounced] = useDebounce(search, 100, {\n maxWait: 200,\n });\n\n const { data, loadMore, hasMore, isLoading } = useData(\n searchDebounced,\n initialParams,\n !open && !initialRequest\n );\n\n useEffect(() => {\n setOpen(forceToggle);\n }, [forceToggle]);\n\n const itemKey = fieldKey || fieldLabel;\n const isMultiple = type === 'multiple';\n const childrenKey = props.treeRender\n ? ((props.fieldChildren || 'children') as keyof TItem)\n : undefined;\n\n const allItems = useMemo(\n () => flattenItems(data as TItem[], childrenKey),\n [data, childrenKey]\n );\n\n const parser = isMultiple\n ? parseAsArrayOf(parseAsString).withDefault([])\n : parseAsString.withDefault(defaultValue ?? '');\n\n const [queryIds, setQueryIds] = useQueryState(\n name,\n parser.withOptions({\n clearOnDefault: true,\n shallow: false,\n ...options,\n })\n );\n\n const value =\n isMultiple && Array.isArray(queryIds)\n ? queryIds\n .map((id) => allItems.find((item) => String(item[itemKey]) === id))\n .filter((item): item is TItem => !!item)\n : allItems.find((item) => String(item[itemKey]) === queryIds) || null;\n\n const handleChange = (newValue: T | T[] | null | undefined) => {\n if (!newValue) {\n setQueryIds(isMultiple ? ([] as any) : null);\n } else if (isMultiple && Array.isArray(newValue)) {\n setQueryIds(newValue.map((item) => String(item[itemKey])) as any);\n } else {\n setQueryIds(String((newValue as T)[itemKey]) as any);\n }\n onChangeCallback?.(newValue as T | T[] | null);\n };\n\n return (\n <Selector\n {...props}\n fieldKey={fieldKey}\n fieldLabel={fieldLabel}\n hasMore={hasMore}\n id={`${id}-${name}`}\n isLoading={isLoading}\n items={data as TItem[]}\n loadMore={loadMore}\n name={name}\n onChange={handleChange}\n onSearch={setSearch}\n open={open}\n search={search}\n setOpen={setOpen}\n type={type}\n value={value as TItem}\n />\n );\n}\n\nconst flattenItems = <T,>(items: T[], childrenKey?: keyof T): T[] => {\n if (!childrenKey) return items;\n\n return items.reduce<T[]>((acc, item) => {\n const children = item[childrenKey];\n const childrenItems = Array.isArray(children) ? (children as T[]) : [];\n\n acc.push(item, ...flattenItems(childrenItems, childrenKey));\n return acc;\n }, []);\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"remote-selector.js","names":["Checkbox","CheckboxPrimitive","CheckboxIndicatorPrimitive","Command","CommandPrimitive","buildGroups","Checkbox","DEFAULT_GROUP_ID","UNDEFINED_GROUP_ID","roots: T[]","Command","TreeItemRenderer","Checkbox","id"],"sources":["../src/components/ui/badge.tsx","../src/components/ui/checkbox.tsx","../src/components/ui/command.tsx","../src/components/ui/tree-item-renderer.tsx","../src/components/ui/selector.tsx","../src/components/remote-selector/remote-selector.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { cn } from '@/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2',\n {\n variants: {\n variant: {\n default:\n 'border-transparent bg-primary text-primary-foreground hover:bg-primary/80',\n secondary:\n 'border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80',\n destructive:\n 'border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80',\n warning: 'border-transparent bg-warning text-warning-foreground',\n outline: 'text-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n }\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n );\n}\n\nexport { Badge, badgeVariants };\n","'use client';\n\nimport * as React from 'react';\n\nimport {\n Indicator as CheckboxIndicatorPrimitive,\n Checkbox as CheckboxPrimitive,\n} from '@radix-ui/react-checkbox';\n\nimport { cn } from '@/lib/utils';\nimport type { HTMLMotionProps } from 'motion/react';\nimport * as motion from 'motion/react-m';\n\ntype CheckboxProps = React.ComponentProps<typeof CheckboxPrimitive> &\n HTMLMotionProps<'button'>;\n\nfunction Checkbox({ className, onCheckedChange, ...props }: CheckboxProps) {\n const [isChecked, setIsChecked] = React.useState(\n props?.checked ?? props?.defaultChecked ?? false\n );\n\n React.useEffect(() => {\n if (props?.checked !== undefined) setIsChecked(props.checked);\n }, [props?.checked]);\n\n const handleCheckedChange = React.useCallback(\n (checked: boolean) => {\n setIsChecked(checked);\n onCheckedChange?.(checked);\n },\n [onCheckedChange]\n );\n\n return (\n <CheckboxPrimitive {...props} asChild onCheckedChange={handleCheckedChange}>\n <motion.span\n className={cn(\n 'peer size-4 flex items-center justify-center shrink-0 rounded-[3px] border border-primary transition-colors duration-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground cursor-pointer',\n className\n )}\n data-slot=\"checkbox\"\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n {...props}\n >\n <CheckboxIndicatorPrimitive asChild forceMount>\n <motion.svg\n animate={isChecked ? 'checked' : 'unchecked'}\n className={cn('size-3', isChecked && 'text-primary-foreground')}\n data-slot=\"checkbox-indicator\"\n fill=\"none\"\n initial=\"unchecked\"\n stroke=\"currentColor\"\n strokeWidth=\"3.5\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <motion.path\n d=\"M4.5 12.75l6 6 9-13.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n variants={{\n checked: {\n pathLength: 1,\n opacity: 1,\n transition: {\n duration: 0.2,\n delay: 0.2,\n },\n },\n unchecked: {\n pathLength: 0,\n opacity: 0,\n transition: {\n duration: 0.2,\n },\n },\n }}\n />\n </motion.svg>\n </CheckboxIndicatorPrimitive>\n </motion.span>\n </CheckboxPrimitive>\n );\n}\n\nexport { Checkbox, type CheckboxProps };\n","'use client';\n\nimport * as React from 'react';\n\nimport { SearchIcon } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { Command as CommandPrimitive } from 'cmdk';\n\nfunction Command({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive>) {\n return (\n <CommandPrimitive\n className={cn(\n 'bg-popover text-popover-foreground flex h-full w-full flex-col overflow-hidden rounded-md',\n className\n )}\n data-slot=\"command\"\n {...props}\n />\n );\n}\n\nfunction CommandInput({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Input>) {\n return (\n <div\n className=\"flex h-9 items-center gap-2 border-b px-3\"\n data-slot=\"command-input-wrapper\"\n >\n <SearchIcon className=\"size-4 shrink-0 opacity-50\" />\n <CommandPrimitive.Input\n className={cn(\n 'placeholder:text-muted-foreground flex h-10 w-full rounded-md bg-transparent py-3 text-sm outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n data-slot=\"command-input\"\n {...props}\n />\n </div>\n );\n}\n\nfunction CommandList({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.List>) {\n return (\n <CommandPrimitive.List\n className={cn(\n 'max-h-[300px] scroll-py-1 overflow-x-hidden overflow-y-auto',\n className\n )}\n data-slot=\"command-list\"\n {...props}\n />\n );\n}\n\nfunction CommandEmpty({\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Empty>) {\n return (\n <CommandPrimitive.Empty\n className=\"py-6 text-center text-sm\"\n data-slot=\"command-empty\"\n {...props}\n />\n );\n}\n\nfunction CommandGroup({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Group>) {\n return (\n <CommandPrimitive.Group\n className={cn(\n 'text-foreground **:[[cmdk-group-heading]]:text-muted-foreground overflow-hidden p-1 [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium',\n className\n )}\n data-slot=\"command-group\"\n {...props}\n />\n );\n}\n\nfunction CommandSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Separator>) {\n return (\n <CommandPrimitive.Separator\n className={cn('bg-border -mx-1 h-px', className)}\n data-slot=\"command-separator\"\n {...props}\n />\n );\n}\n\nfunction CommandItem({\n className,\n ...props\n}: React.ComponentProps<typeof CommandPrimitive.Item>) {\n return (\n <CommandPrimitive.Item\n className={cn(\n \"data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n data-slot=\"command-item\"\n {...props}\n />\n );\n}\n\nfunction CommandShortcut({\n className,\n ...props\n}: React.ComponentProps<'span'>) {\n return (\n <span\n className={cn(\n 'text-muted-foreground ml-auto text-xs tracking-widest',\n className\n )}\n data-slot=\"command-shortcut\"\n {...props}\n />\n );\n}\n\nexport {\n Command,\n CommandInput,\n CommandList,\n CommandEmpty,\n CommandGroup,\n CommandItem,\n CommandShortcut,\n CommandSeparator,\n};\n","'use client';\n\nimport { Fragment, memo, useMemo } from 'react';\n\nimport { Check } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { Checkbox } from './checkbox';\nimport { CommandItem } from './command';\n\ntype TreeItemRendererProps<T> = {\n items: T[];\n itemKey: keyof T;\n labelKey: keyof T;\n childrenKey: keyof T;\n parentKey?: keyof T;\n groupBy?: keyof T;\n disabledKey?: keyof T;\n isMultiple?: boolean;\n isItemSelected: (item: T) => boolean;\n onSelect: (item: T) => void;\n level?: number;\n};\n\nconst TreeItemRendererComponent = <T,>({\n items,\n itemKey,\n labelKey,\n childrenKey,\n parentKey,\n groupBy,\n disabledKey,\n isMultiple = false,\n isItemSelected,\n onSelect,\n level = 0,\n}: TreeItemRendererProps<T>) => {\n const parsedItems = useMemo(\n () =>\n level === 0\n ? normalizeTreeItems(\n items,\n itemKey,\n childrenKey,\n (parentKey || 'parent') as keyof T\n )\n : items,\n [level, items, itemKey, childrenKey, parentKey]\n );\n\n return (\n <>\n {parsedItems.map((item) => {\n const children = Array.isArray(item[childrenKey])\n ? (item[childrenKey] as T[])\n : [];\n const childrenGroups = buildGroups(children, groupBy);\n\n return (\n <Fragment key={`tree-item-${String(item[itemKey])}-${level}`}>\n <div className=\"relative\">\n {level > 0 && (\n <div className=\"pointer-events-none absolute left-0 top-1/2 -translate-y-1/2 w-4 h-px bg-gray-300\" />\n )}\n <CommandItem\n className={cn(\n 'transition-all p-2',\n level > 0 && 'ml-4',\n !isMultiple &&\n isItemSelected(item) &&\n 'bg-accent! text-accent-foreground'\n )}\n disabled={disabledKey ? Boolean(item[disabledKey]) : false}\n key={`item-${String(item[itemKey])}`}\n onSelect={() => onSelect(item)}\n value={String(item[itemKey])}\n >\n <div\n className={cn(\n 'flex items-center w-full gap-2',\n level > 0 && 'pl-2'\n )}\n >\n {isMultiple && <Checkbox checked={isItemSelected(item)} />}\n <span className=\"truncate\">\n {String(item[labelKey] || '')}\n </span>\n {!isMultiple && isItemSelected(item) && (\n <Check className=\"ml-auto h-4 w-4\" />\n )}\n </div>\n </CommandItem>\n </div>\n <div\n className={cn(\n children.length > 0 &&\n 'ml-4 relative before:absolute before:left-0 before:top-0 before:bottom-4 before:border-l before:border-gray-300'\n )}\n >\n {children.length > 0 && (\n <>\n {childrenGroups.map((group) => (\n <div\n key={`tree-group-${String(item[itemKey])}-${group.id}`}\n >\n {groupBy && (\n <div className=\"px-2 py-1 ml-4 text-[11px] font-medium text-muted-foreground/90 uppercase tracking-wide\">\n {group.heading || 'Outros'}\n </div>\n )}\n <TreeItemRenderer\n childrenKey={childrenKey}\n disabledKey={disabledKey}\n groupBy={groupBy}\n isItemSelected={isItemSelected}\n isMultiple={isMultiple}\n itemKey={itemKey}\n items={group.items}\n labelKey={labelKey}\n level={level + 1}\n onSelect={onSelect}\n parentKey={parentKey}\n />\n </div>\n ))}\n </>\n )}\n </div>\n </Fragment>\n );\n })}\n </>\n );\n};\n\nconst TreeItemRenderer = memo(\n TreeItemRendererComponent\n) as typeof TreeItemRendererComponent;\n\ntype TreeGroup<T> = {\n id: string;\n heading?: string;\n items: T[];\n};\n\nconst DEFAULT_GROUP_ID = 'tree-group-default';\nconst UNDEFINED_GROUP_ID = 'tree-group-undefined';\n\nconst buildGroups = <T,>(items: T[], groupBy?: keyof T): TreeGroup<T>[] => {\n if (!groupBy) return [{ id: DEFAULT_GROUP_ID, items }];\n\n return Object.values(\n items.reduce<Record<string, TreeGroup<T>>>((acc, item) => {\n const rawValue = item[groupBy];\n const heading = rawValue == null ? undefined : String(rawValue);\n const groupId = heading ?? UNDEFINED_GROUP_ID;\n\n if (!acc[groupId]) {\n acc[groupId] = { id: groupId, heading, items: [] };\n }\n\n acc[groupId].items.push(item);\n return acc;\n }, {})\n );\n};\n\nconst normalizeTreeItems = <T,>(\n items: T[],\n itemKey: keyof T,\n childrenKey: keyof T,\n parentKey: keyof T\n): T[] => {\n if (items.length === 0) return items;\n\n const hasNestedChildren = items.some(\n (item) =>\n Array.isArray(item[childrenKey]) &&\n (item[childrenKey] as unknown[]).length > 0\n );\n\n if (hasNestedChildren) return items;\n\n const hasParentField = items.some((item) =>\n Object.prototype.hasOwnProperty.call(\n item as object,\n parentKey as PropertyKey\n )\n );\n\n if (!hasParentField) return items;\n\n const nodes = new Map<string, T>();\n const roots: T[] = [];\n\n for (const item of items) {\n nodes.set(String(item[itemKey]), {\n ...(item as object),\n [childrenKey]: [],\n } as T);\n }\n\n for (const item of items) {\n const node = nodes.get(String(item[itemKey]));\n if (!node) continue;\n\n const parentValue = item[parentKey] as unknown;\n const hasParent =\n parentValue !== null &&\n parentValue !== undefined &&\n String(parentValue) !== '';\n\n if (!hasParent) {\n roots.push(node);\n continue;\n }\n\n const parentNode = nodes.get(String(parentValue));\n if (!parentNode) {\n roots.push(node);\n continue;\n }\n\n (parentNode[childrenKey] as unknown[]).push(node);\n }\n\n return roots;\n};\n\nexport default TreeItemRenderer;\n","'use client';\n\nimport { useEffect, useMemo } from 'react';\n\nimport type { PopoverProps } from '@radix-ui/react-popover';\nimport { ScrollArea, ScrollAreaViewport } from '@radix-ui/react-scroll-area';\n\nimport { Check, ChevronsUpDown, Loader2, Package, X } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { useInView } from 'react-intersection-observer';\nimport { Badge } from './badge';\nimport { Button } from './button';\nimport { Checkbox } from './checkbox';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from './command';\nimport { InputHelp } from './input-help';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { ScrollBar } from './scroll-area';\nimport TreeItemRenderer from './tree-item-renderer';\n\nexport type SelectorOption = {\n id: string | number;\n name: string;\n value?: any;\n children?: SelectorOption[];\n disabled?: boolean;\n};\n\nexport type SelectorProps<T> = {\n type?: 'single' | 'multiple';\n value?: T | T[];\n onChange?: (item: T | T[] | undefined | null) => void;\n search?: string;\n onSearch?: (search: string) => void;\n placeholder?: string;\n empty?: React.ReactNode;\n items: T[];\n fieldLabel: keyof T;\n withPortal?: boolean;\n fieldKey?: keyof T;\n groupBy?: keyof T;\n treeRender?: boolean;\n fieldChildren?: keyof T;\n fieldParent?: keyof T;\n fieldDisabled?: keyof T;\n disabled?: boolean;\n searchPlaceholder?: string;\n label?: string;\n name?: string;\n className?: string;\n required?: boolean;\n error?: React.ReactNode;\n selectFirstIsOne?: boolean;\n help?: string;\n extra?: string;\n extraOnClick?: (\n onChange?: (item: T | T[] | undefined | null) => void\n ) => Promise<void> | void;\n open?: boolean;\n setOpen?: (open: boolean) => void;\n maxVisibleBadges?: number;\n id?: string;\n imageField?: keyof T;\n disabledField?: keyof T;\n onDisabledClick?: (item: T) => void;\n itemRightElement?: (item: T) => React.ReactNode;\n loadMore?: () => void;\n hasMore?: boolean;\n isLoading?: boolean;\n} & PopoverProps;\n\ntype SelectorGroup<T> = {\n id: string;\n heading?: string;\n items: T[];\n};\n\nexport function Selector<T>({\n type = 'single',\n value,\n onChange,\n search,\n onSearch,\n items,\n withPortal = true,\n label,\n placeholder,\n fieldLabel,\n fieldKey,\n groupBy,\n treeRender = false,\n fieldChildren,\n fieldParent,\n fieldDisabled,\n searchPlaceholder,\n name,\n empty = 'Nenhuma opção encontrada...',\n disabled = false,\n className,\n required,\n error,\n selectFirstIsOne,\n help,\n extra,\n extraOnClick,\n open,\n setOpen,\n maxVisibleBadges = 3,\n id,\n imageField,\n disabledField,\n onDisabledClick,\n itemRightElement,\n loadMore,\n hasMore,\n isLoading,\n ...props\n}: SelectorProps<T>) {\n const itemKey = fieldKey || fieldLabel;\n const childrenKey = (fieldChildren || 'children') as keyof T;\n const parentKey = (fieldParent || 'parent') as keyof T;\n\n const isMultiple = type === 'multiple';\n const selectedItems = isMultiple && Array.isArray(value) ? value : [];\n const singleValue = !isMultiple && !Array.isArray(value) ? value : undefined;\n const itensGroups = useMemo(\n () => buildGroups(items, groupBy),\n [items, groupBy]\n );\n\n // Infinite scroll\n const { ref: loadMoreRef, inView } = useInView({\n threshold: 0,\n rootMargin: '100px',\n skip: !hasMore || isLoading,\n });\n\n useEffect(() => {\n if (inView && hasMore && loadMore && !isLoading) {\n loadMore();\n }\n }, [inView, hasMore, loadMore, isLoading]);\n\n const isItemSelected = (item: T): boolean => {\n if (isMultiple) {\n return selectedItems.some(\n (selected) => selected[itemKey] === item[itemKey]\n );\n }\n return singleValue?.[itemKey] === item[itemKey];\n };\n\n const handleItemSelect = (item: T) => {\n if (isMultiple) {\n const isSelected = isItemSelected(item);\n const newValue = isSelected\n ? selectedItems.filter(\n (selected) => selected[itemKey] !== item[itemKey]\n )\n : [...selectedItems, item];\n onChange?.(newValue.length > 0 ? newValue : null);\n } else {\n onChange?.(item);\n setOpen?.(false);\n }\n };\n\n useEffect(() => {\n if (selectFirstIsOne && items && items.length === 1 && !value) {\n onChange?.(items[0] as any);\n }\n }, [items]);\n\n return (\n <div\n className={cn('w-full flex flex-col gap-1', className)}\n id={id || `selector-${name}`}\n >\n {label && (\n <div className=\"flex items-end gap-1.5\">\n <label\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n htmlFor={id || name}\n >\n {label}:\n {required && (\n <span className=\"text-red-500 text-lg leading-px\">*</span>\n )}\n </label>\n\n <InputHelp help={help} name={name} />\n </div>\n )}\n <div className=\"flex flex-col gap-1\">\n <Popover onOpenChange={setOpen} open={open} {...props}>\n <PopoverTrigger asChild>\n <Button\n aria-expanded={open}\n aria-label=\"Carregando opções...\"\n className={cn(\n 'mt-0! justify-between w-full hover:bg-transparent cursor-pointer',\n !value && 'text-muted-foreground',\n error && 'border-destructive'\n )}\n disabled={disabled}\n id={id || name}\n role=\"combobox\"\n variant=\"outline\"\n >\n {isMultiple && selectedItems.length > 0 ? (\n <div className=\"flex gap-1 flex-1 min-w-0 overflow-hidden\">\n {selectedItems\n .slice(0, maxVisibleBadges)\n .map((item, index) => (\n <Badge\n className=\"truncate shrink min-w-0\"\n key={`badge-${item[itemKey]}-${index}`}\n variant=\"secondary\"\n >\n <span className=\"truncate block\">\n {item[fieldLabel] as string}\n </span>\n </Badge>\n ))}\n {selectedItems.length > maxVisibleBadges && (\n <Badge className=\"shrink-0\" variant=\"secondary\">\n +{selectedItems.length - maxVisibleBadges}\n </Badge>\n )}\n </div>\n ) : (\n <span className=\"truncate\">\n {!isMultiple && singleValue\n ? (singleValue[fieldLabel] as string)\n : placeholder || `Selecione a ${label?.toLowerCase()}`}\n </span>\n )}\n <div className=\"flex items-center shrink-0\">\n <div className=\"relative size-4\">\n {((isMultiple && selectedItems.length > 0) ||\n (!isMultiple && singleValue !== undefined)) && (\n <div\n className=\"absolute left-1/2 -translate-x-1/2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onChange?.(null);\n }}\n >\n <X className=\"size-4\" />\n </div>\n )}\n </div>\n <ChevronsUpDown className=\"ml-2 h-4 w-4 shrink-0 opacity-50\" />\n </div>\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-(--radix-popover-trigger-width) max-w-2xl p-0\"\n withPortal={withPortal}\n >\n <Command shouldFilter={false}>\n <CommandInput\n onValueChange={onSearch}\n placeholder={\n searchPlaceholder ||\n `Pesquise por uma ${label?.toLowerCase()}`\n }\n value={search}\n />\n <CommandList\n className=\"max-h-none overflow-visible\"\n onWheel={(e) => e.stopPropagation()}\n >\n <ScrollArea className=\"h-fit max-h-75\" id=\"scroll\">\n <ScrollAreaViewport className=\"w-full h-fit max-h-75 relative\">\n <CommandEmpty className=\"text-sm p-3 text-foreground/60\">\n {empty}\n </CommandEmpty>\n {treeRender\n ? items.length > 0 && (\n <CommandGroup>\n <TreeItemRenderer\n childrenKey={childrenKey}\n disabledKey={fieldDisabled}\n groupBy={groupBy}\n isItemSelected={isItemSelected}\n isMultiple={isMultiple}\n itemKey={itemKey}\n items={items}\n labelKey={fieldLabel}\n onSelect={handleItemSelect}\n parentKey={parentKey}\n />\n </CommandGroup>\n )\n : itensGroups.length > 0 &&\n itensGroups.some((group) => group.items.length > 0) &&\n itensGroups.map((group) => (\n <CommandGroup\n heading={\n group.heading ||\n (group.id === UNDEFINED_GROUP_ID && 'Outros')\n }\n key={`group-${group.id}`}\n >\n {group.items.map((item) => {\n const isDisabled = disabledField ? !!item[disabledField] : false;\n return (\n <CommandItem\n className={cn(\n 'transition-all p-2',\n isMultiple && 'gap-2',\n !isMultiple &&\n isItemSelected(item) &&\n 'bg-accent! text-accent-foreground',\n isDisabled && !onDisabledClick && !itemRightElement && 'opacity-50'\n )}\n key={`item-${item[itemKey]}`}\n onSelect={() => {\n if (isDisabled && onDisabledClick) {\n onDisabledClick(item);\n return;\n }\n if (isDisabled) return;\n handleItemSelect(item);\n }}\n value={String(item[itemKey])}\n >\n {isMultiple && (\n <Checkbox checked={isItemSelected(item)} />\n )}\n {isMultiple && imageField && (\n <div className=\"relative w-8 h-8 overflow-hidden rounded-md border bg-muted shrink-0\">\n {item[imageField] ? (\n <img\n alt={item[fieldLabel] as string}\n src={item[imageField] as string}\n className=\"w-full h-full object-cover\"\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <Package className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n )}\n </div>\n )}\n <span className={cn('flex-1 text-left min-w-0 pr-2', isDisabled && 'opacity-50')}>\n {item[fieldLabel] as string}\n </span>\n {itemRightElement?.(item)}\n {!isMultiple && isItemSelected(item) && !isDisabled && (\n <Check className=\"ml-auto h-4 w-4 shrink-0\" />\n )}\n </CommandItem>\n );\n })}\n </CommandGroup>\n ))}\n {extra && (\n <CommandItem\n className={cn(\n 'transition-all p-2 sticky bottom-0 bg-white hover:bg-accent! aria-selected:bg-accent!'\n )}\n onSelect={() => {\n extraOnClick?.(onChange);\n setOpen?.(false);\n }}\n >\n {extra}\n </CommandItem>\n )}\n {/* Infinite scroll sentinel */}\n {hasMore && (\n <div\n className=\"flex justify-center py-2\"\n ref={loadMoreRef}\n >\n {isLoading && (\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n )}\n </div>\n )}\n </ScrollAreaViewport>\n <ScrollBar />\n </ScrollArea>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n {error && error}\n </div>\n </div>\n );\n}\n\nconst DEFAULT_GROUP_ID = 'selector-default-group';\nconst UNDEFINED_GROUP_ID = 'selector-undefined-group';\n\nconst buildGroups = <T,>(items: T[], groupBy?: keyof T): SelectorGroup<T>[] => {\n if (!groupBy) return [{ id: DEFAULT_GROUP_ID, items }];\n\n return Object.values(\n items.reduce<Record<string, SelectorGroup<T>>>((acc, item) => {\n const rawValue = item[groupBy];\n const heading = rawValue == null ? undefined : String(rawValue);\n const groupId = heading ?? UNDEFINED_GROUP_ID;\n\n if (!acc[groupId]) {\n acc[groupId] = { id: groupId, heading, items: [] };\n }\n\n acc[groupId].items.push(item);\n return acc;\n }, {})\n );\n};\n","'use client';\n\nimport { useEffect, useId, useMemo, useState } from 'react';\n\nimport {\n type FieldPath,\n type FieldPathValue,\n type FieldValues,\n type UseControllerProps,\n useController,\n useFormContext,\n} from 'react-hook-form';\nimport { useDebounce } from 'use-debounce';\n\nimport { FormItem, FormMessage } from '@/components/ui/form';\nimport { Selector, type SelectorProps } from '../ui/selector';\n\nimport {\n type Options,\n parseAsArrayOf,\n parseAsString,\n useQueryState,\n} from 'nuqs';\n\nexport type TUseData<T> = (\n search?: string,\n initialParams?: any,\n disabled?: boolean\n) => {\n data: T[];\n loadMore?: () => void;\n hasMore?: boolean;\n isLoading?: boolean;\n};\n\nexport type BaseRemoteSelectorProps<T> = {\n useData: TUseData<T>;\n initialParams?: Parameters<TUseData<T>>[1];\n initialRequest?: boolean;\n forceToggle?: boolean;\n} & Omit<\n SelectorProps<T>,\n 'items' | 'value' | 'onChange' | 'search' | 'onSearch' | 'open' | 'setOpen' | 'loadMore' | 'hasMore' | 'isLoading'\n>;\n\nexport interface RemoteSelectorFieldProps<\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> extends UseControllerProps<TFieldValues, TFieldName> {\n disabled?: boolean;\n required?: boolean;\n defaultValue?: FieldPathValue<TFieldValues, TFieldName>;\n onChange?: (value: any) => Promise<void> | void;\n nameValue?: string;\n}\n\nexport function RemoteSelectorField<\n T,\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n name,\n nameValue,\n className,\n required,\n defaultValue,\n onChange: onChangeCallback,\n useData,\n initialParams,\n withPortal = true,\n initialRequest = false,\n forceToggle = false,\n ...props\n}: RemoteSelectorFieldProps<TFieldValues, TFieldName> &\n BaseRemoteSelectorProps<T> & {\n withPortal?: boolean;\n }) {\n type TItem = NonNullable<ReturnType<TUseData<T>>['data']>[number];\n\n const { control, setValue } = useFormContext();\n const { field, fieldState } = useController({\n control,\n name,\n rules: { required: required ? 'Campo obrigatório' : false },\n defaultValue,\n });\n\n const id = useId();\n\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [searchDebounced] = useDebounce(search, 100, {\n maxWait: 200,\n });\n\n const { data, loadMore, hasMore, isLoading } = useData(\n searchDebounced,\n initialParams,\n !open && !initialRequest\n );\n\n const handleChange = (value: any) => {\n field.onChange(value as TItem);\n if (nameValue && props.fieldKey) {\n if (value) {\n if (Array.isArray(value)) {\n setValue(\n nameValue,\n value.map((item) => item[props.fieldKey] as string)\n );\n } else {\n setValue(nameValue, value[props.fieldKey] as string);\n }\n } else {\n setValue(nameValue, null);\n }\n }\n onChangeCallback?.(value as TItem);\n };\n\n useEffect(() => {\n setOpen(forceToggle);\n }, [forceToggle]);\n\n return (\n <FormItem className={className}>\n <Selector\n {...props}\n withPortal={withPortal}\n error={fieldState?.error && <FormMessage />}\n hasMore={hasMore}\n id={`${id}-${name.replaceAll('.', '-')}`}\n isLoading={isLoading}\n items={data as TItem[]}\n loadMore={loadMore}\n name={name}\n onChange={handleChange}\n onSearch={setSearch}\n open={open}\n required={required}\n search={search}\n setOpen={setOpen}\n value={field.value as TItem}\n />\n </FormItem>\n );\n}\n\nexport interface RemoteSelectorQueryProps<T>\n extends BaseRemoteSelectorProps<T> {\n name: string;\n defaultValue?: string;\n options?: Options;\n onChange?: (value: T | T[] | null) => void;\n}\n\nexport function RemoteSelectorQuery<T>({\n name,\n defaultValue,\n options,\n useData,\n initialParams,\n initialRequest = false,\n forceToggle = false,\n onChange: onChangeCallback,\n fieldKey,\n fieldLabel,\n type = 'single',\n ...props\n}: RemoteSelectorQueryProps<T>) {\n type TItem = NonNullable<ReturnType<TUseData<T>>['data']>[number];\n\n const id = useId();\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [searchDebounced] = useDebounce(search, 100, {\n maxWait: 200,\n });\n\n const { data, loadMore, hasMore, isLoading } = useData(\n searchDebounced,\n initialParams,\n !open && !initialRequest\n );\n\n useEffect(() => {\n setOpen(forceToggle);\n }, [forceToggle]);\n\n const itemKey = fieldKey || fieldLabel;\n const isMultiple = type === 'multiple';\n const childrenKey = props.treeRender\n ? ((props.fieldChildren || 'children') as keyof TItem)\n : undefined;\n\n const allItems = useMemo(\n () => flattenItems(data as TItem[], childrenKey),\n [data, childrenKey]\n );\n\n const parser = isMultiple\n ? parseAsArrayOf(parseAsString).withDefault([])\n : parseAsString.withDefault(defaultValue ?? '');\n\n const [queryIds, setQueryIds] = useQueryState(\n name,\n parser.withOptions({\n clearOnDefault: true,\n shallow: false,\n ...options,\n })\n );\n\n const value =\n isMultiple && Array.isArray(queryIds)\n ? queryIds\n .map((id) => allItems.find((item) => String(item[itemKey]) === id))\n .filter((item): item is TItem => !!item)\n : allItems.find((item) => String(item[itemKey]) === queryIds) || null;\n\n const handleChange = (newValue: T | T[] | null | undefined) => {\n if (!newValue) {\n setQueryIds(isMultiple ? ([] as any) : null);\n } else if (isMultiple && Array.isArray(newValue)) {\n setQueryIds(newValue.map((item) => String(item[itemKey])) as any);\n } else {\n setQueryIds(String((newValue as T)[itemKey]) as any);\n }\n onChangeCallback?.(newValue as T | T[] | null);\n };\n\n return (\n <Selector\n {...props}\n fieldKey={fieldKey}\n fieldLabel={fieldLabel}\n hasMore={hasMore}\n id={`${id}-${name}`}\n isLoading={isLoading}\n items={data as TItem[]}\n loadMore={loadMore}\n name={name}\n onChange={handleChange}\n onSearch={setSearch}\n open={open}\n search={search}\n setOpen={setOpen}\n type={type}\n value={value as TItem}\n />\n );\n}\n\nconst flattenItems = <T,>(items: T[], childrenKey?: keyof T): T[] => {\n if (!childrenKey) return items;\n\n return items.reduce<T[]>((acc, item) => {\n const children = item[childrenKey];\n const childrenItems = Array.isArray(children) ? (children as T[]) : [];\n\n acc.push(item, ...flattenItems(childrenItems, childrenKey));\n return acc;\n }, []);\n};\n"],"mappings":"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"}
|
package/dist/text-field.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { n as Options$1 } from "./with-mask-BLZS7b9k.js";
|
|
2
2
|
import { FieldPath, FieldPathValue, FieldValues, UseControllerProps } from "react-hook-form";
|
|
3
|
-
import * as
|
|
3
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
4
4
|
import { Options } from "nuqs";
|
|
5
5
|
|
|
6
6
|
//#region src/components/text-field/TextField.d.ts
|
|
@@ -57,7 +57,7 @@ declare function InputText({
|
|
|
57
57
|
name,
|
|
58
58
|
onChange,
|
|
59
59
|
...props
|
|
60
|
-
}: InputTextProps):
|
|
60
|
+
}: InputTextProps): react_jsx_runtime0.JSX.Element;
|
|
61
61
|
interface TextFieldProps<TFieldValues extends FieldValues = FieldValues, TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> extends UseControllerProps<TFieldValues, TFieldName> {
|
|
62
62
|
disabled?: boolean;
|
|
63
63
|
required?: boolean;
|
|
@@ -75,7 +75,7 @@ declare function TextField<TFieldValues extends FieldValues = FieldValues, TFiel
|
|
|
75
75
|
transform,
|
|
76
76
|
prefix,
|
|
77
77
|
...props
|
|
78
|
-
}: TextFieldProps<TFieldValues, TFieldName> & Omit<InputTextProps, 'onChange'>):
|
|
78
|
+
}: TextFieldProps<TFieldValues, TFieldName> & Omit<InputTextProps, 'onChange'>): react_jsx_runtime0.JSX.Element;
|
|
79
79
|
interface QueryTextFieldProps extends Omit<InputTextProps, 'onChange'> {
|
|
80
80
|
name: string;
|
|
81
81
|
defaultValue?: string;
|
|
@@ -87,7 +87,7 @@ declare function QueryTextField({
|
|
|
87
87
|
defaultValue,
|
|
88
88
|
options,
|
|
89
89
|
...props
|
|
90
|
-
}: QueryTextFieldProps):
|
|
90
|
+
}: QueryTextFieldProps): react_jsx_runtime0.JSX.Element;
|
|
91
91
|
interface CookieTextFieldProps extends InputTextProps {
|
|
92
92
|
name: string;
|
|
93
93
|
maxAge?: number;
|
|
@@ -97,7 +97,7 @@ declare function CookieTextField({
|
|
|
97
97
|
maxAge,
|
|
98
98
|
onChange,
|
|
99
99
|
...inputProps
|
|
100
|
-
}: CookieTextFieldProps):
|
|
100
|
+
}: CookieTextFieldProps): react_jsx_runtime0.JSX.Element;
|
|
101
101
|
//#endregion
|
|
102
102
|
export { CookieTextField, type CookieTextFieldProps, InputText, type InputTextProps, QueryTextField, type QueryTextFieldProps, TextField, type TextFieldProps };
|
|
103
103
|
//# sourceMappingURL=text-field.d.ts.map
|
package/dist/toggle-field.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React$1 from "react";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime10 from "react/jsx-runtime";
|
|
3
3
|
import { Item, Root } from "@radix-ui/react-toggle-group";
|
|
4
4
|
import { VariantProps } from "class-variance-authority";
|
|
5
5
|
import * as class_variance_authority_types0 from "class-variance-authority/types";
|
|
@@ -28,7 +28,7 @@ declare function ToggleGroup({
|
|
|
28
28
|
transition,
|
|
29
29
|
activeClassName,
|
|
30
30
|
...props
|
|
31
|
-
}: ToggleGroupProps):
|
|
31
|
+
}: ToggleGroupProps): react_jsx_runtime10.JSX.Element;
|
|
32
32
|
//#endregion
|
|
33
33
|
//#region src/components/toggle-field/ToggleField.d.ts
|
|
34
34
|
type ToggleOption = {
|