//import ModalSimilarPage from "@/app/(base-layout)/pages/sdmMng/sdmInfoInsert/modalSimilar/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, Label } from "@common/components/ui"; import { useSearchParams } from "next/navigation"; import { useCallback, useEffect, useState } from "react"; import { AccessibleFormField } from "./AccessibleFormField"; import { type ControllerRenderProps, type UseFormReturn, type FieldError, useWatch, } from "react-hook-form"; import SearchInputText from "../common/searhDemandInput/component"; import React from "react"; import { formatDateToYMD, sanitizeInput } from "../common/utils/utils"; import type { DemandCompType } from "@common/business_components/ui/sdmInsertForm/form"; import type { SdmInfoFormData } from "@/app/store/sdmMng"; export interface SdmInfoRegFormProps { form: UseFormReturn; onCheckboxChange?: (checked: boolean) => void; facilityName?: string; } type FieldComponent = ( field: ControllerRenderProps ) => React.ReactElement<{ disabled?: boolean }>; export function SdmInfoRegForm({ form, onCheckboxChange, facilityName, }: SdmInfoRegFormProps) { const { initializeCommonData, Sdm } = useDmStore((state) => state); const { useTypesData, defaultRules, disableRules } = Sdm; const searchParams = useSearchParams(); const [sdmNmValue, setSdmNmValue] = useState( searchParams.get("dmdCoNm") || "" ); const [frontPHdata, setFrontPHdata] = useState("0"); const [backPHdata, setBackPHdata] = useState("0"); 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(() => { console.log("candidateTitle ", form.getValues("candidateTitle")); }, [form.getValues]); useEffect(() => { if (useTypesData && useTypesData.length > 0) { setTimeout(() => { form.setValue("usePurpose", useTypesData[0]?.val?.toString() || ""); }, 500); } }, [useTypesData, form.setValue, form]); useEffect(() => { if (facilityName) { setSdmNmValue(facilityName); form.setValue("sdmNm", facilityName); setKey((prev) => prev + 1); } }, [facilityName, form.setValue, form]); useEffect(() => { if (searchParams.get("dmdCoNm")) { form.setValue("sdmNm", searchParams.get("dmdCoNm") || ""); setSdmNmValue(searchParams.get("dmdCoNm") || ""); setKey((prev) => prev + 1); } }, [searchParams, form.setValue, form]); const searchCandidate = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); const dmdInfoId = JSON.parse( sessionStorage.getItem("user") || "{}" )?.dmdInfoId?.toString(); const url = `/map/popup?dmdInfoId=${encodeURIComponent(dmdInfoId)}`; const width = window.screen.availWidth; const height = window.screen.availHeight; const left = 0; const top = 0; const popupOptions = `width=${width},height=${height},left=${left},top=${top},resizable=yes,scrollbars=yes`; window.open(url, "candidatePopup", popupOptions); }; const searchSimilarCase = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); setIsSimilarCase(true); }; const handleCheckboxChange = (checked: boolean) => { setIsBznmTotNoDisabled(checked); onCheckboxChange?.(checked); }; useEffect(() => { const watchPH = form.getValues(`ph`); if (watchPH && watchPH !== undefined) { const [frontPH, backPH] = watchPH.split("~"); if (frontPH) { setFrontPHdata(frontPH); } if (backPH) { setBackPHdata(backPH); } } else { setFrontPHdata("0"); setBackPHdata("0"); } }, [form.getValues(`ph`)]); const isSetPh = useCallback( (typePHdata: string, index: number) => { const PHdata = form.getValues("ph"); const isPH = PHdata?.split("~")[index] || ""; if (index == 0) { form.setValue("ph", `${isPH}~${typePHdata}`); setBackPHdata(typePHdata); } else if (index == 1) { form.setValue("ph", `${typePHdata}~${isPH}`); setFrontPHdata(typePHdata); } }, [form] ); const usePurpose = useWatch({ control: form.control, name: "usePurpose" }); useEffect(() => { if (!usePurpose) return; // Apply default values const defaults = defaultRules[usePurpose]; if (defaults) { Object.entries(defaults).forEach(([field, value]) => { form.setValue(field as keyof SdmInfoFormData, value, { shouldDirty: true, }); }); } }, [form.getValues("usePurpose")]); // 시설 선택시 이벤트 const selectComp = useCallback( (rtnData: DemandCompType[]) => { const rtnCompData = rtnData?.[0]; form.setValue("sdmNm", rtnCompData?.dmdCoNm || ""); }, [form] ); const formFields: Array<{ name: keyof SdmInfoFormData; 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="" //defaultMonth={field.value as Date} field={{ value: field.value as Date, onChange: (date: Date | undefined) => { field.onChange(date as Date); }, }} showOutsideDays={true} selectClass={undefined} /> */} {/* 네이티브 input */} { const selectedDate = e.target.value ? new Date(e.target.value) : null; field.onChange(selectedDate); }} value={ formatDateToYMD(field.value as Date) } />
), }, { 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: "희망단가(원)", 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: "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 candidateFields = formFields.filter( (f) => f.formIndex === 2 && f.component ); return ( <> {normalFields.map(({ name, label, component, required }) => component ? ( name === "money" ? (
{component(field)}
) : ( // {component(field)} ) } /> ) : null )}
요구수질
{ const disabledFields = usePurpose ? disableRules[usePurpose] : []; const isDisabled = disabledFields ? disabledFields.includes(field.name) : true; return (
{ const inputValue = e.target.value.replace( /[^0-9]/g, "" ); // 정수만 field.onChange( inputValue === "" ? null : Number(inputValue) ); }} value={ field.value !== undefined && field.value !== null ? `${field.value}` : "불검출" } maxLength={6} disabled={isDisabled} onBlur={field.onBlur} name={field.name} ref={field.ref} /> {/* TODO: 총대장균군수 확인 필요*/} {field.value !== null ? ( 이하 ) : ( <> )}
); }} /> { const disabledFields = usePurpose ? disableRules[usePurpose] : []; const isDisabled = disabledFields ? disabledFields.includes(field.name) : true; return (
{ const inputValue = e.target.value.replace( /[^0-9]/g, "" ); // 정수만 field.onChange( inputValue === "" ? null : Number(inputValue) ); }} value={ field.value !== undefined && field.value !== null ? `${field.value}` : "" } maxLength={6} disabled={isDisabled} onBlur={field.onBlur} name={field.name} ref={field.ref} /> 이하
); }} /> { const disabledFields = usePurpose ? disableRules[usePurpose] : []; const isDisabled = disabledFields ? disabledFields.includes(field.name) : true; return (
{ const cleanValue = sanitizeInput( e.target.value, true ); field.onChange( cleanValue === "" ? null : Number(cleanValue) ); }} value={field.value ?? ""} maxLength={6} disabled={isDisabled} onBlur={field.onBlur} name={field.name} ref={field.ref} /> 이상
); }} /> { const disabledFields = usePurpose ? disableRules[usePurpose] : []; const isDisabled = disabledFields ? disabledFields.includes(field.name) : true; return (
{ const cleanValue = sanitizeInput( e.target.value, true ); field.onChange( cleanValue === "" ? null : Number(cleanValue) ); }} value={field.value ?? ""} maxLength={6} disabled={isDisabled} onBlur={field.onBlur} name={field.name} ref={field.ref} /> 이하
); }} /> { const disabledFields = usePurpose ? disableRules[usePurpose] : []; const isDisabled = disabledFields ? disabledFields.includes(field.name) : true; return (
{ const inputValue = e.target.value.replace( /[^0-9]/g, "" ); // 정수만 field.onChange( inputValue === "" ? null : Number(inputValue) ); }} value={ field.value !== undefined && field.value !== null ? `${field.value}` : "" } maxLength={6} disabled={isDisabled} onBlur={field.onBlur} name={field.name} ref={field.ref} /> 이하
); }} />
{ const cleanValue = sanitizeInput(e.target.value, true); isSetPh(cleanValue, 1); }} value={frontPHdata ?? ""} maxLength={5} /> ~ { const cleanValue = sanitizeInput(e.target.value, true); isSetPh(cleanValue, 0); }} value={backPHdata ?? ""} maxLength={5} />
{ const disabledFields = usePurpose ? disableRules[usePurpose] : []; const isDisabled = disabledFields ? disabledFields.includes(field.name) : true; return (
{ const inputValue = e.target.value.replace( /[^0-9]/g, "" ); // 정수만 field.onChange( inputValue === "" ? null : Number(inputValue) ); }} value={ field.value !== undefined && field.value !== null ? `${field.value}` : "" } maxLength={6} disabled={isDisabled} onBlur={field.onBlur} name={field.name} ref={field.ref} /> 이하
); }} /> { const disabledFields = usePurpose ? disableRules[usePurpose] : []; const isDisabled = disabledFields ? disabledFields.includes(field.name) : true; return (
{ const inputValue = e.target.value.replace( /[^0-9]/g, "" ); // 정수만 field.onChange( inputValue === "" ? null : Number(inputValue) ); }} value={ field.value !== undefined && field.value !== null ? `${field.value}` : "" } maxLength={6} disabled={isDisabled} onBlur={field.onBlur} name={field.name} ref={field.ref} /> 이하
); }} /> { const disabledFields = usePurpose ? disableRules[usePurpose] : []; const isDisabled = disabledFields ? disabledFields.includes(field.name) : true; return ( { field.onChange(val.toString()); }} value={field.value} readOnly={isDisabled} onBlur={field.onBlur} ref={field.ref} /> ); }} /> { const disabledFields = usePurpose ? disableRules[usePurpose] : []; const isDisabled = disabledFields ? disabledFields.includes(field.name) : true; return (
{ const inputValue = e.target.value.replace( /[^0-9]/g, "" ); // 정수만 field.onChange( inputValue === "" ? null : Number(inputValue) ); }} value={ field.value !== undefined && field.value !== null ? `${field.value}` : "" } maxLength={6} disabled={isDisabled} onBlur={field.onBlur} name={field.name} ref={field.ref} /> 이하
); }} /> { const disabledFields = usePurpose ? disableRules[usePurpose] : []; const isDisabled = disabledFields ? disabledFields.includes(field.name) : true; return (
{ const inputValue = e.target.value.replace( /[^0-9]/g, "" ); // 정수만 field.onChange( inputValue === "" ? null : Number(inputValue) ); }} value={ field.value !== undefined && field.value !== null ? `${field.value}` : "" } maxLength={6} disabled={isDisabled} onBlur={field.onBlur} name={field.name} ref={field.ref} /> 이하
); }} /> { return (
{ field.onChange(e.target.value); }} value={ field.value !== undefined && field.value !== "" ? `${field.value}` : "" } onBlur={field.onBlur} name={field.name} ref={field.ref} />
); }} />
{candidateFields.map(({ name, label, component, required }, index) => component ? ( ( // // {component(field)} // )} /> ) : null )} {isSimilarCase && ( // } bodyClass="sm:max-w-[100vw] w-[1400px] h-[100dvh] max-h-[900px] overflow-y-auto overflow-x-hidden" open={isSimilarCase} onOpenChange={(open) => !open && setIsSimilarCase(false)} noHeaderYn="Y" noFooterYn="Y" /> )} ); }