summaryrefslogtreecommitdiff
path: root/lib/incoterms/table/incoterms-table-columns.tsx
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-06-19 09:44:28 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-06-19 09:44:28 +0000
commit95bbe9c583ff841220da1267630e7b2025fc36dc (patch)
tree5e3d5bb3302530bbaa7f7abbe8c9cf8193ccbd4c /lib/incoterms/table/incoterms-table-columns.tsx
parent0eb030580b5cbe5f03d570c3c9d8c519bac3b783 (diff)
(대표님) 20250619 1844 KST 작업사항
Diffstat (limited to 'lib/incoterms/table/incoterms-table-columns.tsx')
-rw-r--r--lib/incoterms/table/incoterms-table-columns.tsx102
1 files changed, 102 insertions, 0 deletions
diff --git a/lib/incoterms/table/incoterms-table-columns.tsx b/lib/incoterms/table/incoterms-table-columns.tsx
new file mode 100644
index 00000000..56a44e8b
--- /dev/null
+++ b/lib/incoterms/table/incoterms-table-columns.tsx
@@ -0,0 +1,102 @@
+import type { ColumnDef, Row } from "@tanstack/react-table";
+import { Button } from "@/components/ui/button";
+import { Badge } from "@/components/ui/badge";
+import { Ellipsis } from "lucide-react";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuSeparator,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu";
+import { incoterms } from "@/db/schema/procurementRFQ";
+import { toast } from "sonner";
+import { deleteIncoterm } from "../service";
+
+type Incoterm = typeof incoterms.$inferSelect;
+
+interface GetColumnsProps {
+ setRowAction: (action: { type: string; row: Row<Incoterm> }) => void;
+ onSuccess: () => void;
+}
+
+const handleDelete = async (code: string, onSuccess: () => void) => {
+ const result = await deleteIncoterm(code);
+ if (result.success) {
+ toast.success("삭제 완료");
+ onSuccess();
+ } else {
+ toast.error(result.error || "삭제 실패");
+ }
+};
+
+export function getColumns({ setRowAction, onSuccess }: GetColumnsProps): ColumnDef<Incoterm>[] {
+ return [
+ {
+ id: "code",
+ header: () => <div>코드</div>,
+ cell: ({ row }) => <div>{row.original.code}</div>,
+ enableSorting: true,
+ enableHiding: false,
+ },
+ {
+ id: "description",
+ header: () => <div>설명</div>,
+ cell: ({ row }) => <div>{row.original.description}</div>,
+ enableSorting: true,
+ enableHiding: false,
+ },
+ {
+ id: "isActive",
+ header: () => <div>상태</div>,
+ cell: ({ row }) => (
+ <Badge variant={row.original.isActive ? "default" : "secondary"}>
+ {row.original.isActive ? "활성" : "비활성"}
+ </Badge>
+ ),
+ enableSorting: true,
+ enableHiding: false,
+ },
+ {
+ id: "createdAt",
+ header: () => <div>생성일</div>,
+ cell: ({ row }) => {
+ const value = row.original.createdAt;
+ const date = value ? new Date(value) : null;
+ return date ? date.toLocaleDateString() : "";
+ },
+ enableSorting: true,
+ enableHiding: false,
+ },
+ {
+ id: "actions",
+ cell: ({ row }) => (
+ <DropdownMenu>
+ <DropdownMenuTrigger asChild>
+ <Button
+ aria-label="Open menu"
+ variant="ghost"
+ className="flex size-8 p-0 data-[state=open]:bg-muted"
+ >
+ <Ellipsis className="size-4" aria-hidden="true" />
+ </Button>
+ </DropdownMenuTrigger>
+ <DropdownMenuContent align="end" className="w-40">
+ <DropdownMenuItem
+ onSelect={() => setRowAction({ type: "edit", row })}
+ >
+ 수정
+ </DropdownMenuItem>
+ <DropdownMenuSeparator />
+ <DropdownMenuItem
+ onSelect={() => handleDelete(row.original.code, onSuccess)}
+ className="text-destructive"
+ >
+ 삭제
+ </DropdownMenuItem>
+ </DropdownMenuContent>
+ </DropdownMenu>
+ ),
+ },
+ ];
+} \ No newline at end of file