@sth87/shadcn-design-system 0.1.7 → 0.1.9

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.
Files changed (57) hide show
  1. package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs.map +1 -1
  2. package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs.map +1 -1
  3. package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs.map +1 -1
  4. package/dist/cjs/components/Table/data-table-column-header.cjs.map +1 -1
  5. package/dist/cjs/components/Table/data-table-toolbar.cjs +2 -0
  6. package/dist/cjs/components/Table/data-table-toolbar.cjs.map +1 -0
  7. package/dist/cjs/components/Table/data-table-view-options.cjs +2 -0
  8. package/dist/cjs/components/Table/data-table-view-options.cjs.map +1 -0
  9. package/dist/cjs/components/Table/select-column.cjs +2 -0
  10. package/dist/cjs/components/Table/select-column.cjs.map +1 -0
  11. package/dist/cjs/hooks/use-data-table.cjs +1 -1
  12. package/dist/cjs/hooks/use-data-table.cjs.map +1 -1
  13. package/dist/cjs/index.cjs +1 -1
  14. package/dist/cjs/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.cjs +2 -0
  15. package/dist/cjs/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.cjs.map +1 -0
  16. package/dist/cjs/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.cjs +6 -0
  17. package/dist/cjs/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.cjs.map +1 -0
  18. package/dist/cjs/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.cjs +2 -0
  19. package/dist/cjs/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.cjs.map +1 -0
  20. package/dist/cjs/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.cjs +2 -0
  21. package/dist/cjs/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.cjs.map +1 -0
  22. package/dist/esm/components/Table/TableFilter/data-table-date-filter.js.map +1 -1
  23. package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js.map +1 -1
  24. package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js.map +1 -1
  25. package/dist/esm/components/Table/data-table-column-header.js.map +1 -1
  26. package/dist/esm/components/Table/data-table-toolbar.js +116 -0
  27. package/dist/esm/components/Table/data-table-toolbar.js.map +1 -0
  28. package/dist/esm/components/Table/data-table-view-options.js +258 -0
  29. package/dist/esm/components/Table/data-table-view-options.js.map +1 -0
  30. package/dist/esm/components/Table/select-column.js +33 -0
  31. package/dist/esm/components/Table/select-column.js.map +1 -0
  32. package/dist/esm/hooks/use-data-table.js +45 -43
  33. package/dist/esm/hooks/use-data-table.js.map +1 -1
  34. package/dist/esm/index.js +211 -197
  35. package/dist/esm/index.js.map +1 -1
  36. package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js +57 -0
  37. package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js.map +1 -0
  38. package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.js +2345 -0
  39. package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.js.map +1 -0
  40. package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +440 -0
  41. package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.js.map +1 -0
  42. package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +236 -0
  43. package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.js.map +1 -0
  44. package/dist/types/components/Table/TableFilter/data-table-date-filter.d.ts +1 -2
  45. package/dist/types/components/Table/TableFilter/data-table-date-filter.d.ts.map +1 -1
  46. package/dist/types/components/Table/TableFilter/data-table-filter-popover.d.ts +1 -2
  47. package/dist/types/components/Table/TableFilter/data-table-filter-popover.d.ts.map +1 -1
  48. package/dist/types/components/Table/TableFilter/data-table-slider-filter.d.ts +1 -2
  49. package/dist/types/components/Table/TableFilter/data-table-slider-filter.d.ts.map +1 -1
  50. package/dist/types/components/Table/data-table-column-header.d.ts +1 -2
  51. package/dist/types/components/Table/data-table-column-header.d.ts.map +1 -1
  52. package/dist/types/components/Table/data-table-toolbar.d.ts +1 -2
  53. package/dist/types/components/Table/data-table-toolbar.d.ts.map +1 -1
  54. package/dist/types/components/Table/index.d.ts +7 -0
  55. package/dist/types/components/Table/index.d.ts.map +1 -1
  56. package/dist/types/hooks/use-data-table.d.ts.map +1 -1
  57. package/package.json +1 -1
