diff options
Diffstat (limited to 'lib/po/table/po-table-columns.tsx')
| -rw-r--r-- | lib/po/table/po-table-columns.tsx | 95 |
1 files changed, 79 insertions, 16 deletions
diff --git a/lib/po/table/po-table-columns.tsx b/lib/po/table/po-table-columns.tsx index c2c01136..a13b2acf 100644 --- a/lib/po/table/po-table-columns.tsx +++ b/lib/po/table/po-table-columns.tsx @@ -91,16 +91,77 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<Contrac // 3-1) groupMap: { [groupName]: ColumnDef<ContractDetail>[] } const groupMap: Record<string, ColumnDef<ContractDetail>[]> = {}; - poColumnsConfig.forEach((cfg) => { - // Use "_noGroup" if no group is specified - const groupName = cfg.group || "_noGroup"; + // (1) JSON config를 읽어서 ColumnDef를 생성하는 부분 (일부 발췌) +poColumnsConfig.forEach((cfg) => { + const groupName = cfg.group || "_noGroup" + if (!groupMap[groupName]) { + groupMap[groupName] = [] + } - if (!groupMap[groupName]) { - groupMap[groupName] = []; - } + let childCol: ColumnDef<ContractDetail> + + if (cfg.type === "custom" && cfg.customType === "esignStatus") { + // ======================================== + // (2) 전자서명 전용 커스텀 컬럼 + // ======================================== + childCol = { + id: cfg.id, + header: ({ column }) => ( + <DataTableColumnHeaderSimple column={column} title={cfg.label} /> + ), + // 여기서 row.original.envelopes 등 활용하여 최신 전자서명 상태 표시 + cell: ({ row }) => { + const data = row.original + if (!data.envelopes || data.envelopes.length === 0) { + return ( + <div className="text-sm text-gray-500"> + No E-Sign + </div> + ) + } + + // envelopes가 여러 개 있으면 최신(가장 최근 updatedAt) 가져오기 + const sorted = [...data.envelopes].sort((a, b) => { + const dateA = new Date(a.updatedAt) + const dateB = new Date(b.updatedAt) + return dateB.getTime() - dateA.getTime() + }) + const latest = sorted[0] - // Child column definition - const childCol: ColumnDef<ContractDetail> = { + // 상태에 따라 다른 UI 색상/아이콘 + const status = latest.envelopeStatus // "sent", "completed", ... + const colorMap: Record<string, string> = { + completed: "text-green-600", + sent: "text-blue-600", + voided: "text-red-600", + // ... + } + const colorClass = colorMap[status] || "text-gray-700" + + return ( + <Button + onClick={() => { + // 다이얼로그 열기 등 + // 예: setRowAction({ row, type: "esign-detail" }) + setRowAction({ row, type: "esign-detail" }) + }} + className={`underline underline-offset-2 ${colorClass}`} + > + {status} + </Button> + ) + }, + meta: { + excelHeader: cfg.excelHeader, + group: cfg.group, + type: cfg.type, + }, + } + } else { + // ======================================== + // (3) 일반 컬럼 (type: text/date/number 등) + // ======================================== + childCol = { accessorKey: cfg.id, enableResizing: true, header: ({ column }) => ( @@ -112,17 +173,19 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<Contrac type: cfg.type, }, cell: ({ row, cell }) => { - if (cfg.id === "createdAt" || cfg.id === "updatedAt") { - const dateVal = cell.getValue() as Date; - return formatDate(dateVal); + // 날짜 포맷, 숫자 포맷 등 처리 + if (cfg.type === "date") { + const dateVal = cell.getValue() as Date + return formatDate(dateVal) } - - return row.getValue(cfg.id) ?? ""; + // ... + return row.getValue(cfg.id) ?? "" }, - }; + } + } - groupMap[groupName].push(childCol); - }); + groupMap[groupName].push(childCol) +}) // ---------------------------------------------------------------- // 3-2) Create actual parent columns (groups) from the groupMap |
