From aa86729f9a2ab95346a2851e3837de1c367aae17 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Fri, 20 Jun 2025 11:37:31 +0000 Subject: (대표님) 20250620 작업사항 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table/evaluation-targets-columns.tsx | 459 +++++++++++++++------ 1 file changed, 322 insertions(+), 137 deletions(-) (limited to 'lib/evaluation-target-list/table/evaluation-targets-columns.tsx') diff --git a/lib/evaluation-target-list/table/evaluation-targets-columns.tsx b/lib/evaluation-target-list/table/evaluation-targets-columns.tsx index b1e19434..93807ef9 100644 --- a/lib/evaluation-target-list/table/evaluation-targets-columns.tsx +++ b/lib/evaluation-target-list/table/evaluation-targets-columns.tsx @@ -7,6 +7,11 @@ import { Button } from "@/components/ui/button"; import { Pencil, Eye, MessageSquare, Check, X } from "lucide-react"; import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-column-simple-header"; import { EvaluationTargetWithDepartments } from "@/db/schema"; +import { EditEvaluationTargetSheet } from "./update-evaluation-target"; + +interface GetColumnsProps { + setRowAction: React.Dispatch | null>>; +} // 상태별 색상 매핑 const getStatusBadgeVariant = (status: string) => { @@ -36,8 +41,8 @@ const getConsensusBadge = (consensusStatus: boolean | null) => { // 구분 배지 const getDivisionBadge = (division: string) => { return ( - - {division === "OCEAN" ? "해양" : "조선"} + + {division === "PLANT" ? "해양" : "조선"} ); }; @@ -46,7 +51,7 @@ const getDivisionBadge = (division: string) => { const getMaterialTypeBadge = (materialType: string) => { const typeMap = { EQUIPMENT: "기자재", - BULK: "벌크", + BULK: "벌크", EQUIPMENT_BULK: "기자재/벌크" }; return {typeMap[materialType] || materialType}; @@ -61,8 +66,23 @@ const getDomesticForeignBadge = (domesticForeign: string) => { ); }; -export function getEvaluationTargetsColumns(): ColumnDef[] { +// 평가 상태 배지 +const getApprovalBadge = (isApproved: boolean | null) => { + if (isApproved === null) { + return 대기중; + } + if (isApproved === true) { + return 승인; + } + return 거부; +}; + +export function getEvaluationTargetsColumns({setRowAction}:GetColumnsProps): ColumnDef[] { return [ + // ═══════════════════════════════════════════════════════════════ + // 기본 정보 + // ═══════════════════════════════════════════════════════════════ + // Checkbox { id: "select", @@ -102,46 +122,6 @@ export function getEvaluationTargetsColumns(): ColumnDef getDivisionBadge(row.getValue("division")), size: 80, }, - - // ░░░ 벤더 코드 ░░░ - { - accessorKey: "vendorCode", - header: ({ column }) => , - cell: ({ row }) => ( - {row.getValue("vendorCode")} - ), - size: 120, - }, - - // ░░░ 벤더명 ░░░ - { - accessorKey: "vendorName", - header: ({ column }) => , - cell: ({ row }) => ( -
("vendorName")!}> - {row.getValue("vendorName") as string} -
- ), - size: 200, - }, - - // ░░░ 내외자 ░░░ - { - accessorKey: "domesticForeign", - header: ({ column }) => , - cell: ({ row }) => getDomesticForeignBadge(row.getValue("domesticForeign")), - size: 80, - }, - - // ░░░ 자재구분 ░░░ - { - accessorKey: "materialType", - header: ({ column }) => , - cell: ({ row }) => getMaterialTypeBadge(row.getValue("materialType")), - size: 120, - }, - - // ░░░ 상태 ░░░ { accessorKey: "status", header: ({ column }) => , @@ -161,6 +141,54 @@ export function getEvaluationTargetsColumns(): ColumnDef , + cell: ({ row }) => ( + {row.getValue("vendorCode")} + ), + size: 120, + }, + + // ░░░ 벤더명 ░░░ + { + accessorKey: "vendorName", + header: ({ column }) => , + cell: ({ row }) => ( +
("vendorName")!}> + {row.getValue("vendorName") as string} +
+ ), + size: 200, + }, + + // ░░░ 내외자 ░░░ + { + accessorKey: "domesticForeign", + header: ({ column }) => , + cell: ({ row }) => getDomesticForeignBadge(row.getValue("domesticForeign")), + size: 80, + }, + + ] + }, + + // ░░░ 자재구분 ░░░ + { + accessorKey: "materialType", + header: ({ column }) => , + cell: ({ row }) => getMaterialTypeBadge(row.getValue("materialType")), + size: 120, + }, + + // ░░░ 상태 ░░░ + + // ░░░ 의견 일치 여부 ░░░ { accessorKey: "consensusStatus", @@ -169,56 +197,235 @@ export function getEvaluationTargetsColumns(): ColumnDef { - const reviewers = row.original.reviewers || []; - const totalReviewers = reviewers.length; - const completedReviews = reviewers.filter(r => r.review?.isApproved !== null).length; - const approvedReviews = reviewers.filter(r => r.review?.isApproved === true).length; - - return ( -
-
- {approvedReviews} - /{completedReviews} - /{totalReviewers} -
- {totalReviewers > 0 && ( -
- {reviewers.slice(0, 3).map((reviewer, idx) => ( -
- ))} - {totalReviewers > 3 && ( - +{totalReviewers - 3} - )} + header: "발주 평가 담당자", + columns: [ + { + accessorKey: "orderDepartmentName", + header: ({ column }) => , + cell: ({ row }) => { + const departmentName = row.getValue("orderDepartmentName"); + return departmentName ? ( +
+ {departmentName}
- )} -
- ); - }, - size: 120, - enableSorting: false, + ) : ( + - + ); + }, + size: 120, + }, + { + accessorKey: "orderReviewerName", + header: ({ column }) => , + cell: ({ row }) => { + const reviewerName = row.getValue("orderReviewerName"); + return reviewerName ? ( +
+ {reviewerName} +
+ ) : ( + - + ); + }, + size: 100, + }, + { + accessorKey: "orderIsApproved", + header: ({ column }) => , + cell: ({ row }) => getApprovalBadge(row.getValue("orderIsApproved")), + size: 80, + }, + ], + }, + + // ═══════════════════════════════════════════════════════════════ + // 조달 부서 그룹 + // ═══════════════════════════════════════════════════════════════ + { + header: "조달 평가 담당자", + columns: [ + { + accessorKey: "procurementDepartmentName", + header: ({ column }) => , + cell: ({ row }) => { + const departmentName = row.getValue("procurementDepartmentName"); + return departmentName ? ( +
+ {departmentName} +
+ ) : ( + - + ); + }, + size: 120, + }, + { + accessorKey: "procurementReviewerName", + header: ({ column }) => , + cell: ({ row }) => { + const reviewerName = row.getValue("procurementReviewerName"); + return reviewerName ? ( +
+ {reviewerName} +
+ ) : ( + - + ); + }, + size: 100, + }, + { + accessorKey: "procurementIsApproved", + header: ({ column }) => , + cell: ({ row }) => getApprovalBadge(row.getValue("procurementIsApproved")), + size: 80, + }, + ], }, + // ═══════════════════════════════════════════════════════════════ + // 품질 부서 그룹 + // ═══════════════════════════════════════════════════════════════ + { + header: "품질 평가 담당자", + columns: [ + { + accessorKey: "qualityDepartmentName", + header: ({ column }) => , + cell: ({ row }) => { + const departmentName = row.getValue("qualityDepartmentName"); + return departmentName ? ( +
+ {departmentName} +
+ ) : ( + - + ); + }, + size: 120, + }, + { + accessorKey: "qualityReviewerName", + header: ({ column }) => , + cell: ({ row }) => { + const reviewerName = row.getValue("qualityReviewerName"); + return reviewerName ? ( +
+ {reviewerName} +
+ ) : ( + - + ); + }, + size: 100, + }, + { + accessorKey: "qualityIsApproved", + header: ({ column }) => , + cell: ({ row }) => getApprovalBadge(row.getValue("qualityIsApproved")), + size: 80, + }, + ], + }, + + // ═══════════════════════════════════════════════════════════════ + // 설계 부서 그룹 + // ═══════════════════════════════════════════════════════════════ + { + header: "설계 평가 담당자", + columns: [ + { + accessorKey: "designDepartmentName", + header: ({ column }) => , + cell: ({ row }) => { + const departmentName = row.getValue("designDepartmentName"); + return departmentName ? ( +
+ {departmentName} +
+ ) : ( + - + ); + }, + size: 120, + }, + { + accessorKey: "designReviewerName", + header: ({ column }) => , + cell: ({ row }) => { + const reviewerName = row.getValue("designReviewerName"); + return reviewerName ? ( +
+ {reviewerName} +
+ ) : ( + - + ); + }, + size: 100, + }, + { + accessorKey: "designIsApproved", + header: ({ column }) => , + cell: ({ row }) => getApprovalBadge(row.getValue("designIsApproved")), + size: 80, + }, + ], + }, + + // ═══════════════════════════════════════════════════════════════ + // CS 부서 그룹 + // ═══════════════════════════════════════════════════════════════ + { + header: "CS 평가 담당자", + columns: [ + { + accessorKey: "csDepartmentName", + header: ({ column }) => , + cell: ({ row }) => { + const departmentName = row.getValue("csDepartmentName"); + return departmentName ? ( +
+ {departmentName} +
+ ) : ( + - + ); + }, + size: 120, + }, + { + accessorKey: "csReviewerName", + header: ({ column }) => , + cell: ({ row }) => { + const reviewerName = row.getValue("csReviewerName"); + return reviewerName ? ( +
+ {reviewerName} +
+ ) : ( + - + ); + }, + size: 100, + }, + { + accessorKey: "csIsApproved", + header: ({ column }) => , + cell: ({ row }) => getApprovalBadge(row.getValue("csIsApproved")), + size: 80, + }, + ], + }, + + // ═══════════════════════════════════════════════════════════════ + // 관리 정보 + // ═══════════════════════════════════════════════════════════════ + // ░░░ 관리자 의견 ░░░ { accessorKey: "adminComment", @@ -274,69 +481,47 @@ export function getEvaluationTargetsColumns(): ColumnDef , + cell: ({ row }) => { + const createdAt = row.getValue("createdAt"); + return createdAt ? ( + + {new Intl.DateTimeFormat("ko-KR", { + year: "numeric", + month: "2-digit", + day: "2-digit", + }).format(new Date(createdAt))} + + ) : ( + - + ); + }, + size: 100, + }, + // ░░░ Actions ░░░ { id: "actions", enableHiding: false, - size: 120, - minSize: 120, + size: 40, + minSize: 40, cell: ({ row }) => { - const record = row.original; - const [openDetail, setOpenDetail] = React.useState(false); - const [openEdit, setOpenEdit] = React.useState(false); - const [openRequest, setOpenRequest] = React.useState(false); - - return ( + return (
- - - - - {/* TODO: 실제 다이얼로그 컴포넌트들로 교체 */} - {openDetail && ( -
setOpenDetail(false)}> - {/* */} -
- )} - {openEdit && ( -
setOpenEdit(false)}> - {/* */} -
- )} - {openRequest && ( -
setOpenRequest(false)}> - {/* */} -
- )}
); }, -- cgit v1.2.3