@potenlab/ui 0.1.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/chunk-2W3RBVMM.js +698 -0
- package/dist/chunk-2W3RBVMM.js.map +1 -0
- package/dist/chunk-3PDPL453.cjs +42 -0
- package/dist/chunk-3PDPL453.cjs.map +1 -0
- package/dist/chunk-6GVBJTP3.js +3 -0
- package/dist/chunk-6GVBJTP3.js.map +1 -0
- package/dist/chunk-7XPQQR3Z.cjs +586 -0
- package/dist/chunk-7XPQQR3Z.cjs.map +1 -0
- package/dist/chunk-CN4BR5A5.cjs +1442 -0
- package/dist/chunk-CN4BR5A5.cjs.map +1 -0
- package/dist/chunk-DUACVZEX.js +13 -0
- package/dist/chunk-DUACVZEX.js.map +1 -0
- package/dist/chunk-EKVWVJD4.cjs +4 -0
- package/dist/chunk-EKVWVJD4.cjs.map +1 -0
- package/dist/chunk-IIMC6ODV.js +554 -0
- package/dist/chunk-IIMC6ODV.js.map +1 -0
- package/dist/chunk-M67D4PYJ.cjs +4 -0
- package/dist/chunk-M67D4PYJ.cjs.map +1 -0
- package/dist/chunk-O4BML5KD.cjs +744 -0
- package/dist/chunk-O4BML5KD.cjs.map +1 -0
- package/dist/chunk-OF2IE7ZP.cjs +26 -0
- package/dist/chunk-OF2IE7ZP.cjs.map +1 -0
- package/dist/chunk-T2ZO7QTO.js +3 -0
- package/dist/chunk-T2ZO7QTO.js.map +1 -0
- package/dist/chunk-T3VMPVU4.js +20 -0
- package/dist/chunk-T3VMPVU4.js.map +1 -0
- package/dist/chunk-VMWIQIIN.js +1343 -0
- package/dist/chunk-VMWIQIIN.js.map +1 -0
- package/dist/chunk-YDSVKR35.js +23 -0
- package/dist/chunk-YDSVKR35.js.map +1 -0
- package/dist/chunk-YSNZIYC2.cjs +16 -0
- package/dist/chunk-YSNZIYC2.cjs.map +1 -0
- package/dist/components/common/index.cjs +54 -0
- package/dist/components/common/index.cjs.map +1 -0
- package/dist/components/common/index.d.cts +138 -0
- package/dist/components/common/index.d.ts +138 -0
- package/dist/components/common/index.js +5 -0
- package/dist/components/common/index.js.map +1 -0
- package/dist/components/layouts/index.cjs +16 -0
- package/dist/components/layouts/index.cjs.map +1 -0
- package/dist/components/layouts/index.d.cts +15 -0
- package/dist/components/layouts/index.d.ts +15 -0
- package/dist/components/layouts/index.js +3 -0
- package/dist/components/layouts/index.js.map +1 -0
- package/dist/components/ui/index.cjs +503 -0
- package/dist/components/ui/index.cjs.map +1 -0
- package/dist/components/ui/index.d.cts +217 -0
- package/dist/components/ui/index.d.ts +217 -0
- package/dist/components/ui/index.js +6 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/hooks/index.cjs +13 -0
- package/dist/hooks/index.cjs.map +1 -0
- package/dist/hooks/index.d.cts +3 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.cjs +571 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +29 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/index.cjs +17 -0
- package/dist/lib/index.cjs.map +1 -0
- package/dist/lib/index.d.cts +6 -0
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.js +4 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/styles/globals.css +167 -0
- package/package.json +137 -0
- package/src/styles/globals.css +167 -0
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
import { Label, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Input, Switch, Badge, Button, Separator, Tabs, TabsList, TabsTrigger, Table, TableHeader, TableRow, TableHead, TableBody, TableCell, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem } from './chunk-2W3RBVMM.js';
|
|
2
|
+
import { formatNumber, cn } from './chunk-DUACVZEX.js';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
import * as React3 from 'react';
|
|
5
|
+
import { ChevronsLeft, ChevronLeft, ChevronRight, ChevronsRight, ArrowUpDown, MoreHorizontal } from 'lucide-react';
|
|
6
|
+
import { useReactTable, getPaginationRowModel, getFilteredRowModel, getSortedRowModel, getCoreRowModel, flexRender } from '@tanstack/react-table';
|
|
7
|
+
|
|
8
|
+
function FormField({ id, label, type, value, options, onChange }) {
|
|
9
|
+
if (type === "select") {
|
|
10
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
|
|
11
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: id, children: label }),
|
|
12
|
+
/* @__PURE__ */ jsxs(Select, { value, onValueChange: onChange, children: [
|
|
13
|
+
/* @__PURE__ */ jsx(SelectTrigger, { id, className: "h-[52px] pr-4", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: label }) }),
|
|
14
|
+
/* @__PURE__ */ jsx(SelectContent, { children: options?.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: option, children: option }, option)) })
|
|
15
|
+
] })
|
|
16
|
+
] });
|
|
17
|
+
}
|
|
18
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
|
|
19
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: id, children: label }),
|
|
20
|
+
/* @__PURE__ */ jsx(
|
|
21
|
+
Input,
|
|
22
|
+
{
|
|
23
|
+
id,
|
|
24
|
+
className: "h-[52px]",
|
|
25
|
+
value,
|
|
26
|
+
onChange: (e) => onChange(e.target.value)
|
|
27
|
+
}
|
|
28
|
+
)
|
|
29
|
+
] });
|
|
30
|
+
}
|
|
31
|
+
function LabeledSwitch({ id, label, checked, onCheckedChange }) {
|
|
32
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
33
|
+
/* @__PURE__ */ jsx(
|
|
34
|
+
"label",
|
|
35
|
+
{
|
|
36
|
+
htmlFor: id,
|
|
37
|
+
className: "font-pretendard text-[16px] font-medium text-black select-none cursor-pointer",
|
|
38
|
+
children: label
|
|
39
|
+
}
|
|
40
|
+
),
|
|
41
|
+
/* @__PURE__ */ jsx(Switch, { id, checked, onCheckedChange })
|
|
42
|
+
] });
|
|
43
|
+
}
|
|
44
|
+
function PageHeader({
|
|
45
|
+
title,
|
|
46
|
+
subtitle,
|
|
47
|
+
badgeCount,
|
|
48
|
+
badgeSuffix = "",
|
|
49
|
+
actionLabel,
|
|
50
|
+
actionIcon: ActionIcon,
|
|
51
|
+
onAction
|
|
52
|
+
}) {
|
|
53
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
54
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-row justify-between items-start", children: [
|
|
55
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
56
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
57
|
+
/* @__PURE__ */ jsx("h1", { className: "font-pretendard text-[32px] font-semibold text-black", children: title }),
|
|
58
|
+
badgeCount !== void 0 && /* @__PURE__ */ jsxs(
|
|
59
|
+
Badge,
|
|
60
|
+
{
|
|
61
|
+
variant: "green",
|
|
62
|
+
"aria-label": `Total: ${formatNumber(badgeCount)}${badgeSuffix}`,
|
|
63
|
+
children: [
|
|
64
|
+
formatNumber(badgeCount),
|
|
65
|
+
badgeSuffix
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
)
|
|
69
|
+
] }),
|
|
70
|
+
/* @__PURE__ */ jsx("p", { className: "font-pretendard text-[18px] font-medium text-subtitle mt-1", children: subtitle })
|
|
71
|
+
] }),
|
|
72
|
+
/* @__PURE__ */ jsxs(Button, { variant: "primary", onClick: onAction, children: [
|
|
73
|
+
ActionIcon && /* @__PURE__ */ jsx(ActionIcon, { className: "size-5" }),
|
|
74
|
+
actionLabel
|
|
75
|
+
] })
|
|
76
|
+
] }),
|
|
77
|
+
/* @__PURE__ */ jsx(Separator, { className: "my-6" })
|
|
78
|
+
] });
|
|
79
|
+
}
|
|
80
|
+
function SearchBar({
|
|
81
|
+
value,
|
|
82
|
+
onChange,
|
|
83
|
+
placeholder = "Search...",
|
|
84
|
+
ariaLabel = "Search",
|
|
85
|
+
className
|
|
86
|
+
}) {
|
|
87
|
+
return /* @__PURE__ */ jsx(
|
|
88
|
+
Input,
|
|
89
|
+
{
|
|
90
|
+
className: cn("h-12 rounded-md", className),
|
|
91
|
+
placeholder,
|
|
92
|
+
value,
|
|
93
|
+
onChange: (e) => onChange(e.target.value),
|
|
94
|
+
"aria-label": ariaLabel
|
|
95
|
+
}
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
function PaginationControls({
|
|
99
|
+
currentPage,
|
|
100
|
+
totalPages,
|
|
101
|
+
itemsPerPage,
|
|
102
|
+
onPageChange,
|
|
103
|
+
onItemsPerPageChange,
|
|
104
|
+
labels,
|
|
105
|
+
className
|
|
106
|
+
}) {
|
|
107
|
+
const [pageJumpInput, setPageJumpInput] = React3.useState("");
|
|
108
|
+
const pageJumpPlaceholder = labels?.pageJumpPlaceholder ?? "Page";
|
|
109
|
+
const pageJumpButton = labels?.pageJumpButton ?? "Go";
|
|
110
|
+
const itemsPerPageLabel = labels?.itemsPerPageLabel ?? "Items per page";
|
|
111
|
+
const itemSuffix = labels?.itemSuffix ?? "";
|
|
112
|
+
const isFirstPage = currentPage <= 1;
|
|
113
|
+
const isLastPage = currentPage >= totalPages;
|
|
114
|
+
function handleGoToFirst() {
|
|
115
|
+
if (!isFirstPage) {
|
|
116
|
+
onPageChange(1);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function handleGoToPrevious() {
|
|
120
|
+
if (!isFirstPage) {
|
|
121
|
+
onPageChange(currentPage - 1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function handleGoToNext() {
|
|
125
|
+
if (!isLastPage) {
|
|
126
|
+
onPageChange(currentPage + 1);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function handleGoToLast() {
|
|
130
|
+
if (!isLastPage) {
|
|
131
|
+
onPageChange(totalPages);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function handlePageJump() {
|
|
135
|
+
const page = parseInt(pageJumpInput, 10);
|
|
136
|
+
if (!isNaN(page) && page >= 1 && page <= totalPages) {
|
|
137
|
+
onPageChange(page);
|
|
138
|
+
setPageJumpInput("");
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function handlePageJumpKeyDown(e) {
|
|
142
|
+
if (e.key === "Enter") {
|
|
143
|
+
handlePageJump();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function handleItemsPerPageChange(value) {
|
|
147
|
+
const count = parseInt(value, 10);
|
|
148
|
+
if (!isNaN(count)) {
|
|
149
|
+
onItemsPerPageChange(count);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center justify-between", className), children: [
|
|
153
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
154
|
+
/* @__PURE__ */ jsx(
|
|
155
|
+
Button,
|
|
156
|
+
{
|
|
157
|
+
variant: "pagination",
|
|
158
|
+
size: "pagination",
|
|
159
|
+
"aria-label": "Go to first page",
|
|
160
|
+
disabled: isFirstPage,
|
|
161
|
+
onClick: handleGoToFirst,
|
|
162
|
+
children: /* @__PURE__ */ jsx(ChevronsLeft, { className: "size-5" })
|
|
163
|
+
}
|
|
164
|
+
),
|
|
165
|
+
/* @__PURE__ */ jsx(
|
|
166
|
+
Button,
|
|
167
|
+
{
|
|
168
|
+
variant: "pagination",
|
|
169
|
+
size: "pagination",
|
|
170
|
+
"aria-label": "Previous page",
|
|
171
|
+
disabled: isFirstPage,
|
|
172
|
+
onClick: handleGoToPrevious,
|
|
173
|
+
children: /* @__PURE__ */ jsx(ChevronLeft, { className: "size-5" })
|
|
174
|
+
}
|
|
175
|
+
),
|
|
176
|
+
/* @__PURE__ */ jsx(
|
|
177
|
+
Button,
|
|
178
|
+
{
|
|
179
|
+
variant: "pagination",
|
|
180
|
+
size: "pagination",
|
|
181
|
+
"aria-label": "Next page",
|
|
182
|
+
disabled: isLastPage,
|
|
183
|
+
onClick: handleGoToNext,
|
|
184
|
+
children: /* @__PURE__ */ jsx(ChevronRight, { className: "size-5" })
|
|
185
|
+
}
|
|
186
|
+
),
|
|
187
|
+
/* @__PURE__ */ jsx(
|
|
188
|
+
Button,
|
|
189
|
+
{
|
|
190
|
+
variant: "pagination",
|
|
191
|
+
size: "pagination",
|
|
192
|
+
"aria-label": "Go to last page",
|
|
193
|
+
disabled: isLastPage,
|
|
194
|
+
onClick: handleGoToLast,
|
|
195
|
+
children: /* @__PURE__ */ jsx(ChevronsRight, { className: "size-5" })
|
|
196
|
+
}
|
|
197
|
+
),
|
|
198
|
+
/* @__PURE__ */ jsxs(
|
|
199
|
+
"span",
|
|
200
|
+
{
|
|
201
|
+
className: "flex items-center gap-1 px-2",
|
|
202
|
+
"aria-live": "polite",
|
|
203
|
+
children: [
|
|
204
|
+
/* @__PURE__ */ jsx("span", { className: "text-[20px] font-bold", children: currentPage }),
|
|
205
|
+
/* @__PURE__ */ jsxs("span", { className: "text-[16px] font-normal text-muted-fg", children: [
|
|
206
|
+
"/ ",
|
|
207
|
+
totalPages
|
|
208
|
+
] })
|
|
209
|
+
]
|
|
210
|
+
}
|
|
211
|
+
)
|
|
212
|
+
] }),
|
|
213
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
214
|
+
/* @__PURE__ */ jsx(
|
|
215
|
+
Input,
|
|
216
|
+
{
|
|
217
|
+
className: "w-[100px] h-12",
|
|
218
|
+
placeholder: pageJumpPlaceholder,
|
|
219
|
+
value: pageJumpInput,
|
|
220
|
+
onChange: (e) => setPageJumpInput(e.target.value),
|
|
221
|
+
onKeyDown: handlePageJumpKeyDown,
|
|
222
|
+
"aria-label": pageJumpPlaceholder
|
|
223
|
+
}
|
|
224
|
+
),
|
|
225
|
+
/* @__PURE__ */ jsx(
|
|
226
|
+
Button,
|
|
227
|
+
{
|
|
228
|
+
variant: "secondary",
|
|
229
|
+
size: "secondary",
|
|
230
|
+
onClick: handlePageJump,
|
|
231
|
+
children: pageJumpButton
|
|
232
|
+
}
|
|
233
|
+
),
|
|
234
|
+
/* @__PURE__ */ jsxs(
|
|
235
|
+
Select,
|
|
236
|
+
{
|
|
237
|
+
value: String(itemsPerPage),
|
|
238
|
+
onValueChange: handleItemsPerPageChange,
|
|
239
|
+
children: [
|
|
240
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: "w-[96px] h-12", "aria-label": itemsPerPageLabel, children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
241
|
+
/* @__PURE__ */ jsxs(SelectContent, { children: [
|
|
242
|
+
/* @__PURE__ */ jsxs(SelectItem, { value: "10", children: [
|
|
243
|
+
"10",
|
|
244
|
+
itemSuffix
|
|
245
|
+
] }),
|
|
246
|
+
/* @__PURE__ */ jsxs(SelectItem, { value: "20", children: [
|
|
247
|
+
"20",
|
|
248
|
+
itemSuffix
|
|
249
|
+
] }),
|
|
250
|
+
/* @__PURE__ */ jsxs(SelectItem, { value: "50", children: [
|
|
251
|
+
"50",
|
|
252
|
+
itemSuffix
|
|
253
|
+
] })
|
|
254
|
+
] })
|
|
255
|
+
]
|
|
256
|
+
}
|
|
257
|
+
)
|
|
258
|
+
] })
|
|
259
|
+
] });
|
|
260
|
+
}
|
|
261
|
+
function TabNavigation({
|
|
262
|
+
tabs,
|
|
263
|
+
defaultValue,
|
|
264
|
+
value,
|
|
265
|
+
onTabChange,
|
|
266
|
+
className
|
|
267
|
+
}) {
|
|
268
|
+
return /* @__PURE__ */ jsx(
|
|
269
|
+
Tabs,
|
|
270
|
+
{
|
|
271
|
+
defaultValue,
|
|
272
|
+
value,
|
|
273
|
+
onValueChange: onTabChange,
|
|
274
|
+
className: cn(className),
|
|
275
|
+
children: /* @__PURE__ */ jsx(TabsList, { children: tabs.map((tab) => /* @__PURE__ */ jsx(TabsTrigger, { value: tab.value, disabled: tab.disabled, children: tab.label }, tab.value)) })
|
|
276
|
+
}
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
function DataTablePagination({
|
|
280
|
+
table,
|
|
281
|
+
pageSizeOptions = [10, 20, 50],
|
|
282
|
+
labels
|
|
283
|
+
}) {
|
|
284
|
+
const [pageJumpInput, setPageJumpInput] = React3.useState("");
|
|
285
|
+
const pageJumpPlaceholder = labels?.pageJumpPlaceholder ?? "Page";
|
|
286
|
+
const pageJumpButton = labels?.pageJumpButton ?? "Go";
|
|
287
|
+
const itemsPerPageLabel = labels?.itemsPerPageLabel ?? "Items per page";
|
|
288
|
+
const itemSuffix = labels?.itemSuffix ?? "";
|
|
289
|
+
const currentPage = table.getState().pagination.pageIndex + 1;
|
|
290
|
+
const totalPages = table.getPageCount();
|
|
291
|
+
function handlePageJump() {
|
|
292
|
+
const page = parseInt(pageJumpInput, 10);
|
|
293
|
+
if (!isNaN(page) && page >= 1 && page <= totalPages) {
|
|
294
|
+
table.setPageIndex(page - 1);
|
|
295
|
+
setPageJumpInput("");
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
function handlePageJumpKeyDown(e) {
|
|
299
|
+
if (e.key === "Enter") {
|
|
300
|
+
handlePageJump();
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
304
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
305
|
+
/* @__PURE__ */ jsx(
|
|
306
|
+
Button,
|
|
307
|
+
{
|
|
308
|
+
variant: "pagination",
|
|
309
|
+
size: "pagination",
|
|
310
|
+
"aria-label": "Go to first page",
|
|
311
|
+
disabled: !table.getCanPreviousPage(),
|
|
312
|
+
onClick: () => table.setPageIndex(0),
|
|
313
|
+
children: /* @__PURE__ */ jsx(ChevronsLeft, { className: "size-5" })
|
|
314
|
+
}
|
|
315
|
+
),
|
|
316
|
+
/* @__PURE__ */ jsx(
|
|
317
|
+
Button,
|
|
318
|
+
{
|
|
319
|
+
variant: "pagination",
|
|
320
|
+
size: "pagination",
|
|
321
|
+
"aria-label": "Previous page",
|
|
322
|
+
disabled: !table.getCanPreviousPage(),
|
|
323
|
+
onClick: () => table.previousPage(),
|
|
324
|
+
children: /* @__PURE__ */ jsx(ChevronLeft, { className: "size-5" })
|
|
325
|
+
}
|
|
326
|
+
),
|
|
327
|
+
/* @__PURE__ */ jsx(
|
|
328
|
+
Button,
|
|
329
|
+
{
|
|
330
|
+
variant: "pagination",
|
|
331
|
+
size: "pagination",
|
|
332
|
+
"aria-label": "Next page",
|
|
333
|
+
disabled: !table.getCanNextPage(),
|
|
334
|
+
onClick: () => table.nextPage(),
|
|
335
|
+
children: /* @__PURE__ */ jsx(ChevronRight, { className: "size-5" })
|
|
336
|
+
}
|
|
337
|
+
),
|
|
338
|
+
/* @__PURE__ */ jsx(
|
|
339
|
+
Button,
|
|
340
|
+
{
|
|
341
|
+
variant: "pagination",
|
|
342
|
+
size: "pagination",
|
|
343
|
+
"aria-label": "Go to last page",
|
|
344
|
+
disabled: !table.getCanNextPage(),
|
|
345
|
+
onClick: () => table.setPageIndex(table.getPageCount() - 1),
|
|
346
|
+
children: /* @__PURE__ */ jsx(ChevronsRight, { className: "size-5" })
|
|
347
|
+
}
|
|
348
|
+
),
|
|
349
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 px-2", "aria-live": "polite", children: [
|
|
350
|
+
/* @__PURE__ */ jsx("span", { className: "text-[20px] font-bold", children: currentPage }),
|
|
351
|
+
/* @__PURE__ */ jsxs("span", { className: "text-[16px] font-normal text-muted-fg", children: [
|
|
352
|
+
"/ ",
|
|
353
|
+
totalPages
|
|
354
|
+
] })
|
|
355
|
+
] })
|
|
356
|
+
] }),
|
|
357
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
358
|
+
/* @__PURE__ */ jsx(
|
|
359
|
+
Input,
|
|
360
|
+
{
|
|
361
|
+
className: "w-[100px] h-12",
|
|
362
|
+
placeholder: pageJumpPlaceholder,
|
|
363
|
+
value: pageJumpInput,
|
|
364
|
+
onChange: (e) => setPageJumpInput(e.target.value),
|
|
365
|
+
onKeyDown: handlePageJumpKeyDown,
|
|
366
|
+
"aria-label": pageJumpPlaceholder
|
|
367
|
+
}
|
|
368
|
+
),
|
|
369
|
+
/* @__PURE__ */ jsx(Button, { variant: "secondary", size: "secondary", onClick: handlePageJump, children: pageJumpButton }),
|
|
370
|
+
/* @__PURE__ */ jsxs(
|
|
371
|
+
Select,
|
|
372
|
+
{
|
|
373
|
+
value: String(table.getState().pagination.pageSize),
|
|
374
|
+
onValueChange: (value) => table.setPageSize(Number(value)),
|
|
375
|
+
children: [
|
|
376
|
+
/* @__PURE__ */ jsx(SelectTrigger, { className: "w-[96px] h-12", "aria-label": itemsPerPageLabel, children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
377
|
+
/* @__PURE__ */ jsx(SelectContent, { children: pageSizeOptions.map((size) => /* @__PURE__ */ jsxs(SelectItem, { value: String(size), children: [
|
|
378
|
+
size,
|
|
379
|
+
itemSuffix
|
|
380
|
+
] }, size)) })
|
|
381
|
+
]
|
|
382
|
+
}
|
|
383
|
+
)
|
|
384
|
+
] })
|
|
385
|
+
] });
|
|
386
|
+
}
|
|
387
|
+
function DataTable({
|
|
388
|
+
columns,
|
|
389
|
+
data,
|
|
390
|
+
enableSorting = false,
|
|
391
|
+
enableFiltering = false,
|
|
392
|
+
enableRowSelection = false,
|
|
393
|
+
enablePagination = false,
|
|
394
|
+
manualPagination = false,
|
|
395
|
+
rowCount,
|
|
396
|
+
pageSizeOptions,
|
|
397
|
+
onRowClick,
|
|
398
|
+
emptyMessage = "No data available.",
|
|
399
|
+
sorting: sortingProp,
|
|
400
|
+
onSortingChange,
|
|
401
|
+
columnFilters: columnFiltersProp,
|
|
402
|
+
onColumnFiltersChange,
|
|
403
|
+
pagination: paginationProp,
|
|
404
|
+
onPaginationChange,
|
|
405
|
+
rowSelection: rowSelectionProp,
|
|
406
|
+
onRowSelectionChange,
|
|
407
|
+
columnVisibility: columnVisibilityProp,
|
|
408
|
+
onColumnVisibilityChange
|
|
409
|
+
}) {
|
|
410
|
+
const [internalSorting, setInternalSorting] = React3.useState(
|
|
411
|
+
[]
|
|
412
|
+
);
|
|
413
|
+
const [internalColumnFilters, setInternalColumnFilters] = React3.useState([]);
|
|
414
|
+
const [internalRowSelection, setInternalRowSelection] = React3.useState({});
|
|
415
|
+
const [internalColumnVisibility, setInternalColumnVisibility] = React3.useState({});
|
|
416
|
+
const [internalPagination, setInternalPagination] = React3.useState({ pageIndex: 0, pageSize: 10 });
|
|
417
|
+
const table = useReactTable({
|
|
418
|
+
data,
|
|
419
|
+
columns,
|
|
420
|
+
rowCount: manualPagination ? rowCount : void 0,
|
|
421
|
+
state: {
|
|
422
|
+
sorting: sortingProp ?? internalSorting,
|
|
423
|
+
columnFilters: columnFiltersProp ?? internalColumnFilters,
|
|
424
|
+
rowSelection: rowSelectionProp ?? internalRowSelection,
|
|
425
|
+
columnVisibility: columnVisibilityProp ?? internalColumnVisibility,
|
|
426
|
+
pagination: paginationProp ?? internalPagination
|
|
427
|
+
},
|
|
428
|
+
onSortingChange: onSortingChange ?? setInternalSorting,
|
|
429
|
+
onColumnFiltersChange: onColumnFiltersChange ?? setInternalColumnFilters,
|
|
430
|
+
onRowSelectionChange: onRowSelectionChange ?? setInternalRowSelection,
|
|
431
|
+
onColumnVisibilityChange: onColumnVisibilityChange ?? setInternalColumnVisibility,
|
|
432
|
+
onPaginationChange: onPaginationChange ?? setInternalPagination,
|
|
433
|
+
getCoreRowModel: getCoreRowModel(),
|
|
434
|
+
...enableSorting && { getSortedRowModel: getSortedRowModel() },
|
|
435
|
+
...enableFiltering && { getFilteredRowModel: getFilteredRowModel() },
|
|
436
|
+
...enablePagination && !manualPagination && {
|
|
437
|
+
getPaginationRowModel: getPaginationRowModel()
|
|
438
|
+
},
|
|
439
|
+
enableRowSelection,
|
|
440
|
+
manualPagination
|
|
441
|
+
});
|
|
442
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
443
|
+
/* @__PURE__ */ jsxs(Table, { children: [
|
|
444
|
+
/* @__PURE__ */ jsx(TableHeader, { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx(
|
|
445
|
+
TableRow,
|
|
446
|
+
{
|
|
447
|
+
className: "hover:bg-table-header cursor-default",
|
|
448
|
+
children: headerGroup.headers.map((header) => /* @__PURE__ */ jsx(
|
|
449
|
+
TableHead,
|
|
450
|
+
{
|
|
451
|
+
className: cn(
|
|
452
|
+
header.column.columnDef.meta?.headerClassName ?? header.column.columnDef.meta?.className
|
|
453
|
+
),
|
|
454
|
+
children: header.isPlaceholder ? null : flexRender(
|
|
455
|
+
header.column.columnDef.header,
|
|
456
|
+
header.getContext()
|
|
457
|
+
)
|
|
458
|
+
},
|
|
459
|
+
header.id
|
|
460
|
+
))
|
|
461
|
+
},
|
|
462
|
+
headerGroup.id
|
|
463
|
+
)) }),
|
|
464
|
+
/* @__PURE__ */ jsx(TableBody, { children: table.getRowModel().rows?.length ? table.getRowModel().rows.map((row) => /* @__PURE__ */ jsx(
|
|
465
|
+
TableRow,
|
|
466
|
+
{
|
|
467
|
+
"data-state": row.getIsSelected() && "selected",
|
|
468
|
+
onClick: onRowClick ? () => onRowClick(row.original) : void 0,
|
|
469
|
+
onKeyDown: onRowClick ? (e) => {
|
|
470
|
+
if (e.key === "Enter") onRowClick(row.original);
|
|
471
|
+
} : void 0,
|
|
472
|
+
tabIndex: onRowClick ? 0 : void 0,
|
|
473
|
+
role: onRowClick ? "link" : void 0,
|
|
474
|
+
children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx(
|
|
475
|
+
TableCell,
|
|
476
|
+
{
|
|
477
|
+
className: cn(cell.column.columnDef.meta?.className),
|
|
478
|
+
children: flexRender(cell.column.columnDef.cell, cell.getContext())
|
|
479
|
+
},
|
|
480
|
+
cell.id
|
|
481
|
+
))
|
|
482
|
+
},
|
|
483
|
+
row.id
|
|
484
|
+
)) : /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(TableCell, { colSpan: columns.length, className: "h-24 text-center", children: emptyMessage }) }) })
|
|
485
|
+
] }),
|
|
486
|
+
enablePagination && /* @__PURE__ */ jsx(DataTablePagination, { table, pageSizeOptions })
|
|
487
|
+
] });
|
|
488
|
+
}
|
|
489
|
+
function DataTableColumnHeader({
|
|
490
|
+
column,
|
|
491
|
+
title,
|
|
492
|
+
className
|
|
493
|
+
}) {
|
|
494
|
+
if (!column.getCanSort()) {
|
|
495
|
+
return /* @__PURE__ */ jsx("div", { className: cn(className), children: title });
|
|
496
|
+
}
|
|
497
|
+
return /* @__PURE__ */ jsxs(
|
|
498
|
+
"button",
|
|
499
|
+
{
|
|
500
|
+
type: "button",
|
|
501
|
+
className: cn("flex items-center gap-1", className),
|
|
502
|
+
onClick: () => column.toggleSorting(column.getIsSorted() === "asc"),
|
|
503
|
+
children: [
|
|
504
|
+
title,
|
|
505
|
+
/* @__PURE__ */ jsx(ArrowUpDown, { className: "size-4 text-table-cell" })
|
|
506
|
+
]
|
|
507
|
+
}
|
|
508
|
+
);
|
|
509
|
+
}
|
|
510
|
+
function DataTableToolbar({
|
|
511
|
+
table,
|
|
512
|
+
searchPlaceholder = "Search...",
|
|
513
|
+
searchColumnId,
|
|
514
|
+
className,
|
|
515
|
+
children
|
|
516
|
+
}) {
|
|
517
|
+
const filterValue = searchColumnId ? table.getColumn(searchColumnId)?.getFilterValue() ?? "" : "";
|
|
518
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-2", className), children: [
|
|
519
|
+
searchColumnId && /* @__PURE__ */ jsx(
|
|
520
|
+
Input,
|
|
521
|
+
{
|
|
522
|
+
className: "h-12 rounded-md flex-1",
|
|
523
|
+
placeholder: searchPlaceholder,
|
|
524
|
+
value: filterValue,
|
|
525
|
+
onChange: (e) => table.getColumn(searchColumnId)?.setFilterValue(e.target.value),
|
|
526
|
+
"aria-label": searchPlaceholder
|
|
527
|
+
}
|
|
528
|
+
),
|
|
529
|
+
children
|
|
530
|
+
] });
|
|
531
|
+
}
|
|
532
|
+
function DataTableRowActions({ actions }) {
|
|
533
|
+
return /* @__PURE__ */ jsxs(DropdownMenu, { children: [
|
|
534
|
+
/* @__PURE__ */ jsx(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button, { variant: "ghost", size: "icon", className: "size-8 p-0", children: [
|
|
535
|
+
/* @__PURE__ */ jsx(MoreHorizontal, { className: "size-4" }),
|
|
536
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Open menu" })
|
|
537
|
+
] }) }),
|
|
538
|
+
/* @__PURE__ */ jsx(DropdownMenuContent, { align: "end", children: actions.map((action) => /* @__PURE__ */ jsx(
|
|
539
|
+
DropdownMenuItem,
|
|
540
|
+
{
|
|
541
|
+
onClick: action.onClick,
|
|
542
|
+
className: cn(
|
|
543
|
+
action.variant === "destructive" && "text-destructive"
|
|
544
|
+
),
|
|
545
|
+
children: action.label
|
|
546
|
+
},
|
|
547
|
+
action.label
|
|
548
|
+
)) })
|
|
549
|
+
] });
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
export { DataTable, DataTableColumnHeader, DataTablePagination, DataTableRowActions, DataTableToolbar, FormField, LabeledSwitch, PageHeader, PaginationControls, SearchBar, TabNavigation };
|
|
553
|
+
//# sourceMappingURL=chunk-IIMC6ODV.js.map
|
|
554
|
+
//# sourceMappingURL=chunk-IIMC6ODV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/common/form-field/form-field.tsx","../src/components/common/labeled-switch/labeled-switch.tsx","../src/components/common/page-header/page-header.tsx","../src/components/common/search-bar/search-bar.tsx","../src/components/common/pagination-controls/pagination-controls.tsx","../src/components/common/tab-navigation/tab-navigation.tsx","../src/components/common/data-table/data-table-pagination.tsx","../src/components/common/data-table/data-table.tsx","../src/components/common/data-table/data-table-column-header.tsx","../src/components/common/data-table/data-table-toolbar.tsx","../src/components/common/data-table/data-table-row-actions.tsx"],"names":["jsxs","jsx","React","React2","ChevronsLeft","ChevronLeft","ChevronRight","ChevronsRight"],"mappings":"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","file":"chunk-IIMC6ODV.js","sourcesContent":["\"use client\";\n\nimport { Label } from \"../../ui/label\";\nimport { Input } from \"../../ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../ui/select\";\n\nexport interface FormFieldProps {\n id: string;\n label: string;\n type: \"input\" | \"select\";\n value: string;\n options?: string[];\n onChange: (value: string) => void;\n}\n\nexport function FormField({ id, label, type, value, options, onChange }: FormFieldProps) {\n if (type === \"select\") {\n return (\n <div className=\"flex flex-col\">\n <Label htmlFor={id}>{label}</Label>\n <Select value={value} onValueChange={onChange}>\n <SelectTrigger id={id} className=\"h-[52px] pr-4\">\n <SelectValue placeholder={label} />\n </SelectTrigger>\n <SelectContent>\n {options?.map((option) => (\n <SelectItem key={option} value={option}>\n {option}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col\">\n <Label htmlFor={id}>{label}</Label>\n <Input\n id={id}\n className=\"h-[52px]\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { Switch } from \"../../ui/switch\";\n\nexport interface LabeledSwitchProps {\n id: string;\n label: string;\n checked: boolean;\n onCheckedChange: (checked: boolean) => void;\n}\n\nexport function LabeledSwitch({ id, label, checked, onCheckedChange }: LabeledSwitchProps) {\n return (\n <div className=\"flex items-center gap-3\">\n <label\n htmlFor={id}\n className=\"font-pretendard text-[16px] font-medium text-black select-none cursor-pointer\"\n >\n {label}\n </label>\n <Switch id={id} checked={checked} onCheckedChange={onCheckedChange} />\n </div>\n );\n}\n","\"use client\";\n\nimport type { LucideIcon } from \"lucide-react\";\nimport { Button } from \"../../ui/button\";\nimport { Badge } from \"../../ui/badge\";\nimport { Separator } from \"../../ui/separator\";\nimport { formatNumber } from \"../../../lib/utils\";\n\nexport interface PageHeaderProps {\n title: string;\n subtitle: string;\n badgeCount?: number;\n badgeSuffix?: string;\n actionLabel: string;\n actionIcon?: LucideIcon;\n onAction?: () => void;\n}\n\nexport function PageHeader({\n title,\n subtitle,\n badgeCount,\n badgeSuffix = \"\",\n actionLabel,\n actionIcon: ActionIcon,\n onAction,\n}: PageHeaderProps) {\n return (\n <div>\n <div className=\"flex flex-row justify-between items-start\">\n {/* Left side */}\n <div>\n {/* Title row with badge */}\n <div className=\"flex items-center gap-3\">\n <h1 className=\"font-pretendard text-[32px] font-semibold text-black\">\n {title}\n </h1>\n {badgeCount !== undefined && (\n <Badge\n variant=\"green\"\n aria-label={`Total: ${formatNumber(badgeCount)}${badgeSuffix}`}\n >\n {formatNumber(badgeCount)}{badgeSuffix}\n </Badge>\n )}\n </div>\n {/* Subtitle */}\n <p className=\"font-pretendard text-[18px] font-medium text-subtitle mt-1\">\n {subtitle}\n </p>\n </div>\n\n {/* Right side */}\n <Button variant=\"primary\" onClick={onAction}>\n {ActionIcon && <ActionIcon className=\"size-5\" />}\n {actionLabel}\n </Button>\n </div>\n\n {/* Separator below header */}\n <Separator className=\"my-6\" />\n </div>\n );\n}\n","\"use client\";\n\nimport { Input } from \"../../ui/input\";\nimport { cn } from \"../../../lib/utils\";\n\ninterface SearchBarProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n ariaLabel?: string;\n className?: string;\n}\n\nexport function SearchBar({\n value,\n onChange,\n placeholder = \"Search...\",\n ariaLabel = \"Search\",\n className,\n}: SearchBarProps) {\n return (\n <Input\n className={cn(\"h-12 rounded-md\", className)}\n placeholder={placeholder}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n aria-label={ariaLabel}\n />\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n ChevronsLeft,\n ChevronLeft,\n ChevronRight,\n ChevronsRight,\n} from \"lucide-react\";\n\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../ui/select\";\nimport { cn } from \"../../../lib/utils\";\n\nexport interface PaginationLabels {\n pageJumpPlaceholder?: string;\n pageJumpButton?: string;\n itemsPerPageLabel?: string;\n itemSuffix?: string;\n}\n\nexport interface PaginationControlsProps {\n currentPage: number;\n totalPages: number;\n itemsPerPage: number;\n onPageChange: (page: number) => void;\n onItemsPerPageChange: (count: number) => void;\n labels?: PaginationLabels;\n className?: string;\n}\n\nexport function PaginationControls({\n currentPage,\n totalPages,\n itemsPerPage,\n onPageChange,\n onItemsPerPageChange,\n labels,\n className,\n}: PaginationControlsProps) {\n const [pageJumpInput, setPageJumpInput] = React.useState(\"\");\n\n const pageJumpPlaceholder = labels?.pageJumpPlaceholder ?? \"Page\";\n const pageJumpButton = labels?.pageJumpButton ?? \"Go\";\n const itemsPerPageLabel = labels?.itemsPerPageLabel ?? \"Items per page\";\n const itemSuffix = labels?.itemSuffix ?? \"\";\n\n const isFirstPage = currentPage <= 1;\n const isLastPage = currentPage >= totalPages;\n\n function handleGoToFirst() {\n if (!isFirstPage) {\n onPageChange(1);\n }\n }\n\n function handleGoToPrevious() {\n if (!isFirstPage) {\n onPageChange(currentPage - 1);\n }\n }\n\n function handleGoToNext() {\n if (!isLastPage) {\n onPageChange(currentPage + 1);\n }\n }\n\n function handleGoToLast() {\n if (!isLastPage) {\n onPageChange(totalPages);\n }\n }\n\n function handlePageJump() {\n const page = parseInt(pageJumpInput, 10);\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n onPageChange(page);\n setPageJumpInput(\"\");\n }\n }\n\n function handlePageJumpKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if (e.key === \"Enter\") {\n handlePageJump();\n }\n }\n\n function handleItemsPerPageChange(value: string) {\n const count = parseInt(value, 10);\n if (!isNaN(count)) {\n onItemsPerPageChange(count);\n }\n }\n\n return (\n <div className={cn(\"flex items-center justify-between\", className)}>\n {/* Left group: pagination buttons + page indicator */}\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"pagination\"\n size=\"pagination\"\n aria-label=\"Go to first page\"\n disabled={isFirstPage}\n onClick={handleGoToFirst}\n >\n <ChevronsLeft className=\"size-5\" />\n </Button>\n\n <Button\n variant=\"pagination\"\n size=\"pagination\"\n aria-label=\"Previous page\"\n disabled={isFirstPage}\n onClick={handleGoToPrevious}\n >\n <ChevronLeft className=\"size-5\" />\n </Button>\n\n <Button\n variant=\"pagination\"\n size=\"pagination\"\n aria-label=\"Next page\"\n disabled={isLastPage}\n onClick={handleGoToNext}\n >\n <ChevronRight className=\"size-5\" />\n </Button>\n\n <Button\n variant=\"pagination\"\n size=\"pagination\"\n aria-label=\"Go to last page\"\n disabled={isLastPage}\n onClick={handleGoToLast}\n >\n <ChevronsRight className=\"size-5\" />\n </Button>\n\n {/* Page indicator */}\n <span\n className=\"flex items-center gap-1 px-2\"\n aria-live=\"polite\"\n >\n <span className=\"text-[20px] font-bold\">{currentPage}</span>\n <span className=\"text-[16px] font-normal text-muted-fg\">\n / {totalPages}\n </span>\n </span>\n </div>\n\n {/* Right group: page jump + items per page */}\n <div className=\"flex items-center gap-2\">\n <Input\n className=\"w-[100px] h-12\"\n placeholder={pageJumpPlaceholder}\n value={pageJumpInput}\n onChange={(e) => setPageJumpInput(e.target.value)}\n onKeyDown={handlePageJumpKeyDown}\n aria-label={pageJumpPlaceholder}\n />\n\n <Button\n variant=\"secondary\"\n size=\"secondary\"\n onClick={handlePageJump}\n >\n {pageJumpButton}\n </Button>\n\n <Select\n value={String(itemsPerPage)}\n onValueChange={handleItemsPerPageChange}\n >\n <SelectTrigger className=\"w-[96px] h-12\" aria-label={itemsPerPageLabel}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"10\">10{itemSuffix}</SelectItem>\n <SelectItem value=\"20\">20{itemSuffix}</SelectItem>\n <SelectItem value=\"50\">50{itemSuffix}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { Tabs, TabsList, TabsTrigger } from \"../../ui/tabs\";\nimport { cn } from \"../../../lib/utils\";\n\nexport interface TabItem {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface TabNavigationProps {\n tabs: TabItem[];\n defaultValue?: string;\n value?: string;\n onTabChange?: (value: string) => void;\n className?: string;\n}\n\nexport function TabNavigation({\n tabs,\n defaultValue,\n value,\n onTabChange,\n className,\n}: TabNavigationProps) {\n return (\n <Tabs\n defaultValue={defaultValue}\n value={value}\n onValueChange={onTabChange}\n className={cn(className)}\n >\n <TabsList>\n {tabs.map((tab) => (\n <TabsTrigger key={tab.value} value={tab.value} disabled={tab.disabled}>\n {tab.label}\n </TabsTrigger>\n ))}\n </TabsList>\n </Tabs>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n ChevronsLeft,\n ChevronLeft,\n ChevronRight,\n ChevronsRight,\n} from \"lucide-react\";\nimport type { Table } from \"@tanstack/react-table\";\n\nimport { Button } from \"../../ui/button\";\nimport { Input } from \"../../ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"../../ui/select\";\n\nexport interface DataTablePaginationLabels {\n pageJumpPlaceholder?: string;\n pageJumpButton?: string;\n itemsPerPageLabel?: string;\n itemSuffix?: string;\n}\n\ninterface DataTablePaginationProps<TData> {\n table: Table<TData>;\n pageSizeOptions?: number[];\n labels?: DataTablePaginationLabels;\n}\n\nexport function DataTablePagination<TData>({\n table,\n pageSizeOptions = [10, 20, 50],\n labels,\n}: DataTablePaginationProps<TData>) {\n const [pageJumpInput, setPageJumpInput] = React.useState(\"\");\n\n const pageJumpPlaceholder = labels?.pageJumpPlaceholder ?? \"Page\";\n const pageJumpButton = labels?.pageJumpButton ?? \"Go\";\n const itemsPerPageLabel = labels?.itemsPerPageLabel ?? \"Items per page\";\n const itemSuffix = labels?.itemSuffix ?? \"\";\n\n const currentPage = table.getState().pagination.pageIndex + 1;\n const totalPages = table.getPageCount();\n\n function handlePageJump() {\n const page = parseInt(pageJumpInput, 10);\n if (!isNaN(page) && page >= 1 && page <= totalPages) {\n table.setPageIndex(page - 1);\n setPageJumpInput(\"\");\n }\n }\n\n function handlePageJumpKeyDown(e: React.KeyboardEvent<HTMLInputElement>) {\n if (e.key === \"Enter\") {\n handlePageJump();\n }\n }\n\n return (\n <div className=\"flex items-center justify-between\">\n {/* Left group: pagination buttons + page indicator */}\n <div className=\"flex items-center gap-2\">\n <Button\n variant=\"pagination\"\n size=\"pagination\"\n aria-label=\"Go to first page\"\n disabled={!table.getCanPreviousPage()}\n onClick={() => table.setPageIndex(0)}\n >\n <ChevronsLeft className=\"size-5\" />\n </Button>\n\n <Button\n variant=\"pagination\"\n size=\"pagination\"\n aria-label=\"Previous page\"\n disabled={!table.getCanPreviousPage()}\n onClick={() => table.previousPage()}\n >\n <ChevronLeft className=\"size-5\" />\n </Button>\n\n <Button\n variant=\"pagination\"\n size=\"pagination\"\n aria-label=\"Next page\"\n disabled={!table.getCanNextPage()}\n onClick={() => table.nextPage()}\n >\n <ChevronRight className=\"size-5\" />\n </Button>\n\n <Button\n variant=\"pagination\"\n size=\"pagination\"\n aria-label=\"Go to last page\"\n disabled={!table.getCanNextPage()}\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n >\n <ChevronsRight className=\"size-5\" />\n </Button>\n\n {/* Page indicator */}\n <span className=\"flex items-center gap-1 px-2\" aria-live=\"polite\">\n <span className=\"text-[20px] font-bold\">{currentPage}</span>\n <span className=\"text-[16px] font-normal text-muted-fg\">\n / {totalPages}\n </span>\n </span>\n </div>\n\n {/* Right group: page jump + items per page */}\n <div className=\"flex items-center gap-2\">\n <Input\n className=\"w-[100px] h-12\"\n placeholder={pageJumpPlaceholder}\n value={pageJumpInput}\n onChange={(e) => setPageJumpInput(e.target.value)}\n onKeyDown={handlePageJumpKeyDown}\n aria-label={pageJumpPlaceholder}\n />\n\n <Button variant=\"secondary\" size=\"secondary\" onClick={handlePageJump}>\n {pageJumpButton}\n </Button>\n\n <Select\n value={String(table.getState().pagination.pageSize)}\n onValueChange={(value) => table.setPageSize(Number(value))}\n >\n <SelectTrigger className=\"w-[96px] h-12\" aria-label={itemsPerPageLabel}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((size) => (\n <SelectItem key={size} value={String(size)}>\n {size}{itemSuffix}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n type ColumnDef,\n type ColumnFiltersState,\n type OnChangeFn,\n type PaginationState,\n type RowSelectionState,\n type SortingState,\n type VisibilityState,\n} from \"@tanstack/react-table\";\nimport * as React from \"react\";\n\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"../../ui/table\";\nimport { cn } from \"../../../lib/utils\";\nimport { DataTablePagination } from \"./data-table-pagination\";\n\ninterface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[];\n data: TData[];\n enableSorting?: boolean;\n enableFiltering?: boolean;\n enableRowSelection?: boolean;\n enablePagination?: boolean;\n manualPagination?: boolean;\n rowCount?: number;\n pageSizeOptions?: number[];\n onRowClick?: (row: TData) => void;\n emptyMessage?: string;\n sorting?: SortingState;\n onSortingChange?: OnChangeFn<SortingState>;\n columnFilters?: ColumnFiltersState;\n onColumnFiltersChange?: OnChangeFn<ColumnFiltersState>;\n pagination?: PaginationState;\n onPaginationChange?: OnChangeFn<PaginationState>;\n rowSelection?: RowSelectionState;\n onRowSelectionChange?: OnChangeFn<RowSelectionState>;\n columnVisibility?: VisibilityState;\n onColumnVisibilityChange?: OnChangeFn<VisibilityState>;\n}\n\nexport function DataTable<TData, TValue>({\n columns,\n data,\n enableSorting = false,\n enableFiltering = false,\n enableRowSelection = false,\n enablePagination = false,\n manualPagination = false,\n rowCount,\n pageSizeOptions,\n onRowClick,\n emptyMessage = \"No data available.\",\n sorting: sortingProp,\n onSortingChange,\n columnFilters: columnFiltersProp,\n onColumnFiltersChange,\n pagination: paginationProp,\n onPaginationChange,\n rowSelection: rowSelectionProp,\n onRowSelectionChange,\n columnVisibility: columnVisibilityProp,\n onColumnVisibilityChange,\n}: DataTableProps<TData, TValue>) {\n const [internalSorting, setInternalSorting] = React.useState<SortingState>(\n []\n );\n const [internalColumnFilters, setInternalColumnFilters] =\n React.useState<ColumnFiltersState>([]);\n const [internalRowSelection, setInternalRowSelection] =\n React.useState<RowSelectionState>({});\n const [internalColumnVisibility, setInternalColumnVisibility] =\n React.useState<VisibilityState>({});\n const [internalPagination, setInternalPagination] =\n React.useState<PaginationState>({ pageIndex: 0, pageSize: 10 });\n\n const table = useReactTable({\n data,\n columns,\n rowCount: manualPagination ? rowCount : undefined,\n state: {\n sorting: sortingProp ?? internalSorting,\n columnFilters: columnFiltersProp ?? internalColumnFilters,\n rowSelection: rowSelectionProp ?? internalRowSelection,\n columnVisibility: columnVisibilityProp ?? internalColumnVisibility,\n pagination: paginationProp ?? internalPagination,\n },\n onSortingChange: onSortingChange ?? setInternalSorting,\n onColumnFiltersChange: onColumnFiltersChange ?? setInternalColumnFilters,\n onRowSelectionChange: onRowSelectionChange ?? setInternalRowSelection,\n onColumnVisibilityChange:\n onColumnVisibilityChange ?? setInternalColumnVisibility,\n onPaginationChange: onPaginationChange ?? setInternalPagination,\n getCoreRowModel: getCoreRowModel(),\n ...(enableSorting && { getSortedRowModel: getSortedRowModel() }),\n ...(enableFiltering && { getFilteredRowModel: getFilteredRowModel() }),\n ...(enablePagination &&\n !manualPagination && {\n getPaginationRowModel: getPaginationRowModel(),\n }),\n enableRowSelection,\n manualPagination,\n });\n\n return (\n <div className=\"space-y-4\">\n <Table>\n <TableHeader>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow\n key={headerGroup.id}\n className=\"hover:bg-table-header cursor-default\"\n >\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className={cn(\n header.column.columnDef.meta?.headerClassName ??\n header.column.columnDef.meta?.className\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 onClick={onRowClick ? () => onRowClick(row.original) : undefined}\n onKeyDown={\n onRowClick\n ? (e) => {\n if (e.key === \"Enter\") onRowClick(row.original);\n }\n : undefined\n }\n tabIndex={onRowClick ? 0 : undefined}\n role={onRowClick ? \"link\" : undefined}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n className={cn(cell.column.columnDef.meta?.className)}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : (\n <TableRow>\n <TableCell colSpan={columns.length} className=\"h-24 text-center\">\n {emptyMessage}\n </TableCell>\n </TableRow>\n )}\n </TableBody>\n </Table>\n\n {enablePagination && (\n <DataTablePagination table={table} pageSizeOptions={pageSizeOptions} />\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { ArrowUpDown } from \"lucide-react\";\nimport type { Column } from \"@tanstack/react-table\";\nimport { cn } from \"../../../lib/utils\";\n\ninterface DataTableColumnHeaderProps<TData, TValue> {\n column: Column<TData, TValue>;\n title: string;\n className?: string;\n}\n\nexport function DataTableColumnHeader<TData, TValue>({\n column,\n title,\n className,\n}: DataTableColumnHeaderProps<TData, TValue>) {\n if (!column.getCanSort()) {\n return <div className={cn(className)}>{title}</div>;\n }\n\n return (\n <button\n type=\"button\"\n className={cn(\"flex items-center gap-1\", className)}\n onClick={() => column.toggleSorting(column.getIsSorted() === \"asc\")}\n >\n {title}\n <ArrowUpDown className=\"size-4 text-table-cell\" />\n </button>\n );\n}\n","\"use client\";\n\nimport type { Table } from \"@tanstack/react-table\";\nimport { Input } from \"../../ui/input\";\nimport { cn } from \"../../../lib/utils\";\n\ninterface DataTableToolbarProps<TData> {\n table: Table<TData>;\n searchPlaceholder?: string;\n searchColumnId?: string;\n className?: string;\n children?: React.ReactNode;\n}\n\nexport function DataTableToolbar<TData>({\n table,\n searchPlaceholder = \"Search...\",\n searchColumnId,\n className,\n children,\n}: DataTableToolbarProps<TData>) {\n const filterValue = searchColumnId\n ? (table.getColumn(searchColumnId)?.getFilterValue() as string) ?? \"\"\n : \"\";\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n {searchColumnId && (\n <Input\n className=\"h-12 rounded-md flex-1\"\n placeholder={searchPlaceholder}\n value={filterValue}\n onChange={(e) =>\n table.getColumn(searchColumnId)?.setFilterValue(e.target.value)\n }\n aria-label={searchPlaceholder}\n />\n )}\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport { MoreHorizontal } from \"lucide-react\";\nimport { Button } from \"../../ui/button\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"../../ui/dropdown-menu\";\nimport { cn } from \"../../../lib/utils\";\n\nexport interface DataTableRowAction {\n label: string;\n onClick: () => void;\n variant?: \"default\" | \"destructive\";\n}\n\ninterface DataTableRowActionsProps {\n actions: DataTableRowAction[];\n}\n\nexport function DataTableRowActions({ actions }: DataTableRowActionsProps) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"size-8 p-0\">\n <MoreHorizontal className=\"size-4\" />\n <span className=\"sr-only\">Open menu</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {actions.map((action) => (\n <DropdownMenuItem\n key={action.label}\n onClick={action.onClick}\n className={cn(\n action.variant === \"destructive\" && \"text-destructive\"\n )}\n >\n {action.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-M67D4PYJ.cjs"}
|