diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-06-19 09:44:28 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-06-19 09:44:28 +0000 |
| commit | 95bbe9c583ff841220da1267630e7b2025fc36dc (patch) | |
| tree | 5e3d5bb3302530bbaa7f7abbe8c9cf8193ccbd4c /lib/payment-terms/table/payment-terms-table-columns.tsx | |
| parent | 0eb030580b5cbe5f03d570c3c9d8c519bac3b783 (diff) | |
(대표님) 20250619 1844 KST 작업사항
Diffstat (limited to 'lib/payment-terms/table/payment-terms-table-columns.tsx')
| -rw-r--r-- | lib/payment-terms/table/payment-terms-table-columns.tsx | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/lib/payment-terms/table/payment-terms-table-columns.tsx b/lib/payment-terms/table/payment-terms-table-columns.tsx new file mode 100644 index 00000000..208723f7 --- /dev/null +++ b/lib/payment-terms/table/payment-terms-table-columns.tsx @@ -0,0 +1,102 @@ +import { type ColumnDef, type 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 { paymentTerms } from "@/db/schema/procurementRFQ"; +import { toast } from "sonner"; +import { deletePaymentTerm } from "../service"; + +type PaymentTerm = typeof paymentTerms.$inferSelect; + +interface GetColumnsProps { + setRowAction: (action: { type: string; row: Row<PaymentTerm> }) => void; + onSuccess: () => void; +} + +const handleDelete = async (code: string, onSuccess: () => void) => { + const result = await deletePaymentTerm(code); + if (result.success) { + toast.success("삭제 완료"); + onSuccess(); + } else { + toast.error(result.error || "삭제 실패"); + } +}; + +export function getColumns({ setRowAction, onSuccess }: GetColumnsProps): ColumnDef<PaymentTerm>[] { + 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 |
