import ModalSimilarPage from "@/app/pages/sdmMng/sdmInfoInsert/modalSimilar/page"; import type { FormData } from "@/app/pages/sdmMng/sdmInfoInsert/page"; import { useDmStore } from "@/app/store"; import { CANDIDATE, DatePicker, FormField, FormLabel, FormUi, SelectBox, UiModal } from "@common/business_components"; import { Input } from "@common/components"; import { Button } from "@common/components/ui"; import { useSearchParams } from "next/navigation"; import { useCallback, useEffect, useState } from "react"; import { AccessibleFormField } from "./AccessibleFormField"; import type { ControllerRenderProps, UseFormReturn } from "react-hook-form"; import SearchInputText from "../common/searhDemandInput/component"; import type { DemandCompType } from "@/app/store/sdmMng"; export interface SdmInfoRegFormProps { form: UseFormReturn; onCheckboxChange?: (checked: boolean) => void; facilityName?: string; } type FieldComponent = (field: ControllerRenderProps) => JSX.Element; export function SdmInfoRegForm({ form, onCheckboxChange, facilityName }: SdmInfoRegFormProps) { const { initializeCommonData, Sdm } = useDmStore((state) => state); const { useTypesData } = Sdm; const searchParams = useSearchParams(); const [sdmNmValue, setSdmNmValue] = useState(searchParams.get('dmdCoNm') || ''); const [isBznmTotNoDisabled, setIsBznmTotNoDisabled] = useState(false); const [isSimilarCase, setIsSimilarCase] = useState(false); const [key, setKey] = useState(0); //모달 조회에 필요한 데이터 const [sply, setSply] = useState(0); const [usageCd, setUsageCd] = useState('청소'); const [money, setMoney] = useState(0); useEffect(() => { initializeCommonData(); }, [initializeCommonData]); useEffect(() => { if (useTypesData && useTypesData.length > 0) { setTimeout(() => { form.setValue('usePurpose', useTypesData[0]?.val?.toString() || ''); }, 500); } }, [useTypesData, form]); useEffect(() => { if (facilityName) { setSdmNmValue(facilityName); form.setValue('sdmNm', facilityName); setKey(prev => prev + 1); } }, [facilityName, form]); const searchCandidate = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); } const searchSimilarCase = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); setIsSimilarCase(true); } const handleCheckboxChange = (checked: boolean) => { setIsBznmTotNoDisabled(checked); onCheckboxChange?.(checked); }; // 시설 선택시 이벤트 const selectComp = useCallback((rtnData: DemandCompType[]) => { const rtnCompData = rtnData?.[0]; form.setValue('sdmNm', rtnCompData?.dmdCoNm || ''); }, [form]); const formFields: Array<{ name: keyof FormData; label: string; component: FieldComponent | undefined; formIndex: number; required?: boolean; }> = [ { name: "sdmNm", label: "수요처선택", formIndex: 0, required: true, component: (field) => (
{ setSdmNmValue(val || ''); field.onChange(val || ''); }} setRtnData={selectComp} initValue={facilityName || sdmNmValue} {...field} />
) }, { name: "demandYmd", label: "요구시기", formIndex: 0, required: true, component: (field) => (
{ field.onChange(date as Date); }} className="w-full" defaultMonth={field.value as Date} field={{ value: field.value as Date, onChange: (date: Date | undefined) => { field.onChange(date as Date); } }} selectClass={undefined} />
) }, { name: "demandQnty", label: "요구수량(㎥/d)", formIndex: 0, required: true, component: (field) => ( { field.onChange(e); setSply(Number(e.target.value)); }} onBlur={field.onBlur} name={field.name} ref={field.ref} /> ) }, { name: "usePurpose", label: "사용용도", formIndex: 0, required: true, component: (field) => ( { field.onChange(val.toString()); setUsageCd(val.toString()); }} className="" value={field.value as string} /> ) }, { name: "money", label: "희망단가(원/m3)", formIndex: 0, required: true, component: (field) => ( { field.onChange(e); setMoney(Number(e.target.value)); }} onBlur={field.onBlur} name={field.name} ref={field.ref} /> } /> ) }, { name: "reqWaterQlty", label: "요구수질", formIndex: 0, required: true, component: undefined }, { name: "grssClfg", label: "총대장균군수(개/100ml)", formIndex: 1, required: true, component: (field) => ( ) }, { name: "tn", label: "총질소(T-N)(mg/L)", formIndex: 1, required: true, component: (field) => ( ) }, { name: "combResdch", label: "결합잔류염소(mg/L)", formIndex: 1, required: true, component: (field) => ( ) }, { name: "tph", label: "총인(T-P)(mg/L)", formIndex: 1, required: true, component: (field) => ( ) }, { name: "trbt", label: "탁도(NTU)", formIndex: 1, required: true, component: (field) => ( ) }, { name: "ph", label: "수소이온농도(pH)", formIndex: 1, required: true, component: (field) => ( ) }, { name: "bod", label: "생물학적 산소요구량(BOD)(mg/L)", formIndex: 1, required: true, component: (field) => ( ) }, { name: "clIonQnt", label: "염화물(mgCL/L)", formIndex: 1, required: true, component: (field) => ( ) }, { name: "smll", label: "냄새", formIndex: 1, required: true, component: (field) => ( ) }, { name: "cdtnv", label: "전기전도도(㎲/cm)", formIndex: 1, required: true, component: (field) => ( ) }, { name: "crmty", label: "색도(도)", formIndex: 1, required: true, component: (field) => ( ) }, { name: "rmrk", label: "비고", formIndex: 1, required: true, component: (field) => ( ) }, { name: "candidateTitle", label: CANDIDATE || "공급처 후보지 선택(필수아님)", formIndex: 2, component: (field) => (
) }, ]; const normalFields = formFields.filter(f => f.formIndex === 0 && f.component); const groupFields = formFields.filter(f => f.formIndex === 1 && f.component); const candidateFields = formFields.filter(f => f.formIndex === 2 && f.component); return ( <> {normalFields.map(({ name, label, component, required }) => ( component ? ( ( name === 'money' ? component(field) : ( // // {component(field)} // ) )} /> ) : null ))} {groupFields.length > 0 && (
요구수질
{groupFields.map(({ name, label, component, required }) => (
( // // {component?.(field)} // )} />
))}
)} {candidateFields.map(({ name, label, component, required }, index) => ( component ? ( ( // // {component(field)} // )} /> ) : null ))} {isSimilarCase && ( } bodyClass="sm:max-w-[100vw] w-[1400px] h-[900px]" open={isSimilarCase} onOpenChange={(open) => !open && setIsSimilarCase(false)} noHeaderYn="Y" noFooterYn="Y" /> )} ); }