diff options
Diffstat (limited to 'lib/vendor-document-list/ship/enhanced-documents-table.tsx')
| -rw-r--r-- | lib/vendor-document-list/ship/enhanced-documents-table.tsx | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/lib/vendor-document-list/ship/enhanced-documents-table.tsx b/lib/vendor-document-list/ship/enhanced-documents-table.tsx new file mode 100644 index 00000000..47bce275 --- /dev/null +++ b/lib/vendor-document-list/ship/enhanced-documents-table.tsx @@ -0,0 +1,238 @@ +// simplified-documents-table.tsx +"use client" + +import React from "react" +import type { + DataTableAdvancedFilterField, + DataTableFilterField, + DataTableRowAction, +} from "@/types/table" + +import { useDataTable } from "@/hooks/use-data-table" +import { getEnhancedDocumentsShip } from "../enhanced-document-service" +import { DataTableAdvancedToolbar } from "@/components/data-table/data-table-advanced-toolbar" +import { toast } from "sonner" + +import { Label } from "@/components/ui/label" +import { DataTable } from "@/components/data-table/data-table" +import { SimplifiedDocumentsView } from "@/db/schema" +import { getSimplifiedDocumentColumns } from "./enhanced-doc-table-columns" + +interface SimplifiedDocumentsTableProps { + promises: Promise<{ + data: SimplifiedDocumentsView[], + pageCount: number, + total: number + }> +} + +export function SimplifiedDocumentsTable({ + promises, +}: SimplifiedDocumentsTableProps) { + // React.use()로 Promise 결과를 받고, 그 다음에 destructuring + const result = React.use(promises) + const { data, pageCount, total } = result + + // 기존 상태들 + const [rowAction, setRowAction] = React.useState<DataTableRowAction<SimplifiedDocumentsView> | null>(null) // ✅ 타입 변경 + const [expandedRows,] = React.useState<Set<string>>(new Set()) + + const columns = React.useMemo( + () => getSimplifiedDocumentColumns({ setRowAction }), + [setRowAction] + ) + + // ✅ SimplifiedDocumentsView에 맞게 필터 필드 업데이트 + const advancedFilterFields: DataTableAdvancedFilterField<SimplifiedDocumentsView>[] = [ + { + id: "docNumber", + label: "문서번호", + type: "text", + }, + { + id: "vendorDocNumber", + label: "벤더 문서번호", + type: "text", + }, + { + id: "title", + label: "문서제목", + type: "text", + }, + { + id: "drawingKind", + label: "문서종류", + type: "select", + options: [ + { label: "B3", value: "B3" }, + { label: "B4", value: "B4" }, + { label: "B5", value: "B5" }, + ], + }, + { + id: "projectCode", + label: "프로젝트 코드", + type: "text", + }, + { + id: "vendorName", + label: "벤더명", + type: "text", + }, + { + id: "vendorCode", + label: "벤더 코드", + type: "text", + }, + { + id: "pic", + label: "담당자", + type: "text", + }, + { + id: "status", + label: "문서 상태", + type: "select", + options: [ + { label: "활성", value: "ACTIVE" }, + { label: "비활성", value: "INACTIVE" }, + { label: "보류", value: "PENDING" }, + { label: "완료", value: "COMPLETED" }, + ], + }, + { + id: "firstStageName", + label: "1차 스테이지", + type: "text", + }, + { + id: "secondStageName", + label: "2차 스테이지", + type: "text", + }, + { + id: "firstStagePlanDate", + label: "1차 계획일", + type: "date", + }, + { + id: "firstStageActualDate", + label: "1차 실제일", + type: "date", + }, + { + id: "secondStagePlanDate", + label: "2차 계획일", + type: "date", + }, + { + id: "secondStageActualDate", + label: "2차 실제일", + type: "date", + }, + { + id: "issuedDate", + label: "발행일", + type: "date", + }, + { + id: "createdAt", + label: "생성일", + type: "date", + }, + { + id: "updatedAt", + label: "수정일", + type: "date", + }, + ] + + // ✅ B4 전용 필드들 (조건부로 추가) + const b4FilterFields: DataTableAdvancedFilterField<SimplifiedDocumentsView>[] = [ + { + id: "cGbn", + label: "C 구분", + type: "text", + }, + { + id: "dGbn", + label: "D 구분", + type: "text", + }, + { + id: "degreeGbn", + label: "Degree 구분", + type: "text", + }, + { + id: "deptGbn", + label: "Dept 구분", + type: "text", + }, + { + id: "jGbn", + label: "J 구분", + type: "text", + }, + { + id: "sGbn", + label: "S 구분", + type: "text", + }, + ] + + // B4 문서가 있는지 확인하여 B4 전용 필드 추가 + const hasB4Documents = data.some(doc => doc.drawingKind === 'B4') + const finalFilterFields = hasB4Documents + ? [...advancedFilterFields, ...b4FilterFields] + : advancedFilterFields + + const { table } = useDataTable({ + data: data, + columns, + pageCount, + enablePinning: true, + enableAdvancedFilter: true, + initialState: { + sorting: [{ id: "createdAt", desc: true }], + columnPinning: { right: ["actions"] }, + }, + getRowId: (originalRow) => String(originalRow.documentId), + shallow: false, + clearOnDefault: true, + columnResizeMode: "onEnd", + }) + + // ✅ 행 액션 처리 (필요에 따라 구현) + React.useEffect(() => { + if (rowAction?.type === "view") { + toast.info(`문서 조회: ${rowAction.row.docNumber}`) + setRowAction(null) + } else if (rowAction?.type === "edit") { + toast.info(`문서 편집: ${rowAction.row.docNumber}`) + setRowAction(null) + } else if (rowAction?.type === "delete") { + toast.error(`문서 삭제: ${rowAction.row.docNumber}`) + setRowAction(null) + } + }, [rowAction]) + + return ( + <div className="w-full" style={{maxWidth:'100%'}}> + <DataTable table={table}> + <DataTableAdvancedToolbar + table={table} + filterFields={finalFilterFields} + shallow={false} + > + {/* ✅ 추가 툴바 컨텐츠 (필요시) */} + <div className="flex items-center gap-2"> + <Label className="text-sm font-medium"> + 총 {total}개 문서 + </Label> + </div> + </DataTableAdvancedToolbar> + </DataTable> + </div> + ) +} |
