"use client"
import * as React from "react"
import {
AlertTriangleIcon,
CheckCircleIcon,
SendIcon,
XCircleIcon,
FileTextIcon,
ClipboardListIcon,
LoaderIcon
} from "lucide-react"
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog"
import {
Alert,
AlertDescription,
AlertTitle,
} from "@/components/ui/alert"
import { Button } from "@/components/ui/button"
import { Badge } from "@/components/ui/badge"
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
import { toast } from "sonner"
// Progress 컴포넌트 (간단한 구현)
function Progress({ value, className }: { value: number; className?: string }) {
return (
= 50 ? 'bg-blue-500' : 'bg-yellow-500'
}`}
style={{ width: `${Math.min(100, Math.max(0, value))}%` }}
/>
)
}
import {
getEvaluationSubmissionCompleteness,
updateEvaluationSubmissionStatus
} from "../service"
import type { EvaluationSubmissionWithVendor } from "../service"
interface EvaluationSubmissionDialogProps {
open: boolean
onOpenChange: (open: boolean) => void
submission: EvaluationSubmissionWithVendor | null
onSuccess: () => void
}
type CompletenessData = {
general: {
total: number
completed: number
percentage: number
isComplete: boolean
}
esg: {
total: number
completed: number
percentage: number
averageScore: number
isComplete: boolean
}
overall: {
isComplete: boolean
totalItems: number
completedItems: number
}
}
export function EvaluationSubmissionDialog({
open,
onOpenChange,
submission,
onSuccess,
}: EvaluationSubmissionDialogProps) {
const [isLoading, setIsLoading] = React.useState(false)
const [isSubmitting, setIsSubmitting] = React.useState(false)
const [completeness, setCompleteness] = React.useState
(null)
// 완성도 데이터 로딩
React.useEffect(() => {
if (open && submission?.id) {
loadCompleteness()
}
}, [open, submission?.id])
const loadCompleteness = async () => {
if (!submission?.id) return
setIsLoading(true)
try {
const data = await getEvaluationSubmissionCompleteness(submission.id)
setCompleteness(data)
} catch (error) {
console.error('Error loading completeness:', error)
toast.error('완성도 정보를 불러오는데 실패했습니다.')
} finally {
setIsLoading(false)
}
}
// 제출하기
const handleSubmit = async () => {
if (!submission?.id || !completeness) return
if (!completeness.overall.isComplete) {
toast.error('모든 평가 항목을 완료해야 제출할 수 있습니다.')
return
}
setIsSubmitting(true)
try {
await updateEvaluationSubmissionStatus(submission.id, 'submitted')
toast.success('평가가 성공적으로 제출되었습니다.')
onSuccess()
} catch (error: any) {
console.error('Error submitting evaluation:', error)
toast.error(error.message || '제출에 실패했습니다.')
} finally {
setIsSubmitting(false)
}
}
const isKorean = submission?.vendor.countryCode === 'KR'
// 조선/해양 동시 제출 안내 표시 조건: linkedEvaluations에 서로 다른 division이 2개 이상 존재할 때
const hasBothDivisions =
Array.isArray(submission?.linkedEvaluations) &&
new Set((submission?.linkedEvaluations || []).map((e: any) => e.division)).size > 1
if (isLoading) {
return (
)
}
return (
)
}