@@ -0,0 +1,258 @@
1
+ import { jsxs as x, Fragment as G, jsx as r } from "react/jsx-runtime";
2
+ import { useSensors as K, useSensor as O, DndContext as $, closestCenter as H, KeyboardSensor as q, PointerSensor as J } from "../../node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.js";
3
+ import { arrayMove as Q, SortableContext as U, verticalListSortingStrategy as W, sortableKeyboardCoordinates as X, useSortable as Y } from "../../node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.js";
4
+ import { CSS as Z } from "../../node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.js";
5
+ import { Check as _, Settings2 as ee, GripVertical as te } from "lucide-react";
6
+ import * as h from "react";
7
+ import se from "../Command/Command.js";
8
+ import { Popover as re } from "../Popover/index.js";
9
+ import "@radix-ui/react-slot";
10
+ import "../../packages/ui/src/components/button.js";
11
+ import "../../packages/ui/src/components/button-group.js";
12
+ import "../../packages/ui/src/components/input.js";
13
+ import "../../packages/ui/src/components/textarea.js";
14
+ import "@radix-ui/react-label";
15
+ import { cn as N } from "../../packages/ui/src/lib/utils.js";
16
+ import "../../packages/ui/src/components/select.js";
17
+ import "../../packages/ui/src/components/combobox.js";
18
+ import "@radix-ui/react-tooltip";
19
+ import "react-day-picker";
20
+ import "../../packages/ui/src/components/popover.js";
21
+ import "@radix-ui/react-separator";
22
+ import "../../packages/ui/src/components/switch.js";
23
+ import "vaul";
24
+ import "@radix-ui/react-scroll-area";
25
+ import "../../packages/ui/src/components/tree-view.js";
26
+ import "@radix-ui/react-alert-dialog";
27
+ import "@radix-ui/react-avatar";
28
+ import "../../packages/ui/src/components/badge.js";
29
+ import "../../packages/ui/src/components/checkbox.js";
30
+ import "@radix-ui/react-collapsible";
31
+ import "cmdk";
32
+ import "@radix-ui/react-dialog";
33
+ import "@radix-ui/react-dropdown-menu";
34
+ import "../../packages/ui/src/components/input-otp.js";
35
+ import "../../packages/ui/src/components/radio-group.js";
36
+ import "../../packages/ui/src/components/sidebar.js";
37
+ import "@radix-ui/react-slider";
38
+ import "../../packages/ui/src/components/tabs.js";
39
+ import "../../packages/ui/src/components/toggle.js";
40
+ import D from "../Checkbox/Checkbox.js";
41
+ import P from "../Button/Button.js";
42
+ function qe({
43
+ table: s,
44
+ variant: o = "command",
45
+ labels: n,
46
+ triggerIcon: c = /* @__PURE__ */ r(ee, { className: "ds:text-muted-foreground" }),
47
+ trigger: d,
48
+ content: f,
49
+ contentClassName: g,
50
+ ...u
51
+ }) {
52
+ const l = s.getState().columnOrder, a = s.getState().columnPinning, i = h.useMemo(
53
+ () => w(s, l, a).filter(
54
+ (e) => typeof e.accessorFn < "u" && e.getCanHide()
55
+ ),
56
+ [s, l, a]
57
+ ), C = h.useCallback(
58
+ (e) => e.columnDef.meta?.label ?? (typeof e.columnDef.header == "string" ? e.columnDef.header : e.id),
59
+ []
60
+ ), y = K(
61
+ O(J),
62
+ O(q, {
63
+ coordinateGetter: X
64
+ })
65
+ ), t = h.useMemo(
66
+ () => i.map((e) => e.id),
67
+ [i]
68
+ ), T = i.every((e) => e.getIsVisible()), z = i.some((e) => e.getIsVisible()), A = h.useCallback(
69
+ (e) => {
70
+ i.forEach((p) => p.toggleVisibility(e));
71
+ },
72
+ [i]
73
+ ), L = h.useCallback(
74
+ (e) => {
75
+ const { active: p, over: S } = e;
76
+ if (!S || p.id === S.id) return;
77
+ const V = t.indexOf(String(p.id)), k = t.indexOf(String(S.id));
78
+ if (V === -1 || k === -1) return;
79
+ const B = Q(t, V, k), I = new Set(t), R = [...B], E = w(s).map(
80
+ (m) => I.has(m.id) ? R.shift() ?? m.id : m.id
81
+ ), v = s.getState().columnPinning, F = {
82
+ ...v,
83
+ left: v?.left?.filter((m) => !I.has(m)),
84
+ right: v?.right?.filter(
85
+ (m) => !I.has(m)
86
+ )
87
+ };
88
+ s.setColumnOrder(E), s.setColumnPinning(F);
89
+ },
90
+ [t, s]
91
+ ), M = [
92
+ {
93
+ type: "group",
94
+ heading: "",
95
+ items: i.map((e) => ({
96
+ type: "item",
97
+ onClick: () => e.toggleVisibility(!e.getIsVisible()),
98
+ children: /* @__PURE__ */ x(G, { children: [
99
+ /* @__PURE__ */ r("span", { className: "ds:truncate", children: C(e) }),
100
+ /* @__PURE__ */ r(
101
+ _,
102
+ {
103
+ className: N(
104
+ "ds:ml-auto ds:size-4 ds:shrink-0",
105
+ e.getIsVisible() ? "ds:opacity-100" : "ds:opacity-0"
106
+ )
107
+ }
108
+ )
109
+ ] })
110
+ }))
111
+ }
112
+ ], b = {
113
+ trigger: n?.trigger ?? "View",
114
+ searchPlaceholder: n?.searchPlaceholder ?? "Search columns...",
115
+ selectAll: n?.selectAll ?? "Chọn tất cả",
116
+ reset: n?.reset ?? "Đặt lại"
117
+ }, j = /* @__PURE__ */ x("div", { className: "ds:flex ds:w-full ds:flex-col", children: [
118
+ /* @__PURE__ */ x("div", { className: "ds:flex ds:items-center ds:gap-3 ds:px-3 ds:py-3", children: [
119
+ /* @__PURE__ */ r(
120
+ D,
121
+ {
122
+ "aria-label": "Toggle all columns",
123
+ checked: T ? !0 : z ? "indeterminate" : !1,
124
+ onCheckedChange: (e) => A(e === !0)
125
+ }
126
+ ),
127
+ /* @__PURE__ */ r("span", { className: "ds:text-sm ds:font-medium ds:text-foreground", children: b.selectAll })
128
+ ] }),
129
+ /* @__PURE__ */ r("div", { className: "ds:mx-3 ds:h-px ds:bg-border" }),
130
+ /* @__PURE__ */ r(
131
+ $,
132
+ {
133
+ sensors: y,
134
+ collisionDetection: H,
135
+ onDragEnd: L,
136
+ children: /* @__PURE__ */ r(
137
+ U,
138
+ {
139
+ items: t,
140
+ strategy: W,
141
+ children: /* @__PURE__ */ r("div", { className: "ds:flex ds:max-h-80 ds:flex-col ds:overflow-y-auto ds:py-2", children: i.map((e) => /* @__PURE__ */ r(
142
+ ie,
143
+ {
144
+ id: e.id,
145
+ label: C(e),
146
+ checked: e.getIsVisible(),
147
+ onCheckedChange: (p) => e.toggleVisibility(p === !0)
148
+ },
149
+ e.id
150
+ )) })
151
+ }
152
+ )
153
+ }
154
+ ),
155
+ /* @__PURE__ */ r("div", { className: "ds:mx-3 ds:h-px ds:bg-border" }),
156
+ /* @__PURE__ */ r(
157
+ P,
158
+ {
159
+ type: "button",
160
+ variant: "ghost",
161
+ size: "sm",
162
+ className: "ds:mx-3 ds:my-2 ds:text-primary hover:ds:text-primary",
163
+ onClick: () => {
164
+ s.resetColumnVisibility(), s.resetColumnOrder(), s.resetColumnPinning();
165
+ },
166
+ children: b.reset
167
+ }
168
+ )
169
+ ] });
170
+ return /* @__PURE__ */ r(
171
+ re,
172
+ {
173
+ trigger: d ?? /* @__PURE__ */ x(
174
+ P,
175
+ {
176
+ "aria-label": "Toggle columns",
177
+ role: "combobox",
178
+ variant: "outline",
179
+ size: "sm",
180
+ className: "ds:ml-auto ds:h-8 ds:font-normal ds:lg:flex",
181
+ children: [
182
+ c,
183
+ b.trigger
184
+ ]
185
+ }
186
+ ),
187
+ content: f ?? (o === "draggable" ? j : /* @__PURE__ */ r(se, { items: M, search: b.searchPlaceholder })),
188
+ contentClassName: N(
189
+ "ds:p-0",
190
+ o === "draggable" ? "ds:w-72" : "ds:w-44",
191
+ g
192
+ ),
193
+ ...u
194
+ }
195
+ );
196
+ }
197
+ function w(s, o = s.getState().columnOrder, n = s.getState().columnPinning) {
198
+ const c = s.getAllLeafColumns(), d = new Map(c.map((t) => [t.id, t])), f = c.map((t) => t.id), g = o ?? [], u = [
199
+ ...g.filter((t) => d.has(t)),
200
+ ...f.filter((t) => !g.includes(t))
201
+ ], l = n ?? {}, a = (l.left ?? []).filter((t) => d.has(t)), i = (l.right ?? []).filter((t) => d.has(t)), C = /* @__PURE__ */ new Set([...a, ...i]), y = u.filter((t) => !C.has(t));
202
+ return [...a, ...y, ...i].map((t) => d.get(t)).filter((t) => !!t);
203
+ }
204
+ function ie({
205
+ id: s,
206
+ label: o,
207
+ checked: n,
208
+ onCheckedChange: c
209
+ }) {
210
+ const {
211
+ attributes: d,
212
+ listeners: f,
213
+ setNodeRef: g,
214
+ transform: u,
215
+ transition: l,
216
+ isDragging: a
217
+ } = Y({ id: s });
218
+ return /* @__PURE__ */ x(
219
+ "div",
220
+ {
221
+ ref: g,
222
+ className: N(
223
+ "ds:flex ds:min-h-11 ds:items-center ds:gap-3 ds:px-3 ds:text-sm ds:text-foreground",
224
+ a && "ds:bg-accent"
225
+ ),
226
+ style: {
227
+ transform: Z.Transform.toString(u),
228
+ transition: l
229
+ },
230
+ children: [
231
+ /* @__PURE__ */ r(
232
+ "button",
233
+ {
234
+ type: "button",
235
+ className: "ds:flex ds:size-5 ds:shrink-0 ds:cursor-grab ds:items-center ds:justify-center ds:text-muted-foreground active:ds:cursor-grabbing",
236
+ "aria-label": `Reorder ${o}`,
237
+ ...d,
238
+ ...f,
239
+ children: /* @__PURE__ */ r(te, { className: "ds:size-4" })
240
+ }
241
+ ),
242
+ /* @__PURE__ */ r(
243
+ D,
244
+ {
245
+ "aria-label": `Toggle ${o}`,
246
+ checked: n,
247
+ onCheckedChange: c
248
+ }
249
+ ),
250
+ /* @__PURE__ */ r("span", { className: "ds:min-w-0 ds:flex-1 ds:truncate ds:font-medium", children: o })
251
+ ]
252
+ }
253
+ );
254
+ }
255
+ export {
256
+ qe as DataTableViewOptions
257
+ };
258
+ //# sourceMappingURL=data-table-view-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table-view-options.js","sources":["../../../../src/components/Table/data-table-view-options.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport type {\n Column,\n ColumnOrderState,\n ColumnPinningState,\n Table,\n} from \"@tanstack/react-table\";\nimport { Check, GripVertical, Settings2 } from \"lucide-react\";\nimport * as React from \"react\";\nimport { Button } from \"../Button\";\nimport { Checkbox } from \"../Checkbox\";\nimport Command, { type CommandItemType } from \"../Command/Command\";\nimport { Popover } from \"../Popover\";\nimport { cn } from \"@dsui/ui\";\n\nexport type DataTableViewOptionsVariant = \"command\" | \"draggable\";\n\nexport interface DataTableViewOptionsLabels {\n trigger?: React.ReactNode;\n searchPlaceholder?: string;\n selectAll?: React.ReactNode;\n reset?: React.ReactNode;\n}\n\nexport interface DataTableViewOptionsProps<TData> extends React.ComponentProps<\n typeof Popover\n> {\n table: Table<TData>;\n variant?: DataTableViewOptionsVariant;\n labels?: DataTableViewOptionsLabels;\n triggerIcon?: React.ReactNode;\n}\n\nexport function DataTableViewOptions<TData>({\n table,\n variant = \"command\",\n labels,\n triggerIcon = <Settings2 className=\"ds:text-muted-foreground\" />,\n trigger,\n content,\n contentClassName,\n ...props\n}: DataTableViewOptionsProps<TData>) {\n const columnOrder = table.getState().columnOrder;\n const columnPinning = table.getState().columnPinning;\n\n const columns = React.useMemo(\n () =>\n getOrderedTableColumns(table, columnOrder, columnPinning).filter(\n (column) =>\n typeof column.accessorFn !== \"undefined\" && column.getCanHide()\n ),\n [table, columnOrder, columnPinning]\n );\n\n const getColumnLabel = React.useCallback(\n (column: (typeof columns)[number]) =>\n column.columnDef.meta?.label ??\n (typeof column.columnDef.header === \"string\"\n ? column.columnDef.header\n : column.id),\n []\n );\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n const columnIds = React.useMemo(\n () => columns.map((column) => column.id),\n [columns]\n );\n\n const allColumnsVisible = columns.every((column) => column.getIsVisible());\n const someColumnsVisible = columns.some((column) => column.getIsVisible());\n\n const onToggleAll = React.useCallback(\n (checked: boolean) => {\n columns.forEach((column) => column.toggleVisibility(checked));\n },\n [columns]\n );\n\n const onDragEnd = React.useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event;\n\n if (!over || active.id === over.id) return;\n\n const oldIndex = columnIds.indexOf(String(active.id));\n const newIndex = columnIds.indexOf(String(over.id));\n\n if (oldIndex === -1 || newIndex === -1) return;\n\n const orderedOptionIds = arrayMove(columnIds, oldIndex, newIndex);\n const optionIdSet = new Set(columnIds);\n const pendingOptionIds = [...orderedOptionIds];\n const nextColumnOrder = getOrderedTableColumns(table).map((column) =>\n optionIdSet.has(column.id)\n ? (pendingOptionIds.shift() ?? column.id)\n : column.id\n );\n const currentColumnPinning = table.getState().columnPinning;\n const nextColumnPinning = {\n ...currentColumnPinning,\n left: currentColumnPinning?.left?.filter((id) => !optionIdSet.has(id)),\n right: currentColumnPinning?.right?.filter(\n (id) => !optionIdSet.has(id)\n ),\n };\n\n table.setColumnOrder(nextColumnOrder);\n table.setColumnPinning(nextColumnPinning);\n },\n [columnIds, table]\n );\n\n const items: CommandItemType[] = [\n {\n type: \"group\",\n heading: \"\",\n items: columns.map((column) => ({\n type: \"item\" as const,\n onClick: () => column.toggleVisibility(!column.getIsVisible()),\n children: (\n <>\n <span className=\"ds:truncate\">{getColumnLabel(column)}</span>\n <Check\n className={cn(\n \"ds:ml-auto ds:size-4 ds:shrink-0\",\n column.getIsVisible() ? \"ds:opacity-100\" : \"ds:opacity-0\"\n )}\n />\n </>\n ),\n })),\n },\n ];\n\n const resolvedLabels = {\n trigger: labels?.trigger ?? \"View\",\n searchPlaceholder: labels?.searchPlaceholder ?? \"Search columns...\",\n selectAll: labels?.selectAll ?? \"Chọn tất cả\",\n reset: labels?.reset ?? \"Đặt lại\",\n };\n\n const defaultDraggableContent = (\n <div className=\"ds:flex ds:w-full ds:flex-col\">\n <div className=\"ds:flex ds:items-center ds:gap-3 ds:px-3 ds:py-3\">\n <Checkbox\n aria-label=\"Toggle all columns\"\n checked={\n allColumnsVisible\n ? true\n : someColumnsVisible\n ? \"indeterminate\"\n : false\n }\n onCheckedChange={(checked) => onToggleAll(checked === true)}\n />\n <span className=\"ds:text-sm ds:font-medium ds:text-foreground\">\n {resolvedLabels.selectAll}\n </span>\n </div>\n <div className=\"ds:mx-3 ds:h-px ds:bg-border\" />\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={onDragEnd}\n >\n <SortableContext\n items={columnIds}\n strategy={verticalListSortingStrategy}\n >\n <div className=\"ds:flex ds:max-h-80 ds:flex-col ds:overflow-y-auto ds:py-2\">\n {columns.map((column) => (\n <DataTableDraggableColumnOption\n key={column.id}\n id={column.id}\n label={getColumnLabel(column)}\n checked={column.getIsVisible()}\n onCheckedChange={(checked) =>\n column.toggleVisibility(checked === true)\n }\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n <div className=\"ds:mx-3 ds:h-px ds:bg-border\" />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"ds:mx-3 ds:my-2 ds:text-primary hover:ds:text-primary\"\n onClick={() => {\n table.resetColumnVisibility();\n table.resetColumnOrder();\n table.resetColumnPinning();\n }}\n >\n {resolvedLabels.reset}\n </Button>\n </div>\n );\n\n return (\n <Popover\n trigger={\n trigger ?? (\n <Button\n aria-label=\"Toggle columns\"\n role=\"combobox\"\n variant=\"outline\"\n size=\"sm\"\n className=\"ds:ml-auto ds:h-8 ds:font-normal ds:lg:flex\"\n >\n {triggerIcon}\n {resolvedLabels.trigger}\n </Button>\n )\n }\n content={\n content ??\n (variant === \"draggable\" ? (\n defaultDraggableContent\n ) : (\n <Command items={items} search={resolvedLabels.searchPlaceholder} />\n ))\n }\n contentClassName={cn(\n \"ds:p-0\",\n variant === \"draggable\" ? \"ds:w-72\" : \"ds:w-44\",\n contentClassName\n )}\n {...props}\n />\n );\n}\n\nfunction getOrderedTableColumns<TData>(\n table: Table<TData>,\n columnOrder: ColumnOrderState = table.getState().columnOrder,\n columnPinning: ColumnPinningState = table.getState().columnPinning\n) {\n const allColumns = table.getAllLeafColumns();\n const columnById = new Map(allColumns.map((column) => [column.id, column]));\n const columnIds = allColumns.map((column) => column.id);\n const order = columnOrder ?? [];\n const orderedIds = [\n ...order.filter((id) => columnById.has(id)),\n ...columnIds.filter((id) => !order.includes(id)),\n ];\n const pinning = columnPinning ?? {};\n const leftIds = (pinning.left ?? []).filter((id) => columnById.has(id));\n const rightIds = (pinning.right ?? []).filter((id) => columnById.has(id));\n const pinnedIds = new Set([...leftIds, ...rightIds]);\n const centerIds = orderedIds.filter((id) => !pinnedIds.has(id));\n\n return [...leftIds, ...centerIds, ...rightIds]\n .map((id) => columnById.get(id))\n .filter((column): column is Column<TData, unknown> => Boolean(column));\n}\n\ninterface DataTableDraggableColumnOptionProps {\n id: string;\n label: React.ReactNode;\n checked: boolean;\n onCheckedChange: React.ComponentProps<typeof Checkbox>[\"onCheckedChange\"];\n}\n\nfunction DataTableDraggableColumnOption({\n id,\n label,\n checked,\n onCheckedChange,\n}: DataTableDraggableColumnOptionProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id });\n\n return (\n <div\n ref={setNodeRef}\n className={cn(\n \"ds:flex ds:min-h-11 ds:items-center ds:gap-3 ds:px-3 ds:text-sm ds:text-foreground\",\n isDragging && \"ds:bg-accent\"\n )}\n style={{\n transform: CSS.Transform.toString(transform),\n transition,\n }}\n >\n <button\n type=\"button\"\n className=\"ds:flex ds:size-5 ds:shrink-0 ds:cursor-grab ds:items-center ds:justify-center ds:text-muted-foreground active:ds:cursor-grabbing\"\n aria-label={`Reorder ${label}`}\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"ds:size-4\" />\n </button>\n <Checkbox\n aria-label={`Toggle ${label}`}\n checked={checked}\n onCheckedChange={onCheckedChange}\n />\n <span className=\"ds:min-w-0 ds:flex-1 ds:truncate ds:font-medium\">\n {label}\n </span>\n </div>\n );\n}\n"],"names":["DataTableViewOptions","table","variant","labels","triggerIcon","jsx","Settings2","trigger","content","contentClassName","props","columnOrder","columnPinning","columns","React","getOrderedTableColumns","column","getColumnLabel","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","columnIds","allColumnsVisible","someColumnsVisible","onToggleAll","checked","onDragEnd","event","active","over","oldIndex","newIndex","orderedOptionIds","arrayMove","optionIdSet","pendingOptionIds","nextColumnOrder","currentColumnPinning","nextColumnPinning","id","items","jsxs","Fragment","Check","cn","resolvedLabels","defaultDraggableContent","Checkbox","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","DataTableDraggableColumnOption","Button","Popover","Command","allColumns","columnById","order","orderedIds","pinning","leftIds","rightIds","pinnedIds","centerIds","label","onCheckedChange","attributes","listeners","setNodeRef","transform","transition","isDragging","useSortable","CSS","GripVertical"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDO,SAASA,GAA4B;AAAA,EAC1C,OAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,QAAAC;AAAA,EACA,aAAAC,IAAc,gBAAAC,EAACC,IAAA,EAAU,WAAU,2BAAA,CAA2B;AAAA,EAC9D,SAAAC;AAAA,EACA,SAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,GAAGC;AACL,GAAqC;AACnC,QAAMC,IAAcV,EAAM,SAAA,EAAW,aAC/BW,IAAgBX,EAAM,SAAA,EAAW,eAEjCY,IAAUC,EAAM;AAAA,IACpB,MACEC,EAAuBd,GAAOU,GAAaC,CAAa,EAAE;AAAA,MACxD,CAACI,MACC,OAAOA,EAAO,aAAe,OAAeA,EAAO,WAAA;AAAA,IAAW;AAAA,IAEpE,CAACf,GAAOU,GAAaC,CAAa;AAAA,EAAA,GAG9BK,IAAiBH,EAAM;AAAA,IAC3B,CAACE,MACCA,EAAO,UAAU,MAAM,UACtB,OAAOA,EAAO,UAAU,UAAW,WAChCA,EAAO,UAAU,SACjBA,EAAO;AAAA,IACb,CAAA;AAAA,EAAC,GAGGE,IAAUC;AAAA,IACdC,EAAUC,CAAa;AAAA,IACvBD,EAAUE,GAAgB;AAAA,MACxB,kBAAkBC;AAAA,IAAA,CACnB;AAAA,EAAA,GAGGC,IAAYV,EAAM;AAAA,IACtB,MAAMD,EAAQ,IAAI,CAACG,MAAWA,EAAO,EAAE;AAAA,IACvC,CAACH,CAAO;AAAA,EAAA,GAGJY,IAAoBZ,EAAQ,MAAM,CAACG,MAAWA,EAAO,cAAc,GACnEU,IAAqBb,EAAQ,KAAK,CAACG,MAAWA,EAAO,cAAc,GAEnEW,IAAcb,EAAM;AAAA,IACxB,CAACc,MAAqB;AACpB,MAAAf,EAAQ,QAAQ,CAACG,MAAWA,EAAO,iBAAiBY,CAAO,CAAC;AAAA,IAC9D;AAAA,IACA,CAACf,CAAO;AAAA,EAAA,GAGJgB,IAAYf,EAAM;AAAA,IACtB,CAACgB,MAAwB;AACvB,YAAM,EAAE,QAAAC,GAAQ,MAAAC,EAAA,IAASF;AAEzB,UAAI,CAACE,KAAQD,EAAO,OAAOC,EAAK,GAAI;AAEpC,YAAMC,IAAWT,EAAU,QAAQ,OAAOO,EAAO,EAAE,CAAC,GAC9CG,IAAWV,EAAU,QAAQ,OAAOQ,EAAK,EAAE,CAAC;AAElD,UAAIC,MAAa,MAAMC,MAAa,GAAI;AAExC,YAAMC,IAAmBC,EAAUZ,GAAWS,GAAUC,CAAQ,GAC1DG,IAAc,IAAI,IAAIb,CAAS,GAC/Bc,IAAmB,CAAC,GAAGH,CAAgB,GACvCI,IAAkBxB,EAAuBd,CAAK,EAAE;AAAA,QAAI,CAACe,MACzDqB,EAAY,IAAIrB,EAAO,EAAE,IACpBsB,EAAiB,MAAA,KAAWtB,EAAO,KACpCA,EAAO;AAAA,MAAA,GAEPwB,IAAuBvC,EAAM,SAAA,EAAW,eACxCwC,IAAoB;AAAA,QACxB,GAAGD;AAAA,QACH,MAAMA,GAAsB,MAAM,OAAO,CAACE,MAAO,CAACL,EAAY,IAAIK,CAAE,CAAC;AAAA,QACrE,OAAOF,GAAsB,OAAO;AAAA,UAClC,CAACE,MAAO,CAACL,EAAY,IAAIK,CAAE;AAAA,QAAA;AAAA,MAC7B;AAGF,MAAAzC,EAAM,eAAesC,CAAe,GACpCtC,EAAM,iBAAiBwC,CAAiB;AAAA,IAC1C;AAAA,IACA,CAACjB,GAAWvB,CAAK;AAAA,EAAA,GAGb0C,IAA2B;AAAA,IAC/B;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO9B,EAAQ,IAAI,CAACG,OAAY;AAAA,QAC9B,MAAM;AAAA,QACN,SAAS,MAAMA,EAAO,iBAAiB,CAACA,EAAO,cAAc;AAAA,QAC7D,UACE,gBAAA4B,EAAAC,GAAA,EACE,UAAA;AAAA,UAAA,gBAAAxC,EAAC,QAAA,EAAK,WAAU,eAAe,UAAAY,EAAeD,CAAM,GAAE;AAAA,UACtD,gBAAAX;AAAA,YAACyC;AAAA,YAAA;AAAA,cACC,WAAWC;AAAA,gBACT;AAAA,gBACA/B,EAAO,aAAA,IAAiB,mBAAmB;AAAA,cAAA;AAAA,YAC7C;AAAA,UAAA;AAAA,QACF,EAAA,CACF;AAAA,MAAA,EAEF;AAAA,IAAA;AAAA,EACJ,GAGIgC,IAAiB;AAAA,IACrB,SAAS7C,GAAQ,WAAW;AAAA,IAC5B,mBAAmBA,GAAQ,qBAAqB;AAAA,IAChD,WAAWA,GAAQ,aAAa;AAAA,IAChC,OAAOA,GAAQ,SAAS;AAAA,EAAA,GAGpB8C,IACJ,gBAAAL,EAAC,OAAA,EAAI,WAAU,iCACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,MAAA,gBAAAvC;AAAA,QAAC6C;AAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,SACEzB,IACI,KACAC,IACE,kBACA;AAAA,UAER,iBAAiB,CAACE,MAAYD,EAAYC,MAAY,EAAI;AAAA,QAAA;AAAA,MAAA;AAAA,MAE5D,gBAAAvB,EAAC,QAAA,EAAK,WAAU,gDACb,YAAe,UAAA,CAClB;AAAA,IAAA,GACF;AAAA,IACA,gBAAAA,EAAC,OAAA,EAAI,WAAU,+BAAA,CAA+B;AAAA,IAC9C,gBAAAA;AAAA,MAAC8C;AAAA,MAAA;AAAA,QACC,SAAAjC;AAAA,QACA,oBAAoBkC;AAAA,QACpB,WAAAvB;AAAA,QAEA,UAAA,gBAAAxB;AAAA,UAACgD;AAAA,UAAA;AAAA,YACC,OAAO7B;AAAA,YACP,UAAU8B;AAAA,YAEV,4BAAC,OAAA,EAAI,WAAU,8DACZ,UAAAzC,EAAQ,IAAI,CAACG,MACZ,gBAAAX;AAAA,cAACkD;AAAA,cAAA;AAAA,gBAEC,IAAIvC,EAAO;AAAA,gBACX,OAAOC,EAAeD,CAAM;AAAA,gBAC5B,SAASA,EAAO,aAAA;AAAA,gBAChB,iBAAiB,CAACY,MAChBZ,EAAO,iBAAiBY,MAAY,EAAI;AAAA,cAAA;AAAA,cALrCZ,EAAO;AAAA,YAAA,CAQf,EAAA,CACH;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,gBAAAX,EAAC,OAAA,EAAI,WAAU,+BAAA,CAA+B;AAAA,IAC9C,gBAAAA;AAAA,MAACmD;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM;AACb,UAAAvD,EAAM,sBAAA,GACNA,EAAM,iBAAA,GACNA,EAAM,mBAAA;AAAA,QACR;AAAA,QAEC,UAAA+C,EAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EAClB,GACF;AAGF,SACE,gBAAA3C;AAAA,IAACoD;AAAA,IAAA;AAAA,MACC,SACElD,KACE,gBAAAqC;AAAA,QAACY;AAAA,QAAA;AAAA,UACC,cAAW;AAAA,UACX,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,WAAU;AAAA,UAET,UAAA;AAAA,YAAApD;AAAA,YACA4C,EAAe;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAItB,SACExC,MACCN,MAAY,cACX+C,sBAECS,IAAA,EAAQ,OAAAf,GAAc,QAAQK,EAAe,kBAAA,CAAmB;AAAA,MAGrE,kBAAkBD;AAAA,QAChB;AAAA,QACA7C,MAAY,cAAc,YAAY;AAAA,QACtCO;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASK,EACPd,GACAU,IAAgCV,EAAM,SAAA,EAAW,aACjDW,IAAoCX,EAAM,SAAA,EAAW,eACrD;AACA,QAAM0D,IAAa1D,EAAM,kBAAA,GACnB2D,IAAa,IAAI,IAAID,EAAW,IAAI,CAAC3C,MAAW,CAACA,EAAO,IAAIA,CAAM,CAAC,CAAC,GACpEQ,IAAYmC,EAAW,IAAI,CAAC3C,MAAWA,EAAO,EAAE,GAChD6C,IAAQlD,KAAe,CAAA,GACvBmD,IAAa;AAAA,IACjB,GAAGD,EAAM,OAAO,CAACnB,MAAOkB,EAAW,IAAIlB,CAAE,CAAC;AAAA,IAC1C,GAAGlB,EAAU,OAAO,CAACkB,MAAO,CAACmB,EAAM,SAASnB,CAAE,CAAC;AAAA,EAAA,GAE3CqB,IAAUnD,KAAiB,CAAA,GAC3BoD,KAAWD,EAAQ,QAAQ,CAAA,GAAI,OAAO,CAACrB,MAAOkB,EAAW,IAAIlB,CAAE,CAAC,GAChEuB,KAAYF,EAAQ,SAAS,CAAA,GAAI,OAAO,CAACrB,MAAOkB,EAAW,IAAIlB,CAAE,CAAC,GAClEwB,wBAAgB,IAAI,CAAC,GAAGF,GAAS,GAAGC,CAAQ,CAAC,GAC7CE,IAAYL,EAAW,OAAO,CAACpB,MAAO,CAACwB,EAAU,IAAIxB,CAAE,CAAC;AAE9D,SAAO,CAAC,GAAGsB,GAAS,GAAGG,GAAW,GAAGF,CAAQ,EAC1C,IAAI,CAACvB,MAAOkB,EAAW,IAAIlB,CAAE,CAAC,EAC9B,OAAO,CAAC1B,MAA6C,EAAQA,CAAO;AACzE;AASA,SAASuC,GAA+B;AAAA,EACtC,IAAAb;AAAA,EACA,OAAA0B;AAAA,EACA,SAAAxC;AAAA,EACA,iBAAAyC;AACF,GAAwC;AACtC,QAAM;AAAA,IACJ,YAAAC;AAAA,IACA,WAAAC;AAAA,IACA,YAAAC;AAAA,IACA,WAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,EAAA,IACEC,EAAY,EAAE,IAAAlC,GAAI;AAEtB,SACE,gBAAAE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK4B;AAAA,MACL,WAAWzB;AAAA,QACT;AAAA,QACA4B,KAAc;AAAA,MAAA;AAAA,MAEhB,OAAO;AAAA,QACL,WAAWE,EAAI,UAAU,SAASJ,CAAS;AAAA,QAC3C,YAAAC;AAAA,MAAA;AAAA,MAGF,UAAA;AAAA,QAAA,gBAAArE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,cAAY,WAAW+D,CAAK;AAAA,YAC3B,GAAGE;AAAA,YACH,GAAGC;AAAA,YAEJ,UAAA,gBAAAlE,EAACyE,IAAA,EAAa,WAAU,YAAA,CAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAEtC,gBAAAzE;AAAA,UAAC6C;AAAA,UAAA;AAAA,YACC,cAAY,UAAUkB,CAAK;AAAA,YAC3B,SAAAxC;AAAA,YACA,iBAAAyC;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAAhE,EAAC,QAAA,EAAK,WAAU,mDACb,UAAA+D,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,33 @@
1
+ import { jsx as l } from "react/jsx-runtime";
2
+ import c from "../Checkbox/Checkbox.js";
3
+ function n(s) {
4
+ return {
5
+ id: "select",
6
+ header: ({ table: e }) => /* @__PURE__ */ l("div", { className: "ds:flex ds:items-center ds:justify-center", children: /* @__PURE__ */ l(
7
+ c,
8
+ {
9
+ checked: e.getIsAllPageRowsSelected() || e.getIsSomePageRowsSelected() && "indeterminate",
10
+ onCheckedChange: (t) => e.toggleAllPageRowsSelected(!!t),
11
+ "aria-label": "Select all"
12
+ }
13
+ ) }),
14
+ cell: ({ row: e }) => /* @__PURE__ */ l("div", { className: "ds:flex ds:items-center ds:justify-center", children: /* @__PURE__ */ l(
15
+ c,
16
+ {
17
+ checked: e.getIsSelected(),
18
+ onCheckedChange: (t) => e.toggleSelected(!!t),
19
+ "aria-label": "Select row"
20
+ }
21
+ ) }),
22
+ size: 36,
23
+ enableSorting: !1,
24
+ enableHiding: !1,
25
+ enableColumnFilter: !1,
26
+ ...s
27
+ };
28
+ }
29
+ const i = n;
30
+ export {
31
+ i as selectColumn
32
+ };
33
+ //# sourceMappingURL=select-column.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-column.js","sources":["../../../../src/components/Table/select-column.tsx"],"sourcesContent":["import type {\n CellContext,\n ColumnDef,\n HeaderContext,\n} from \"@tanstack/react-table\";\nimport { Checkbox } from \"@/components/Checkbox\";\n\nfunction createSelectColumn<TData>(\n props?: Partial<ColumnDef<TData>>\n): ColumnDef<TData> {\n return {\n id: \"select\",\n header: ({ table }: HeaderContext<TData, unknown>) => (\n <div className=\"ds:flex ds:items-center ds:justify-center\">\n <Checkbox\n checked={\n table.getIsAllPageRowsSelected() ||\n (table.getIsSomePageRowsSelected() && \"indeterminate\")\n }\n onCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}\n aria-label=\"Select all\"\n />\n </div>\n ),\n cell: ({ row }: CellContext<TData, unknown>) => (\n <div className=\"ds:flex ds:items-center ds:justify-center\">\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(value) => row.toggleSelected(!!value)}\n aria-label=\"Select row\"\n />\n </div>\n ),\n size: 36,\n enableSorting: false,\n enableHiding: false,\n enableColumnFilter: false,\n ...props,\n };\n}\n\nexport const selectColumn = createSelectColumn;\n"],"names":["createSelectColumn","props","table","jsx","Checkbox","value","row","selectColumn"],"mappings":";;AAOA,SAASA,EACPC,GACkB;AAClB,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ,CAAC,EAAE,OAAAC,EAAA,MACT,gBAAAC,EAAC,OAAA,EAAI,WAAU,6CACb,UAAA,gBAAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,SACEF,EAAM,yBAAA,KACLA,EAAM,+BAA+B;AAAA,QAExC,iBAAiB,CAACG,MAAUH,EAAM,0BAA0B,CAAC,CAACG,CAAK;AAAA,QACnE,cAAW;AAAA,MAAA;AAAA,IAAA,GAEf;AAAA,IAEF,MAAM,CAAC,EAAE,KAAAC,EAAA,MACP,gBAAAH,EAAC,OAAA,EAAI,WAAU,6CACb,UAAA,gBAAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,SAASE,EAAI,cAAA;AAAA,QACb,iBAAiB,CAACD,MAAUC,EAAI,eAAe,CAAC,CAACD,CAAK;AAAA,QACtD,cAAW;AAAA,MAAA;AAAA,IAAA,GAEf;AAAA,IAEF,MAAM;AAAA,IACN,eAAe;AAAA,IACf,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,GAAGJ;AAAA,EAAA;AAEP;AAEO,MAAMM,IAAeP;"}
@@ -1,26 +1,27 @@
1
- import { useReactTable as ie, getFacetedMinMaxValues as se, getFacetedUniqueValues as ae, getFacetedRowModel as re, getSortedRowModel as le, getPaginationRowModel as ce, getFilteredRowModel as ue, getCoreRowModel as ge } from "@tanstack/react-table";
2
- import { useQueryState as A, parseAsInteger as v, parseAsArrayOf as de, parseAsString as Y, useQueryStates as fe } from "nuqs";
1
+ import { useReactTable as se, getFacetedMinMaxValues as ae, getFacetedUniqueValues as re, getFacetedRowModel as le, getSortedRowModel as ce, getPaginationRowModel as ue, getFilteredRowModel as ge, getCoreRowModel as de } from "@tanstack/react-table";
2
+ import { useQueryState as A, parseAsInteger as v, parseAsArrayOf as fe, parseAsString as Y, useQueryStates as pe } from "nuqs";
3
3
  import * as t from "react";
