diff options
Diffstat (limited to 'lib/dolce/dialogs/detail-drawing-dialog.tsx')
| -rw-r--r-- | lib/dolce/dialogs/detail-drawing-dialog.tsx | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/lib/dolce/dialogs/detail-drawing-dialog.tsx b/lib/dolce/dialogs/detail-drawing-dialog.tsx index a06c9688..d9df58db 100644 --- a/lib/dolce/dialogs/detail-drawing-dialog.tsx +++ b/lib/dolce/dialogs/detail-drawing-dialog.tsx @@ -12,6 +12,7 @@ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Skeleton } from "@/components/ui/skeleton"; import { Plus, RefreshCw, Upload, Loader2 } from "lucide-react"; import { toast } from "sonner"; +import { useTranslation } from "@/i18n/client"; import { UnifiedDwgReceiptItem, DetailDwgReceiptItem, @@ -20,7 +21,7 @@ import { fetchFileInfoList, } from "../actions"; import { DrawingListTable } from "../table/drawing-list-table"; -import { detailDrawingColumns } from "../table/detail-drawing-columns"; +import { createDetailDrawingColumns } from "../table/detail-drawing-columns"; import { createFileListColumns } from "../table/file-list-columns"; import { AddDetailDrawingDialog } from "./add-detail-drawing-dialog"; import { UploadFilesToDetailDialog } from "./upload-files-to-detail-dialog"; @@ -34,6 +35,7 @@ interface DetailDrawingDialogProps { userName: string; userEmail: string; drawingKind: "B3" | "B4"; + lng: string; } export function DetailDrawingDialog({ @@ -45,7 +47,9 @@ export function DetailDrawingDialog({ userName, userEmail, drawingKind, + lng, }: DetailDrawingDialogProps) { + const { t } = useTranslation(lng, "dolce"); const [detailDrawings, setDetailDrawings] = useState<DetailDwgReceiptItem[]>([]); const [selectedDetail, setSelectedDetail] = useState<DetailDwgReceiptItem | null>(null); const [files, setFiles] = useState<FileInfoItem[]>([]); @@ -75,11 +79,11 @@ export function DetailDrawingDialog({ } } catch (error) { console.error("상세도면 로드 실패:", error); - toast.error("상세도면 로드에 실패했습니다"); + toast.error(t("detailDialog.detailLoadError")); } finally { setIsLoading(false); } - }, [drawing, selectedDetail]); + }, [drawing, selectedDetail, t]); // 파일 목록 로드 const loadFiles = useCallback(async () => { @@ -94,11 +98,11 @@ export function DetailDrawingDialog({ setFiles(data); } catch (error) { console.error("파일 목록 로드 실패:", error); - toast.error("파일 목록 로드에 실패했습니다"); + toast.error(t("detailDialog.fileLoadError")); } finally { setIsLoadingFiles(false); } - }, [selectedDetail]); + }, [selectedDetail, t]); // 다이얼로그 열릴 때 데이터 로드 useEffect(() => { @@ -120,7 +124,7 @@ export function DetailDrawingDialog({ const handleDownload = async (file: FileInfoItem) => { try { - toast.info("파일 다운로드를 준비 중입니다..."); + toast.info(t("detailDialog.downloadPreparing")); // 파일 생성자의 userId를 사용하여 다운로드 const response = await fetch("/api/dolce/download", { @@ -136,7 +140,7 @@ export function DetailDrawingDialog({ }); if (!response.ok) { - throw new Error("파일 다운로드 실패"); + throw new Error(t("detailDialog.downloadError")); } const blob = await response.blob(); @@ -149,10 +153,10 @@ export function DetailDrawingDialog({ window.URL.revokeObjectURL(url); document.body.removeChild(a); - toast.success("파일 다운로드가 완료되었습니다"); + toast.success(t("detailDialog.downloadSuccess")); } catch (error) { console.error("파일 다운로드 실패:", error); - toast.error("파일 다운로드에 실패했습니다"); + toast.error(t("detailDialog.downloadError")); } }; @@ -170,7 +174,7 @@ export function DetailDrawingDialog({ loadFiles(); }; - const fileColumns = createFileListColumns({ onDownload: handleDownload }); + const fileColumns = createFileListColumns({ onDownload: handleDownload, lng }); // RegisterId + UploadId 조합으로 고유 ID 생성 const getDetailDrawingId = (detail: DetailDwgReceiptItem) => { @@ -188,10 +192,15 @@ export function DetailDrawingDialog({ <DialogContent className="max-w-[95vw] h-[90vh] flex flex-col"> <DialogHeader> <DialogTitle className="flex flex-col gap-1"> - <span>상세도면 정보</span> + <span>{t("detailDialog.title")}</span> {drawing && ( <span className="text-sm font-normal text-muted-foreground"> - {drawing.DrawingNo} | 프로젝트: {drawing.ProjectNo} | Discipline: {drawing.Discipline} | 종류: {drawing.DrawingKind} + {t("detailDialog.subtitle", { + drawingNo: drawing.DrawingNo, + projectNo: drawing.ProjectNo, + discipline: drawing.Discipline, + drawingKind: drawing.DrawingKind + })} </span> )} </DialogTitle> @@ -201,7 +210,7 @@ export function DetailDrawingDialog({ {/* 상단: 상세도면 리스트 */} <Card className="flex-1 overflow-hidden flex flex-col"> <CardHeader className="flex-row items-center justify-between py-3"> - <CardTitle className="text-base">상세도면 목록</CardTitle> + <CardTitle className="text-base">{t("detailDialog.detailListTitle")}</CardTitle> <div className="flex gap-2"> <Button variant="outline" @@ -210,7 +219,7 @@ export function DetailDrawingDialog({ disabled={isLoading} > <RefreshCw className={`h-4 w-4 mr-2 ${isLoading ? "animate-spin" : ""}`} /> - 새로고침 + {t("detailDialog.refreshButton")} </Button> {canAddDetailDrawing && ( <Button @@ -219,14 +228,14 @@ export function DetailDrawingDialog({ onClick={() => setAddDialogOpen(true)} > <Plus className="h-4 w-4 mr-2" /> - 상세도면 추가 + {t("detailDialog.addDetailButton")} </Button> )} </div> </CardHeader> <CardContent className="flex-1 overflow-y-auto p-4"> <DrawingListTable<DetailDwgReceiptItem, unknown> - columns={detailDrawingColumns} + columns={createDetailDrawingColumns(lng, t)} data={detailDrawings} onRowClick={setSelectedDetail} selectedRow={selectedDetail || undefined} @@ -239,8 +248,8 @@ export function DetailDrawingDialog({ <Card className="flex-1 overflow-hidden flex flex-col"> <CardHeader className="flex-row items-center justify-between py-3"> <CardTitle className="text-base"> - 첨부파일 목록 - {selectedDetail && ` - Rev. ${selectedDetail.DrawingRevNo}`} + {t("detailDialog.fileListTitle")} + {selectedDetail && t("detailDialog.fileListSubtitle", { revNo: selectedDetail.DrawingRevNo })} </CardTitle> {selectedDetail && canAddDetailDrawing && ( <Button @@ -249,20 +258,20 @@ export function DetailDrawingDialog({ onClick={() => setUploadFilesDialogOpen(true)} > <Upload className="h-4 w-4 mr-2" /> - 파일 업로드 + {t("detailDialog.uploadFilesButton")} </Button> )} </CardHeader> <CardContent className="flex-1 overflow-y-auto p-4"> {!selectedDetail ? ( <div className="h-full flex items-center justify-center text-muted-foreground"> - 상세도면을 선택하세요 + {t("detailDialog.selectDetailDrawing")} </div> ) : isLoadingFiles ? ( <div className="space-y-4"> <div className="flex items-center justify-center gap-2 text-muted-foreground py-8"> <Loader2 className="h-5 w-5 animate-spin" /> - <span>Loading files...</span> + <span>{t("detailDialog.loadingFiles")}</span> </div> <div className="space-y-2"> <Skeleton className="h-10 w-full" /> @@ -292,6 +301,7 @@ export function DetailDrawingDialog({ userEmail={userEmail} onComplete={handleAddComplete} drawingKind={drawingKind} + lng={lng} /> {selectedDetail && ( @@ -303,6 +313,7 @@ export function DetailDrawingDialog({ revNo={selectedDetail.DrawingRevNo} userId={userId} onUploadComplete={handleUploadComplete} + lng={lng} /> )} </> |
