From a50bc9baea332f996e6bc3a5d70c69f6d2d0f194 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Wed, 23 Jul 2025 09:08:03 +0000 Subject: (대표님, 최겸) 기본계약 템플릿 및 에디터, 기술영업 벤더정보, 파일 보안다운로드, 벤더 document sync 상태 서비스, 메뉴 Config, 기술영업 미사용 제거 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../add-basic-contract-template-dialog.tsx | 96 ++++++++++++---------- 1 file changed, 52 insertions(+), 44 deletions(-) (limited to 'lib/basic-contract/template/add-basic-contract-template-dialog.tsx') diff --git a/lib/basic-contract/template/add-basic-contract-template-dialog.tsx b/lib/basic-contract/template/add-basic-contract-template-dialog.tsx index c88819e4..9b036445 100644 --- a/lib/basic-contract/template/add-basic-contract-template-dialog.tsx +++ b/lib/basic-contract/template/add-basic-contract-template-dialog.tsx @@ -41,13 +41,26 @@ import { Separator } from "@/components/ui/separator"; import { useRouter } from "next/navigation"; import { BUSINESS_UNITS } from "@/config/basicContractColumnsConfig"; -// 업데이트된 계약서 템플릿 스키마 정의 +// 템플릿 이름 옵션 정의 +const TEMPLATE_NAME_OPTIONS = [ + "준법서약", + "기술자료 요구서", + "비밀유지 계약서", + "표준하도급기본 계약서", + "General GTC", + "안전보건관리 약정서", + "동반성장", + "윤리규범 준수 서약서", + "기술자료 동의서", + "내국신용장 미개설 합의서", + "직납자재 하도급대급등 연동제 의향서" +] as const; + +// 업데이트된 계약서 템플릿 스키마 정의 (워드파일만 허용) const templateFormSchema = z.object({ - templateCode: z.string() - .min(1, "템플릿 코드는 필수입니다.") - .max(50, "템플릿 코드는 50자 이하여야 합니다.") - .regex(/^[A-Z0-9_-]+$/, "템플릿 코드는 영문 대문자, 숫자, '_', '-'만 사용 가능합니다."), - templateName: z.string().min(1, "템플릿 이름은 필수입니다."), + templateName: z.enum(TEMPLATE_NAME_OPTIONS, { + required_error: "템플릿 이름을 선택해주세요.", + }), revision: z.coerce.number().int().min(1).default(1), legalReviewRequired: z.boolean().default(false), @@ -67,8 +80,10 @@ const templateFormSchema = z.object({ message: "파일 크기는 100MB 이하여야 합니다.", }) .refine( - (file) => file.type === 'application/pdf', - { message: "PDF 파일만 업로드 가능합니다." } + (file) => + file.type === 'application/msword' || + file.type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + { message: "워드 파일(.doc, .docx)만 업로드 가능합니다." } ), status: z.enum(["ACTIVE", "DISPOSED"]).default("ACTIVE"), }).refine((data) => { @@ -95,10 +110,9 @@ export function AddTemplateDialog() { const [showProgress, setShowProgress] = React.useState(false); const router = useRouter(); - // 기본값 설정 + // 기본값 설정 (templateCode 제거) const defaultValues: Partial = { - templateCode: "", - templateName: "", + templateName: undefined, revision: 1, legalReviewRequired: false, shipBuildingApplicable: false, @@ -183,7 +197,7 @@ export function AddTemplateDialog() { } }; - // 폼 제출 핸들러 + // 폼 제출 핸들러 (templateCode 제거) async function onSubmit(formData: TemplateFormValues) { setIsLoading(true); try { @@ -201,14 +215,13 @@ export function AddTemplateDialog() { throw new Error("파일 업로드에 실패했습니다."); } - // 메타데이터 저장 (업데이트된 필드들 포함) + // 메타데이터 저장 (templateCode 제거됨) const saveResponse = await fetch('/api/upload/basicContract/complete', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ - templateCode: formData.templateCode, templateName: formData.templateName, revision: formData.revision, legalReviewRequired: formData.legalReviewRequired, @@ -300,22 +313,28 @@ export function AddTemplateDialog() {
( - 템플릿 코드 * + 템플릿 이름 * - - field.onChange(e.target.value.toUpperCase())} - /> - + - 영문 대문자, 숫자, '_', '-'만 사용 가능 + 미리 정의된 템플릿 중에서 선택 @@ -338,6 +357,10 @@ export function AddTemplateDialog() { 템플릿 버전 (기본값: 1) +
+ + 동일한 템플릿 이름의 리비전은 중복될 수 없습니다. +
@@ -345,22 +368,6 @@ export function AddTemplateDialog() { />
- ( - - - 템플릿 이름 * - - - - - - - )} - /> - - {selectedFile ? selectedFile.name : "PDF 파일을 여기에 드래그하세요"} + {selectedFile ? selectedFile.name : "워드 파일을 여기에 드래그하세요"} {selectedFile ? `파일 크기: ${(selectedFile.size / (1024 * 1024)).toFixed(2)} MB` - : "또는 클릭하여 PDF 파일을 선택하세요 (최대 100MB)"} + : "또는 클릭하여 워드 파일(.doc, .docx)을 선택하세요 (최대 100MB)"} -- cgit v1.2.3