/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client'; /* IMPORT */ import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card'; import { getRegEvalCriteriaWithDetails, modifyRegEvalCriteriaFixed, modifyRegEvalCriteriaVariable, } from '../service'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import { Plus, Trash2 } from 'lucide-react'; import { REG_EVAL_CRITERIA_CATEGORY, REG_EVAL_CRITERIA_CATEGORY2, REG_EVAL_CRITERIA_ITEM, type RegEvalCriteriaDetails, type RegEvalCriteria, // RegEvalCriteriaView 대신 RegEvalCriteria 사용 } from '@/db/schema'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from '@/components/ui/sheet'; import { Separator } from '@/components/ui/separator'; import { Textarea } from '@/components/ui/textarea'; import { toast } from 'sonner'; import { useForm, useFieldArray } from 'react-hook-form'; import { useEffect, useTransition } from 'react'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; // ---------------------------------------------------------------------------------------------------- /* TYPES */ const regEvalCriteriaFormSchema = z.object({ category: z.string().min(1, '평가부문은 필수 항목입니다.'), category2: z.string().min(1, '점수구분은 필수 항목입니다.'), item: z.string().min(1, '항목은 필수 항목입니다.'), classification: z.string().min(1, '구분은 필수 항목입니다.'), range: z.string().nullable().optional(), remarks: z.string().nullable().optional(), scoreType: z.enum(['fixed', 'variable']).default('fixed'), variableScoreMin: z.coerce.number().nullable().optional(), variableScoreMax: z.coerce.number().nullable().optional(), variableScoreUnit: z.string().nullable().optional(), criteriaDetails: z.array( z.object({ id: z.number().optional(), detail: z.string().optional(), scoreEquipShip: z.coerce.number().nullable().optional(), scoreEquipMarine: z.coerce.number().nullable().optional(), scoreBulkShip: z.coerce.number().nullable().optional(), scoreBulkMarine: z.coerce.number().nullable().optional(), }) ).optional(), }); type RegEvalCriteriaFormData = z.infer; interface CriteriaDetailFormProps { index: number form: any onRemove: () => void canRemove: boolean disabled?: boolean scoreType: 'fixed' | 'variable' } interface RegEvalCriteriaUpdateSheetProps { open: boolean, onOpenChange: (open: boolean) => void, criteriaData: RegEvalCriteria, // criteriaViewData → criteriaData로 변경 onSuccess: () => void, }; // ---------------------------------------------------------------------------------------------------- /* CRITERIA DETAIL FORM COPONENT */ function CriteriaDetailForm({ index, form, onRemove, canRemove, disabled = false, scoreType, }: CriteriaDetailFormProps) { return (
평가 옵션 {index + 1} {canRemove && ( )}
( )} /> ( 평가 옵션 내용