물재이용 31번까지 수정

This commit is contained in:
leedj312
2025-07-01 20:27:20 +09:00
parent 33365348ef
commit 7ea2521a93
12 changed files with 418 additions and 225 deletions
+12 -9
View File
@@ -77,15 +77,18 @@ export default function CoSttn() {
}, [coSttn.isInit, coSttnInit]);
useEffect(() => {
if (coSttnRes?.length > 0 && code.cityCd.length > 0) {
const data = tableData(coSttnRes, { code });
const chData = data.map((item: any) => ({
...item,
}));
// .filter((item: any) => item !== undefined);
setBdstTable(chData);
} else if (coSttnRes.length == 0) {
setBdstTable([]);
if(coSttnRes){
if (coSttnRes?.length > 0 && code.cityCd.length > 0) {
const data = tableData(coSttnRes, { code });
const chData = data.map((item: any) => ({
...item,
}));
// .filter((item: any) => item !== undefined);
setBdstTable(chData);
} else if (coSttnRes?.length == 0) {
setBdstTable([]);
}
}
}, [coSttnRes, code]);
@@ -158,7 +158,7 @@ export default function Home() {
</div>
</div>
<UiModal
body={<BdstReg moType="RNB"></BdstReg>}
body={<BdstReg moType="RNB" isModal={issNewReg} setIsModal={setIsNewReg} ></BdstReg>}
bodyClass="w-[68vw] max-w-none h-[90vh]"
open={issNewReg}
onOpenChange={(open) => {
+27 -2
View File
@@ -9,7 +9,26 @@ const yn: SelectDataType[] = [
{ val: 'Y', text: 'Y' },
{ val: 'N', text: 'N' },
]
const bdstFilterYn: SelectDataType[] = [
{ val: 'Y', text: 'Y' },
{ val: 'N', text: 'N' },
{ val: 'D', text: '확인불가' },
{ val: 'F', text: '미가동' },
]
// 최우수(그린1)/우수(그린2), 우량(그린3), 일반(그린4), 확인불가 체크
const bdstGrntchClass: SelectDataType[] = [
{ val: '최우수(그린1)', text: '최우수(그린1)' },
{ val: '우수(그린2)', text: '우수(그린2)' },
{ val: '우량(그린3)', text: '우량(그린3)' },
{ val: '일반(그린4)', text: '일반(그린4)' },
{ val: '확인불가', text: '확인불가' },
]
const bdstIncenYn: SelectDataType[] = [
{ val: 'Y', text: 'Y' },
{ val: 'N', text: 'N' },
{ val: 'D', text: '확인불가' },
]
//처리장연계/자체+연계/자체처리
const erctUswtrPrcsMeth : SelectDataType[]= [
{ val: '처리장연계', text: '처리장연계' },
@@ -204,6 +223,9 @@ export type comCodeState = {
ruseBizMthdCd: SelectDataType[];
rusePrcsMthdCd: SelectDataType[];
erctUswtrPrcsMeth: SelectDataType[];
bdstFilterYn: SelectDataType[];
bdstIncenYn: SelectDataType[];
bdstGrntchClass:SelectDataType[];
};
};
@@ -217,7 +239,7 @@ export const getSggCd = async (set: any) => {
})); */
const sggCd = [
{ text: "전체", val: '0' },
// { text: "전체", val: '0' },
...sgg
.map((item: any) => ({
text: item.gugun || '',
@@ -356,7 +378,10 @@ export const comCodeStateExport: comCodeState = {
ruseSeCd:ruseSeCd,
ruseBizMthdCd: ruseBizMthdCd,
rusePrcsMthdCd:rusePrcsMthdCd,
erctUswtrPrcsMeth:erctUswtrPrcsMeth
erctUswtrPrcsMeth:erctUswtrPrcsMeth,
bdstFilterYn:bdstFilterYn,
bdstIncenYn:bdstIncenYn,
bdstGrntchClass:bdstGrntchClass
},
};
@@ -10,7 +10,7 @@ export const TEST_UUID= '2d4b151d-1828-41e0-91d9-4cd28ea1cc7e'
const rainyObjSchema = z.object({
bdstReuseFcltFk: z.number().nullish(),
pntfColKnd: z.string().min(1, { message: validationMessages.requiredSelect("종류") }),
pntfColArea: z.number().positive({ message: validationMessages.required("면적(m³)") }),
pntfColArea: z.number().nullish() ,
dtfcltCpct: z.number().default(0),
filtrTrtmfctYn: z.string().default("Y"),
filtrTrtmfctCpct: z.number().nullish().default(0),
@@ -162,29 +162,27 @@ export const rainFacActionsExport: (set: any) => rainFacSActions = (
const test =await makeRstr(data);
const res = await postFectch("/reuseFc/rainyInfo", test);
if(res.ok){
if(res.status===200){
if(data.chgBuilding.length > 0){
await res.json().then((resData: any) => {
const chPK = resData?.data?.bdstInfoPk
const makeCh= resData.data.chgBuilding.map((item: chgBuilding) =>
const chPK = res?.data?.bdstInfoPk
const makeCh= res.data.chgBuilding.map((item: chgBuilding) =>
( {
...item,
bdstInfoFk: chPK,
})
);
const chch= postFectch("/reuseFc/chgBuilding", makeCh);
return chch;
}).then((chch: any) => {
console.log('chch ', chch)
const chch= await postFectch("/reuseFc/chgBuilding", makeCh);
if(chch.status ===200) {
toast.success("등록이 완료되었습니다.");
toast.success("건축물 등록이 완료되었습니다.");
}else{
toast.error("건축물 증축/개축/중축 오류입니다.");
}
})
}else{
toast.success("등록이 완료되었습니다.");
toast.success("건축물 등록이 완료되었습니다.");
}
}else{
toast.error("건축물 등록이 완료되었습니다.");
}
const rainRes = await initFetch(code);
set((state: rainFacState) => ({
@@ -197,7 +195,7 @@ export const rainFacActionsExport: (set: any) => rainFacSActions = (
}));
} catch (e) {
console.log("e", e);
alert("등록 오류입니다.");
toast.error("등록시 오류가 발생하였습니다.");
} finally {
}
},
@@ -205,9 +203,9 @@ export const rainFacActionsExport: (set: any) => rainFacSActions = (
try {
const chData =await makeMdfr(data);
const res = await putFectch("/reuseFc/rainyInfo", chData);
console.log('rainUpdate', res);
if(res.ok){
alert(" 수정이 완료되었습니다.")
if(res.status === 200){
toast.success("수정이 완료되었습니다.");
}
const rainRes = await initFetch(code);
set((state: rainFacState) => ({
@@ -220,7 +218,7 @@ export const rainFacActionsExport: (set: any) => rainFacSActions = (
}));
} catch (e) {
console.log("e", e);
alert("업데이트 오류입니다.");
toast.error("수정시 오류가 발생하였습니다.");
} finally {
}
}
@@ -17,19 +17,28 @@ export const baseReuseBuildingSchema = z.object({
instlCstSprtYn: z.string().default("Y"),
instlCstSprtAmt: z.number().nullish(),
grntchBdstCertYn: z.string().default("Y"),
grntchBdstCertYr: z.string().default("").refine(
grntchBdstCertYr: z
.string()
.max(4, { message: validationMessages.yearFormat })
.refine(
(year) => year.length === 0 || /^\d{4}$/.test(year),
{
message: validationMessages.yearFormat,
}
),
)
.nullish(),
grntchBdstCertNo: z.string().default(""),
grntchBdstCertGrd: z.string().default(""),
crgRdctYn: z.string().default("N").nullish(), /// 안쓰는 값
crgRdctBss: z.string().default("").nullish(), /// 안쓰는 값
crgRdctAmt: z.number().default(0), // 안쓰는 값
ruseFcltFlg: z.string().default(""),
bdstUsgCd: z.number().min(1, { message: validationMessages.requiredSelect("건축물용도") }).default(0),
bdstUsgCd: z
.number()
.default(0)
.refine((val) => val === -1 || val >= 1, {
message: validationMessages.requiredSelect("건축물용도"),
}),
lawTrgtYn: z.string().default("Y"),
rgtr: z.string().nullish(),
mdfr: z.string().nullish(),
+24 -3
View File
@@ -9,12 +9,22 @@ import {
import type { RefObject } from "react";
export const getCity = (val: string, sggCd: SelectDataType[]) => {
const data = sggCd
.filter((item) => String(item.val).substring(0, 2) === val)
let data:any
if(val !=='0'){
data = sggCd
.filter((item) => String(item.val).substring(0, 2) === val)
.map((item) => ({
val: item.val,
text: item.text, // 한국어 텍스트
}));
}else{
data = sggCd
.map((item) => ({
val: item.val,
text: item.text, // 한국어 텍스트
}));
}
data.unshift({ val: "0", text: "전체" });
return data;
};
@@ -103,7 +113,18 @@ export const handleCommaNumberChange = (
) => {
const raw = e.target.value.replace(/,/g, "");
if (!/^\d*$/.test(raw)) return;
onChange(raw === "" ? "" : Number(raw));
onChange(raw === "" ? "" : Number(raw));
};
// onchange 텍스트를 숫자로 and ,제거
export const handleMinusNumberChange = (
e: React.ChangeEvent<HTMLInputElement>,
onChange: (value: number | "") => void
) => {
const raw = e.target.value.replace(/,/g, "");
if (!/^\d*$/.test(raw)) return;
onChange(raw === "" ? -1 : Number(raw));
};
// 숫자입력시 , 삽입
@@ -16,8 +16,7 @@ import {
type SelectDataType,
} from "@common/business_components";
import { Button, Checkbox, Input } from "@common/components";
import { Check } from "lucide-react";
import { useEffect, useRef, useState } from "react";
import { useEffect, useState } from "react";
import { useFieldArray } from "react-hook-form";
export default function BdstReg({ form }: { form: any }) {
@@ -37,12 +36,6 @@ export default function BdstReg({ form }: { form: any }) {
bdstUsgCd: "",
});
};
// 잠깐 주석처리
// const removeLastItem = () => {
// if (fields.length > 0) {
// remove(fields.length - 1);
// }
// };
const removeSelected = () => {
const idxsToRemove = fields
.map((item, idx) => selectedIds.includes(item.id) ? idx : -1)
@@ -100,7 +93,7 @@ export default function BdstReg({ form }: { form: any }) {
return (
<>
<h1 className={formH1Class}>
건축물 시설 정보
건축물 기본 정보
</h1>
<div className="grid grid-cols-6 gap-2 mt-4">
<div className="col-span-3">
@@ -155,7 +148,7 @@ export default function BdstReg({ form }: { form: any }) {
<FormUi label="건축물명">
<Input
className={selectClass}
placeholder="1,000,000"
placeholder="건축물 명 입력하세요"
type="text"
{...field}
/>
@@ -168,10 +161,10 @@ export default function BdstReg({ form }: { form: any }) {
control={form.control}
name="daddr"
render={({ field }) => (
<FormUi label="위치">
<FormUi label="건축물 주소">
<Input
className={selectClass}
placeholder=""
placeholder="위치를 입력해주세요"
type="search"
{...field}
/>
@@ -225,7 +218,7 @@ export default function BdstReg({ form }: { form: any }) {
<FormUi label="건축면적(m³)">
<Input
className={selectClass}
placeholder="1,000,000"
placeholder="면적을 입력하세요"
type="text"
onChange={(e) => {
handleCommaNumberChange(e, field.onChange);
@@ -324,8 +317,8 @@ export default function BdstReg({ form }: { form: any }) {
<Input
placeholder="-"
type="text"
onChange={e => handleCommaNumberChange(e, f.onChange)}
value={formatCommaNumber(f.value)}
onChange={e => f.onChange}
value={f.value}
className={selectClass}
/>
</FormUi>
@@ -30,7 +30,11 @@ import { Button, DataTable, Input, Label } from "@common/components";
import { useEffect, useRef, useState } from "react";
import { useFieldArray, useForm, type UseFormReturn } from "react-hook-form";
import MngRegFormDetail from "../mngReg/mngRegFormDetail/mngRegFormDetail";
import { safeDate } from "@/components/lib/func/commom";
import {
formatCommaNumber,
handleCommaNumberChange,
safeDate,
} from "@/components/lib/func/commom";
import SearchInputText from "@/components/ui/searchInput/searchInput";
import SdmInsertForm from "@common/business_components/ui/sdmInsertForm";
import type { DemandCompType } from "@common/business_components/ui/sdmInsertForm/form";
@@ -82,54 +86,57 @@ export function PbnstBuseForm({
}>({ isMoal: false, data: {} as DemandCompType });
useEffect(() => {
const etc= isNaN(Number(form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.etc`)))
const etc = isNaN(
Number(form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.etc`))
);
let total =
(form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.gvsbs`) ?? 0) +
(form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.lcep`) ?? 0) +
(form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.cusrAlotm`) ?? 0)
if( !etc ) {
total+=Number(form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.etc`))
}
(form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.cusrAlotm`) ?? 0);
if (!etc) {
total += Number(
form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.etc`)
);
}
form.setValue(`items.${indexMng}.fcBizs.${indexBiz}.totalMoney`, total);
}, [
form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.gvsbs`),
form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.lcep`),
form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.cusrAlotm`),
form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.etc`)
form.getValues(`items.${indexMng}.fcBizs.${indexBiz}.etc`),
]);
const fcOrgwts = form.watch(`items.${indexMng}.fcBizs.${indexBiz}.fcOrgwts`);
const fcOrgwts = form.watch( `items.${indexMng}.fcBizs.${indexBiz}.fcOrgwts`)
useEffect(() =>{
console.log('fcOrgwts ', fcOrgwts)
if(fcOrgwts&&fcOrgwts?.length>0){
useEffect(() => {
console.log("fcOrgwts ", fcOrgwts);
if (fcOrgwts && fcOrgwts?.length > 0) {
const swtrmtFcltFkList = fcOrgwts.map((item) => item.swtrmtFcltFk);
console.log('swtrmtFcltFkList ', swtrmtFcltFkList)
console.log("swtrmtFcltFkList ", swtrmtFcltFkList);
if(swtrmtFcltFkList.length > 0){
getFcOrgwts(swtrmtFcltFkList.filter((item): item is string => item != null), fcOrgwts?.length)
if (swtrmtFcltFkList.length > 0) {
getFcOrgwts(
swtrmtFcltFkList.filter((item): item is string => item != null),
fcOrgwts?.length
);
}
}
},[fcOrgwts])
useEffect(() =>{
}, [fcOrgwts]);
useEffect(() => {
if (fcOrgwtsNmList && fcOrgwtsNmList.length > 0) {
console.log('fcOrgwtsNmList ', fcOrgwtsNmList)
console.log('fcOrgwts ', fcOrgwts)
console.log("fcOrgwtsNmList ", fcOrgwtsNmList);
console.log("fcOrgwts ", fcOrgwts);
fcOrgwts?.forEach((item, index) => {
const orgwtNm = fcOrgwtsNmList.find(
(orgwt) => orgwt.bscFctCd === item.swtrmtFcltFk
)?.bscFctNm;
console.log('orgwtNm ', orgwtNm)
console.log("orgwtNm ", orgwtNm);
if (orgwtNm) {
form.setValue(
`items.${indexMng}.fcBizs.${indexBiz}.fcOrgwts.${index}.ruseUtztnFcltNm`,
@@ -137,10 +144,8 @@ export function PbnstBuseForm({
);
}
});
}
},[fcOrgwtsNmList,fcOrgwts])
}
}, [fcOrgwtsNmList, fcOrgwts]);
// fcBizs 데이터가 변경될 때마다 차수 선택 목록을 업데이트합니다.
useEffect(() => {
@@ -294,7 +299,6 @@ export function PbnstBuseForm({
setSumCpct(sum);
}, [form.formState, indexMng, indexBiz]);
const pbnstBiz = form.watch(`items.${indexMng}.fcBizs`);
return (
<>
@@ -527,7 +531,9 @@ export function PbnstBuseForm({
).map((field, index) => (
<div
key={`fcDemands-${indexMng}-${indexBiz}=${index}`} // 이게 핵심!
className="grid grid-cols-12 gap-4 mt-3"
className="grid grid-cols-12 gap-4 mt-3
border-b border-gray-400 pb-3
"
>
<div key={index + "keySon1"} className="col-span-4">
<FormField
@@ -661,11 +667,11 @@ export function PbnstBuseForm({
<FormUi label="(계약)공급량(m3/일)">
<Input
placeholder=""
type="number"
value={f.value ?? 0}
type="text"
onChange={(e) => {
f.onChange(Number(e.target.value));
handleCommaNumberChange(e, f.onChange);
}}
value={formatCommaNumber(f.value)}
/>
</FormUi>
)}
@@ -691,7 +697,6 @@ export function PbnstBuseForm({
)}
/>
</div>
<br></br>
</div>
))}
</div>
@@ -97,7 +97,7 @@ export default function MngRegFormDetail({
: []
}
onSelectValue={field.onChange}
value={field.value.trim()}
value={field.value?.trim() ??""}
readOnly={formHead.option === "readOnly"}
/>
);
@@ -4,29 +4,38 @@ import { useWrStore } from "@/app/store";
import {
rainZod,
selectClass,
type customRainBdst
type customRainBdst,
} from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import { formH1Class, formH2Class } from "@/components/lib/class/comClass";
import {
formatCommaNumber,
handleCommaNumberChange,
handleMinusNumberChange,
} from "@/components/lib/func/commom";
import { DatePicker, FormUi } from "@common/business_components";
import { Form, FormField, SelectBox } from "@common/business_components/ui";
import { Button, Input } from "@common/components/ui";
import {
Form,
FormField,
FormLabel,
SelectBox,
} from "@common/business_components/ui";
import { Button, Checkbox, Input, Label } from "@common/components/ui";
import { zodResolver } from "@hookform/resolvers/zod";
import { useEffect } from "react";
import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";
import { z } from "zod";
import BdstReg from "../bdstReg/bdstReg";
import toast from "react-hot-toast";
export default function RainRegForm({
rainForm,
isModal,
readonly = false
readonly = false,
setIsModal
}: {
rainForm: customRainBdst;
isModal: boolean;
setIsModal?:(modal:boolean) => void
readonly?: boolean;
}) {
const { code, rainBdstReg, rainBdstUpdate, rain } = useWrStore(
@@ -38,6 +47,7 @@ export default function RainRegForm({
resolver: zodResolver(rainZod),
defaultValues: defaultValues,
});
const instlCst = form.watch(`reuseBuilding.0.instlCst`);
const [grntchBdstCertYn, instlCstSprtYn, filtrTrtmfctYn] = form.watch([
"reuseBuilding.0.grntchBdstCertYn",
@@ -69,7 +79,7 @@ export default function RainRegForm({
? item?.grntchBdstCertYr
: "", // null → ""
instlCstSprtYn: item?.instlCstSprtYn ?? "Y", // null → "Y"
grntchBdstCertYn:item?.grntchBdstCertYn??"Y",
grntchBdstCertYn: item?.grntchBdstCertYn ?? "Y",
rainyObj: {
...item?.rainyObj,
filtrTrtmfctYn: item?.rainyObj?.filtrTrtmfctYn ?? "Y",
@@ -79,7 +89,6 @@ export default function RainRegForm({
};
useEffect(() => {
if (grntchBdstCertYn === "N") {
form.setValue("reuseBuilding.0.grntchBdstCertYr", "");
form.setValue("reuseBuilding.0.grntchBdstCertNo", "");
@@ -90,15 +99,25 @@ export default function RainRegForm({
form.setValue("reuseBuilding.0.rainyObj.filtrTrtmfctCpct", 0);
form.setValue("reuseBuilding.0.rainyObj.filtrTrtmfctPrs", "");
}
if(grntchBdstCertYn === "D") {
form.setValue("reuseBuilding.0.grntchBdstCertYr", "0000");
form.setValue("reuseBuilding.0.grntchBdstCertNo", "확인불가");
form.setValue("reuseBuilding.0.grntchBdstCertGrd", "확인불가");
}else if (instlCstSprtYn === "D") {
form.setValue("reuseBuilding.0.instlCstSprtAmt", -1);
} else if (filtrTrtmfctYn === "D") {
form.setValue("reuseBuilding.0.rainyObj.filtrTrtmfctCpct", -1);
form.setValue("reuseBuilding.0.rainyObj.filtrTrtmfctPrs", "확인불가");
}
}, [grntchBdstCertYn, instlCstSprtYn, filtrTrtmfctYn]);
const [regCtpvCd , regSggcd] = form.watch(['ctpvCd','sggCd'])
// form 값이 변경될 때마다 로그 출력
useEffect(() => {
const subscription = form.watch((value) => {
});
const subscription = form.watch((value) => {});
return () => subscription.unsubscribe();
}, [form]);
@@ -108,7 +127,15 @@ export default function RainRegForm({
const onSubmit = (values: z.infer<typeof rainZod>) => {
if (isModal) {
rainBdstReg(values, "41");
const data = regCtpvCd?regCtpvCd:regSggcd?regSggcd:'noCd'
if(data ==='noCd'){
toast.error("시도/시군구 코드를 선택해야합니다.");
return
}
rainBdstReg(values, data);
setIsModal(false)
} else {
rainBdstUpdate(values, "41");
}
@@ -125,10 +152,14 @@ export default function RainRegForm({
<div>
<div className="grid grid-cols-12 flex items-center card-header">
<h1 className="text-2xl font-medium text-label col-span-10">
{isModal ? "건축물 운영정보" : "빗물이용시설 정보"}
{isModal ? "건축물 정보" : "빗물이용시설 정보"}
</h1>
{!readonly && (
<Button type="submit" className="col-start-12 col-span-1" size={"sm"}>
<Button
type="submit"
className="col-start-12 col-span-1"
size={"sm"}
>
저장
</Button>
)}
@@ -142,12 +173,9 @@ export default function RainRegForm({
) : (
<></>
)}
<h1 className={formH1Class}>
기본정보
</h1>
<div className="grid grid-cols-4 gap-2 mt-4">
<div className="col-span-2">
<h1 className={formH1Class}>기본정보</h1>
<div className="grid grid-cols-6 gap-2 mt-4">
<div className="col-span-3">
<FormField
control={form.control}
name="reuseBuilding.0.instlCmptnDt"
@@ -160,7 +188,8 @@ export default function RainRegForm({
field.value && !isNaN(new Date(field.value).getTime())
? new Date(field.value)
: new Date(),
onChange: (date: Date | undefined) => field.onChange(date),
onChange: (date: Date | undefined) =>
field.onChange(date),
}}
selectClass={"w-full"}
readOnly={readonly}
@@ -170,48 +199,95 @@ export default function RainRegForm({
/>
</div>
<div className="col-span-2">
<div className="col-span-3">
<FormField
control={form.control}
name="reuseBuilding.0.instlCst"
render={({ field }) => (
<FormUi label="설치비">
<Input
className={selectClass}
placeholder="1,000,000"
type="text"
onChange={(e) => {
if (!readonly) handleCommaNumberChange(e, field.onChange);
}}
value={formatCommaNumber(field.value)}
readOnly={readonly}
/>
</FormUi>
)}
name={`reuseBuilding.0.instlCst`}
render={({ field }) => {
const value = field.value;
const isUnknown = value === null || value === -1; // 또는 Number(value) === -1
return (
<div className="flex items-center gap-2">
<FormUi label="설치비(원)">
<Input
placeholder="1,000,000"
type="text"
className={selectClass}
readOnly={readonly }
value={
isUnknown ? "확인불가" : formatCommaNumber(value)
}
onFocus={() => {
// 입력 시 자동으로 확인불가 해제
if (isUnknown && !readonly) {
field.onChange(""); // 초기화
}
}}
onChange={(e) => {
if (readonly ) return;
handleMinusNumberChange(e, field.onChange);
}}
/>
</FormUi>
</div>
);
}}
/>
</div>
</div>
<div className="">
<h1 className={formH1Class}>
빗물이용시설 정보
</h1>
<h1 className={formH1Class}>빗물이용시설 정보</h1>
</div>
<div>
<h2 className={formH2Class}>집수면</h2>
<h2 className={formH2Class}>집수면 및 저류조</h2>
</div>
<div className="grid grid-cols-10 gap-4 mt-4 ">
<div className="col-span-5">
<div className="grid grid-cols-12 gap-4 mt-4 ">
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.dtfcltCpct"
render={({ field }) =>
{
const isUnknown = field.value === null || field.value === -1; // 또는 Number(value) === -1
return (
<FormUi label="저류조 용량(m³)">
<Input
className={selectClass}
placeholder="1,000,000"
type="text"
value={
isUnknown ? "확인불가" : formatCommaNumber(field.value)
}
onFocus={() => {
// 입력 시 자동으로 확인불가 해제
if (isUnknown && !readonly) {
field.onChange(""); // 초기화
}
}}
onChange={(e) => {
if (readonly ) return;
handleMinusNumberChange(e, field.onChange);
}}
readOnly={readonly}
/>
</FormUi>
)
}}
/>
</div>
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.pntfColKnd"
render={({ field }) => (
<FormUi label="종류">
<FormUi label="집수면 종류">
<SelectBox
className={""}
selectClass={selectClass}
label={""}
selectArray={rainFcltCd}
onSelectValue={readonly ? () => { } : field.onChange}
onSelectValue={readonly ? () => {} : field.onChange}
value={field.value ?? rainFcltCd[0]?.val}
readOnly={readonly}
/>
@@ -219,24 +295,40 @@ export default function RainRegForm({
)}
/>
</div>
<div className="col-span-5">
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.pntfColArea"
render={({ field }) => (
<FormUi label="면적(m³)">
<Input
className={selectClass}
placeholder="1,000,000"
type="text"
onChange={(e) => {
if (!readonly) handleCommaNumberChange(e, field.onChange);
}}
value={formatCommaNumber(field.value)}
readOnly={readonly}
/>
</FormUi>
)}
render={({ field }) => {
const value = field.value;
const isUnknown = value === null || value === -1; // 또는 Number(value) === -1
return (
<div className="flex items-center gap-2">
<FormUi label="집수면 용량(m³)">
<Input
className={selectClass}
placeholder="1,000,000"
type="text"
value={
isUnknown ? "확인불가" : formatCommaNumber(value)
}
onFocus={() => {
// 입력 시 자동으로 확인불가 해제
if (isUnknown && !readonly) {
field.onChange(""); // 초기화
}
}}
onChange={(e) => {
if (readonly ) return;
handleMinusNumberChange(e, field.onChange);
}}
readOnly={readonly}
/>
</FormUi>
</div>
);
}}
/>
</div>
</div>
@@ -255,8 +347,8 @@ export default function RainRegForm({
className={""}
selectClass={selectClass}
label={""}
selectArray={code.yn}
onSelectValue={readonly ? () => { } : field.onChange}
selectArray={code.bdstFilterYn}
onSelectValue={readonly ? () => {} : field.onChange}
value={field.value ?? code.yn[0]?.val}
readOnly={readonly}
/>
@@ -268,47 +360,68 @@ export default function RainRegForm({
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.filtrTrtmfctCpct"
render={({ field }) => (
render={({ field }) =>
{
const isUnknown = field.value === null || field.value === -1; // 또는 Number(value) === -1
return(
<FormUi label="용량(m³/일)">
<Input
className={selectClass}
placeholder="1,000,000"
type="text"
onChange={(e) => {
if (!readonly) handleCommaNumberChange(e, field.onChange);
value={
isUnknown ? "확인불가" : formatCommaNumber(field.value)
}
onFocus={() => {
// 입력 시 자동으로 확인불가 해제
if (isUnknown && !readonly) {
field.onChange(""); // 초기화
}
}}
value={formatCommaNumber(field.value)}
readOnly={readonly }
onChange={(e) => {
if (readonly ) return;
handleMinusNumberChange(e, field.onChange);
}}
readOnly={readonly}
disabled={filtrTrtmfctYn !== "Y"}
/>
</FormUi>
)}
)
}}
/>
</div>
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.filtrTrtmfctPrs"
render={({ field }) => (
<FormUi label="처리공정">
<Input
className={selectClass}
placeholder=""
type="text"
value={field.value ?? ""}
onChange={field.onChange}
readOnly={readonly }
disabled={filtrTrtmfctYn !== "Y"}
/>
</FormUi>
)}
render={({ field }) => {
const value = field.value;
const isUnknown = value === null || value === "-"; // 또는 Number(value) === -1
return (
<div className="flex items-center gap-2">
<FormUi label="처리공정">
<Input
className={' h-full !text-xl col-span-4' }
placeholder="처리공정 입력"
type="text"
value={field.value ?? ""}
onChange={field.onChange}
readOnly={readonly}
disabled={filtrTrtmfctYn !== "Y"}
/>
</FormUi>
</div>
);
}}
/>
</div>
</div>
<div className=" my-2">
<h1 className={formH1Class}>
인센티브 정보
</h1>
<h1 className={formH1Class}>인센티브 정보</h1>
</div>
<div>
<h2 className={formH2Class}>설치비 지원</h2>
@@ -324,8 +437,8 @@ export default function RainRegForm({
className={""}
selectClass={selectClass}
label={""}
selectArray={code.yn}
onSelectValue={readonly ? () => { } : field.onChange}
selectArray={code.bdstIncenYn}
onSelectValue={readonly ? () => {} : field.onChange}
value={field.value ?? code.yn[0]?.val}
readOnly={readonly}
/>
@@ -337,24 +450,38 @@ export default function RainRegForm({
<FormField
control={form.control}
name="reuseBuilding.0.instlCstSprtAmt"
render={({ field }) => (
<FormUi label="지원금액(원)">
<Input
className={selectClass}
placeholder="1,000,000"
type="text"
onChange={(e) => {
if (!readonly) handleCommaNumberChange(e, field.onChange);
render={({ field }) =>
{
const value = field.value;
const isUnknown = value === null || value === -1; // 또는 Number(value) === -1
return (
<FormUi label="지원금액(원)">
<Input
className={selectClass}
placeholder=""
type="text"
readOnly={readonly || isUnknown}
value={
isUnknown ? "확인불가" : formatCommaNumber(value)
}
onFocus={() => {
// 입력 시 자동으로 확인불가 해제
if (isUnknown && !readonly) {
field.onChange(""); // 초기화
}
}}
value={formatCommaNumber(field.value)}
readOnly={instlCstSprtYn !== "Y"}
/>
</FormUi>
)}
onChange={(e) => {
if (readonly ) return;
handleMinusNumberChange(e, field.onChange);
}}
disabled={instlCstSprtYn !== "Y"}
/>
</FormUi>
)}
}
/>
</div>
</div>
<div>
<h2 className={formH2Class}>녹색건축물 인증</h2>
</div>
@@ -369,8 +496,8 @@ export default function RainRegForm({
className={""}
selectClass={selectClass}
label={""}
selectArray={code.yn}
onSelectValue={readonly ? () => { } : field.onChange}
selectArray={code.bdstIncenYn}
onSelectValue={readonly ? () => {} : field.onChange}
value={field.value ?? code.yn[0]?.val}
/>
</FormUi>
@@ -381,20 +508,38 @@ export default function RainRegForm({
<FormField
control={form.control}
name="reuseBuilding.0.grntchBdstCertYr"
render={({ field }) => (
<FormUi label="인증년도">
<Input
className={selectClass}
placeholder="2024"
type=""
value={field.value ?? ""}
onChange={(e) => {
if (!readonly) field.onChange(e);
}}
readOnly={grntchBdstCertYn !== "Y"}
/>
</FormUi>
)}
render={({ field }) =>
{
const isUnknown = field.value === null || field.value === "0000"; // 또는 Number(value) === -1
return (
<FormUi label="인증년도">
<Input
className={selectClass}
placeholder="2024"
type=""
onFocus={() => {
// 입력 시 자동으로 확인불가 해제
if (isUnknown && !readonly) {
field.onChange(""); // 초기화
}
}}
value={
isUnknown?'확인불가':field.value ?? ""}
onChange={(e) => {
if (readonly) return
if (e.target.value === '확인불가') {
field.onChange('0000');
}else{
field.onChange(e.target.value);
}
}}
disabled={grntchBdstCertYn !== "Y"}
/>
</FormUi>
)}
}
/>
</div>
<div className="col-span-3 ">
@@ -411,7 +556,7 @@ export default function RainRegForm({
onChange={(e) => {
if (!readonly) field.onChange(e);
}}
readOnly={grntchBdstCertYn !== "Y"}
disabled={grntchBdstCertYn !== "Y"}
/>
</FormUi>
)}
@@ -423,15 +568,14 @@ export default function RainRegForm({
name="reuseBuilding.0.grntchBdstCertGrd"
render={({ field }) => (
<FormUi label="인증등급">
<Input
className={selectClass}
placeholder="A"
type=""
value={field.value ?? ""}
onChange={(e) => {
if (!readonly) field.onChange(e);
}}
readOnly={grntchBdstCertYn !== "Y"}
<SelectBox
className={""}
selectClass={selectClass}
label={""}
selectArray={code.bdstGrntchClass}
onSelectValue={readonly ? () => {} : field.onChange}
value={field.value ?? code.bdstGrntchClass[0]?.val}
readOnly={readonly}
/>
</FormUi>
)}
@@ -29,10 +29,11 @@ export type objSearchType = {
interface BdstRegProps<T extends MoType> {
moType: T;
isModal:boolean;
setIsModal?: (open: boolean) => void;
}
export function BdstReg<T extends MoType>({ moType,setIsModal }: BdstRegProps<T>) {
export function BdstReg<T extends MoType>({ moType,setIsModal,isModal }: BdstRegProps<T>) {
const { rain, code, bdst,findBdst } = useWrStore((state) => {
return state;
});
@@ -45,13 +46,13 @@ export function BdstReg<T extends MoType>({ moType,setIsModal }: BdstRegProps<T>
const getSelCity = (val: string | number) => {
const cityValue = String(val); // Ensure val is treated as a string
const data = getCity(cityValue, code.sggCd);
setSelectSgg(data);
getSgg(data[0]?.val || "");
// getSgg(data[0]?.val || "");
setObjSearch({ city: cityValue, sgg: '' });
};
const getSgg = (val: string | number) => {
console.log(val);
setObjSearch({...objSearch,sgg: String(val)})
};
@@ -85,10 +86,7 @@ export function BdstReg<T extends MoType>({ moType,setIsModal }: BdstRegProps<T>
if (data) {
setRainBdstForm(data);
}
}
}
useEffect(()=>{
@@ -122,7 +120,7 @@ export function BdstReg<T extends MoType>({ moType,setIsModal }: BdstRegProps<T>
</div>
<div className="border-t border-gray-300 my-4"></div>
<div className="h-auto">
<h1 className="text-2xl font-medium text-label pl-8">건축물 목록</h1>
<h1 className="text-2xl font-medium text-label pl-8">건축물 목록 (유의 사항: 신규등록하려는 건축물이 목록에 없을 경우 하단 건축물 정보에 추가하여 주시기 바랍니다.)</h1>
<ScrollArea className="h-[30vh]">
<div>
<UiTable
@@ -142,9 +140,9 @@ export function BdstReg<T extends MoType>({ moType,setIsModal }: BdstRegProps<T>
<ScrollArea className="h-[40vh]">
<div>
{ moType === 'RNB'?
<RainRegForm rainForm={rainBdstForm as customRainBdst} isModal={true} />
<RainRegForm rainForm={rainBdstForm as customRainBdst} isModal={isModal} setIsModal={setIsModal} />
:moType==='RST'
? <RswtrRegForm rswtForm={rainBdstForm as customRswtBdst} isModal={true} setIsModal={(open) =>{setIsModal}}></RswtrRegForm>
? <RswtrRegForm rswtForm={rainBdstForm as customRswtBdst} isModal={isModal} setIsModal={(open) =>{setIsModal}}></RswtrRegForm>
:<HtdflRegForm htdflForm={rainBdstForm as unknown as customHtdflBdst} isModal={true}></HtdflRegForm>
}
@@ -62,9 +62,6 @@ export default function SearchInputText({
document.removeEventListener("mousedown", handleClickOutside);
};
}, []);
useEffect(() =>{
console.log('searchList ', searchList)
},[searchList])
return (
<div ref={wrapperRef}>