diff options
Diffstat (limited to 'lib/basic-contract/status')
| -rw-r--r-- | lib/basic-contract/status/basic-contract-columns.tsx | 153 |
1 files changed, 68 insertions, 85 deletions
diff --git a/lib/basic-contract/status/basic-contract-columns.tsx b/lib/basic-contract/status/basic-contract-columns.tsx index 6ca4a096..54504be4 100644 --- a/lib/basic-contract/status/basic-contract-columns.tsx +++ b/lib/basic-contract/status/basic-contract-columns.tsx @@ -3,29 +3,16 @@ import * as React from "react" import { type DataTableRowAction } from "@/types/table" import { type ColumnDef } from "@tanstack/react-table" -import { Paperclip } from "lucide-react" -import { toast } from "sonner" -import { getErrorMessage } from "@/lib/handle-error" -import { formatDate, formatDateTime } from "@/lib/utils" +import { formatDateTime } from "@/lib/utils" import { Badge } from "@/components/ui/badge" -import { Button } from "@/components/ui/button" import { Checkbox } from "@/components/ui/checkbox" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuRadioGroup, - DropdownMenuRadioItem, - DropdownMenuSeparator, - DropdownMenuShortcut, - DropdownMenuSub, - DropdownMenuSubContent, - DropdownMenuSubTrigger, - DropdownMenuTrigger, -} from "@/components/ui/dropdown-menu" - import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header" +import { + FileActionsDropdown, + FileNameLink +} from "@/components/ui/file-actions" + import { basicContractColumnsConfig } from "@/config/basicContractColumnsConfig" import { BasicContractView } from "@/db/schema" @@ -34,38 +21,7 @@ interface GetColumnsProps { } /** - * 파일 다운로드 함수 - */ -/** - * 파일 다운로드 함수 - */ -const handleFileDownload = (filePath: string | null, fileName: string | null) => { - if (!filePath || !fileName) { - toast.error("파일 정보가 없습니다."); - return; - } - - try { - // 전체 URL 생성 - const fullUrl = `${window.location.origin}${filePath}`; - - // a 태그를 생성하여 다운로드 실행 - const link = document.createElement('a'); - link.href = fullUrl; - link.download = fileName; // 다운로드될 파일명 설정 - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - - toast.success("파일 다운로드를 시작합니다."); - } catch (error) { - console.error("파일 다운로드 오류:", error); - toast.error("파일 다운로드 중 오류가 발생했습니다."); - } -}; - -/** - * tanstack table 컬럼 정의 (중첩 헤더 버전) + * 공용 파일 다운로드 유틸리티를 사용하는 간소화된 컬럼 정의 */ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<BasicContractView>[] { // ---------------------------------------------------------------- @@ -98,7 +54,7 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<BasicCo } // ---------------------------------------------------------------- - // 2) 파일 다운로드 컬럼 (아이콘) + // 2) 파일 다운로드 컬럼 (공용 컴포넌트 사용) // ---------------------------------------------------------------- const downloadColumn: ColumnDef<BasicContractView> = { id: "download", @@ -106,39 +62,35 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<BasicCo cell: ({ row }) => { const template = row.original; + if (!template.filePath || !template.fileName) { + return null; + } + return ( - <Button + <FileActionsDropdown + filePath={template.filePath} + fileName={template.fileName} variant="ghost" size="icon" - onClick={() => handleFileDownload(template.filePath, template.fileName)} - title={`${template.fileName} 다운로드`} - className="hover:bg-muted" - > - <Paperclip className="h-4 w-4" /> - <span className="sr-only">다운로드</span> - </Button> + /> ); }, maxSize: 30, enableSorting: false, } - // ---------------------------------------------------------------- - // 4) 일반 컬럼들을 "그룹"별로 묶어 중첩 columns 생성 + // 3) 일반 컬럼들을 "그룹"별로 묶어 중첩 columns 생성 // ---------------------------------------------------------------- - // 4-1) groupMap: { [groupName]: ColumnDef<BasicContractView>[] } const groupMap: Record<string, ColumnDef<BasicContractView>[]> = {} basicContractColumnsConfig.forEach((cfg) => { - // 만약 group가 없으면 "_noGroup" 처리 const groupName = cfg.group || "_noGroup" if (!groupMap[groupName]) { groupMap[groupName] = [] } - // child column 정의 const childCol: ColumnDef<BasicContractView> = { accessorKey: cfg.id, enableResizing: true, @@ -157,57 +109,88 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<BasicCo return formatDateTime(dateVal) } - // Status 컬럼에 Badge 적용 + // Status 컬럼에 Badge 적용 (확장) if (cfg.id === "status") { const status = row.getValue(cfg.id) as string - const isActive = status === "ACTIVE" - return ( - <Badge - variant={isActive ? "default" : "secondary"} - > - {isActive ? "활성" : "비활성"} - </Badge> - ) + let variant: "default" | "secondary" | "destructive" | "outline" = "secondary"; + let label = status; + + switch (status) { + case "ACTIVE": + variant = "default"; + label = "활성"; + break; + case "INACTIVE": + variant = "secondary"; + label = "비활성"; + break; + case "PENDING": + variant = "outline"; + label = "대기중"; + break; + case "COMPLETED": + variant = "default"; + label = "완료"; + break; + default: + variant = "secondary"; + label = status; + } + + return <Badge variant={variant}>{label}</Badge> + } + + // ✅ 파일 이름 컬럼 (공용 컴포넌트 사용) + if (cfg.id === "fileName") { + const fileName = cell.getValue() as string; + const filePath = row.original.filePath; + + if (fileName && filePath) { + return ( + <FileNameLink + filePath={filePath} + fileName={fileName} + maxLength={200} + showIcon={true} + /> + ); + } + return fileName || ""; } // 나머지 컬럼은 그대로 값 표시 return row.getValue(cfg.id) ?? "" }, - minSize: 80, - + minSize: 80, } groupMap[groupName].push(childCol) }) // ---------------------------------------------------------------- - // 4-2) groupMap에서 실제 상위 컬럼(그룹)을 만들기 + // 4) groupMap에서 실제 상위 컬럼(그룹)을 만들기 // ---------------------------------------------------------------- const nestedColumns: ColumnDef<BasicContractView>[] = [] - // 순서를 고정하고 싶다면 group 순서를 미리 정의하거나 sort해야 함 - // 여기서는 그냥 Object.entries 순서 Object.entries(groupMap).forEach(([groupName, colDefs]) => { if (groupName === "_noGroup") { - // 그룹 없음 → 그냥 최상위 레벨 컬럼 nestedColumns.push(...colDefs) } else { - // 상위 컬럼 nestedColumns.push({ id: groupName, - header: groupName, // "Basic Info", "Metadata" 등 + header: groupName, columns: colDefs, }) } }) // ---------------------------------------------------------------- - // 5) 최종 컬럼 배열: select, download, nestedColumns, actions + // 5) 최종 컬럼 배열 // ---------------------------------------------------------------- return [ selectColumn, - downloadColumn, // 다운로드 컬럼 추가 + downloadColumn, // ✅ 공용 파일 액션 컴포넌트 사용 ...nestedColumns, ] -}
\ No newline at end of file +} |
