import ModalSimilarPage from "@/app/(base-layout)/pages/sdmMng/sdmInfoInsert/modalSimilar/page"; import type { FormData } from "@/app/(base-layout)/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"; import NewWindowPortal from "@/app/(popup-layout)/map/popup/windowPotal"; import Map from "@/app/(popup-layout)/map/popup/sdmInfoMap"; 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 [isCandidatePopup, setIsCandidatePopup] = useState(false); //모달 조회에 필요한 데이터 const [sply, setSply] = useState(0); const [usageCd, setUsageCd] = useState("청소"); const [money, setMoney] = useState(0); useEffect(() => { initializeCommonData(); }, [initializeCommonData]); useEffect(() =>{ console.log('candidateTitle ', form.getValues("candidateTitle")) },[form.getValues("candidateTitle") ]) 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]); useEffect(() => { if (searchParams.get("dmdCoNm")) { form.setValue("sdmNm", searchParams.get("dmdCoNm") || ""); setSdmNmValue(searchParams.get("dmdCoNm") || ""); setKey((prev) => prev + 1); } }, [searchParams, form]); const handleCandidateClose = useCallback( () => setIsCandidatePopup(false), [] ); const searchCandidate = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); //setIsCandidatePopup(true); const popupOptions = `width=1920,height=1080,resizable='y',scrollbars='y'`; window.open("/map/popup", "candidatePopup", popupOptions); }; 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, component: (field) => ( ), }, { name: "candidateTitle", label: CANDIDATE || "공급처 후보지 선택(필수아님)", formIndex: 2, component: () => (
{(form.getValues("candidateTitle") || []).map((candidate: any, index: number) => ( ))}
), }, ]; 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" /> )} ); }