summaryrefslogtreecommitdiff
path: root/lib/legal-review
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-09-09 10:34:05 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-09-09 10:34:05 +0000
commit86b1fd1cc801f45642f84d24c0b5c84368454ff0 (patch)
tree63176d1feb6d3fbbb71d942343056ba6d793b586 /lib/legal-review
parentc62ec046327fd388ebce04571b55910747e69a3b (diff)
(최겸) 구매 입찰 사전견적, 입찰, 낙찰, 유찰, 재입찰 기능 개발
Diffstat (limited to 'lib/legal-review')
-rw-r--r--lib/legal-review/status/request-review-dialog.tsx195
1 files changed, 92 insertions, 103 deletions
diff --git a/lib/legal-review/status/request-review-dialog.tsx b/lib/legal-review/status/request-review-dialog.tsx
index bfaa14b9..d99fc0e3 100644
--- a/lib/legal-review/status/request-review-dialog.tsx
+++ b/lib/legal-review/status/request-review-dialog.tsx
@@ -54,18 +54,18 @@ const requestReviewSchema = z.object({
dueDate: z.string().min(1, "검토 완료 희망일을 선택해주세요"),
assignee: z.string().optional(),
notificationMethod: z.enum(["email", "internal", "both"]).default("both"),
-
+
// 법무업무 상세 정보
reviewDepartment: z.enum(["준법문의", "법무검토"]),
inquiryType: z.enum(["국내계약", "국내자문", "해외계약", "해외자문"]).optional(),
-
+
// 공통 필드
title: z.string().min(1, "제목을 선택해주세요"),
requestContent: z.string().min(1, "요청내용을 입력해주세요"),
-
+
// 준법문의 전용 필드
isPublic: z.boolean().default(false),
-
+
// 법무검토 전용 필드들
contractProjectName: z.string().optional(),
contractType: z.string().optional(),
@@ -102,10 +102,7 @@ export function RequestReviewDialog({
const [editorContent, setEditorContent] = React.useState("")
const [canRequest, setCanRequest] = React.useState(true)
const [requestCheckMessage, setRequestCheckMessage] = React.useState("")
-
- // "기타" 모드 상태를 별도로 관리
- const [isTitleOtherMode, setIsTitleOtherMode] = React.useState(false)
- const [customTitle, setCustomTitle] = React.useState("")
+ const [isCustomTitle, setIsCustomTitle] = React.useState(false)
// work의 category에 따라 기본 reviewDepartment 결정
const getDefaultReviewDepartment = () => {
@@ -132,7 +129,7 @@ export function RequestReviewDialog({
setCanRequest(result.canRequest)
setRequestCheckMessage(result.reason || "")
})
-
+
const defaultDepartment = work.category === "CP" ? "준법문의" : "법무검토"
form.setValue("reviewDepartment", defaultDepartment)
}
@@ -141,24 +138,25 @@ export function RequestReviewDialog({
// 검토부문 감시
const reviewDepartment = form.watch("reviewDepartment")
const inquiryType = form.watch("inquiryType")
- // const titleValue = form.watch("title")
+ const titleValue = form.watch("title")
// 조건부 필드 활성화 로직
const isContractTypeActive = inquiryType && ["국내계약", "해외계약", "해외자문"].includes(inquiryType)
const isDomesticContractFieldsActive = inquiryType === "국내계약"
const isFactualRelationActive = inquiryType && ["국내자문", "해외자문"].includes(inquiryType)
const isOverseasFieldsActive = inquiryType && ["해외계약", "해외자문"].includes(inquiryType)
-
+
// 제목 "기타" 선택 여부 확인
- const isTitleOther = titleValue === "기타"
+ // const isTitleOther = titleValue === "기타"
// 검토부문 변경시 관련 필드 초기화
React.useEffect(() => {
if (reviewDepartment === "준법문의") {
+ setIsCustomTitle(false)
form.setValue("inquiryType", undefined)
// 제목 초기화 (기타 상태였거나 값이 없으면 기본값으로)
const currentTitle = form.getValues("title")
- if (currentTitle === "기타" || !currentTitle || currentTitle === "GTC검토") {
+ if (!currentTitle || currentTitle === "GTC검토") {
form.setValue("title", "CP검토")
}
// 법무검토 전용 필드들 초기화
@@ -173,20 +171,14 @@ export function RequestReviewDialog({
form.setValue("shipownerOrderer", "")
form.setValue("projectType", "")
form.setValue("governingLaw", "")
-
- setIsTitleOtherMode(false) // 기타 모드 해제
- setCustomTitle("") // 커스텀 제목 초기화
-
} else {
+ setIsCustomTitle(false)
// 제목 초기화 (기타 상태였거나 값이 없으면 기본값으로)
const currentTitle = form.getValues("title")
- if (currentTitle === "기타" || !currentTitle || currentTitle === "CP검토") {
+ if (!currentTitle || currentTitle === "CP검토") {
form.setValue("title", "GTC검토")
}
form.setValue("isPublic", false)
-
- setIsTitleOtherMode(false) // 기타 모드 해제
- setCustomTitle("") // 커스텀 제목 초기화
}
}, [reviewDepartment, form])
@@ -195,7 +187,7 @@ export function RequestReviewDialog({
if (inquiryType) {
// 계약서 종류 초기화 (옵션이 달라지므로)
form.setValue("contractType", "")
-
+
// 조건에 맞지 않는 필드들 초기화
if (!isDomesticContractFieldsActive) {
form.setValue("contractCounterparty", "")
@@ -203,11 +195,11 @@ export function RequestReviewDialog({
form.setValue("contractPeriod", "")
form.setValue("contractAmount", "")
}
-
+
if (!isFactualRelationActive) {
form.setValue("factualRelation", "")
}
-
+
if (!isOverseasFieldsActive) {
form.setValue("projectNumber", "")
form.setValue("shipownerOrderer", "")
@@ -235,15 +227,15 @@ export function RequestReviewDialog({
// 폼 제출
async function onSubmit(data: RequestReviewFormValues) {
if (!work) return
-
+
console.log("Request review data:", data)
console.log("Work to review:", work)
console.log("Attachments:", attachments)
setIsSubmitting(true)
-
+
try {
const result = await requestReview(work.id, data, attachments)
-
+
if (result.success) {
toast.success(result.data?.message || `법무업무 #${work.id}에 대한 검토요청이 완료되었습니다.`)
onOpenChange(false)
@@ -263,6 +255,8 @@ export function RequestReviewDialog({
// 폼 리셋 함수
const handleReset = () => {
const defaultDepartment = getDefaultReviewDepartment()
+ setIsCustomTitle(false) // 추가
+
form.reset({
dueDate: "",
assignee: "",
@@ -274,8 +268,6 @@ export function RequestReviewDialog({
})
setAttachments([])
setEditorContent("")
- setIsTitleOtherMode(false) // 기타 모드 리셋
- setCustomTitle("") // 커스텀 제목 리셋
}
// 다이얼로그 닫기 핸들러
@@ -435,7 +427,7 @@ export function RequestReviewDialog({
</div>
<Form {...form}>
- <form
+ <form
onSubmit={form.handleSubmit(onSubmit)}
className="flex flex-col flex-1 min-h-0"
>
@@ -576,76 +568,73 @@ export function RequestReviewDialog({
/>
)}
- {/* 제목 필드 수정 */}
- <FormField
- control={form.control}
- name="title"
- render={({ field }) => (
- <FormItem>
- <FormLabel>제목</FormLabel>
- {!isTitleOtherMode ? (
- // Select 모드
- <Select
- onValueChange={(value) => {
- if (value === "기타") {
- setIsTitleOtherMode(true)
- // "기타" 상태는 유지하되 실제 값은 나중에 입력받음
- field.onChange(value)
- } else {
- field.onChange(value)
- setIsTitleOtherMode(false)
- }
- }}
- value={field.value || (reviewDepartment === "준법문의" ? "CP검토" : "GTC검토")}
- >
- <FormControl>
- <SelectTrigger>
- <SelectValue placeholder="제목 선택" />
- </SelectTrigger>
- </FormControl>
- <SelectContent>
- {getTitleOptions().map((option) => (
- <SelectItem key={option.value} value={option.value}>
- {option.label}
- </SelectItem>
- ))}
- </SelectContent>
- </Select>
- ) : (
- // Input 모드 (기타 선택시)
- <div className="space-y-2">
- <div className="flex items-center gap-2">
- <Badge variant="outline" className="text-xs">기타</Badge>
- <Button
- type="button"
- variant="ghost"
- size="sm"
- onClick={() => {
- const defaultTitle = reviewDepartment === "준법문의" ? "CP검토" : "GTC검토"
- form.setValue("title", defaultTitle)
- setIsTitleOtherMode(false)
- }}
- className="h-6 text-xs"
- >
- 선택 모드로 돌아가기
- </Button>
- </div>
- <FormControl>
- <Input
- placeholder="제목을 직접 입력하세요"
- value={field.value === "기타" ? "" : field.value}
- onChange={(e) => {
- field.onChange(e.target.value)
- }}
- autoFocus
- />
- </FormControl>
- </div>
- )}
- <FormMessage />
- </FormItem>
- )}
- />
+ {/* 제목 - 조건부 렌더링 */}
+ <FormField
+ control={form.control}
+ name="title"
+ render={({ field }) => (
+ <FormItem>
+ <FormLabel>제목</FormLabel>
+ {!isCustomTitle ? (
+ // Select 모드
+ <Select
+ onValueChange={(value) => {
+ if (value === "기타") {
+ setIsCustomTitle(true)
+ field.onChange("") // 빈 값으로 초기화
+ } else {
+ field.onChange(value)
+ }
+ }}
+ value={field.value}
+ >
+ <FormControl>
+ <SelectTrigger>
+ <SelectValue placeholder="제목 선택" />
+ </SelectTrigger>
+ </FormControl>
+ <SelectContent>
+ {getTitleOptions().map((option) => (
+ <SelectItem key={option.value} value={option.value}>
+ {option.label}
+ </SelectItem>
+ ))}
+ </SelectContent>
+ </Select>
+ ) : (
+ // Input 모드 (기타 선택시)
+ <div className="space-y-2">
+ <div className="flex items-center gap-2">
+ <Badge variant="outline" className="text-xs">기타</Badge>
+ <Button
+ type="button"
+ variant="ghost"
+ size="sm"
+ onClick={() => {
+ const defaultTitle = reviewDepartment === "준법문의" ? "CP검토" : "GTC검토"
+ form.setValue("title", defaultTitle)
+ setIsCustomTitle(false) // 상태 초기화
+ }}
+ className="h-6 text-xs"
+ >
+ 선택 모드로 돌아가기
+ </Button>
+ </div>
+ <FormControl>
+ <Input
+ placeholder="제목을 직접 입력하세요"
+ value={field.value}
+ onChange={(e) => field.onChange(e.target.value)}
+ autoFocus
+ />
+ </FormControl>
+ </div>
+ )}
+ <FormMessage />
+ </FormItem>
+ )}
+/>
+
{/* 준법문의 전용 필드들 */}
{reviewDepartment === "준법문의" && (
<FormField
@@ -931,7 +920,7 @@ export function RequestReviewDialog({
</span>
</label>
</div>
-
+
{/* 선택된 파일 목록 */}
{attachments.length > 0 && (
<div className="space-y-2">
@@ -967,8 +956,8 @@ export function RequestReviewDialog({
>
취소
</Button>
- <Button
- type="submit"
+ <Button
+ type="submit"
disabled={isSubmitting}
className="bg-blue-600 hover:bg-blue-700"
>