@potenlab/ui 0.2.0 → 0.2.2
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/README.md +18 -1
- package/dist/{chunk-7XPQQR3Z.cjs → chunk-6QN6OSP3.cjs} +50 -50
- package/dist/{chunk-7XPQQR3Z.cjs.map → chunk-6QN6OSP3.cjs.map} +1 -1
- package/dist/{chunk-2W3RBVMM.js → chunk-7AJBGZPR.js} +24 -4
- package/dist/chunk-7AJBGZPR.js.map +1 -0
- package/dist/{chunk-IIMC6ODV.js → chunk-DEZVWPNH.js} +3 -3
- package/dist/{chunk-IIMC6ODV.js.map → chunk-DEZVWPNH.js.map} +1 -1
- package/dist/{chunk-O4BML5KD.cjs → chunk-ECTM5YZQ.cjs} +44 -4
- package/dist/chunk-ECTM5YZQ.cjs.map +1 -0
- package/dist/{chunk-CN4BR5A5.cjs → chunk-X2QE3MBA.cjs} +9 -9
- package/dist/{chunk-CN4BR5A5.cjs.map → chunk-X2QE3MBA.cjs.map} +1 -1
- package/dist/{chunk-VMWIQIIN.js → chunk-X3P3VCSD.js} +3 -3
- package/dist/{chunk-VMWIQIIN.js.map → chunk-X3P3VCSD.js.map} +1 -1
- package/dist/components/common/index.cjs +13 -13
- package/dist/components/common/index.js +2 -2
- package/dist/components/ui/index.cjs +125 -125
- package/dist/components/ui/index.d.cts +1 -1
- package/dist/components/ui/index.d.ts +1 -1
- package/dist/components/ui/index.js +2 -2
- package/dist/index.cjs +137 -137
- package/dist/index.js +3 -3
- package/package.json +1 -1
- package/dist/chunk-2W3RBVMM.js.map +0 -1
- package/dist/chunk-O4BML5KD.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -7,6 +7,21 @@ Potenlab's shared React UI component library built with Tailwind CSS 4, Radix UI
|
|
|
7
7
|
|
|
8
8
|
[Storybook](https://potenlab-library.vercel.app) | [npm](https://www.npmjs.com/package/@potenlab/ui)
|
|
9
9
|
|
|
10
|
+
## Quick Start
|
|
11
|
+
|
|
12
|
+
Scaffold a new project with a single command:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx @potenlab/ui init
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
This will prompt you to select a template (e.g. `admin`) and copy the starter files into your current directory. Then:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install
|
|
22
|
+
npm run dev
|
|
23
|
+
```
|
|
24
|
+
|
|
10
25
|
## Installation
|
|
11
26
|
|
|
12
27
|
```bash
|
|
@@ -344,6 +359,7 @@ bun run release:major
|
|
|
344
359
|
|
|
345
360
|
```
|
|
346
361
|
src/
|
|
362
|
+
cli/ # CLI source (potenlab-ui init)
|
|
347
363
|
components/
|
|
348
364
|
ui/ # Radix UI primitives with Tailwind styling
|
|
349
365
|
common/ # Higher-level reusable components
|
|
@@ -352,7 +368,8 @@ src/
|
|
|
352
368
|
lib/ # Utility functions (cn, formatNumber)
|
|
353
369
|
types/ # Shared TypeScript types
|
|
354
370
|
styles/ # Global CSS with design tokens
|
|
355
|
-
template/
|
|
371
|
+
template/
|
|
372
|
+
admin/ # Admin dashboard starter template
|
|
356
373
|
.storybook/ # Storybook configuration
|
|
357
374
|
```
|
|
358
375
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkECTM5YZQ_cjs = require('./chunk-ECTM5YZQ.cjs');
|
|
4
4
|
var chunkYSNZIYC2_cjs = require('./chunk-YSNZIYC2.cjs');
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
var React3 = require('react');
|
|
@@ -30,17 +30,17 @@ var React3__namespace = /*#__PURE__*/_interopNamespace(React3);
|
|
|
30
30
|
function FormField({ id, label, type, value, options, onChange }) {
|
|
31
31
|
if (type === "select") {
|
|
32
32
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
|
|
33
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
34
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
35
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
36
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
33
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.Label, { htmlFor: id, children: label }),
|
|
34
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkECTM5YZQ_cjs.Select, { value, onValueChange: onChange, children: [
|
|
35
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.SelectTrigger, { id, className: "h-[52px] pr-4", children: /* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.SelectValue, { placeholder: label }) }),
|
|
36
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.SelectContent, { children: options?.map((option) => /* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.SelectItem, { value: option, children: option }, option)) })
|
|
37
37
|
] })
|
|
38
38
|
] });
|
|
39
39
|
}
|
|
40
40
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col", children: [
|
|
41
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
41
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.Label, { htmlFor: id, children: label }),
|
|
42
42
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
43
|
-
|
|
43
|
+
chunkECTM5YZQ_cjs.Input,
|
|
44
44
|
{
|
|
45
45
|
id,
|
|
46
46
|
className: "h-[52px]",
|
|
@@ -60,7 +60,7 @@ function LabeledSwitch({ id, label, checked, onCheckedChange }) {
|
|
|
60
60
|
children: label
|
|
61
61
|
}
|
|
62
62
|
),
|
|
63
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
63
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.Switch, { id, checked, onCheckedChange })
|
|
64
64
|
] });
|
|
65
65
|
}
|
|
66
66
|
function PageHeader({
|
|
@@ -78,7 +78,7 @@ function PageHeader({
|
|
|
78
78
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
|
|
79
79
|
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "font-pretendard text-[32px] font-semibold text-black", children: title }),
|
|
80
80
|
badgeCount !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
81
|
-
|
|
81
|
+
chunkECTM5YZQ_cjs.Badge,
|
|
82
82
|
{
|
|
83
83
|
variant: "green",
|
|
84
84
|
"aria-label": `Total: ${chunkYSNZIYC2_cjs.formatNumber(badgeCount)}${badgeSuffix}`,
|
|
@@ -91,12 +91,12 @@ function PageHeader({
|
|
|
91
91
|
] }),
|
|
92
92
|
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-pretendard text-[18px] font-medium text-subtitle mt-1", children: subtitle })
|
|
93
93
|
] }),
|
|
94
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
94
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkECTM5YZQ_cjs.Button, { variant: "primary", onClick: onAction, children: [
|
|
95
95
|
ActionIcon && /* @__PURE__ */ jsxRuntime.jsx(ActionIcon, { className: "size-5" }),
|
|
96
96
|
actionLabel
|
|
97
97
|
] })
|
|
98
98
|
] }),
|
|
99
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
99
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.Separator, { className: "my-6" })
|
|
100
100
|
] });
|
|
101
101
|
}
|
|
102
102
|
function SearchBar({
|
|
@@ -107,7 +107,7 @@ function SearchBar({
|
|
|
107
107
|
className
|
|
108
108
|
}) {
|
|
109
109
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
110
|
-
|
|
110
|
+
chunkECTM5YZQ_cjs.Input,
|
|
111
111
|
{
|
|
112
112
|
className: chunkYSNZIYC2_cjs.cn("h-12 rounded-md", className),
|
|
113
113
|
placeholder,
|
|
@@ -174,7 +174,7 @@ function PaginationControls({
|
|
|
174
174
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkYSNZIYC2_cjs.cn("flex items-center justify-between", className), children: [
|
|
175
175
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
176
176
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
177
|
-
|
|
177
|
+
chunkECTM5YZQ_cjs.Button,
|
|
178
178
|
{
|
|
179
179
|
variant: "pagination",
|
|
180
180
|
size: "pagination",
|
|
@@ -185,7 +185,7 @@ function PaginationControls({
|
|
|
185
185
|
}
|
|
186
186
|
),
|
|
187
187
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
188
|
-
|
|
188
|
+
chunkECTM5YZQ_cjs.Button,
|
|
189
189
|
{
|
|
190
190
|
variant: "pagination",
|
|
191
191
|
size: "pagination",
|
|
@@ -196,7 +196,7 @@ function PaginationControls({
|
|
|
196
196
|
}
|
|
197
197
|
),
|
|
198
198
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
199
|
-
|
|
199
|
+
chunkECTM5YZQ_cjs.Button,
|
|
200
200
|
{
|
|
201
201
|
variant: "pagination",
|
|
202
202
|
size: "pagination",
|
|
@@ -207,7 +207,7 @@ function PaginationControls({
|
|
|
207
207
|
}
|
|
208
208
|
),
|
|
209
209
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
210
|
-
|
|
210
|
+
chunkECTM5YZQ_cjs.Button,
|
|
211
211
|
{
|
|
212
212
|
variant: "pagination",
|
|
213
213
|
size: "pagination",
|
|
@@ -234,7 +234,7 @@ function PaginationControls({
|
|
|
234
234
|
] }),
|
|
235
235
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
236
236
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
237
|
-
|
|
237
|
+
chunkECTM5YZQ_cjs.Input,
|
|
238
238
|
{
|
|
239
239
|
className: "w-[100px] h-12",
|
|
240
240
|
placeholder: pageJumpPlaceholder,
|
|
@@ -245,7 +245,7 @@ function PaginationControls({
|
|
|
245
245
|
}
|
|
246
246
|
),
|
|
247
247
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
248
|
-
|
|
248
|
+
chunkECTM5YZQ_cjs.Button,
|
|
249
249
|
{
|
|
250
250
|
variant: "secondary",
|
|
251
251
|
size: "secondary",
|
|
@@ -254,22 +254,22 @@ function PaginationControls({
|
|
|
254
254
|
}
|
|
255
255
|
),
|
|
256
256
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
257
|
-
|
|
257
|
+
chunkECTM5YZQ_cjs.Select,
|
|
258
258
|
{
|
|
259
259
|
value: String(itemsPerPage),
|
|
260
260
|
onValueChange: handleItemsPerPageChange,
|
|
261
261
|
children: [
|
|
262
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
263
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
264
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
262
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.SelectTrigger, { className: "w-[96px] h-12", "aria-label": itemsPerPageLabel, children: /* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.SelectValue, {}) }),
|
|
263
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkECTM5YZQ_cjs.SelectContent, { children: [
|
|
264
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkECTM5YZQ_cjs.SelectItem, { value: "10", children: [
|
|
265
265
|
"10",
|
|
266
266
|
itemSuffix
|
|
267
267
|
] }),
|
|
268
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
268
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkECTM5YZQ_cjs.SelectItem, { value: "20", children: [
|
|
269
269
|
"20",
|
|
270
270
|
itemSuffix
|
|
271
271
|
] }),
|
|
272
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
272
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkECTM5YZQ_cjs.SelectItem, { value: "50", children: [
|
|
273
273
|
"50",
|
|
274
274
|
itemSuffix
|
|
275
275
|
] })
|
|
@@ -288,13 +288,13 @@ function TabNavigation({
|
|
|
288
288
|
className
|
|
289
289
|
}) {
|
|
290
290
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
291
|
-
|
|
291
|
+
chunkECTM5YZQ_cjs.Tabs,
|
|
292
292
|
{
|
|
293
293
|
defaultValue,
|
|
294
294
|
value,
|
|
295
295
|
onValueChange: onTabChange,
|
|
296
296
|
className: chunkYSNZIYC2_cjs.cn(className),
|
|
297
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
297
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.TabsList, { children: tabs.map((tab) => /* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.TabsTrigger, { value: tab.value, disabled: tab.disabled, children: tab.label }, tab.value)) })
|
|
298
298
|
}
|
|
299
299
|
);
|
|
300
300
|
}
|
|
@@ -325,7 +325,7 @@ function DataTablePagination({
|
|
|
325
325
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
|
|
326
326
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
327
327
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
328
|
-
|
|
328
|
+
chunkECTM5YZQ_cjs.Button,
|
|
329
329
|
{
|
|
330
330
|
variant: "pagination",
|
|
331
331
|
size: "pagination",
|
|
@@ -336,7 +336,7 @@ function DataTablePagination({
|
|
|
336
336
|
}
|
|
337
337
|
),
|
|
338
338
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
339
|
-
|
|
339
|
+
chunkECTM5YZQ_cjs.Button,
|
|
340
340
|
{
|
|
341
341
|
variant: "pagination",
|
|
342
342
|
size: "pagination",
|
|
@@ -347,7 +347,7 @@ function DataTablePagination({
|
|
|
347
347
|
}
|
|
348
348
|
),
|
|
349
349
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
350
|
-
|
|
350
|
+
chunkECTM5YZQ_cjs.Button,
|
|
351
351
|
{
|
|
352
352
|
variant: "pagination",
|
|
353
353
|
size: "pagination",
|
|
@@ -358,7 +358,7 @@ function DataTablePagination({
|
|
|
358
358
|
}
|
|
359
359
|
),
|
|
360
360
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
361
|
-
|
|
361
|
+
chunkECTM5YZQ_cjs.Button,
|
|
362
362
|
{
|
|
363
363
|
variant: "pagination",
|
|
364
364
|
size: "pagination",
|
|
@@ -378,7 +378,7 @@ function DataTablePagination({
|
|
|
378
378
|
] }),
|
|
379
379
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
380
380
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
381
|
-
|
|
381
|
+
chunkECTM5YZQ_cjs.Input,
|
|
382
382
|
{
|
|
383
383
|
className: "w-[100px] h-12",
|
|
384
384
|
placeholder: pageJumpPlaceholder,
|
|
@@ -388,15 +388,15 @@ function DataTablePagination({
|
|
|
388
388
|
"aria-label": pageJumpPlaceholder
|
|
389
389
|
}
|
|
390
390
|
),
|
|
391
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
391
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.Button, { variant: "secondary", size: "secondary", onClick: handlePageJump, children: pageJumpButton }),
|
|
392
392
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
393
|
-
|
|
393
|
+
chunkECTM5YZQ_cjs.Select,
|
|
394
394
|
{
|
|
395
395
|
value: String(table.getState().pagination.pageSize),
|
|
396
396
|
onValueChange: (value) => table.setPageSize(Number(value)),
|
|
397
397
|
children: [
|
|
398
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
399
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
398
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.SelectTrigger, { className: "w-[96px] h-12", "aria-label": itemsPerPageLabel, children: /* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.SelectValue, {}) }),
|
|
399
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.SelectContent, { children: pageSizeOptions.map((size) => /* @__PURE__ */ jsxRuntime.jsxs(chunkECTM5YZQ_cjs.SelectItem, { value: String(size), children: [
|
|
400
400
|
size,
|
|
401
401
|
itemSuffix
|
|
402
402
|
] }, size)) })
|
|
@@ -462,13 +462,13 @@ function DataTable({
|
|
|
462
462
|
manualPagination
|
|
463
463
|
});
|
|
464
464
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
|
|
465
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
466
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
467
|
-
|
|
465
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkECTM5YZQ_cjs.Table, { children: [
|
|
466
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.TableHeader, { children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
467
|
+
chunkECTM5YZQ_cjs.TableRow,
|
|
468
468
|
{
|
|
469
469
|
className: "hover:bg-table-header cursor-default",
|
|
470
470
|
children: headerGroup.headers.map((header) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
471
|
-
|
|
471
|
+
chunkECTM5YZQ_cjs.TableHead,
|
|
472
472
|
{
|
|
473
473
|
className: chunkYSNZIYC2_cjs.cn(
|
|
474
474
|
header.column.columnDef.meta?.headerClassName ?? header.column.columnDef.meta?.className
|
|
@@ -483,8 +483,8 @@ function DataTable({
|
|
|
483
483
|
},
|
|
484
484
|
headerGroup.id
|
|
485
485
|
)) }),
|
|
486
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
487
|
-
|
|
486
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.TableBody, { children: table.getRowModel().rows?.length ? table.getRowModel().rows.map((row) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
487
|
+
chunkECTM5YZQ_cjs.TableRow,
|
|
488
488
|
{
|
|
489
489
|
"data-state": row.getIsSelected() && "selected",
|
|
490
490
|
onClick: onRowClick ? () => onRowClick(row.original) : void 0,
|
|
@@ -494,7 +494,7 @@ function DataTable({
|
|
|
494
494
|
tabIndex: onRowClick ? 0 : void 0,
|
|
495
495
|
role: onRowClick ? "link" : void 0,
|
|
496
496
|
children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
497
|
-
|
|
497
|
+
chunkECTM5YZQ_cjs.TableCell,
|
|
498
498
|
{
|
|
499
499
|
className: chunkYSNZIYC2_cjs.cn(cell.column.columnDef.meta?.className),
|
|
500
500
|
children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext())
|
|
@@ -503,7 +503,7 @@ function DataTable({
|
|
|
503
503
|
))
|
|
504
504
|
},
|
|
505
505
|
row.id
|
|
506
|
-
)) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
506
|
+
)) : /* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.TableRow, { children: /* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.TableCell, { colSpan: columns.length, className: "h-24 text-center", children: emptyMessage }) }) })
|
|
507
507
|
] }),
|
|
508
508
|
enablePagination && /* @__PURE__ */ jsxRuntime.jsx(DataTablePagination, { table, pageSizeOptions })
|
|
509
509
|
] });
|
|
@@ -539,7 +539,7 @@ function DataTableToolbar({
|
|
|
539
539
|
const filterValue = searchColumnId ? table.getColumn(searchColumnId)?.getFilterValue() ?? "" : "";
|
|
540
540
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunkYSNZIYC2_cjs.cn("flex items-center gap-2", className), children: [
|
|
541
541
|
searchColumnId && /* @__PURE__ */ jsxRuntime.jsx(
|
|
542
|
-
|
|
542
|
+
chunkECTM5YZQ_cjs.Input,
|
|
543
543
|
{
|
|
544
544
|
className: "h-12 rounded-md flex-1",
|
|
545
545
|
placeholder: searchPlaceholder,
|
|
@@ -552,13 +552,13 @@ function DataTableToolbar({
|
|
|
552
552
|
] });
|
|
553
553
|
}
|
|
554
554
|
function DataTableRowActions({ actions }) {
|
|
555
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
556
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
555
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkECTM5YZQ_cjs.DropdownMenu, { children: [
|
|
556
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(chunkECTM5YZQ_cjs.Button, { variant: "ghost", size: "icon", className: "size-8 p-0", children: [
|
|
557
557
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreHorizontal, { className: "size-4" }),
|
|
558
558
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Open menu" })
|
|
559
559
|
] }) }),
|
|
560
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
561
|
-
|
|
560
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkECTM5YZQ_cjs.DropdownMenuContent, { align: "end", children: actions.map((action) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
561
|
+
chunkECTM5YZQ_cjs.DropdownMenuItem,
|
|
562
562
|
{
|
|
563
563
|
onClick: action.onClick,
|
|
564
564
|
className: chunkYSNZIYC2_cjs.cn(
|
|
@@ -582,5 +582,5 @@ exports.PageHeader = PageHeader;
|
|
|
582
582
|
exports.PaginationControls = PaginationControls;
|
|
583
583
|
exports.SearchBar = SearchBar;
|
|
584
584
|
exports.TabNavigation = TabNavigation;
|
|
585
|
-
//# sourceMappingURL=chunk-
|
|
586
|
-
//# sourceMappingURL=chunk-
|
|
585
|
+
//# sourceMappingURL=chunk-6QN6OSP3.cjs.map
|
|
586
|
+
//# sourceMappingURL=chunk-6QN6OSP3.cjs.map
|
|
@@ -1 +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","Label","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","Switch","Badge","formatNumber","Button","Separator","cn","React","ChevronsLeft","ChevronLeft","ChevronRight","ChevronsRight","Tabs","TabsList","TabsTrigger","React2","React3","useReactTable","getCoreRowModel","getSortedRowModel","getFilteredRowModel","getPaginationRowModel","Table","TableHeader","TableRow","TableHead","flexRender","TableBody","TableCell","ArrowUpDown","DropdownMenu","DropdownMenuTrigger","MoreHorizontal","DropdownMenuContent","DropdownMenuItem"],"mappings":"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","file":"chunk-7XPQQR3Z.cjs","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"]}
|
|
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","Label","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Input","Switch","Badge","formatNumber","Button","Separator","cn","React","ChevronsLeft","ChevronLeft","ChevronRight","ChevronsRight","Tabs","TabsList","TabsTrigger","React2","React3","useReactTable","getCoreRowModel","getSortedRowModel","getFilteredRowModel","getPaginationRowModel","Table","TableHeader","TableRow","TableHead","flexRender","TableBody","TableCell","ArrowUpDown","DropdownMenu","DropdownMenuTrigger","MoreHorizontal","DropdownMenuContent","DropdownMenuItem"],"mappings":"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","file":"chunk-6QN6OSP3.cjs","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"]}
|