diff options
Diffstat (limited to 'lib/dolce/table/detail-drawing-columns.tsx')
| -rw-r--r-- | lib/dolce/table/detail-drawing-columns.tsx | 112 |
1 files changed, 100 insertions, 12 deletions
diff --git a/lib/dolce/table/detail-drawing-columns.tsx b/lib/dolce/table/detail-drawing-columns.tsx index c082333d..747173af 100644 --- a/lib/dolce/table/detail-drawing-columns.tsx +++ b/lib/dolce/table/detail-drawing-columns.tsx @@ -3,13 +3,25 @@ import { ColumnDef } from "@tanstack/react-table"; import { DetailDwgReceiptItem } from "../actions"; import { formatDolceDateTime } from "../utils/date-formatter"; +import { useState } from "react"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Button } from "@/components/ui/button"; +import { Edit } from "lucide-react"; // DOLCE API ENM 필드가 제대로 번역되지 않아 직접 매핑 const DRAWING_USAGE_MAP: Record<string, { ko: string; en: string }> = { APP: { ko: "승인용", en: "Approval" }, WOR: { ko: "작업용", en: "Working" }, + // 참조용은 eVCP에서 사용하지 않으나 추가해둠 + REF: { ko: "참조용", en: "Reference" }, REC: { ko: "입수용", en: "GTT→SHI" }, SUB: { ko: "제출용", en: "SHI→GTT" }, + CMT: { ko: "코멘트", en: "Comment" }, }; const REGISTER_KIND_MAP: Record<string, { ko: string; en: string }> = { @@ -19,6 +31,19 @@ const REGISTER_KIND_MAP: Record<string, { ko: string; en: string }> = { WORP: { ko: "작업용 입수도면(Partial)", en: "For Working(Partial)" }, RECW: { ko: "Working 도면입수(GTT→SHI)", en: "Working Dwg(GTT→SHI)" }, RECP: { ko: "Pre. 도면입수(GTT→SHI)", en: "Pre. Dwg(GTT→SHI)" }, + GSUB: { ko: "SHI 입력 문서 (SHI→GTT)", en: "SHI Input Document(SHI→GTT)" }, + CMTQ: { ko: "Comment-TQ", en: "Comment-TQ" }, + CMTM: { ko: "MARK-UP", en: "MARK-UP" }, + // FMEA는 미사용 코드 + "FMEA-R1": { ko: "FMEA 1st Receipt", en: "FMEA 1st Receipt" }, + "FMEA-R2": { ko: "FMEA 2nd Receipt", en: "FMEA 2nd Receipt" }, + "FMEA-1": { ko: "FMEA 1st Submission", en: "FMEA 1st Submission" }, + "FMEA-2": { ko: "FMEA 2nd Submission", en: "FMEA 2nd Submission" }, + // 참조용 도면도 미사용 코드, 번역 받아야 적용 가능 + PREF: { ko: "본선용 참조도면", en: "본선용 참조도면" }, + RREF: { ko: "실적선 참조도면", en: "실적선 참조도면" }, + "PREP-P": { ko: "본선용 참조도면(Partial)", en: "본선용 참조도면(Partial)" }, + "RREP-P": { ko: "실적선 참조도면(Partial)", en: "실적선 참조도면(Partial)" }, }; // 카테고리는 API에서 ENM이 제공되는 것으로 가정 (필요시 추가) @@ -36,11 +61,39 @@ const translateRegisterKind = (code: string | null, lng: string): string => { return lng === "en" ? mapped.en : mapped.ko; }; +// Comment Dialog Component +function CommentDialog({ comment }: { comment: string }) { + const [open, setOpen] = useState(false); + + return ( + <> + <Button + variant="ghost" + className="h-auto py-1 px-2 text-left justify-start font-normal hover:bg-accent" + onClick={() => setOpen(true)} + > + <div className="truncate max-w-[200px]">{comment || "-"}</div> + </Button> + <Dialog open={open} onOpenChange={setOpen}> + <DialogContent className="max-w-2xl"> + <DialogHeader> + <DialogTitle>Comment</DialogTitle> + </DialogHeader> + <div className="max-h-96 overflow-y-auto"> + <p className="whitespace-pre-wrap text-sm">{comment || "코멘트가 없습니다."}</p> + </div> + </DialogContent> + </Dialog> + </> + ); +} + // 다국어 지원 컬럼 생성 함수 export function createDetailDrawingColumns( lng: string, // eslint-disable-next-line @typescript-eslint/no-explicit-any - t: any + t: any, + onEdit?: (detailDrawing: DetailDwgReceiptItem) => void ): ColumnDef<DetailDwgReceiptItem>[] { return [ { @@ -78,17 +131,18 @@ export function createDetailDrawingColumns( return <div>{lng === "en" ? (categoryENM || categoryNM) : (categoryNM || categoryENM)}</div>; }, }, - { - accessorKey: "DrawingUsage", - header: t("detailDrawing.columns.drawingUsage"), - minSize: 100, - cell: ({ row }) => { - // API 응답의 DrawingUsage는 코드값이므로 직접 매핑하여 번역 - const usageCode = row.getValue("DrawingUsage") as string; - const translated = translateDrawingUsage(usageCode, lng); - return <div>{translated}</div>; - }, - }, + // RegisterKind 로 DrawingUsage를 알 수 있으므로 주석 처리 + // { + // accessorKey: "DrawingUsage", + // header: t("detailDrawing.columns.drawingUsage"), + // minSize: 100, + // cell: ({ row }) => { + // // API 응답의 DrawingUsage는 코드값이므로 직접 매핑하여 번역 + // const usageCode = row.getValue("DrawingUsage") as string; + // const translated = translateDrawingUsage(usageCode, lng); + // return <div>{translated}</div>; + // }, + // }, { accessorKey: "RegisterKind", header: t("detailDrawing.columns.registerKind"), @@ -119,5 +173,39 @@ export function createDetailDrawingColumns( return <div className="text-sm text-muted-foreground">{formatDolceDateTime(date)}</div>; }, }, + { + accessorKey: "RegisterDesc", + header: "Comment", + minSize: 200, + maxSize: 200, + cell: ({ row }) => { + const comment = row.getValue("RegisterDesc") as string; + return <CommentDialog comment={comment} />; + }, + }, + { + id: "actions", + header: t("detailDrawing.columns.actions"), + minSize: 100, + maxSize: 100, + cell: ({ row }) => { + const status = row.getValue("Status") as string; + const isEditable = status === "Submitted"; + + return ( + <div className="flex items-center justify-center"> + <Button + variant="ghost" + size="sm" + disabled={!isEditable || !onEdit} + onClick={() => onEdit && onEdit(row.original)} + title={!isEditable ? t("editDetailDialog.statusSubmittedOnly") : t("editDetailDialog.editButton")} + > + <Edit className="h-4 w-4" /> + </Button> + </div> + ); + }, + }, ]; } |
