빗물/중수도시설 등록, 잠재수요처 상세정보 수정시 컨펌창 띄우기

This commit is contained in:
jyha00
2025-07-11 18:03:48 +09:00
parent 6330c125c7
commit fc424a2f46
4 changed files with 488 additions and 429 deletions
+16 -6
View File
@@ -5,6 +5,7 @@ import { btnClass } from "@/app/store/common/code";
import { type customLdrmnt } from "@/app/store/matDmd/ldrmntCoSttn";
import { ldrmntHeadListExport } from "@/app/store/matDmd/ldrmntCoSttn/headList";
import {
confirmToast,
excelDownload,
getCity,
tableData
@@ -29,9 +30,10 @@ import ListDiv from "@common/business_components/ui/list_div";
import { Button } from "@common/components/ui";
import { useCallback, useEffect, useState } from "react";
import { Toaster } from "react-hot-toast";
import { useTranslation } from "react-i18next";
export default function LdrmntCoSttn() {
const { code, ldrmnt, ldrmntInit, ldrmntSearch, ldrmntUpdate} = useWrStore(
const { code, ldrmnt, ldrmntInit, ldrmntSearch, ldrmntUpdate } = useWrStore(
(state) => state
);
const { ldrmntRes, excelList, ldrmntResCount } = ldrmnt;
@@ -43,6 +45,7 @@ export default function LdrmntCoSttn() {
const [searchTxt, setSearchTxt] = useState<string>();
const [excelData, setExcelData] = useState<any[]>();
const [resetPage, isResetPage] = useState(false);
const { t } = useTranslation('base');
// const [isExcelDownload, setIsExcelDownload] = useState(false);
const excelClick = useCallback(() => {
@@ -141,7 +144,7 @@ export default function LdrmntCoSttn() {
setBdstTable(tbData);
}, [ldrmntRes, code]);
useEffect(() => {
const transData = Array.isArray(excelList) ? excelList : [excelList];
const exData = tableData(transData, { code });
@@ -261,10 +264,17 @@ export default function LdrmntCoSttn() {
setDetailModal({ ...detailModal, isOpen: !detailModal.isOpen })
}}
bodyClass={"w-[40vw] max-w-none max-h-[calc(100%-70px)]"}
body={<CoDetailModal formObj={detailModal.data} onFormSubmit={async (value)=>{
await ldrmntUpdate(value)
setDetailModal({ ...detailModal, isOpen: false })
ldrmntSearch(false, pageNation, '20', computeCityNm(), searchTxt || "");
body={<CoDetailModal formObj={detailModal.data} onFormSubmit={async (value) => {
// confirmToast(t('isUpdateMsg'), await ldrmntUpdate(value))
// // await ldrmntUpdate(value)
// setDetailModal({ ...detailModal, isOpen: false })
// ldrmntSearch(false, pageNation, '20', computeCityNm(), searchTxt || "");
const handleConfirm = async () => {
await ldrmntUpdate(value);
setDetailModal({ ...detailModal, isOpen: false });
ldrmntSearch(false, pageNation, '20', computeCityNm(), searchTxt || "");
};
confirmToast(t('isUpdateMsg'), handleConfirm);
}} />}
/>
+47 -17
View File
@@ -6,24 +6,26 @@ import {
filePickedBlobArray,
type SheetParameter,
} from "@common/business_components/ui";
import { Button } from "@common/components/ui";
import type { RefObject } from "react";
import toast from "react-hot-toast";
export const getCity = (val: string, sggCd: SelectDataType[]) => {
let data:any
if(val !=='0'){
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{
.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, // 한국어 텍스트
}));
.map((item) => ({
val: item.val,
text: item.text, // 한국어 텍스트
}));
}
data.unshift({ val: "0", text: "전체" });
return data;
@@ -92,7 +94,7 @@ export const excelDownload = (
export const excelArrayDownload = (
fileNm: string,
sampleFile: string,
sheetArray:SheetParameter []
sheetArray: SheetParameter[]
) => {
if (!sheetArray) return;
fetch(`/${sampleFile}`, {}).then(async (response) => {
@@ -113,7 +115,7 @@ export const handleCommaNumberChange = (
) => {
const raw = e.target.value.replace(/,/g, "");
if (!/^\d*$/.test(raw)) return;
onChange(raw === "" ? "" : Number(raw));
onChange(raw === "" ? "" : Number(raw));
};
@@ -124,7 +126,7 @@ export const handleMinusNumberChange = (
) => {
const raw = e.target.value.replace(/,/g, "");
if (!/^\d*$/.test(raw)) return;
onChange(raw === "" ? -1 : Number(raw));
onChange(raw === "" ? -1 : Number(raw));
};
// 숫자입력시 , 삽입
@@ -175,14 +177,14 @@ export const getdmdMatFlag = (flag: string | undefined | null) => {
case "Matched":
return "매칭완료";
case "Checked":
return '검토완료';
return '검토완료';
default:
return "신청";
}
};
export const formatPhoneNumber=(tel:string) => {
export const formatPhoneNumber = (tel: string) => {
const onlyNums = tel.replace(/[^0-9]/g, '');
if (onlyNums.length === 10) {
return onlyNums.replace(/(\d{2})(\d{4})(\d{4})/, '$1-$2-$3');
@@ -191,4 +193,32 @@ export const formatPhoneNumber=(tel:string) => {
} else {
return tel; // 유효하지 않으면 빈 문자열
}
}
export const confirmToast = (content: string, saveFunc: () => void) => {
toast((t) => (
<span className="flex flex-col items-center">
<div className="mb-6">
{content}
</div>
<div className="flex flex-row space-x-2">
<Button
size={"sm"}
onClick={() => {
saveFunc();
toast.dismiss(t.id);
}}
>
확인
</Button>
<Button
size={"sm"}
onClick={() => toast.dismiss(t.id)}>취소</Button>
</div>
</span>
),
{
id: "global-confirm-toast", // 중복 토스트 방지
duration: Infinity, // 자동 사라짐 방지
});
}
@@ -8,6 +8,7 @@ import {
} from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import { formH1Class, formH2Class } from "@/components/lib/class/comClass";
import {
confirmToast,
formatCommaNumber,
handleMinusNumberChange,
} from "@/components/lib/func/commom";
@@ -21,6 +22,7 @@ import { z } from "zod";
import BdstReg from "../bdstReg/bdstReg";
import toast from "react-hot-toast";
import BdstAdd from "../bdstReg/bdstAdd";
import { useTranslation } from "react-i18next";
export default function RainRegForm({
rainForm,
@@ -40,9 +42,10 @@ export default function RainRegForm({
const defaultValues: z.infer<typeof rainZod> = rainZod.parse({});
const form = useForm<z.infer<typeof rainZod>>({
resolver: zodResolver(rainZod),
// defaultValues: defaultValues,
// defaultValues: defaultValues,
});
const instlCst = form.watch(`reuseBuilding.0.instlCst`);
const { t } = useTranslation('base');
const [grntchBdstCertYn, instlCstSprtYn, filtrTrtmfctYn] = form.watch([
"reuseBuilding.0.grntchBdstCertYn",
@@ -51,15 +54,15 @@ export default function RainRegForm({
]);
const [divStyle, setDivStyle] = useState("h-[53vh]");
useEffect(()=>{
if(isModal===true){
useEffect(() => {
if (isModal === true) {
setDivStyle("h-[53vh] max-h-[37vh]")
}else if(readonly===true){
} else if (readonly === true) {
setDivStyle("h-[62vh]")
}else{
} else {
setDivStyle("h-[53vh]")
}
},[isModal,readonly]);
}, [isModal, readonly]);
const cleanRainData = (raw: any): z.infer<typeof rainZod> => {
const buildings =
@@ -122,7 +125,7 @@ export default function RainRegForm({
// form 값이 변경될 때마다 로그 출력
useEffect(() => {
const subscription = form.watch((value) => {});
const subscription = form.watch((value) => { });
return () => subscription.unsubscribe();
}, [form]);
@@ -139,10 +142,16 @@ export default function RainRegForm({
return;
}
rainBdstReg(values, data);
if (setIsModal) setIsModal(false);
const handleConfirm = async () => {
rainBdstReg(values, data);
if (setIsModal) setIsModal(false);
};
confirmToast(t('isUpdateMsg'), handleConfirm);
} else {
rainBdstUpdate(values, "41");
const handleConfirm = async () => {
rainBdstUpdate(values, "41");
};
confirmToast(t('isUpdateMsg'), handleConfirm);
}
};
@@ -174,150 +183,97 @@ export default function RainRegForm({
</div>
</div>
<ScrollArea className={divStyle}>
{isModal && rainForm != undefined ? <BdstReg form={form} /> : <></>}
{isModal ? (
<h1 className="pl-3 text-xl col-span-10 mt-4">
빗물이용시설 정보{" "}
</h1>
) : (
<></>
)}
<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"
render={({ field }) => (
<FormUi label="설치완료일">
<DatePicker
mode="single"
field={{
value:
field.value && !isNaN(new Date(field.value).getTime())
? new Date(field.value)
: new Date(),
onChange: (date: Date | undefined) =>
field.onChange(date),
}}
selectClass={"w-full"}
readOnly={readonly}
/>
</FormUi>
)}
/>
</div>
{isModal && rainForm != undefined ? <BdstReg form={form} /> : <></>}
{isModal ? (
<h1 className="pl-3 text-xl col-span-10 mt-4">
빗물이용시설 정보{" "}
</h1>
) : (
<></>
)}
<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"
render={({ field }) => (
<FormUi label="설치완료일">
<DatePicker
mode="single"
field={{
value:
field.value && !isNaN(new Date(field.value).getTime())
? new Date(field.value)
: new Date(),
onChange: (date: Date | undefined) =>
field.onChange(date),
}}
selectClass={"w-full"}
readOnly={readonly}
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3">
<FormField
control={form.control}
name={`reuseBuilding.0.instlCst`}
render={({ field }) => {
const value = field.value;
const isUnknown = value === null || value === -1; // 또는 Number(value) === -1
return (
<FormUi label="설치비(원)">
<Input
placeholder="1,000,000"
type="text"
className={selectClass}
readOnly={readonly}
value={
isUnknown ? "확인불가" : formatCommaNumber(value)
}
onFocus={() => {
// 입력 시 자동으로 확인불가 해제
if (isUnknown && !readonly) {
field.onChange(""); // 초기화
<div className="col-span-3">
<FormField
control={form.control}
name={`reuseBuilding.0.instlCst`}
render={({ field }) => {
const value = field.value;
const isUnknown = value === null || value === -1; // 또는 Number(value) === -1
return (
<FormUi label="설치비(원)">
<Input
placeholder="1,000,000"
type="text"
className={selectClass}
readOnly={readonly}
value={
isUnknown ? "확인불가" : formatCommaNumber(value)
}
}}
onChange={(e) => {
if (readonly) return;
handleMinusNumberChange(e, field.onChange);
}}
/>
</FormUi>
);
}}
/>
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>
</div>
<div>
<h2 className={formH2Class}>집수면 및 저류조</h2>
</div>
<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 className="">
<h1 className={formH1Class}>빗물이용시설 정보</h1>
</div>
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.pntfColKnd"
render={({ field }) => (
<FormUi label="집수면 종류">
<SelectBox
className={""}
selectClass={selectClass}
label={""}
selectArray={rainFcltCd}
onSelectValue={readonly ? () => {} : field.onChange}
value={field.value ?? rainFcltCd[0]?.val}
readOnly={readonly}
/>
</FormUi>
)}
/>
<div>
<h2 className={formH2Class}>집수면 및 저류조</h2>
</div>
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.pntfColArea"
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³)">
<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(value)
isUnknown
? "확인불가"
: formatCommaNumber(field.value)
}
onFocus={() => {
// 입력 시 자동으로 확인불가 해제
@@ -332,274 +288,327 @@ export default function RainRegForm({
readOnly={readonly}
/>
</FormUi>
</div>
);
}}
/>
</div>
</div>
<div>
<h2 className={formH2Class}>여과 등 처리시설</h2>
</div>
<div className="grid grid-cols-12 gap-2 mt-4">
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.filtrTrtmfctYn"
render={({ field }) => (
<FormUi label="유무">
<SelectBox
className={""}
selectClass={selectClass}
label={""}
selectArray={code.bdstFilterYn}
onSelectValue={readonly ? () => {} : field.onChange}
value={field.value ?? code.yn[0]?.val}
readOnly={readonly}
/>
</FormUi>
)}
/>
</div>
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.filtrTrtmfctCpct"
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);
}}
);
}}
/>
</div>
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.pntfColKnd"
render={({ field }) => (
<FormUi label="집수면 종류">
<SelectBox
className={""}
selectClass={selectClass}
label={""}
selectArray={rainFcltCd}
onSelectValue={readonly ? () => { } : field.onChange}
value={field.value ?? rainFcltCd[0]?.val}
readOnly={readonly}
disabled={filtrTrtmfctYn !== "Y"}
/>
</FormUi>
);
}}
/>
)}
/>
</div>
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.pntfColArea"
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>
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.filtrTrtmfctPrs"
render={({ field }) => {
const value = field.value;
const isUnknown = value === null || value === "-"; // 또는 Number(value) === -1
return (
<div className="flex items-center gap-2">
<FormUi label="처리공정">
<div>
<h2 className={formH2Class}>여과 등 처리시설</h2>
</div>
<div className="grid grid-cols-12 gap-2 mt-4">
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.filtrTrtmfctYn"
render={({ field }) => (
<FormUi label="유무">
<SelectBox
className={""}
selectClass={selectClass}
label={""}
selectArray={code.bdstFilterYn}
onSelectValue={readonly ? () => { } : field.onChange}
value={field.value ?? code.yn[0]?.val}
readOnly={readonly}
/>
</FormUi>
)}
/>
</div>
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.filtrTrtmfctCpct"
render={({ field }) => {
const isUnknown = field.value === null || field.value === -1; // 또는 Number(value) === -1
return (
<FormUi label="용량(m³/일)">
<Input
className={" h-full !text-xl col-span-4"}
placeholder="처리공정 입력"
className={selectClass}
placeholder="1,000,000"
type="text"
value={field.value ?? ""}
onChange={field.onChange}
value={
isUnknown
? "확인불가"
: formatCommaNumber(field.value)
}
onFocus={() => {
// 입력 시 자동으로 확인불가 해제
if (isUnknown && !readonly) {
field.onChange(""); // 초기화
}
}}
onChange={(e) => {
if (readonly) return;
handleMinusNumberChange(e, field.onChange);
}}
readOnly={readonly}
disabled={filtrTrtmfctYn !== "Y"}
/>
</FormUi>
</div>
);
}}
/>
</div>
</div>
<div className=" my-2">
<h1 className={formH1Class}>인센티브 정보</h1>
</div>
<div>
<h2 className={formH2Class}>설치비 지원</h2>
</div>
<div className="grid grid-cols-10 gap-2 mt-4">
<div className="col-span-5">
<FormField
control={form.control}
name="reuseBuilding.0.instlCstSprtYn"
render={({ field }) => (
<FormUi label="지원 여부">
<SelectBox
className={""}
selectClass={selectClass}
label={""}
selectArray={code.bdstIncenYn}
onSelectValue={readonly ? () => {} : field.onChange}
value={field.value ?? code.yn[0]?.val}
readOnly={readonly}
/>
</FormUi>
)}
/>
</div>
<div className="col-span-5">
<FormField
control={form.control}
name="reuseBuilding.0.instlCstSprtAmt"
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(""); // 초기화
}
}}
onChange={(e) => {
if (readonly) return;
handleMinusNumberChange(e, field.onChange);
}}
disabled={instlCstSprtYn !== "Y"}
/>
</FormUi>
);
}}
/>
</div>
</div>
<div>
<h2 className={formH2Class}>녹색건축물 인증</h2>
</div>
<div className="grid grid-cols-6 gap-2 mt-4">
<div className="col-span-3">
<FormField
control={form.control}
name="reuseBuilding.0.grntchBdstCertYn"
render={({ field }) => (
<FormUi label="인증여부">
<SelectBox
className={""}
selectClass={selectClass}
label={""}
selectArray={code.bdstIncenYn}
onSelectValue={readonly ? () => {} : field.onChange}
value={field.value ?? code.yn[0]?.val}
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3">
<FormField
control={form.control}
name="reuseBuilding.0.grntchBdstCertYr"
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"}
max={4}
/>
</FormUi>
);
}}
/>
</div>
<div className="col-span-3 ">
<FormField
control={form.control}
name="reuseBuilding.0.grntchBdstCertNo"
render={({ field }) => {
const isUnknown =
field.value === null || field.value === "0000"; // 또는 Number(value) === -1
return (
<FormUi label="인증번호">
<Input
className={selectClass}
placeholder="ab1234678"
type=""
onFocus={() => {
// 입력 시 자동으로 확인불가 해제
if (isUnknown && !readonly) {
field.onChange(""); // 초기화
}
}}
value={isUnknown ? "확인불가" : (field.value ?? "")}
onChange={(e) => {
if (readonly) return;
);
}}
/>
</div>
<div className="col-span-4">
<FormField
control={form.control}
name="reuseBuilding.0.rainyObj.filtrTrtmfctPrs"
render={({ field }) => {
const value = field.value;
const isUnknown = value === null || value === "-"; // 또는 Number(value) === -1
if (e.target.value === "확인불가") {
field.onChange("");
} else {
field.onChange(e.target.value);
}
}}
disabled={grntchBdstCertYn !== "Y"}
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>
</div>
<div>
<h2 className={formH2Class}>설치비 지원</h2>
</div>
<div className="grid grid-cols-10 gap-2 mt-4">
<div className="col-span-5">
<FormField
control={form.control}
name="reuseBuilding.0.instlCstSprtYn"
render={({ field }) => (
<FormUi label="지원 여부">
<SelectBox
className={""}
selectClass={selectClass}
label={""}
selectArray={code.bdstIncenYn}
onSelectValue={readonly ? () => { } : field.onChange}
value={field.value ?? code.yn[0]?.val}
readOnly={readonly}
/>
</FormUi>
);
}}
/>
)}
/>
</div>
<div className="col-span-5">
<FormField
control={form.control}
name="reuseBuilding.0.instlCstSprtAmt"
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(""); // 초기화
}
}}
onChange={(e) => {
if (readonly) return;
handleMinusNumberChange(e, field.onChange);
}}
disabled={instlCstSprtYn !== "Y"}
/>
</FormUi>
);
}}
/>
</div>
</div>
<div className="col-span-3">
<FormField
control={form.control}
name="reuseBuilding.0.grntchBdstCertGrd"
render={({ field }) => (
<FormUi label="인증등급">
<SelectBox
className={""}
selectClass={selectClass}
label={""}
selectArray={code.bdstGrntchClass}
onSelectValue={readonly ? () => {} : field.onChange}
value={field.value ?? code.bdstGrntchClass[0]?.val}
readOnly={readonly}
/>
</FormUi>
)}
/>
<div>
<h2 className={formH2Class}>녹색건축물 인증</h2>
</div>
</div>
<BdstAdd form={form} readonly={readonly}></BdstAdd>
<div className="grid grid-cols-6 gap-2 mt-4">
<div className="col-span-3">
<FormField
control={form.control}
name="reuseBuilding.0.grntchBdstCertYn"
render={({ field }) => (
<FormUi label="인증여부">
<SelectBox
className={""}
selectClass={selectClass}
label={""}
selectArray={code.bdstIncenYn}
onSelectValue={readonly ? () => { } : field.onChange}
value={field.value ?? code.yn[0]?.val}
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3">
<FormField
control={form.control}
name="reuseBuilding.0.grntchBdstCertYr"
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"}
max={4}
/>
</FormUi>
);
}}
/>
</div>
<div className="col-span-3 ">
<FormField
control={form.control}
name="reuseBuilding.0.grntchBdstCertNo"
render={({ field }) => {
const isUnknown =
field.value === null || field.value === "0000"; // 또는 Number(value) === -1
return (
<FormUi label="인증번호">
<Input
className={selectClass}
placeholder="ab1234678"
type=""
onFocus={() => {
// 입력 시 자동으로 확인불가 해제
if (isUnknown && !readonly) {
field.onChange(""); // 초기화
}
}}
value={isUnknown ? "확인불가" : (field.value ?? "")}
onChange={(e) => {
if (readonly) return;
if (e.target.value === "확인불가") {
field.onChange("");
} else {
field.onChange(e.target.value);
}
}}
disabled={grntchBdstCertYn !== "Y"}
/>
</FormUi>
);
}}
/>
</div>
<div className="col-span-3">
<FormField
control={form.control}
name="reuseBuilding.0.grntchBdstCertGrd"
render={({ field }) => (
<FormUi label="인증등급">
<SelectBox
className={""}
selectClass={selectClass}
label={""}
selectArray={code.bdstGrntchClass}
onSelectValue={readonly ? () => { } : field.onChange}
value={field.value ?? code.bdstGrntchClass[0]?.val}
readOnly={readonly}
/>
</FormUi>
)}
/>
</div>
</div>
<BdstAdd form={form} readonly={readonly}></BdstAdd>
</ScrollArea>
</form>
</Form>
@@ -8,6 +8,7 @@ import {
} from "@/app/store/ruseFcltMng/fcltReg/rswtReg";
import { formH1Class, formH2Class } from "@/components/lib/class/comClass";
import {
confirmToast,
formatCommaNumber,
handleMinusNumberChange
} from "@/components/lib/func/commom";
@@ -25,6 +26,7 @@ import { useForm } from "react-hook-form";
import { z } from "zod";
import BdstAdd from "../bdstReg/bdstAdd";
import BdstReg from "../bdstReg/bdstReg";
import { useTranslation } from "react-i18next";
export default function RswtrRegForm({
rswtForm,
@@ -41,20 +43,20 @@ export default function RswtrRegForm({
(state) => state
);
const [divStyle, setDivStyle] = useState("h-[53vh]");
useEffect(()=>{
if(isModal===true){
useEffect(() => {
if (isModal === true) {
setDivStyle("h-[53vh] max-h-[37vh]")
}else if(readonly===true){
} else if (readonly === true) {
setDivStyle("h-[62vh]")
}else{
} else {
setDivStyle("h-[53vh]")
}
},[isModal,readonly]);
// const defaultValues: z.infer<typeof rswtZod> = rswtZod.parse({});
}, [isModal, readonly]);
// const defaultValues: z.infer<typeof rswtZod> = rswtZod.parse({});
const form = useForm<z.infer<typeof rswtZod>>({
resolver: zodResolver(rswtZod),
// defaultValues: defaultValues,
// defaultValues: defaultValues,
});
const [grntchBdstCertYn, instlCstSprtYn, filtrTrtmfctProcs] = form.watch([
@@ -63,12 +65,20 @@ export default function RswtrRegForm({
"reuseBuilding.0.rswtrObj.filtrTrtmfctProcs",
]);
const { t } = useTranslation('base');
const onSubmit = (values: z.infer<typeof rswtZod>) => {
if (isModal) {
rswtBdstReg(values, "41");
if (setIsModal) setIsModal(false);
const handleConfirm = async () => {
rswtBdstReg(values, "41");
if (setIsModal) setIsModal(false);
};
confirmToast(t('isUpdateMsg'), handleConfirm);
} else {
rswtBdstUpdate(values, "41");
const handleConfirm = async () => {
rswtBdstUpdate(values, "41");
};
confirmToast(t('isUpdateMsg'), handleConfirm);
}
};