maquinaweb-ui 2.25.1 → 2.27.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.
@@ -1,5 +1,5 @@
1
1
  import { ComponentProps, ElementType } from "react";
2
- import * as react_jsx_runtime4 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime5 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>) => react_jsx_runtime4.JSX.Element;
26
+ }: ContainerAnimationProps<T>) => react_jsx_runtime5.JSX.Element;
27
27
  //#endregion
28
28
  export { ContainerAnimation, type ContainerAnimationProps };
29
29
  //# sourceMappingURL=container-animation.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { FieldPath, FieldValues, UseControllerProps } from "react-hook-form";
2
2
  import { Dispatch, SetStateAction } from "react";
3
- import * as react_jsx_runtime5 from "react/jsx-runtime";
3
+ import * as react_jsx_runtime6 from "react/jsx-runtime";
4
4
  import { Mask, Options } from "use-mask-input";
5
5
  import { PopoverProps } from "@radix-ui/react-popover";
6
6
 
@@ -65,7 +65,7 @@ declare function InputSuggest<TFieldValues extends FieldValues = FieldValues, TF
65
65
  children,
66
66
  initialParams,
67
67
  ...props
68
- }: InputSuggestProps<TFieldValues, TFieldName> & PopoverProps): react_jsx_runtime5.JSX.Element;
68
+ }: InputSuggestProps<TFieldValues, TFieldName> & PopoverProps): react_jsx_runtime6.JSX.Element;
69
69
  //#endregion
70
70
  export { InputSuggest, type InputSuggestProps };
71
71
  //# sourceMappingURL=input-suggest.d.ts.map
@@ -1,12 +1,14 @@
1
- import { ControllerFieldState } from "react-hook-form";
2
- import * as react_jsx_runtime0 from "react/jsx-runtime";
1
+ import { FieldPath, FieldPathValue, FieldValues, UseControllerProps } from "react-hook-form";
2
+ import * as react_jsx_runtime3 from "react/jsx-runtime";
3
+ import { Options } from "nuqs";
3
4
  import { PopoverProps } from "@radix-ui/react-popover";
4
5
 
5
6
  //#region src/components/ui/selector.d.ts
6
7
 
