/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client'; /* IMPORT */ import { Button } from '@/components/ui/button'; import { Calendar } from '@/components/ui/calendar'; import { CalendarIcon } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle, } from '@/components/ui/card'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; import { format } from 'date-fns'; import { getProcurementManagerList, getRiskEventsById, modifyRiskEvents } from '../service'; import { ko } from 'date-fns/locale'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { RISK_ADMIN_COMMENTS_LIST, RISK_EVENT_TYPE_LIST, RISK_PROVIDER_LIST } from '@/config/risksConfig'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle, } from '@/components/ui/sheet'; import { Textarea } from '@/components/ui/textarea'; import { toast } from 'sonner'; import { type RisksView, type User } from '@/db/schema'; import { useEffect, useState, useTransition } from 'react'; import { useForm } from 'react-hook-form'; import UserComboBox from './user-combo-box'; import { z } from 'zod'; import { zodResolver } from '@hookform/resolvers/zod'; // ---------------------------------------------------------------------------------------------------- /* TYPES */ const risksUpdateFormSchema = z.object({ eventType: z.enum(RISK_EVENT_TYPE_LIST as [string, ...string[]]), provider: z.enum(RISK_PROVIDER_LIST as [string, ...string[]]), occuredAt: z.date(), content: z.string().optional(), eventStatus: z.boolean(), managerId: z.number().optional(), adminComment: z.string().optional(), }); type RisksUpdateFormData = z.infer; interface RisksUpdateSheetProps { open: boolean, onOpenChange: (open: boolean) => void, riskData: RisksView, onSuccess: () => void, }; // ---------------------------------------------------------------------------------------------------- /* RISKS UPDATE FORM SHEET COMPONENT */ function RisksUpdateSheet(props: RisksUpdateSheetProps) { const { open, onOpenChange, riskData, onSuccess, } = props; const [isPending, startTransition] = useTransition(); const form = useForm({ resolver: zodResolver(risksUpdateFormSchema), defaultValues: { eventType: '', provider: '', occuredAt: new Date(), content: '', eventStatus: true, managerId: undefined, adminComment: '', }, }); const watchEventStatus = form.watch('eventStatus'); const [selectedCommentType, setSelectedCommentType] = useState(''); const [managerList, setManagerList] = useState[]>([]); const [isLoadingManagerList, setIsLoadingManagerList] = useState(false); useEffect(() => { if (open && riskData?.id) { startTransition(async () => { try { const targetData = await getRiskEventsById(riskData.id); if (targetData) { const targetRiskEvent = targetData[0]; form.reset({ eventType: targetRiskEvent.eventType, provider: targetRiskEvent.provider, occuredAt: targetRiskEvent.occuredAt, content: targetRiskEvent.content ?? '', eventStatus: targetRiskEvent.eventStatus, managerId: targetRiskEvent.managerId || undefined, adminComment: targetRiskEvent.adminComment ?? '', }); setSelectedCommentType( RISK_ADMIN_COMMENTS_LIST.includes(targetRiskEvent.adminComment ?? '') ? targetRiskEvent.adminComment! : '기타', ); const managerList = await getProcurementManagerList(); setManagerList(managerList); } } catch (error) { console.error('Error in Loading Risk Event for Updating:', error); toast.error(error instanceof Error ? error.message : '편집할 데이터를 불러오는 데 실패했습니다.'); } finally { setIsLoadingManagerList(false); } }); } }, [open, form]); const onSubmit = async (data: RisksUpdateFormData) => { startTransition(async () => { try { const newRiskEventData = { eventType: data.eventType, provider: data.provider, occuredAt: data.occuredAt, content: data.content || null, eventStatus: data.eventStatus, managerId: !data.eventStatus ? null : data.managerId === 0 ? null : data.managerId, adminComment: !data.eventStatus ? null : data.adminComment || null, }; await modifyRiskEvents(riskData.id, newRiskEventData); toast.success('리스크 이벤트가 수정되었습니다.'); onSuccess(); onOpenChange(false); } catch (error) { console.error('Error in Saving Risk Event:', error); toast.error( error instanceof Error ? error.message : '리스크 이벤트 저장 중 오류가 발생했습니다.', ); } }) } if (!open) { return null; } return ( 리스크 정보 관리 리스크 정보를 수정할 수 있습니다.
기본 정보
( 항목 )} /> ( 신용평가사 )} /> ( 발생일자 field.onChange(date || undefined)} locale={ko} /> )} />
( 상세 내용