diff --git a/.gitignore b/.gitignore index d0bb49da9..6b685ea40 100644 --- a/.gitignore +++ b/.gitignore @@ -18,5 +18,5 @@ apps/wr/.next/**/* apps/fo/.next/**/* # env -.env* +#.env* .qodo diff --git a/apps/wr/.env.development b/apps/wr/.env.development new file mode 100644 index 000000000..dccfb1453 --- /dev/null +++ b/apps/wr/.env.development @@ -0,0 +1,12 @@ +NEXT_PUBLIC_SITE_ID = WR +NEXT_PUBLIC_PORT = 11301 +NEXT_PUBLIC_PROXY_HOST = http://con.mind-one.co.kr:11301 +NEXT_PUBLIC_SERVER_API_URL = http://dev.onasys.co.kr:8000 +NEXT_PUBLIC_GEOSERVER_URL = http://rsone.iptime.org:10010/geoserver +NEXT_PUBLIC_TEMP_GEOSERVER_URL = http://con.mind-one.co.kr:11306/geoserver #TODO 운영에서 바꿔야 함 +NEXT_PUBLIC_CLAIM_NAME = Authorization +NEXT_PUBLIC_AUTH_USER_ID = token-id +NEXT_PUBLIC_ACCESS_TOKEN = access-token +NEXT_PUBLIC_REFRESH_TOKEN = refresh-token + +NEXT_PUBLIC_SEWERAGE_API_URL=http://con.mind-one.co.kr:11083/sewerage-service/api # 개발 서버 API diff --git a/apps/wr/.env.local b/apps/wr/.env.local new file mode 100644 index 000000000..858181f32 --- /dev/null +++ b/apps/wr/.env.local @@ -0,0 +1,14 @@ +NEXT_PUBLIC_SITE_ID = WR +NEXT_PUBLIC_PORT = 3001 +NEXT_PUBLIC_PROXY_HOST = http://localhost:3001 +NEXT_PUBLIC_SERVER_API_URL = http://dev.onasys.co.kr:8000 +NEXT_PUBLIC_GEOSERVER_URL = http://rsone.iptime.org:10010/geoserver +NEXT_PUBLIC_TEMP_GEOSERVER_URL = http://con.mind-one.co.kr:11306/geoserver #TODO 운영에서 바꿔야 함 +NEXT_PUBLIC_CLAIM_NAME = Authorization +NEXT_PUBLIC_AUTH_USER_ID = token-id +NEXT_PUBLIC_ACCESS_TOKEN = access-token +NEXT_PUBLIC_REFRESH_TOKEN = refresh-token + +NEXT_PUBLIC_SEWERAGE_API_URL=http://con.mind-one.co.kr:11083/sewerage-service/api # 개발 서버 API +#NEXT_PUBLIC_SEWERAGE_API_URL=http://192.168.1.128:8883/sewerage-service/api # 최용성 +#NEXT_PUBLIC_SEWERAGE_API_URL=http://192.168.1.66:8883/sewerage-service/api # 박이정 diff --git a/apps/wr/.gitignore b/apps/wr/.gitignore index 5ef6a5207..8c5b2ee3a 100644 --- a/apps/wr/.gitignore +++ b/apps/wr/.gitignore @@ -31,7 +31,7 @@ yarn-error.log* .pnpm-debug.log* # env files (can opt-in for committing if needed) -.env* +#.env* # vercel .vercel diff --git a/apps/wr/app/map/newWindowPopup.tsx b/apps/wr/app/map/newWindowPopup.tsx index 777c3dcf2..ebfcac1ca 100644 --- a/apps/wr/app/map/newWindowPopup.tsx +++ b/apps/wr/app/map/newWindowPopup.tsx @@ -2,11 +2,12 @@ import { useWrStore } from "@/app/store"; import { btnClass } from "@/app/store/common/code"; import type { customPbnst } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg/type"; import { excelDownload } from "@/components/lib/func/commom"; -import { Title, UiTable, UITab } from '@common/business_components'; +import { Title, UiTable, UITab, ContentsDiv } from '@common/business_components'; import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; import { Button } from "@common/components/ui"; import React, { useCallback, useState, useEffect } from 'react'; import NewWindowPortal from '@/app/map/newWindowPortal'; +import PbnstPrfmncSttnPopup from "@/app/map/pbnstPrfmncSttnPopup"; import { PbnstSttnModal } from "@/components/ui/modal/sttn/pbnstSttnModal/pbnstSttnModal"; import type { WaterReuseFacility } from "@/app/store/ruseFcltMng/fcltSttn/pbnstSttn/type"; import type { chgBuilding, customRainBdst } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; @@ -15,7 +16,6 @@ import RswtrPrfmncsSttnPopup from "@/app/map/rswtrPrfmncSttnPopup"; import type { customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg"; import HtdflPrfmncSttnPopup from "@/app/map/htdflPrfmncSttnPopup"; import type { customHtdflBdst } from "@/app/store/ruseFcltMng/fcltReg/htdflReg"; -import { getFetch } from "@/components/lib/api"; interface NewWindowPopupProps { featureData: any; @@ -24,6 +24,13 @@ interface NewWindowPopupProps { onClose: () => void; } +// 탭 +const TABS = [ + { val: "0", text: "재이용시설1" }, + { val: "1", text: "재이용시설2" }, + { val: "2", text: "재이용시설n" }, +]; + // 데이터의 속성(key)을 사용자에게 보여줄 한글 이름으로 변환하기 위한 맵 // 실제 데이터에 맞게 이 부분을 확장해야 합니다. const propertyNameMap: { [key: string]: string } = { @@ -40,10 +47,9 @@ const NewWindowPopup: React.FC = ({ checkedLayersData = [], onClose }) => { - const [tabData, setTabData] = useState<{ id: string; name: string; data: any }[]>([]); - const [activeTab, setActiveTab] = useState('0'); + const [activeTab, setActiveTab] = useState(TABS[0]?.val ?? "0"); // swcho : useState의 true, false 값 변경하여 목록, 상태 테스트 하였음 - const [showDetailView, setShowDetailView] = useState(false); // 상세정보 화면 표시 상태 추가 + const [showDetailView, setShowDetailView] = useState(true); // 상세정보 화면 표시 상태 추가 // onClose 함수를 useCallback으로 메모이제이션 const memoizedOnClose = useCallback(() => { @@ -61,7 +67,6 @@ const NewWindowPopup: React.FC = ({ } = useWrStore((state) => state); const [bdstTable, setBdstTable] = useState(); const [pageNation, setPageNation] = useState(1); - const [pbnstRuseFcltPk, setPbnstRuseFcltPk] = useState(''); const [pbnDetaileData, setPbnDetaileData] = useState<{ isModal: boolean; data: customPbnst; @@ -102,6 +107,10 @@ const NewWindowPopup: React.FC = ({ return null; } + // 2. RuseMngTable에 필요한 tableData를 생성합니다. (단일 행 데이터) + const tableData = [featureData]; + console.log("tableData", tableData); + // 물재이용시설 cellClick 이벤트 (상세정보) const pbnstCellClick = (index: number | undefined) => { if ( @@ -109,93 +118,20 @@ const NewWindowPopup: React.FC = ({ pbnstSttn.pbnstSttnRes && pbnstSttn.pbnstSttnRes[index] ) { - setPbnstRuseFcltPk(pbnstSttn.pbnstSttnRes[index].pbnstRuseFcltPk); - fetchpbnstDetail(pbnstSttn.pbnstSttnRes[index].pbnstRuseFcltPk) - setActiveTab(pbnstSttn.pbnstSttnRes[index].pbnstRuseFcltPk) - setShowDetailView(true); // 상세정보 화면 표시 상태 변경 + const pbnstRuseFcltPk = pbnstSttn.pbnstSttnRes[index].pbnstRuseFcltPk; + getPbnStnDetail(pbnstRuseFcltPk); } }; - useEffect(() => { - if (!pbnstSttn.isInit) { - pbnSttnInit("1", "13",{ - partValue: "A", - sidoValue: "0", - sigunValue: "", - regionValue: "", - unitWaterShedValue: "", - middleRegionValue: "", - envPartValue: "", - sidoText: "", - sigunText: "" - }, String(new Date().getFullYear())); - } - }, [pbnstSttn.isInit]); - - useEffect(() => { - setBdstTable(pbnstSttn.pbnstSttnRes); - }, [pbnstSttn.pbnstSttnRes]); - -// 재이용시설 상세정보 - const setTabDataFunc = (res:any, pk:string) => { - setTabData((prev) => { - if (prev.some((tab) => tab.id === pk)) { - return prev; // 이미 존재하는 탭이면 추가하지 않음 - } - return [...prev, { id: pk, name: `재이용시설 ${prev.length + 1}`, data: res }]; - }); - } - // 재이용시설 조회 - const fetchpbnstDetail = async (featureCd: string) => { - try { - const response = await getFetch("wr", `/reuseFc/pubFc/${featureCd}`); - // 중복 데이터 추가 방지 - setTabDataFunc(response, featureCd); - } catch (error) { - console.error("Error fetching data:", error); - } - }; - // 재이용시설 페이징처리 관련 함수 - const onPageChangeHandler = useCallback((page: number) => { - pbnstSttnSearch( - String(page), - String(13), - { - partValue: "A", - sidoValue: "0", - sigunValue: "", - regionValue: "", - unitWaterShedValue: "", - middleRegionValue: "", - envPartValue: "", - sidoText: "", - sigunText: "", - }, - "", - String(new Date().getFullYear()) - ); - }, []); - // useEffect(() => { - // if (featureData) { - // const selectedVal = featureData.getProperties(); - // const featureCd = selectedVal?.swtrmt_fclt_cd; - // if (featureCd && featureCd !== pbnstRuseFcltPk) { - // setPbnstRuseFcltPk(featureCd); // 현재 호출된 featureCd 저장 - // setActiveTab(featureCd) - // fetchpbnstDetail(featureCd); // 상세정보 가져오기 - // } - // } - // }, [featureData]); - useEffect(() => { - if (pbnstSttn.pbnstDetail) { - setPbnDetaileData({ - isModal: true, - data: pbnstSttn.pbnstDetail, - }); - } + setBdstTable(pbnstSttn.pbnstSttnRes); + }, [pbnstSttn.pbnstSttnRes]); + + useEffect(() => { + if (pbnstSttn.pbnstDetail.pbnstRuseFcltPk) setShowDetailView(true); }, [pbnstSttn.pbnstDetail]); + // 빗물재이용시설 cellClick 이벤트 (상세정보) const rainCellClick = (index: number | undefined, headId: string) => { if ( @@ -247,8 +183,7 @@ const NewWindowPopup: React.FC = ({ const hasWaterTreatmentLayer = checkedLayersData.some(layer => layer.data?.lyrNm?.includes('하수처리') || layer.data?.lyrNm?.includes('재이용시설') ); - const actTabData = tabData.find((tab) => tab.id === activeTab); - console.log('tavbData',actTabData) + // swcho : true, false 값 변경하여 시설 변경하여 테스트하였음 // 재이용시설 const isPbnst = true; @@ -258,181 +193,182 @@ const NewWindowPopup: React.FC = ({ const isRswt = false; // 온배수시설 const isHtdfl = false; - if (isPbnst) { - if (showDetailView) { - // 재이용시설 상세 - return ( + + + return ( +
+ {/* 체크된 레이어가 없는 경우 (재이용시설 목록) */} + {isPbnst && ( <> -
- - </div> - <div className="flex justify-between items-center mb-8"> - <UITab - defaultValue={activeTab} - tabList={tabData.map((tab) => ({ - value: tab.id, - label: tab.name, - onClick: () => setActiveTab(tab.id), - }))} - children={undefined} - /> - </div> - <PbnstSttnModal - data={tabData.find((tab) => tab.id === activeTab)?.data[0] || ({} as customPbnst)} - titleVisible={false} - /> + {showDetailView ? ( + // 재이용시설 상세 + <> + <div className="flex justify-between items-center mb-4"> + <Title title='하수재이용시설 상세정보' /> + </div> + <div className="flex justify-between items-center mb-8"> + <UITab + defaultValue={TABS[0]?.val} + tabList={TABS.map((tab) => ({ + value: tab.val, + label: tab.text, + onClick: () => setActiveTab(tab.val), + }))} + children={undefined} + /> + </div> + <PbnstSttnModal + data={pbnDetaileData.data || ({} as customPbnst)} + titleVisible={false} + /> + <PbnstPrfmncSttnPopup isVisible={false} /> + </> + ) : ( + // 재이용시설 목록 + <> + <div className="flex justify-between items-center"> + <Title title='하수재이용시설 현황' /> + <div className="flex gap-2 mt-8"> + <Button className={btnClass} color="primary" onClick={excelClick}>엑셀다운로드</Button> + </div> + </div> + <UiTable + headName={[]} + tableData={bdstTable || []} + children={ + <HeadMakeColSpan upHeadList={pbnstSttn.pbnstSttNodeList} /> + } + headlist={pbnstSttn.pbnstSttHeadList} + pageSize={20} + total={100000} + cellClick={(index: number | undefined, headId: string) => { + pbnstCellClick(index); + }} + onPageChange={setPageNation} + /> + </> + )} </> - ); - } else { - // 재이용시설 목록 - return ( + )} + {/* 빗물이용시설 */} + {isRain && ( <> - <div className="flex justify-between items-center"> - <Title title="하수재이용시설 현황" /> - <div className="flex gap-2 mt-8"> - <Button className={btnClass} color="primary" onClick={excelClick}> - 엑셀다운로드 - </Button> - </div> - </div> - <UiTable - headName={[]} - tableData={bdstTable || []} - children={<HeadMakeColSpan upHeadList={pbnstSttn.pbnstSttNodeList} />} - headlist={pbnstSttn.pbnstSttHeadList} - pageSize={20} - total={100000} - cellClick={(index: number | undefined, headId: string) => { - pbnstCellClick(index); - }} - onPageChange={onPageChangeHandler} - /> + {showDetailView ? ( + // 빗물이용시설 상세 + <> + <div className="flex justify-between items-center mb-4"> + <Title title='빗물이용시설 상세정보' /> + </div> + <RainPrfmncSttnPopup rainForm={rainDetailModal.data as customRainBdst} isModal={false} /> + {/* TODO: 지도 점검 결과 현황 추가 할 것 */} + </> + ) : ( + // 빗물이용시설 목록 + <> + <div className="flex justify-between items-center"> + <Title title='빗물이용시설 현황' /> + <div className="flex gap-2 mt-8"> + <Button className={btnClass} color="primary" onClick={excelClick}>엑셀다운로드</Button> + </div> + </div> + <UiTable + headName={[]} + tableData={rainTable || []} + children={ + <HeadMakeColSpan upHeadList={rainSttn.rainSttNodeList} /> + } + headlist={rainSttn.rainSttHeadList} + pageSize={20} + total={100000} + cellClick={(index: number | undefined, headId: string) => { + rainCellClick(index ?? undefined, headId) + }} + onPageChange={setPageNation} + /> + </> + )} </> - ); - } - } - - if (isRain) { - if (showDetailView) { - // 빗물이용시설 상세 - return ( + )} + {/* 중수도시설 */} + {isRswt && ( <> - <div className="flex justify-between items-center mb-4"> - <Title title="빗물이용시설 상세정보" /> - </div> - <RainPrfmncSttnPopup rainForm={rainDetailModal.data as customRainBdst} isModal={false} /> + {showDetailView ? ( + // 재이용시설 상세 + <> + <div className="flex justify-between items-center mb-4"> + <Title title='중수도시설 상세정보' /> + </div> + <RswtrPrfmncsSttnPopup rswtForm={rswtrDetailModal.data as customRswtBdst} isModal={false} /> + {/* TODO: 지도 점검 결과 현황 추가 할 것 */} + </> + ) : ( + // 재이용시설 목록 + <> + <div className="flex justify-between items-center"> + <Title title='중수도시설 현황' /> + <div className="flex gap-2 mt-8"> + <Button className={btnClass} color="primary" onClick={excelClick}>엑셀다운로드</Button> + </div> + </div> + <UiTable + headName={[]} + tableData={rswtrTable || []} + children={ + <HeadMakeColSpan upHeadList={rswtSttn.rswtSttNodeList} /> + } + headlist={rswtSttn.rswtSttHeadList} + pageSize={20} + total={100000} + cellClick={(index: number | undefined, headId: string) => { + rswtCellClick(index, headId); + }} + onPageChange={setPageNation} + /> + </> + )} </> - ); - } else { - // 빗물이용시설 목록 - return ( + )} + {/* 온배수시설 */} + {isHtdfl && ( <> - <div className="flex justify-between items-center"> - <Title title="빗물이용시설 현황" /> - <div className="flex gap-2 mt-8"> - <Button className={btnClass} color="primary" onClick={excelClick}> - 엑셀다운로드 - </Button> - </div> - </div> - <UiTable - headName={[]} - tableData={rainTable || []} - children={<HeadMakeColSpan upHeadList={rainSttn.rainSttNodeList} />} - headlist={rainSttn.rainSttHeadList} - pageSize={20} - total={100000} - cellClick={(index: number | undefined, headId: string) => { - rainCellClick(index ?? undefined, headId); - }} - onPageChange={setPageNation} - /> + {showDetailView ? ( + // 재이용시설 상세 + <> + <div className="flex justify-between items-center mb-4"> + <Title title='온배수시설 상세정보' /> + </div> + {/* <HtdflPrfmncSttnPopup htdflForm={htdflDetailModal.data as customHtdflBdst} isModal={false} /> */} + <HtdflPrfmncSttnPopup htdflForm={htdflDetailModal.data as customHtdflBdst} isModal={false} /> + </> + ) : ( + // 재이용시설 목록 + <> + <div className="flex justify-between items-center"> + <Title title='온배수시설 현황' /> + <div className="flex gap-2 mt-8"> + <Button className={btnClass} color="primary" onClick={excelClick}>엑셀다운로드</Button> + </div> + </div> + <UiTable + headName={[]} + tableData={bdstTable || []} + children={ + <HeadMakeColSpan upHeadList={htdflSttn.htdflSttNodeList} /> + } + headlist={htdflSttn.htdflSttHeadList} + pageSize={20} + total={100000} + cellClick={(index: number | undefined, headId: string) => { + htdflCellClick(index ?? undefined, headId); + }} + onPageChange={setPageNation} + /> + </> + )} </> - ); - } - } - - if (isRswt) { - if (showDetailView) { - // 중수도시설 상세 - return ( - <> - <div className="flex justify-between items-center mb-4"> - <Title title="중수도시설 상세정보" /> - </div> - <RswtrPrfmncsSttnPopup rswtForm={rswtrDetailModal.data as customRswtBdst} isModal={false} /> - </> - ); - } else { - // 중수도시설 목록 - return ( - <> - <div className="flex justify-between items-center"> - <Title title="중수도시설 현황" /> - <div className="flex gap-2 mt-8"> - <Button className={btnClass} color="primary" onClick={excelClick}> - 엑셀다운로드 - </Button> - </div> - </div> - <UiTable - headName={[]} - tableData={rswtrTable || []} - children={<HeadMakeColSpan upHeadList={rswtSttn.rswtSttNodeList} />} - headlist={rswtSttn.rswtSttHeadList} - pageSize={20} - total={100000} - cellClick={(index: number | undefined, headId: string) => { - rswtCellClick(index, headId); - }} - onPageChange={setPageNation} - /> - </> - ); - } - } - - if (isHtdfl) { - if (showDetailView) { - // 온배수시설 상세 - return ( - <> - <div className="flex justify-between items-center mb-4"> - <Title title="온배수시설 상세정보" /> - </div> - <HtdflPrfmncSttnPopup htdflForm={htdflDetailModal.data as customHtdflBdst} isModal={false} /> - </> - ); - } else { - // 온배수시설 목록 - return ( - <> - <div className="flex justify-between items-center"> - <Title title="온배수시설 현황" /> - <div className="flex gap-2 mt-8"> - <Button className={btnClass} color="primary" onClick={excelClick}> - 엑셀다운로드 - </Button> - </div> - </div> - <UiTable - headName={[]} - tableData={htdflTable || []} - children={<HeadMakeColSpan upHeadList={htdflSttn.htdflSttNodeList} />} - headlist={htdflSttn.htdflSttHeadList} - pageSize={20} - total={100000} - cellClick={(index: number | undefined, headId: string) => { - htdflCellClick(index ?? undefined, headId); - }} - onPageChange={setPageNation} - /> - </> - ); - } - } - - return null; // 조건에 맞는 콘텐츠가 없을 경우 + )} + </div> + ); }; return ( diff --git a/apps/wr/app/map/service/map.ts b/apps/wr/app/map/service/map.ts index bf0c8a694..5002afef7 100644 --- a/apps/wr/app/map/service/map.ts +++ b/apps/wr/app/map/service/map.ts @@ -2,8 +2,8 @@ /** * 관망도 API */ -// const API_URL = `${process.env.NEXT_PUBLIC_SEWERAGE_API_URL}/v1/map` -const API_URL = "http://con.mind-one.co.kr:11083/sewerage-service/api/v1/map"; + const API_URL = `${process.env.NEXT_PUBLIC_SEWERAGE_API_URL}/v1/map` +//const API_URL = "http://con.mind-one.co.kr:11083/sewerage-service/api/v1/map"; export type LyrStngProps = { lyr_sn: string diff --git a/apps/wr/app/matMng/coMat/coMatRvw/page.tsx b/apps/wr/app/matMng/coMat/coMatRvw/page.tsx index 5d4592ad5..c1e601320 100644 --- a/apps/wr/app/matMng/coMat/coMatRvw/page.tsx +++ b/apps/wr/app/matMng/coMat/coMatRvw/page.tsx @@ -1,4 +1,5 @@ "use client"; + import { useWrStore } from "@/app/store"; import { DmdCoReqSchema, @@ -8,7 +9,6 @@ import { } from "@/app/store/matDmd/coMatRvw/type"; import { formH1Class, formTableName } from "@/components/lib/class/comClass"; import { - formatPhoneNumber, getCity, getdmdMatFlag, tableData, @@ -112,20 +112,18 @@ export default function CoMatRvw() { }, [form.watch("useUsgCd")]); useEffect(() => { - if (coMatRvwRes&&coMatRvwRes.length > 0) { + if (coMatRvwRes.length > 0) { const data = coMatRvwRes?.map((item, index) => { let flag = ""; - - flag = getdmdMatFlag(item?.demandMatching?.splyFcltFlg||undefined); - + flag = getdmdMatFlag(item?.demandMatching?.splyFcltFlg ??""); return { ...item, ctpvCd: item.demandCo?.ctpvCd, sggCd: item.demandCo?.sggCd, dmdCoNm: item.demandCo?.dmdCoNm, daddr: item.demandCo?.daddr, - telno: formatPhoneNumber(item.demandCo?.telno||'') , - + telno: item.demandCo?.telno, + regDt: moment(item?.demandCo?.regDt).format("YYYY-MM-DD"), splyFcltFlg: flag, }; }); @@ -183,7 +181,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" @@ -271,7 +269,7 @@ export default function CoMatRvw() { ></UiTable> </ListDiv> <hr /> - {/* <ScrollArea className="h-[49vh]"> */} + <ScrollArea className="h-[49vh]"> <ListDiv> <h3 className="mt-4 ml-2 text-2xl font-medium text-label"> 수요신청 상세현황 @@ -664,7 +662,7 @@ export default function CoMatRvw() { </Form> <ConCostForm form={form} type={"mat"} /> </ListDiv> - {/* </ScrollArea> */} + </ScrollArea> </div> </div> </ContentsDiv> diff --git a/apps/wr/app/matMng/coMng/coSttn/page.tsx b/apps/wr/app/matMng/coMng/coSttn/page.tsx index 9b682a2aa..181a5d82f 100644 --- a/apps/wr/app/matMng/coMng/coSttn/page.tsx +++ b/apps/wr/app/matMng/coMng/coSttn/page.tsx @@ -26,7 +26,6 @@ import ListDiv from "@common/business_components/ui/list_div"; import SdmInsertForm from "@common/business_components/ui/sdmInsertForm"; import type { DemandCompType } from "@common/business_components/ui/sdmInsertForm/form"; import { Button } from "@common/components/ui"; -import moment from "moment"; import { useCallback, useEffect, useState } from "react"; import toast, { Toaster } from "react-hot-toast"; @@ -84,10 +83,6 @@ export default function CoSttn() { const data = tableData(coSttnRes, { code }); const chData = data.map((item: any) => ({ ...item, - regDt: moment(item.regDt).format("YYYY-MM-DD") - - - })); // .filter((item: any) => item !== undefined); setBdstTable(chData); @@ -187,7 +182,7 @@ export default function CoSttn() { onClick={() => { /* 저장 로직 */ if (!upadateData) { - toast.error("수요처 변경을 원하는 행을 선택해주세요") + <ToastFormUi body={"수요처 변경을 원하는 행을 선택해주세요"} title={"수요처관리"}></ToastFormUi>; }else{ setIsDmdModal({ ...isDmdModal, @@ -195,7 +190,7 @@ export default function CoSttn() { } }} > - 수정 + 저장 </Button> <Button size={"sm"} diff --git a/apps/wr/app/matMng/coMng/ldrmntCoSttn/page.tsx b/apps/wr/app/matMng/coMng/ldrmntCoSttn/page.tsx index e33bcc265..eb43b29bf 100644 --- a/apps/wr/app/matMng/coMng/ldrmntCoSttn/page.tsx +++ b/apps/wr/app/matMng/coMng/ldrmntCoSttn/page.tsx @@ -28,10 +28,8 @@ import { type SelectDataType } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; -import LoadingOverlay from "@common/business_components/ui/loadingBar"; import { Button } from "@common/components/ui"; import { useCallback, useEffect, useRef, useState } from "react"; -import { Toaster } from "react-hot-toast"; export default function LdrmntCoSttn() { const { code, ldrmnt, ldrmntInit, ldrmntSearch, } = useWrStore( @@ -275,7 +273,7 @@ export default function LdrmntCoSttn() { <div className="overflow-x-auto"> <ListDiv className="min-w-max"> <UiTable - headName={undefined} + headName={[]} tableData={bdstTable || []} headlist={ldrmntHeadListExport} pageSize={20} @@ -301,9 +299,8 @@ export default function LdrmntCoSttn() { setIsExcelOpen({ isModal: !isExcelOpen.isModal }) }} bodyClass={"w-[40vw] max-w-none"} - body={<CoRegExcel isModal={(isOpen) => setIsExcelOpen({ isModal: isOpen })} />} + body={<CoRegExcel />} /> - <Toaster position="top-center"></Toaster> </div> diff --git a/apps/wr/app/ruseFcltMng/fcltSttn/htdflSttn/page.tsx b/apps/wr/app/ruseFcltMng/fcltSttn/htdflSttn/page.tsx index 03b549270..e43d5b04f 100644 --- a/apps/wr/app/ruseFcltMng/fcltSttn/htdflSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltSttn/htdflSttn/page.tsx @@ -8,7 +8,6 @@ import type { } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { excelDownload, - getCity, getCityOrSgg, tableData, } from "@/components/lib/func/commom"; @@ -17,22 +16,16 @@ import SttnDetailModal from "@/components/ui/modal/sttn/sttnDetailModal/sttnDeta import { ContentsDiv, SearchBaseForm, - SearchDiv, - SearchFormLeft, - SearchFormRight, - SelectBox, Title, UiModal, UiTable, type ReturnType, - type SelectDataType, } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; import { Button } from "@common/components/ui"; import { useCallback, useEffect, useRef, useState } from "react"; import { excelHtdflSttnParsing } from "@/app/store/ruseFcltMng/fcltSttn/htdflSttn/excel"; import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; -import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal"; export default function HtdflSttn() { const { code, htdflSttn, htdflSttnSearch, initHtdfl } = useWrStore( @@ -45,8 +38,6 @@ export default function HtdflSttn() { const [pageNation, setPageNation] = useState(1); const [isChHead, setIsChHead] = useState(false); const [bdstTable, setBdstTable] = useState<customRainBdst[]>(); - const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>() - const [objSearch, setObjSearch] = useState<objSearchType>({ sgg: "", city: "" }); const [detailModal, setDetailModal] = useState<{ isOpen: boolean; data: customRainBdst | undefined; @@ -59,44 +50,13 @@ export default function HtdflSttn() { const codeData = getCityOrSgg(ref); const excelClick = useCallback(() => { - // 최신 검색 조건 반영 - const con = getConValue(); - htdflSttnSearch(1, "10000", String(con), code.cityCd, code.sggCd); - }, [htdflSttnSearch, objSearch, code.cityCd, code.sggCd]); + if (codeData) htdflSttnSearch(1, "10000", codeData); + }, [htdflSttnSearch, codeData]); useEffect(() => { - if (codeData != null) htdflSttnSearch(pageNation, "20", codeData, code.cityCd, code.sggCd); + if (codeData != null) htdflSttnSearch(pageNation, "20", codeData); }, [pageNation]); - const getSelCity = (val: string | number) => { - const cityValue = String(val); - - if (cityValue === "0") { - setSelectSgg([]); - setObjSearch({ city: cityValue, sgg: "" }); - } else { - const data = getCity(cityValue, code.sggCd); - setSelectSgg(data); - - const firstSggVal = data.find(item => item.val === "0")?.val || (data[0]?.val ?? ""); - setObjSearch({ city: cityValue, sgg: firstSggVal }); - } - }; - - const getSgg = (val: string | number) => { - setObjSearch({ ...objSearch, sgg: String(val) }) - }; - - const getConValue = () => { - if (!objSearch.city || objSearch.city === "0") { - return "0"; - } - if (objSearch.sgg && objSearch.sgg !== "0") { - return objSearch.sgg; - } - return objSearch.city; - }; - const cellClick = (index: number | undefined, headId: string) => { if ( headId !== "chBuildingYn" && @@ -107,15 +67,20 @@ export default function HtdflSttn() { } }; useEffect(() => { - if (htdflSttn.excelList.length > 0) { - if (htdflSttn.excelList.length === 0) return; - excelDownload( - htdflSttn.excelList, - "온배수시설 현황", - "sample_htdflSttn.xlsx", - "A1:S3" - ); - } + const excelDown = async () => { + if (htdflSttn.excelList.length > 0) { + if (htdflSttn.excelList.length === 0) return; + const excelData = await tableData(htdflSttn.excelList, { code }); + const htdflExcel = excelHtdflSttnParsing(excelData, code.cityCd, code.sggCd); + excelDownload( + htdflExcel as [[]], + "온배수시설 현황", + "sample_htdflSttn.xlsx", + "A1:S3" + ); + } + }; + excelDown(); }, [htdflSttn.excelList, code]); useEffect(() => { @@ -125,16 +90,19 @@ export default function HtdflSttn() { }, [htdflSttn.isInit, initHtdfl]); useEffect(() => { - const data = tableData(htdflSttnRes, { code }); - const chData = data - .map((item: any) => ({ - ...item, - ...item.reuseBuilding[0], - ...item.reuseBuilding[0].htdflObj, - chBuildingYn: item.chgBuilding[0]?.bdstChgNm !== null ? "Y" : "N", - })) - .filter((item: any) => item.htdflObj !== undefined); - setBdstTable(chData); + if (htdflSttnRes.length > 0 && code.cityCd.length > 0) { + const data = tableData(htdflSttnRes, { code }); + const chData = data + .map((item: any) => ({ + ...item, + ...item.reuseBuilding[0], + ...item.reuseBuilding[0].htdflObj, + chBuildingYn: item.chgBuilding[0]?.bdstChgNm !== null ? "Y" : "N", + })) + .filter((item: any) => item.htdflObj !== undefined); + + setBdstTable(chData); + } }, [code, htdflSttnRes, htdflSttn.htdflSttHeadList]); return ( @@ -143,65 +111,43 @@ export default function HtdflSttn() { <div className="grid grid-cols-4 gap-4 "> <div className="col-span-4"> <Title title={"온배수 시설 현황"} /> - - <SearchDiv> - <SearchFormLeft> - <div className="col-span-10 flex flex-row"> - <SelectBox - className="col-span-2 w-1/6 h-full text-2xl" - label="시도" - selectClass={""} - selectArray={code.cityCd} - onSelectValue={getSelCity} - /> - <SelectBox - className="col-span-2 w-1/6 h-full text-2xl ml-4" - label="시군구" - selectClass={""} - selectArray={selectSgg || []} - value={objSearch.sgg} // value props 추가 - onSelectValue={getSgg} - /> - </div> - </SearchFormLeft> - <SearchFormRight - className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 "> - <div className="flex flex-row space-x-2 items-center"> - <Button - size={"sm"} - onClick={() => { - const con = getConValue(); - htdflSttnSearch(1, "20", String(con), code.cityCd, code.sggCd); - }} - > - 조회 - </Button> - <Button - size={"sm"} - className={`${btnClass} green`} - onClick={excelClick} - > - 다운로드 - </Button> - <Button - size={"sm"} - className={btnClass} - onClick={() => { - setIsChHead(true); - }} - > - 조회항목설정 - </Button> - </div> - </SearchFormRight> - </SearchDiv> + <SearchBaseForm + selectSidoData={code.cityCd} + selectSigunData={code.sggCd} + selectRegionData={code.rvbsnCd} + selectUnitWaterShedData={code.lgbsnCd} + selectMiddleRegionData={code.mdmbsnCd} + selectEnvPartData={code.lclgvrnmntCd} + rightChildren={<Button + className={btnClass} + onClick={() => { + setIsChHead(true); + } } + > + 조회항목설정 + </Button>} + leftChildren={undefined} + queryClick={function (returnType: ReturnType): void { + // '{partValue: 'A', sidoValue: '0', sigunValue: '0', regionValue: '0', unitWaterShedValue: '0', …}' + let con; + if (returnType.sigunValue != "0") { + con = returnType.sigunValue; + } else { + con = returnType.sidoValue; + } + htdflSttnSearch(pageNation, "20", con); + } } + excelClick={excelClick} + initClick={function (): void { } } + btnClass={btnClass} + ref={ref} isAdmin={false} /> </div> </div> <div className="grid grid-cols-6 gap-4 "> <div className="col-span-6"> <ListDiv> <UiTable - headName={undefined} + headName={[]} tableData={bdstTable || []} children={ <HeadMakeColSpan upHeadList={htdflSttn.htdflSttNodeList} /> diff --git a/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx b/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx index 804e9d808..7e068bcd0 100644 --- a/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx @@ -82,6 +82,7 @@ export default function RainSttn() { }; const getSgg = (val: string | number) => { + console.log("val", val) setObjSearch({ ...objSearch, sgg: String(val) }) }; @@ -95,6 +96,8 @@ export default function RainSttn() { return objSearch.city; }; + + useEffect(() => { if (!rainSttn.isInit) { rainSttnInit(codeData ?? "0"); @@ -105,6 +108,8 @@ export default function RainSttn() { const data = tableData(rainSttnRes, { code }); const chData = data .map((item: any) => { + console.log("item", item); + console.log("왜안돼", item.reuseBuilding[0].rainyObj.dtfcltCpct) return { ...item, ...item.reuseBuilding[0], @@ -119,16 +124,10 @@ export default function RainSttn() { ? "확인불가" : item.reuseBuilding[0].instlCstSprtAmt, chBuildingYn: item.chgBuilding[0]?.bdstChgNm !== null ? "Y" : "N", - pntfColArea: item.reuseBuilding[0].rainyObj.pntfColArea === -1 - ? "확인불가" - : item.reuseBuilding[0].rainyObj.pntfColArea, - filtrTrtmfctCpct: item.reuseBuilding[0].rainyObj.filtrTrtmfctCpct === -1 - ? "확인불가" - : item.reuseBuilding[0].rainyObj.filtrTrtmfctCpct, - archArea: Math.floor(item.archArea) === -1 ? "확인불가" : item.archArea, }; }) .filter((item: any) => item.rainyObj !== undefined); + console.log("chData", chData) setBdstTable(chData); }, [code, rainSttnRes, rainSttn.rainSttHeadList]); @@ -148,6 +147,9 @@ export default function RainSttn() { } }, [rainSttn.excelList]); + // const excelClick = useCallback(() => { + // if (codeData) rainSttnSearch(1, "10000", codeData, code.cityCd, code.sggCd); + // }, [rainSttnSearch, codeData, code.cityCd, code.sggCd]); const excelClick = useCallback(() => { // 최신 검색 조건 반영 const con = getConValue(); @@ -160,6 +162,8 @@ export default function RainSttn() { <div className="grid grid-cols-4 gap-4 "> <div className="col-span-4"> <Title title={"빗물재이용 시설 현황"} /> + + <SearchDiv> <SearchFormLeft> <div className="col-span-10 flex flex-row"> @@ -211,6 +215,50 @@ export default function RainSttn() { </div> </SearchFormRight> </SearchDiv> + + + + + + + + + + + {/* <SearchBaseForm + selectSidoData={code.cityCd} + selectSigunData={code.sggCd} + selectRegionData={code.rvbsnCd} + selectUnitWaterShedData={code.lgbsnCd} + selectMiddleRegionData={code.mdmbsnCd} + selectEnvPartData={code.lclgvrnmntCd} + rightChildren={ + <Button + className={btnClass} + onClick={() => { + setIsChHead(true); + }} + > + 조회항목설정 + </Button> + } + leftChildren={undefined} + queryClick={function (returnType: ReturnType): void { + // '{partValue: 'A', sidoValue: '0', sigunValue: '0', regionValue: '0', unitWaterShedValue: '0', …}' + let con; + if (returnType.sigunValue != "0") { + con = returnType.sigunValue; + } else { + con = returnType.sidoValue; + } + rainSttnSearch(1, "20", con, code.cityCd, code.sggCd); + }} + excelClick={excelClick} + initClick={function (): void { }} + btnClass={btnClass} + ref={ref} + isAdmin={false} + /> */} </div> </div> <div className="grid grid-cols-6 gap-4 "> diff --git a/apps/wr/app/ruseFcltMng/fcltSttn/rswtSttn/page.tsx b/apps/wr/app/ruseFcltMng/fcltSttn/rswtSttn/page.tsx index 05ee774f1..f9b3c6187 100644 --- a/apps/wr/app/ruseFcltMng/fcltSttn/rswtSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltSttn/rswtSttn/page.tsx @@ -5,26 +5,19 @@ import type { chgBuilding } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import type { customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg"; import { excelDownload, - getCity, getCityOrSgg, tableData, } from "@/components/lib/func/commom"; import BdstChgModal from "@/components/ui/modal/fcltReg/bdstChgModal/bdstChgModal"; -import type { objSearchType } from "@/components/ui/modal/fcltReg/bdstRegModal/bdstRegModal"; import HeadChModal from "@/components/ui/modal/sttn/headChModal/headChModal"; import SttnDetailModal from "@/components/ui/modal/sttn/sttnDetailModal/sttnDetailModal"; import { ContentsDiv, SearchBaseForm, - SearchDiv, - SearchFormLeft, - SearchFormRight, - SelectBox, Title, UiModal, UiTable, type ReturnType, - type SelectDataType, } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; import { HeadMakeColSpan } from "@common/business_components/ui/table/HeadMakeColSpan"; @@ -41,8 +34,6 @@ export default function RswtSttn() { const [isChHead, setIsChHead] = useState(false); const ref = useRef<ReturnType>({} as ReturnType); const [bdstTable, setBdstTable] = useState<customRswtBdst[]>(); - const [selectSgg, setSelectSgg] = useState<SelectDataType[] | []>() - const [objSearch, setObjSearch] = useState<objSearchType>({ sgg: "", city: "" }); const [detailModal, setDetailModal] = useState<{ isOpen: boolean, data: customRswtBdst | undefined }>({ data: undefined, isOpen: false }) const [bdstChgProps, setBdstChgProps] = useState<{ isOpen: boolean; @@ -67,35 +58,6 @@ export default function RswtSttn() { } } - const getSelCity = (val: string | number) => { - const cityValue = String(val); - - if (cityValue === "0") { - setSelectSgg([]); - setObjSearch({ city: cityValue, sgg: "" }); - } else { - const data = getCity(cityValue, code.sggCd); - setSelectSgg(data); - - const firstSggVal = data.find(item => item.val === "0")?.val || (data[0]?.val ?? ""); - setObjSearch({ city: cityValue, sgg: firstSggVal }); - } - }; - - const getSgg = (val: string | number) => { - setObjSearch({ ...objSearch, sgg: String(val) }) - }; - - const getConValue = () => { - if (!objSearch.city || objSearch.city === "0") { - return "0"; - } - if (objSearch.sgg && objSearch.sgg !== "0") { - return objSearch.sgg; - } - return objSearch.city; - }; - useEffect(() => { if (!rswtSttn.isInit) { rswtSttnInit("0"); @@ -103,25 +65,22 @@ export default function RswtSttn() { }, [rswtSttn.isInit, rswtSttnInit]); useEffect(() => { - const data = tableData(rswtSttnRes, { code }); - const chData = data - .map((item: customRswtBdst) => { - console.log("item", item) - return { + if (rswtSttnRes?.length > 0 && code.cityCd.length > 0) { + const data = tableData(rswtSttnRes, { code }); + const chData = data + .map((item: customRswtBdst) => ({ ...item, ...item.reuseBuilding[0], ...item.reuseBuilding[0]?.rswtrObj, - chBuildingYn: item?.chgBuilding[0]?.bdstChgNm !== null && item?.chgBuilding.length > 0 ? 'Y' : 'N', - instlCst: item.reuseBuilding[0]?.instlCst === -1 ? "확인불가" : item.reuseBuilding[0]?.instlCst, - instlCstSprtAmt: item.reuseBuilding[0]?.instlCstSprtAmt === -1 ? "확인불가" : item.reuseBuilding[0]?.instlCstSprtAmt, - } - }) - .filter( - (item: customRswtBdst) => - item.reuseBuilding[0]?.rswtrObj !== undefined - ); + chBuildingYn: item?.chgBuilding[0]?.bdstChgNm !== null && item?.chgBuilding.length > 0 ? 'Y' : 'N' + })) + .filter( + (item: customRswtBdst) => + item.reuseBuilding[0]?.rswtrObj !== undefined + ); - setBdstTable(chData); + setBdstTable(chData); + } }, [code, rswtSttnRes]); useEffect(() => { @@ -136,11 +95,13 @@ export default function RswtSttn() { } }, [rswtSttn.excelList]); - const excelClick = useCallback(() => { - // 최신 검색 조건 반영 - const con = getConValue(); - rswtSttnSearch(1, "10000", String(con), code.cityCd, code.sggCd); - }, [rswtSttnSearch, objSearch, code.cityCd, code.sggCd]); + const excelClick = useCallback( + (returnType: ReturnType) => { + if (codeCityOrSgg) + rswtSttnSearch(1, "10000", codeCityOrSgg, code.cityCd, code.sggCd); + }, + [rswtSttnSearch, code.cityCd, code.sggCd, codeCityOrSgg] + ); useEffect(() => { if (codeCityOrSgg != null) rswtSttnSearch(pageNation, "20", codeCityOrSgg, code.cityCd, code.sggCd); @@ -152,64 +113,38 @@ export default function RswtSttn() { <div className="grid grid-cols-4 gap-4 "> <div className="col-span-4"> <Title title={"중수도시설 현황"} /> - <SearchDiv> - <SearchFormLeft> - <div className="col-span-10 flex flex-row"> - <SelectBox - className="col-span-2 w-1/6 h-full text-2xl" - label="시도" - selectClass={""} - selectArray={code.cityCd} - onSelectValue={getSelCity} - /> - <SelectBox - className="col-span-2 w-1/6 h-full text-2xl ml-4" - label="시군구" - selectClass={""} - selectArray={selectSgg || []} - value={objSearch.sgg} // value props 추가 - onSelectValue={getSgg} - /> - </div> - </SearchFormLeft> - <SearchFormRight - className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 "> - <div className="flex flex-row space-x-2 items-center"> - <Button - size={"sm"} - onClick={() => { - const con = getConValue(); - rswtSttnSearch(1, "20", String(con), code.cityCd, code.sggCd); - }} - > - 조회 - </Button> - <Button - size={"sm"} - className={`${btnClass} green`} - onClick={excelClick} - > - 다운로드 - </Button> - <Button - size={"sm"} - className={btnClass} - onClick={() => { - setIsChHead(true); - }} - > - 조회항목설정 - </Button> - </div> - </SearchFormRight> - </SearchDiv> + <SearchBaseForm + selectSidoData={code.cityCd} + selectSigunData={code.sggCd} + selectRegionData={code.rvbsnCd} + selectUnitWaterShedData={code.lgbsnCd} + selectMiddleRegionData={code.mdmbsnCd} + selectEnvPartData={code.lclgvrnmntCd} + rightChildren={<Button + className={btnClass} + onClick={() => { + setIsChHead(true); + } } + > + 조회항목설정 + </Button>} + leftChildren={undefined} + queryClick={function (returnType: ReturnType): void { + // '{partValue: 'A', sidoValue: '0', sigunValue: '0', regionValue: '0', unitWaterShedValue: '0', …}' + if (codeCityOrSgg) + rswtSttnSearch(1, "20", codeCityOrSgg, code.cityCd, code.sggCd); + } } + excelClick={excelClick} + initClick={function (): void { } } + btnClass={btnClass} + ref={ref} isAdmin={false} /> </div> </div> <div className="grid grid-cols-6 gap-4 "> <div className="col-span-6"> <ListDiv> <UiTable - headName={undefined} + headName={[]} tableData={bdstTable || []} children={ <HeadMakeColSpan upHeadList={rswtSttn.rswtSttNodeList} /> diff --git a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx index c5f7b198a..d03ae70fe 100644 --- a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx @@ -1,14 +1,10 @@ "use client"; import { useWrStore } from "@/app/store"; -import { - commonCd, - rainPageSize, - type rainChkZodType, -} from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; -import { - rswtPageSize, - type rswtrChkDetailsZodType, +import { type rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; +import type { + rswtChkZodType, + rswtrChkDetailsZodType, } from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn"; import { excelArrayDownload, @@ -19,7 +15,6 @@ import ChkgdExcel from "@/components/ui/modal/chkgd/chkgdExcel/chkgdExcel"; import ChkgdModal from "@/components/ui/modal/chkgd/chkgdModal/chkgdModal"; import RainChkgdTable from "@/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable"; import RswtChkgdTable from "@/components/ui/table/chkgdTable/rswtChkgd/rswtChkgdTable"; -import { SearchInput } from "@common/business_components"; import { ContentsDiv, SearchDiv, @@ -30,16 +25,9 @@ import { UiModal, } from "@common/business_components/ui"; import ListDiv from "@common/business_components/ui/list_div"; -import LoadingOverlay from "@common/business_components/ui/loadingBar"; import { Button, Label } from "@common/components/ui"; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from "@common/components/ui/tooltip"; import { useCallback, useEffect, useState } from "react"; -import toast, { Toaster } from "react-hot-toast"; +import { Toaster } from "react-hot-toast"; export default function Page() { const { @@ -51,10 +39,8 @@ export default function Page() { rainChkDelete, rainChkExcelDownload, rainChkHeadChange, - rainChkNmSearch, isRainSttn, rswtChkgdnInit, - rswtChkNmSearch, rswtChkPolInit, rswtChkDetilsUpdate, rswtChkDelete, @@ -71,31 +57,16 @@ export default function Page() { rswtrChkDetailsZodType[] >([]); const [deleteIdx, setDeleteIdx] = useState<number[]>([]); - const [rainPageNation, setRainPageNation] = useState(1); - const [rswtPageNation, setRswtPageNation] = useState(1); - const [fcltNm, setFcltNm] = useState<string>(""); + const [pageNation, setPageNation] = useState(1); const [selFcltDiv, setSelFcltDiv] = useState("RNB"); const [isModal, setIsModal] = useState({ open: false, data: {}, }); - const [searchYear, setSearchYear] = useState<string>( - String(new Date().getFullYear()) - ); const cellClick = () => { if (searchYear) { if (selFcltDiv === "RNB") { - if (fcltNm) { - rainChkNmSearch( - rainPageNation, - rainPageSize, - searchYear, - commonCd, - fcltNm - ); - } else { - rainChkInit(rainPageNation, rainPageSize, searchYear, commonCd); - } + rainChkInit("1", "20", searchYear, "0"); } else { if (fcltNm) { rswtChkNmSearch( @@ -111,45 +82,25 @@ export default function Page() { } } }; - const rainPageChange = (pageNo: number) => { - if (pageNo > 0) { - setRainPageNation(pageNo); - rainChkInit(pageNo, rainPageSize, searchYear, commonCd); - } - }; - const rswtPageChange = (pageNo: number) => { - if (pageNo > 0) { - setRswtPageNation(pageNo); - rswtChkgdnInit(pageNo, rswtPageSize, searchYear, commonCd); - } - }; + + const [searchYear, setSearchYear] = useState<string>( + String(new Date().getFullYear()) + ); useEffect(() => { if (!rainChkgdn.isInit) { - rainChkInit( - 1, - rainPageSize, - new Date().getFullYear().toString(), - commonCd - ); + rainChkInit("1", "20", new Date().getFullYear().toString(), "0"); isRainSttn(false); setIsModal({ data: {}, open: false }); setIsRegExcel(false); } - }, [rainChkgdn.isInit, rainChkInit, rainPageSize]); - useEffect(() => { if (!rswtChkgdn.isInit) { - rswtChkgdnInit( - 1, - rswtPageSize, - new Date().getFullYear().toString(), - commonCd - ); + rswtChkgdnInit("1", "20", new Date().getFullYear().toString(), "0"); setIsModal({ data: {}, open: false }); setIsRegExcel(false); } - }, [rswtChkgdn.isInit, rswtChkgdnInit, rswtPageSize]); + }, [rainChkgdn.isInit, rainChkInit]); useEffect(() => { if (rswtChkgdn.excelList[0] && rswtChkgdn.excelList[0]?.data.length > 1) { @@ -193,8 +144,8 @@ export default function Page() { ); useEffect(() => { - rainChkgdn.isSttn = false; - rswtChkgdn.isSttn = false; + //rainChkgdn.isSttn = false; + //rswtChkgdn.isSttn = false; if (!rainChkgdn.isSttn && !rswtChkgdn.isSttn) { rainChkHeadChange({ rainChkgdn }, true); rswtChkHeadChange({ rswtChkgdn }, true); @@ -212,17 +163,9 @@ export default function Page() { }; const chkUpdateTable = (selFcltDiv: string) => { if (selFcltDiv === "RNB") { - if (updateRainDetail && updateRainDetail.length > 0) { - rainChkDetilUpdate(updateRainDetail); - } else { - toast.error("수정을 원하는 행을 선택하고 저장버튼을 눌러주세요 "); - } + rainChkDetilUpdate(updateRainDetail); } else { - if (updateRswtDetail && updateRswtDetail.length > 0) { - rswtChkDetilsUpdate(updateRswtDetail); - } else { - toast.error("수정을 원하는 행을 선택하고 저장버튼을 눌러주세요 "); - } + rswtChkDetilsUpdate(updateRswtDetail); } }; @@ -244,8 +187,10 @@ export default function Page() { selectArray={yearOptions} value={searchYear} onSelectValue={(val: string | number) => { - setSearchYear(String(val)); - }} + setSearchYear(String(val)) + } + + } /> </div> <div className="col-span-2 flex flex-row space-x-2"> @@ -259,22 +204,12 @@ export default function Page() { selectArray={rainChkgdn.fcltDiv} onSelectValue={(val: string | number) => { if (val === "RST") rswtChkPolInit(); - setSelFcltDiv(String(val)); - }} + setSelFcltDiv(String(val)) + } + } value={selFcltDiv ?? rainChkgdn.fcltDiv[0]?.val} /> </div> - <div className="col-span-2 flex flex-row space-x-2"> - <Label className="w-28 mt-2 text-xl text-gray-600"> - {"시설명"} - </Label> - <SearchInput - className={"w-full h-full text-2xl"} - label={""} - textValue={fcltNm || ""} - setText={setFcltNm} - /> - </div> </SearchFormLeft> <SearchFormRight className="w-2/12 mx-5 flex flex-col items-center justify-center space-x-2 "> <div className="space-y"> @@ -295,28 +230,14 @@ export default function Page() { > 삭제 </Button> - - <TooltipProvider> - <Tooltip> - <TooltipTrigger asChild> - <Button - size={"sm"} - onClick={() => { - chkUpdateTable(selFcltDiv); - }} - > - 저장 - </Button> - </TooltipTrigger> - <TooltipContent side="bottom" sideOffset={5}> - <h2 className="text-xl"> - 아래 테이블에 선택을 체크하면 입력셀이 활성화 됩니다. - </h2> - </TooltipContent> - </Tooltip> - </TooltipProvider> - - + <Button + size={"sm"} + onClick={() => { + chkUpdateTable(selFcltDiv); + }} + > + 저장 + </Button> <Button size={"sm"} onClick={() => { @@ -343,18 +264,17 @@ export default function Page() { detailUp={setUpdateRainDetail} handleClick={handleClick} rainChkData={rainChkgdn.rainChk} - pageNation={rainPageNation} - onPageChange={rainPageChange} - pageCount={rainChkgdn.rainChkCount} /> + pageNation={pageNation} + onPageChange={setPageNation} + /> ) : ( <RswtChkgdTable detaiRswtlUpdate={setUpdateRSwtDetail} deleteRswtData={setDeleteIdx} handleRswtClick={handleClick} rswtChkData={rswtChkgdn.rswtChkRes} - pageNation={rswtPageNation} - onPageChange={rswtPageChange} - pageCount={rswtChkgdn.rswtChkCount} + pageNation={pageNation} + onPageChange={setPageNation} /> )} </ListDiv> @@ -362,28 +282,17 @@ export default function Page() { </div> <UiModal open={isModal.open} - onOpenChange={(open: boolean) => { - setIsModal((prev) => ({ ...prev, open })); + onOpenChange={() => { + setIsModal({ open: !open, data: {} }); }} bodyClass={"w-[80vw] max-w-none"} - body={ - <ChkgdModal - type={selFcltDiv} - obj={isModal.data} - setIsModal={(open) => setIsModal((prev) => ({ ...prev, open }))} - /> - } + body={<ChkgdModal type={selFcltDiv} obj={isModal.data} />} ></UiModal> <UiModal open={isRegExcel} onOpenChange={setIsRegExcel} bodyClass={"w-[30vw] max-w-none"} - body={ - <ChkgdExcel - type={selFcltDiv} - setIsRegExcel={setIsRegExcel} - ></ChkgdExcel> - } + body={<ChkgdExcel type={selFcltDiv}></ChkgdExcel>} /> <Toaster position="top-center" /> </ContentsDiv> diff --git a/apps/wr/app/ruseFcltMng/prfmncSttn/chkgdnSttn/page.tsx b/apps/wr/app/ruseFcltMng/prfmncSttn/chkgdnSttn/page.tsx index 592a6826e..a3dbd70b9 100644 --- a/apps/wr/app/ruseFcltMng/prfmncSttn/chkgdnSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncSttn/chkgdnSttn/page.tsx @@ -1,8 +1,6 @@ "use client"; import { useWrStore } from "@/app/store"; -import { commonCd, rainPageSize } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; -import { rswtPageSize } from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn"; import { excelDownload, yearOptions @@ -80,36 +78,22 @@ export default function Page() { } }; - const rainPageChange = (pageNo: number) => { - if (pageNo > 0) { - setRainPageNation(pageNo); - rainChkSttnInit(pageNo, rainPageSize, searchYear, commonCd); - } - }; - - const rswtPageChange = (pageNo: number) => { - if (pageNo > 0) { - setRswtPageNation(pageNo); - rswtChkSttnInit(pageNo, rswtPageSize, searchYear, commonCd); - } - }; - useEffect(() => { if (!rainChkSttn.isInit) { isRainSttn(true) - rainChkSttnInit(1, rainPageSize, new Date().getFullYear().toString(), commonCd); + rainChkSttnInit(new Date().getFullYear().toString(), "0"); setIsModal({ data: {}, open: false }); } - }, [rainChkSttn.isInit, rainChkSttnInit, rainPageSize]); + }, [rainChkSttn.isInit, rainChkSttnInit]); useEffect(() => { + if (!rswtChkSttn.isInit) { setIsModal({ data: {}, open: false }); - rswtChkSttnInit(1, rswtPageSize, new Date().getFullYear().toString(), commonCd); + rswtChkSttnInit(new Date().getFullYear().toString(), "0"); isRswtSttn(true) } - }, [rswtChkSttn.isInit, rswtChkSttnInit, rswtPageSize]) - + }, [rswtChkSttn.isInit, rswtChkSttnInit]) const handleClick = useCallback( @@ -238,7 +222,7 @@ export default function Page() { setIsModal({ open: !open, data: {} }); }} bodyClass={"w-[80vw] max-w-none"} - body={<ChkgdModal type={selFcltDiv} obj={isModal.data} setIsModal={() => { }} />} + body={<ChkgdModal type={selFcltDiv} obj={isModal.data} />} ></UiModal> <Toaster position="top-center" /> </ContentsDiv> diff --git a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx index 3e860d744..f689eb745 100644 --- a/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncSttn/pbnstPrfmncSttn/page.tsx @@ -68,6 +68,8 @@ export default function PbnstPrfmncSttn() { chartData5: lineChartDataProps[]; chartData6: lineChartDataProps[]; chartData7: lineChartDataProps[]; + chartData8: lineChartDataProps[]; + chartData9: lineChartDataProps[]; }>(); const [outLineData, setOutLineData] = useState<{ chartData1: lineChartDataProps[]; @@ -76,8 +78,6 @@ export default function PbnstPrfmncSttn() { chartData4: lineChartDataProps[]; chartData5: lineChartDataProps[]; chartData6: lineChartDataProps[]; - chartData7: lineChartDataProps[]; - chartData8: lineChartDataProps[]; }>(); type dnChartForm = { label: string, val: number, fill?: string }; @@ -228,18 +228,16 @@ export default function PbnstPrfmncSttn() { indstUswtr += element.indstUswtr; // 월별 합계 - inUsageSum = - element.wshwtr + inUsageSum = element.wshwtr + element.coolUswtr + element.cleanUswtr + element.drwtUswtr + element.dltnUswtr + element.ithlRswtr + element.ithlEtcUswtr - outUsageSum = - element.cleanToilUswtr - + element.resn - + element.lndwtr + + element.cleanToilUswtr + + element.resn; + outUsageSum = element.lndwtr + element.hydUswtr + element.ugwtChr + element.farmUswtr @@ -260,10 +258,9 @@ export default function PbnstPrfmncSttn() { dltnUswtrData.push({ label: `${month}월`, val: element.dltnUswtr, color: "purple" }); ithlRswtrData.push({ label: `${month}월`, val: element.ithlRswtr, color: "green" }); ithlEtcUswtrData.push({ label: `${month}월`, val: element.ithlEtcUswtr, color: "blue" }); - - cleanToilUswtrData.push({ label: `${month}월`, val: element.cleanToilUswtr, color: "magenta" }); resnData.push({ label: `${month}월`, val: element.resn, color: "skyblue" }); + lndwtrData.push({ label: `${month}월`, val: element.lndwtr, color: "red" }); hydUswtrData.push({ label: `${month}월`, val: element.hydUswtr, color: "orange" }); ugwtChrData.push({ label: `${month}월`, val: element.ugwtChr, color: "yellow" }); @@ -274,18 +271,22 @@ export default function PbnstPrfmncSttn() { } }); - let dnTotalIn = 0; - let dnTotalOut = 0; - inUsageArr.forEach((item) => { - dnTotalIn += item - }) - outUsageArr.forEach((item) => { - dnTotalOut += item - }) - // 도넛차트 데이터 - dnData.push({ label: "장내용수", val: dnTotalIn, fill: "#8DD8FF" }); - dnData.push({ label: "장외용수", val: dnTotalOut, fill: "#FFF085" }); + dnData.push({ label: "세척수", val: wshwtr, fill: "#F7CFD8" }); + dnData.push({ label: "냉각수", val: coolUswtr, fill: "#F4F8D3" }); + dnData.push({ label: "청소수", val: cleanUswtr, fill: "#A6D6D6" }); + dnData.push({ label: "식수대", val: drwtUswtr, fill: "#8E7DBE" }); + dnData.push({ label: "희석용수", val: dltnUswtr, fill: "#FF8383" }); + dnData.push({ label: "중수도", val: ithlRswtr, fill: "#FFF574" }); + dnData.push({ label: "기타", val: ithlEtcUswtr, fill: "#A1D6CB" }); + dnData.push({ label: "청소화장실용수", val: cleanToilUswtr, fill: "#A19AD3" }); + dnData.push({ label: "세척살수용수", val: resn, fill: "#B1F0F7" }); + dnData.push({ label: "조경용수", val: lndwtr, fill: "#81BFDA" }); + dnData.push({ label: "친수용수", val: hydUswtr, fill: "#F5F0CD" }); + dnData.push({ label: "지하수충전", val: ugwtChr, fill: "#FADA7A" }); + dnData.push({ label: "농업용수", val: farmUswtr, fill: "#A6AEBF" }); + dnData.push({ label: "하천등유지용수", val: rvrKeepUswtr, fill: "#C5D3E8" }); + dnData.push({ label: "공업용수", val: indstUswtr, fill: "#D0E8C5" }); // 장내용수 도넛 dnInData.push({ label: "세척수", val: wshwtr, fill: "#F7CFD8" }); @@ -295,10 +296,10 @@ export default function PbnstPrfmncSttn() { dnInData.push({ label: "희석용수", val: dltnUswtr, fill: "#FF8383" }); dnInData.push({ label: "중수도", val: ithlRswtr, fill: "#FFF574" }); dnInData.push({ label: "기타", val: ithlEtcUswtr, fill: "#A1D6CB" }); + dnInData.push({ label: "청소화장실용수", val: cleanToilUswtr, fill: "#A19AD3" }); + dnInData.push({ label: "세척살수용수", val: resn, fill: "#B1F0F7" }); // 장외용수 도넛 - dnOutData.push({ label: "청소화장실용수", val: cleanToilUswtr, fill: "#A19AD3" }); - dnOutData.push({ label: "세척살수용수", val: resn, fill: "#B1F0F7" }); dnOutData.push({ label: "조경용수", val: lndwtr, fill: "#81BFDA" }); dnOutData.push({ label: "친수용수", val: hydUswtr, fill: "#F5F0CD" }); dnOutData.push({ label: "지하수충전", val: ugwtChr, fill: "#FADA7A" }); @@ -314,17 +315,17 @@ export default function PbnstPrfmncSttn() { chartData4: drwtUswtrData, chartData5: dltnUswtrData, chartData6: ithlRswtrData, - chartData7: ithlEtcUswtrData + chartData7: ithlEtcUswtrData, + chartData8: cleanToilUswtrData, + chartData9: resnData }); setOutLineData({ - chartData1: cleanToilUswtrData, - chartData2: resnData, - chartData3: lndwtrData, - chartData4: hydUswtrData, - chartData5: ugwtChrData, - chartData6: farmUswtrData, - chartData7: rvrKeepUswtrData, - chartData8: indstUswtrData, + chartData1: lndwtrData, + chartData2: hydUswtrData, + chartData3: ugwtChrData, + chartData4: farmUswtrData, + chartData5: rvrKeepUswtrData, + chartData6: indstUswtrData, }); setBarData(barData); setChartData(dnData); @@ -407,7 +408,15 @@ export default function PbnstPrfmncSttn() { chartData7: { label: '기타', color: "blue", - } + }, + chartData8: { + label: '청소화장실용수', + color: "magenta", + }, + chartData9: { + label: '세척살수용수', + color: "skyblue", + }, } satisfies ChartConfig; setLnInChartConfig(newChartConfig); } @@ -418,34 +427,26 @@ export default function PbnstPrfmncSttn() { if (outLineData?.chartData1) { const newChartConfig = { chartData1: { - label: '청소화장실용수', + label: '조경용수', color: "red", }, chartData2: { - label: '세척살수용수', - color: "pink", - }, - chartData3: { - label: '조경용수', - color: "gray", - }, - chartData4: { label: '친수용수', color: "orange", }, - chartData5: { + chartData3: { label: '지하수충전', color: "yellow", }, - chartData6: { + chartData4: { label: '농업용수', color: "green", }, - chartData7: { + chartData5: { label: '하천등유지용수', color: "blue", }, - chartData8: { + chartData6: { label: '공업용수', color: "purple", }, @@ -614,7 +615,7 @@ export default function PbnstPrfmncSttn() { <h1 className="">장내·외 월별 하수재이용실적 현황</h1> <div className="flex"> <div className="w-1/3"> - <MainChart chartConfig={barChartConfig} chartData={barData} chartTitle={"월별 장내·외 용수 총 실적"} chartForm={CHART_FORM.DOUBLEBAR} showLegend={true} /> + <MainChart chartConfig={barChartConfig} chartData={barData} chartTitle={"월별 장내·외 용수 총 실적"} chartForm={CHART_FORM.DOUBLEBAR} /> </div> <div className="w-1/3"> <MainChart chartConfig={lnInChartConfig} chartData={inLineData} chartTitle={"월별 장내 용수 실적"} chartForm={CHART_FORM.LINE} /> @@ -626,25 +627,25 @@ export default function PbnstPrfmncSttn() { <h1 className="">하수재이용실적 현황</h1> <ListDiv className="col-span-8 pr-6 "> {/* <ScrollArea className="h-[60vh]"> */} - {/* <div className="card-header"> + {/* <div className="card-header"> <h3 className="text-2xl font-medium text-label"> {"하수처리수재이용 실적(m3) 등록결과"} </h3> </div> */} - <UiTable - headName={undefined} - tableData={prfData || []} - headlist={monthHeadList} - pageSize={0} - total={0} - cellClick={undefined} - onPageChange={function (page: number): void { - throw new Error("Function not implemented."); - }}> - </UiTable> + <UiTable + headName={undefined} + tableData={prfData || []} + headlist={monthHeadList} + pageSize={0} + total={0} + cellClick={undefined} + onPageChange={function (page: number): void { + throw new Error("Function not implemented."); + }}> + </UiTable> - {/* <ListDiv className="col-span-8 pr-6 "> + {/* <ListDiv className="col-span-8 pr-6 "> <ScrollArea className="h-[60vh]"> <div className="card-header"> <h3 className="text-2xl font-medium text-label"> diff --git a/apps/wr/app/store/matDmd/coMatRvw/headList.tsx b/apps/wr/app/store/matDmd/coMatRvw/headList.tsx index 6b783ea68..7b43e4b00 100644 --- a/apps/wr/app/store/matDmd/coMatRvw/headList.tsx +++ b/apps/wr/app/store/matDmd/coMatRvw/headList.tsx @@ -29,12 +29,12 @@ export const coRvwHeadListExport: CommonTableProps[]= [ visible: true, }, { - id: "dmndTmng", //바꾸기 + id: "regDt", //바꾸기 title: "신청일자", visible: true, }, { - id: "splyFcltFlg", //바꾸기 + id: "state", //바꾸기 title: "진행상태", visible: true, }, diff --git a/apps/wr/app/store/matDmd/coMatRvw/index.tsx b/apps/wr/app/store/matDmd/coMatRvw/index.tsx index 21d4e0252..89836957b 100644 --- a/apps/wr/app/store/matDmd/coMatRvw/index.tsx +++ b/apps/wr/app/store/matDmd/coMatRvw/index.tsx @@ -103,18 +103,12 @@ export const coRvwActionsExport: (set: any) => coRvwActions = (set: any) => { data ); - if(isUpdate){ - toast.error("수요 매칭 검토 검토로 저장되었습니다."); - } - const coMatRvwRes = coMatInit( 1, 10, new Date().getFullYear().toString(), new Date().getFullYear().toString(), ); - - return set((state: coRvwState) => ({ ...state, coRvw: { diff --git a/apps/wr/app/store/matDmd/coMatRvw/type.tsx b/apps/wr/app/store/matDmd/coMatRvw/type.tsx index fb80ec415..9f146c0fb 100644 --- a/apps/wr/app/store/matDmd/coMatRvw/type.tsx +++ b/apps/wr/app/store/matDmd/coMatRvw/type.tsx @@ -53,7 +53,7 @@ import { z } from "zod"; rgtr: z.string().nullish(), mdfcnDt: z.coerce.date().nullish(), mdfr: z.string().nullish(), - dmdAplyPswd: z.string().nullish(), + dmdAplyPswd: z.string(), demandInfo: z.array(DemandInfoSchema.nullish()).nullish(), // 안쓰는 거임 demandMatchings: z.array(DemandMatchingSchema.nullish()).nullish()// 안쓰는 거임 }); diff --git a/apps/wr/app/store/matDmd/coSttn/headList.tsx b/apps/wr/app/store/matDmd/coSttn/headList.tsx index 62c3002ac..80fed0d76 100644 --- a/apps/wr/app/store/matDmd/coSttn/headList.tsx +++ b/apps/wr/app/store/matDmd/coSttn/headList.tsx @@ -44,11 +44,6 @@ export const coSttHeadListExport: z.infer<typeof sttnHeadListType> = [ title: "전화번호", visible: true, }, - { - id: "regDt", - title: "등록일자", - visible: true, - }, ]; export const coSttNodeListExport: CommonTableProps[] = [ diff --git a/apps/wr/app/store/matDmd/coSttn/index.tsx b/apps/wr/app/store/matDmd/coSttn/index.tsx index 5e8baf859..0de37bbfc 100644 --- a/apps/wr/app/store/matDmd/coSttn/index.tsx +++ b/apps/wr/app/store/matDmd/coSttn/index.tsx @@ -2,7 +2,7 @@ import type { CommonTableProps } from "@/app/store/common/type/header"; import { fetchType, getFetch, getFetchWithCount } from "@/components/lib/api"; import { coSttHeadListExport, coSttNodeListExport } from "./headList"; import { excelCoSttnParsing } from "./excel"; -import type { DemandCompType } from "@common/business_components/ui/sdmInsertForm/form"; +import type { DemandCompType } from "@common/business_components/ui"; // 테이블 헤드 리스트 const coSttNodeList = coSttNodeListExport; diff --git a/apps/wr/app/store/matDmd/ldrmntCoSttn/index.tsx b/apps/wr/app/store/matDmd/ldrmntCoSttn/index.tsx index 289ced6e1..6a5f18247 100644 --- a/apps/wr/app/store/matDmd/ldrmntCoSttn/index.tsx +++ b/apps/wr/app/store/matDmd/ldrmntCoSttn/index.tsx @@ -20,7 +20,6 @@ export type ldrmntState = { excelList: ExcelType[]; isInit: boolean; ldrmntRes: customLdrmnt[]; - isLoading: boolean; }; }; @@ -36,7 +35,6 @@ type ldrmntActions = { ldrmntSearch: (page: number, sggCd: string, total: string, coNm: string) => void; ldrmntUpdate: (ldrmntRes: customLdrmnt) => void; ldrmntDelete: () => void; - loadingOpen: (isOpen: boolean) => void }; export type ldrmntType = ldrmntState & ldrmntActions; @@ -48,7 +46,6 @@ export const ldrmntStateExport: ldrmntState = { excelList: [], isInit: false, ldrmntRes: ldrmntRes, - isLoading: false, }, }; @@ -78,30 +75,31 @@ export const ldrmntActionsExport: (set: any) => ldrmntActions = ( console.log(e) } }, - loadingOpen: (isOpen) => { - return set((state: ldrmntState) => { - return { - ...state, - ldrmnt: { - ...state.ldrmnt, - isLoading: isOpen, - }, - }; - }); - }, ldrmntRegData: async (data) => { - await deleteFectch( - `/reuseFc/request/temp`, - ); + try { + const response = await postFectch( + "/reuseFc/request/temp", + data, + fetchType.WR + ); - const response = await postFectch( - "/reuseFc/request/temp", - data, - fetchType.WR - ); + console.log('response ', response) - console.log('response ', response) + if (response.status === 200) { + ToastFormUi({ + body: "잠재수요처 등록이 완료되었습니다. ", + title: "잠재수요처 등록", + }); + } + } catch (e) { + console.log(e) + ToastFormUi({ + body: "잠재수요처 등록이 실패하였습니다. ", + title: "잠재수요처 등록", + }); + + } }, ldrmntSearch: async (page: number, total: string, sggCd: string, coNm: string) => { let searchUrl = ""; @@ -113,7 +111,6 @@ export const ldrmntActionsExport: (set: any) => ldrmntActions = ( searchUrl = `/reuseFc/request/temp/${page}/${total}/${sggCd}`; } } - try { const ldrmntRes = await getFetch( fetchType.WR, @@ -181,30 +178,11 @@ export const ldrmntActionsExport: (set: any) => ldrmntActions = ( }, ldrmntDelete: async () => { try { - set((state: ldrmntState) => { - return { - ...state, - ldrmnt: { - ...state.ldrmnt, - isLoading: true, - }, - }; - }); const response = await deleteFectch( `/reuseFc/request/temp`, ); } catch (error) { - console.log("error", error) - set((state: ldrmntState) => { - return { - ...state, - ldrmnt: { - ...state.ldrmnt, - isLoading: false, - }, - }; - }); console.error("Error ldrmntDelete:", error); } }, diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx index 77045f165..58e8d6bf0 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/excel.tsx @@ -124,9 +124,9 @@ export const excelToRainChkData = (excelData: any, year: string) => { trbt: Number(item["탁도"] || 0), grssClfg: Number(item["총대장균군수"] || 0), etc: item["기타"] || "", // 필드 누락 방지 - vltnDt: vltnDt || null, - vltnMttr: item["위반사항"] || "", - levyAmt: Number(item["과태료부과금액(천원)"] || null), + vltnDt: vltnDt || "-", + vltnMttr: item["위반사항"] || "-", + levyAmt: Number(item["과태료부과금액(천원)"] || 0), rgtr: TEST_UUID, }, ], diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList.tsx index 3cf1b5b11..d7335e129 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList.tsx @@ -114,22 +114,10 @@ export type splRuseWaterType = { ruse12: number; }; -export const rainMainHeadNmExport: chHeadType[] = [ - { headNm: "useQuilty", text: "이용수질(필요시)", length: 3 }, - { headNm: "feeHist", text: "과태료 부과내역", length: 3 }, -]; - -export const rainRuseHeadNmExport: chHeadType[] = [ - { headNm: "useQuilty", text: "이용수질(필요시)", length: 3 }, - { headNm: "feeHist", text: "과태료 부과내역", length: 3 }, - { headNm: "ruseWater", text: "연간대체수 이용량(m³)", length: 13 }, - { headNm: "detailQulity", text: "분기", length: 11 }, -]; - - -export const rainSplHeadNmExport: chHeadType[] = [ +export const rainHeadNmExport: chHeadType[] = [ { headNm: "useQuilty", text: "이용수질(필요시)", length: 3 }, { headNm: "feeHist", text: "과태료 부과내역", length: 3 }, + { headNm: "ruseWater", text: "연간보급수 이용량(m³)", length: 13 }, { headNm: "detailQulity", text: "분기", length: 11 }, { headNm: "splWater", text: "연간빗물 이용량(m³)", length: 13 }, ]; diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx index 36dd0a815..4c7f2d514 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx @@ -3,20 +3,18 @@ import { TEST_UUID } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { deleteFectch, fetchType, - getCountFetch, getFetch, postFectch, putFectch, } from "@/components/lib/api"; +import { ToastFormUi } from "@/components/ui/toast/toastFromUi"; import type { SelectDataType } from "@common/business_components/ui"; import { z } from "zod"; import { buildingToExcelType } from "./excel"; import { rainChkgdnHeadListExport, rainChkZod, - rainMainHeadNmExport, - rainRuseHeadNmExport, - rainSplHeadNmExport, + rainHeadNmExport, ruseHeadListExport, splHeadListExport, type chHeadType, @@ -24,47 +22,38 @@ import { import type { TableUpperProps } from "@/app/store/common/type/header"; import toast from "react-hot-toast"; -export const rainPageSize = 5; -export const commonCd = "41"; - export type rainChkZodType = z.infer<typeof rainChkZod>; const fcltDiv = [ { val: "RST", text: "중수도시설" }, { val: "RNB", text: "빗물이용시설" }, ]; -const rainRuseHeadNm = rainRuseHeadNmExport; -const rainSplHeadNm = rainSplHeadNmExport; +const rainHeadNm = rainHeadNmExport; const rainChkgdnHeadList = rainChkgdnHeadListExport; const ruseHeadList = ruseHeadListExport; const splHeadList = splHeadListExport; -const rainMainHeadNm = rainMainHeadNmExport const rainChk: rainChkZodType[] = []; export type rainChkgdnState = { rainChkgdn: { rainChkgdnHeadList: TableUpperProps[]; - rainSplHeadNm:chHeadType[] - rainRuseHeadNm:chHeadType[] rainChk: rainChkZodType[]; + rainHeadNm: chHeadType[]; ruseHeadList: TableUpperProps[]; splHeadList: TableUpperProps[]; isInit: boolean; isModalClose: boolean; fcltDiv: SelectDataType[]; - rainMainHeadNm:chHeadType[] excelList: []; isSttn: boolean; - rainChkCount: number; - isLoading: boolean; }; }; type rainChkgdnActions = { rainChkInit: ( - pageNo: number, - cnt: number, + pageNo: string, + cnt: string, sggCd: string, searchTxt: string ) => void; @@ -77,13 +66,6 @@ type rainChkgdnActions = { rainChkExcelDataUPload(excelData: rainChkZodType[]): Promise<void>; rainChkDelete(chkgdnPks: number[]): Promise<void>; rainChkHeadChange: (rainChkgdn: rainChkgdnState, isEdit: boolean) => void; - rainChkNmSearch: ( - pageNo: number, - cnt: number, - year: string, - sggCd: string, - txt: string - ) => void; }; export type rainChkgdnType = rainChkgdnState & rainChkgdnActions; @@ -91,9 +73,7 @@ export type rainChkgdnType = rainChkgdnState & rainChkgdnActions; export const rainChkgdnStateExport: rainChkgdnState = { rainChkgdn: { rainChkgdnHeadList: rainChkgdnHeadList, - rainRuseHeadNm: rainRuseHeadNm, - rainSplHeadNm:rainSplHeadNm, - rainMainHeadNm:rainMainHeadNm, + rainHeadNm: rainHeadNm, rainChk: rainChk, splHeadList: splHeadList, ruseHeadList: ruseHeadList, @@ -102,8 +82,6 @@ export const rainChkgdnStateExport: rainChkgdnState = { excelList: [], fcltDiv: fcltDiv, isSttn: false, - rainChkCount: 1, - isLoading: false, }, }; @@ -125,22 +103,20 @@ const makeMdfrChk = (data: rainChkZodType[], type: string, toDo: string) => { }; const initFetch = async ( - pageNo: number, - cnt: number, - year: string | undefined, + pageNo: string, + cnt: string, + txt: string | undefined, sgg: string | undefined ) => { const currentYear = new Date().getFullYear().toString(); - - const rainRes = await getCountFetch( + const rainRes = await getFetch( "wr", `/reuseChk/rainy` + (pageNo ? `/${pageNo}` : "/1") + - (cnt ? `/${cnt}` : "/10") + - (year ? `/${year}` : `/${currentYear}`) + + (cnt ? `/${cnt}` : "/20") + + (txt ? `/${txt}` : `/${currentYear}`) + (sgg ? `/${sgg}` : "/0") ); - return rainRes; }; @@ -166,24 +142,16 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( })); }, rainChkExcelDataUPload: async (excelData: rainChkZodType[]) => { - set((state: rainChkgdnType) => ( - { rainChkgdn: { ...state.rainChkgdn, isLoading: true } })); try { const res = await postFectch("/reuseChk/rainy", excelData); if (res.status === 200) { const currentYear = new Date().getFullYear().toString(); - const rainChkRes = await initFetch( - 1, - rainPageSize, - currentYear, - commonCd - ); - set((state: rainChkgdnState) => ({ + const rainChkRes = await initFetch("1", "20", currentYear, "0"); + return set((state: rainChkgdnState) => ({ ...state, rainChkgdn: { ...state.rainChkgdn, - rainChk: rainChkRes.data, - rainChkCount: rainChkRes.count, + rainChk: rainChkRes, }, })); toast.success("지도점검 등록이 완료되었습니다."); @@ -191,63 +159,24 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( toast.error("지도점검 등록이 실패되었습니다."); } } catch (error) { + console.log(error); toast.error("지도점검 등록이 실패되었습니다."); - } finally { - set((state: rainChkgdnType) => ({ rainChkgdn: { ...state.rainChkgdn, isLoading: false } })); } }, rainChkInit: async ( - pageNo: number, - cnt: number, - year: string, + pageNo: string, + cnt: string, + searchTxt: string, sggCd: string ) => { - set((state: rainChkgdnType) => ({ rainChkgdn: { ...state.rainChkgdn, isLoading: true } })); try { - const rainChkRes = await initFetch(pageNo, cnt, year, sggCd); - set((state: rainChkgdnState) => ({ - ...state, - rainChkgdn: { - ...state.rainChkgdn, - rainChk: rainChkRes.data, - rainChkCount: rainChkRes.count, - isInit: true, // 무한 루프 방지를 위해 isInit을 true로 설정 - }, - })); - } catch (error) { - console.log(error); - // 에러가 발생하더라도 무한 루프에 빠지지 않도록 isInit을 true로 설정합니다. - set((state: rainChkgdnType) => ({ - rainChkgdn: { ...state.rainChkgdn, isInit: true }, - })); - } finally { - set((state: rainChkgdnType) => ({ rainChkgdn: { ...state.rainChkgdn, isLoading: false } })); - } - }, - rainChkNmSearch: async ( - pageNo: number, - cnt: number, - year: string, - sggCd: string, - txt: string - ) => { - try { - const currentYear = new Date().getFullYear(); - const rainChkRes = await getCountFetch( - "wr", - `/reuseChk/rainy` + - (pageNo ? `/${pageNo}` : "/1") + - (cnt ? `/${cnt}` : "/10") + - (year ? `/${year}` : `/${currentYear}`) + - (sggCd ? `/${sggCd}` : "/0") + - (txt ? `/${txt}` : "") - ); + const rainChkRes = await initFetch(pageNo, cnt, searchTxt, sggCd); + return set((state: rainChkgdnState) => ({ ...state, rainChkgdn: { ...state.rainChkgdn, - rainChk: rainChkRes.data, - rainChkCount: rainChkRes.count, + rainChk: rainChkRes, }, })); } catch (error) { @@ -258,32 +187,26 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( try { const chData = await makeMdfrChk(rainChk, "rain", "rainDetil"); - const res = await putFectch("/reuseChk/rainy/list", chData); - if (res) { + const res = await postFectch("/reuseChk/rainy", chData); + if (res.staus === 200) { toast.success( - "지도점검 대체수 및 밋물이용량 수정이 완료되었습니다. " + "지도점검 보급수 및 밋물이용량 수정이 완료되었습니다. " ); const currentYear = new Date().getFullYear().toString(); - const rainChkRes = await initFetch( - 1, - rainPageSize, - currentYear, - "41" - ); + const rainChkRes = await initFetch("1", "20", currentYear, "11"); return set((state: rainChkgdnState) => ({ ...state, rainChkgdn: { ...state.rainChkgdn, - rainChk: rainChkRes.data, - rainChkCount: rainChkRes.count, + rainChk: rainChkRes, }, })); } else { - toast.error("지도점검 대체수 및 밋물이용량 수정 오류입니다."); + toast.error("지도점검 보급수 및 밋물이용량 수정 오류입니다."); } } catch (error) { console.log(error); - toast.error("지도점검 대체수 및 밋물이용량 수정 오류입니다."); + toast.error("지도점검 보급수 및 밋물이용량 수정 오류입니다."); } }, rainChkGuidUpdate: async (rainChk: rainChkZodType) => { @@ -294,22 +217,17 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( toast.success("지도점검 수질 및 과태료 수정이 완료되었습니다. "); const currentYear = new Date().getFullYear().toString(); - const rainChkRes = await initFetch( - 1, - rainPageSize, - currentYear, - "41" - ); + const rainChkRes = await initFetch("1", "20", currentYear, "11"); return set((state: rainChkgdnState) => ({ ...state, rainChkgdn: { ...state.rainChkgdn, - rainChk: rainChkRes.data, - rainChkCount: rainChkRes.count, + rainChk: rainChkRes, }, })); - } else { + }else{ toast.error("지도점검 수질 및 과태료 수정 오류입니다."); + } } catch (error) { toast.error("지도점검 수질 및 과태료 수정 오류입니다."); @@ -323,22 +241,17 @@ export const rainChkgdnActionsExport: (set: any) => rainChkgdnActions = ( toast.success("삭제가 완료되었습니다. "); const currentYear = new Date().getFullYear().toString(); - const rainChkRes = await initFetch( - 1, - rainPageSize, - currentYear, - "41" - ); + const rainChkRes = await initFetch("1", "20", currentYear, "11"); return set((state: rainChkgdnState) => ({ ...state, rainChkgdn: { ...state.rainChkgdn, - rainChk: rainChkRes.data, - rainChkCount: rainChkRes.count, + rainChk: rainChkRes, }, })); - } else { + }else{ toast.error("삭제시 오류가 발생하였습니다.. "); + } } catch (error) { toast.error("삭제시 오류가 발생하였습니다.. "); diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/headList.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/headList.tsx index a7fea419d..0e690dbb9 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/headList.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/headList.tsx @@ -109,24 +109,6 @@ export const rswtChkgdZod = z.object({ rswtrPollutions: z.array(rswtrPolutionsZode), }); - - -export const rswtRuseHeadNmExport: chHeadType[] = [ - { headNm: "useQuilty", text: "이용수질(필요시)", length: 3 }, - { headNm: "feeHist", text: "과태료 부과내역", length: 3 }, - { headNm: "ruseWater", text: "연간중수 이용량(m³)", length: 13 }, - { headNm: "detailQulity", text: "분기", length: 11 }, -]; - -export const rswtSplHeadNmExport: chHeadType[] = [ - { headNm: "useQuilty", text: "이용수질(필요시)", length: 3 }, - { headNm: "feeHist", text: "과태료 부과내역", length: 3 }, - { headNm: "detailQulity", text: "분기", length: 11 }, - { headNm: "splWater", text: "연간대체수 이용량(m³)", length: 13 }, -]; - - - export const rswtHeadNmExport: chHeadType[] = [ { headNm: "useQuilty", text: "연간 평균 이용수질", length: 10 }, { headNm: "feeHist", text: "과태료 부과내역", length: 3 }, @@ -144,7 +126,7 @@ export const rswtChkHeadListExport: TableUpperProps[] = [ { id: "spwtPositn", title: "채수지점" ,mergeCell: true}, { id: "chckYmd", title: "점검일" ,mergeCell: true}, { id: "utztnUsgCd", title: "이용용도" }, - { id: "splyUswtrUtztnQnt", title: "연간대체수이용량(m³)" ,type: "number"}, + { id: "splyUswtrUtztnQnt", title: "연간보급수이용량(m³)" ,type: "number"}, { id: "ruseFcltUtztnQnt", title: "연간중수도이용량(m³)",type: "number"}, { diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/index.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/index.tsx index 235b4f3e2..37e385ca2 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/index.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/index.tsx @@ -1,4 +1,6 @@ -import { TEST_UUID } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; +import { + TEST_UUID, +} from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import type { SelectDataType, SheetParameter, @@ -6,7 +8,6 @@ import type { import { deleteFectch, fetchType, - getCountFetch, getFetch, postFectch, putFectch, @@ -19,57 +20,33 @@ import { rswtDetailHeadListExport, rswtHeadNmExport, rswtrDetailsZod, - rswtRuseHeadNmExport, - rswtSplHeadNmExport, } from "./headList"; import { z } from "zod"; import { ToastFormUi } from "@/components/ui/toast/toastFromUi"; import { type chHeadType } from "../rainChkgdn/headList"; import type { TableUpperProps } from "@/app/store/common/type/header"; -import toast from "react-hot-toast"; - -export const rswtPageSize = 5; const rswtChkHeadList = rswtChkHeadListExport; const rswtDetailHeadList = rswtDetailHeadListExport; const rswtHeadNm = rswtHeadNmExport; -const rswtRuseHeadNm =rswtRuseHeadNmExport -const rswtSplHeadNm =rswtSplHeadNmExport - - export type rswtChkZodType = z.infer<typeof rswtChkgdZod>; export type rswtrChkDetailsZodType = z.infer<typeof rswtrDetailsZod>; export type rswtChkgdnState = { rswtChkgdn: { rswtChkHeadList: TableUpperProps[]; rswtDetailHeadList: TableUpperProps[]; + rswtHeadNm: chHeadType[]; excelList: SheetParameter[]; rswtChkRes: rswtChkZodType[]; rswtChkPolGuide: rswtChkZodType[]; - rswtSplHeadNm:chHeadType[] - rswtRuseHeadNm:chHeadType[] isInit: boolean; - isSttn: boolean; - isLoading:boolean; - rswtChkCount: number; + isSttn: boolean }; }; type rswtChkgdnActions = { - rswtChkgdnInit: ( - pageNo: number, - cnt: number, - year: string, - sggCd: string - ) => void; - rswtChkNmSearch: ( - pageNo: number, - cnt: number, - year: string, - sggCd: string, - txt: string - ) => void; + rswtChkgdnInit: (pageNo: string, cnt: string, year: string, sggCd: string) => void; rswtrChkExcelDownload( sidoCode: SelectDataType[], sggCode: SelectDataType[] @@ -90,41 +67,27 @@ export const rswtChkgdnStateExport: rswtChkgdnState = { rswtChkHeadList: rswtChkHeadList, rswtDetailHeadList: rswtDetailHeadList, rswtHeadNm: rswtHeadNm, - rswtRuseHeadNm:rswtRuseHeadNm, - rswtSplHeadNm:rswtSplHeadNm, - - excelList: [ - { - data: [[]], - headerNum: 0, - headerRange: "A1:V3", - sheetName: "", - startCol: "1", - }, - ], + excelList: [{ + data: [[]], headerNum: 0, headerRange: "A1:V3", + sheetName: "", + startCol: '1' + }], rswtChkRes: [], rswtChkPolGuide: [], isInit: false, isSttn: false, - isLoading:false, - rswtChkCount: 1, }, }; -const initFetch = async ( - pageNo: number, - cnt: number, - year: string | undefined, - sgg: string | undefined -) => { +const initFetch = async (pageNo: string, cnt: string, year: string | undefined, sgg: string | undefined) => { const currentYear = new Date().getFullYear().toString(); - const rswtChkRes = await getCountFetch( + const rswtChkRes = await getFetch( "wr", `/reuseChk/reuseWater` + - (pageNo ? `/${pageNo}` : "/1") + - (cnt ? `/${cnt}` : "/20") + - (year ? `/${year}` : `/${currentYear}`) + - (sgg ? `/${sgg}` : "/0") + (pageNo ? `/${pageNo}` : "/1") + + (cnt ? `/${cnt}` : "/20") + + (year ? `/${year}` : `/${currentYear}`) + + (sgg ? `/${sgg}` : "/0") ); return rswtChkRes; }; @@ -176,13 +139,7 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = ( }, })); }, - rswtChkgdnInit: async ( - pageNo: number, - cnt: number, - year: string, - sggCd: string - ) => { - set((state: rswtChkgdnType) => ({ rswtChkgdn: { ...state.rswtChkgdn, isLoading: true } })); + rswtChkgdnInit: async (pageNo: string, cnt: string, year: string, sggCd: string) => { try { const rswtChkRes = await initFetch(pageNo, cnt, year, sggCd); @@ -226,8 +183,7 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = ( ...state, rswtChkgdn: { ...state.rswtChkgdn, - rswtChkRes: rswtChkRes.data, - rswtChkCount: rswtChkRes.count, + rswtChkRes: rswtChkRes, isInit: false, }, })); @@ -237,8 +193,6 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = ( }, rswtChkExceDataUpload: async (excelData: rswtChkZodType[]) => { try { - set((state: rswtChkgdnType) => ( - { rswtChkgdn: { ...state.rswtChkgdn, isLoading: true } })); const res = await postFectch("/reuseChk/reuseWater", excelData); if (res.ok) { ToastFormUi({ @@ -247,66 +201,65 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = ( }); } const currentYear = new Date().getFullYear().toString(); - const rswtChkRes = await initFetch(1, rswtPageSize, currentYear, "0"); + const rswtChkRes = await initFetch("1", "20", currentYear, "0"); return set((state: rswtChkgdnState) => ({ ...state, rswtChkgdn: { ...state.rswtChkgdn, - rswtChkRes: rswtChkRes.data, - rswtChkCount: rswtChkRes.count, + rswtChkRes: rswtChkRes }, })); } catch (error) { console.log(error); - }finally{ - set((state: rswtChkgdnType) => ( - { rswtChkgdn: { ...state.rswtChkgdn, isLoading: false } })); } - }, rswtChkDetilsUpdate: async (rswtChk: rswtrChkDetailsZodType[]) => { try { const chData = await makeMdfrChk(rswtChk); + const res = await putFectch("/reuseChk/reuseWater", chData); if (res.ok) { - toast.success("지도점검 과태료 수정이 완료되었습니다. ",) + ToastFormUi({ + body: "지도점검 과태료 수정 수정이 완료되었습니다. ", + title: "지도점검 수정", + }); } const currentYear = new Date().getFullYear().toString(); - const rswtChkRes = await initFetch(1, rswtPageSize, currentYear, "0"); + const rswtChkRes = await initFetch("1", "20", currentYear, "0"); return set((state: rswtChkgdnState) => ({ ...state, rswtChkgdn: { ...state.rswtChkgdn, - rswtChkRes: rswtChkRes.data, - rswtChkCount: rswtChkRes.count, + rswtChkRes: rswtChkRes, }, })); } catch (error) { console.log(error); - toast.error("지도점검 과태료 수정 오류입니다. ",) - + alert("수정에 실패하였습니다."); } }, rswtChkDelete: async (chkgdnPks: number[]) => { try { const res = await deleteFectch(`/reuseChk/reuseWater`, chkgdnPks); - if (res) { - toast.success("삭제가 완료되었습니다.") + if (res.ok) { + ToastFormUi({ + body: "삭제가 완료되었습니다. ", + title: "지도점검 삭제", + }); } const currentYear = new Date().getFullYear().toString(); - const rswtChkRes = await initFetch(1, rswtPageSize, currentYear, "0"); + const rswtChkRes = await initFetch("1", "20", currentYear, "0"); return set((state: rswtChkgdnState) => ({ ...state, rswtChkgdn: { ...state.rswtChkgdn, - rswtChkRes: rswtChkRes.data, - rswtChkCount: rswtChkRes.count, + rswtChkRes: rswtChkRes, }, })); } catch (error) { - toast.error("삭제 오류입니다.") + ToastFormUi({ body: "삭제를 실패했습니다.. ", title: "지도점검 삭제" }); } }, rswtChkPolAndGuide: async (chkGdnPk: number) => { @@ -323,11 +276,7 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = ( rswtChkPolGuide: rswtChkPolGuide, }, })); - } catch (error) { - - - - } + } catch (error) { } }, rswtChkPolInit: () => { try { @@ -338,7 +287,7 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = ( rswtChkPolGuide: undefined, }, })); - } catch (error) {} + } catch (error) { } }, rwstPolAndGuideUpdate: async (rswtChk: rswtChkZodType[]) => { try { @@ -348,10 +297,13 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = ( chData[0] ); if (res.ok) { - toast.success("지도점검 연간 수질 및 대체수/중수도 수정이 완료되었습니다.") + ToastFormUi({ + body: "지도점검 연간 수질 및 보급수/중수도 수정이 완료되었습니다. ", + title: "지도점검 수정", + }); } const currentYear = new Date().getFullYear().toString(); - const rswtChkRes = await initFetch(1, rswtPageSize, currentYear, "0"); + const rswtChkRes = await initFetch("1", "20", currentYear, "0"); return set((state: rswtChkgdnState) => ({ ...state, rswtChkgdn: { @@ -361,9 +313,10 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = ( })); } catch (error) { console.log(error); - - toast.error("지도점검 연간 수질 및 대체수/중수도 수정 오류입니다.") - + ToastFormUi({ + body: "지도점검 연간 수질 및 보급수/중수도 수정이 실패하였습니다.. ", + title: "지도점검 수정", + }); } }, rswtChkHeadChange: async (rswtChkgdn: rswtChkgdnState, isEdit: boolean) => { @@ -384,7 +337,7 @@ export const rswtChkgdnActionsExport: (set: any) => rswtChkgdnActions = ( rswtDetailHeadList: rswtDetailHeadList, }, })); - } catch (e) {} + } catch (e) { } }, }; }; diff --git a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/index.tsx b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/index.tsx index 43c3969e2..738354b04 100644 --- a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/index.tsx +++ b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rainChkgdnSttn/index.tsx @@ -1,8 +1,8 @@ import type { rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; -import { getCountFetch, getFetch } from "@/components/lib/api"; +import { getFetch } from "@/components/lib/api"; import type { SelectDataType } from "@common/business_components/ui"; import { rainChkgdnHeadSttnExport, ruseSttnHeadListExport, splSttnHeadListExport } from "./headList"; -import { rainMainHeadNmExport, type chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; +import { rainHeadNmExport, type chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; import { buildingExcelRainSttn } from "./excel"; import type { TableUpperProps } from "@/app/store/common/type/header"; @@ -15,7 +15,7 @@ const fcltDiv = [ const rainChkgdnHeadList = rainChkgdnHeadSttnExport; const ruseHeadList = ruseSttnHeadListExport; const splHeadList = splSttnHeadListExport; -const rainHeadNm = rainMainHeadNmExport +const rainHeadNm = rainHeadNmExport const rainChk: rainChkZodType[] = []; @@ -24,13 +24,12 @@ export type rainChkSttnState = { rainChkRes: rainChkZodType[]; fcltDiv: SelectDataType[]; rainChkgdnHeadList: TableUpperProps[]; - rainHeadNm: chHeadType[]; + rainHeadNm:chHeadType[]; ruseHeadList: TableUpperProps[]; splHeadList: TableUpperProps[]; - sttnExcelList: [] + sttnExcelList:[] isInit: boolean; - isSttn: boolean; - rainChkCount: number; + isSttn:boolean; }; }; @@ -50,23 +49,18 @@ export const rainChkSttnStateExport: rainChkSttnState = { rainChkgdnHeadList: rainChkgdnHeadList, ruseHeadList: ruseHeadList, splHeadList: splHeadList, - rainHeadNm: rainHeadNm, + rainHeadNm:rainHeadNm, isInit: false, - sttnExcelList: [], - isSttn: false, - rainChkCount: 1, + sttnExcelList:[], + isSttn:false, }, }; -const initFetch = async (pageNo: number, cnt: number, txt: string | undefined, sgg: string | undefined) => { +const initFetch = async (txt: string | undefined, sgg: string | undefined) => { const currentYear = new Date().getFullYear().toString(); - const rainRes = await getCountFetch( + const rainRes = await getFetch( "wr", - `/reuseChk/rainy` + - (pageNo ? `/${pageNo}` : "/1") + - (cnt ? `/${cnt}` : "/5") + - (txt ? `/${txt}` : `/${currentYear}`) + - (sgg ? `/${sgg}` : "/0") + `/reuseChk/rainy/` + (txt ? `${txt}` : currentYear) + (sgg ? `/${sgg}` : "/0") ); return rainRes; }; @@ -74,17 +68,15 @@ export const rainChkSttnActionsExport: (set: any) => rainChkSttnActions = ( set: any ) => { return { - rainChkSttnInit: async (pageNo: number, cnt: number, searchTxt: string, sggCd: string) => { + rainChkSttnInit: async (searchTxt: string, sggCd: string) => { try { - const rainChkRes = await initFetch(pageNo, cnt, searchTxt, sggCd); + const rainChkRes = await initFetch(searchTxt, sggCd); return set((state: rainChkSttnState) => ({ ...state, rainChkSttn: { ...state.rainChkSttn, - rainChkRes: rainChkRes.data, - rainChkCount: rainChkRes.count, - isSttn: true + rainChkRes:rainChkRes }, })); } catch (error) { @@ -127,13 +119,13 @@ export const rainChkSttnActionsExport: (set: any) => rainChkSttnActions = ( ...state, rainChkSttn: { ...state.rainChkSttn, - isSttn: isSttn + isSttn:isSttn }, })); } catch (error) { console.log(error); } - }, getRainSttnExcel: async (excelList: rainChkZodType[]) => { + },getRainSttnExcel: async (excelList:rainChkZodType[]) => { try { const excelData = buildingExcelRainSttn(excelList) @@ -142,7 +134,7 @@ export const rainChkSttnActionsExport: (set: any) => rainChkSttnActions = ( ...state, rainChkSttn: { ...state.rainChkSttn, - sttnExcelList: excelData + sttnExcelList:excelData }, })); } catch (error) { diff --git a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/headList.tsx b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/headList.tsx index a505f1b0c..91f6bf718 100644 --- a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/headList.tsx +++ b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/headList.tsx @@ -11,7 +11,7 @@ export const rswtChkSttnHeadListExport: TableUpperProps[] = [ { id: "spwtPositn", title: "채수지점", mergeCell: true }, { id: "chckYmd", title: "점검일", mergeCell: true }, { id: "utztnUsgCd", title: "이용용도" }, - { id: "splyUswtrUtztnQnt", title: "연간대체수이용량(m³)", type: "number" }, + { id: "splyUswtrUtztnQnt", title: "연간보급수이용량(m³)", type: "number" }, { id: "ruseFcltUtztnQnt", title: "연간중수도이용량(m³)", type: "number" }, { diff --git a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/index.tsx b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/index.tsx index f1d7a7d19..251ff1fa2 100644 --- a/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/index.tsx +++ b/apps/wr/app/store/prfmncSttn/chkgdnSttn/rswtChkgdnSttn/index.tsx @@ -3,7 +3,7 @@ import { rswtChkSttnHeadListExport, rswtDetailSttnHeadListExport } from "./headL import type { TableUpperProps } from "@/app/store/common/type/header"; import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; import type { rswtChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn"; -import { getCountFetch, getFetch } from "@/components/lib/api"; +import { getFetch } from "@/components/lib/api"; import { buildingExcelRswtSttn } from "./excel"; const rswtChkHeadList = rswtChkSttnHeadListExport; @@ -20,12 +20,11 @@ export type rswtChkSttnState = { rswtChkRes: rswtChkZodType[]; isInit: boolean; isSttn: boolean; - rswtChkCount: number; }; }; type rswtChkSttnActions = { - rswtChkSttnInit: (pageNo: number, cnt: number, searchTxt: string, sggCd: string) => void; + rswtChkSttnInit: (searchTxt: string, sggCd: string) => void; isRswtSttn: (isSttn: boolean) => void; getRswtSttnExcel: (excelList: rswtChkZodType[]) => void; rswtChkNmSttnSearch: (pageNo: number, cnt: number, year: string, sggCd: string, txt: string) => void; @@ -42,18 +41,15 @@ export const rswtChkStateExport: rswtChkSttnState = { rswtChkRes: [], isInit: false, isSttn: false, - rswtChkCount: 1, }, }; -const initFetch = async (pageNo: number, cnt: number, year: string | undefined, sgg: string | undefined) => { +const initFetch = async (year: string | undefined, sgg: string | undefined) => { const currentYear = new Date().getFullYear().toString(); - const rswtChkRes = await getCountFetch( + const rswtChkRes = await getFetch( "wr", - `/reuseChk/reuseWater` + - (pageNo ? `/${pageNo}` : "/1") + - (cnt ? `/${cnt}` : "/20") + - (year ? `/${year}` : `/${currentYear}`) + + `/reuseChk/reuseWater/` + + (year ? `${year}` : currentYear) + (sgg ? `/${sgg}` : "/0") ); return rswtChkRes; @@ -64,15 +60,14 @@ export const rswtChkSttnActionsExport: (set: any) => rswtChkSttnActions = ( set: any ) => { return { - rswtChkSttnInit: async (pageNo: number, cnt: number, searchTxt: string, sggCd: string) => { + rswtChkSttnInit: async (searchTxt: string, sggCd: string) => { try { - const rswtChkRes = await initFetch(pageNo, cnt, searchTxt, sggCd); + const rswtChkRes = await initFetch(searchTxt, sggCd); return set((state: rswtChkSttnState) => ({ ...state, rswtChkSttn: { ...state.rswtChkSttn, - rswtChkRes: rswtChkRes.data, - rswtChkCount: rswtChkRes.count, + rswtChkRes: rswtChkRes, isInit: false, }, })); diff --git a/apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx b/apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx index db8b6a717..b513085ae 100644 --- a/apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx +++ b/apps/wr/app/store/prfmncSttn/pbnstPrfmncSttn/index.tsx @@ -148,7 +148,7 @@ export const pbnstPrfmncSttnActionsExport: (set: any) => pbnstPrfmncSttnActions let usageSum = 0; let year = ""; const yearsData = [] - + res.data.forEach((item) => { if (item.prfList.length === 0) { const year = ""; // 연도 정보가 없으면 빈 문자열, 필요시 item에서 추출 @@ -161,26 +161,26 @@ export const pbnstPrfmncSttnActionsExport: (set: any) => pbnstPrfmncSttnActions item.prfList.forEach((acc) => { year = acc.ym?.substring(0, 4) ?? ""; inUsageSum = - (acc.wshwtr ?? 0) + //조경용수 - (acc.coolUswtr ?? 0) + //냉각수 - (acc.cleanUswtr ?? 0) + //청소수 - (acc.drwtUswtr ?? 0) + //식수대 - (acc.dltnUswtr ?? 0) + //희석용수 - (acc.ithlRswtr ?? 0) + //중수도 - (acc.ithlEtcUswtr ?? 0) //기타 + (acc.wshwtr ?? 0) + + (acc.coolUswtr ?? 0) + + (acc.cleanUswtr ?? 0) + + (acc.drwtUswtr ?? 0) + + (acc.dltnUswtr ?? 0) + + (acc.ithlRswtr ?? 0) + + (acc.ithlEtcUswtr ?? 0) + + (acc.cleanToilUswtr ?? 0) + + (acc.resn ?? 0); outUsageSum = - (acc.cleanToilUswtr ?? 0) + //청소화장실용수 - (acc.resn ?? 0)+ //세척살수용도 - (acc.lndwtr ?? 0) + //조경용수 - (acc.hydUswtr ?? 0) + //친수용수 - (acc.ugwtChr ?? 0) + //지하수충전 - (acc.farmUswtr ?? 0) + //농업용수 - (acc.rvrKeepUswtr ?? 0) + //하천등유지용수 - (acc.indstUswtr ?? 0); //공업용수 + (acc.lndwtr ?? 0) + + (acc.hydUswtr ?? 0) + + (acc.ugwtChr ?? 0) + + (acc.farmUswtr ?? 0) + + (acc.rvrKeepUswtr ?? 0) + + (acc.indstUswtr ?? 0); const yearData = yearsData.find( (yearItem) => yearItem.year === year && - yearItem.pbnstRuseFcltPk == acc.pbnstRuseFcltFk + yearItem.pbnstRuseFcltPk == acc.pbnstRuseFcltPk ); if (yearData) { diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/htdflSttn/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/htdflSttn/index.tsx index ba81066be..dccc8719c 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltSttn/htdflSttn/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltSttn/htdflSttn/index.tsx @@ -5,8 +5,6 @@ import type { z } from "zod"; import { controlHeadView } from "../rainSttn"; import type { customHtdflBdst } from "../../fcltReg/htdflReg"; import { fetchType, getFetch } from "@/components/lib/api"; -import type { SelectDataType } from "@common/business_components"; -import { excelHtdflSttnParsing } from "./excel"; const htdflSttHeadList = htdflSttHeadListExport; const htdflSttNodeList = htdflSttNodeListExport; @@ -23,8 +21,7 @@ export type htdflSttnState = { }; type htdflSttnActions = { initHtdfl: (con: string) => void; - htdflSttnSearch: (page: number, total: string, con: string, sidoCode: SelectDataType[], - sggCode: SelectDataType[]) => void; + htdflSttnSearch: (page: number, total: string, con: string) => void; htdflChSttnHead: ( headList: z.infer<typeof sttnHeadListType>, ) => void; @@ -70,23 +67,22 @@ export const htdflSttnActionsExport: (set: any) => htdflSttnActions = ( console.log(error); } }, - htdflSttnSearch: async (page: number, total: string, con: string, - sidoCode: SelectDataType[], - sggCode: SelectDataType[] - ) => { + htdflSttnSearch: async (page: number, total: string, con: string) => { try { const htdflSttnRes = await getFetch( fetchType.WR, `/drain/facilityList/${page}/${total}/${con}` ); if (Number(total) > 9000) { - const htdflExcel = excelHtdflSttnParsing(htdflSttnRes, sidoCode, sggCode); + + set((state: htdflSttnState) => { + return { ...state, htdflSttn: { ...state.htdflSttn, - excelList: htdflExcel, + excelList: htdflSttnRes, }, }; }); diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/rainSttn/headList.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/rainSttn/headList.tsx index ef662cc8c..8dd2a4d6f 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltSttn/rainSttn/headList.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltSttn/rainSttn/headList.tsx @@ -426,7 +426,7 @@ export const rainSttNodeListExport: CommonTableProps[] = [ export const rainSttnDetailNodeListExport:CommonTableProps[] = [ { id: "totalSplyUswtrUtztnQnt", - title: "연간대체수이용량(m³)", + title: "연간보급수이용량(m³)", visible: true, row: 1, rowSpan: 2, @@ -511,7 +511,7 @@ export const rainSttnDetailNodeListExport:CommonTableProps[] = [ export const rainSttnDetailHeadListExport:CommonTableProps[] = [ { id: "totalSplyUswtrUtztnQnt", - title: "연간대체수이용량(m³)", + title: "연간보급수이용량(m³)", visible: true, row: 1, rowSpan: 1, diff --git a/apps/wr/components/lib/api/index.ts b/apps/wr/components/lib/api/index.ts index 69bc1bb68..452788eb0 100644 --- a/apps/wr/components/lib/api/index.ts +++ b/apps/wr/components/lib/api/index.ts @@ -46,29 +46,6 @@ export const getFetch = async (type: string, url: string) => { } }; - -export const getCountFetch = async (type: string, url: string) => { - const div = - type === fetchType.COMMON - ? DEV_URL_FO - : type === fetchType.LOCAL - ? LOCAL_URL - : type === fetchType.CS - ? '' - : DEV_URL_WR; - - const response = await fetch(div + url, { - method: "GET", - headers: { - accept: "application/json", - }, - }); - // JSON 응답 처리 - const res = await response.json(); - return res; - -}; - export const getFetchWithCount = async (type: string, url: string) => { const div = type === fetchType.COMMON diff --git a/apps/wr/components/lib/func/TableData.tsx b/apps/wr/components/lib/func/TableData.tsx index 5be5d9fb3..7a35e02c4 100644 --- a/apps/wr/components/lib/func/TableData.tsx +++ b/apps/wr/components/lib/func/TableData.tsx @@ -54,30 +54,27 @@ export const rainChkTableData = (chkData: rainChkZodType[]) => { export const rswtChkTableData = (chkData: rswtChkZodType[]) => { // 1. chkgdnFk + utztnUsgCd 기준 누계 정보 만들기 const makeRswtData: any[] = []; - if(chkData&& chkData.length>0){ - - chkData?.forEach((root) => { - root.rswtrDetails.forEach((detail) => { - let flatRswtChk = {}; - const findGuide = root.guideDetails.find( - (guide) => guide.utztnUsgCd === detail.utztnUsgCd - ); - const findPoluttion = root.rswtrPollutions.find( - (polution) => polution.utztnUsgCd === detail.utztnUsgCd - ); - const operMngCd = root?.reuseBuilding.operMngCd; - flatRswtChk = { - ...root, - ...detail, - ...findGuide, - ...findPoluttion, - ...flatRswtChk, - operMngCd: operMngCd, - }; - makeRswtData.push(flatRswtChk); - }); + chkData?.forEach((root) => { + root.rswtrDetails.forEach((detail) => { + let flatRswtChk = {}; + const findGuide = root.guideDetails.find( + (guide) => guide.utztnUsgCd === detail.utztnUsgCd + ); + const findPoluttion = root.rswtrPollutions.find( + (polution) => polution.utztnUsgCd === detail.utztnUsgCd + ); + const operMngCd = root?.reuseBuilding.operMngCd; + flatRswtChk = { + ...root, + ...detail, + ...findGuide, + ...findPoluttion, + ...flatRswtChk, + operMngCd: operMngCd, + }; + makeRswtData.push(flatRswtChk); }); - } + }); return makeRswtData; }; diff --git a/apps/wr/components/lib/func/commom.tsx b/apps/wr/components/lib/func/commom.tsx index 50e425722..8569d4eb3 100644 --- a/apps/wr/components/lib/func/commom.tsx +++ b/apps/wr/components/lib/func/commom.tsx @@ -165,34 +165,18 @@ export const yearOptions: { val: string; text: string }[] = Array.from( }) ); -export const getdmdMatFlag = (flag: string | undefined | null): string => { - // 1. undefined나 null인 경우, '신청'을 반환합니다. - // (이 검사를 먼저 함으로써 아래에서 .trim()을 안전하게 사용할 수 있습니다.) - if (flag == null) { - return "신청"; - } +export const getdmdMatFlag = (flag: string|undefined) => { + let flagMat = ""; - // 2. 이제 flag가 문자열임이 보장되므로 .trim()을 호출해 앞뒤 공백을 제거합니다. - const trimmedFlag = flag.trim(); + if(flag === undefined || flag === null) { + flagMat = "신청"; + }else if(flag.trim() === "Sub") { + flagMat = "검토"; - if (trimmedFlag === "Sub") { - return "검토"; - } else if (trimmedFlag === "matched") { - return "매칭완료"; + }else if(flag.trim() === "matched") { + flagMat = "매칭완료"; + }else { + flagMat = "신청"; } - // 3. 그 외 모든 경우(빈 문자열 포함)는 '신청'으로 처리합니다. - return "신청"; + return flagMat; }; - - - -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'); - } else if (onlyNums.length === 11) { - return onlyNums.replace(/(\d{3})(\d{4})(\d{4})/, '$1-$2-$3'); - } else { - return tel; // 유효하지 않으면 빈 문자열 - } -} \ No newline at end of file diff --git a/apps/wr/components/ui/form/coMat/conCostForm/conCostForm.tsx b/apps/wr/components/ui/form/coMat/conCostForm/conCostForm.tsx index 3d59d0a61..b22f9474e 100644 --- a/apps/wr/components/ui/form/coMat/conCostForm/conCostForm.tsx +++ b/apps/wr/components/ui/form/coMat/conCostForm/conCostForm.tsx @@ -368,7 +368,7 @@ export default function ConCostForm({ childrenTriger={ <> <Label className="underline"> - 처리시설 총사업비(백만원) <i className="diveicon di-search" /> + 총사업비 (백만원) <i className="diveicon di-search" /> </Label> </> } @@ -405,7 +405,7 @@ export default function ConCostForm({ )} /> </div> - {/* <div className="col-span-3 mt-4"> + <div className="col-span-3 mt-4"> <div className="flex items-center justify-between"> <Label>공급처 선정</Label> <Button size={"sm"} onClick={(e) => {}} className="bg-none"> @@ -428,7 +428,7 @@ export default function ConCostForm({ </FormUi> )} /> - </div> */} + </div> <div className="col-span-4 mt-4"> <FormField control={form.control} diff --git a/apps/wr/components/ui/modal/chkgd/chkgdExcel/chkgdExcel.tsx b/apps/wr/components/ui/modal/chkgd/chkgdExcel/chkgdExcel.tsx index 5aa67fd3a..8828420b8 100644 --- a/apps/wr/components/ui/modal/chkgd/chkgdExcel/chkgdExcel.tsx +++ b/apps/wr/components/ui/modal/chkgd/chkgdExcel/chkgdExcel.tsx @@ -7,9 +7,11 @@ import { excelToRswtGuideData, excelToRswtPolution, } from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/excel"; +import { ToastFormUi } from "@/components/ui/toast/toastFromUi"; import { filePicked, filePickedArray, + FileUpload, Form, FormField, FormUi, @@ -24,7 +26,7 @@ import { useForm } from "react-hook-form"; import toast from "react-hot-toast"; import type { z } from "zod"; -export default function ChkgdExcel({ type,setIsRegExcel }: { type: string, setIsRegExcel:(open:boolean) =>void }) { +export default function ChkgdExcel({ type }: { type: string }) { const { rswtChkgdn, rainChkExcelDataUPload, rswtChkExceDataUpload } = useWrStore((state) => { return state; @@ -144,28 +146,29 @@ export default function ChkgdExcel({ type,setIsRegExcel }: { type: string, setI const onSubmit = (values: z.infer<typeof chkgdRegExcel>) => { if (values.chckYr === "") { - toast.error("등록년도를 작성해주세요"); + ToastFormUi({ body: "등록년도를 작성해주세요", title: "지도점검 등록" }); return; } if (type === "RNB") { if (excelData === undefined || excelData?.length === 0) { - toast.error("빈 파일 및 파일 오류 입니다."); - + ToastFormUi({ + body: "빈 파일 및 파일 오류 입니다.", + title: "지도점검 등록", + }); return; } else { rainChkExcelDataUPload(excelData as rainChkZodType[]); - setIsRegExcel(false) } } else if (type === "RST") { if (excelRswtData === undefined || excelRswtData?.length === 0) { - toast.error("빈 파일 및 파일 오류 입니다."); - + ToastFormUi({ + body: "빈 파일 및 파일 오류 입니다.", + title: "중수지도점검 등록", + }); return; } else { rswtChkExceDataUpload(excelRswtData as rswtChkZodType[]); - setIsRegExcel(false) - } } }; diff --git a/apps/wr/components/ui/modal/chkgd/chkgdModal/chkgdModal.tsx b/apps/wr/components/ui/modal/chkgd/chkgdModal/chkgdModal.tsx index 515c74490..965bc7275 100644 --- a/apps/wr/components/ui/modal/chkgd/chkgdModal/chkgdModal.tsx +++ b/apps/wr/components/ui/modal/chkgd/chkgdModal/chkgdModal.tsx @@ -1,14 +1,16 @@ import { useWrStore } from "@/app/store"; -import type { TableUpperProps } from "@/app/store/common/type/header"; -import type { splRuseWaterType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; -import type { rswtrPolutionsZode } from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/headList"; -import { GuideDetailsTable } from "@/components/ui/table/chkgdTable/guideDetailTable/guideDetailTable"; import { ScrollArea, Title } from "@common/business_components/ui"; import { Button } from "@common/components/ui"; -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; +import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead"; +import { GuideDetailsTable } from "@/components/ui/table/chkgdTable/guideDetailTable/guideDetailTable"; +import type { splRuseWaterType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; +import type { rswtrPolutionsZode } from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn/headList"; import type { z } from "zod"; +import React from "react"; +import type { TableUpperProps } from "@/app/store/common/type/header"; -export default function ChkgdModal({ type, obj, setIsModal }: { type: string; obj: any, setIsModal: (open: boolean) => void }) { +export default function ChkgdModal({ type, obj }: { type: string; obj: any }) { const { rainChkgdn, rswtChkgdn, @@ -77,8 +79,6 @@ export default function ChkgdModal({ type, obj, setIsModal }: { type: string; ob ]); useEffect(() => { - console.log('obj ', obj) - const result = obj.guideDetails?.reduce((acc: any, cur: any) => { const code = cur.utztnUsgCd; const month = cur.ym?.slice(4); // "MM" @@ -114,10 +114,9 @@ export default function ChkgdModal({ type, obj, setIsModal }: { type: string; ob }); } + console.log("result ", result); setGuidData(result as splRuseWaterType[]); - - console.log('obj ', obj) if (obj.rswtrPollutions) { const resultPolution: Record<string, any[]> = { "1": [], @@ -218,14 +217,12 @@ export default function ChkgdModal({ type, obj, setIsModal }: { type: string; ob obj.guideDetails = realGuideDetail; if (type === "RNB") { rainChkGuidUpdate(obj); - setIsModal(false) } else { const polution = Object.values(upPolutionData) .flat() .filter((item) => item.utztnUsgCd !== "평균"); obj.rswtrPollutions = polution; rwstPolAndGuideUpdate([obj]); - setIsModal(false) } }; @@ -251,8 +248,7 @@ export default function ChkgdModal({ type, obj, setIsModal }: { type: string; ob </div> <div className="flex justify-between"> <h3 className="text-2xl font-bold text-gray-900 mt-2 ml-6"> - {type === "RNB" - ? `(${obj.bdstNm})` : `(${obj.building.bdstNm})`} + {`(${obj.bdstNm})`} </h3> {!rainChkSttn.isSttn ? ( <Button className="" onClick={allDataUpdate}> @@ -266,13 +262,12 @@ export default function ChkgdModal({ type, obj, setIsModal }: { type: string; ob <ScrollArea className="h-[60vh]"> <div className="card-header"> <h3 className="text-2xl font-medium text-label"> - {`연간대체수이용량`} + {`연간보급수이용량`} </h3> </div> <GuideDetailsTable chgRes={guidData || []} - headList={headList.splHeadList} - upheadList={type === "RNB" ? rainChkgdn.rainSplHeadNm : rswtChkgdn.rswtSplHeadNm} + headList={headList.ruseHeadList} type={""} setChGuidData={(data) => { setChGuidData(data); @@ -285,8 +280,7 @@ export default function ChkgdModal({ type, obj, setIsModal }: { type: string; ob </div> <GuideDetailsTable chgRes={guidData || []} - headList={headList.ruseHeadList} - upheadList={type === "RNB" ? rainChkgdn.rainRuseHeadNm : rswtChkgdn.rswtRuseHeadNm} + headList={headList.splHeadList} type={""} setChGuidData={(data) => { setChGuidData(data); @@ -308,7 +302,6 @@ export default function ChkgdModal({ type, obj, setIsModal }: { type: string; ob <GuideDetailsTable chgRes={value} headList={headList?.rswtDetailHeadList} - upheadList={rswtChkgdn.rswtSplHeadNm} type={""} setChGuidData={(data) => { getPolutionData(data); diff --git a/apps/wr/components/ui/modal/coReg/coRegExcel/coRegExcelModal.tsx b/apps/wr/components/ui/modal/coReg/coRegExcel/coRegExcelModal.tsx index 6f6afe186..89f15a3cc 100644 --- a/apps/wr/components/ui/modal/coReg/coRegExcel/coRegExcelModal.tsx +++ b/apps/wr/components/ui/modal/coReg/coRegExcel/coRegExcelModal.tsx @@ -4,36 +4,32 @@ import type { customLdrmnt } from "@/app/store/matDmd/ldrmntCoSttn"; import { names } from "@/app/store/matDmd/ldrmntCoSttn/excel"; import { filePicked, FileUpload, FormUi, Title } from "@common/business_components/ui"; import { Form, FormField } from "@common/business_components/ui/form"; -import LoadingOverlay from "@common/business_components/ui/loadingBar"; import { Button, Progress } from "@common/components/ui"; import { zodResolver } from "@hookform/resolvers/zod"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; -import toast from "react-hot-toast"; import type { z } from "zod"; -export default function CoRegExcel({ isModal }: { isModal: (open: boolean) => void }) { - const { ldrmnt,loadingOpen } = useWrStore((state) => state); - const { isLoading } = ldrmnt; +export default function CoRegExcel() { + + const form = useForm<z.infer<typeof coRegExcel>>({ resolver: zodResolver(coRegExcel), }); const { ldrmntRegData, ldrmntDelete } = useWrStore((state) => state); const [excelData, setExcelData] = useState<customLdrmnt[]>(); + const [file, setFiles] = useState<File | undefined>(); - useEffect(() => { - console.log("ldrmnt", ldrmnt) - }, [ldrmnt]) - const onSubmit = (values: z.infer<typeof coRegExcel>) => { - loadingOpen(true); + ldrmntDelete(); if (file) { - filePicked(file, 0).then(async (res) => { - + filePicked(file, 0).then((res) => { + //TODO:loading try { let array: { [key: string]: string | number }[] = [] + let isError = false; if (Array.isArray(res)) { res.some((item, index) => { let object: { [key: string]: string | number } = {} @@ -47,24 +43,26 @@ export default function CoRegExcel({ isModal }: { isModal: (open: boolean) => vo } return false; }) - + if (isError === true) + return true; array.push(object) + if (index != 0 && index % 5000 == 0) { + ldrmntRegData(array); + array = [] + array.length = 0; + } return false; }) } - await ldrmntRegData(array); - isModal(false); - loadingOpen(false); - toast.success(`잠재수요처 등록이 완료되었습니다.`); + if (isError === false) + ldrmntRegData(array); } catch (e) { console.log(e) - loadingOpen(false); alert(e) return true; } - }).catch((e)=>{ - console.log("file", e); + }); }; } @@ -72,7 +70,6 @@ export default function CoRegExcel({ isModal }: { isModal: (open: boolean) => vo return ( <> <div> - <LoadingOverlay isLoading={isLoading}></LoadingOverlay> <Form {...form}> <form onSubmit={form.handleSubmit(onSubmit)}> <div> diff --git a/apps/wr/components/ui/table/chkgdTable/guideDetailTable/guideDetailTable.tsx b/apps/wr/components/ui/table/chkgdTable/guideDetailTable/guideDetailTable.tsx index 2bf33e7c2..94be4ebb6 100644 --- a/apps/wr/components/ui/table/chkgdTable/guideDetailTable/guideDetailTable.tsx +++ b/apps/wr/components/ui/table/chkgdTable/guideDetailTable/guideDetailTable.tsx @@ -4,7 +4,6 @@ import { useWrStore } from "@/app/store"; import type { TableUpperProps } from "@/app/store/common/type/header"; import type { } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; -import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; import { InputTableBody } from "@/components/lib/func/TableData"; import { Input, @@ -19,13 +18,11 @@ import { useEffect, useState, type Dispatch, type SetStateAction } from "react" export function GuideDetailsTable({ chgRes, headList, - upheadList, type, setChGuidData, }: { chgRes: any[]; headList: TableUpperProps[]; - upheadList:chHeadType[] type: string; setChGuidData: (chgRes: any[]) => void; }) { @@ -47,7 +44,7 @@ export function GuideDetailsTable({ <> <div className={`card !m-[1.2rem] !p-0r `}> <Table variant="secondary"> - <TableHeader className="font-bold">{headMakeprfmnc(headList, upheadList)}</TableHeader> + <TableHeader className="font-bold">{headMakeprfmnc(headList, rainChkgdn?.rainHeadNm)}</TableHeader> <TableBody > {InputTableBody(inputData ?? [],headList, setInputData) } </TableBody> diff --git a/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx b/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx index 687b27611..720a73ab4 100644 --- a/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx +++ b/apps/wr/components/ui/table/chkgdTable/rainChkgd/rainChkgdTable.tsx @@ -1,7 +1,7 @@ "use client"; import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead"; import { useWrStore } from "@/app/store"; -import { rainPageSize, type rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; +import type { rainChkZodType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; import type { TableUpperProps } from "@/app/store/common/type/header"; import { tableData } from "@/components/lib/func/commom"; @@ -17,7 +17,6 @@ import { } from "@common/components/ui"; import { useCallback, useEffect, useState } from "react"; import UiPageNations from "@common/business_components/ui/table/uiPageNations"; -import LoadingOverlay from "@common/business_components/ui/loadingBar"; export default function RainChkgdTable({ detailUp, handleClick = () => { }, @@ -25,7 +24,6 @@ export default function RainChkgdTable({ rainChkData, pageNation, onPageChange, - pageCount, }: { detailUp: (data: rainChkZodType[]) => void; handleClick?: (data: any) => void; @@ -33,7 +31,6 @@ export default function RainChkgdTable({ rainChkData?: rainChkZodType[]; pageNation: number; onPageChange: (page: number) => void; - pageCount: number; }) { const { code, rainChkgdn, rainChkSttn, getRainSttnExcel } = useWrStore((state) => state); const [makeTableData, setMakeTableData] = useState<any[]>([]); @@ -73,12 +70,16 @@ export default function RainChkgdTable({ }, [makeTableData, handleClick]); + useEffect(() =>{ + + + },[rainChkgdn.rainChk]) useEffect(() => { setSelectedIds([])// 셀렉트 초기화를 위한 작업 - if (rainChkData && rainChkData.length > 0) { + if (rainChkData) { - const rainChg = rainChkData?.map((item: any) => { + const rainChg = rainChkData.map((item: any) => { const bud = tableData([item.building], { code }); return { ...item, @@ -88,8 +89,6 @@ export default function RainChkgdTable({ }); setMakeTableData(rainChkTableData(rainChg)); - } else { - setMakeTableData([]); } }, [rainChkData, code]); @@ -168,17 +167,17 @@ export default function RainChkgdTable({ } else { setHeadList({ headList: rainChkgdn.rainChkgdnHeadList, - upHeadList: rainChkgdn.rainMainHeadNm + upHeadList: rainChkgdn.rainHeadNm }) } + }, [rainChkSttn.isSttn, rainChkgdn.rainChkgdnHeadList, rainChkSttn.rainChkgdnHeadList]); + return ( <> - <LoadingOverlay isLoading={rainChkgdn.isLoading}></LoadingOverlay> <Table variant="secondary"> - <TableHeader className="font-bold"> {headMakeprfmnc( headList?.headList, @@ -198,9 +197,9 @@ export default function RainChkgdTable({ </TableBody> </Table> <UiPageNations - total={pageCount} + total={rainChkData?.length ?? 0} cur={pageNation} - pageSize={rainPageSize} + pageSize={20} onPageChange={onPageChange} /> </> diff --git a/apps/wr/components/ui/table/chkgdTable/rswtChkgd/rswtChkgdTable.tsx b/apps/wr/components/ui/table/chkgdTable/rswtChkgd/rswtChkgdTable.tsx index e71238706..31891a595 100644 --- a/apps/wr/components/ui/table/chkgdTable/rswtChkgd/rswtChkgdTable.tsx +++ b/apps/wr/components/ui/table/chkgdTable/rswtChkgd/rswtChkgdTable.tsx @@ -2,10 +2,9 @@ import { headMakeprfmnc } from "@/app/ruseFcltMng/prfmncReg/chkgdnReg/TableHead"; import { useWrStore } from "@/app/store"; import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn/headList"; -import { - rswtPageSize, - type rswtChkZodType, - type rswtrChkDetailsZodType, +import type { + rswtChkZodType, + rswtrChkDetailsZodType, } from "@/app/store/prfmncReg/chkgdnReg/rswrtChkgdn"; import type { TableUpperProps } from "@/app/store/common/type/header"; import { tableData } from "@/components/lib/func/commom"; @@ -16,7 +15,6 @@ import { import { Table, TableBody, TableHeader } from "@common/components/ui"; import { useCallback, useEffect, useState } from "react"; import UiPageNations from "@common/business_components/ui/table/uiPageNations"; -import LoadingOverlay from "@common/business_components/ui/loadingBar"; export default function RswtChkgdTable({ detaiRswtlUpdate, @@ -25,7 +23,6 @@ export default function RswtChkgdTable({ rswtChkData, pageNation, onPageChange, - pageCount, }: { detaiRswtlUpdate: (data: rswtrChkDetailsZodType[]) => void; handleRswtClick?: (data: any) => void; @@ -33,7 +30,6 @@ export default function RswtChkgdTable({ rswtChkData: rswtChkZodType[]; pageNation: number; onPageChange: (page: number) => void; - pageCount: number; }) { const { code, rswtChkgdn, rswtChkSttn, rswtChkgdnInit, rswtChkPolAndGuide, getRswtSttnExcel } = useWrStore( (state) => state @@ -76,6 +72,7 @@ export default function RswtChkgdTable({ }, [rswtChkgdn.rswtChkPolGuide]); useEffect(() => { + console.log("makeTableData ", makeTableData) getRswtSttnExcel(makeTableData) const selectedData = makeTableData .map((item) => { @@ -136,7 +133,6 @@ export default function RswtChkgdTable({ return ( <> - <LoadingOverlay isLoading={rswtChkgdn.isLoading}></LoadingOverlay> <Table variant="secondary"> <TableHeader className="font-bold"> {headMakeprfmnc(headList?.headList, headList?.upHeadList)} @@ -154,9 +150,9 @@ export default function RswtChkgdTable({ </TableBody> </Table> <UiPageNations - total={pageCount} + total={rswtChkData?.length ?? 0} cur={pageNation} - pageSize={rswtPageSize} + pageSize={20} onPageChange={onPageChange} /> </> diff --git a/apps/wr/public/images/map/layericon/Layer_Select_BTN.png b/apps/wr/public/images/map/layericon/Layer_Select_BTN.png deleted file mode 100644 index 1e810feaf..000000000 Binary files a/apps/wr/public/images/map/layericon/Layer_Select_BTN.png and /dev/null differ diff --git a/packages/common/business_components/package.json b/packages/common/business_components/package.json index da6f8c344..2c0b6ea47 100644 --- a/packages/common/business_components/package.json +++ b/packages/common/business_components/package.json @@ -44,6 +44,7 @@ "recharts": "^2.15.1", "sonner": "^2.0.1", "tailwind-merge": "^3.0.1", + "tailwindcss-animate": "^1.0.7", "xlsx": "^0.18.5", "xlsx-populate": "^1.21.0", "zod": "^3.24.2" diff --git a/packages/common/business_components/src/ui/chart/BarChart.tsx b/packages/common/business_components/src/ui/chart/BarChart.tsx index 994feb3b3..0802a72e4 100644 --- a/packages/common/business_components/src/ui/chart/BarChart.tsx +++ b/packages/common/business_components/src/ui/chart/BarChart.tsx @@ -88,12 +88,12 @@ export default function Chart({chartConfig=undefined, chartData=[], chartTitle=' return ( <> {chartTitle && chartTitle !== "" && chartTitle !== "undefined" ? ( - <div className="!mt-3 text-[2.5rem] font-bold text-center"> + <div className="!mt-3 text-[2.5rem] font-bold"> {chartTitle} </div>): null} - <div className="flex justify-center h-full w-full"> - <ChartContainer config={chartConfig ?? {}} className={chartClassName + " !w-[88%]"}> - <BarChart accessibilityLayer data={chartData} margin={{ top: 5, right: 20, left: 30, bottom: 5 }}> + <div className="flex justify-center"> + <ChartContainer config={chartConfig ?? {}} className={chartClassName + " !w-[90%]"}> + <BarChart accessibilityLayer data={chartData}> <CartesianGrid vertical={false} /> <XAxis dataKey="label" @@ -110,13 +110,8 @@ export default function Chart({chartConfig=undefined, chartData=[], chartTitle=' axisLine={true} fontSize={12} fontWeight={500} - tickFormatter={(value) => { - // 소수점이 있는 경우 소수점을 유지하고 천단위 콤마 추가 - return value.toString().includes('.') - ? value.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 2 }) - : value.toLocaleString(); - }} - label={yFieldText ? { value: yFieldText, className:"text-[13px] font-bold", position: 'insideLeft', angle: -90, offset: -24, orientation: "left" } : undefined} + domain={[0, Math.ceil(barMaxValue * 1)]} + label={yFieldText ? { value: yFieldText, className:"text-[13px] font-bold", position: 'insideLeft', angle: -90, offset: 20 } : undefined} /> <ChartTooltip cursor={false} content={<CustomTooltip active={undefined} payload={undefined} label={undefined} />}/> {chartData && chartData.length > 0 && ( diff --git a/packages/common/business_components/src/ui/chart/DoubleBar.tsx b/packages/common/business_components/src/ui/chart/DoubleBar.tsx index b201b3bf9..9627485aa 100644 --- a/packages/common/business_components/src/ui/chart/DoubleBar.tsx +++ b/packages/common/business_components/src/ui/chart/DoubleBar.tsx @@ -7,7 +7,6 @@ import { } from "./lib/chart"; import type { CSSProperties } from "react"; -/* const customStyles = { legendContainer: { display: "flex", @@ -18,22 +17,6 @@ const customStyles = { marginTop: "10px", } as CSSProperties, }; -*/ - -const customStyles = { - legendContainer: { - display: "flex", - flexWrap: "wrap", - justifyContent: "center", - alignItems: "center", - gap: "12px", - fontSize: "13px", - fontWeight: "normal", - marginTop: "16px", - marginBottom: "8px", - minHeight: "32px", - } as CSSProperties, -}; type BarChartProps = { chartConfig: ChartConfig | undefined; @@ -77,7 +60,7 @@ const CustomTooltip = ({ }; // 커스텀 범례 (글씨 크기 키우기 + 스타일 추가) -/*const CustomLegend = (props: any) => { +const CustomLegend = (props: any) => { const { payload } = props; return ( <div style={customStyles.legendContainer}> @@ -89,38 +72,6 @@ const CustomTooltip = ({ ))} </div> ); -};*/ -const CustomLegend = (props: any) => { - const { payload } = props; - if (!payload) return null; - - return ( - <div style={customStyles.legendContainer}> - {payload.map((entry: any, index: number) => ( - <div - key={`legend-${index}`} - className="flex items-center" - style={{ - minWidth: "90px", - margin: "2px 0", - }} - > - <div - style={{ - width: "14px", - height: "14px", - backgroundColor: entry.color, - borderRadius: "3px", - marginRight: "8px", - minWidth: "14px", - minHeight: "14px", - }} - ></div> - <span style={{ fontSize: "13px", whiteSpace: "nowrap" }}>{entry.value}</span> - </div> - ))} - </div> - ); }; export default function DoubleBarChart({chartConfig=undefined, chartData=[], chartTitle='차트', chartClassName='w-full h-full', graphSize=40, yFieldText='', showLegend=false} : BarChartProps) { @@ -132,7 +83,7 @@ export default function DoubleBarChart({chartConfig=undefined, chartData=[], cha .map(key => item[key]) ).flat()); }; - + console.log(chartData); const barMaxValue = getMaxValue(chartData, 'barVal'); return ( <> diff --git a/packages/common/business_components/src/ui/chart/DoughnutChart.tsx b/packages/common/business_components/src/ui/chart/DoughnutChart.tsx index 99395267a..39dee3d9e 100644 --- a/packages/common/business_components/src/ui/chart/DoughnutChart.tsx +++ b/packages/common/business_components/src/ui/chart/DoughnutChart.tsx @@ -48,7 +48,6 @@ type LegendProps = { }; /** 차트 기본 스타일 */ -/* const customStyles = { legendContainer: { display: "flex", @@ -59,23 +58,6 @@ const customStyles = { marginTop: "10px", } as CSSProperties, }; -*/ - -/** 차트 기본 스타일 (라인차트와 동일하게) */ -const customStyles = { - legendContainer: { - display: "flex", - flexWrap: "wrap", // 여러 줄로 자동 줄바꿈 - justifyContent: "center", - alignItems: "center", - gap: "12px", // 아이템 간 간격 - fontSize: "13px", - fontWeight: "normal", - marginTop: "16px", - marginBottom: "8px", - minHeight: "32px", // 범례 영역 높이 통일 - } as CSSProperties, -}; // 커스텀 툴팁 const CustomTooltip = ({ active, payload, label }: { @@ -100,7 +82,6 @@ const CustomTooltip = ({ active, payload, label }: { }; // 커스텀 범례 -/* const CustomLegend = (props: LegendProps) => { const { payload } = props; if (!payload) return null; @@ -116,52 +97,12 @@ const CustomLegend = (props: LegendProps) => { </div> ); }; -*/ - -const CustomLegend = (props: LegendProps) => { - const { payload } = props; - if (!payload) return null; - - return ( - <div style={customStyles.legendContainer}> - {payload.map((entry: LegendEntry, index: number) => ( - <div - key={`legend-${index}`} - className="flex items-center" - style={{ - minWidth: "90px", - margin: "2px 0", - }} - > - <div - style={{ - width: "14px", - height: "14px", - backgroundColor: entry.fill, - borderRadius: "3px", - marginRight: "8px", - minWidth: "14px", - minHeight: "14px", - }} - ></div> - <span style={{ fontSize: "13px", whiteSpace: "nowrap" }}> - {entry.payload?.label || entry.value} - </span> - </div> - ))} - </div> - ); -}; export default function DoughnutChart(props: { chartConfig: any; chartData: ChartDataItem[] | undefined; chartTitle: string }) { - const legendData = props.chartData?.map(item => ({ - value: item.label, - fill: props.chartConfig?.[item.label]?.fill || 'blue', - })) ?? []; return ( <Card className="flex flex-col"> <CardContent className="flex-1 pb-0"> @@ -189,9 +130,9 @@ export default function DoughnutChart(props: { nameKey="label" innerRadius={60} /> + <CustomLegend /> </PieChart> </ChartContainer> - <CustomLegend payload={legendData} /> </div> </CardContent> </Card> diff --git a/packages/common/business_components/src/ui/chart/LineBarChart.tsx b/packages/common/business_components/src/ui/chart/LineBarChart.tsx index 11984cc14..8c7202104 100644 --- a/packages/common/business_components/src/ui/chart/LineBarChart.tsx +++ b/packages/common/business_components/src/ui/chart/LineBarChart.tsx @@ -127,7 +127,7 @@ export default function LineBarchart({ className="text-[12px] font-bold" tickCount={6} orientation="left" - tickFormatter={(value) => value.toLocaleString()} + domain={[0, Math.ceil(lineMaxValue * 1)]} label={{ value: yFieldText, angle: -90, position: 'insideLeft' }} />} {/* 오른쪽 Y축: barVal */} @@ -136,7 +136,7 @@ export default function LineBarchart({ className="text-[12px] font-bold" tickCount={6} orientation="right" - tickFormatter={(value) => value.toLocaleString()} + domain={[0, Math.ceil(barMaxValue * 1)]} label={{ value: yFieldText2, angle: -90, position: 'insideRight' }} reversed={true} />} diff --git a/packages/common/business_components/src/ui/chart/LineChart.tsx b/packages/common/business_components/src/ui/chart/LineChart.tsx index 6c1b6e7bd..4014702b6 100644 --- a/packages/common/business_components/src/ui/chart/LineChart.tsx +++ b/packages/common/business_components/src/ui/chart/LineChart.tsx @@ -18,7 +18,6 @@ type LineChartProps = { } /** 차트 기본 스타일 */ -/* const customStyles = { legendContainer: { display: "flex", @@ -29,23 +28,6 @@ const customStyles = { marginTop: "10px", } as CSSProperties, }; -*/ - -/** 차트 기본 스타일 */ -const customStyles = { - legendContainer: { - display: "flex", - flexWrap: "wrap", - justifyContent: "center", - alignItems: "center", - gap: "12px", - fontSize: "13px", - fontWeight: "normal", - marginTop: "16px", - marginBottom: "8px", - minHeight: "32px", - } as CSSProperties, -}; type LegendEntry = { value: string; @@ -78,7 +60,7 @@ const CustomTooltip = ({ active, payload, label }: { active?: boolean; payload?: }; // 커스텀 범례 (글씨 크기 키우기 + 스타일 추가) -/*const CustomLegend = (props: LegendProps) => { +const CustomLegend = (props: LegendProps) => { const { payload } = props; if (!payload) return null; @@ -92,40 +74,6 @@ const CustomTooltip = ({ active, payload, label }: { active?: boolean; payload?: ))} </div> ); -};*/ - -// 커스텀 범례 (도넛차트와 동일하게) -const CustomLegend = (props: LegendProps) => { - const { payload } = props; - if (!payload) return null; - - return ( - <div style={customStyles.legendContainer}> - {payload.map((entry: LegendEntry, index: number) => ( - <div - key={`legend-${index}`} - className="flex items-center" - style={{ - minWidth: "90px", - margin: "2px 0", - }} - > - <div - style={{ - width: "14px", - height: "14px", - backgroundColor: entry.color, - borderRadius: "3px", - marginRight: "8px", - minWidth: "14px", - minHeight: "14px", - }} - ></div> - <span style={{ fontSize: "13px", whiteSpace: "nowrap" }}>{entry.value}</span> - </div> - ))} - </div> - ); }; type DataType = {label: string; val: string}; @@ -193,7 +141,7 @@ export default function Linechart({ > <CartesianGrid vertical={false} /> <XAxis dataKey="label" fontSize="8px" fontWeight="bold" /> - <YAxis yAxisId="left" className="text-[12px] font-bold" tickFormatter={(value) => value.toLocaleString()} tickCount={6} orientation="left" label={{ value: yFieldText, className:"text-[12px] font-bold", angle: -90, position: 'insideLeft' }} /> + <YAxis yAxisId="left" className="text-[12px] font-bold" domain={[0, Math.ceil(lineMaxValue * 1.1)]} tickCount={6} orientation="left" label={{ value: yFieldText, className:"text-[12px] font-bold", angle: -90, position: 'insideLeft' }} /> <Tooltip content={<CustomTooltip />} /> {showLegend && <Legend content={CustomLegend as ContentType}/>} {Object.keys(chartData).map((key) => { diff --git a/packages/common/business_components/src/ui/date_month_picker/index.tsx b/packages/common/business_components/src/ui/date_month_picker/index.tsx index 1b97d9ce1..d318b561f 100644 --- a/packages/common/business_components/src/ui/date_month_picker/index.tsx +++ b/packages/common/business_components/src/ui/date_month_picker/index.tsx @@ -17,7 +17,6 @@ type MonthPickerProps = { field: { value: string; onChange: (date: string) => void }; // yyyyMM 문자열 selectClass?: string; readOnly?: boolean; - startYear?: number; // 시작 연도 props 추가 }; // yyyyMM → Date 객체 @@ -38,7 +37,6 @@ export const DateMonthPicker = ({ field, selectClass, readOnly = false, - startYear, }: MonthPickerProps) => { const [open, setOpen] = useState(false); @@ -77,7 +75,6 @@ export const DateMonthPicker = ({ <MonthPicker currentMonth={parsedDate} onMonthChange={handleSelect} - startYear={startYear} /> </PopoverContent> </Popover> diff --git a/packages/common/business_components/src/ui/date_month_picker/mothPicker.tsx b/packages/common/business_components/src/ui/date_month_picker/mothPicker.tsx index 2b64ab439..acf17fba4 100644 --- a/packages/common/business_components/src/ui/date_month_picker/mothPicker.tsx +++ b/packages/common/business_components/src/ui/date_month_picker/mothPicker.tsx @@ -28,41 +28,35 @@ export type MonthPickerProps = { newMonth: Date | undefined, shouldClosePopover?: boolean ) => void; - startYear?: number; }; -export function MonthPicker({ currentMonth, onMonthChange, startYear }: MonthPickerProps) { +export function MonthPicker({ currentMonth, onMonthChange }: MonthPickerProps) { const today = startOfToday(); - const currentYear = today.getFullYear(); +const currentYear = today.getFullYear(); const yearFromProp = format(currentMonth, "yyyy"); - const selectedYear = parseInt(yearFromProp); +const selectedYear = parseInt(yearFromProp); // 현재 월의 시작 날짜 const fullYearStart = parse(yearFromProp, "yyyy", new Date()); const yearEnd = selectedYear === currentYear ? today : endOfYear(fullYearStart); + + - - - // startYear가 없으면 기존과 동일하게 (현재년도 - 20년부터 현재년도까지) - // startYear가 있으면 해당 년도부터 현재년도까지, 내림차순으로 정렬 - const yearRange = startYear - ? Array.from({ length: currentYear - startYear + 1 }, (_, i) => currentYear - i) - : Array.from({ length: 21 }, (_, i) => currentYear - 20 + i); - + const yearRange = Array.from({ length: 21 }, (_, i) => currentYear - 20 + i); const months = eachMonthOfInterval({ start: fullYearStart, end: yearEnd }); const getMonthButtonClass = (month: Date) => cn( "inline-flex h-9 w-16 items-center justify-center rounded-md p-0 text-sm font-normal ring-offset-white transition-colors hover:bg-slate-100 hover:text-slate-900 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-slate-400 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 aria-selected:opacity-100 dark:ring-offset-slate-950 dark:hover:bg-slate-800 dark:hover:text-slate-50 dark:focus-visible:ring-slate-800", isEqual(month, currentMonth) && - "bg-slate-900 text-slate-50 hover:bg-slate-900 hover:text-slate-50 focus:bg-slate-900 focus:text-slate-50 dark:bg-slate-50 dark:text-slate-900 dark:hover:bg-slate-50 dark:hover:text-slate-900 dark:focus:bg-slate-50 dark:focus:text-slate-900", + "bg-slate-900 text-slate-50 hover:bg-slate-900 hover:text-slate-50 focus:bg-slate-900 focus:text-slate-50 dark:bg-slate-50 dark:text-slate-900 dark:hover:bg-slate-50 dark:hover:text-slate-900 dark:focus:bg-slate-50 dark:focus:text-slate-900", !isEqual(month, currentMonth) && - isEqual(month, getStartOfCurrentMonth()) && - "bg-slate-100 text-slate-900 dark:bg-slate-800 dark:text-slate-50" + isEqual(month, getStartOfCurrentMonth()) && + "bg-slate-100 text-slate-900 dark:bg-slate-800 dark:text-slate-50" ); return ( @@ -83,7 +77,7 @@ export function MonthPicker({ currentMonth, onMonthChange, startYear }: MonthPic onMonthChange(newDate, false); }} > - <SelectTrigger className="w-[140px] h-9 text-base"> + <SelectTrigger className="w-[120px] h-7"> <SelectValue placeholder="년도" /> </SelectTrigger> <SelectContent> @@ -118,7 +112,7 @@ export function MonthPicker({ currentMonth, onMonthChange, startYear }: MonthPic onClick={() => onMonthChange(month, true)} > <time dateTime={format(month, "yyyy-MM-dd")}> - {format(month, 'MMM', { locale: ko })} + {format(month, 'MMM', { locale: ko })} </time> </button> </div> diff --git a/packages/common/business_components/src/ui/dialog_ui/index.tsx b/packages/common/business_components/src/ui/dialog_ui/index.tsx index df7fffd3a..bbb27d327 100644 --- a/packages/common/business_components/src/ui/dialog_ui/index.tsx +++ b/packages/common/business_components/src/ui/dialog_ui/index.tsx @@ -1,7 +1,7 @@ import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader } from "@common/components"; import { cn } from "../../lib/utils"; -type ModalType = { +type ModalType = { bodyClass: string; body: React.ReactNode; open?: boolean; @@ -10,45 +10,43 @@ type ModalType = { noFooterYn?: 'N' | 'Y'; headerTitle?: string; footerContent?: React.ReactNode; - useDirectRender?: boolean; } -export function UiModal({ - bodyClass, - body, - open, +export function UiModal({ + bodyClass, + body, + open, onOpenChange, noHeaderYn = 'N', noFooterYn = 'N', headerTitle, - footerContent, - useDirectRender = false + footerContent }: ModalType) { - + return ( <> - <Dialog open={open} onOpenChange={onOpenChange}> + <Dialog open={open} onOpenChange={onOpenChange}> <DialogContent className={bodyClass}> - {noHeaderYn === 'N' && ( - <DialogHeader> - <DialogDescription> - {headerTitle} - </DialogDescription> - </DialogHeader> - )} - {(open && body) ? - useDirectRender - ? body - : <div>{body}</div> - : <></> - } - {noFooterYn === 'N' && ( - <DialogFooter className="sm:justify-start"> - {footerContent} - </DialogFooter> - )} - </DialogContent> - </Dialog> + {noHeaderYn === 'N' && ( + <DialogHeader> + <DialogDescription> + {headerTitle} + </DialogDescription> + </DialogHeader> + )} + {(open && body) ? + <div> {body}</div>:<></> + + + + } + {noFooterYn === 'N' && ( + <DialogFooter className="sm:justify-start"> + {footerContent} + </DialogFooter> + )} + </DialogContent> + </Dialog> </> ); } diff --git a/packages/common/business_components/src/ui/index.ts b/packages/common/business_components/src/ui/index.ts index 06c641259..fd1e6fe9e 100644 --- a/packages/common/business_components/src/ui/index.ts +++ b/packages/common/business_components/src/ui/index.ts @@ -21,5 +21,4 @@ export * from "./table_div"; export * from "./title"; export * from "./sdmInsertForm"; export * from "./popover_ui"; -export * from "./date_month_picker"; -export * from "./loadingBar"; \ No newline at end of file +export * from "./date_month_picker"; \ No newline at end of file diff --git a/packages/common/business_components/src/ui/loadingBar/index.tsx b/packages/common/business_components/src/ui/loadingBar/index.tsx deleted file mode 100644 index 37991d1d2..000000000 --- a/packages/common/business_components/src/ui/loadingBar/index.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react'; -import { LoadingWithAnimation } from '@common/components/ui/loading'; - -interface LoadingOverlayProps { - isLoading: boolean; -} - -const LoadingOverlay: React.FC<LoadingOverlayProps> = ({ isLoading }) => { - if (!isLoading) return null; - - return ( - <div className="fixed inset-0 flex items-center justify-center bg-black bg-opacity-50 z-50"> - <div className="relative w-16 h-16"> - <LoadingWithAnimation color="primary" /> - </div> - </div> - ); -}; - -export default LoadingOverlay; \ No newline at end of file diff --git a/packages/common/business_components/src/ui/map/Gis.js b/packages/common/business_components/src/ui/map/Gis.js index 977f21b2b..6e13d70c5 100644 --- a/packages/common/business_components/src/ui/map/Gis.js +++ b/packages/common/business_components/src/ui/map/Gis.js @@ -1,6 +1,5 @@ import { Search } from 'lucide-react'; import OlMap from 'ol/Map'; -import Overlay from 'ol/Overlay'; import View from 'ol/View'; import { defaults as defaultControls, OverviewMap } from 'ol/control'; import { defaults } from 'ol/interaction'; @@ -8,7 +7,6 @@ import * as olProj from 'ol/proj'; import { register } from 'ol/proj/proj4'; import proj4 from 'proj4'; import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'; -import { createRoot } from 'react-dom/client'; import GisLonLat from './GisLonLat'; import GisMapToggle from './GisMapToggle'; import GisSelect from './GisSelect'; @@ -16,27 +14,11 @@ import GisToolBar from './GisToolBar'; import GisTree from './GisTree'; import './lib/css/gis.common.css'; import GisApp from './lib/gis.core'; -// import FacilityInfoPopup from './FacilityInfoPopup'; export const GisContext = createContext({ gisCore: null, gisMap: null, treeData: null, checkedLayerIds: null }); export const useGisContext = () => useContext(GisContext); -function Gis({ - isOpen, - gisMaps, - isSearchModalOpen, - treeData = [], - isSearch = false, - isMiniMap = false, - setIsOpen, - setFeatureData, - featureData, - searchView: SearchView, - detailView: DetailView, - onFeatureSelect, - setIsSearchModalOpen, - onCheckedLayersChange -}) { +function Gis({ isOpen, gisMaps, isSearchModalOpen, treeData = [], isSearch = false, isMiniMap = false, setIsOpen, setFeatureData, featureData, searchView: SearchView, detailView: DetailView, onFeatureSelect, setIsSearchModalOpen }) { const mapRef = useRef(); const [mapObject, setMapObject] = useState({}); const [tabVisible, setTabVisible] = useState(true); @@ -46,21 +28,13 @@ function Gis({ const gisCore = useMemo(() => new GisApp.core({ targetId: mapRef.current }), []); const mapInstanceRef = useRef(null); const checkedLayerIds = useRef([]); - - // 팝업 데이터를 저장할 상태와 오버레이 참조를 저장할 ref 추가 - // const [facilityInfoPopupData, setFacilityInfoPopupData] = useState([]); - // const facilityOverlaysRef = useRef([]); - // 체크된 레이어 상태 관리 - const [checkedLayers, setCheckedLayers] = useState([]); - const [checkedLayersData, setCheckedLayersData] = useState([]); - let gisMap = null; const closePopup = () => { setIsOpen(false); // 팝업 닫기 setFeatureData(null) }; - // Feature Click Event + // SearchModal, GisContent 등에서 호출 const handleFeatureSelect = useCallback((data) => { gisMap = mapInstanceRef.current; @@ -115,10 +89,8 @@ function Gis({ setFeatureData(data); setIsOpen(true); setIsSearchModalOpen(false); - onFeatureSelect?.(data); // 선택된 피쳐 데이터 콜백 호출 }, [mapInstanceRef]); - // 지도 생성 및 초기화 useEffect(() => { if (!mapRef.current) return; if (mapInstanceRef.current) return; // 이미 생성된 맵이 있다면 중단 @@ -132,7 +104,7 @@ function Gis({ ]); register(proj4); - // OpenLayers 지도 객체 생성 + //맵 생성 const map = new OlMap({ layers: [gisCore.baseLayers['base'], gisCore.baseLayers['satellite']], renderer: 'webgl', @@ -160,7 +132,7 @@ function Gis({ gisMaps.current = map - // 미니맵 추가 + //미니맵 if (isMiniMap) { const overviewMap = new OverviewMap({ layers: [GisApp.Module.core.baseMiniMapLayers['base']], @@ -175,7 +147,6 @@ function Gis({ map.addControl(overviewMap); } - // 스케일 컨트롤 및 베이스 레이어 설정 gisCore.__proto__.map = map; gisCore.scaleControl(); gisCore.changeBaseLayer('base'); @@ -183,20 +154,16 @@ function Gis({ mapInstanceRef.current = map; // 생성 완료 플래그 설정 }, []); - // treeData 변경 시 레이어 코드 생성 useEffect(() => { if (!treeData || treeData.length === 0) return; - // 기존 오버레이 및 레이어 모두 삭제 gisCore.deleteAllOverlay(); gisCore.deleteAllLayer(); - // 트리 데이터를 레이어 코드 객체로 변환 const layerCode = gisCore.convertLayerInfosToLayerCode(treeData, 'lyrSn'); - GisApp.layerCode = layerCode; // 전역 레이어 코드 설정 + GisApp.layerCode = layerCode; //setTreeData(data); - // 편집 가능한 레이어 목록 생성 const layerItems = getLayerItems(layerCode); //setEditLayerItems(prev => [...layerItems]) }, [treeData]); @@ -226,161 +193,33 @@ function Gis({ } } - // // 데이터 로드 및 팝업 생성 로직 - // useEffect(() => { - // if (!mapInstanceRef.current) return; // 맵이 생성되지 않았으면 실행 안 함 - - // // 1. 팝업 데이터 가져오기 (feature.js의 getData와 유사) - // const fetchPopupData = async () => { - // // 실제 API 호출 로직으로 대체해야 합니다. - // // 예시: const response = await yourApiService.getFcltyWtCnt(); - // // setFacilityInfoPopupData(response.data); - - // // 임시 목업 데이터 - // const mockData = [ - // { ftrIdn: 1, ftrCde: 'SA206', bplcNm: '처리장A', fcltyUseYn: 'Y', x: 127.005, y: 37.282, aCnt: 10, cCnt: 5, eCnt: 3, mCnt: 8, iCnt: 2 }, - // { ftrIdn: 2, ftrCde: 'SA112', bplcNm: '처리장B', fcltyUseYn: 'N', x: 127.010, y: 37.285, aCnt: 8, cCnt: 4, eCnt: 2, mCnt: 6, iCnt: 1 } - // ]; - // setFacilityInfoPopupData(mockData); - // }; - - // fetchPopupData(); - - // }, [mapInstanceRef.current]); // 맵 인스턴스가 생성된 후 한 번만 실행 - - // // 데이터가 변경되면 오버레이를 생성/업데이트하는 로직 - // useEffect(() => { - // const map = mapInstanceRef.current; - // if (!map || facilityInfoPopupData.length === 0) return; - - // // 기존 오버레이 정리 - // facilityOverlaysRef.current.forEach(overlay => map.removeOverlay(overlay)); - // facilityOverlaysRef.current = []; - - // facilityInfoPopupData.forEach(data => { - // const popupId = `${data.ftrIdn}_${data.ftrCde}`; - - // // 팝업을 담을 div 엘리먼트 생성 - // const popupElement = document.createElement('div'); - // popupElement.id = popupId; - - // // OpenLayers Overlay 생성 - // const position = olProj.transform([Number(data.x), Number(data.y)], GisApp.FROM_PROJ, GisApp.TO_PROJ); - // const overlay = new Overlay({ - // element: popupElement, - // position: position, - // offset: [-75, -210], // 팝업 너비의 절반, 높이만큼 오프셋 조정 - // positioning: 'bottom-center', - // className: 'facility-popup-overlay' // 필요시 공통 클래스 추가 - // }); - - // map.addOverlay(overlay); - // facilityOverlaysRef.current.push(overlay); - - // // React 컴포넌트를 popupElement에 렌더링 - // const root = createRoot(popupElement); - // root.render(<FacilityInfoPopup data={data} />); - // }); - - // // 초기 가시성 업데이트 - // updatePopupVisibility(); - - // }, [facilityInfoPopupData]); // 팝업 데이터가 변경될 때마다 실행 - - // // 레이어 가시성에 따라 팝업 가시성을 제어하는 함수 - // const updatePopupVisibility = useCallback(() => { - // const map = mapInstanceRef.current; - // if (!map) return; - - // const visibleLayers = new Set(); - // map.getLayers().forEach(layer => { - // if (layer.getVisible()) { - // // feature.js의 로직처럼 typeName이나 ftrCde를 사용해 필터링 - // const typeName = layer.get('typeName'); - // if (typeName === 'VW_WTL_FCLTY_AS') { // 예시 레이어 이름 - // visibleLayers.add(layer.get('ftrCde')); - // } - // } - // }); - - // facilityOverlaysRef.current.forEach(overlay => { - // const element = overlay.getElement(); - // const ftrCde = element.querySelector('table')?.classList[0]; // FacilityPopup의 클래스에서 ftrCde 가져오기 - - // if (visibleLayers.has(ftrCde)) { - // element.style.display = ''; - // } else { - // element.style.display = 'none'; - // } - // }); - // }, []); - - // GisTree에서 체크 상태가 변경될 때 이 함수를 호출하도록 연결해야 합니다. - // 예시: GisTree 컴포넌트에 onCheck 콜백을 추가하고, 그 콜백에서 이 함수를 호출 - // useEffect(() => { - // // 레이어 가시성이 변경될 때마다 팝업 가시성 업데이트 - // const map = mapInstanceRef.current; - // if (!map) return; - - // const handleLayerVisibilityChange = () => { - // updatePopupVisibility(); - // }; - - // map.getLayers().on('change:length', handleLayerVisibilityChange); - // map.getLayers().forEach(layer => { - // layer.on('change:visible', handleLayerVisibilityChange); - // }); - - // return () => { - // // 클린업 - // map.getLayers().un('change:length', handleLayerVisibilityChange); - // map.getLayers().forEach(layer => { - // layer.un('change:visible', handleLayerVisibilityChange); - // }); - // }; - // }, [updatePopupVisibility]); - - // 체크된 레이어 정보를 처리하는 함수 - const handleCheckedLayersChange = useCallback((checkedIds, checkedNodesData) => { - setTimeout(() => { - setCheckedLayers(checkedIds); - setCheckedLayersData(checkedNodesData); - onCheckedLayersChange?.(checkedIds, checkedNodesData); - }, 0); - }, [onCheckedLayersChange]); - return ( <> <GisContext.Provider value={{ gisCore, gisMap: mapInstanceRef.current, treeData, checkedLayerIds }}> <div className="h-[calc(100vh-10rem)] flex relative"> <div ref={mapRef} className="gis-map flex-1 relative" style={{ height: '100%', padding: 0 }} /> - <GisTree - visible={tabVisible} - setVisible={setTabVisible} - onCheckedChange={handleCheckedLayersChange} - /> + <GisTree visible={tabVisible} setVisible={setTabVisible} /> {/* <GisContent onFeatureSelect={handleFeatureSelect} isSearch={isSearch} isSearchModalOpen={isSearchModalOpen} setIsSearchModalOpen={setIsSearchModalOpen} /> */} - {/* DetailView가 존재할 때만 렌더링 isSearchModalOpen이 true면 visible=false로 팝업 숨김 */} + {/* isSearchModalOpen이 true면 visible=false로 팝업 숨김 */} {isOpen && featureData && !isSearchModalOpen && ( <DetailView featureData={featureData} onClose={closePopup} // 닫기 콜백 전달 /> )} - {/* SearchView가 존재할 때만 렌더링 */} - {SearchView && ( - <SearchView - open={isSearchModalOpen} - onOpenChange={setIsSearchModalOpen} - onFeatureSelect={handleFeatureSelect} - /> - )} + {SearchView &&( + <SearchView + open={isSearchModalOpen} + onOpenChange={setIsSearchModalOpen} + onFeatureSelect={onFeatureSelect} + /> + )} <GisLonLat /> <GisToolBar /> <GisMapToggle /> - <GisSelect onFeatureSelect={handleFeatureSelect} /> + <GisSelect onFeatureSelect={onFeatureSelect} /> </div> {isSearch && ( diff --git a/packages/common/business_components/src/ui/map/GisTree.js b/packages/common/business_components/src/ui/map/GisTree.js index 200e9d988..3c2cb2819 100644 --- a/packages/common/business_components/src/ui/map/GisTree.js +++ b/packages/common/business_components/src/ui/map/GisTree.js @@ -187,7 +187,7 @@ export default React.memo(function GisTree({ checkedNodes = [], setCheckedNodes image.src = canvas.toDataURL('image/png'); return image; }; - + if (!treeData || treeData.length === 0) return null; return ( @@ -220,7 +220,6 @@ export default React.memo(function GisTree({ checkedNodes = [], setCheckedNodes <input type="checkbox" checked={checked.includes(node.id)} onChange={() => handleCheck(node.id)} className="cursor-pointer" /> {node.icon && <span>{node.icon}</span>} <span className="text-[1.3rem] font-medium text-label">{node.text}</span> - {depth > 0 && <span><img className="cursor-pointer w-5 h-5" src='/images/map/layericon/Layer_Select_BTN.png' onClick={()=>{}} alt={node.text}></img></span>} </div> )} sort={(a, b) => { diff --git a/packages/common/business_components/src/ui/search_form_left/index.tsx b/packages/common/business_components/src/ui/search_form_left/index.tsx index d0da2cd1a..e7858df2a 100644 --- a/packages/common/business_components/src/ui/search_form_left/index.tsx +++ b/packages/common/business_components/src/ui/search_form_left/index.tsx @@ -301,7 +301,7 @@ function SearchFormLeft({ isShowPart = false, children, selectSidoData = [], sel resetAllValues(); // 리셋 후 트리거를 false로 설정 if (setRtnPartValue) { - setRtnPartValue('A'); + setRtnPartValue('0'); } } }, [resetTrigger]); diff --git a/packages/common/business_components/src/ui/table/index-2.tsx b/packages/common/business_components/src/ui/table/index-2.tsx index 5961ea396..b6a9750b0 100644 --- a/packages/common/business_components/src/ui/table/index-2.tsx +++ b/packages/common/business_components/src/ui/table/index-2.tsx @@ -110,7 +110,9 @@ export function UiTable2({ ? 'text-right' : head.align === 'center' ? 'text-center' - : 'text-center' + : typeof el[head.id] === 'number' + ? 'text-right' + : 'text-center' } ${cellClick && idx === index ? '!font-[1000] cursor-pointer' : cellClick ? 'cursor-pointer' : ''} diff --git a/packages/common/business_components/src/ui/table/index.tsx b/packages/common/business_components/src/ui/table/index.tsx index bb90153c2..cd25bc8db 100644 --- a/packages/common/business_components/src/ui/table/index.tsx +++ b/packages/common/business_components/src/ui/table/index.tsx @@ -82,7 +82,7 @@ export function UiTable({ tableData, headlist, pageSize, total, headName, childr boldArray.includes(index) ? <TableCell - className={`${head.align === 'right' ? 'text-right' : head.align === 'center' ? 'text-center' : 'text-center'} ${ + className={`${head.align === 'right' ? 'text-right' : head.align === 'center' ? 'text-center' : typeof el[head.id] === 'number' ? 'text-right' : 'text-center'} ${ cellClick && idx === index ? '!font-[1000] cursor-pointer' : cellClick ? 'cursor-pointer' : '' } !font-bold`} @@ -97,7 +97,7 @@ export function UiTable({ tableData, headlist, pageSize, total, headName, childr </TableCell> : <TableCell - className={`${head.align === 'right' ? 'text-right' : head.align === 'center' ? 'text-center' : 'text-center'} ${ + className={`${head.align === 'right' ? 'text-right' : head.align === 'center' ? 'text-center' : typeof el[head.id] === 'number' ? 'text-right' : 'text-center'} ${ cellClick && idx === index ? '!font-[1000] cursor-pointer' : cellClick ? 'cursor-pointer' : '' }`} diff --git a/packages/common/business_components/src/ui/table/uiPageNations.tsx b/packages/common/business_components/src/ui/table/uiPageNations.tsx index a4ee3b4fc..891fc4c81 100644 --- a/packages/common/business_components/src/ui/table/uiPageNations.tsx +++ b/packages/common/business_components/src/ui/table/uiPageNations.tsx @@ -40,8 +40,7 @@ export default function UiPageNations(commonPageNationsProps: CommonPageNationsP <PaginationItem> <PaginationPrevious href="#" - onClick={(e) => { - e.preventDefault(); + onClick={() => { if (startPage > 1) handlePageChange(startPage - 1); }} /> @@ -54,7 +53,7 @@ export default function UiPageNations(commonPageNationsProps: CommonPageNationsP <PaginationLink href="#" isActive={pageNum === pageProps.cur} - onClick={(e) => {e.preventDefault(); handlePageChange(pageNum)}} + onClick={() => handlePageChange(pageNum)} > {pageNum} </PaginationLink> @@ -66,8 +65,7 @@ export default function UiPageNations(commonPageNationsProps: CommonPageNationsP <PaginationItem> <PaginationNext href="#" - onClick={(e) => { - e.preventDefault(); + onClick={() => { if (endPage < totalPages) handlePageChange(endPage + 1); }} />