4
- import { useDebouncedCallback as pe } from "./use-debounced-callback.js";
5
- import { getSortingStateParser as me } from "../utils/parsers.js";
6
- const Se = "page", we = "perPage", be = "sort", Ce = "filters", Me = "joinOperator", Re = ",", ye = 300, Pe = 50;
7
- function Ke(j) {
4
+ import { useDebouncedCallback as me } from "./use-debounced-callback.js";
5
+ import { getSortingStateParser as Se } from "../utils/parsers.js";
6
+ const we = "page", be = "perPage", Ce = "sort", Me = "filters", Re = "joinOperator", ye = ",", Pe = 300, Fe = 50;
7
+ function xe(j) {
8
8
  const {
9
9
  columns: g,
10
10
  pageCount: U,
11
11
  initialState: s,
12
12
  queryKeys: d,
13
13
  history: O = "replace",
14
- debounceMs: p = ye,
15
- throttleMs: S = Pe,
14
+ debounceMs: p = Pe,
15
+ throttleMs: S = Fe,
16
16
  clearOnDefault: E = !1,
17
17
  enableAdvancedFilter: r = !1,
18
18
  scroll: K = !1,
19
19
  shallow: w = !0,
20
20
  startTransition: x,
21
21
  enableNuqs: i = !1,
22
+ state: V,
22
23
  ...b
23
- } = j, I = d?.page ?? Se, T = d?.perPage ?? we, _ = d?.sort ?? be, V = d?.filters ?? Ce, k = d?.joinOperator ?? Me, c = t.useMemo(
24
+ } = j, I = d?.page ?? we, T = d?.perPage ?? be, _ = d?.sort ?? Ce, k = d?.filters ?? Me, B = d?.joinOperator ?? Re, c = t.useMemo(
24
25
  () => ({
25
26
  history: O,
26
27
  scroll: K,
@@ -39,9 +40,9 @@ function Ke(j) {
39
40
  E,
40
41
  x
41
42
  ]
42
- ), [B, N] = t.useState(
43
+ ), [N, G] = t.useState(
43
44
  s?.rowSelection ?? {}
44
- ), [G, H] = t.useState(s?.columnVisibility ?? {}), [L, Q] = t.useState(
45
+ ), [H, L] = t.useState(s?.columnVisibility ?? {}), [Q, Z] = t.useState(
45
46
  s?.columnOrder ?? []
46
47
  ), [C, m] = i ? A(
47
48
  I,
@@ -53,7 +54,7 @@ function Ke(j) {
53
54
  pageIndex: i ? C - 1 : C,
54
55
  // zero-based index
55
56
  pageSize: z
56
- }), [C, z, i]), Z = t.useCallback(
57
+ }), [C, z, i]), J = t.useCallback(
57
58
  (e) => {
58
59
  if (typeof e == "function") {
59
60
  const o = e(R);
@@ -66,12 +67,12 @@ function Ke(j) {
66
67
  ), M(e.pageSize);
67
68
  },
68
69
  [R, m, M, i]
69
- ), J = t.useMemo(() => new Set(
70
+ ), W = t.useMemo(() => new Set(
70
71
  g.map((e) => e.id).filter(Boolean)
71
72
  ), [g]), [y, P] = i ? A(
72
73
  _,
73
- me(J).withOptions(c).withDefault(s?.sorting ?? [])
74
- ) : t.useState(s?.sorting ?? []), W = t.useCallback(
74
+ Se(W).withOptions(c).withDefault(s?.sorting ?? [])
75
+ ) : t.useState(s?.sorting ?? []), X = t.useCallback(
75
76
  (e) => {
76
77
  if (typeof e == "function") {
77
78
  const o = e(y);
@@ -80,15 +81,15 @@ function Ke(j) {
80
81
  P(e);
81
82
  },
82
83
  [y, P]
83
- ), u = t.useMemo(() => r ? [] : g.filter((e) => e.enableColumnFilter), [g, r]), X = t.useMemo(() => r ? {} : u.reduce((e, o) => (o.meta?.variant === "multiSelect" ? e[o.id ?? ""] = de(
84
+ ), u = t.useMemo(() => r ? [] : g.filter((e) => e.enableColumnFilter), [g, r]), $ = t.useMemo(() => r ? {} : u.reduce((e, o) => (o.meta?.variant === "multiSelect" ? e[o.id ?? ""] = fe(
84
85
  Y,
85
- Re
86
- ).withOptions(c) : e[o.id ?? ""] = Y.withOptions(c), e), {}), [u, c, r]), [D, $] = i ? fe(X) : t.useState({}), q = pe(
86
+ ye
87
+ ).withOptions(c) : e[o.id ?? ""] = Y.withOptions(c), e), {}), [u, c, r]), [D, ee] = i ? pe($) : t.useState({}), q = me(
87
88
  (e) => {
88
- m(1), $(e);
89
+ m(1), ee(e);
89
90
  },
90
91
  p
91
- ), ee = t.useMemo(() => r ? [] : Object.entries(D).reduce(
92
+ ), te = t.useMemo(() => r ? [] : Object.entries(D).reduce(
92
93
  (e, [o, n]) => {
93
94
  if (n !== null) {
94
95
  const a = u.find((f) => f.id === o)?.meta?.variant === "multiSelect", l = Array.isArray(n) ? n : a && typeof n == "string" && /[^a-zA-Z0-9]/.test(n) ? n.split(/[^a-zA-Z0-9]+/).filter(Boolean) : a ? [n] : n;
@@ -100,9 +101,9 @@ function Ke(j) {
100
101
  return e;
101
102
  },
102
103
  []
103
- ), [D, r, u]), [te, oe] = t.useState(ee), ne = t.useCallback(
104
+ ), [D, r, u]), [oe, ne] = t.useState(te), ie = t.useCallback(
104
105
  (e) => {
105
- r || oe((o) => {
106
+ r || ne((o) => {
106
107
  const n = typeof e == "function" ? e(o) : e, F = n.reduce((a, l) => {
107
108
  const f = u.find((h) => h.id === l.id);
108
109
  if (f) {
@@ -123,16 +124,17 @@ function Ke(j) {
123
124
  i
124
125
  ]
125
126
  );
126
- return { table: ie({
127
+ return { table: se({
127
128
  initialState: s,
128
129
  pageCount: U,
129
130
  state: {
130
131
  pagination: R,
131
132
  sorting: y,
132
- columnVisibility: G,
133
- columnOrder: L,
134
- rowSelection: B,
135
- columnFilters: te
133
+ columnVisibility: H,
134
+ columnOrder: Q,
135
+ rowSelection: N,
136
+ columnFilters: oe,
137
+ ...V
136
138
  },
137
139
  defaultColumn: {
138
140
  ...b.defaultColumn,
@@ -142,27 +144,27 @@ function Ke(j) {
142
144
  enablePinning: !0
143
145
  },
144
146
  enableRowSelection: !0,
145
- onRowSelectionChange: N,
146
- onPaginationChange: Z,
147
- onSortingChange: W,
148
- onColumnFiltersChange: ne,
149
- onColumnVisibilityChange: H,
150
- onColumnOrderChange: Q,
151
- getCoreRowModel: ge(),
152
- getFilteredRowModel: ue(),
153
- getPaginationRowModel: ce(),
154
- getSortedRowModel: le(),
155
- getFacetedRowModel: re(),
156
- getFacetedUniqueValues: ae(),
157
- getFacetedMinMaxValues: se(),
147
+ onRowSelectionChange: G,
148
+ onPaginationChange: J,
149
+ onSortingChange: X,
150
+ onColumnFiltersChange: ie,
151
+ onColumnVisibilityChange: L,
152
+ onColumnOrderChange: Z,
153
+ getCoreRowModel: de(),
154
+ getFilteredRowModel: ge(),
155
+ getPaginationRowModel: ue(),
156
+ getSortedRowModel: ce(),
157
+ getFacetedRowModel: le(),
158
+ getFacetedUniqueValues: re(),
159
+ getFacetedMinMaxValues: ae(),
158
160
  meta: {
159
161
  ...b.meta,
160
162
  queryKeys: {
161
163
  page: I,
162
164
  perPage: T,
163
165
  sort: _,
164
- filters: V,
165
- joinOperator: k
166
+ filters: k,
167
+ joinOperator: B
166
168
  }
167
169
  },
168
170
  ...b,
@@ -170,6 +172,6 @@ function Ke(j) {
170
172
  }), shallow: w, debounceMs: p, throttleMs: S };
171
173
  }
172
174
  export {
173
- Ke as useDataTable
175
+ xe as useDataTable
174
176
  };
175
177
  //# sourceMappingURL=use-data-table.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-data-table.js","sources":["../../../src/hooks/use-data-table.ts"],"sourcesContent":["\"use client\";\n\n/* eslint-disable react-hooks/rules-of-hooks */\n\nimport {\n type ColumnFiltersState,\n type ColumnOrderState,\n getCoreRowModel,\n getFacetedMinMaxValues,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n type PaginationState,\n type RowSelectionState,\n type SortingState,\n type TableOptions,\n type TableState,\n type Updater,\n useReactTable,\n type VisibilityState,\n} from \"@tanstack/react-table\";\nimport {\n parseAsArrayOf,\n parseAsInteger,\n parseAsString,\n type SingleParser,\n type UseQueryStateOptions,\n useQueryState,\n useQueryStates,\n} from \"nuqs\";\nimport * as React from \"react\";\n\nimport { useDebouncedCallback } from \"@/hooks/use-debounced-callback\";\nimport { getSortingStateParser } from \"@/utils/parsers\";\nimport type { ExtendedColumnSort, QueryKeys } from \"@/types/data-table\";\n\nconst PAGE_KEY = \"page\";\nconst PER_PAGE_KEY = \"perPage\";\nconst SORT_KEY = \"sort\";\nconst FILTERS_KEY = \"filters\";\nconst JOIN_OPERATOR_KEY = \"joinOperator\";\nconst ARRAY_SEPARATOR = \",\";\nconst DEBOUNCE_MS = 300;\nconst THROTTLE_MS = 50;\n\ninterface UseDataTableProps<TData>\n extends Omit<\n TableOptions<TData>,\n // | \"state\"\n // | \"pageCount\"\n \"getCoreRowModel\"\n > {\n initialState?: Omit<Partial<TableState>, \"sorting\"> & {\n sorting?: ExtendedColumnSort<TData>[];\n };\n queryKeys?: Partial<QueryKeys>;\n history?: \"push\" | \"replace\";\n debounceMs?: number;\n throttleMs?: number;\n clearOnDefault?: boolean;\n enableAdvancedFilter?: boolean;\n scroll?: boolean;\n shallow?: boolean;\n startTransition?: React.TransitionStartFunction;\n enableNuqs?: boolean;\n}\n\nexport function useDataTable<TData>(props: UseDataTableProps<TData>) {\n const {\n columns,\n pageCount,\n initialState,\n queryKeys,\n history = \"replace\",\n debounceMs = DEBOUNCE_MS,\n throttleMs = THROTTLE_MS,\n clearOnDefault = false,\n enableAdvancedFilter = false,\n scroll = false,\n shallow = true,\n startTransition,\n enableNuqs = false,\n ...tableProps\n } = props;\n const pageKey = queryKeys?.page ?? PAGE_KEY;\n const perPageKey = queryKeys?.perPage ?? PER_PAGE_KEY;\n const sortKey = queryKeys?.sort ?? SORT_KEY;\n const filtersKey = queryKeys?.filters ?? FILTERS_KEY;\n const joinOperatorKey = queryKeys?.joinOperator ?? JOIN_OPERATOR_KEY;\n\n const queryStateOptions = React.useMemo<\n Omit<UseQueryStateOptions<string>, \"parse\">\n >(\n () => ({\n history,\n scroll,\n shallow,\n throttleMs,\n debounceMs,\n clearOnDefault,\n startTransition: startTransition as any,\n }),\n [\n history,\n scroll,\n shallow,\n throttleMs,\n debounceMs,\n clearOnDefault,\n startTransition,\n ]\n );\n\n const [rowSelection, setRowSelection] = React.useState<RowSelectionState>(\n initialState?.rowSelection ?? {}\n );\n const [columnVisibility, setColumnVisibility] =\n React.useState<VisibilityState>(initialState?.columnVisibility ?? {});\n const [columnOrder, setColumnOrder] = React.useState<ColumnOrderState>(\n initialState?.columnOrder ?? []\n );\n\n const [page, setPage] = enableNuqs\n ? useQueryState(\n pageKey,\n parseAsInteger.withOptions(queryStateOptions).withDefault(1)\n )\n : React.useState(initialState?.pagination?.pageIndex ?? 0);\n\n const [perPage, setPerPage] = enableNuqs\n ? useQueryState(\n perPageKey,\n parseAsInteger\n .withOptions(queryStateOptions)\n .withDefault(initialState?.pagination?.pageSize ?? 10)\n )\n : React.useState(initialState?.pagination?.pageSize ?? 10);\n\n const pagination: PaginationState = React.useMemo(() => {\n return {\n pageIndex: enableNuqs ? page - 1 : page, // zero-based index\n pageSize: perPage,\n };\n }, [page, perPage, enableNuqs]);\n\n const onPaginationChange = React.useCallback(\n (updaterOrValue: Updater<PaginationState>) => {\n if (typeof updaterOrValue === \"function\") {\n const newPagination = updaterOrValue(pagination);\n void setPage(\n enableNuqs ? newPagination.pageIndex + 1 : newPagination.pageIndex\n );\n void setPerPage(newPagination.pageSize);\n } else {\n void setPage(\n enableNuqs ? updaterOrValue.pageIndex + 1 : updaterOrValue.pageIndex\n );\n void setPerPage(updaterOrValue.pageSize);\n }\n },\n [pagination, setPage, setPerPage, enableNuqs]\n );\n\n const columnIds = React.useMemo(() => {\n return new Set(\n columns.map((column) => column.id).filter(Boolean) as string[]\n );\n }, [columns]);\n\n // Note: enableNuqs should be stable (not change during component lifecycle)\n // to avoid violating React hooks rules. If it changes, it may cause issues.\n const [sorting, setSorting] = enableNuqs\n ? useQueryState(\n sortKey,\n getSortingStateParser<TData>(columnIds)\n .withOptions(queryStateOptions)\n .withDefault(initialState?.sorting ?? [])\n )\n : React.useState(initialState?.sorting ?? []);\n\n const onSortingChange = React.useCallback(\n (updaterOrValue: Updater<SortingState>) => {\n if (typeof updaterOrValue === \"function\") {\n const newSorting = updaterOrValue(sorting);\n setSorting(newSorting as ExtendedColumnSort<TData>[]);\n } else {\n setSorting(updaterOrValue as ExtendedColumnSort<TData>[]);\n }\n },\n [sorting, setSorting]\n );\n\n const filterableColumns = React.useMemo(() => {\n if (enableAdvancedFilter) return [];\n\n return columns.filter((column) => column.enableColumnFilter);\n }, [columns, enableAdvancedFilter]);\n\n const filterParsers = React.useMemo(() => {\n if (enableAdvancedFilter) return {};\n\n return filterableColumns.reduce<\n Record<string, SingleParser<string> | SingleParser<string[]>>\n >((acc, column) => {\n if (column.meta?.variant === \"multiSelect\") {\n acc[column.id ?? \"\"] = parseAsArrayOf(\n parseAsString,\n ARRAY_SEPARATOR\n ).withOptions(queryStateOptions);\n } else {\n acc[column.id ?? \"\"] = parseAsString.withOptions(queryStateOptions);\n }\n return acc;\n }, {});\n }, [filterableColumns, queryStateOptions, enableAdvancedFilter]);\n\n // Note: enableNuqs should be stable (not change during component lifecycle)\n const [filterValues, setFilterValues] = enableNuqs\n ? useQueryStates(filterParsers)\n : React.useState<Record<string, string | string[] | null>>({});\n\n const debouncedSetFilterValues = useDebouncedCallback(\n (values: typeof filterValues) => {\n void setPage(1);\n void setFilterValues(values);\n },\n debounceMs\n );\n\n const initialColumnFilters: ColumnFiltersState = React.useMemo(() => {\n if (enableAdvancedFilter) return [];\n\n return Object.entries(filterValues).reduce<ColumnFiltersState>(\n (filters, [key, value]) => {\n if (value !== null) {\n const column = filterableColumns.find((col) => col.id === key);\n const isMultiSelect = column?.meta?.variant === \"multiSelect\";\n\n const processedValue = Array.isArray(value)\n ? value\n : isMultiSelect &&\n typeof value === \"string\" &&\n /[^a-zA-Z0-9]/.test(value)\n ? value.split(/[^a-zA-Z0-9]+/).filter(Boolean)\n : isMultiSelect\n ? [value]\n : value;\n\n filters.push({\n id: key,\n value: processedValue,\n });\n }\n return filters;\n },\n []\n );\n }, [filterValues, enableAdvancedFilter, filterableColumns]);\n\n const [columnFilters, setColumnFilters] =\n React.useState<ColumnFiltersState>(initialColumnFilters);\n\n const onColumnFiltersChange = React.useCallback(\n (updaterOrValue: Updater<ColumnFiltersState>) => {\n if (enableAdvancedFilter) return;\n\n setColumnFilters((prev) => {\n const next =\n typeof updaterOrValue === \"function\"\n ? updaterOrValue(prev)\n : updaterOrValue;\n\n const filterUpdates = next.reduce<\n Record<string, string | string[] | null>\n >((acc, filter) => {\n const column = filterableColumns.find((col) => col.id === filter.id);\n if (column) {\n const isMultiSelect = column.meta?.variant === \"multiSelect\";\n acc[filter.id] = isMultiSelect\n ? (filter.value as string[])\n : (filter.value as string);\n }\n console.log(\"filterParsers\", column, acc);\n return acc;\n }, {});\n\n for (const prevFilter of prev) {\n if (!next.some((filter) => filter.id === prevFilter.id)) {\n filterUpdates[prevFilter.id] = null;\n }\n }\n\n if (enableNuqs) {\n debouncedSetFilterValues(filterUpdates);\n }\n return next;\n });\n },\n [\n debouncedSetFilterValues,\n filterableColumns,\n enableAdvancedFilter,\n enableNuqs,\n ]\n );\n\n const table = useReactTable({\n initialState,\n pageCount,\n state: {\n pagination,\n sorting,\n columnVisibility,\n columnOrder,\n rowSelection,\n columnFilters,\n },\n defaultColumn: {\n ...tableProps.defaultColumn,\n enableColumnFilter: true,\n enableSorting: false,\n enableHiding: true,\n enablePinning: true,\n },\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n onPaginationChange,\n onSortingChange,\n onColumnFiltersChange,\n onColumnVisibilityChange: setColumnVisibility,\n onColumnOrderChange: setColumnOrder,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFacetedRowModel: getFacetedRowModel(),\n getFacetedUniqueValues: getFacetedUniqueValues(),\n getFacetedMinMaxValues: getFacetedMinMaxValues(),\n meta: {\n ...tableProps.meta,\n queryKeys: {\n page: pageKey,\n perPage: perPageKey,\n sort: sortKey,\n filters: filtersKey,\n joinOperator: joinOperatorKey,\n },\n },\n ...tableProps,\n columns,\n });\n\n return { table, shallow, debounceMs, throttleMs };\n}\n"],"names":["PAGE_KEY","PER_PAGE_KEY","SORT_KEY","FILTERS_KEY","JOIN_OPERATOR_KEY","ARRAY_SEPARATOR","DEBOUNCE_MS","THROTTLE_MS","useDataTable","props","columns","pageCount","initialState","queryKeys","history","debounceMs","throttleMs","clearOnDefault","enableAdvancedFilter","scroll","shallow","startTransition","enableNuqs","tableProps","pageKey","perPageKey","sortKey","filtersKey","joinOperatorKey","queryStateOptions","React","rowSelection","setRowSelection","columnVisibility","setColumnVisibility","columnOrder","setColumnOrder","page","setPage","useQueryState","parseAsInteger","perPage","setPerPage","pagination","onPaginationChange","updaterOrValue","newPagination","columnIds","column","sorting","setSorting","getSortingStateParser","onSortingChange","newSorting","filterableColumns","filterParsers","acc","parseAsArrayOf","parseAsString","filterValues","setFilterValues","useQueryStates","debouncedSetFilterValues","useDebouncedCallback","values","initialColumnFilters","filters","key","value","isMultiSelect","col","processedValue","columnFilters","setColumnFilters","onColumnFiltersChange","prev","next","filterUpdates","filter","prevFilter","useReactTable","getCoreRowModel","getFilteredRowModel","getPaginationRowModel","getSortedRowModel","getFacetedRowModel","getFacetedUniqueValues","getFacetedMinMaxValues"],"mappings":"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"}
1
+ {"version":3,"file":"use-data-table.js","sources":["../../../src/hooks/use-data-table.ts"],"sourcesContent":["\"use client\";\n\n/* eslint-disable react-hooks/rules-of-hooks */\n\nimport {\n type ColumnFiltersState,\n type ColumnOrderState,\n getCoreRowModel,\n getFacetedMinMaxValues,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n type PaginationState,\n type RowSelectionState,\n type SortingState,\n type TableOptions,\n type TableState,\n type Updater,\n useReactTable,\n type VisibilityState,\n} from \"@tanstack/react-table\";\nimport {\n parseAsArrayOf,\n parseAsInteger,\n parseAsString,\n type SingleParser,\n type UseQueryStateOptions,\n useQueryState,\n useQueryStates,\n} from \"nuqs\";\nimport * as React from \"react\";\n\nimport { useDebouncedCallback } from \"@/hooks/use-debounced-callback\";\nimport { getSortingStateParser } from \"@/utils/parsers\";\nimport type { ExtendedColumnSort, QueryKeys } from \"@/types/data-table\";\n\nconst PAGE_KEY = \"page\";\nconst PER_PAGE_KEY = \"perPage\";\nconst SORT_KEY = \"sort\";\nconst FILTERS_KEY = \"filters\";\nconst JOIN_OPERATOR_KEY = \"joinOperator\";\nconst ARRAY_SEPARATOR = \",\";\nconst DEBOUNCE_MS = 300;\nconst THROTTLE_MS = 50;\n\ninterface UseDataTableProps<TData>\n extends Omit<\n TableOptions<TData>,\n // | \"state\"\n // | \"pageCount\"\n \"getCoreRowModel\"\n > {\n initialState?: Omit<Partial<TableState>, \"sorting\"> & {\n sorting?: ExtendedColumnSort<TData>[];\n };\n queryKeys?: Partial<QueryKeys>;\n history?: \"push\" | \"replace\";\n debounceMs?: number;\n throttleMs?: number;\n clearOnDefault?: boolean;\n enableAdvancedFilter?: boolean;\n scroll?: boolean;\n shallow?: boolean;\n startTransition?: React.TransitionStartFunction;\n enableNuqs?: boolean;\n}\n\nexport function useDataTable<TData>(props: UseDataTableProps<TData>) {\n const {\n columns,\n pageCount,\n initialState,\n queryKeys,\n history = \"replace\",\n debounceMs = DEBOUNCE_MS,\n throttleMs = THROTTLE_MS,\n clearOnDefault = false,\n enableAdvancedFilter = false,\n scroll = false,\n shallow = true,\n startTransition,\n enableNuqs = false,\n state: controlledState,\n ...tableProps\n } = props;\n const pageKey = queryKeys?.page ?? PAGE_KEY;\n const perPageKey = queryKeys?.perPage ?? PER_PAGE_KEY;\n const sortKey = queryKeys?.sort ?? SORT_KEY;\n const filtersKey = queryKeys?.filters ?? FILTERS_KEY;\n const joinOperatorKey = queryKeys?.joinOperator ?? JOIN_OPERATOR_KEY;\n\n const queryStateOptions = React.useMemo<\n Omit<UseQueryStateOptions<string>, \"parse\">\n >(\n () => ({\n history,\n scroll,\n shallow,\n throttleMs,\n debounceMs,\n clearOnDefault,\n startTransition: startTransition as any,\n }),\n [\n history,\n scroll,\n shallow,\n throttleMs,\n debounceMs,\n clearOnDefault,\n startTransition,\n ]\n );\n\n const [rowSelection, setRowSelection] = React.useState<RowSelectionState>(\n initialState?.rowSelection ?? {}\n );\n const [columnVisibility, setColumnVisibility] =\n React.useState<VisibilityState>(initialState?.columnVisibility ?? {});\n const [columnOrder, setColumnOrder] = React.useState<ColumnOrderState>(\n initialState?.columnOrder ?? []\n );\n\n const [page, setPage] = enableNuqs\n ? useQueryState(\n pageKey,\n parseAsInteger.withOptions(queryStateOptions).withDefault(1)\n )\n : React.useState(initialState?.pagination?.pageIndex ?? 0);\n\n const [perPage, setPerPage] = enableNuqs\n ? useQueryState(\n perPageKey,\n parseAsInteger\n .withOptions(queryStateOptions)\n .withDefault(initialState?.pagination?.pageSize ?? 10)\n )\n : React.useState(initialState?.pagination?.pageSize ?? 10);\n\n const pagination: PaginationState = React.useMemo(() => {\n return {\n pageIndex: enableNuqs ? page - 1 : page, // zero-based index\n pageSize: perPage,\n };\n }, [page, perPage, enableNuqs]);\n\n const onPaginationChange = React.useCallback(\n (updaterOrValue: Updater<PaginationState>) => {\n if (typeof updaterOrValue === \"function\") {\n const newPagination = updaterOrValue(pagination);\n void setPage(\n enableNuqs ? newPagination.pageIndex + 1 : newPagination.pageIndex\n );\n void setPerPage(newPagination.pageSize);\n } else {\n void setPage(\n enableNuqs ? updaterOrValue.pageIndex + 1 : updaterOrValue.pageIndex\n );\n void setPerPage(updaterOrValue.pageSize);\n }\n },\n [pagination, setPage, setPerPage, enableNuqs]\n );\n\n const columnIds = React.useMemo(() => {\n return new Set(\n columns.map((column) => column.id).filter(Boolean) as string[]\n );\n }, [columns]);\n\n // Note: enableNuqs should be stable (not change during component lifecycle)\n // to avoid violating React hooks rules. If it changes, it may cause issues.\n const [sorting, setSorting] = enableNuqs\n ? useQueryState(\n sortKey,\n getSortingStateParser<TData>(columnIds)\n .withOptions(queryStateOptions)\n .withDefault(initialState?.sorting ?? [])\n )\n : React.useState(initialState?.sorting ?? []);\n\n const onSortingChange = React.useCallback(\n (updaterOrValue: Updater<SortingState>) => {\n if (typeof updaterOrValue === \"function\") {\n const newSorting = updaterOrValue(sorting);\n setSorting(newSorting as ExtendedColumnSort<TData>[]);\n } else {\n setSorting(updaterOrValue as ExtendedColumnSort<TData>[]);\n }\n },\n [sorting, setSorting]\n );\n\n const filterableColumns = React.useMemo(() => {\n if (enableAdvancedFilter) return [];\n\n return columns.filter((column) => column.enableColumnFilter);\n }, [columns, enableAdvancedFilter]);\n\n const filterParsers = React.useMemo(() => {\n if (enableAdvancedFilter) return {};\n\n return filterableColumns.reduce<\n Record<string, SingleParser<string> | SingleParser<string[]>>\n >((acc, column) => {\n if (column.meta?.variant === \"multiSelect\") {\n acc[column.id ?? \"\"] = parseAsArrayOf(\n parseAsString,\n ARRAY_SEPARATOR\n ).withOptions(queryStateOptions);\n } else {\n acc[column.id ?? \"\"] = parseAsString.withOptions(queryStateOptions);\n }\n return acc;\n }, {});\n }, [filterableColumns, queryStateOptions, enableAdvancedFilter]);\n\n // Note: enableNuqs should be stable (not change during component lifecycle)\n const [filterValues, setFilterValues] = enableNuqs\n ? useQueryStates(filterParsers)\n : React.useState<Record<string, string | string[] | null>>({});\n\n const debouncedSetFilterValues = useDebouncedCallback(\n (values: typeof filterValues) => {\n void setPage(1);\n void setFilterValues(values);\n },\n debounceMs\n );\n\n const initialColumnFilters: ColumnFiltersState = React.useMemo(() => {\n if (enableAdvancedFilter) return [];\n\n return Object.entries(filterValues).reduce<ColumnFiltersState>(\n (filters, [key, value]) => {\n if (value !== null) {\n const column = filterableColumns.find((col) => col.id === key);\n const isMultiSelect = column?.meta?.variant === \"multiSelect\";\n\n const processedValue = Array.isArray(value)\n ? value\n : isMultiSelect &&\n typeof value === \"string\" &&\n /[^a-zA-Z0-9]/.test(value)\n ? value.split(/[^a-zA-Z0-9]+/).filter(Boolean)\n : isMultiSelect\n ? [value]\n : value;\n\n filters.push({\n id: key,\n value: processedValue,\n });\n }\n return filters;\n },\n []\n );\n }, [filterValues, enableAdvancedFilter, filterableColumns]);\n\n const [columnFilters, setColumnFilters] =\n React.useState<ColumnFiltersState>(initialColumnFilters);\n\n const onColumnFiltersChange = React.useCallback(\n (updaterOrValue: Updater<ColumnFiltersState>) => {\n if (enableAdvancedFilter) return;\n\n setColumnFilters((prev) => {\n const next =\n typeof updaterOrValue === \"function\"\n ? updaterOrValue(prev)\n : updaterOrValue;\n\n const filterUpdates = next.reduce<\n Record<string, string | string[] | null>\n >((acc, filter) => {\n const column = filterableColumns.find((col) => col.id === filter.id);\n if (column) {\n const isMultiSelect = column.meta?.variant === \"multiSelect\";\n acc[filter.id] = isMultiSelect\n ? (filter.value as string[])\n : (filter.value as string);\n }\n console.log(\"filterParsers\", column, acc);\n return acc;\n }, {});\n\n for (const prevFilter of prev) {\n if (!next.some((filter) => filter.id === prevFilter.id)) {\n filterUpdates[prevFilter.id] = null;\n }\n }\n\n if (enableNuqs) {\n debouncedSetFilterValues(filterUpdates);\n }\n return next;\n });\n },\n [\n debouncedSetFilterValues,\n filterableColumns,\n enableAdvancedFilter,\n enableNuqs,\n ]\n );\n\n const table = useReactTable({\n initialState,\n pageCount,\n state: {\n pagination,\n sorting,\n columnVisibility,\n columnOrder,\n rowSelection,\n columnFilters,\n ...controlledState,\n },\n defaultColumn: {\n ...tableProps.defaultColumn,\n enableColumnFilter: true,\n enableSorting: false,\n enableHiding: true,\n enablePinning: true,\n },\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n onPaginationChange,\n onSortingChange,\n onColumnFiltersChange,\n onColumnVisibilityChange: setColumnVisibility,\n onColumnOrderChange: setColumnOrder,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFacetedRowModel: getFacetedRowModel(),\n getFacetedUniqueValues: getFacetedUniqueValues(),\n getFacetedMinMaxValues: getFacetedMinMaxValues(),\n meta: {\n ...tableProps.meta,\n queryKeys: {\n page: pageKey,\n perPage: perPageKey,\n sort: sortKey,\n filters: filtersKey,\n joinOperator: joinOperatorKey,\n },\n },\n ...tableProps,\n columns,\n });\n\n return { table, shallow, debounceMs, throttleMs };\n}\n"],"names":["PAGE_KEY","PER_PAGE_KEY","SORT_KEY","FILTERS_KEY","JOIN_OPERATOR_KEY","ARRAY_SEPARATOR","DEBOUNCE_MS","THROTTLE_MS","useDataTable","props","columns","pageCount","initialState","queryKeys","history","debounceMs","throttleMs","clearOnDefault","enableAdvancedFilter","scroll","shallow","startTransition","enableNuqs","controlledState","tableProps","pageKey","perPageKey","sortKey","filtersKey","joinOperatorKey","queryStateOptions","React","rowSelection","setRowSelection","columnVisibility","setColumnVisibility","columnOrder","setColumnOrder","page","setPage","useQueryState","parseAsInteger","perPage","setPerPage","pagination","onPaginationChange","updaterOrValue","newPagination","columnIds","column","sorting","setSorting","getSortingStateParser","onSortingChange","newSorting","filterableColumns","filterParsers","acc","parseAsArrayOf","parseAsString","filterValues","setFilterValues","useQueryStates","debouncedSetFilterValues","useDebouncedCallback","values","initialColumnFilters","filters","key","value","isMultiSelect","col","processedValue","columnFilters","setColumnFilters","onColumnFiltersChange","prev","next","filterUpdates","filter","prevFilter","useReactTable","getCoreRowModel","getFilteredRowModel","getPaginationRowModel","getSortedRowModel","getFacetedRowModel","getFacetedUniqueValues","getFacetedMinMaxValues"],"mappings":"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"}