7
8
  type SelectorProps<T> = {
8
- value?: T;
9
- onChange?: (item: T | undefined | null) => void;
9
+ type?: 'single' | 'multiple';
10
+ value?: T | T[];
11
+ onChange?: (item: T | T[] | undefined | null) => void;
10
12
  search?: string;
11
13
  onSearch?: (search: string) => void;
12
14
  placeholder?: string;
@@ -18,36 +20,68 @@ type SelectorProps<T> = {
18
20
  disabled?: boolean;
19
21
  searchPlaceholder?: string;
20
22
  label?: string;
21
- name: string;
23
+ name?: string;
22
24
  className?: string;
23
25
  required?: boolean;
24
- fieldState?: ControllerFieldState;
26
+ error?: React.ReactNode;
25
27
  selectFirstIsOne?: boolean;
26
28
  help?: string;
27
29
  extra?: string;
28
- extraOnClick?: (onChange?: (item: T | undefined | null) => void) => Promise<void> | void;
30
+ extraOnClick?: (onChange?: (item: T | T[] | undefined | null) => void) => Promise<void> | void;
29
31
  open?: boolean;
30
32
  setOpen?: (open: boolean) => void;
31
- withPortal?: boolean;
33
+ maxVisibleBadges?: number;
34
+ id?: string;
32
35
  } & PopoverProps;
33
36
  //#endregion
34
37
  //#region src/components/remote-selector/remote-selector.d.ts
35
38
  type TUseData<T> = (search?: string, initialParams?: any, disabled?: boolean) => {
36
39
  data: T[];
37
40
  };
38
- type RemoteSelectorProps<T> = {
41
+ type BaseRemoteSelectorProps<T> = {
39
42
  useData: TUseData<T>;
40
43
  initialParams?: Parameters<TUseData<T>>[1];
41
44
  initialRequest?: boolean;
42
45
  forceToggle?: boolean;
43
- } & Omit<SelectorProps<T>, 'items'>;
44
- declare function RemoteSelector<T>({
46
+ } & Omit<SelectorProps<T>, 'items' | 'value' | 'onChange' | 'search' | 'onSearch' | 'open' | 'setOpen'>;
47
+ interface RemoteSelectorFieldProps<TFieldValues extends FieldValues = FieldValues, TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>> extends UseControllerProps<TFieldValues, TFieldName> {
48
+ disabled?: boolean;
49
+ required?: boolean;
50
+ defaultValue?: FieldPathValue<TFieldValues, TFieldName>;
51
+ onChange?: (value: any) => Promise<void> | void;
52
+ }
53
+ declare function RemoteSelectorField<T, TFieldValues extends FieldValues = FieldValues, TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>>({
54
+ name,
55
+ className,
56
+ required,
57
+ defaultValue,
58
+ onChange: onChangeCallback,
59
+ useData,
60
+ initialParams,
61
+ initialRequest,
62
+ forceToggle,
63
+ ...props
64
+ }: RemoteSelectorFieldProps<TFieldValues, TFieldName> & BaseRemoteSelectorProps<T>): react_jsx_runtime3.JSX.Element;
65
+ interface RemoteSelectorQueryProps<T> extends BaseRemoteSelectorProps<T> {
66
+ name: string;
67
+ defaultValue?: string;
68
+ options?: Options;
69
+ onChange?: (value: T | T[] | null) => void;
70
+ }
71
+ declare function RemoteSelectorQuery<T>({
72
+ name,
73
+ defaultValue,
74
+ options,
45
75
  useData,
46
76
  initialParams,
47
77
  initialRequest,
48
78
  forceToggle,
79
+ onChange: onChangeCallback,
80
+ fieldKey,
81
+ fieldLabel,
82
+ type,
49
83
  ...props
50
- }: RemoteSelectorProps<T>): react_jsx_runtime0.JSX.Element;
84
+ }: RemoteSelectorQueryProps<T>): react_jsx_runtime3.JSX.Element;
51
85
  //#endregion
52
- export { RemoteSelector, type RemoteSelectorProps, type TUseData };
86
+ export { type BaseRemoteSelectorProps, RemoteSelectorField as RemoteSelector, RemoteSelectorField, type RemoteSelectorFieldProps, RemoteSelectorQuery, type RemoteSelectorQueryProps, type TUseData };
53
87
  //# 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":";;;;;;AAmCoB,KAFR,aAEQ,CAAA,CAAA,CAAA,GAAA;OAIV,CAAA,EALA,CAKM;UACP,CAAA,EAAA,CAAA,IAAA,EALW,CAKX,GAAA,SAAA,GAAA,IAAA,EAAA,GAAA,IAAA;QACW,CAAA,EAAA,MAAA;UACD,CAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,GAAA,IAAA;aACD,CAAA,EAAA,MAAA;OAOH,CAAA,EAXL,KAAA,CAAM,SAWD;OAKO,EAfb,CAea,EAAA;YACf,EAAA,MAfa,CAeb;UAIH,CAAA,EAAA,MAlBe,CAkBf;EAAY,OAAA,CAAA,EAAA,MAjBE,CAiBF;;;;ECnDJ,IAAA,EAAA,MAAQ;EAQR,SAAA,CAAA,EAAA,MAAA;EAAmB,QAAA,CAAA,EAAA,OAAA;YACX,CAAA,EDgCL,oBChCK;kBAAT,CAAA,EAAA,OAAA;MAC2B,CAAA,EAAA,MAAA;OAAT,CAAA,EAAA,MAAA;cAAX,CAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,IAAA,EDoCI,CCpCJ,GAAA,SAAA,GAAA,IAAA,EAAA,GAAA,IAAA,EAAA,GDqCX,OCrCW,CAAA,IAAA,CAAA,GAAA,IAAA;MAGK,CAAA,EAAA,OAAA;SAAd,CAAA,EAAA,CAAA,IAAA,EAAA,OAAA,EAAA,GAAA,IAAA;YAAL,CAAA,EAAA,OAAA;CAAI,GDsCJ,YCtCI;;;KAbI;QAKJ;;KAGI;EDgBA,OAAA,ECfD,QDec,CCfL,CDeK,CAAA;EAAA,aAAA,CAAA,ECdP,UDcO,CCdI,QDcJ,CCda,CDcb,CAAA,CAAA,CAAA,CAAA,CAAA;gBACf,CAAA,EAAA,OAAA;aACU,CAAA,EAAA,OAAA;ICbhB,IDiBM,CCjBD,aDiBO,CCjBO,CDiBP,CAAA,EAAA,OAAA,CAAA;AACP,iBChBO,cDgBP,CAAA,CAAA,CAAA,CAAA;EAAA,OAAA;EAAA,aAAA;EAAA,cAAA;EAAA,WAAA;EAAA,GAAA;AAAA,CAAA,ECVN,mBDUM,CCVc,CDUd,CAAA,CAAA,ECVgB,kBAAA,CAAA,GAAA,CAAA,ODUhB"}
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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"}
@@ -3,18 +3,38 @@
3
3
 
4
4
  import { cn } from "./utils-C0f9Ma6r.js";
5
5
  import "./label-BqtcCyMj.js";
6
- import { FormItem, FormLabel, FormMessage, InputHelp } from "./input-help-C9Himejv.js";
6
+ import { FormField, FormItem, FormMessage, InputHelp } from "./input-help-C9Himejv.js";
7
7
  import { Popover, PopoverContent, PopoverTrigger, ScrollBar } from "./scroll-area-C2WadzN5.js";
8
- import { useController, useFormContext } from "react-hook-form";
9
- import { createElement, useEffect, useMemo, useState } from "react";
8
+ import { useFormContext } from "react-hook-form";
9
+ import { createElement, useEffect, useId, useMemo, useState } from "react";
10
10
  import { jsx, jsxs } from "react/jsx-runtime";
11
11
  import { Check, ChevronsUpDown, SearchIcon, X } from "lucide-react";
12
12
  import { cva } from "class-variance-authority";
13
13
  import { Slot } from "@radix-ui/react-slot";
14
+ import { parseAsArrayOf, parseAsString, useQueryState } from "nuqs";
14
15
  import { useDebounce } from "use-debounce";
15
16
  import { ScrollArea, ScrollAreaViewport } from "@radix-ui/react-scroll-area";
16
17
  import { Command } from "cmdk";
17
18
 
19
+ //#region src/components/ui/badge.tsx
20
+ const badgeVariants = cva("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", {
21
+ variants: { variant: {
22
+ default: "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
23
+ secondary: "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
24
+ destructive: "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
25
+ warning: "border-transparent bg-warning text-warning-foreground",
26
+ outline: "text-foreground"
27
+ } },
28
+ defaultVariants: { variant: "default" }
29
+ });
30
+ function Badge({ className, variant,...props }) {
31
+ return /* @__PURE__ */ jsx("div", {
32
+ className: cn(badgeVariants({ variant }), className),
33
+ ...props
34
+ });
35
+ }
36
+
37
+ //#endregion
18
38
  //#region src/components/ui/button.tsx
19
39
  const buttonVariants = cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", {
20
40
  variants: {
@@ -101,39 +121,51 @@ function CommandItem({ className,...props }) {
101
121
 
102
122
  //#endregion
103
123
  //#region src/components/ui/selector.tsx
104
- const DEFAULT_GROUP_ID = "selector-default-group";
105
- const UNDEFINED_GROUP_ID = "selector-undefined-group";
106
- const buildGroups = (items, groupBy) => {
107
- if (!groupBy) return [{
108
- id: DEFAULT_GROUP_ID,
109
- items
110
- }];
111
- return Object.values(items.reduce((acc, item) => {
112
- const rawValue = item[groupBy];
113
- const heading = rawValue == null ? void 0 : String(rawValue);
114
- const groupId = heading ?? UNDEFINED_GROUP_ID;
115
- if (!acc[groupId]) acc[groupId] = {
116
- id: groupId,
117
- heading,
118
- items: []
119
- };
120
- acc[groupId].items.push(item);
121
- return acc;
122
- }, {}));
123
- };
124
- function Selector({ value, onChange, search, onSearch, items, label, placeholder, fieldLabel, fieldKey, groupBy, searchPlaceholder, name, empty = "Nenhuma opção encontrada...", disabled = false, className, required, fieldState, selectFirstIsOne, help, extra, extraOnClick, open, setOpen, withPortal = true,...props }) {
124
+ function Selector({ type = "single", value, onChange, search, onSearch, items, label, placeholder, fieldLabel, fieldKey, groupBy, searchPlaceholder, name, empty = "Nenhuma opção encontrada...", disabled = false, className, required, error, selectFirstIsOne, help, extra, extraOnClick, open, setOpen, maxVisibleBadges = 3, id,...props }) {
125
125
  const itemKey = fieldKey || fieldLabel;
126
+ const isMultiple = type === "multiple";
127
+ const selectedItems = isMultiple && Array.isArray(value) ? value : [];
128
+ const singleValue = !isMultiple && !Array.isArray(value) ? value : void 0;
129
+ const isItemSelected = (item) => {
130
+ if (isMultiple) return selectedItems.some((selected) => selected[itemKey] === item[itemKey]);
131
+ return singleValue?.[itemKey] === item[itemKey];
132
+ };
133
+ const handleItemSelect = (item) => {
134
+ if (isMultiple) {
135
+ const newValue = isItemSelected(item) ? selectedItems.filter((selected) => selected[itemKey] !== item[itemKey]) : [...selectedItems, item];
136
+ onChange?.(newValue.length > 0 ? newValue : null);
137
+ } else {
138
+ onChange?.(item);
139
+ setOpen?.(false);
140
+ }
141
+ };
126
142
  useEffect(() => {
127
143
  if (selectFirstIsOne && items && items.length === 1 && !value) onChange?.(items[0]);
128
144
  }, [items]);
129
- const groups = useMemo(() => buildGroups(items, groupBy), [groupBy, items]);
130
- return /* @__PURE__ */ jsxs(FormItem, {
131
- className: cn("w-full", className),
132
- id: `selector-${name}`,
133
- children: [/* @__PURE__ */ jsxs("div", {
145
+ const { selectedGroups, unselectedGroups } = useMemo(() => {
146
+ if (!isMultiple || selectedItems.length === 0) return {
147
+ selectedGroups: [],
148
+ unselectedGroups: buildGroups(items, groupBy)
149
+ };
150
+ const unselectedItems = items.filter((item) => !isItemSelected(item));
151
+ return {
152
+ selectedGroups: buildGroups(selectedItems, groupBy),
153
+ unselectedGroups: buildGroups(unselectedItems, groupBy)
154
+ };
155
+ }, [
156
+ groupBy,
157
+ items,
158
+ isMultiple,
159
+ selectedItems
160
+ ]);
161
+ return /* @__PURE__ */ jsxs("div", {
162
+ className: cn("w-full flex flex-col gap-1", className),
163
+ id: id || `selector-${name}`,
164
+ children: [label && /* @__PURE__ */ jsxs("div", {
134
165
  className: "flex items-end gap-1.5",
135
- children: [/* @__PURE__ */ jsxs(FormLabel, {
136
- htmlFor: name,
166
+ children: [/* @__PURE__ */ jsxs("label", {
167
+ className: "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70",
168
+ htmlFor: id || name,
137
169
  children: [
138
170
  label,
139
171
  ":",
@@ -146,29 +178,44 @@ function Selector({ value, onChange, search, onSearch, items, label, placeholder
146
178
  help,
147
179
  name
148
180
  })]
149
- }), /* @__PURE__ */ jsxs(Popover, {
150
- onOpenChange: setOpen,
151
- open,
152
- ...props,
153
- children: [
154
- /* @__PURE__ */ jsx(PopoverTrigger, {
181
+ }), /* @__PURE__ */ jsxs("div", {
182
+ className: "flex flex-col gap-1",
183
+ children: [/* @__PURE__ */ jsxs(Popover, {
184
+ onOpenChange: setOpen,
185
+ open,
186
+ ...props,
187
+ children: [/* @__PURE__ */ jsx(PopoverTrigger, {
155
188
  asChild: true,
156
189
  children: /* @__PURE__ */ jsxs(Button, {
157
190
  "aria-expanded": open,
158
191
  "aria-label": "Carregando opções...",
159
- className: cn("mt-0! justify-between w-full h-10! hover:bg-transparent cursor-pointer", !value && "text-muted-foreground", fieldState?.error && "border-destructive"),
192
+ className: cn("mt-0! justify-between w-full h-10! hover:bg-transparent cursor-pointer", !value && "text-muted-foreground", error && "border-destructive"),
160
193
  disabled,
161
- id: name,
194
+ id: id || name,
162
195
  role: "combobox",
163
196
  variant: "outline",
164
- children: [/* @__PURE__ */ jsx("span", {
197
+ children: [isMultiple && selectedItems.length > 0 ? /* @__PURE__ */ jsxs("div", {
198
+ className: "flex gap-1 flex-1 min-w-0 overflow-hidden",
199
+ children: [selectedItems.slice(0, maxVisibleBadges).map((item, index) => /* @__PURE__ */ jsx(Badge, {
200
+ className: "truncate shrink min-w-0",
201
+ variant: "secondary",
202
+ children: /* @__PURE__ */ jsx("span", {
203
+ className: "truncate block",
204
+ children: item[fieldLabel]
205
+ })
206
+ }, `badge-${item[itemKey]}-${index}`)), selectedItems.length > maxVisibleBadges && /* @__PURE__ */ jsxs(Badge, {
207
+ className: "shrink-0",
208
+ variant: "secondary",
209
+ children: ["+", selectedItems.length - maxVisibleBadges]
210
+ })]
211
+ }) : /* @__PURE__ */ jsx("span", {
165
212
  className: "truncate",
166
- children: value ? value[fieldLabel] : placeholder || `Selecione a ${label?.toLowerCase()}`
213
+ children: !isMultiple && singleValue ? singleValue[fieldLabel] : placeholder || `Selecione a ${label?.toLowerCase()}`
167
214
  }), /* @__PURE__ */ jsxs("div", {
168
- className: "flex items-center",
215
+ className: "flex items-center shrink-0",
169
216
  children: [/* @__PURE__ */ jsx("div", {
170
217
  className: "relative size-4",
171
- children: value !== void 0 && /* @__PURE__ */ jsx("div", {
218
+ children: (isMultiple && selectedItems.length > 0 || !isMultiple && singleValue !== void 0) && /* @__PURE__ */ jsx("div", {
172
219
  className: "absolute left-1/2 -translate-x-1/2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground",
173
220
  onClick: (e) => {
174
221
  e.preventDefault();
@@ -180,9 +227,7 @@ function Selector({ value, onChange, search, onSearch, items, label, placeholder
180
227
  }), /* @__PURE__ */ jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })]
181
228
  })]
182
229
  })
183
- }),
184
- fieldState?.error && /* @__PURE__ */ jsx(FormMessage, {}),
185
- /* @__PURE__ */ jsx(PopoverContent, {
230
+ }), /* @__PURE__ */ jsx(PopoverContent, {
186
231
  className: "w-(--radix-popover-trigger-width) max-w-2xl p-0",
187
232
  children: /* @__PURE__ */ jsxs(Command$1, {
188
233
  shouldFilter: false,
@@ -200,16 +245,29 @@ function Selector({ value, onChange, search, onSearch, items, label, placeholder
200
245
  className: "text-sm p-3 text-foreground/60",
201
246
  children: empty
202
247
  }),
203
- groups.map((group) => /* @__PURE__ */ jsx(CommandGroup, {
248
+ isMultiple && selectedGroups.map((group) => /* @__PURE__ */ jsx(CommandGroup, {
249
+ heading: "Selecionados",
250
+ children: group.items.map((item) => /* @__PURE__ */ jsxs(CommandItem, {
251
+ className: cn("transition-all p-2 gap-2 my-1 first:mt-0 last:mb-0", "bg-accent! text-accent-foreground"),
252
+ onSelect: () => handleItemSelect(item),
253
+ value: String(item[itemKey]),
254
+ children: [/* @__PURE__ */ jsx("div", {
255
+ className: cn("size-4 border-2 rounded flex items-center justify-center transition-colors", "bg-primary border-primary"),
256
+ children: /* @__PURE__ */ jsx(Check, { className: "size-2.5 text-primary-foreground" })
257
+ }), item[fieldLabel]]
258
+ }, `item-selected-${item[itemKey]}`))
259
+ }, `group-selected-${group.id}`)),
260
+ unselectedGroups.map((group) => /* @__PURE__ */ jsx(CommandGroup, {
204
261
  heading: group.heading || group.id === UNDEFINED_GROUP_ID && "Outros",
205
262
  children: group.items.map((item) => /* @__PURE__ */ jsxs(CommandItem, {
206
- className: cn("transition-all p-2", value === item && "bg-accent! text-accent-foreground"),
207
- onSelect: () => {
208
- onChange?.(item);
209
- setOpen?.(false);
210
- },
263
+ className: cn("transition-all p-2", isMultiple && "gap-2", !isMultiple && isItemSelected(item) && "bg-accent! text-accent-foreground"),
264
+ onSelect: () => handleItemSelect(item),
211
265
  value: String(item[itemKey]),
212
- children: [item[fieldLabel], value === item && /* @__PURE__ */ jsx(Check, { className: "ml-auto h-4 w-4" })]
266
+ children: [
267
+ isMultiple && /* @__PURE__ */ jsx("div", { className: "size-4 border-2 rounded flex items-center justify-center transition-colors border-input" }),
268
+ item[fieldLabel],
269
+ !isMultiple && isItemSelected(item) && /* @__PURE__ */ jsx(Check, { className: "ml-auto h-4 w-4" })
270
+ ]
213
271
  }, `item-${item[itemKey]}`))
214
272
  }, `group-${group.id}`)),
215
273
  extra && /* @__PURE__ */ jsx(CommandItem, {
@@ -224,20 +282,74 @@ function Selector({ value, onChange, search, onSearch, items, label, placeholder
224
282
  }), /* @__PURE__ */ jsx(ScrollBar, {})]
225
283
  }) })]
226
284
  })
227
- })
228
- ]
285
+ })]
286
+ }), error && error]
229
287
  })]
230
288
  });
231
289
  }
290
+ const DEFAULT_GROUP_ID = "selector-default-group";
291
+ const UNDEFINED_GROUP_ID = "selector-undefined-group";
292
+ const buildGroups = (items, groupBy) => {
293
+ if (!groupBy) return [{
294
+ id: DEFAULT_GROUP_ID,
295
+ items
296
+ }];
297
+ return Object.values(items.reduce((acc, item) => {
298
+ const rawValue = item[groupBy];
299
+ const heading = rawValue == null ? void 0 : String(rawValue);
300
+ const groupId = heading ?? UNDEFINED_GROUP_ID;
301
+ if (!acc[groupId]) acc[groupId] = {
302
+ id: groupId,
303
+ heading,
304
+ items: []
305
+ };
306
+ acc[groupId].items.push(item);
307
+ return acc;
308
+ }, {}));
309
+ };
232
310
 
233
311
  //#endregion
234
312
  //#region src/components/remote-selector/remote-selector.tsx
235
- function RemoteSelector({ useData, initialParams, initialRequest = false, forceToggle = false,...props }) {
313
+ function RemoteSelectorField({ name, className, required, defaultValue, onChange: onChangeCallback, useData, initialParams, initialRequest = false, forceToggle = false,...props }) {
236
314
  const { control } = useFormContext();
237
- const { field, fieldState } = useController({
315
+ const id = useId();
316
+ const [open, setOpen] = useState(false);
317
+ const [search, setSearch] = useState("");
318
+ const [searchDebounced] = useDebounce(search, 100, { maxWait: 200 });
319
+ const { data } = useData(searchDebounced, initialParams, !open && !initialRequest);
320
+ useEffect(() => {
321
+ setOpen(forceToggle);
322
+ }, [forceToggle]);
323
+ return /* @__PURE__ */ jsx(FormField, {
238
324
  control,
239
- name: props.name
325
+ defaultValue,
326
+ name,
327
+ render: ({ field, fieldState }) => /* @__PURE__ */ jsx(FormItem, {
328
+ className,
329
+ children: /* @__PURE__ */ createElement(Selector, {
330
+ ...props,
331
+ error: fieldState?.error && /* @__PURE__ */ jsx(FormMessage, {}),
332
+ id: `${id}-${name.replaceAll(".", "-")}`,
333
+ items: data,
334
+ key: `selector-${field.name}-${field.value}`,
335
+ name,
336
+ onChange: (value) => {
337
+ field.onChange(value);
338
+ onChangeCallback?.(value);
339
+ },
340
+ onSearch: setSearch,
341
+ open,
342
+ required,
343
+ search,
344
+ setOpen,
345
+ value: field.value
346
+ })
347
+ }),
348
+ rules: { required: required ? "Campo obrigatório" : false }
240
349
  });
350
+ }
351
+ function RemoteSelectorQuery({ name, defaultValue, options, useData, initialParams, initialRequest = false, forceToggle = false, onChange: onChangeCallback, fieldKey, fieldLabel, type = "single",...props }) {
352
+ const id = useId();
241
353
  const [open, setOpen] = useState(false);
242
354
  const [search, setSearch] = useState("");
243
355
  const [searchDebounced] = useDebounce(search, 100, { maxWait: 200 });
@@ -245,22 +357,38 @@ function RemoteSelector({ useData, initialParams, initialRequest = false, forceT
245
357
  useEffect(() => {
246
358
  setOpen(forceToggle);
247
359
  }, [forceToggle]);
248
- return /* @__PURE__ */ createElement(Selector, {
360
+ const itemKey = fieldKey || fieldLabel;
361
+ const isMultiple = type === "multiple";
362
+ const parser = isMultiple ? parseAsArrayOf(parseAsString).withDefault([]) : parseAsString.withDefault(defaultValue ?? "");
363
+ const [queryIds, setQueryIds] = useQueryState(name, parser.withOptions({
364
+ clearOnDefault: true,
365
+ shallow: false,
366
+ ...options
367
+ }));
368
+ const value = isMultiple && Array.isArray(queryIds) ? queryIds.map((id$1) => data?.find((item) => String(item[itemKey]) === id$1)).filter((item) => !!item) : data?.find((item) => String(item[itemKey]) === queryIds) || null;
369
+ const handleChange = (newValue) => {
370
+ if (!newValue) setQueryIds(isMultiple ? [] : null);
371
+ else if (isMultiple && Array.isArray(newValue)) setQueryIds(newValue.map((item) => String(item[itemKey])));
372
+ else setQueryIds(String(newValue[itemKey]));
373
+ onChangeCallback?.(newValue);
374
+ };
375
+ return /* @__PURE__ */ jsx(Selector, {
249
376
  ...props,
250
- fieldState,
377
+ fieldKey,
378
+ fieldLabel,
379
+ id: `${id}-${name}`,
251
380
  items: data,
252
- key: `selector-${field.name}-${field.value}`,
253
- onChange: (value) => {
254
- field.onChange(value);
255
- },
381
+ name,
382
+ onChange: handleChange,
256
383
  onSearch: setSearch,
257
384
  open,
258
385
  search,
259
386
  setOpen,
260
- value: field.value
387
+ type,
388
+ value
261
389
  });
262
390
  }
263
391
 
264
392
  //#endregion
265
- export { RemoteSelector };
393
+ export { RemoteSelectorField as RemoteSelector, RemoteSelectorField, RemoteSelectorQuery };
266
394
  //# sourceMappingURL=remote-selector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"remote-selector.js","names":["Command","CommandPrimitive","Command"],"sources":["../src/components/ui/button.tsx","../src/components/ui/command.tsx","../src/components/ui/selector.tsx","../src/components/remote-selector/remote-selector.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { cn } from '@/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive:\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost:\n 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n data-slot=\"button\"\n {...(props as any)}\n />\n );\n}\n\nexport { Button, buttonVariants };\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 { useEffect, useMemo } from 'react';\n\nimport type { ControllerFieldState } from 'react-hook-form';\n\nimport type { PopoverProps } from '@radix-ui/react-popover';\nimport { ScrollArea, ScrollAreaViewport } from '@radix-ui/react-scroll-area';\n\nimport { Check, ChevronsUpDown, X } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { Button } from './button';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from './command';\nimport { FormItem, FormLabel, FormMessage } from './form';\nimport { InputHelp } from './input-help';\nimport { Popover, PopoverContent, PopoverTrigger } from './popover';\nimport { ScrollBar } from './scroll-area';\n\nexport type SelectorOption = {\n id: string | number;\n name: string;\n value?: any;\n children?: SelectorOption[];\n};\n\nexport type SelectorProps<T> = {\n value?: T;\n onChange?: (item: 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 fieldKey?: keyof T;\n groupBy?: keyof T;\n disabled?: boolean;\n searchPlaceholder?: string;\n label?: string;\n name: string;\n className?: string;\n required?: boolean;\n fieldState?: ControllerFieldState;\n selectFirstIsOne?: boolean;\n help?: string;\n extra?: string;\n extraOnClick?: (\n onChange?: (item: T | undefined | null) => void\n ) => Promise<void> | void;\n open?: boolean;\n setOpen?: (open: boolean) => void;\n withPortal?: boolean;\n} & PopoverProps;\n\ntype SelectorGroup<T> = {\n id: string;\n heading?: string;\n items: T[];\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\nexport function Selector<T>({\n value,\n onChange,\n search,\n onSearch,\n items,\n label,\n placeholder,\n fieldLabel,\n fieldKey,\n groupBy,\n searchPlaceholder,\n name,\n empty = 'Nenhuma opção encontrada...',\n disabled = false,\n className,\n required,\n fieldState,\n selectFirstIsOne,\n help,\n extra,\n extraOnClick,\n open,\n setOpen,\n withPortal = true,\n ...props\n}: SelectorProps<T>) {\n const itemKey = fieldKey || fieldLabel;\n\n useEffect(() => {\n if (selectFirstIsOne && items && items.length === 1 && !value) {\n onChange?.(items[0] as any);\n }\n }, [items]);\n\n const groups = useMemo(() => buildGroups(items, groupBy), [groupBy, items]);\n\n return (\n <FormItem className={cn('w-full', className)} id={`selector-${name}`}>\n <div className=\"flex items-end gap-1.5\">\n <FormLabel htmlFor={name}>\n {label}:\n {required && (\n <span className=\"text-red-500 text-lg leading-[1px]\">*</span>\n )}\n </FormLabel>\n\n <InputHelp help={help} name={name} />\n </div>\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 h-10! hover:bg-transparent cursor-pointer',\n !value && 'text-muted-foreground',\n fieldState?.error && 'border-destructive'\n )}\n disabled={disabled}\n id={name}\n role=\"combobox\"\n variant=\"outline\"\n >\n <span className=\"truncate\">\n {value\n ? (value[fieldLabel] as string)\n : placeholder || `Selecione a ${label?.toLowerCase()}`}\n </span>\n <div className=\"flex items-center\">\n <div className=\"relative size-4\">\n {value !== 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 {fieldState?.error && <FormMessage />}\n <PopoverContent className=\"w-(--radix-popover-trigger-width) max-w-2xl p-0\">\n <Command shouldFilter={false}>\n <CommandInput\n onValueChange={onSearch}\n placeholder={\n searchPlaceholder || `Pesquise por uma ${label?.toLowerCase()}`\n }\n value={search}\n />\n <CommandList>\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 {groups.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 <CommandItem\n className={cn(\n 'transition-all p-2',\n value === item &&\n 'bg-accent! text-accent-foreground'\n )}\n key={`item-${item[itemKey]}`}\n onSelect={() => {\n onChange?.(item);\n setOpen?.(false);\n }}\n value={String(item[itemKey])}\n >\n {item[fieldLabel] as string}\n {value === item && (\n <Check className=\"ml-auto h-4 w-4\" />\n )}\n </CommandItem>\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 </ScrollAreaViewport>\n <ScrollBar />\n </ScrollArea>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n </FormItem>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nimport { useController, useFormContext } from 'react-hook-form';\nimport { useDebounce } from 'use-debounce';\n\nimport { Selector, SelectorProps } from '../ui/selector';\n\nexport type TUseData<T> = (\n search?: string,\n initialParams?: any,\n disabled?: boolean\n) => {\n data: T[];\n};\n\nexport type RemoteSelectorProps<T> = {\n useData: TUseData<T>;\n initialParams?: Parameters<TUseData<T>>[1];\n initialRequest?: boolean;\n forceToggle?: boolean;\n} & Omit<SelectorProps<T>, 'items'>;\n\nexport function RemoteSelector<T>({\n useData,\n initialParams,\n initialRequest = false,\n forceToggle = false,\n ...props\n}: RemoteSelectorProps<T>) {\n type TItem = NonNullable<ReturnType<TUseData<T>>['data']>[number];\n\n const { control } = useFormContext();\n const { field, fieldState } = useController({\n control,\n name: props.name,\n });\n\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState('');\n const [searchDebounced] = useDebounce(search, 100, {\n maxWait: 200,\n });\n const { data } = useData(\n searchDebounced,\n initialParams,\n !open && !initialRequest\n );\n\n useEffect(() => {\n setOpen(forceToggle);\n }, [forceToggle]);\n\n return (\n <Selector\n {...props}\n fieldState={fieldState}\n items={data as TItem[]}\n key={`selector-${field.name}-${field.value}`}\n onChange={(value: any) => {\n field.onChange(value as TItem);\n }}\n onSearch={setSearch}\n open={open}\n search={search}\n setOpen={setOpen}\n value={field.value as TItem}\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"remote-selector.js","names":["Command","CommandPrimitive","Command","id"],"sources":["../src/components/ui/badge.tsx","../src/components/ui/button.tsx","../src/components/ui/command.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","import * as React from 'react';\n\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { cn } from '@/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive:\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary:\n 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost:\n 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n);\n\nfunction Button({\n className,\n variant,\n size,\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean;\n }) {\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n data-slot=\"button\"\n {...(props as any)}\n />\n );\n}\n\nexport { Button, buttonVariants };\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 { 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, X } from 'lucide-react';\n\nimport { cn } from '@/lib/utils';\nimport { Badge } from './badge';\nimport { Button } from './button';\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';\n\nexport type SelectorOption = {\n id: string | number;\n name: string;\n value?: any;\n children?: SelectorOption[];\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 fieldKey?: keyof T;\n groupBy?: 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} & 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 label,\n placeholder,\n fieldLabel,\n fieldKey,\n groupBy,\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 ...props\n}: SelectorProps<T>) {\n const itemKey = fieldKey || fieldLabel;\n\n const isMultiple = type === 'multiple';\n const selectedItems = isMultiple && Array.isArray(value) ? value : [];\n const singleValue = !isMultiple && !Array.isArray(value) ? value : undefined;\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 const { selectedGroups, unselectedGroups } = useMemo(() => {\n if (!isMultiple || selectedItems.length === 0) {\n return {\n selectedGroups: [],\n unselectedGroups: buildGroups(items, groupBy),\n };\n }\n\n const unselectedItems = items.filter((item) => !isItemSelected(item));\n\n return {\n selectedGroups: buildGroups(selectedItems, groupBy),\n unselectedGroups: buildGroups(unselectedItems, groupBy),\n };\n }, [groupBy, items, isMultiple, selectedItems]);\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-[1px]\">*</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 h-10! 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\">\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 <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 {isMultiple &&\n selectedGroups.map((group) => (\n <CommandGroup\n heading=\"Selecionados\"\n key={`group-selected-${group.id}`}\n >\n {group.items.map((item) => (\n <CommandItem\n className={cn(\n 'transition-all p-2 gap-2 my-1 first:mt-0 last:mb-0',\n 'bg-accent! text-accent-foreground'\n )}\n key={`item-selected-${item[itemKey]}`}\n onSelect={() => handleItemSelect(item)}\n value={String(item[itemKey])}\n >\n <div\n className={cn(\n 'size-4 border-2 rounded flex items-center justify-center transition-colors',\n 'bg-primary border-primary'\n )}\n >\n <Check className=\"size-2.5 text-primary-foreground\" />\n </div>\n {item[fieldLabel] as string}\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n {unselectedGroups.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 <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 )}\n key={`item-${item[itemKey]}`}\n onSelect={() => handleItemSelect(item)}\n value={String(item[itemKey])}\n >\n {isMultiple && (\n <div className=\"size-4 border-2 rounded flex items-center justify-center transition-colors border-input\" />\n )}\n {item[fieldLabel] as string}\n {!isMultiple && isItemSelected(item) && (\n <Check className=\"ml-auto h-4 w-4\" />\n )}\n </CommandItem>\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 </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, useState } from 'react';\n\nimport {\n type FieldPath,\n type FieldPathValue,\n type FieldValues,\n type UseControllerProps,\n useFormContext,\n} from 'react-hook-form';\nimport { useDebounce } from 'use-debounce';\n\nimport { FormField, 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};\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'\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}\n\nexport function RemoteSelectorField<\n T,\n TFieldValues extends FieldValues = FieldValues,\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n name,\n className,\n required,\n defaultValue,\n onChange: onChangeCallback,\n useData,\n initialParams,\n initialRequest = false,\n forceToggle = false,\n ...props\n}: RemoteSelectorFieldProps<TFieldValues, TFieldName> &\n BaseRemoteSelectorProps<T>) {\n type TItem = NonNullable<ReturnType<TUseData<T>>['data']>[number];\n\n const { control } = useFormContext();\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 } = useData(\n searchDebounced,\n initialParams,\n !open && !initialRequest\n );\n\n useEffect(() => {\n setOpen(forceToggle);\n }, [forceToggle]);\n\n return (\n <FormField\n control={control}\n defaultValue={defaultValue}\n name={name}\n render={({ field, fieldState }) => (\n <FormItem className={className}>\n <Selector\n {...props}\n error={fieldState?.error && <FormMessage />}\n id={`${id}-${name.replaceAll('.', '-')}`}\n items={data as TItem[]}\n key={`selector-${field.name}-${field.value}`}\n name={name}\n onChange={(value: any) => {\n field.onChange(value as TItem);\n onChangeCallback?.(value as TItem);\n }}\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 rules={{\n required: required ? 'Campo obrigatório' : false,\n }}\n />\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 } = 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\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) => data?.find((item) => String(item[itemKey]) === id))\n .filter((item): item is TItem => !!item)\n : data?.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 id={`${id}-${name}`}\n items={data as TItem[]}\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"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as React$1 from "react";
2
- import * as react_jsx_runtime7 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime8 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";
@@ -23,7 +23,7 @@ declare function ToggleGroup({
23
23
  transition,
24
24
  activeClassName,
25
25
  ...props
26
- }: ToggleGroupProps): react_jsx_runtime7.JSX.Element;
26
+ }: ToggleGroupProps): react_jsx_runtime8.JSX.Element;
27
27
  //#endregion
28
28
  //#region src/components/toggle-field/ToggleField.d.ts
29
29
  type ToggleOption = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "maquinaweb-ui",
3
- "version": "2.25.1",
3
+ "version": "2.27.0",
4
4
  "description": "A minimal React component library",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -82,7 +82,7 @@
82
82
  "@radix-ui/react-label": "^2.1.7",
83
83
  "@radix-ui/react-popover": "^1.1.15",
84
84
  "@radix-ui/react-scroll-area": "^1.2.10",
85
- "@radix-ui/react-slot": "^1.2.3",
85
+ "@radix-ui/react-slot": "^1.2.4",
86
86
  "@radix-ui/react-toggle": "^1.1.10",
87
87
  "@radix-ui/react-toggle-group": "^1.1.11",
88
88
  "@radix-ui/react-tooltip": "^1.2.8",