diff options
Diffstat (limited to 'lib/basic-contract/vendor-table')
| -rw-r--r-- | lib/basic-contract/vendor-table/basic-contract-columns.tsx | 38 | ||||
| -rw-r--r-- | lib/basic-contract/vendor-table/basic-contract-sign-dialog.tsx | 10 |
2 files changed, 24 insertions, 24 deletions
diff --git a/lib/basic-contract/vendor-table/basic-contract-columns.tsx b/lib/basic-contract/vendor-table/basic-contract-columns.tsx index b79487d7..c9e8da53 100644 --- a/lib/basic-contract/vendor-table/basic-contract-columns.tsx +++ b/lib/basic-contract/vendor-table/basic-contract-columns.tsx @@ -8,6 +8,7 @@ import { toast } from "sonner" import { getErrorMessage } from "@/lib/handle-error" import { formatDate, formatDateTime } from "@/lib/utils" +import { downloadFile } from "@/lib/file-download" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Checkbox } from "@/components/ui/checkbox" @@ -36,28 +37,24 @@ interface GetColumnsProps { /** * 파일 다운로드 함수 */ -/** - * 파일 다운로드 함수 - */ -const handleFileDownload = (filePath: string | null, fileName: string | null) => { +const handleFileDownload = async (filePath: string | null, fileName: string | null) => { if (!filePath || !fileName) { toast.error("파일 정보가 없습니다."); return; } try { - // 전체 URL 생성 - const fullUrl = `${window.location.origin}${filePath}`; + // /api/files/ 엔드포인트를 통한 안전한 다운로드 + const apiFilePath = `/api/files/${filePath.startsWith('/') ? filePath.substring(1) : filePath}`; - // a 태그를 생성하여 다운로드 실행 - const link = document.createElement('a'); - link.href = fullUrl; - link.download = fileName; // 다운로드될 파일명 설정 - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - - toast.success("파일 다운로드를 시작합니다."); + const result = await downloadFile(apiFilePath, fileName, { + action: 'download', + showToast: true + }); + + if (!result.success) { + console.error("파일 다운로드 실패:", result.error); + } } catch (error) { console.error("파일 다운로드 오류:", error); toast.error("파일 다운로드 중 오류가 발생했습니다."); @@ -104,16 +101,19 @@ export function getColumns({ setRowAction }: GetColumnsProps): ColumnDef<BasicCo id: "download", header: "", cell: ({ row }) => { - const template = row.original; - const filePath = template.status === "PENDING" ? template.filePath : template.signedFilePath + const contract = row.original; + // PENDING 상태일 때는 원본 PDF 파일 (signedFilePath), COMPLETED일 때는 서명된 파일 (signedFilePath) + const filePath = contract.signedFilePath; + const fileName = contract.signedFileName; return ( <Button variant="ghost" size="icon" - onClick={() => handleFileDownload(filePath, template.fileName)} - title={`${template.fileName} 다운로드`} + onClick={() => handleFileDownload(filePath, fileName)} + title={`${fileName} 다운로드`} className="hover:bg-muted" + disabled={!filePath || !fileName} > <Paperclip className="h-4 w-4" /> <span className="sr-only">다운로드</span> diff --git a/lib/basic-contract/vendor-table/basic-contract-sign-dialog.tsx b/lib/basic-contract/vendor-table/basic-contract-sign-dialog.tsx index 28a4fd71..7bffdac9 100644 --- a/lib/basic-contract/vendor-table/basic-contract-sign-dialog.tsx +++ b/lib/basic-contract/vendor-table/basic-contract-sign-dialog.tsx @@ -68,7 +68,7 @@ export function BasicContractSignDialog({ contracts, onSuccess }: BasicContractS const term = searchTerm.toLowerCase(); return contracts.filter(contract => (contract.templateName || '').toLowerCase().includes(term) || - (contract.userName || '').toLowerCase().includes(term) + (contract.requestedByName || '').toLowerCase().includes(term) ); }, [contracts, searchTerm]); @@ -98,7 +98,7 @@ export function BasicContractSignDialog({ contracts, onSuccess }: BasicContractS const formData = new FormData(); formData.append('file', new Blob([data], { type: 'application/pdf' })); formData.append('tableRowId', selectedContract.id.toString()); - formData.append('templateName', selectedContract.fileName || ''); + formData.append('templateName', selectedContract.signedFileName || ''); // API 호출 const response = await fetch('/api/upload/signed-contract', { @@ -227,7 +227,7 @@ export function BasicContractSignDialog({ contracts, onSuccess }: BasicContractS <div className="grid grid-cols-2 gap-1 mt-1 text-xs text-gray-500"> <div className="flex items-center"> <User className="h-3 w-3 mr-1" /> - <span className="truncate">{contract.userName || '알 수 없음'}</span> + <span className="truncate">{contract.requestedByName || '알 수 없음'}</span> </div> <div className="flex items-center justify-end"> <Calendar className="h-3 w-3 mr-1" /> @@ -255,7 +255,7 @@ export function BasicContractSignDialog({ contracts, onSuccess }: BasicContractS <div className="flex justify-between items-center mt-1 text-xs text-gray-500"> <span className="flex items-center"> <User className="h-3 w-3 mr-1" /> - 요청자: {selectedContract.userName || '알 수 없음'} + 요청자: {selectedContract.requestedByName || '알 수 없음'} </span> <span className="flex items-center"> <Clock className="h-3 w-3 mr-1" /> @@ -266,7 +266,7 @@ export function BasicContractSignDialog({ contracts, onSuccess }: BasicContractS <div className="flex-grow overflow-hidden border-b"> <BasicContractSignViewer contractId={selectedContract.id} - filePath={selectedContract.filePath || undefined} + filePath={selectedContract.signedFilePath || undefined} instance={instance} setInstance={setInstance} /> |
