Merge remote-tracking branch 'origin/iipbs/wr/login-test' into iipbs/wr/dev

This commit is contained in:
leedj312
2025-07-25 14:07:37 +09:00
15 changed files with 575 additions and 519 deletions
+418 -411
View File
@@ -41,9 +41,11 @@ import toast, { Toaster } from "react-hot-toast";
import { z } from "zod";
export default function CoMatRvw() {
const { code, coRvw, coMatRvwInit, coMatRvwSearch, coMatRvwInqua } =
const { auth, code, coRvw, coMatRvwInit, coMatRvwSearch, coMatRvwInqua } =
useWrStore((state) => state);
const { coMatRvwRes,coMatRvwCount } = coRvw;
const { coMatRvwRes, coMatRvwCount } = coRvw;
const { regAuthrtYn } = auth;
//init, sub, match
const initRef = useRef<boolean>(false);
const { coRvwHeadList } = coRvw;
@@ -91,10 +93,9 @@ export default function CoMatRvw() {
const form = useForm<z.infer<typeof DmdCoReqSchema>>({
resolver: zodResolver(DmdCoReqSchema),
shouldUnregister: false,
// defaultValues: DmdCoReqSchema.parse({})
// defaultValues: DmdCoReqSchema.parse({})
});
const TableCellClick = (index: number) => {
if (coMatRvwRes && coMatRvwRes[index]) {
setSelectData(coMatRvwRes[index]);
@@ -103,23 +104,21 @@ export default function CoMatRvw() {
};
const useUsgCdWatch = useWatch({ control: form.control, name: "useUsgCd" });
useEffect(() => {
if (useUsgCdWatch) {
form.setValue(
"demandCst.usgPrcsProcs",
usageProcData?.find(
(item) => item.usage === useUsgCdWatch
)?.process ?? ""
usageProcData?.find((item) => item.usage === useUsgCdWatch)?.process ??
""
);
}
}, [useUsgCdWatch, form,selectionVersion]);
}, [useUsgCdWatch, form, selectionVersion]);
useEffect(() => {
if (coMatRvwRes&&coMatRvwRes.length > 0) {
if (coMatRvwRes && coMatRvwRes.length > 0) {
const data = coMatRvwRes?.map((item) => {
let flag = "";
flag = getdmdMatFlag(item?.demandMatching?.splyFcltFlg ||undefined);
flag = getdmdMatFlag(item?.demandMatching?.splyFcltFlg || undefined);
return {
...item,
@@ -127,7 +126,7 @@ export default function CoMatRvw() {
sggCd: item.demandCo?.sggCd,
dmdCoNm: item.demandCo?.dmdCoNm,
daddr: item.demandCo?.daddr,
telno: formatPhoneNumber(item?.demandCo?.telno||''),
telno: formatPhoneNumber(item?.demandCo?.telno || ""),
dmndTmng: item?.dmndTmng,
splyFcltFlg: flag,
};
@@ -156,7 +155,6 @@ export default function CoMatRvw() {
useEffect(() => {
if (selectData) {
try {
DmdCoReqSchema.parse(selectData);
} catch (e) {
@@ -164,15 +162,14 @@ export default function CoMatRvw() {
console.log(e.flatten());
}
}
form.reset( selectData);
setSelectionVersion((v) => v + 1); // 강제로 바뀌었다고 알리기
form.reset(selectData);
setSelectionVersion((v) => v + 1); // 강제로 바뀌었다고 알리기
}
}, [selectData, form]);
return (
<>
<ContentsDiv>
<div className="grid grid-cols-4 gap-4">
<div className="col-span-4">
<Title title={"수요매칭검토"} />
<SearchDiv>
@@ -195,7 +192,7 @@ export default function CoMatRvw() {
<div className="col-span-7 w-full">
<div className="flex flex-row items-center">
<Label className="text-xl text-gray-600 mx-6">
수요신청년도
수요신청년도
</Label>
<SelectBox
className="h-full w-32 text-2xl"
@@ -248,7 +245,10 @@ export default function CoMatRvw() {
if (String(objSearch.city).length > 0) {
con = String(objSearch.city);
}
if (String(objSearch.sgg).length > 0 && String(objSearch.sgg) !== "0") {
if (
String(objSearch.sgg).length > 0 &&
String(objSearch.sgg) !== "0"
) {
con = String(objSearch.sgg);
}
getSearch(fromNum, toNum, con, dmdCoNm);
@@ -279,403 +279,410 @@ export default function CoMatRvw() {
TableCellClick(index);
}
}}
onPageChange={(val) => {setPageNatiion(val)}}
onPageChange={(val) => {
setPageNatiion(val);
}}
></UiTable>
</ListDiv>
<hr />
{/* <ScrollArea className="h-[49vh]"> */}
<ListDiv>
<h3 className="mt-4 ml-2 text-2xl font-medium text-label">
수요신청 상세현황
</h3>
<Form {...form}>
<div className="grid grid-cols-12 gap-4 ml-4 mr-4">
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="dmndTmng"
render={({ field }) => (
<FormUi label="요구시기">
<Input
placeholder=""
type="text"
onChange={(e) => {
field.onChange(String(e.target.value));
}}
value={
moment(field.value).format("YYYY-MM-DD") ?? ""
}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="dmndQty"
render={({ field }) => (
<FormUi label="요구수량(m³/일)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="useUsgCd"
render={({ field }) => (
<FormUi label="사용용도">
<Input
placeholder=""
type="text"
step="0.1"
onChange={(e) => {
field.onChange(e.target.value);
}}
value={field.value ?? ""}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="wntUntprc"
render={({ field }) => (
<FormUi label="희망단가(원/m3)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-12 w-full">
<h1 className={formH1Class}>요구수질</h1>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="grssClfg"
render={({ field }) => (
<FormUi label="총대장균군수 (개/100ml)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="combResdch"
render={({ field }) => (
<FormUi label="결합잔류염소(mg/L)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="trbt"
render={({ field }) => (
<FormUi label="탁도(NTU)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="blgcOxygDmndQnt"
render={({ field }) => (
<FormUi label="생물학적 산소요구량(BOD)(mg/L)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="smll"
render={({ field }) => (
<FormUi label="냄새">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="crmty"
render={({ field }) => (
<FormUi label="색도(도)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="tn"
render={({ field }) => (
<FormUi label="총질소 (T-N)(mg/L)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="tph"
render={({ field }) => (
<FormUi label="총인(T-P)(mg/L)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="ph"
render={({ field }) => (
<FormUi label="수소이온농도(pH)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="clIonQnt"
render={({ field }) => (
<FormUi label="염화물(mgCL/L)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="cdtnv"
render={({ field }) => (
<FormUi label="전기전도도(㎲/cm)">
<Input
placeholder=""
type="number"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="rmrk"
render={({ field }) => (
<FormUi label="비고">
<Input
placeholder=""
type="text"
onChange={(e) => {
field.onChange(e.target.value);
}}
value={field.value ?? ""}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-12 w-full">
<h1 className={formH1Class}>공급처 후보지</h1>
</div>
<div className="col-span-4 mt-4">
<FormField
control={form.control}
name={`demandMatching.splyCndtList.${0}`}
render={({ field }) => (
<FormUi label="후보지1">
<Input
placeholder=""
type="text"
onChange={(e) => {
field.onChange(String(e.target.value));
}}
value={field.value ?? ""}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-4 mt-4">
<FormField
control={form.control}
name={`demandMatching.splyCndtList.${1}`}
render={({ field }) => (
<FormUi label="후보지2">
<Input
placeholder=""
type="text"
onChange={(e) => {
field.onChange(e.target.value);
}}
value={field.value ?? ""}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-4 mt-4">
<FormField
control={form.control}
name={`demandMatching.splyCndtList.${2}`}
render={({ field }) => (
<FormUi label="후보지3">
<Input
placeholder=""
type="text"
onChange={(e) => {
field.onChange(e.target.value);
}}
value={field.value ?? ""}
readOnly
/>
</FormUi>
)}
/>
</div>
<ListDiv>
<h3 className="mt-4 ml-2 text-2xl font-medium text-label">
수요신청 상세현황
</h3>
<Form {...form}>
<div className="grid grid-cols-12 gap-4 ml-4 mr-4">
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="dmndTmng"
render={({ field }) => (
<FormUi label="요구시기">
<Input
placeholder=""
type="text"
onChange={(e) => {
field.onChange(String(e.target.value));
}}
value={
moment(field.value).format("YYYY-MM-DD") ?? ""
}
readOnly
/>
</FormUi>
)}
/>
</div>
</Form>
<ConCostForm form={form} type={"mat"} selectionVersion={selectionVersion} />
</ListDiv>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="dmndQty"
render={({ field }) => (
<FormUi label="요구수량(m³/일)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="useUsgCd"
render={({ field }) => (
<FormUi label="사용용도">
<Input
placeholder=""
type="text"
step="0.1"
onChange={(e) => {
field.onChange(e.target.value);
}}
value={field.value ?? ""}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="wntUntprc"
render={({ field }) => (
<FormUi label="희망단가(원/m3)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-12 w-full">
<h1 className={formH1Class}>요구수질</h1>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="grssClfg"
render={({ field }) => (
<FormUi label="총대장균군수 (개/100ml)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="combResdch"
render={({ field }) => (
<FormUi label="결합잔류염소(mg/L)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="trbt"
render={({ field }) => (
<FormUi label="탁도(NTU)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="blgcOxygDmndQnt"
render={({ field }) => (
<FormUi label="생물학적 산소요구량(BOD)(mg/L)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="smll"
render={({ field }) => (
<FormUi label="냄새">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="crmty"
render={({ field }) => (
<FormUi label="색도(도)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="tn"
render={({ field }) => (
<FormUi label="총질소 (T-N)(mg/L)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="tph"
render={({ field }) => (
<FormUi label="총인(T-P)(mg/L)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="ph"
render={({ field }) => (
<FormUi label="수소이온농도(pH)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="clIonQnt"
render={({ field }) => (
<FormUi label="염화물(mgCL/L)">
<Input
placeholder=""
type="number"
step="0.1"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="cdtnv"
render={({ field }) => (
<FormUi label="전기전도도(㎲/cm)">
<Input
placeholder=""
type="number"
onChange={(e) => {
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-3 mt-4">
<FormField
control={form.control}
name="rmrk"
render={({ field }) => (
<FormUi label="비고">
<Input
placeholder=""
type="text"
onChange={(e) => {
field.onChange(e.target.value);
}}
value={field.value ?? ""}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-12 w-full">
<h1 className={formH1Class}>공급처 후보지</h1>
</div>
<div className="col-span-4 mt-4">
<FormField
control={form.control}
name={`demandMatching.splyCndtList.${0}`}
render={({ field }) => (
<FormUi label="후보지1">
<Input
placeholder=""
type="text"
onChange={(e) => {
field.onChange(String(e.target.value));
}}
value={field.value ?? ""}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-4 mt-4">
<FormField
control={form.control}
name={`demandMatching.splyCndtList.${1}`}
render={({ field }) => (
<FormUi label="후보지2">
<Input
placeholder=""
type="text"
onChange={(e) => {
field.onChange(e.target.value);
}}
value={field.value ?? ""}
readOnly
/>
</FormUi>
)}
/>
</div>
<div className="col-span-4 mt-4">
<FormField
control={form.control}
name={`demandMatching.splyCndtList.${2}`}
render={({ field }) => (
<FormUi label="후보지3">
<Input
placeholder=""
type="text"
onChange={(e) => {
field.onChange(e.target.value);
}}
value={field.value ?? ""}
readOnly
/>
</FormUi>
)}
/>
</div>
</div>
</Form>
<ConCostForm
form={form}
type={"mat"}
selectionVersion={selectionVersion}
readonly={regAuthrtYn ==="N"}
/>
</ListDiv>
{/* </ScrollArea> */}
</div>
</div>
@@ -30,6 +30,7 @@ import toast, { Toaster } from "react-hot-toast";
import { useTranslation } from "react-i18next";
export default function RuseRvwHstry() {
const {
auth,
code,
ruseHist,
ruseRvwHistInit,
@@ -38,6 +39,8 @@ export default function RuseRvwHstry() {
ruseRvwComplete,
} = useWrStore((state) => state);
const { rvwHistRes, ruseHistHeadList, rvwHistCount } = ruseHist;
const { regAuthrtYn } = auth;
const [pageNation, setPageNatiion] = useState<number>(1);
const [dmdCoNm, setDmdCoNm] = useState<string>("");
@@ -305,7 +308,7 @@ export default function RuseRvwHstry() {
>
조회
</Button>
<Button size={"sm"} onClick={confrirmToast}>
<Button size={"sm"} onClick={confrirmToast} disabled={regAuthrtYn==='N'}>
저장
</Button>
</div>
+4
View File
@@ -33,6 +33,7 @@ import toast, { Toaster } from "react-hot-toast";
export default function CoSttn() {
const {
auth,
code,
coSttn,
coSttnInit,
@@ -43,6 +44,7 @@ export default function CoSttn() {
coSttnTxtSearch,
demandCompList,
} = useWrStore((state) => state);
const { regAuthrtYn, mdfcnAuthrtYn } = auth;
const [bdstTable, setBdstTable] = useState<DemandCompType[]>();
const [pageNation, setPageNation] = useState(1);
@@ -205,6 +207,7 @@ export default function CoSttn() {
setUpdateData(undefined);
setIsDmdModal({ ...isDmdModal, isMoal: true });
}}
disabled={regAuthrtYn === "N"}
>
등록
</Button>
@@ -222,6 +225,7 @@ export default function CoSttn() {
});
}
}}
disabled={mdfcnAuthrtYn === "N"}
>
수정
</Button>
@@ -21,7 +21,7 @@ import { useEffect, useState } from "react";
import { Toaster } from "react-hot-toast";
export default function Home() {
const { code, htdfl, initHtdflReg, getHtdflBdstData, htdflNmSearch } =
const { auth,code, htdfl, initHtdflReg, getHtdflBdstData, htdflNmSearch } =
useWrStore((state) => state);
const [searchTxt, setSearchTxt] = useState("");
const [pageNation, setPageNation] = useState(1);
@@ -30,12 +30,9 @@ export default function Home() {
const [bdstTable, setbdstTable] = useState<customHtdflBdst[]>();
const [issNewReg, setIsNewReg] = useState<boolean>(false);
// const [bdstChgProps, setBdstChgProps] = useState<{
// isOpen: boolean;
// chgBuilding: chgBuilding[];
// }>({ isOpen: false, chgBuilding: [] });
const { htdflRes ,htdflResCount} = htdfl;
const { regAuthrtYn, mdfcnAuthrtYn } = auth;
useEffect(() => {
if (!htdfl.isInit) {
@@ -116,7 +113,10 @@ export default function Home() {
>
조회
</Button>
<Button size={"sm"} onClick={() => setIsNewReg(!issNewReg)}>
<Button size={"sm"}
onClick={() => setIsNewReg(!issNewReg)}
disabled={regAuthrtYn === "N"}
>
신규등록
</Button>
</div>
@@ -149,6 +149,7 @@ export default function Home() {
<HtdflRegForm
htdflForm={htdflForm ?? ({} as customHtdflBdst)}
isModal={false}
readonly={mdfcnAuthrtYn === "N"}
/>
</ScrollArea>
</ListDiv>
@@ -38,6 +38,7 @@ import { useTranslation } from "react-i18next";
export default function PublicReuseFaciltyInsert() {
const {
auth,
code,
pbnst,
pubHasuInit,
@@ -47,8 +48,10 @@ export default function PublicReuseFaciltyInsert() {
pubHasuSearch,
pbnstRuseBizUpdate,
} = useWrStore((state) => state);
const { t } = useTranslation("base");
const { pubFacHeadList, pbnstHasuResCount, pbnstHasuRes, pbnstRes } = pbnst;
const { regAuthrtYn, mdfcnAuthrtYn } = auth;
const [, setCurrentTab] = useState<string>("mng");
const [isRuseReg, setIsRuseReg] = useState<{
isModal: boolean;
@@ -290,6 +293,7 @@ export default function PublicReuseFaciltyInsert() {
}
isResetPage(true);
}}
>
조회
</Button>
@@ -307,6 +311,7 @@ export default function PublicReuseFaciltyInsert() {
appendPbnstRuseFclt();
}
}}
disabled={regAuthrtYn === "N"}
>
신규등록
</Button>
@@ -319,19 +324,17 @@ export default function PublicReuseFaciltyInsert() {
<div className="grid grid-cols-8 gap-4">
<div className="col-span-5 h-full min-h-0">
<ListDiv className="min-h-0">
{/* <ScrollArea className="h-[60vh]"> */}
{" "}
{/* 높이 조정 */}
<UiTable
tableData={bdstTable || []}
headlist={pubFacHeadList}
pageSize={10}
total={pbnstHasuResCount || 20}
headName={"공공 하수처리시설 목록"}
cellClick={cellClick}
onPageChange={setPageNation}
resetPageNo={resetPage}
/>
{/* <ScrollArea className="h-[60vh]"> */} {/* 높이 조정 */}
<UiTable
tableData={bdstTable || []}
headlist={pubFacHeadList}
pageSize={10}
total={pbnstHasuResCount || 20}
headName={"공공 하수처리시설 목록"}
cellClick={cellClick}
onPageChange={setPageNation}
resetPageNo={resetPage}
/>
{/* </ScrollArea> */}
</ListDiv>
</div>
@@ -351,6 +354,7 @@ export default function PublicReuseFaciltyInsert() {
size={"sm"}
onClick={form.handleSubmit(onSubmit, onInvalid)}
className="mr-5 mt-2"
disabled={mdfcnAuthrtYn === "N"}
>
저장
</Button>
@@ -364,7 +368,7 @@ export default function PublicReuseFaciltyInsert() {
setIndexMng(index);
}}
indexMng={indexMng}
readonly={false}
readonly={mdfcnAuthrtYn === "N"}
/>
</TabsContent>
<TabsContent className="max-h-full" value="buse">
@@ -376,9 +380,9 @@ export default function PublicReuseFaciltyInsert() {
}}
indexMng={indexMng}
indexBiz={indexBiz}
readonly={mdfcnAuthrtYn === "N"}
/>
</TabsContent>
</ScrollArea>
</Tabs>
) : (
@@ -1,8 +1,6 @@
"use client";
import { useWrStore } from "@/app/store";
import {
type customRainBdst,
} from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import { type customRainBdst } from "@/app/store/ruseFcltMng/fcltReg/rainReg";
import { formatCommaNumber, tableData } from "@/components/lib/func/commom";
import RainRegForm from "@/components/ui/form/fcltReg/rainReg/rainRegForm";
import { BdstReg } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal";
@@ -19,14 +17,19 @@ import {
import ListDiv from "@common/business_components/ui/list_div";
import { Button } from "@common/components";
import { useEffect, useState } from "react";
import { Toaster } from "react-hot-toast";
import { Toaster } from "react-hot-toast";
export default function Home() {
const { rain, code, initRain, rainSearch, getRainData } = useWrStore(
const { auth, rain, code, initRain, rainSearch, getRainData } = useWrStore(
(state) => {
return state;
}
);
const { regAuthrtYn, mdfcnAuthrtYn } = auth;
const { rainRes, rainResCount } = rain;
const [rainForm, setRainForm] = useState<customRainBdst>();
const [issNewReg, setIsNewReg] = useState<boolean>(false);
@@ -53,7 +56,7 @@ export default function Home() {
return {
...item,
archArea: formatCommaNumber(archArea),
bdstChgYn: item.chgBuilding[0]?.bdstChgNm != null ? "Y" : "N",
};
}
);
@@ -64,13 +67,10 @@ export default function Home() {
}
}
}, [code, rainRes]);
const cellClick: (val: number | undefined) => void = (
val
) => {
const cellClick: (val: number | undefined) => void = (val) => {
if (val !== undefined) {
setRainForm(rainRes[val]);
}
};
useEffect(() => {
@@ -99,7 +99,7 @@ export default function Home() {
size={"sm"}
onClick={() => {
rainSearch(searchTxt || "", 1, "41");
//rainSearch(searchTxt || "", pageNation, "41");
//rainSearch(searchTxt || "", pageNation, "41");
}}
>
조회
@@ -107,7 +107,10 @@ export default function Home() {
<Button
size={"sm"}
className=""
onClick={() => setIsNewReg(!issNewReg)}
onClick={() => {
setIsNewReg(!issNewReg);
}}
disabled={regAuthrtYn === "N"}
>
신규등록
</Button>
@@ -143,6 +146,7 @@ export default function Home() {
<RainRegForm
rainForm={rainForm ?? ({} as customRainBdst)}
isModal={false}
readonly={mdfcnAuthrtYn !== "Y"}
></RainRegForm>
</ScrollArea>
</ListDiv>
@@ -20,9 +20,11 @@ import { useEffect, useState } from "react";
import { Toaster } from "react-hot-toast";
export default function Home() {
const { code, rswt, initRswt, rswtBdstSearch, getRswtBdstData } = useWrStore(
const { auth,code, rswt, initRswt, rswtBdstSearch, getRswtBdstData } = useWrStore(
(state) => state
);
const { regAuthrtYn, mdfcnAuthrtYn } = auth;
const [rswtForm, setRswtForm] = useState<customRswtBdst>();
const [searchTxt, setSearchTxt] = useState<string>();
const [issNewReg, setIsNewReg] = useState<boolean>(false);
@@ -114,6 +116,7 @@ export default function Home() {
size={"sm"}
className="mr-4"
onClick={() => setIsNewReg(!issNewReg)}
disabled={regAuthrtYn === "N"}
>
신규등록
</Button>
@@ -146,6 +149,7 @@ export default function Home() {
<RswtrRegForm
rswtForm={rswtForm ?? ({} as customRswtBdst)}
isModal={false}
readonly={mdfcnAuthrtYn === "N"}
/>
</ScrollArea>
</ListDiv>
@@ -99,7 +99,9 @@ export default function Page() {
isRainSttn(true)
rainChkSttnInit(1, rainPageSize, new Date().getFullYear().toString(), commonCd);
setIsModal({ data: {}, open: false });
}
}, [rainChkSttn.isInit, rainChkSttnInit, rainPageSize]);
useEffect(() => {
+1 -16
View File
@@ -1,21 +1,6 @@
import { getFetch, getFetchWithCount } from "@/components/lib/api";
import { getFetchWithCount } from "@/components/lib/api";
import toast from "react-hot-toast";
export const getMenuAuthrts = async (menuCd: number) => {
const response = await getFetch(
"LOCAL",
`/cms-service/api/v1/menu-authrts/pageinfo/${menuCd}`
);
authStateExport.auth = {
mngAuthrtYn: response[0].mngAuthrtYn,
inqAuthrtYn: response[0].mngAuthrtYn,
regAuthrtYn: response[0].mngAuthrtYn,
mdfcnAuthrtYn: response[0].mngAuthrtYn,
delAuthrtYn: response[0].mngAuthrtYn,
};
};
export type authState = {
auth: {
mngAuthrtYn: string;
@@ -31,10 +31,12 @@ export default function ConCostForm({
form,
type,
selectionVersion,
readonly = false,
}: {
form: UseFormReturn<DmdCoReqType>;
type: string;
selectionVersion: number;
readonly: boolean;
}) {
const {
constCostRes,
@@ -58,14 +60,11 @@ export default function ConCostForm({
}
}, [ref, getConstCostFee, getRateFee]);
useEffect(() => {
// 다른 행을 선택하면(selectionVersion 변경) 체크박스 상태를 초기화합니다.
setCheckFinish(false);
}, [selectionVersion]);
const zipDowonLoad = () => {
fetch(`/2024_constarctFeeProgram.zip`, {}).then(async (response) => {
const blobRet = await response.blob();
@@ -165,29 +164,32 @@ export default function ConCostForm({
cstrnCst: value.demandCst.cstrnCst || 0,
fcltSbsdCstrnCst: value.demandCst.fcltSbsdCstrnCst || 0,
prcsFcltCpctCstrnCst: value.demandCst.prcsFcltCpctCstrnCst || 0,
flg: checkFinish?'Checked':'Sub',
flg: checkFinish ? "Checked" : "Sub",
rgtr: TEST_UUID,
};
if (checkFinish) {
toast((t) => (
<span className="flex flex-col items-center text-2xl" >
검토완료 변경시 공사비는 변경할수 없습니다.
<span className="flex flex-col items-center text-2xl">
검토완료 변경시 공사비는 변경할수 없습니다.
<br />
진행하시겠습니까?
<div className="flex gap-2 mt-2">
<Button
size='sm'
onClick={() => {
toast.dismiss(t.id);
coMatRvwUpdate("11000SW001R1", form.getValues("dmdInfoId"), data);
}}
>
확인
</Button>
<Button
size='sm'
onClick={() => toast.dismiss(t.id)}>취소</Button>
<Button
size="sm"
onClick={() => {
toast.dismiss(t.id);
coMatRvwUpdate(
"11000SW001R1",
form.getValues("dmdInfoId"),
data
);
}}
>
확인
</Button>
<Button size="sm" onClick={() => toast.dismiss(t.id)}>
취소
</Button>
</div>
</span>
));
@@ -229,6 +231,7 @@ export default function ConCostForm({
className="mr-3"
size={"sm"}
onClick={form.handleSubmit(onSubmit)}
disabled={readonly}
>
저장
</Button>
@@ -236,9 +239,14 @@ export default function ConCostForm({
<Checkbox
className="ml-3 mr-6"
checked={checkFinish}
onCheckedChange={(checked) =>
onCheckedChange={
(checked) => {
if (readonly) return;
setCheckFinish(checked === true);
}
// 'indeterminate' 상태를 무시하고 순수 boolean 값으로만 상태를 업데이트합니다.
setCheckFinish(checked === true)}
}
></Checkbox>
<Label>관로 표준공사비 산정 프로그램</Label>
<Button
@@ -350,7 +358,7 @@ export default function ConCostForm({
type="number"
step="0.001"
onChange={(e) => {
console.log('dmndQty ', e)
console.log("dmndQty ", e);
//field.onChange(Number(e.target.value) * 365 );
}}
value={Number(field.value) * 365 || 0}
@@ -377,7 +385,7 @@ export default function ConCostForm({
}
childrenBody={
<>
<ConstCostFeeTable/>
<ConstCostFeeTable />
</>
}
bodyClassName={"w-[40vw] h-full"}
@@ -414,8 +422,7 @@ export default function ConCostForm({
}
childrenBody={
<>
<RateFeeTableModal/>
<RateFeeTableModal />
</>
}
bodyClassName={"w-[22vw]"}
@@ -476,8 +483,7 @@ export default function ConCostForm({
type="number"
step="0.01"
onChange={(e) => {
console.log('totalConstCost ', e)
console.log("totalConstCost ", e);
}}
value={field.value ?? 0}
readOnly
@@ -521,6 +527,9 @@ export default function ConCostForm({
type="number"
step="0.01"
onChange={(e) => {
if(readonly) return;
field.onChange(Number(e.target.value));
}}
value={field.value ?? 0}
@@ -44,6 +44,7 @@ export function PbnstBuseForm({
indexBiz = 0,
setIndexBiz,
form,
readonly = false,
}: {
formType: string;
firstBizData?: fcBizType[];
@@ -51,6 +52,7 @@ export function PbnstBuseForm({
indexMng: number;
indexBiz: number;
setIndexBiz: (index: number) => void;
readonly?: boolean;
}) {
const {
code,
@@ -329,6 +331,7 @@ export function PbnstBuseForm({
onClick={addRuseFcltObj}
type="button"
size={commonButonSize}
disabled={readonly}
>
추가
</Button>
@@ -343,6 +346,7 @@ export function PbnstBuseForm({
sonClass="col-span-4"
indexMng={indexMng}
indexBiz={indexBiz}
readonly={readonly}
/>
<MngRegFormDetail
key={`buziMoney-${indexMng}-${indexBiz}`}
@@ -353,6 +357,7 @@ export function PbnstBuseForm({
sonClass="col-span-4"
indexMng={indexMng}
indexBiz={indexBiz}
readonly={readonly}
/>
<MngRegFormDetail
@@ -364,6 +369,7 @@ export function PbnstBuseForm({
sonClass="col-span-4"
indexMng={indexMng}
indexBiz={indexBiz}
readonly={readonly}
/>
<MngRegFormDetail
key={`concertedWater-${indexMng}-${indexBiz}`}
@@ -374,6 +380,7 @@ export function PbnstBuseForm({
sonClass="col-span-4"
indexMng={indexMng}
indexBiz={indexBiz}
readonly={readonly}
/>
<MngRegFormDetail
key={`wasteFcltinfo-${indexMng}-${indexBiz}`}
@@ -384,6 +391,7 @@ export function PbnstBuseForm({
sonClass="col-span-4"
indexMng={indexMng}
indexBiz={indexBiz}
readonly={readonly}
/>
<h1 className={formH1Class}>재이용 원수취수 현황</h1>
@@ -394,6 +402,7 @@ export function PbnstBuseForm({
onClick={() => setIsFcOrgwts(true)}
size={commonButonSize}
className=""
disabled={readonly}
>
추가등록
</Button>
@@ -412,6 +421,7 @@ export function PbnstBuseForm({
indexMng={indexMng}
formNm={"fcOrgwts"}
indexBiz={indexBiz}
readonly={readonly}
/>
</div>
<h1 className={formH1Class}>재이용 공급관로 설치 현황</h1>
@@ -424,6 +434,7 @@ export function PbnstBuseForm({
className="w-32"
selectClass="w-full"
onSelectValue={(val) => setPpiYn(String(val))}
readOnly={readonly}
/>
<Label className="text-right">합계</Label>
<Input
@@ -439,6 +450,7 @@ export function PbnstBuseForm({
size={commonButonSize}
className="!text-xl"
onClick={plusHist}
disabled={readonly}
>
추가등록
</Button>
@@ -447,6 +459,7 @@ export function PbnstBuseForm({
size={commonButonSize}
className="!text-xl !bg-red-500 !text-white ml-1"
onClick={removeSelected}
disabled={readonly}
>
삭제
</Button>
@@ -471,6 +484,7 @@ export function PbnstBuseForm({
form={form}
formNm={"pplInstls"}
upHeadList={[]}
readonly={readonly}
/>
</div>
@@ -494,7 +508,7 @@ export function PbnstBuseForm({
sonClass="col-span-4"
indexMng={indexMng}
indexBiz={indexBiz}
readonly={false}
readonly={readonly}
/>
</div>
@@ -510,6 +524,7 @@ export function PbnstBuseForm({
}}
size={commonButonSize}
className="mt-6 mr-3"
disabled={readonly}
>
수요처 추가
</Button>
@@ -523,6 +538,7 @@ export function PbnstBuseForm({
}}
size={commonButonSize}
className="mt-6"
disabled={readonly}
>
수요처 신규등록
</Button>
@@ -575,6 +591,7 @@ export function PbnstBuseForm({
searchPk: item.dmdInfoId,
};
})}
readonly={readonly}
></SearchInputText>
</FormUi>
)}
@@ -611,6 +628,7 @@ export function PbnstBuseForm({
selectArray={code.dmdUszCd}
onSelectValue={f.onChange}
value={f.value ?? code.dmdUszCd[0]?.val}
readOnly={readonly}
/>
</FormUi>
)}
@@ -630,6 +648,7 @@ export function PbnstBuseForm({
f.onChange(date),
}}
selectClass={"rounded-lg !w-full"}
readOnly={readonly}
/>
</FormUi>
)}
@@ -652,6 +671,7 @@ export function PbnstBuseForm({
f.onChange(date),
}}
selectClass={"rounded-lg !w-full"}
readOnly={readonly}
/>
</FormUi>
)}
@@ -670,6 +690,7 @@ export function PbnstBuseForm({
handleCommaNumberChange(e, f.onChange);
}}
value={formatCommaNumber(f.value)}
readOnly={readonly}
/>
</FormUi>
)}
@@ -690,6 +711,7 @@ export function PbnstBuseForm({
f.onChange(val)
}
value={f.value ?? code.yn[0]?.val}
readOnly={readonly}
/>
</FormUi>
)}
@@ -41,13 +41,13 @@ export function PbnstMngForm({
formType,
indexMng,
setIndexMng,
readonly
readonly,
}: {
form: UseFormReturn<{ items: PbnstRegArrrayType }>;
formType: string;
indexMng: number;
setIndexMng: (index: number) => void;
readonly:boolean
readonly: boolean;
}) {
const { code, pbnst, fileDelete, fileDownLoad } = useWrStore(
(state) => state
@@ -60,6 +60,7 @@ export function PbnstMngForm({
const [mngMtdCode, setMngMtdCode] =
useState<{ name: string; val: SelectDataType[] }[]>();
const {
fields: fcOpersField,
prepend,
@@ -87,7 +88,6 @@ export function PbnstMngForm({
endDt: new Date(),
});
//trigger(`items.${indexMng}.fcOpers`);
};
const removeSelected = () => {
@@ -318,6 +318,7 @@ export function PbnstMngForm({
size={commonButonSize}
className="!text-xl"
onClick={plusHist}
disabled={readonly}
>
추가등록
</Button>
@@ -326,6 +327,7 @@ export function PbnstMngForm({
size={commonButonSize}
className="!text-xl !bg-red-500 !text-white ml-1"
onClick={removeSelected}
disabled={readonly}
>
삭제
</Button>
@@ -335,20 +337,11 @@ export function PbnstMngForm({
<div className="h-[200px] overflow-y-auto">
<RuseMngTableForm
key={`ruse-table-${indexMng}-${fcOpersField.length}`} // 🔥 length까지 넣어야 동기화됨
tableData={form.getValues(`items.${indexMng}.fcOpers`) ||[]}
headList={
formType === "sttn"
? pbnst.pbnstMngUpHeadList.map((item) => {
return {
...item,
readonly: true,
};
})
: pbnst.pbnstMngUpHeadList
}
tableData={form.getValues(`items.${indexMng}.fcOpers`) || []}
headList={pbnst.pbnstMngUpHeadList}
upHeadList={pbnst.pbnstMngNm}
code={mngMtdCode || []}
readonly={readonly}
indexMng={indexMng}
form={form}
formNm={"fcOpers"}
@@ -372,7 +365,6 @@ export function PbnstMngForm({
maxLength={numSize} //입력제한
type="text"
onChange={(e) => {
if (formType !== "sttn")
handleCommaNumberChange(e, field.onChange);
}}
value={formatCommaNumber(field.value)}
@@ -396,7 +388,6 @@ export function PbnstMngForm({
maxLength={numSize} //입력제한
type="text"
onChange={(e) => {
if (formType !== "sttn")
handleCommaNumberChange(e, field.onChange);
}}
value={formatCommaNumber(field.value)}
@@ -419,7 +410,6 @@ export function PbnstMngForm({
maxLength={numSize} //입력제한
type="text"
onChange={(e) => {
if (formType !== "sttn")
handleCommaNumberChange(e, field.onChange);
}}
value={formatCommaNumber(field.value)}
@@ -435,7 +425,7 @@ export function PbnstMngForm({
</div>
<div className="grid grid-cols-12 gap-4 my-4">
<div className="col-span-6">
{formType === "sttn" ? (
{readonly ? (
relationfiles && relationfiles?.length > 0 ? (
<>
<Label className="text-3xl">계통도</Label>
@@ -472,7 +462,7 @@ export function PbnstMngForm({
)}
</div>
<div className="col-span-6">
{formType === "sttn" ? (
{readonly ? (
planFiles && planFiles?.length > 0 ? (
<>
<Label className="text-3xl">평면도</Label>
@@ -21,6 +21,7 @@ export default function MngRegFormDetail({
sonClass,
indexBiz,
indexMng,
readonly
}: {
formList: formDetailType[];
h1Title?: string;
@@ -30,6 +31,7 @@ export default function MngRegFormDetail({
indexBiz?: number;
indexMng?: number;
sonClass?: string;
readonly?:boolean
}) {
const { code } = useWrStore((state) => state);
@@ -67,7 +69,10 @@ export default function MngRegFormDetail({
field.onChange(date),
}}
selectClass={"w-full"}
disabled={formHead.option === "disabled" ? true : false}
readOnly={readonly
//|| formHead.option === "disabled" ? true : false
}
/>
) : formHead.type === "number" ? (
@@ -81,7 +86,9 @@ export default function MngRegFormDetail({
);
}}
value={formatCommaNumber(field.value)}
readOnly={formHead.option === "readOnly" ? true : false}
readOnly={readonly
// || formHead.option === "readOnly" ? true : false
}
disabled={formHead.option === "disabled" ? true : false}
maxLength={numSize}
/>
@@ -103,7 +110,9 @@ export default function MngRegFormDetail({
}
onSelectValue={field.onChange}
value={field.value?.trim() ?? (Array.isArray(potentialOptions) && potentialOptions[0]?.val)}
readOnly={formHead.option === "readOnly"}
readOnly={readonly
// || formHead.option === "readOnly"
}
/>
);
})()
@@ -113,7 +122,9 @@ export default function MngRegFormDetail({
type="text"
value={field.value ?? ""}
onChange={field.onChange}
readOnly={formHead.option === "readOnly" ? true : false}
readOnly={readonly
// || formHead.option === "readOnly" ? true : false
}
disabled={formHead.option === "disabled" ? true : false}
maxLength={txtSize}
/>
@@ -1,3 +1,4 @@
import { Input } from "@common/components/ui";
import React, { useCallback, useEffect, useRef, useState } from "react";
type SearchType = {
@@ -10,6 +11,7 @@ type thisProps = {
setValue: (searchNm?: string) => void;
setRtnData: (rtnData: any) => void;
searchList?: any[];
readonly?:boolean
};
export default function SearchInputText({
label = undefined,
@@ -17,6 +19,7 @@ export default function SearchInputText({
setValue = () => {},
setRtnData = () => {},
searchList = undefined,
readonly = false, // 추가: readonly prop
}: thisProps) {
const [isOpen, setIsOpen] = useState(false);
@@ -65,13 +68,14 @@ export default function SearchInputText({
return (
<div ref={wrapperRef}>
<input
<Input
type="text"
value={textValue}
onChange={handleInputChange}
/* onFocus={() => setIsOpen(true)} */
className="w-full h-[3.2rem] !text-xl pl-3 text-gray-600 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
placeholder={`${label}을(를) 입력하세요`}
readOnly={readonly} // readonly 상태 적용
/>
{isOpen && (
<div className=" z-1 w-full mt-2 bg-white border border-gray-300 rounded-md shadow-lg h-90 overflow-auto">
@@ -35,6 +35,7 @@ type RuseMngTableProps = {
indexBiz?: number;
form?: any;
formNm?: string;
readonly?: boolean;
};
const RuseMngTableForm = React.forwardRef<any, RuseMngTableProps>(
@@ -48,6 +49,7 @@ const RuseMngTableForm = React.forwardRef<any, RuseMngTableProps>(
form,
formNm,
indexBiz,
readonly= false
},
ref
) => {
@@ -111,7 +113,7 @@ const RuseMngTableForm = React.forwardRef<any, RuseMngTableProps>(
? formatCommaNumber(field.value)
: field.value || ""
}
readOnly={head.readonly ? true : false}
readOnly={readonly|| head.readonly ? true : false}
maxLength={head.maxLength?head.maxLength:15}
/>
) : head.type === "select" ? (
@@ -132,7 +134,7 @@ const RuseMngTableForm = React.forwardRef<any, RuseMngTableProps>(
field.onChange(val);
}
}}
readOnly={head.readonly ? true : false}
readOnly={ readonly||head.readonly ? true : false}
// Disabled prop removed as SelectBox does not support it
></SelectBox>
) : head.type === "date" ? (
@@ -149,14 +151,18 @@ const RuseMngTableForm = React.forwardRef<any, RuseMngTableProps>(
},
}}
selectClass={"w-full"}
readOnly={head.readonly ? true : false}
readOnly={readonly||head.readonly ? true : false}
/>
) : head.type === "checkbox" ? (
<Checkbox
className=""
checked={field.value || false}
onCheckedChange={(checked) => {
field.onChange(checked);
if(readonly || head.readonly) {
return;
}else{
field.onChange(checked);
}
}}
></Checkbox>
) : (