summaryrefslogtreecommitdiff
path: root/lib/b-rfq/attachment/revision-dialog.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/b-rfq/attachment/revision-dialog.tsx')
-rw-r--r--lib/b-rfq/attachment/revision-dialog.tsx196
1 files changed, 196 insertions, 0 deletions
diff --git a/lib/b-rfq/attachment/revision-dialog.tsx b/lib/b-rfq/attachment/revision-dialog.tsx
new file mode 100644
index 00000000..b1fe1576
--- /dev/null
+++ b/lib/b-rfq/attachment/revision-dialog.tsx
@@ -0,0 +1,196 @@
+"use client"
+
+import * as React from "react"
+import { Badge } from "@/components/ui/badge"
+import { Button } from "@/components/ui/button"
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle,
+ DialogTrigger,
+} from "@/components/ui/dialog"
+import {
+ Table,
+ TableBody,
+ TableCell,
+ TableHead,
+ TableHeader,
+ TableRow,
+} from "@/components/ui/table"
+import { History, Download, Upload } from "lucide-react"
+import { formatDate, formatBytes } from "@/lib/utils"
+import { getAttachmentRevisions } from "../service"
+import { AddRevisionDialog } from "./add-revision-dialog"
+
+interface RevisionDialogProps {
+ attachmentId: number
+ currentRevision: string
+ originalFileName: string
+}
+
+export function RevisionDialog({
+ attachmentId,
+ currentRevision,
+ originalFileName
+}: RevisionDialogProps) {
+ const [open, setOpen] = React.useState(false)
+ const [revisions, setRevisions] = React.useState<any[]>([])
+ const [isLoading, setIsLoading] = React.useState(false)
+ const [isAddRevisionOpen, setIsAddRevisionOpen] = React.useState(false)
+
+ // 리비전 목록 로드
+ const loadRevisions = async () => {
+ setIsLoading(true)
+ try {
+ const result = await getAttachmentRevisions(attachmentId)
+
+ if (result.success) {
+ setRevisions(result.revisions)
+ } else {
+ console.error("Failed to load revisions:", result.message)
+ }
+ } catch (error) {
+ console.error("Failed to load revisions:", error)
+ } finally {
+ setIsLoading(false)
+ }
+ }
+
+ React.useEffect(() => {
+ if (open) {
+ loadRevisions()
+ }
+ }, [open, attachmentId])
+
+ return (
+ <>
+ <Dialog open={open} onOpenChange={setOpen}>
+ <DialogTrigger asChild>
+ <Button variant="ghost" size="sm" className="gap-2">
+ <History className="h-4 w-4" />
+ {currentRevision}
+ </Button>
+ </DialogTrigger>
+
+ <DialogContent className="sm:max-w-[800px]" style={{maxWidth:800}}>
+ <DialogHeader>
+ <DialogTitle className="flex items-center gap-2">
+ <History className="h-5 w-5" />
+ 리비전 히스토리: {originalFileName}
+ </DialogTitle>
+ <DialogDescription>
+ 이 문서의 모든 버전을 확인하고 관리할 수 있습니다.
+ </DialogDescription>
+ </DialogHeader>
+
+ <div className="space-y-4">
+ {/* 새 리비전 추가 버튼 */}
+ <div className="flex justify-end">
+ <Button
+ onClick={() => setIsAddRevisionOpen(true)}
+ className="gap-2"
+ >
+ <Upload className="h-4 w-4" />
+ 새 리비전 추가
+ </Button>
+ </div>
+
+ {/* 리비전 목록 */}
+ {isLoading ? (
+ <div className="text-center py-8">리비전을 불러오는 중...</div>
+ ) : (
+ <div className="border rounded-lg">
+ <Table>
+ <TableHeader>
+ <TableRow>
+ <TableHead>리비전</TableHead>
+ <TableHead>파일명</TableHead>
+ <TableHead>크기</TableHead>
+ <TableHead>업로드 일시</TableHead>
+ <TableHead>업로드자</TableHead>
+ <TableHead>코멘트</TableHead>
+ <TableHead>액션</TableHead>
+ </TableRow>
+ </TableHeader>
+ <TableBody>
+ {revisions.map((revision) => (
+ <TableRow key={revision.id}>
+ <TableCell>
+ <div className="flex items-center gap-2">
+ <Badge
+ variant={revision.isLatest ? "default" : "outline"}
+ >
+ {revision.revisionNo}
+ </Badge>
+ {revision.isLatest && (
+ <Badge variant="secondary" className="text-xs">
+ 최신
+ </Badge>
+ )}
+ </div>
+ </TableCell>
+
+ <TableCell>
+ <div>
+ <div className="font-medium">{revision.originalFileName}</div>
+ </div>
+ </TableCell>
+
+ <TableCell>
+ {formatBytes(revision.fileSize)}
+ </TableCell>
+
+ <TableCell>
+ {formatDate(revision.createdAt)}
+ </TableCell>
+
+ <TableCell>
+ {revision.createdByName || "-"}
+ </TableCell>
+
+ <TableCell>
+ <div className="max-w-[200px] truncate" title={revision.revisionComment}>
+ {revision.revisionComment || "-"}
+ </div>
+ </TableCell>
+
+ <TableCell>
+ <Button
+ variant="ghost"
+ size="sm"
+ className="gap-2"
+ onClick={() => {
+ // 파일 다운로드
+ window.open(revision.filePath, '_blank')
+ }}
+ >
+ <Download className="h-4 w-4" />
+ 다운로드
+ </Button>
+ </TableCell>
+ </TableRow>
+ ))}
+ </TableBody>
+ </Table>
+ </div>
+ )}
+ </div>
+ </DialogContent>
+ </Dialog>
+
+ {/* 새 리비전 추가 다이얼로그 */}
+ <AddRevisionDialog
+ open={isAddRevisionOpen}
+ onOpenChange={setIsAddRevisionOpen}
+ attachmentId={attachmentId}
+ currentRevision={currentRevision}
+ originalFileName={originalFileName}
+ onSuccess={() => {
+ loadRevisions() // 리비전 목록 새로고침
+ }}
+ />
+ </>
+ )
+ } \ No newline at end of file