summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-11-12 11:07:00 +0900
committerjoonhoekim <26rote@gmail.com>2025-11-12 11:07:00 +0900
commitbbb13a1ea700f3be7ac12459b63804b843e93dc4 (patch)
tree872e4787b7467a7e66cae77ca0e1007b58b24dfb /lib
parent74d8f31dd5b23f458cb14742d4d23caa90bfd86f (diff)
(김준회) 업로드 파일명 파싱시 OWN_DOC_NO 로 검증하도록 변경
Diffstat (limited to 'lib')
-rw-r--r--lib/swp/table/swp-table-toolbar.tsx8
-rw-r--r--lib/swp/table/swp-upload-validation-dialog.tsx19
2 files changed, 14 insertions, 13 deletions
diff --git a/lib/swp/table/swp-table-toolbar.tsx b/lib/swp/table/swp-table-toolbar.tsx
index 0fd29fd3..add69666 100644
--- a/lib/swp/table/swp-table-toolbar.tsx
+++ b/lib/swp/table/swp-table-toolbar.tsx
@@ -38,7 +38,7 @@ interface SwpTableToolbarProps {
vendorCode?: string;
droppedFiles?: File[];
onFilesProcessed?: () => void;
- documents?: Array<{ DOC_NO: string }>; // 업로드 권한 검증용 문서 목록
+ documents?: Array<{ OWN_DOC_NO: string | null }>; // 업로드 권한 검증용 문서 목록 (OWN_DOC_NO 기준)
userId?: string; // 파일 취소 시 필요
}
@@ -81,10 +81,12 @@ export function SwpTableToolbar({
const [showValidationDialog, setShowValidationDialog] = useState(false);
/**
- * 업로드 가능한 문서번호 목록 추출
+ * 업로드 가능한 문서번호 목록 추출 (OWN_DOC_NO 기준)
*/
const availableDocNos = useMemo(() => {
- return documents.map(doc => doc.DOC_NO);
+ return documents
+ .map(doc => doc.OWN_DOC_NO)
+ .filter((ownDocNo): ownDocNo is string => ownDocNo !== null && ownDocNo !== undefined);
}, [documents]);
/**
diff --git a/lib/swp/table/swp-upload-validation-dialog.tsx b/lib/swp/table/swp-upload-validation-dialog.tsx
index 2d17e041..8e786c8b 100644
--- a/lib/swp/table/swp-upload-validation-dialog.tsx
+++ b/lib/swp/table/swp-upload-validation-dialog.tsx
@@ -12,7 +12,6 @@ import {
import { Alert, AlertDescription } from "@/components/ui/alert";
import { Badge } from "@/components/ui/badge";
import { CheckCircle2, XCircle, AlertCircle, Upload } from "lucide-react";
-import { ScrollArea } from "@/components/ui/scroll-area";
interface FileValidationResult {
file: File;
@@ -39,7 +38,7 @@ interface SwpUploadValidationDialogProps {
/**
* 파일명 검증 함수 (클라이언트 사이드)
- * 형식: [DOC_NO]_[REV_NO]_[STAGE].[확장자] 또는 [DOC_NO]_[REV_NO]_[STAGE]_[자유-파일명].[확장자]
+ * 형식: [OWN_DOC_NO]_[REV_NO]_[STAGE].[확장자] 또는 [OWN_DOC_NO]_[REV_NO]_[STAGE]_[자유-파일명].[확장자]
* 자유 파일명은 선택사항이며, 포함될 경우 언더스코어를 포함할 수 있음
* @param fileName 검증할 파일명
* @param availableDocNos 업로드 가능한 문서번호 목록 (선택)
@@ -76,15 +75,15 @@ export function validateFileName(
// 언더스코어로 분리
const parts = nameWithoutExt.split("_");
- // 최소 3개 파트 필요: docNo, revNo, stage (fileName은 선택사항)
+ // 최소 3개 파트 필요: ownDocNo, revNo, stage (fileName은 선택사항)
if (parts.length < 3) {
return {
valid: false,
- error: `언더스코어(_)가 최소 2개 있어야 합니다 (현재: ${parts.length - 1}개). 형식: [DOC_NO]_[REV_NO]_[STAGE].[확장자]`,
+ error: `언더스코어(_)가 최소 2개 있어야 합니다 (현재: ${parts.length - 1}개). 형식: [OWN_DOC_NO]_[REV_NO]_[STAGE].[확장자]`,
};
}
- // 앞에서부터 3개는 고정: docNo, revNo, stage
+ // 앞에서부터 3개는 고정: ownDocNo, revNo, stage
const ownDocNo = parts[0];
const revNo = parts[1];
const stage = parts[2];
@@ -96,7 +95,7 @@ export function validateFileName(
if (!ownDocNo || ownDocNo.trim() === "") {
return {
valid: false,
- error: "문서번호(DOC_NO)가 비어있습니다",
+ error: "문서번호(OWN_DOC_NO)가 비어있습니다",
};
}
@@ -232,7 +231,7 @@ export function SwpUploadValidationDialog({
)}
{/* 파일 목록 */}
- <ScrollArea className="h-[300px] rounded-md border p-4">
+ <div className="max-h-[400px] overflow-auto rounded-md border p-4">
<div className="space-y-3">
{/* 검증 성공 파일 */}
{validFiles.length > 0 && (
@@ -310,7 +309,7 @@ export function SwpUploadValidationDialog({
</div>
)}
</div>
- </ScrollArea>
+ </div>
{/* 형식 안내 */}
<div className="rounded-lg bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800 p-3">
@@ -318,13 +317,13 @@ export function SwpUploadValidationDialog({
올바른 파일명 형식
</div>
<code className="text-xs text-blue-700 dark:text-blue-300">
- [DOC_NO]_[REV_NO]_[STAGE].[확장자]
+ [OWN_DOC_NO]_[REV_NO]_[STAGE].[확장자]
</code>
<div className="text-xs text-blue-600 dark:text-blue-400 mt-1">
예: VD-DOC-001_01_IFA.pdf
</div>
<div className="text-xs text-blue-600 dark:text-blue-400 mt-1">
- ※ 선택사항: [DOC_NO]_[REV_NO]_[STAGE]_[파일명].[확장자] (파일명 추가 가능)
+ ※ 선택사항: [OWN_DOC_NO]_[REV_NO]_[STAGE]_[파일명].[확장자] (파일명 추가 가능)
</div>
<div className="text-xs text-blue-600 dark:text-blue-400 mt-1">
※ 파일명에는 언더스코어(_)가 포함될 수 있습니다.