@docyrus/shadcn 1.2.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data-table-DWI8FPWh.d.ts +209 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.js +300 -16
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-data-table.d.ts +29 -0
- package/dist/hooks/use-data-table.js +322 -0
- package/dist/hooks/use-data-table.js.map +1 -0
- package/dist/index.d.ts +87 -25
- package/dist/index.js +2504 -1151
- package/dist/index.js.map +1 -1
- package/dist/lib/data-table.d.ts +4 -0
- package/dist/lib/data-table.js +100 -0
- package/dist/lib/data-table.js.map +1 -0
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.js +155 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/parsers.d.ts +4 -0
- package/dist/lib/parsers.js +94 -0
- package/dist/lib/parsers.js.map +1 -0
- package/dist/radix-vega/data-table-column-header.d.ts +13 -0
- package/dist/radix-vega/data-table-column-header.js +178 -0
- package/dist/radix-vega/data-table-column-header.js.map +1 -0
- package/dist/radix-vega/data-table-date-filter.d.ts +11 -0
- package/dist/radix-vega/data-table-date-filter.js +470 -0
- package/dist/radix-vega/data-table-date-filter.js.map +1 -0
- package/dist/radix-vega/data-table-faceted-filter.d.ts +166 -0
- package/dist/radix-vega/data-table-faceted-filter.js +468 -0
- package/dist/radix-vega/data-table-faceted-filter.js.map +1 -0
- package/dist/radix-vega/data-table-pagination.d.ts +10 -0
- package/dist/radix-vega/data-table-pagination.js +286 -0
- package/dist/radix-vega/data-table-pagination.js.map +1 -0
- package/dist/radix-vega/data-table-skeleton.d.ts +14 -0
- package/dist/radix-vega/data-table-skeleton.js +151 -0
- package/dist/radix-vega/data-table-skeleton.js.map +1 -0
- package/dist/radix-vega/data-table-slider-filter.d.ts +10 -0
- package/dist/radix-vega/data-table-slider-filter.js +387 -0
- package/dist/radix-vega/data-table-slider-filter.js.map +1 -0
- package/dist/radix-vega/data-table-toolbar.d.ts +10 -0
- package/dist/radix-vega/data-table-toolbar.js +1272 -0
- package/dist/radix-vega/data-table-toolbar.js.map +1 -0
- package/dist/radix-vega/data-table-view-options.d.ts +13 -0
- package/dist/radix-vega/data-table-view-options.js +314 -0
- package/dist/radix-vega/data-table-view-options.js.map +1 -0
- package/dist/radix-vega/data-table.d.ts +11 -0
- package/dist/radix-vega/data-table.js +429 -0
- package/dist/radix-vega/data-table.js.map +1 -0
- package/dist/radix-vega/index.d.ts +10 -0
- package/dist/radix-vega/index.js +2170 -1156
- package/dist/radix-vega/index.js.map +1 -1
- package/dist/radix-vega/relative-time-card.d.ts +2 -7
- package/dist/radix-vega/relative-time-card.js.map +1 -1
- package/package.json +4 -3
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { Table } from '@tanstack/react-table';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
|
|
5
|
+
interface DataTableProps<TData> extends React.ComponentProps<"div"> {
|
|
6
|
+
table: Table<TData>;
|
|
7
|
+
actionBar?: React.ReactNode;
|
|
8
|
+
}
|
|
9
|
+
declare function DataTable<TData>({ table, actionBar, children, className, ...props }: DataTableProps<TData>): react_jsx_runtime.JSX.Element;
|
|
10
|
+
|
|
11
|
+
export { DataTable };
|
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
import { flexRender } from '@tanstack/react-table';
|
|
2
|
+
import { ChevronsLeft, ChevronLeft, ChevronRight, ChevronsRight, ChevronDownIcon, CheckIcon, ChevronUpIcon } from 'lucide-react';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { Select as Select$1, Slot } from 'radix-ui';
|
|
5
|
+
import { clsx } from 'clsx';
|
|
6
|
+
import { twMerge } from 'tailwind-merge';
|
|
7
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
// src/radix-vega/data-table.tsx
|
|
10
|
+
function cn(...inputs) {
|
|
11
|
+
return twMerge(clsx(inputs));
|
|
12
|
+
}
|
|
13
|
+
var buttonVariants = cva(
|
|
14
|
+
"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-md border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-3 aria-invalid:ring-3 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none",
|
|
15
|
+
{
|
|
16
|
+
variants: {
|
|
17
|
+
variant: {
|
|
18
|
+
default: "bg-primary text-primary-foreground hover:bg-primary/80",
|
|
19
|
+
outline: "border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground shadow-xs",
|
|
20
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
|
|
21
|
+
ghost: "hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground",
|
|
22
|
+
destructive: "bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30",
|
|
23
|
+
link: "text-primary underline-offset-4 hover:underline"
|
|
24
|
+
},
|
|
25
|
+
size: {
|
|
26
|
+
default: "h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
|
|
27
|
+
xs: "h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
|
|
28
|
+
sm: "h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5",
|
|
29
|
+
lg: "h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3",
|
|
30
|
+
icon: "size-9",
|
|
31
|
+
"icon-xs": "size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3",
|
|
32
|
+
"icon-sm": "size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md",
|
|
33
|
+
"icon-lg": "size-10"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
defaultVariants: {
|
|
37
|
+
variant: "default",
|
|
38
|
+
size: "default"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
function Button({
|
|
43
|
+
className,
|
|
44
|
+
variant = "default",
|
|
45
|
+
size = "default",
|
|
46
|
+
asChild = false,
|
|
47
|
+
...props
|
|
48
|
+
}) {
|
|
49
|
+
const Comp = asChild ? Slot.Root : "button";
|
|
50
|
+
return /* @__PURE__ */ jsx(
|
|
51
|
+
Comp,
|
|
52
|
+
{
|
|
53
|
+
"data-slot": "button",
|
|
54
|
+
"data-variant": variant,
|
|
55
|
+
"data-size": size,
|
|
56
|
+
className: cn(buttonVariants({ variant, size, className })),
|
|
57
|
+
...props
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
function Select({
|
|
62
|
+
...props
|
|
63
|
+
}) {
|
|
64
|
+
return /* @__PURE__ */ jsx(Select$1.Root, { "data-slot": "select", ...props });
|
|
65
|
+
}
|
|
66
|
+
function SelectValue({
|
|
67
|
+
...props
|
|
68
|
+
}) {
|
|
69
|
+
return /* @__PURE__ */ jsx(Select$1.Value, { "data-slot": "select-value", ...props });
|
|
70
|
+
}
|
|
71
|
+
function SelectTrigger({
|
|
72
|
+
className,
|
|
73
|
+
size = "default",
|
|
74
|
+
children,
|
|
75
|
+
...props
|
|
76
|
+
}) {
|
|
77
|
+
return /* @__PURE__ */ jsxs(
|
|
78
|
+
Select$1.Trigger,
|
|
79
|
+
{
|
|
80
|
+
"data-slot": "select-trigger",
|
|
81
|
+
"data-size": size,
|
|
82
|
+
className: cn(
|
|
83
|
+
"border-input data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 gap-1.5 rounded-md border bg-transparent py-2 pr-2 pl-2.5 text-sm shadow-xs transition-[color,box-shadow] focus-visible:ring-3 aria-invalid:ring-3 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:gap-1.5 [&_svg:not([class*='size-'])]:size-4 flex w-fit items-center justify-between whitespace-nowrap outline-none disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
84
|
+
className
|
|
85
|
+
),
|
|
86
|
+
...props,
|
|
87
|
+
children: [
|
|
88
|
+
children,
|
|
89
|
+
/* @__PURE__ */ jsx(Select$1.Icon, { asChild: true, children: /* @__PURE__ */ jsx(ChevronDownIcon, { className: "text-muted-foreground size-4 pointer-events-none" }) })
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
function SelectContent({
|
|
95
|
+
className,
|
|
96
|
+
children,
|
|
97
|
+
position = "item-aligned",
|
|
98
|
+
align = "center",
|
|
99
|
+
...props
|
|
100
|
+
}) {
|
|
101
|
+
return /* @__PURE__ */ jsx(Select$1.Portal, { children: /* @__PURE__ */ jsxs(
|
|
102
|
+
Select$1.Content,
|
|
103
|
+
{
|
|
104
|
+
"data-slot": "select-content",
|
|
105
|
+
"data-align-trigger": position === "item-aligned",
|
|
106
|
+
className: cn("bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 min-w-36 rounded-md shadow-md ring-1 duration-100 relative z-50 max-h-(--radix-select-content-available-height) origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto data-[align-trigger=true]:animate-none", position === "popper" && "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1", className),
|
|
107
|
+
position,
|
|
108
|
+
align,
|
|
109
|
+
...props,
|
|
110
|
+
children: [
|
|
111
|
+
/* @__PURE__ */ jsx(SelectScrollUpButton, {}),
|
|
112
|
+
/* @__PURE__ */ jsx(
|
|
113
|
+
Select$1.Viewport,
|
|
114
|
+
{
|
|
115
|
+
"data-position": position,
|
|
116
|
+
className: cn(
|
|
117
|
+
"data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)",
|
|
118
|
+
position === "popper" && ""
|
|
119
|
+
),
|
|
120
|
+
children
|
|
121
|
+
}
|
|
122
|
+
),
|
|
123
|
+
/* @__PURE__ */ jsx(SelectScrollDownButton, {})
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
) });
|
|
127
|
+
}
|
|
128
|
+
function SelectItem({
|
|
129
|
+
className,
|
|
130
|
+
children,
|
|
131
|
+
...props
|
|
132
|
+
}) {
|
|
133
|
+
return /* @__PURE__ */ jsxs(
|
|
134
|
+
Select$1.Item,
|
|
135
|
+
{
|
|
136
|
+
"data-slot": "select-item",
|
|
137
|
+
className: cn(
|
|
138
|
+
"focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 relative flex w-full cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
139
|
+
className
|
|
140
|
+
),
|
|
141
|
+
...props,
|
|
142
|
+
children: [
|
|
143
|
+
/* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx(Select$1.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: "pointer-events-none" }) }) }),
|
|
144
|
+
/* @__PURE__ */ jsx(Select$1.ItemText, { children })
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
function SelectScrollUpButton({
|
|
150
|
+
className,
|
|
151
|
+
...props
|
|
152
|
+
}) {
|
|
153
|
+
return /* @__PURE__ */ jsx(
|
|
154
|
+
Select$1.ScrollUpButton,
|
|
155
|
+
{
|
|
156
|
+
"data-slot": "select-scroll-up-button",
|
|
157
|
+
className: cn("bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4", className),
|
|
158
|
+
...props,
|
|
159
|
+
children: /* @__PURE__ */ jsx(
|
|
160
|
+
ChevronUpIcon,
|
|
161
|
+
{}
|
|
162
|
+
)
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
function SelectScrollDownButton({
|
|
167
|
+
className,
|
|
168
|
+
...props
|
|
169
|
+
}) {
|
|
170
|
+
return /* @__PURE__ */ jsx(
|
|
171
|
+
Select$1.ScrollDownButton,
|
|
172
|
+
{
|
|
173
|
+
"data-slot": "select-scroll-down-button",
|
|
174
|
+
className: cn("bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4", className),
|
|
175
|
+
...props,
|
|
176
|
+
children: /* @__PURE__ */ jsx(
|
|
177
|
+
ChevronDownIcon,
|
|
178
|
+
{}
|
|
179
|
+
)
|
|
180
|
+
}
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
function DataTablePagination({
|
|
184
|
+
table,
|
|
185
|
+
pageSizeOptions = [10, 20, 30, 40, 50],
|
|
186
|
+
className,
|
|
187
|
+
...props
|
|
188
|
+
}) {
|
|
189
|
+
return /* @__PURE__ */ jsxs(
|
|
190
|
+
"div",
|
|
191
|
+
{
|
|
192
|
+
className: cn(
|
|
193
|
+
"flex w-full flex-col-reverse items-center justify-between gap-4 overflow-auto p-1 sm:flex-row sm:gap-8",
|
|
194
|
+
className
|
|
195
|
+
),
|
|
196
|
+
...props,
|
|
197
|
+
children: [
|
|
198
|
+
/* @__PURE__ */ jsxs("div", { className: "flex-1 whitespace-nowrap text-muted-foreground text-sm", children: [
|
|
199
|
+
table.getFilteredSelectedRowModel().rows.length,
|
|
200
|
+
" of",
|
|
201
|
+
" ",
|
|
202
|
+
table.getFilteredRowModel().rows.length,
|
|
203
|
+
" row(s) selected."
|
|
204
|
+
] }),
|
|
205
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col-reverse items-center gap-4 sm:flex-row sm:gap-6 lg:gap-8", children: [
|
|
206
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-2", children: [
|
|
207
|
+
/* @__PURE__ */ jsx("p", { className: "whitespace-nowrap font-medium text-sm", children: "Rows per page" }),
|
|
208
|
+
/* @__PURE__ */ jsxs(
|
|
209
|
+
Select,
|
|
210
|
+
{
|
|
211
|
+
value: `${table.getState().pagination.pageSize}`,
|
|
212
|
+
onValueChange: (value) => {
|
|
213
|
+
table.setPageSize(Number(value));
|
|
214
|
+
},
|
|
215
|
+
children: [
|
|
216
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: "h-8 w-18 data-size:h-8", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: table.getState().pagination.pageSize }) }),
|
|
217
|
+
/* @__PURE__ */ jsx(SelectContent, { side: "top", children: pageSizeOptions.map((pageSize) => /* @__PURE__ */ jsx(SelectItem, { value: `${pageSize}`, children: pageSize }, pageSize)) })
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
)
|
|
221
|
+
] }),
|
|
222
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center font-medium text-sm", children: [
|
|
223
|
+
"Page ",
|
|
224
|
+
table.getState().pagination.pageIndex + 1,
|
|
225
|
+
" of",
|
|
226
|
+
" ",
|
|
227
|
+
table.getPageCount()
|
|
228
|
+
] }),
|
|
229
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center space-x-2", children: [
|
|
230
|
+
/* @__PURE__ */ jsx(
|
|
231
|
+
Button,
|
|
232
|
+
{
|
|
233
|
+
"aria-label": "Go to first page",
|
|
234
|
+
variant: "outline",
|
|
235
|
+
size: "icon",
|
|
236
|
+
className: "hidden size-8 lg:flex",
|
|
237
|
+
onClick: () => table.setPageIndex(0),
|
|
238
|
+
disabled: !table.getCanPreviousPage(),
|
|
239
|
+
children: /* @__PURE__ */ jsx(ChevronsLeft, {})
|
|
240
|
+
}
|
|
241
|
+
),
|
|
242
|
+
/* @__PURE__ */ jsx(
|
|
243
|
+
Button,
|
|
244
|
+
{
|
|
245
|
+
"aria-label": "Go to previous page",
|
|
246
|
+
variant: "outline",
|
|
247
|
+
size: "icon",
|
|
248
|
+
className: "size-8",
|
|
249
|
+
onClick: () => table.previousPage(),
|
|
250
|
+
disabled: !table.getCanPreviousPage(),
|
|
251
|
+
children: /* @__PURE__ */ jsx(ChevronLeft, {})
|
|
252
|
+
}
|
|
253
|
+
),
|
|
254
|
+
/* @__PURE__ */ jsx(
|
|
255
|
+
Button,
|
|
256
|
+
{
|
|
257
|
+
"aria-label": "Go to next page",
|
|
258
|
+
variant: "outline",
|
|
259
|
+
size: "icon",
|
|
260
|
+
className: "size-8",
|
|
261
|
+
onClick: () => table.nextPage(),
|
|
262
|
+
disabled: !table.getCanNextPage(),
|
|
263
|
+
children: /* @__PURE__ */ jsx(ChevronRight, {})
|
|
264
|
+
}
|
|
265
|
+
),
|
|
266
|
+
/* @__PURE__ */ jsx(
|
|
267
|
+
Button,
|
|
268
|
+
{
|
|
269
|
+
"aria-label": "Go to last page",
|
|
270
|
+
variant: "outline",
|
|
271
|
+
size: "icon",
|
|
272
|
+
className: "hidden size-8 lg:flex",
|
|
273
|
+
onClick: () => table.setPageIndex(table.getPageCount() - 1),
|
|
274
|
+
disabled: !table.getCanNextPage(),
|
|
275
|
+
children: /* @__PURE__ */ jsx(ChevronsRight, {})
|
|
276
|
+
}
|
|
277
|
+
)
|
|
278
|
+
] })
|
|
279
|
+
] })
|
|
280
|
+
]
|
|
281
|
+
}
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
function Table({ className, ...props }) {
|
|
285
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "table-container", className: "relative w-full overflow-x-auto", children: /* @__PURE__ */ jsx(
|
|
286
|
+
"table",
|
|
287
|
+
{
|
|
288
|
+
"data-slot": "table",
|
|
289
|
+
className: cn("w-full caption-bottom text-sm", className),
|
|
290
|
+
...props
|
|
291
|
+
}
|
|
292
|
+
) });
|
|
293
|
+
}
|
|
294
|
+
function TableHeader({ className, ...props }) {
|
|
295
|
+
return /* @__PURE__ */ jsx(
|
|
296
|
+
"thead",
|
|
297
|
+
{
|
|
298
|
+
"data-slot": "table-header",
|
|
299
|
+
className: cn("[&_tr]:border-b", className),
|
|
300
|
+
...props
|
|
301
|
+
}
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
function TableBody({ className, ...props }) {
|
|
305
|
+
return /* @__PURE__ */ jsx(
|
|
306
|
+
"tbody",
|
|
307
|
+
{
|
|
308
|
+
"data-slot": "table-body",
|
|
309
|
+
className: cn("[&_tr:last-child]:border-0", className),
|
|
310
|
+
...props
|
|
311
|
+
}
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
function TableRow({ className, ...props }) {
|
|
315
|
+
return /* @__PURE__ */ jsx(
|
|
316
|
+
"tr",
|
|
317
|
+
{
|
|
318
|
+
"data-slot": "table-row",
|
|
319
|
+
className: cn("hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors", className),
|
|
320
|
+
...props
|
|
321
|
+
}
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
function TableHead({ className, ...props }) {
|
|
325
|
+
return /* @__PURE__ */ jsx(
|
|
326
|
+
"th",
|
|
327
|
+
{
|
|
328
|
+
"data-slot": "table-head",
|
|
329
|
+
className: cn("text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0", className),
|
|
330
|
+
...props
|
|
331
|
+
}
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
function TableCell({ className, ...props }) {
|
|
335
|
+
return /* @__PURE__ */ jsx(
|
|
336
|
+
"td",
|
|
337
|
+
{
|
|
338
|
+
"data-slot": "table-cell",
|
|
339
|
+
className: cn("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0", className),
|
|
340
|
+
...props
|
|
341
|
+
}
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// src/lib/data-table.ts
|
|
346
|
+
function getColumnPinningStyle({
|
|
347
|
+
column
|
|
348
|
+
}) {
|
|
349
|
+
const isPinned = column.getIsPinned();
|
|
350
|
+
const isLastLeftPinnedColumn = isPinned === "left" && column.getIsLastColumn("left");
|
|
351
|
+
const isFirstRightPinnedColumn = isPinned === "right" && column.getIsFirstColumn("right");
|
|
352
|
+
return {
|
|
353
|
+
boxShadow: isLastLeftPinnedColumn ? "-4px 0 4px -4px gray inset" : isFirstRightPinnedColumn ? "4px 0 4px -4px gray inset" : void 0,
|
|
354
|
+
left: isPinned === "left" ? `${column.getStart("left")}px` : void 0,
|
|
355
|
+
right: isPinned === "right" ? `${column.getAfter("right")}px` : void 0,
|
|
356
|
+
position: isPinned ? "sticky" : "relative",
|
|
357
|
+
width: column.getSize(),
|
|
358
|
+
zIndex: isPinned ? 1 : 0
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
function DataTable({
|
|
362
|
+
table,
|
|
363
|
+
actionBar,
|
|
364
|
+
children,
|
|
365
|
+
className,
|
|
366
|
+
...props
|
|
367
|
+
}) {
|
|
368
|
+
return /* @__PURE__ */ jsxs(
|
|
369
|
+
"div",
|
|
370
|
+
{
|
|
371
|
+
className: cn("flex w-full flex-col gap-2.5 overflow-auto", className),
|
|
372
|
+
...props,
|
|
373
|
+
children: [
|
|
374
|
+
children,
|
|
375
|
+
/* @__PURE__ */ jsx("div", { className: "overflow-hidden rounded-md border", children: /* @__PURE__ */ jsxs(Table, { children: [
|
|
376
|
+
/* @__PURE__ */ jsx(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx(TableRow, { children: headerGroup.headers.map((header) => /* @__PURE__ */ jsx(
|
|
377
|
+
TableHead,
|
|
378
|
+
{
|
|
379
|
+
colSpan: header.colSpan,
|
|
380
|
+
style: {
|
|
381
|
+
...getColumnPinningStyle({ column: header.column })
|
|
382
|
+
},
|
|
383
|
+
children: header.isPlaceholder ? null : flexRender(
|
|
384
|
+
header.column.columnDef.header,
|
|
385
|
+
header.getContext()
|
|
386
|
+
)
|
|
387
|
+
},
|
|
388
|
+
header.id
|
|
389
|
+
)) }, headerGroup.id)) }),
|
|
390
|
+
/* @__PURE__ */ jsx(TableBody, { children: table.getRowModel().rows?.length ? table.getRowModel().rows.map((row) => /* @__PURE__ */ jsx(
|
|
391
|
+
TableRow,
|
|
392
|
+
{
|
|
393
|
+
"data-state": row.getIsSelected() && "selected",
|
|
394
|
+
children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx(
|
|
395
|
+
TableCell,
|
|
396
|
+
{
|
|
397
|
+
style: {
|
|
398
|
+
...getColumnPinningStyle({ column: cell.column })
|
|
399
|
+
},
|
|
400
|
+
children: flexRender(
|
|
401
|
+
cell.column.columnDef.cell,
|
|
402
|
+
cell.getContext()
|
|
403
|
+
)
|
|
404
|
+
},
|
|
405
|
+
cell.id
|
|
406
|
+
))
|
|
407
|
+
},
|
|
408
|
+
row.id
|
|
409
|
+
)) : /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(
|
|
410
|
+
TableCell,
|
|
411
|
+
{
|
|
412
|
+
colSpan: table.getAllColumns().length,
|
|
413
|
+
className: "h-24 text-center",
|
|
414
|
+
children: "No results."
|
|
415
|
+
}
|
|
416
|
+
) }) })
|
|
417
|
+
] }) }),
|
|
418
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2.5", children: [
|
|
419
|
+
/* @__PURE__ */ jsx(DataTablePagination, { table }),
|
|
420
|
+
actionBar && table.getFilteredSelectedRowModel().rows.length > 0 && actionBar
|
|
421
|
+
] })
|
|
422
|
+
]
|
|
423
|
+
}
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
export { DataTable };
|
|
428
|
+
//# sourceMappingURL=data-table.js.map
|
|
429
|
+
//# sourceMappingURL=data-table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/utils.ts","../../src/radix-vega/button.tsx","../../src/radix-vega/select.tsx","../../src/radix-vega/data-table-pagination.tsx","../../src/radix-vega/table.tsx","../../src/lib/data-table.ts","../../src/radix-vega/data-table.tsx"],"names":["jsx","SelectPrimitive","jsxs"],"mappings":"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","file":"data-table.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merges Tailwind class names, resolving any conflicts.\n *\n * @param inputs - An array of class names to merge.\n * @returns A string of merged and optimized class names.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n \"focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 rounded-md border border-transparent bg-clip-padding text-sm font-medium focus-visible:ring-3 aria-invalid:ring-3 [&_svg:not([class*='size-'])]:size-4 inline-flex items-center justify-center whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none shrink-0 [&_svg]:shrink-0 outline-none group/button select-none\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground hover:bg-primary/80\",\n outline: \"border-border bg-background hover:bg-muted hover:text-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 aria-expanded:bg-muted aria-expanded:text-foreground shadow-xs\",\n secondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground\",\n ghost: \"hover:bg-muted hover:text-foreground dark:hover:bg-muted/50 aria-expanded:bg-muted aria-expanded:text-foreground\",\n destructive: \"bg-destructive/10 hover:bg-destructive/20 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/20 text-destructive focus-visible:border-destructive/40 dark:hover:bg-destructive/30\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2\",\n xs: \"h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n sm: \"h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5\",\n lg: \"h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3\",\n icon: \"size-9\",\n \"icon-xs\": \"size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3\",\n \"icon-sm\": \"size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md\",\n \"icon-lg\": \"size-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot.Root : \"button\"\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Select as SelectPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\nimport { ChevronDownIcon, CheckIcon, ChevronUpIcon } from \"lucide-react\"\n\nfunction Select({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Root>) {\n return <SelectPrimitive.Root data-slot=\"select\" {...props} />\n}\n\nfunction SelectGroup({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Group>) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectValue({\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Value>) {\n return <SelectPrimitive.Value data-slot=\"select-value\" {...props} />\n}\n\nfunction SelectTrigger({\n className,\n size = \"default\",\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {\n size?: \"sm\" | \"default\"\n}) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n className={cn(\n \"border-input data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:aria-invalid:border-destructive/50 gap-1.5 rounded-md border bg-transparent py-2 pr-2 pl-2.5 text-sm shadow-xs transition-[color,box-shadow] focus-visible:ring-3 aria-invalid:ring-3 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:gap-1.5 [&_svg:not([class*='size-'])]:size-4 flex w-fit items-center justify-between whitespace-nowrap outline-none disabled:cursor-not-allowed disabled:opacity-50 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDownIcon className=\"text-muted-foreground size-4 pointer-events-none\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n )\n}\n\nfunction SelectContent({\n className,\n children,\n position = \"item-aligned\",\n align = \"center\",\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n data-slot=\"select-content\"\n data-align-trigger={position === \"item-aligned\"}\n className={cn(\"bg-popover text-popover-foreground data-open:animate-in data-closed:animate-out data-closed:fade-out-0 data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 ring-foreground/10 min-w-36 rounded-md shadow-md ring-1 duration-100 relative z-50 max-h-(--radix-select-content-available-height) origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto data-[align-trigger=true]:animate-none\", position ===\"popper\"&&\"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\", className )}\n position={position}\n align={align}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n data-position={position}\n className={cn(\n \"data-[position=popper]:h-(--radix-select-trigger-height) data-[position=popper]:w-full data-[position=popper]:min-w-(--radix-select-trigger-width)\",\n position === \"popper\" && \"\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n )\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Label>) {\n return (\n <SelectPrimitive.Label\n data-slot=\"select-label\"\n className={cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"focus:bg-accent focus:text-accent-foreground not-data-[variant=destructive]:focus:**:text-accent-foreground gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 relative flex w-full cursor-default items-center outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className\n )}\n {...props}\n >\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"pointer-events-none\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n )\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.Separator>) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\"bg-border -mx-1 my-1 h-px pointer-events-none\", className)}\n {...props}\n />\n )\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {\n return (\n <SelectPrimitive.ScrollUpButton\n data-slot=\"select-scroll-up-button\"\n className={cn(\"bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n <ChevronUpIcon\n />\n </SelectPrimitive.ScrollUpButton>\n )\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {\n return (\n <SelectPrimitive.ScrollDownButton\n data-slot=\"select-scroll-down-button\"\n className={cn(\"bg-popover z-10 flex cursor-default items-center justify-center py-1 [&_svg:not([class*='size-'])]:size-4\", className)}\n {...props}\n >\n <ChevronDownIcon\n />\n </SelectPrimitive.ScrollDownButton>\n )\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n}\n","import type { Table } from \"@tanstack/react-table\";\nimport {\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n} from \"lucide-react\";\n\nimport { Button } from \"@/radix-vega/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/radix-vega/select\";\nimport { cn } from \"@/lib/utils\";\n\ninterface DataTablePaginationProps<TData> extends React.ComponentProps<\"div\"> {\n table: Table<TData>;\n pageSizeOptions?: number[];\n}\n\nexport function DataTablePagination<TData>({\n table,\n pageSizeOptions = [10, 20, 30, 40, 50],\n className,\n ...props\n}: DataTablePaginationProps<TData>) {\n return (\n <div\n className={cn(\n \"flex w-full flex-col-reverse items-center justify-between gap-4 overflow-auto p-1 sm:flex-row sm:gap-8\",\n className,\n )}\n {...props}\n >\n <div className=\"flex-1 whitespace-nowrap text-muted-foreground text-sm\">\n {table.getFilteredSelectedRowModel().rows.length} of{\" \"}\n {table.getFilteredRowModel().rows.length} row(s) selected.\n </div>\n <div className=\"flex flex-col-reverse items-center gap-4 sm:flex-row sm:gap-6 lg:gap-8\">\n <div className=\"flex items-center space-x-2\">\n <p className=\"whitespace-nowrap font-medium text-sm\">Rows per page</p>\n <Select\n value={`${table.getState().pagination.pageSize}`}\n onValueChange={(value) => {\n table.setPageSize(Number(value));\n }}\n >\n <SelectTrigger className=\"h-8 w-18 data-size:h-8\">\n <SelectValue placeholder={table.getState().pagination.pageSize} />\n </SelectTrigger>\n <SelectContent side=\"top\">\n {pageSizeOptions.map((pageSize) => (\n <SelectItem key={pageSize} value={`${pageSize}`}>\n {pageSize}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex items-center justify-center font-medium text-sm\">\n Page {table.getState().pagination.pageIndex + 1} of{\" \"}\n {table.getPageCount()}\n </div>\n <div className=\"flex items-center space-x-2\">\n <Button\n aria-label=\"Go to first page\"\n variant=\"outline\"\n size=\"icon\"\n className=\"hidden size-8 lg:flex\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n <ChevronsLeft />\n </Button>\n <Button\n aria-label=\"Go to previous page\"\n variant=\"outline\"\n size=\"icon\"\n className=\"size-8\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n <ChevronLeft />\n </Button>\n <Button\n aria-label=\"Go to next page\"\n variant=\"outline\"\n size=\"icon\"\n className=\"size-8\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n <ChevronRight />\n </Button>\n <Button\n aria-label=\"Go to last page\"\n variant=\"outline\"\n size=\"icon\"\n className=\"hidden size-8 lg:flex\"\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n <ChevronsRight />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full overflow-x-auto\">\n <table\n data-slot=\"table\"\n className={cn(\"w-full caption-bottom text-sm\", className)}\n {...props}\n />\n </div>\n )\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\"[&_tr]:border-b\", className)}\n {...props}\n />\n )\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn(\"bg-muted/50 border-t font-medium [&>tr]:last:border-b-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n return (\n <tr\n data-slot=\"table-row\"\n className={cn(\"hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors\", className)}\n {...props}\n />\n )\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n return (\n <th\n data-slot=\"table-head\"\n className={cn(\"text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0\", className)}\n {...props}\n />\n )\n}\n\nfunction TableCaption({\n className,\n ...props\n}: React.ComponentProps<\"caption\">) {\n return (\n <caption\n data-slot=\"table-caption\"\n className={cn(\"text-muted-foreground mt-4 text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableHead,\n TableRow,\n TableCell,\n TableCaption,\n}\n","import type { Column } from \"@tanstack/react-table\";\n\nexport type DataTableConfig = typeof dataTableConfig;\n\nexport function getColumnPinningStyle<TData>({\n column,\n}: {\n column: Column<TData>;\n}): React.CSSProperties {\n const isPinned = column.getIsPinned();\n const isLastLeftPinnedColumn =\n isPinned === \"left\" && column.getIsLastColumn(\"left\");\n const isFirstRightPinnedColumn =\n isPinned === \"right\" && column.getIsFirstColumn(\"right\");\n\n return {\n boxShadow: isLastLeftPinnedColumn\n ? \"-4px 0 4px -4px gray inset\"\n : isFirstRightPinnedColumn\n ? \"4px 0 4px -4px gray inset\"\n : undefined,\n left: isPinned === \"left\" ? `${column.getStart(\"left\")}px` : undefined,\n right: isPinned === \"right\" ? `${column.getAfter(\"right\")}px` : undefined,\n position: isPinned ? \"sticky\" : \"relative\",\n width: column.getSize(),\n zIndex: isPinned ? 1 : 0,\n };\n}\n\nexport const dataTableConfig = {\n textOperators: [\n { label: \"Contains\", value: \"iLike\" as const },\n { label: \"Does not contain\", value: \"notILike\" as const },\n { label: \"Is\", value: \"eq\" as const },\n { label: \"Is not\", value: \"ne\" as const },\n { label: \"Is empty\", value: \"isEmpty\" as const },\n { label: \"Is not empty\", value: \"isNotEmpty\" as const },\n ],\n numericOperators: [\n { label: \"Is\", value: \"eq\" as const },\n { label: \"Is not\", value: \"ne\" as const },\n { label: \"Is less than\", value: \"lt\" as const },\n { label: \"Is less than or equal to\", value: \"lte\" as const },\n { label: \"Is greater than\", value: \"gt\" as const },\n { label: \"Is greater than or equal to\", value: \"gte\" as const },\n { label: \"Is between\", value: \"isBetween\" as const },\n { label: \"Is empty\", value: \"isEmpty\" as const },\n { label: \"Is not empty\", value: \"isNotEmpty\" as const },\n ],\n dateOperators: [\n { label: \"Is\", value: \"eq\" as const },\n { label: \"Is not\", value: \"ne\" as const },\n { label: \"Is before\", value: \"lt\" as const },\n { label: \"Is after\", value: \"gt\" as const },\n { label: \"Is on or before\", value: \"lte\" as const },\n { label: \"Is on or after\", value: \"gte\" as const },\n { label: \"Is between\", value: \"isBetween\" as const },\n { label: \"Is relative to today\", value: \"isRelativeToToday\" as const },\n { label: \"Is empty\", value: \"isEmpty\" as const },\n { label: \"Is not empty\", value: \"isNotEmpty\" as const },\n ],\n selectOperators: [\n { label: \"Is\", value: \"eq\" as const },\n { label: \"Is not\", value: \"ne\" as const },\n { label: \"Is empty\", value: \"isEmpty\" as const },\n { label: \"Is not empty\", value: \"isNotEmpty\" as const },\n ],\n multiSelectOperators: [\n { label: \"Has any of\", value: \"inArray\" as const },\n { label: \"Has none of\", value: \"notInArray\" as const },\n { label: \"Is empty\", value: \"isEmpty\" as const },\n { label: \"Is not empty\", value: \"isNotEmpty\" as const },\n ],\n booleanOperators: [\n { label: \"Is\", value: \"eq\" as const },\n { label: \"Is not\", value: \"ne\" as const },\n ],\n sortOrders: [\n { label: \"Asc\", value: \"asc\" as const },\n { label: \"Desc\", value: \"desc\" as const },\n ],\n filterVariants: [\n \"text\",\n \"number\",\n \"range\",\n \"date\",\n \"dateRange\",\n \"boolean\",\n \"select\",\n \"multiSelect\",\n ] as const,\n operators: [\n \"iLike\",\n \"notILike\",\n \"eq\",\n \"ne\",\n \"inArray\",\n \"notInArray\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"isBetween\",\n \"isRelativeToToday\",\n ] as const,\n joinOperators: [\"and\", \"or\"] as const,\n};\n\n// Types\nimport type { ColumnSort, Row, RowData } from \"@tanstack/react-table\";\nimport type { FilterItemSchema } from \"@/lib/parsers\";\n\ndeclare module \"@tanstack/react-table\" {\n interface TableMeta<TData extends RowData> {\n queryKeys?: QueryKeys;\n }\n\n interface ColumnMeta<TData extends RowData, TValue> {\n label?: string;\n placeholder?: string;\n variant?: FilterVariant;\n options?: Option[];\n range?: [number, number];\n unit?: string;\n icon?: React.FC<React.SVGProps<SVGSVGElement>>;\n }\n}\n\nexport interface QueryKeys {\n page: string;\n perPage: string;\n sort: string;\n filters: string;\n joinOperator: string;\n}\n\nexport interface Option {\n label: string;\n value: string;\n count?: number;\n icon?: React.FC<React.SVGProps<SVGSVGElement>>;\n}\n\nexport type FilterOperator = DataTableConfig[\"operators\"][number];\nexport type FilterVariant = DataTableConfig[\"filterVariants\"][number];\nexport type JoinOperator = DataTableConfig[\"joinOperators\"][number];\n\nexport interface ExtendedColumnSort<TData> extends Omit<ColumnSort, \"id\"> {\n id: Extract<keyof TData, string>;\n}\n\nexport interface ExtendedColumnFilter<TData> extends FilterItemSchema {\n id: Extract<keyof TData, string>;\n}\n\nexport interface DataTableRowAction<TData> {\n row: Row<TData>;\n variant: \"update\" | \"delete\";\n}\n","import { flexRender, type Table as TanstackTable } from \"@tanstack/react-table\";\nimport type * as React from \"react\";\n\nimport { DataTablePagination } from \"@/radix-vega/data-table-pagination\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"@/radix-vega/table\";\nimport { getColumnPinningStyle } from \"@/lib/data-table\";\nimport { cn } from \"@/lib/utils\";\n\ninterface DataTableProps<TData> extends React.ComponentProps<\"div\"> {\n table: TanstackTable<TData>;\n actionBar?: React.ReactNode;\n}\n\nexport function DataTable<TData>({\n table,\n actionBar,\n children,\n className,\n ...props\n}: DataTableProps<TData>) {\n return (\n <div\n className={cn(\"flex w-full flex-col gap-2.5 overflow-auto\", className)}\n {...props}\n >\n {children}\n <div className=\"overflow-hidden rounded-md border\">\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n colSpan={header.colSpan}\n style={{\n ...getColumnPinningStyle({ column: header.column }),\n }}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n data-state={row.getIsSelected() && \"selected\"}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n style={{\n ...getColumnPinningStyle({ column: cell.column }),\n }}\n >\n {flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n )}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell\n colSpan={table.getAllColumns().length}\n className=\"h-24 text-center\"\n >\n No results.\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n </div>\n <div className=\"flex flex-col gap-2.5\">\n <DataTablePagination table={table} />\n {actionBar &&\n table.getFilteredSelectedRowModel().rows.length > 0 &&\n actionBar}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -25,6 +25,15 @@ export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, Comma
|
|
|
25
25
|
export { CompareSlider, CompareSliderAfter, CompareSliderBefore, CompareSliderHandle, CompareSliderLabel, CompareSliderProps } from './compare-slider.js';
|
|
26
26
|
export { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger } from './context-menu.js';
|
|
27
27
|
export { Cropper, CropperArea, CropperAreaData, CropperImage, CropperObjectFit, CropperPoint, CropperProps, CropperShape, CropperSize, CropperVideo, useCropper } from './cropper.js';
|
|
28
|
+
export { DataTableColumnHeader } from './data-table-column-header.js';
|
|
29
|
+
export { DataTableDateFilter } from './data-table-date-filter.js';
|
|
30
|
+
export { DataTableFacetedFilter } from './data-table-faceted-filter.js';
|
|
31
|
+
export { DataTablePagination } from './data-table-pagination.js';
|
|
32
|
+
export { DataTableSkeleton } from './data-table-skeleton.js';
|
|
33
|
+
export { DataTableSliderFilter } from './data-table-slider-filter.js';
|
|
34
|
+
export { DataTableToolbar } from './data-table-toolbar.js';
|
|
35
|
+
export { DataTableViewOptions } from './data-table-view-options.js';
|
|
36
|
+
export { DataTable } from './data-table.js';
|
|
28
37
|
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from './dialog.js';
|
|
29
38
|
export { DirectionProvider, useDirection } from './direction.js';
|
|
30
39
|
export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerPortal, DrawerTitle, DrawerTrigger } from './drawer.js';
|
|
@@ -104,6 +113,7 @@ import '@diceui/checkbox-group';
|
|
|
104
113
|
import '@radix-ui/react-slider';
|
|
105
114
|
import '@diceui/combobox';
|
|
106
115
|
import 'cmdk';
|
|
116
|
+
import '@tanstack/react-table';
|
|
107
117
|
import 'vaul';
|
|
108
118
|
import 'input-otp';
|
|
109
119
|
import '@dnd-kit/core';
|