diff --git a/apps/wr/app/page.tsx b/apps/wr/app/page.tsx index 2140a7eb6..9b2a51d7d 100644 --- a/apps/wr/app/page.tsx +++ b/apps/wr/app/page.tsx @@ -62,6 +62,13 @@ export default function Home() { +
+ +
diff --git a/apps/wr/app/ruseFcltMng/fcltReg/htdflReg/page.tsx b/apps/wr/app/ruseFcltMng/fcltReg/htdflReg/page.tsx index c92eb8bd3..233d2ed53 100644 --- a/apps/wr/app/ruseFcltMng/fcltReg/htdflReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltReg/htdflReg/page.tsx @@ -17,7 +17,7 @@ import { headMakeColSpan } from "../rainReg/page"; import ListDiv from "@common/business_components/ui/list_div"; import { useEffect, useState } from "react"; import { tableData } from "@/components/lib/func/commom"; -import { HtdflRegForm } from "@/components/ui/form/fcltReg/htdflReg/htdflRegForm"; +import HtdflRegForm from "@/components/ui/form/fcltReg/htdflReg/htdflRegForm"; import type { chgBuilding } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import BdstChgModal from "@/components/ui/modal/bdstChgModal/bdstChgModal"; import { BdstReg } from "@/components/ui/modal/bdstRegModal/bdstRegModal"; @@ -89,13 +89,15 @@ export default function Home() { /> - +
+ +
diff --git a/apps/wr/app/ruseFcltMng/fcltReg/pbnstReg/page.tsx b/apps/wr/app/ruseFcltMng/fcltReg/pbnstReg/page.tsx index 1db6b224b..72c1338c7 100644 --- a/apps/wr/app/ruseFcltMng/fcltReg/pbnstReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltReg/pbnstReg/page.tsx @@ -1,50 +1,62 @@ "use client"; import { + ContentsDiv, ScrollArea, SearchDiv, + SearchFormLeft, + SearchFormRight, + SearchInput, SelectBox, + Title, UiTable, } from "@common/business_components"; -import { Button } from "@common/components"; +import { Button, Input } from "@common/components"; import { useWrStore } from "../../../store"; import { PbnstBuseForm } from "@/components/ui/form/fcltReg/pbnstReg/buseReg/component"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "@common/components"; -import { PbnstMngForm} from "@/components/ui/form/fcltReg/pbnstReg/mngReg/component"; +import { PbnstMngForm } from "@/components/ui/form/fcltReg/pbnstReg/mngReg/component"; import { useEffect, useState } from "react"; -import type { ruseFcltType } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg"; - +import type { customPbnst, ruseFcltType } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg"; +import ListDiv from "@common/business_components/ui/list_div"; +import { tableData } from "@/components/lib/func/commom"; export default function PublicReuseFaciltyInsert() { - const { pubFac , pubMng,mngMainValue} = useWrStore((state) => state); - const { pubFacHeadList, publicReuseFacilityData } = pubFac; - const { ruseFclt } = pubMng; + const { code, pubFac, pubHasuInit } = useWrStore((state) => state); + const { pubFacHeadList } = pubFac; - const [currentTab, setCurrentTab] = useState('mng'); + + const {pbnstReg} = pubFac + const [currentTab, setCurrentTab] = useState("mng"); const [fcltMng, setFcltMng] = useState(); + const [searchTxt, setSearchTxt] = useState(); + const [bdstTable, setbdstTable] = useState(); + + +useEffect(() => { + if (!pubFac.isInit) { + pubHasuInit(undefined); + } + }, [pubFac.isInit, pubHasuInit]); + + +useEffect(() => { + if (code.sggCd.length > 0) { + console.log("pbnstReg ", pbnstReg) + console.log( " wd ", tableData(pbnstReg, { code })) + setbdstTable(tableData(pbnstReg, { code })); + } + }, [code, pbnstReg]); + - const searchDiv = "하수재이용시설 "; - const selectBox = [ - { text: "서울하수처리시설", val: "1_hasu" }, - { text: "서울1하수처리시설", val: "2_hasu" }, - { text: "서울2하수처리시설", val: "3_hasu" }, - ]; - const headName = () => { - return

○공공 하수처리시설 등록

; - }; const onSelectValue = (val: string) => { console.log(val); }; const cellClick = (val: number | undefined) => { if (val === undefined) return; - let data; - if (publicReuseFacilityData[val]) { - data = ruseFclt.filter( - (item) => item.swtrmtFcltFk === publicReuseFacilityData[val]?.swtrmtFcltFk - ); - setFcltMng(data); - } + + setFcltMng([]); }; -const resetContents = () => { + const resetContents = () => { setFcltMng([]); // 빈 배열로 설정하여 신규 모드로 전환 }; @@ -54,67 +66,69 @@ const resetContents = () => { return ( <> -
-
-

하수재이용시설 등록

-
+ +
+
+ <SearchDiv> - <div className="w-4/5 grid grid-cols-12 gap-1 mx-4"> - <SelectBox - className="col-span-4" - label={searchDiv} - selectArray={selectBox} - onSelectValue={onSelectValue} - selectClass={undefined} + <SearchFormLeft> + + <SearchInput + className="col-span-3 my-7" + label="건물명" + textValue={searchTxt || ""} + setText={(e) => { + setSearchTxt(e); + }} /> - </div> - <div className="w-1/5 flex items-center justify-end"> + </SearchFormLeft> + <SearchFormRight> <Button className="mr-16 rounded-lg">조회</Button> - </div> + </SearchFormRight> </SearchDiv> </div> </div> - <div className="col-span-1 pl-11 max-h-full"> - <UiTable - tableData={publicReuseFacilityData} - headlist={pubFacHeadList} - pageSize={100} - total={10} - headName={headName()} - children={undefined} cellClick={cellClick} /> - </div> - <div className="col-span-1 pr-6 max-h-full overflow-y-scroll"> - - - <Tabs defaultValue="mng" onValueChange={handleTabChange}> - <div className="flex justify-between items-center"> - <TabsList> - <TabsTrigger value="mng">시설정보</TabsTrigger> - <TabsTrigger value="buse">차수별정보</TabsTrigger> - </TabsList> - <Button className="rounded-lg" onClick={resetContents}> - 신규등록 - </Button> - </div> - <TabsContent className="max-h-full" value="mng"> - <ScrollArea> - <PbnstMngForm - data={fcltMng || []} - /> + <div className="grid grid-cols-6 gap-4"> + <div className="col-span-4"> + <ScrollArea className="h-[60vh] rounded-md border p-2"> + <div className="min-h-[300px]"> + <UiTable + tableData={bdstTable || []} + headlist={pubFacHeadList} + pageSize={100} + total={10} + headName={"공공 하수처리시설 등록"} + cellClick={cellClick} + onPageChange={(page: number) => { } } children={undefined} /> + </div> </ScrollArea> - </TabsContent> - <TabsContent value="buse"> - <ScrollArea> - <PbnstBuseForm /> - </ScrollArea> - - </TabsContent> - </Tabs> - - + </div> + <ListDiv className="col-span-2 pr-6 max-h-full overflow-y-scrolh1l"> + <ScrollArea className="h-[60vh]"> + <Tabs defaultValue="mng" onValueChange={handleTabChange}> + <div className="flex justify-between items-center"> + <TabsList> + <TabsTrigger value="mng">시설정보</TabsTrigger> + <TabsTrigger value="buse">차수별정보</TabsTrigger> + </TabsList> + <Button className="rounded-lg" onClick={resetContents}> + 신규등록 + </Button> + </div> + <TabsContent className="max-h-full" value="mng"> + <PbnstMngForm data={fcltMng || []} /> + </TabsContent> + <TabsContent className="max-h-full" value="buse"> + <PbnstBuseForm /> + </TabsContent> + </Tabs> + </ScrollArea> + </ListDiv> </div> - </div> + </ContentsDiv> </> ); } + + diff --git a/apps/wr/app/ruseFcltMng/fcltReg/rainReg/page.tsx b/apps/wr/app/ruseFcltMng/fcltReg/rainReg/page.tsx index df5d2c285..1434481be 100644 --- a/apps/wr/app/ruseFcltMng/fcltReg/rainReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltReg/rainReg/page.tsx @@ -6,7 +6,7 @@ import type { TableUpperProps, } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { tableData } from "@/components/lib/func/commom"; -import { RainRegForm } from "@/components/ui/form/fcltReg/rainReg/rainRegForm"; +import RainRegForm from "@/components/ui/form/fcltReg/rainReg/rainRegForm"; import BdstChgModal from "@/components/ui/modal/bdstChgModal/bdstChgModal"; import { BdstReg } from "@/components/ui/modal/bdstRegModal/bdstRegModal"; import { @@ -123,9 +123,11 @@ export default function Home() { }} /> </SearchFormLeft> - <SearchFormRight> + <SearchFormRight > + <div className="flex flex-row space-x-2"> <Button - className="mr-4 rounded-lg" + className="" + size={"sm"} onClick={(e) => { init(searchTxt || ""); }} @@ -133,11 +135,13 @@ export default function Home() { 조회 </Button> <Button - className="mr-4 rounded-lg" + size={"sm"} + className="" onClick={() => setIsNewReg(!issNewReg)} > 신규등록 </Button> + </div> </SearchFormRight> </SearchDiv> </div> diff --git a/apps/wr/app/ruseFcltMng/fcltReg/rswtReg/page.tsx b/apps/wr/app/ruseFcltMng/fcltReg/rswtReg/page.tsx index 8864989d3..bf15631d9 100644 --- a/apps/wr/app/ruseFcltMng/fcltReg/rswtReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltReg/rswtReg/page.tsx @@ -18,7 +18,7 @@ import { headMakeColSpan } from "../rainReg/page"; import { useEffect, useState } from "react"; import type { customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg"; import { tableData } from "@/components/lib/func/commom"; -import { RswtrRegForm } from "@/components/ui/form/fcltReg/rswtrReg/RswtrRegForm"; +import RswtrRegForm from "@/components/ui/form/fcltReg/rswtrReg/rswtrRegForm"; import BdstChgModal from "@/components/ui/modal/bdstChgModal/bdstChgModal"; import type { chgBuilding } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; @@ -88,8 +88,10 @@ export default function Home() { /> </SearchFormLeft> <SearchFormRight> + <div className="flex flex-row space-x-2"> <Button - className="mr-4 rounded-lg" + size={"sm"} + className="mr-4 " onClick={(e) => { initRswt(searchTxt || ""); }} @@ -97,11 +99,13 @@ export default function Home() { 조회 </Button> <Button - className="mr-4 rounded-lg" + size={"sm"} + className="mr-4" onClick={() => setIsNewReg(!issNewReg)} > 신규등록 </Button> + </div> </SearchFormRight> </SearchDiv> </div> diff --git a/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx b/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx index 1e11470a0..b7f47f0ca 100644 --- a/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx +++ b/apps/wr/app/ruseFcltMng/fcltSttn/pbnstSttn/page.tsx @@ -17,11 +17,10 @@ import HeadChModal from "@/components/ui/modal/headChModal/headChModal"; import { useState } from "react"; export default function PbnstSttn() { - const { code,pbnStt } = useWrStore((state) => state); - + const { code, sttnCommon } = useWrStore((state) => state); const [isChHead, setIsChHead] = useState(false); - const nodeList = headMakeprfmnc(pbnStt.pbnSttHeadList, pbnStt.pbnSttHeadNm); + const nodeList = headMakeprfmnc(sttnCommon.pbnSttHeadList, sttnCommon.pbnSttHeadNm); return ( <> @@ -81,17 +80,29 @@ export default function PbnstSttn() { /> </SearchFormLeft> <SearchFormRight> - <Button className="mr-4 rounded-lg" onClick={(e) => {}}> - 조회 - </Button> - <Button className="mr-4 rounded-lg" onClick={() => {}}> - 다운로드 - </Button> - <Button className="mr-4 rounded-lg" onClick={() => { - // setIsChHead(true) - }}> - 조회항목설정 - </Button> + <div className="space-y"> + {/* 첫 줄: 버튼 3개 */} + <div className="flex flex-row space-x-2"> + <Button size={"sm"} onClick={(e) => {}}> + 조회 + </Button> + <Button size={"sm"} onClick={() => {}}> + 다운로드 + </Button> + </div> + <div className="flex flex-row space-x-2 pt-3"> + + <Button + size={"sm"} + color="green" + onClick={() => { + setIsChHead(true); + }} + > + 조회항목설정 + </Button> + </div> + </div> </SearchFormRight> </SearchDiv> </div> @@ -102,7 +113,7 @@ export default function PbnstSttn() { <UiTable headName={undefined} tableData={[]} - headlist={pbnStt.pbnSttHeadList} + headlist={sttnCommon.pbnSttHeadList} pageSize={0} total={0} cellClick={undefined} @@ -115,13 +126,14 @@ export default function PbnstSttn() { </ListDiv> </div> </div> - <UiModal open ={isChHead} onOpenChange ={()=>{setIsChHead(!isChHead)}} bodyClass={""} body={<HeadChModal/>}/> - - - - - - + <UiModal + open={isChHead} + onOpenChange={() => { + setIsChHead(!isChHead); + }} + bodyClass={""} + body={<HeadChModal />} + /> </ContentsDiv> </> ); diff --git a/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx b/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx new file mode 100644 index 000000000..a938eef88 --- /dev/null +++ b/apps/wr/app/ruseFcltMng/fcltSttn/rainSttn/page.tsx @@ -0,0 +1,247 @@ +"use client"; +import { useWrStore } from "@/app/store"; +import { + ContentsDiv, + SearchDiv, + SearchFormLeft, + SearchFormRight, + SelectBox, + Title, + UiModal, + UiTable, +} from "@common/business_components/ui"; +import ListDiv from "@common/business_components/ui/list_div"; +import { Button, TableHead, TableRow } from "@common/components/ui"; +import { useEffect, useState } from "react"; +import type { + TableTripleProps, +} from "@/app/store/ruseFcltMng/fcltReg/rainReg"; +import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; +import { tableData } from "@/components/lib/func/commom"; +import HeadChModal from "@/components/ui/modal/headChModal/headChModal"; + + +export const headMakeTriple = ( + upHeadList: TableTripleProps[], + makeHeadNm: chHeadType[], + rowCount: number = 2 +) => { + return ( + <> + {Array.from({ length: rowCount }).map((_, i) => ( + + + + <TableRow key={i}> + + { + upHeadList + .filter((head: TableTripleProps) => head.visible == true) + .map((head: TableTripleProps) => + !head.upSequnce[i] ? ( + <TableHead + className={`border border-gray-600 px-2 py-1 `} + rowSpan={2} + key={head.id} + > + {head.title} + </TableHead> + ) : head.upSequnce[i] === 1 ? ( + <TableHead + className={`border border-gray-600 px-2 py-1 `} + key={head.id} + rowSpan={1} + colSpan={ + makeHeadNm.find((ch) => ch.headNm === head.upName[i]) + ?.length + } + > + {makeHeadNm.find((ch) => ch.headNm === head.upName[i])?.text} + </TableHead> + ) : null + )} + </TableRow> + ))} + <TableRow> + {upHeadList + .map((head: TableTripleProps) => + makeHeadNm.find((ch) => ch.headNm === head?.upName[1] && head.visible ==true ) ? ( + <TableHead + className={`border border-gray-600 px-2 py-1 `} + key={head.id} + > + {head.title} + </TableHead> + ) : null + )} + </TableRow> + </> + ); +}; + +export default function RainSttn() { + const { code, rain, init, sttnCommon } = useWrStore((state) => state); + const { rainRes } = rain; + + const [isChHead, setIsChHead] = useState(false); + + const [bdstTable, setBdstTable] = useState<any[]>(); + const [tableHead, setTableHead] = useState<any[]>([]); + let nodeList = headMakeTriple( + sttnCommon.rainSttHeadList, + sttnCommon.rainSttHeadNm + ); + + useEffect(() => { + if (!rain.isInit) { + init(undefined); + } + }, [rain.isInit, init]); + + useEffect(() => { + if (code.sggCd.length > 0) { + const data = tableData(rainRes, { code }); + // data 는 위 JSON 객체라고 가정 + + console.log("sttnCommon " , sttnCommon.rainSttHeadList) + + const unVisibleHead = sttnCommon.rainSttHeadList.filter( + (item: TableTripleProps) => item.visible === false + ); + + console.log("unVisibleHead " , unVisibleHead) + const chData = data + .map((item:any) =>({ + ...item, + ...item.reuseBuilding[0], + ...item.reuseBuilding[0].rainyObj + })).filter((item:any) => item.rainyObj !== undefined) + + console.log("chData " , chData) + + + setBdstTable( chData); + + + + } + + }, [code, rainRes,sttnCommon]); + + + + return ( + <> + <ContentsDiv> + <div className="grid grid-cols-4 gap-4 "> + <div className="col-span-4"> + <Title title={"빗물재이용 시설 현황"} /> + <SearchDiv> + <SearchFormLeft> + <SelectBox + className={"col-span-2 w-full h-full text-2xl"} + label={"권역"} + selectClass={""} + selectArray={code.yn} + onSelectValue={() => {}} + value={""} + /> + <SelectBox + className={"col-span-2 w-full h-full text-2xl"} + label={"단위유역"} + selectClass={""} + selectArray={code.yn} + onSelectValue={() => {}} + value={""} + /> + <SelectBox + className={"col-span-2 w-full h-full text-2xl"} + label={"중권역"} + selectClass={""} + selectArray={code.yn} + onSelectValue={() => {}} + value={""} + /> + <SelectBox + className={"col-span-2 w-full h-full text-2xl"} + label={"환경청"} + selectClass={""} + selectArray={code.yn} + onSelectValue={() => {}} + value={""} + /> + <SelectBox + className={"col-span-2 w-full h-full text-2xl"} + label={"시도"} + selectClass={""} + selectArray={code.yn} + onSelectValue={() => {}} + value={""} + /> + <SelectBox + className={"col-span-2 w-full h-full text-2xl"} + label={"시군구"} + selectClass={""} + selectArray={code.yn} + onSelectValue={() => {}} + value={""} + /> + </SearchFormLeft> + <SearchFormRight> + <div className="space-y"> + {/* 첫 줄: 버튼 3개 */} + <div className="flex flex-row space-x-2"> + <Button size={"sm"} onClick={(e) => {}}> + 조회 + </Button> + <Button size={"sm"} onClick={() => {}}> + 다운로드 + </Button> + </div> + <div className="flex flex-row space-x-2 pt-3"> + <Button + size={"sm"} + color="green" + onClick={() => { + setIsChHead(true); + }} + > + 조회항목설정 + </Button> + </div> + </div> + </SearchFormRight> + </SearchDiv> + </div> + </div> + <div className="grid grid-cols-6 gap-4 "> + <div className="col-span-6"> + <ListDiv> + <UiTable + headName={[]} + tableData={bdstTable || []} + headlist={sttnCommon.rainSttHeadList} + pageSize={0} + total={0} + cellClick={undefined} + onPageChange={function (page: number): void { + throw new Error("Function not implemented."); + }} + > + {nodeList} + </UiTable> + </ListDiv> + </div> + </div> + <UiModal + open={isChHead} + onOpenChange={() => { + setIsChHead(!isChHead); + }} + bodyClass={""} + body={<HeadChModal type={'rain'}/>} + /> + </ContentsDiv> + </> + ); +} diff --git a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx index 81fc5b88a..ad8874ac9 100644 --- a/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx +++ b/apps/wr/app/ruseFcltMng/prfmncReg/chkgdnReg/page.tsx @@ -33,40 +33,48 @@ export const headMakeprfmnc = ( ) => { return ( <> + + + <TableRow> {upHeadList - .filter((data) => data.visible !=false) - .map((head: TableUpperProps) => - !head.upSequnce ? ( - <TableHead - className={ `border border-gray-600 px-2 py-1 `} - rowSpan={2} key={head.id}> - {head.title} - </TableHead> - ) : head.upSequnce === 1 ? ( - <TableHead - className={ `border border-gray-600 px-2 py-1 `} - key={head.id} - rowSpan={1} - colSpan={ - makeHeadNm.find((ch) => ch.headNm === head.upName)?.length - } - > - {makeHeadNm.find((ch) => ch.headNm === head.upName)?.text} - </TableHead> - ) : null - )} + .map((head: TableUpperProps) => + !head.upSequnce ? ( + <TableHead + className={`border border-gray-600 px-2 py-1 `} + rowSpan={2} + key={head.id} + > + {head.title} + </TableHead> + ) : head.upSequnce === 1 ? ( + <TableHead + className={`border border-gray-600 px-2 py-1 `} + key={head.id} + rowSpan={1} + colSpan={ + makeHeadNm.find((ch) => ch.headNm === head.upName)?.length + } + > + {makeHeadNm.find((ch) => ch.headNm === head.upName)?.text} + </TableHead> + ) : null + )} </TableRow> + <TableRow> {upHeadList - .filter((data) => data.visible !=false) - .map((head: TableUpperProps) => - makeHeadNm.find((ch) => ch.headNm === head.upName) ? ( - <TableHead - className={ `border border-gray-600 px-2 py-1 `} - key={head.id}>{head.title}</TableHead> - ) : null - )} + .filter((data) => data.visible != false) + .map((head: TableUpperProps) => + makeHeadNm.find((ch) => ch.headNm === head.upName) ? ( + <TableHead + className={`border border-gray-600 px-2 py-1 `} + key={head.id} + > + {head.title} + </TableHead> + ) : null + )} </TableRow> </> ); @@ -76,8 +84,6 @@ export default function Page() { const [isDetail, setIsDetail] = useState(false); const [isExcel, setIsExcel] = useState(false); - - const [testObj, setTestObj] = useState({}); const [selFcltDiv, setSelFcltDiv] = useState("RST"); @@ -110,30 +116,39 @@ export default function Page() { /> </SearchFormLeft> <SearchFormRight> - <Button - className="mr-4 rounded-lg" - onClick={(e) => { - cellClick() - setIsDetail(!isDetail); - }} - > - 조회 - </Button> - <Button className="mr-4 rounded-lg" onClick={() => {}}> - 삭제 - </Button> - <Button className="mr-4 rounded-lg" onClick={() => {}}> - 저장 - </Button> - <Button className="mr-4 rounded-lg" onClick={() => {}}> - 결과등록 - </Button> - <Button className="mr-4 rounded-lg" + <div className="space-y"> + <div className="flex flex-row space-x-2"> + <Button + size={"sm"} + onClick={(e) => { + cellClick(); + setIsDetail(!isDetail); + }} + > + 조회 + </Button> + <Button size={"sm"} onClick={() => {}}> + 삭제 + </Button> + <Button size={"sm"} onClick={() => {}}> + 저장 + </Button> + </div> + <div className="flex flex-row space-x-2 pt-3"> + <Button size={"sm"} onClick={() => {}}> + 결과등록 + </Button> + <Button + color="green" + size={"sm"} onClick={() => { setIsExcel(!isDetail); - }}> - 양식받기 - </Button> + }} + > + 양식받기 + </Button> + </div> + </div> </SearchFormRight> </SearchDiv> </div> @@ -153,11 +168,12 @@ export default function Page() { body={<ChkgdModal type={selFcltDiv} obj={testObj}></ChkgdModal>} /> - <UiModal open={isExcel} + <UiModal + open={isExcel} onOpenChange={setIsExcel} bodyClass={"w-[40vw] max-w-none"} - body={<ChkgdExcel type={selFcltDiv}></ChkgdExcel>} - /> + body={<ChkgdExcel type={selFcltDiv}></ChkgdExcel>} + /> </ContentsDiv> ); } diff --git a/apps/wr/app/store/common/code/index.ts b/apps/wr/app/store/common/code/index.ts index f0a160213..2a9e77d8e 100644 --- a/apps/wr/app/store/common/code/index.ts +++ b/apps/wr/app/store/common/code/index.ts @@ -1,9 +1,10 @@ -import { getFectch } from "@/components/lib/api"; +import { getFetch } from "@/components/lib/api"; // Description: 공통코드 export type selectArray = { text: string; val: string | number; + adstDliStrCd?: string }; export const yn :selectArray[]=[ @@ -100,6 +101,16 @@ export type comCodeState = { bdstUsgCd: selectArray[]; cityCd: selectArray[]; sggCd: selectArray[]; + + rvbsnCd:selectArray[]; + mdmbsnCd:selectArray[]; + lgbsnCd:selectArray[]; + lclgvrnmntCd:selectArray[]; + + + + + orgwtKndCd:selectArray[]; yn:selectArray[]; }; @@ -108,7 +119,7 @@ export type comCodeState = { export type comCodeType = comCodeState & comCodeActions; export const getSggCd = async (set: any) => { - const sgg = await getFectch("common", "/addr/sgg"); + const sgg = await getFetch("common", "/addr/sgg"); const sggCd = sgg.map((item: any) => ({ val: Number(item.adstDstrCd), text: item.gugun, @@ -121,7 +132,7 @@ export const getSggCd = async (set: any) => { })); }; export const getCityCd = async (set: any) => { - const city = await getFectch("common", "/addr/city"); + const city = await getFetch("common", "/addr/city"); const cityCd = city.map((item: any) => ({ val: Number(item.adstDstrCd), text: item.sido, @@ -135,6 +146,92 @@ export const getCityCd = async (set: any) => { })); }; +// 권역 API 호출 함수 추가 +export const getRegionCd = async (set: any) => { + try{ + const rvbsn = await getFetch("common", "/addr/sarea"); + const rvbsnCd = rvbsn.map((item: any) => ({ + val: Number(item.rvbsnCd), + text: item.rvbsn, + })); + rvbsnCd.unshift({val:0,text:'전체'}) + set((state: comCodeState) => ({ + code: { + ...state.code, + rvbsnCd: rvbsnCd, + }, + })); +}catch(error){ + console.error('권역 데이터를 가져오는데 실패했습니다:', error); +} +}; + +// 중권역 API 호출 함수 추가 +export const getMiddleRegionCd = async (set: any) => { + try{ + const mdmbsn = await getFetch("common", "/addr/midArea"); + const mdmbsnCd = mdmbsn.map((item: any) => ({ + val: Number(item.rvbsnCd), + text: item.mdmbsn, + })); + mdmbsnCd.unshift({val:0,text:'전체'}) + set((state: comCodeState) => ({ + code: { + ...state.code, + mdmbsnCd: mdmbsnCd, + }, + })); +}catch(error){ + console.error('중권역 데이터를 가져오는데 실패했습니다:', error); +} +}; + + +// 단위유역 API 호출 함수 추가 +export const getUnitWaterShedCd =async (set: any) => { + try{ + const lgbsn = await getFetch("common", "/addr/largeArea"); + const lgbsnCd = lgbsn.map((item: any) => ({ + val: Number(item.rvbsnCd), + text: item.lgbsn, + })); + lgbsnCd.unshift({val:0,text:'전체'}) + set((state: comCodeState) => ({ + code: { + ...state.code, + lgbsnCd: lgbsnCd, + }, + })); + }catch(error){ + console.error('대영역 데이터를 가져오는데 실패했습니다:', error); + } +}; + + + +// 환경청 데이터 +export const getEnvPartCd =async (set: any) => { + try{ + const lclgvrnmnt = await getFetch('common', '/addr/govArea'); + const lclgvrnmntCd = lclgvrnmnt.map((item: any) => ({ + val: Number(item.lclgvrnmntCd), + text: item.lclgvrnmntNm, + adstDliStrCd:item.adstDliStrCd + })); + lclgvrnmntCd.unshift({val:0,text:'전체' ,adstDliStrCd:''}) + set((state: comCodeState) => ({ + code: { + ...state.code, + lclgvrnmntCd: lclgvrnmntCd, + }, + })); + }catch(error){ + console.error('환경청 데이터를 가져오는데 실패했습니다:', error); + } +}; + + + export const comCodeStateExport: comCodeState = { code: { isInit: false, @@ -144,6 +241,10 @@ export const comCodeStateExport: comCodeState = { orgwtKndCd:orgwtKndCd, cityCd: [], sggCd: [], + rvbsnCd:[], + mdmbsnCd:[], + lgbsnCd:[], + lclgvrnmntCd:[], yn:yn }, }; @@ -158,14 +259,14 @@ export type comCodeActions = { export const codeActionExport: (set: any) => comCodeActions = (set: any) => { return { codeInit: async () => { - const sgg = await getFectch("common", "/addr/sgg"); + const sgg = await getFetch("common", "/addr/sgg"); const sggCd = sgg.map((item: any) => ({ val: Number(item.adstDstrCd), text: item.gugun, })); - const city = await getFectch("common", "/addr/city"); + const city = await getFetch("common", "/addr/city"); const cityCd = city.map((item: any) => ({ val: Number(item.adstDstrCd), text: item.sido, diff --git a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx index 6300e0108..43de52ff9 100644 --- a/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx +++ b/apps/wr/app/store/prfmncReg/chkgdnReg/rainChkgdn/index.tsx @@ -25,6 +25,7 @@ export type chHeadType={ headNm: string; text: string; length: number; + rows?: number; } export const rainHeadNm:chHeadType[] = [ diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/bdstReg/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/bdstReg/index.tsx index 8017286fa..74f96642f 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/bdstReg/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/bdstReg/index.tsx @@ -1,5 +1,5 @@ -import { getFectch } from "@/components/lib/api"; -import { TEST_UUID, type bdstAll, type customRainBdst } from "../rainReg"; +import { getFetch } from "@/components/lib/api"; +import { TEST_UUID, type customRainBdst } from "../rainReg"; import type { TableProps } from "../pbnstReg"; import type { customHtdflBdst } from "../htdflReg"; import type { customRswtBdst } from "../rswtReg"; @@ -32,7 +32,7 @@ type TableUpperProps = { -const bdstBase: bdstAll[] = []; +const bdstBase:any[] = []; const isRainBdst = (data: any): data is customRainBdst=> { @@ -164,7 +164,7 @@ type bdstActions = { const findBdstInfo = async(sggCd:string, searchTxt:string ,flg:string)=>{ - return await getFectch('wr', `/reuseFc/building/${flg}/${sggCd}`+(searchTxt?`/${searchTxt}`:'' )) + return await getFetch('wr', `/reuseFc/building/${flg}/${sggCd}`+(searchTxt?`/${searchTxt}`:'' )) } diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/htdflReg/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/htdflReg/index.tsx index d185be093..f19962010 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/htdflReg/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/htdflReg/index.tsx @@ -1,4 +1,4 @@ -import { getFectch, postFectch, putFectch } from "@/components/lib/api"; +import { getFetch, postFectch, putFectch } from "@/components/lib/api"; import { upHeadList, type bdstAll, type chgBuilding, type TableUpperProps } from "../rainReg"; import { z } from "zod"; @@ -25,20 +25,21 @@ export const hdtflZod = z.object({ instlCst: z.number().nullish().default(0), operMngCd: z.string().nullish().default(""), anlOperCst: z.number().default(0), - instlCstSprtYn: z.string().default(""), + instlCstSprtYn: z.enum(["Y", "N"]), instlCstSprtAmt: z.number().nullish().default(0), - grntchBdstCertYn: z.string().default(""), - grntchBdstCertYr: z - .string() - .nullish(), + grntchBdstCertYn: z.enum(["Y", "N"]), + grntchBdstCertYr: z .string().default("") + .refine((year) =>year.length ===0 || /^\d{4}$/.test(year),{ + message:'4자리 연도만 입력하세요' + }), grntchBdstCertNo: z.string().nullish().default(""), grntchBdstCertGrd: z.string().nullish().default(""), - crgRdctYn: z.string().default(""), + crgRdctYn: z.enum(["Y", "N"]), crgRdctBss: z.string().nullish().default(""), crgRdctAmt: z.number().nullish().default(0), ruseFcltFlg: z.string().nullish().default(""), bdstUsgCd: z.number().default(0), - lawTrgtYn: z.string().default(""), + lawTrgtYn: z.enum(["Y", "N"]), rgtr:z.string().nullish().default(null), mdfr:z.string().nullish().default(null), // htdflObj 매핑 @@ -92,67 +93,9 @@ export const hdtflZod = z.object({ .default([]), }); - export type customHtdflBdst = Omit<bdstAll, 'reuseBuilding'> & { - reuseBuilding: htdflReuseBuilding[]; - }; + export type customHtdflBdst = z.infer<typeof hdtflZod> + //export type customHtdflBdst = z.infer<typeof hdtflZod>; -//export type customHtdflBdst = z.infer<typeof hdtflZod>; - -// 타입을 조드로 만들어가 하는ㅓㄹ로 테트 -export type htdflReuseBuilding = { - bdstRuseFcltPk: number | undefined; - bdstInfoFk: number | undefined; - instlCmptnDt: Date | undefined; - instlCst: number | undefined; - operMngCd: string; - anlOperCst: number | undefined; - instlCstSprtYn: string | undefined; - instlCstSprtAmt: number | undefined; - grntchBdstCertYn?: string | undefined; - grntchBdstCertYr: string | undefined; - grntchBdstCertNo: string | undefined; - grntchBdstCertGrd: string | undefined; - crgRdctYn: string; - crgRdctBss: string | undefined; - crgRdctAmt: number | undefined; - ruseFcltFlg: string; - bdstUsgCd: number | undefined; - lawTrgtYn: string; - htdflObj: htdflObj; - rgtr?:string; - mdfr?:string; -}; - -export type htdflObj = { - htdflFcltPk?: number; - bdstRuseFcltFk?: number; - etgtType?: string; - fclCpct?: number | undefined; - plwtYn?: string; - orgwtWtritSpt: number | undefined; - orgwtOcrnProcs: string; - wtritEntrcTp: number | undefined; - amtgnr: number | undefined; - prcsProcsYn: string; - prcsFcltCpct: number | undefined; - fmYn: string; - utztnCpct: number | undefined; - utztnUsg: string; - grssClfg: number | undefined; - combResdch: number | undefined; - trbt: number | undefined; - bod: number | undefined; - smll: number | undefined; - crmty: number | undefined; - tn: number | undefined; - tph: number | undefined; - ph: number | undefined; - clIonQnt: number | undefined; - cdtnv: number | undefined; - emsnExitTp: number | undefined; - rgtr?:string; - mdfr?:string; -}; export type htdflFacState = { htdfl: { @@ -180,7 +123,7 @@ export const htdflFacStateExport: htdflFacState = { }; const initFetch = async (txt: string | undefined) => { - const htdflRes = await getFectch( + const htdflRes = await getFetch( "wr", `/drain/facilityList/1/20/0` + (txt ? `/${txt}` : "") ); diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/index.tsx index 72a83b81a..e30409f58 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/pbnstReg/index.tsx @@ -1,10 +1,31 @@ +import { z } from "zod"; import type { TableUpperProps } from "../rainReg"; +import { getFetch } from "@/components/lib/api"; + +export const pbnstZod = z.object({ + bscFctCd:z.string(), + sido:z.string().default(""), + gugun: z.string().default(""), + bscFctNm:z.string().default(""), + efflWqltStndrdNm:z.string().default(""), + fctCpc:z.number().default(0) + +}) + + +export type customPbnst = z.infer<typeof pbnstZod> + + +export const pbnstReg =[] as customPbnst[]; export type TableProps = { id: string; title: string; }; + + + export type selectLabel = { text: string; val: string; @@ -45,22 +66,15 @@ const selectLabel: selectLabel[] = [{ text: "test", val: "1" }]; const pubFacHeadList: TableProps[] = [ { id: "sido", title: "시도" }, - { id: "sigungo", title: "시군구" }, - { id: "facilityName", title: "시설명" }, - { id: "location", title: "위치" }, - { id: "locationgubun", title: "지역구분" }, - { id: "facilityCapacity", title: "시설용량" }, + { id: "gugun", title: "시군구" }, + { id: "bscFctNm", title: "시설명" }, + { id: "addr", title: "위치" }, + { id: "efflWqltStndrdNm", title: "지역구분" }, + { id: "fctCpc", title: "시설용량" }, { id: "yn", title: "재이용여부" }, { id: "authoDay", title: "등록여부" }, ]; -const ruseFclt: ruseFcltType[] = [ - { swtrmtFcltFk: "a", fcltCpct: 1000000, swtrmtCpct: 1000000 ,pbnstRuseFcltPk:'aa',fcltNm:'하수1',ruseCpct: 1, splyExtraCpct: 2 }, - { swtrmtFcltFk: "a", fcltCpct: 1300000, swtrmtCpct: 1300000 ,pbnstRuseFcltPk:'ab',fcltNm:'하수2',ruseCpct: 3, splyExtraCpct: 4 }, - - { swtrmtFcltFk: "b", fcltCpct: 2000000, swtrmtCpct: 2000000 ,pbnstRuseFcltPk:'bb',fcltNm:'재이용1',ruseCpct: 1, splyExtraCpct: 2 }, - { swtrmtFcltFk: "b", fcltCpct: 2300000, swtrmtCpct: 2300000 ,pbnstRuseFcltPk:'ba',fcltNm:'재이용2' ,ruseCpct: 3, splyExtraCpct: 4 }, -]; const pubMngUpHeadList: TableUpperProps[] = [ { id: "mng", title: "운영방식" }, { id: "subCo", title: "대행업체" }, @@ -68,126 +82,20 @@ const pubMngUpHeadList: TableUpperProps[] = [ { id: "endDay", title: "종료일", upName: "upChangeRe", upSequnce: 2 }, ]; const date = new Date(); -const fcltOperInfo: fcltOperInfoType[] = [ - { - mng: "자체운영", - subCo: "-", - startDay: "2024-11-11", - endDay: "2024-11-20", - pbnstRuseFcltPk: "aa", - }, - { - mng: "자체운영", - subCo: "한국수자원공사", - startDay: "2022-11-11", - endDay: "2024-09-13", - pbnstRuseFcltPk: "aa", - }, - { - mng: "자체운영", - subCo: "스타벅스", - startDay: "2023-11-11", - endDay: "2024-02-19", - pbnstRuseFcltPk: "bb", - }, -]; -const publicReuseFacilityData: publicReuseFacilityType[] = [ - { - sido: "서울", - sigungo: "강남구", - facilityName: "난지", - location: "경기도 고양시 덕양구 대차로 4가", - locationgubun: "500", - facilityCapacity: "800,000", - reuse: "Y", - register: "Y", - swtrmtFcltFk: "a", - }, - { - sido: "서울", - sigungo: "강남구", - facilityName: "여의도 중앙", - location: "경기도 고양시 덕양구 대차로 4가", - locationgubun: "500", - facilityCapacity: "800,000", - reuse: "Y", - register: "Y", - swtrmtFcltFk: "b", - }, - { - sido: "서울", - sigungo: "강남구", - facilityName: "너의 마음속", - location: "경기도 고양시 덕양구 대차로 4가", - locationgubun: "500", - facilityCapacity: "800,000", - yn: "Y", - authoDay: "2012", - area: "123", - swtrmtFcltFk: "c", - }, -]; - -const erctUswtrCd: selectLabel[] = [ - { text: "처리장연계", val: "1_erct" }, - { text: "자체/연계", val: "2_erct" }, - { text: "자체처리", val: "3_erct" }, -]; -const cyclCd: selectLabel[] = [ - { text: "1차", val: "1_cyc" }, - { text: "2차", val: "2_cyc" }, -]; -const seCd: selectLabel[] = [ - { text: "신규", val: "1_Se" }, - { text: "진행", val: "2_Se" }, -]; -const buseCd: selectLabel[] = [ - { text: "재정", val: "1_bus" }, - { text: "만루", val: "2_bus" }, -]; -const rprcsCd: selectLabel[] = [ - { text: "물리적처리", val: "1_rprc" }, - { text: "생물학적처리", val: "2_rprc" }, -]; -const buseMet: selectLabel[] = [ - { text: "재정", val: "1_busemet" }, - { text: "민간투자", val: "2_busemet" }, - { text: "자체", val: "3_busemet" }, -]; -const rprcLoCd: selectLabel[] = [ - { text: "내부", val: "1_rprc" }, - { text: "외부", val: "2_rprc" }, -]; export type pubFacState = { pubFac: { isInit: boolean; pubFacHeadList: TableProps[]; pubMngUpHeadList: TableUpperProps[]; - publicReuseFacilityData: publicReuseFacilityType[]; selectLabel: selectLabel[]; - erctUswtrCd: selectLabel[]; - cyclCd: selectLabel[]; - seCd: selectLabel[]; - buseCd: selectLabel[]; - rprcsCd: selectLabel[]; - buseMet: selectLabel[]; - rprcLoCd: selectLabel[]; - - ruseFclt:ruseFcltType[]; - }; - pubMng:{ - //isInit:boolean; - fcltOperInfo: fcltOperInfoType[]; - ruseFclt:ruseFcltType[]; + pbnstReg:customPbnst[]; } }; type pubFacActions = { - decrementList: () => void; - mngMainValue:(swtrmtFcltFk:string)=> void; - mngTableValue:(swtrmtFcltFk:string)=> void; + pubHasuInit: (txt:string|undefined) => void; }; export type pubFacType = pubFacState & pubFacActions; @@ -197,62 +105,39 @@ export const pubFacStateExport: pubFacState = { isInit: false, pubFacHeadList: pubFacHeadList, pubMngUpHeadList: pubMngUpHeadList, - publicReuseFacilityData: publicReuseFacilityData, selectLabel: selectLabel, - erctUswtrCd: erctUswtrCd, - cyclCd: cyclCd, - seCd: seCd, - buseCd: buseCd, - rprcsCd: rprcsCd, - buseMet: buseMet, - rprcLoCd: rprcLoCd, - ruseFclt:ruseFclt, + pbnstReg:pbnstReg, }, - pubMng:{ - // isInit: false, - fcltOperInfo: fcltOperInfo, - ruseFclt:ruseFclt - } + +}; + +const initFetch = async (txt:string|undefined) => { + + const rainRes =await getFetch("common", `/prcsFclt/info/1/20/'A'/41220` +(txt? `/${txt}`:'')+'/0'+'/1' ); + + return rainRes }; export const pubFacActionsExport: (set: any) => pubFacActions = (set: any) => { return { - decrementList: () => - set((state: pubFacState) => { - return { - pubFac: { - pubFacheadList: state.pubFac.pubFacHeadList, - publicReuseFacilityUper: state.pubFac.publicReuseFacilityData.slice( - 0, - state.pubFac.publicReuseFacilityData.length - 1 - ), - }, - }; - }), - mngMainValue:(swtrmtFcltFk:string)=> - set((state:pubFacState)=>{ - return{ - - pubMng:{ - ...state.pubMng, - ruseFclt:state.pubMng.ruseFclt.filter((item)=> - - item.swtrmtFcltFk===swtrmtFcltFk - - ) + + pubHasuInit: async(txt:string |undefined)=>{ + try{ + const pbnstReg = await initFetch(txt) + return set((state:pubFacState)=>({ + ...state, + pubFac:{ + ...state.pubFac, + pbnstReg:pbnstReg, + isInit: false, } - } - }), - mngTableValue:(pbnstRuseFcltPk:string)=> - set((state:pubFacState)=>{ - return{ - pubMng:{ - ...state.pubMng, - fcltOperInfo:state.pubMng.fcltOperInfo.filter((item)=>item.pbnstRuseFcltPk===pbnstRuseFcltPk) - } - } - }) + })) + + }catch(errorHasu){ + console.log(errorHasu) + } + } }; }; diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/index.tsx index 81cf9f0c0..33b2228d3 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/rainReg/index.tsx @@ -1,18 +1,11 @@ import type { selectArray } from "@/app/store/common/code"; -import { getFectch, postFectch, putFectch } from "@/components/lib/api"; -import { FormItem } from "@common/business_components/ui"; -import { zodResolver } from "@hookform/resolvers/zod"; -import type { UUID } from "crypto"; -import { useForm } from "react-hook-form"; +import { getFetch, postFectch, putFectch } from "@/components/lib/api"; import { z } from "zod"; -import type { customHtdflBdst } from "../htdflReg"; -import type { customRswtBdst } from "../rswtReg"; import { makeMdfr, makeRstr } from "../bdstReg"; export const TEST_UUID= '2d4b151d-1828-41e0-91d9-4cd28ea1cc7e' - export const rainZod = z.object({ bdstInfoPk: z.number().optional(), ctpvCd: z.number().default(0), @@ -24,8 +17,7 @@ export const rainZod = z.object({ archArea: z.number().default(0), archChgArea: z.number().default(0), rgtr:z.string().nullish(), - mdfr:z.string().optional(), - + mdfr:z.string().nullish(), reuseBuilding: z.array( z.object({ bdstRuseFcltPk: z.number().nullish(), @@ -36,34 +28,34 @@ export const rainZod = z.object({ anlOperCst: z.number().default(0), instlCstSprtYn: z.string().default(""), instlCstSprtAmt: z.number().nullish(), - grntchBdstCertYn: z.string().default(""), - grntchBdstCertYr: z.string() - .max(4, "4자리 연도를 입력하세요") - .regex(/^\d{4}$/, "4자리 연도를 입력하세요") - .default(""), + grntchBdstCertYn: z.enum(["Y", "N"]).nullish(), + grntchBdstCertYr: z.string().default("") + .refine((year)=> year.length===0 || /^\d{4}$/.test(year),{ + message:'4자리 연도만 입력하세요' + }), grntchBdstCertNo: z.string().default(""), grntchBdstCertGrd: z.string().default(""), - crgRdctYn: z.string().default("").nullish(), - crgRdctBss: z.string().default("").nullish(), - crgRdctAmt: z.number().default(0), + crgRdctYn: z.enum(["Y", "N"]), // 안쓰는 값 + crgRdctBss: z.string().default("").nullish(), /// 안쓰는 값 + crgRdctAmt: z.number().default(0), // 안쓰는 값 ruseFcltFlg: z.string().default(""), bdstUsgCd: z.number().default(0), - lawTrgtYn: z.string().default(""), + lawTrgtYn: z.enum(["Y", "N"]), rgtr:z.string().nullish(), - mdfr:z.string().optional(), + mdfr:z.string().nullish(), rainyObj: z.object({ bdstReuseFcltFk: z.number().nullish(), pntfColKnd: z.string().default(""), pntfColArea: z.number().default(0), dtfcltCpct: z.number().default(0), + filtrTrtmfctYn: z.enum(["Y", "N"]).nullish(), filtrTrtmfctCpct: z.number().nullish().default(0), - filtrTrtmfctYn: z.string().default(""), filtrTrtmfctPrs: z.string().default(""), annRnwtQty: z.number().default(0), oilqMeasMthd: z.string().default("").nullish(), rgtr:z.string().nullish(), - mdfr:z.string().optional(), + mdfr:z.string().nullish(), }).default({}) @@ -95,59 +87,8 @@ export type chgBuilding={ } -export type bdstAll = { - bdstInfoPk?: number; - ctpvCd: number; - sggCd: number; - bdstNm: string; - daddr: string; - frstArchPrmsnDt: Date; - archArea: number; - archChgArea: number; - rgtr?:string|null; - mdfr?:string|null; - reuseBuilding: rainReuseBuilding[]; - chgBuilding:chgBuilding[] -}; +export type customRainBdst = z.infer<typeof rainZod> -export type customRainBdst = Omit<bdstAll, 'reuseBuilding'> & { - reuseBuilding: rainReuseBuilding[]; -}; - - -export type rainReuseBuilding = { - lawTrgtYn: string|undefined; - bdstUsgCd: number|undefined; - bdstRuseFcltPk?: number|null; - bdstInfoFk: number|undefined; - operMngCd?: number; - anlOperCst: number; - instlCmptnDt: Date|undefined; - instlCst: number; - //archChgPrmsnDt: string; - instlCstSprtYn: string|undefined; - instlCstSprtAmt?: number|undefined; - grntchBdstCertYn: string|undefined; - grntchBdstCertNo: string|undefined; - grntchBdstCertGrd: string|undefined; - grntchBdstCertYr: string|undefined; - rgtr?:string|null; - mdfr?:string|null; - rainyObj: rainyObj | null |undefined; -}; -export type rainyObj = { - bdstReuseFcltFk?: number|undefined; - pntfColKnd?: string | undefined; - pntfColArea?: number | undefined; - dtfcltCpct?: number; - filtrTrtmfctCpct?: number | undefined; - filtrTrtmfctYn?: string | undefined; - filtrTrtmfctPrs?: string | undefined; - annRnwtQty?: number; - oilqMeasMthd?: string | undefined; - rgtr?:string|null, - mdfr?:string|null, -}; export type TableUpperProps = { id: string; @@ -158,6 +99,15 @@ export type TableUpperProps = { visible?:boolean; }; +export type TableTripleProps = { + id: string; + title: string; + upName: string[]; + upSequnce: number[]; + edit?:boolean; + visible?:boolean; +}; + export const upHeadList: TableUpperProps[] = [ { id: "cityText", title: "시도" }, @@ -177,62 +127,6 @@ export const upHeadList: TableUpperProps[] = [ const rainRes: customRainBdst[] = []; - const regRainForm:customRainBdst = { - ctpvCd: 0, - sggCd: 0, - bdstNm: "", - daddr: "", - frstArchPrmsnDt:new Date(), - archArea: 0, - archChgArea: 0, - bdstInfoPk: 0, - rgtr:"", - mdfr:"", - reuseBuilding: [{ - rainyObj: { - bdstReuseFcltFk: 0, - pntfColKnd: undefined, - pntfColArea: undefined, - dtfcltCpct: 0, - filtrTrtmfctCpct: undefined, - filtrTrtmfctYn: undefined, - filtrTrtmfctPrs: undefined, - annRnwtQty: 0, - oilqMeasMthd: undefined, - rgtr:"", - mdfr:"", - }, - lawTrgtYn: undefined, - bdstUsgCd: undefined, - bdstRuseFcltPk: 0, - bdstInfoFk: 0, - operMngCd: 0, - anlOperCst: 0, - instlCmptnDt: undefined, - instlCst: 0, - // archChgPrmsnDt: "", - instlCstSprtYn: undefined, - instlCstSprtAmt: undefined, - grntchBdstCertYn: undefined, - grntchBdstCertNo: undefined, - grntchBdstCertGrd: undefined, - grntchBdstCertYr: undefined, - rgtr:"", - mdfr:"", - }], - //추가됨 - chgBuilding:[{ - bdstInfoFk: 0, - archChgPrmsnDt: new Date(), - archChgArea: "-", - bdstChgNm: "", - rgtr:"", - mdfr:"", - - }] -}; - - export const selectClass = "w-full h-full text-2xl"; const selectYN = [ { text: "Y", val: "1" }, @@ -244,7 +138,7 @@ export type rainFacState = { upHeadList: TableUpperProps[]; selectYN: selectArray[]; rainRes: customRainBdst[]; - regRainForm:customRainBdst, + // regRainForm:customRainBdst, }; }; @@ -263,7 +157,7 @@ export const rainFacStateExport: rainFacState = { rainRes: rainRes, upHeadList: upHeadList, selectYN: selectYN, - regRainForm:regRainForm, + //regRainForm:regRainForm, }, }; @@ -273,7 +167,7 @@ export const rainFacStateExport: rainFacState = { const initFetch = async (txt:string|undefined) => { - const rainRes =await getFectch("wr", `/reuseFc/rainyInfoList/1/20/41` +(txt? `/${txt}`:'')); + const rainRes =await getFetch("wr", `/reuseFc/rainyInfoList/1/20/41` +(txt? `/${txt}`:'')); const chRainRes = rainRes.map((item: customRainBdst) => { return { ...item, @@ -311,7 +205,7 @@ export const rainFacActionsExport: (set: any) => rainFacSActions = ( rainSearTxt: async(txt:string) =>{ try{ - const rainRes = await getFectch('wr' , `/reuseFc/rainyInfoList/1/20/41` +(txt? `/${txt}`:'')) + const rainRes = await getFetch('wr' , `/reuseFc/rainyInfoList/1/20/41` +(txt? `/${txt}`:'')) set((state: rainFacState) => { return { rain: { diff --git a/apps/wr/app/store/ruseFcltMng/fcltReg/rswtReg/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltReg/rswtReg/index.tsx index 8ba5b6586..da219b226 100644 --- a/apps/wr/app/store/ruseFcltMng/fcltReg/rswtReg/index.tsx +++ b/apps/wr/app/store/ruseFcltMng/fcltReg/rswtReg/index.tsx @@ -1,6 +1,5 @@ -import { getFectch, postFectch, putFectch } from "@/components/lib/api"; -import { upHeadList, type bdstAll, type chgBuilding, type TableUpperProps } from "../rainReg"; -import { rswtBdstType } from "@/app/store/common/code"; +import { getFetch, postFectch, putFectch } from "@/components/lib/api"; +import { upHeadList, type chgBuilding, type TableUpperProps } from "../rainReg"; import { z } from "zod"; import { makeMdfr, makeRstr } from "../bdstReg"; @@ -28,19 +27,20 @@ export const rswtZod = z.object({ operMngCd: z.string().nullish().default(""), anlOperCst: z.number().default(0), - instlCstSprtYn: z.string().default(""), + instlCstSprtYn: z.enum(["Y", "N"]), instlCstSprtAmt: z.number().default(0), - grntchBdstCertYn: z.string().default("N"), - grntchBdstCertYr: z.string().max(4, "4자리 연도를 입력하세요") - .regex(/^\d{4}$/, "4자리 연도를 입력하세요") - .default(""), - grntchBdstCertNo: z.string().nullish().default(""), - grntchBdstCertGrd: z.string().nullish().default(""), + grntchBdstCertYn: z.enum(["Y", "N"]), + grntchBdstCertYr: z.string().default("") + .refine((year)=> year.length===0 ||/^\d{4}$/.test(year),{ + message:'4자리 연도만 입력하세요' + }), + grntchBdstCertNo: z.string().default(""), + grntchBdstCertGrd: z.string().default(""), - crgRdctYn: z.string().default(""), - crgRdctBss: z.string().default(""), - crgRdctAmt: z.number().default(0), + crgRdctYn: z.enum(["Y", "N"]), // 안쓰는 값 + crgRdctBss: z.string().default("").nullish(), /// 안쓰는 값 + crgRdctAmt: z.number().default(0), // 안쓰는 값 ruseFcltFlg: z.string().default(""), bdstUsgCd: z.number().default(0), lawTrgtYn: z.string().default(""), @@ -55,10 +55,10 @@ export const rswtZod = z.object({ filtrTrtmfctProcs: z.string().default(""), filtrTrtmfctUsgCd: z.string().default(""), rswtrUsqty: z.number().default(0), - altUswtrUtztnYn: z.string().default(""), - altUswtrKndCd: z.string().default(""), - altUswtrUtztnQnt: z.number().default(0), - altUswtrIdntyMthdCd: z.string().default(""), + altUswtrUtztnYn: z.enum(["Y", "N"]).nullish(),//안쓰는값 + altUswtrKndCd: z.string().default(""),//안쓰는값 + altUswtrUtztnQnt: z.number().default(0),//안쓰는값 + altUswtrIdntyMthdCd: z.string().default(""),//안쓰는값 rgtr:z.string().nullish().default(null), mdfr:z.string().nullish().default(null), }).default({}) @@ -81,48 +81,7 @@ export const rswtZod = z.object({ }); - -export type customRswtBdst = Omit<bdstAll, 'reuseBuilding'> & { - reuseBuilding: rswtReuseBuilding[]; -}; - - - -export type rswtReuseBuilding = { - bdstRuseFcltPk: number; - bdstInfoFk: number; - instlCmptnDt: Date | undefined; - instlCst: number | undefined; - operMngCd: number; - lawTrgtYn: string | undefined; - anlOperCst: number; - instlCstSprtYn: string | undefined; - instlCstSprtAmt: number | undefined; - bdstUsgCd: number | undefined; - grntchBdstCertYn: string ; - grntchBdstCertNo?: string | undefined; - grntchBdstCertGrd?: string | undefined; - grntchBdstCertYr?: string | undefined; - rgtr?:string; - mdfr?:string; - rswtrObj: rswtrObj | null; -}; -export type rswtrObj = { - bdstRuseFcltFk?: number | undefined; - wtrUsqty?: number | undefined; - oblgTrgtWtrUsqty?: number ; - orgwtKndCd?: string | undefined; - filtrTrtmfctProcs?: string | undefined; - filtrTrtmfctUsgCd?: string | undefined; - rswtrUsqty?: number; - altUswtrUtztnYn?: string; - altUswtrKndCd?: string; - altUswtrUtztnQnt?: number; - - altUswtrIdntyMthdCd?: string; - rgtr?:string; - mdfr?:string; -} +export type customRswtBdst = z.infer<typeof rswtZod> const rswtRes: customRswtBdst[] = []; @@ -150,7 +109,7 @@ export const rswtFacStateExport: rswtFacState = { }; const initFetch = async (txt: string | undefined) => { - const rswtRes =await getFectch( + const rswtRes =await getFetch( "wr", `/reuseFc/waterreuseFc/1/20/41` + (txt ? `/${txt}` : "") ); diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx deleted file mode 100644 index b3cd56fe5..000000000 --- a/apps/wr/app/store/ruseFcltMng/fcltSttn/pbnstSttn/index.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; -import type { TableUpperProps } from "../../fcltReg/rainReg"; -import { z } from "zod"; - -export const pbnSttHeadNm:chHeadType[] = [ - {headNm:"catchment", text:"유역" , length: 3}, - {headNm:"adminDiv", text:"행정구역" , length: 2}, - {headNm:"rusSup", text:"재이용수공급가능량" , length: 3}, - {headNm:"yearResult", text:"연간실적정보(m³)" , length: 3}, - {headNm:"mngInfo", text:"운영정보" , length: 4} -] - -// id는 다확인해야함 -export const pbnSttHeadList:TableUpperProps[] = [ - { id: "a", title: "권역" ,upName:"catchment" ,upSequnce:1,visible:false}, - { id: "aaa", title: "단위유역" ,upName:"catchment" ,upSequnce:2 ,visible:false}, - { id: "aaaa", title: "중권역" ,upName:"catchment" ,upSequnce:3,visible:false}, - { id: "operMngCd", title: "환경청" ,visible:false }, - { id: "cityText", title: "시도" ,upName:"adminDiv" ,upSequnce:1,visible:false}, - { id: "sggText", title: "시군구" ,upName:"adminDiv" ,upSequnce:2,visible:false}, - { id: "bdnstNm", title: "시설명" ,visible:false }, - { id: "locDiv", title: "지역구분" ,visible:false }, - { id: "phone" , title: "전화번호" ,visible:false }, - - { id: "fcltQuantity", title: "시설용량(톤/일)" ,visible:false}, - { id: "rusNm", title: "재이용시설명" ,visible:false}, - - - { id: "fcltCpct", title: "시설용량(m³/일)", upName: "rusSup", upSequnce: 1 ,visible:false}, - { id: "trbt", title: "하수처리량(m³/일)", upName: "rusSup", upSequnce: 2 ,visible:false}, - { id: "ruseCpct", title: "재이용량(m³/일)", upName: "rusSup", upSequnce: 3 ,visible:false}, - - { id: "total", title: "합계", upName: "yearResult", upSequnce: 1 ,visible:false}, - { id: "ithlWtr", title: "장내용수", upName: "yearResult", upSequnce: 2 ,visible:false}, - { id: "othlWtr", title: "장외용수", upName: "yearResult", upSequnce: 3 ,visible:false}, - - { id: "mngMeth", title: "운영방식", upName: "mngInfo", upSequnce: 1 ,visible:false}, - { id: "rprtvBzenty", title: "대행업체", upName: "mngInfo", upSequnce: 2 ,visible:false}, - { id: "firstDay", title: "시작일", upName: "mngInfo", upSequnce: 3 ,visible:false }, - { id: "LastDay", title: "종료일", upName: "mngInfo", upSequnce: 4 ,visible:false}, - - ]; - - - - - - - -export type pbnstSttnState = { - pbnStt: { - pbnSttHeadList:TableUpperProps[], - pbnSttHeadNm:chHeadType[] - - }; -}; -type pbnSttActions = { -}; - -export type pbnSttType = pbnstSttnState & pbnSttActions; - -export const pbnSttStateExport: pbnstSttnState = { - pbnStt: { - pbnSttHeadList:pbnSttHeadList, - pbnSttHeadNm:pbnSttHeadNm - }, -}; - - - -export const pbnSttActionsExport: (set: any) => pbnSttActions = ( - set: any -) => { - return { - - pbnSttnInit: async(sggCd:string, searchTxt:string ,flg:string ) =>{ - - }, - - }; -}; - diff --git a/apps/wr/app/store/ruseFcltMng/fcltSttn/sttn/index.tsx b/apps/wr/app/store/ruseFcltMng/fcltSttn/sttn/index.tsx new file mode 100644 index 000000000..727d8df1b --- /dev/null +++ b/apps/wr/app/store/ruseFcltMng/fcltSttn/sttn/index.tsx @@ -0,0 +1,406 @@ +import type { chHeadType } from "@/app/store/prfmncReg/chkgdnReg/rainChkgdn"; +import { + upHeadList, + type TableTripleProps, + type TableUpperProps, +} from "../../fcltReg/rainReg"; + +export const pbnSttHeadNm: chHeadType[] = [ + { headNm: "catchment", text: "유역", length: 3 }, + { headNm: "adminDiv", text: "행정구역", length: 2 }, + { headNm: "rusSup", text: "재이용수공급가능량", length: 3 }, + { headNm: "yearResult", text: "연간실적정보(m³)", length: 3 }, + { headNm: "mngInfo", text: "운영정보", length: 4 }, +]; + +// id는 다확인해야함 +export const pbnSttHeadList: TableUpperProps[] = [ + { id: "a", title: "권역", upName: "catchment", upSequnce: 1, visible: true }, + { + id: "aaa", + title: "단위유역", + upName: "catchment", + upSequnce: 2, + visible: true, + }, + { + id: "aaaa", + title: "중권역", + upName: "catchment", + upSequnce: 3, + visible: false, + }, + { id: "operMngCd", title: "환경청", visible: true }, + { + id: "cityText", + title: "시도", + upName: "adminDiv", + upSequnce: 1, + visible: false, + }, + { + id: "sggText", + title: "시군구", + upName: "adminDiv", + upSequnce: 2, + visible: true, + }, + { id: "bdnstNm", title: "시설명", visible: true }, + { id: "locDiv", title: "지역구분", visible: true }, + { id: "phone", title: "전화번호", visible: true }, + + { id: "fcltQuantity", title: "시설용량(톤/일)", visible: true }, + { id: "rusNm", title: "재이용시설명", visible: true }, + + { + id: "fcltCpct", + title: "시설용량(m³/일)", + upName: "rusSup", + upSequnce: 1, + visible: true, + }, + { + id: "trbt", + title: "하수처리량(m³/일)", + upName: "rusSup", + upSequnce: 2, + visible: true, + }, + { + id: "ruseCpct", + title: "재이용량(m³/일)", + upName: "rusSup", + upSequnce: 3, + visible: true, + }, + + { + id: "total", + title: "합계", + upName: "yearResult", + upSequnce: 1, + visible: true, + }, + { + id: "ithlWtr", + title: "장내용수", + upName: "yearResult", + upSequnce: 2, + visible: true, + }, + { + id: "othlWtr", + title: "장외용수", + upName: "yearResult", + upSequnce: 3, + visible: true, + }, + + { + id: "mngMeth", + title: "운영방식", + upName: "mngInfo", + upSequnce: 1, + visible: true, + }, + { + id: "rprtvBzenty", + title: "대행업체", + upName: "mngInfo", + upSequnce: 2, + visible: true, + }, + { + id: "firstDay", + title: "시작일", + upName: "mngInfo", + upSequnce: 3, + visible: true, + }, + { + id: "LastDay", + title: "종료일", + upName: "mngInfo", + upSequnce: 4, + visible: true, + }, +]; +export const rainSttHeadNm: chHeadType[] = [ + { headNm: "bdnstInfo", text: "1.건축물정보", length: 9 }, + { headNm: "rainFcltInfo", text: "2.빗물이용시설정보", length: 7 }, + { headNm: "fcltMngInfo", text: "3.시설운영및 이용정보", length: 2 }, + { headNm: "insenInfo", text: "4.인센티브 정보", length: 9 }, + + { headNm: "adminDiv", text: "행정구역", length: 2 }, + { headNm: "pntfCol", text: "집수면", length: 2 }, + { headNm: "filtrTrtmfct", text: "여과등 처리시설", length: 3 }, + { headNm: "instlCstSprt", text: "설치비지원", length: 2 }, + + { headNm: "crgRdct", text: "요금감면", length: 3 }, + { headNm: "grntchBdstCert", text: "녹색건축물인증여부", length: 4 }, +]; + +// id는 다확인해야함 +export const rainSttHeadList: TableTripleProps[] = [ + { + id: "ctpvCd", + title: "시도", + visible: true, + upName: ["bdnstInfo", "adminDiv"], + upSequnce: [1, 1], + }, + { + id: "sggCd", + title: "시군구", + visible: true, + upName: ["bdnstInfo", "adminDiv"], + upSequnce: [2, 2], + }, + { + id: "bdstNm", + title: "건축물명", + visible: true, + upName: ["bdnstInfo"], + upSequnce: [3], + }, + { + id: "daddr", + title: "주소", + visible: true, + upName: ["bdnstInfo"], + upSequnce: [4], + }, + { + id: "bdstUsgCd", + title: "건축물용도코드", + visible: true, + upName: ["bdnstInfo"], + upSequnce: [5], + }, + { + id: "frstArchPrmsnDt", + title: "최초건축허가일시", + visible: true, + upName: ["bdnstInfo"], + upSequnce: [6], + }, + { + id: "archArea", + title: "건축면적", + visible: true, + upName: ["bdnstInfo"], + upSequnce: [7], + }, + { + id: "lawTrgtYn", + title: "법적의무대상여부", + visible: true, + upName: ["bdnstInfo"], + upSequnce: [8], + }, + { + id: "instlCmptnDt", + title: "설치완료일시", + visible: true, + upName: ["bdnstInfo"], + upSequnce: [9], + }, + + { + id: "instlCst", + title: "설치비용", + visible: true, + upName: ["rainFcltInfo"], + upSequnce: [1], + }, + { + id: "pntfColKnd", + title: "접수지점종류", + visible: true, + upName: ["rainFcltInfo", "pntfCol"], + upSequnce: [2, 1], + }, + { + id: "pntfColArea", + title: "접수지점면적", + visible: true, + upName: ["rainFcltInfo", "pntfCol"], + upSequnce: [3, 2], + }, + { + id: "filtrTrtmfctYn", + title: "여과처리시설유무", + visible: true, + upName: ["rainFcltInfo", "filtrTrtmfct"], + upSequnce: [4, 1], + }, + { + id: "filtrTrtmfctCpct", + title: "여과처리시설용량", + visible: true, + upName: ["rainFcltInfo", "filtrTrtmfct"], + upSequnce: [5, 2], + }, + { + id: "filtrTrtmfctPrs", + title: "여과처리시설처리공정", + visible: true, + upName: ["rainFcltInfo", "filtrTrtmfct"], + upSequnce: [6, 3], + }, + { + id: "dtfcltCpct", + title: "저류조용량", + visible: true, + upName: ["rainFcltInfo"], + upSequnce: [7], + }, + + { + id: "operMngCd", + title: "운영관리코드", + visible: true, + upName: ["fcltMngInfo"], + upSequnce: [1], + }, + { + id: "annRnwtQty", + title: "연간빗물운영량", + visible: true, + upName: ["fcltMngInfo"], + upSequnce: [2], + }, + + { + id: "instlCstSprtYn", + title: "설치지원비용여부", + visible: true, + upName: ["insenInfo", "instlCstSprt"], + upSequnce: [1, 1], + }, + { + id: "instlCstSprtAmt", + title: "설치지원비용", + visible: true, + upName: ["insenInfo", "instlCstSprt"], + upSequnce: [2, 2], + }, + { + id: "crgRdctYn", + title: "감면여부", + visible: true, + upName: ["insenInfo", "crgRdct"], + upSequnce: [3, 1], + }, // 확인필요 + { + id: "crgRdctBss", + title: "감면근거", + visible: true, + upName: ["insenInfo", "crgRdct"], + upSequnce: [4, 2], + }, // 확인필요 + { + id: "crgRdctAmt", + title: "감면금액", + visible: true, + upName: ["insenInfo", "crgRdct"], + upSequnce: [5, 3], + }, // 확인필요 + { + id: "grntchBdstCertYn", + title: "녹색건축물인증여부", + visible: true, + upName: ["insenInfo", "grntchBdstCert"], + upSequnce: [6, 1], + }, + { + id: "grntchBdstCertYr", + title: "녹색건축물인증년도", + visible: true, + upName: ["insenInfo", "grntchBdstCert"], + upSequnce: [7, 2], + }, + { + id: "grntchBdstCertNo", + title: "녹색건축물인증번호", + visible: true, + upName: ["insenInfo", "grntchBdstCert"], + upSequnce: [8, 3], + }, + { + id: "grntchBdstCertGrd", + title: "녹색건축물인증등급", + visible: true, + upName: ["insenInfo", "grntchBdstCert"], + upSequnce: [9, 4], + }, +]; + +export type sttnState = { + sttnCommon: { + pbnSttHeadList: TableUpperProps[]; + pbnSttHeadNm: chHeadType[]; + rainSttHeadList: TableTripleProps[]; + rainSttHeadNm: chHeadType[]; + }; +}; +type sttnActions = { + chSttnHead: (checkList: string[], type: string) => void; + pbnSttnInit: (sggCd: string, searchTxt: string, flg: string) => void; + +}; + +export type sttnType = sttnState & sttnActions; + +export const sttnStateExport: sttnState = { + sttnCommon: { + pbnSttHeadList: pbnSttHeadList, + pbnSttHeadNm: pbnSttHeadNm, + rainSttHeadList: rainSttHeadList, + rainSttHeadNm: rainSttHeadNm, + }, +}; + +export const sttnActionsExport: (set: any) => sttnActions = (set: any) => { + return { + pbnSttnInit: async (sggCd: string, searchTxt: string, flg: string) => {}, + + chSttnHead: async (checkList: string[], type: string) => { + const headList = + type === "pbn" + ? pbnSttHeadList + : type === "rain" + ? rainSttHeadList + : null; + + let chNm = type === "pbn" ? pbnSttHeadNm : rainSttHeadNm; + headList?.forEach((item) => { + if (checkList.find((ch) => ch === item.id)) { + item.visible = false; + if (item.upName) { + const upNames = Array.isArray(item.upName) ? item.upName : [item.upName]; + upNames?.forEach((up) => { + chNm.find((ch) => { + if (ch.headNm === up) { + ch.length = ch.length - 1; + } + } + ); + + }) + } + + } + }); + set((state: sttnState) => ({ + sttnCommon: { + ...state.sttnCommon, + pbnSttHeadList: type === "pbn" ? headList : state.sttnCommon.pbnSttHeadList, + rainSttHeadList: type === "rain" ? headList : state.sttnCommon.rainSttHeadList, + rainSttHeadNm: type === "rain" ? chNm : state.sttnCommon.rainSttHeadNm, + pbnSttHeadNm: type === "rain" ? chNm : state.sttnCommon.pbnSttHeadNm, + }, + })); + }, + }; +}; diff --git a/apps/wr/app/store/store.tsx b/apps/wr/app/store/store.tsx index 4e49f412a..f3e720add 100644 --- a/apps/wr/app/store/store.tsx +++ b/apps/wr/app/store/store.tsx @@ -29,11 +29,11 @@ import { type htdflFacState, type htdflFacType, } from "./ruseFcltMng/fcltReg/htdflReg"; -import { codeActionExport, comCodeStateExport, getCityCd, getSggCd, type comCodeState, type comCodeType } from "./common/code"; +import { codeActionExport, comCodeStateExport, getCityCd, getEnvPartCd, getMiddleRegionCd, getRegionCd, getSggCd, getUnitWaterShedCd, type comCodeState, type comCodeType } from "./common/code"; import { bdstActionsExport, bdstStateExport, type bdstFulType, type bdstState } from "./ruseFcltMng/fcltReg/bdstReg"; import { rainChkgdnActionsExport, rainChkgdnStateExport, type rainChkgdnState, type rainChkgdnType } from "./prfmncReg/chkgdnReg/rainChkgdn"; import { rswtChkgdnActionsExport, rswtChkgdnStateExport, type rswtChkgdnState, type rswtChkgdnType } from "./prfmncReg/chkgdnReg/rswrtChkgdn"; -import { pbnSttActionsExport, pbnSttStateExport, type pbnstSttnState, type pbnSttType } from "./ruseFcltMng/fcltSttn/pbnstSttn"; +import { sttnActionsExport, sttnStateExport, type sttnState, type sttnType } from "./ruseFcltMng/fcltSttn/sttn"; export type WrStore = comCodeType& pubFacType & @@ -44,7 +44,7 @@ export type WrStore = comCodeType& bdstFulType& rainChkgdnType& rswtChkgdnType& - pbnSttType + sttnType ; export const StoreZus = ( @@ -57,7 +57,7 @@ export const StoreZus = ( bdstState & rainChkgdnState& rswtChkgdnState& - pbnstSttnState + sttnState = { ...comCodeStateExport, ...pubFacStateExport, @@ -68,12 +68,16 @@ export const StoreZus = ( ...bdstStateExport, ...rainChkgdnStateExport, ...rswtChkgdnStateExport, - ...pbnSttStateExport + ...sttnStateExport } ) => { return createStore<WrStore>()((set) => { getSggCd(set), - getCityCd(set) + getCityCd(set), + getRegionCd(set), + getMiddleRegionCd(set), + getUnitWaterShedCd(set), + getEnvPartCd(set) return { ...initState, ...pubFacActionsExport(set), @@ -85,7 +89,7 @@ export const StoreZus = ( ...bdstActionsExport(set), ...rainChkgdnActionsExport(set), ...rswtChkgdnActionsExport(set), - ...pbnSttActionsExport(set) + ...sttnActionsExport(set) }; }); }; diff --git a/apps/wr/components/lib/api/index.ts b/apps/wr/components/lib/api/index.ts index 65533dcad..842ab5f88 100644 --- a/apps/wr/components/lib/api/index.ts +++ b/apps/wr/components/lib/api/index.ts @@ -4,7 +4,7 @@ import { DEV_URL_FO, DEV_URL_WR } from "../config/"; -export const getFectch = async( type:string , url: string) => { +export const getFetch = async( type:string , url: string) => { const div = type === 'common' ? DEV_URL_FO : DEV_URL_WR const response = await fetch( div+url , { method: "GET", diff --git a/apps/wr/components/lib/func/commom.ts b/apps/wr/components/lib/func/commom.ts index a6d3a94dc..3e5be1593 100644 --- a/apps/wr/components/lib/func/commom.ts +++ b/apps/wr/components/lib/func/commom.ts @@ -1,5 +1,4 @@ import type { comCodeState, selectArray } from "@/app/store/common/code"; -import type { bdstAll } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; diff --git a/apps/wr/components/ui/form/fcltReg/bdstReg/bdstReg.tsx b/apps/wr/components/ui/form/fcltReg/bdstReg/bdstReg.tsx index c1a1a79ea..a4107268f 100644 --- a/apps/wr/components/ui/form/fcltReg/bdstReg/bdstReg.tsx +++ b/apps/wr/components/ui/form/fcltReg/bdstReg/bdstReg.tsx @@ -1,6 +1,6 @@ import { useWrStore } from "@/app/store"; import type { selectArray } from "@/app/store/common/code"; -import { selectClass, type bdstAll } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; +import { selectClass } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { getCity } from "@/components/lib/func/commom"; import type { objSearchType } from "@/components/ui/modal/bdstRegModal/bdstRegModal"; import { FormField, FormUi, DatePicker, SelectBox } from "@common/business_components"; diff --git a/apps/wr/components/ui/form/fcltReg/htdflReg/htdflRegForm.tsx b/apps/wr/components/ui/form/fcltReg/htdflReg/htdflRegForm.tsx index f59791e80..5e58b9f8a 100644 --- a/apps/wr/components/ui/form/fcltReg/htdflReg/htdflRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/htdflReg/htdflRegForm.tsx @@ -19,7 +19,7 @@ import { import { useEffect } from "react"; import BdstReg from "../bdstReg/bdstReg"; -export function HtdflRegForm({ +export default function HtdflRegForm({ htdflForm, isModal, }: { @@ -35,7 +35,7 @@ export function HtdflRegForm({ defaultValues: defaultValues, }); - function onSubmit(values: z.infer<typeof hdtflZod>) { + const onSubmit=(values: z.infer<typeof hdtflZod>)=> { if (isModal) { htdflReg(values); } else { @@ -47,7 +47,7 @@ export function HtdflRegForm({ console.log(val); }; - function cleanHtdflData(raw: any): z.infer<typeof hdtflZod> { + const cleanHtdflData=(raw: any): z.infer<typeof hdtflZod> =>{ return { ...raw, frstArchPrmsnDt: new Date(raw?.frstArchPrmsnDt || null), @@ -71,6 +71,10 @@ export function HtdflRegForm({ })), }; } + + + + useEffect(() => { console.log("form errors:", form.formState.errors); }, [form.formState.errors]); @@ -87,7 +91,7 @@ export function HtdflRegForm({ <div> <div className="grid grid-cols-12"> <h1 className="pl-3 text-xl col-span-10">○온배수 시설 정보</h1> - <Button type="submit" className="mr-4 rounded-lg col-span-2"> + <Button size={"sm"} type="submit" className="col-start-12 col-span-1"> 저장 </Button> </div> diff --git a/apps/wr/components/ui/form/fcltReg/pbnstReg/buseReg/component.tsx b/apps/wr/components/ui/form/fcltReg/pbnstReg/buseReg/component.tsx index b358a98fc..d094801a8 100644 --- a/apps/wr/components/ui/form/fcltReg/pbnstReg/buseReg/component.tsx +++ b/apps/wr/components/ui/form/fcltReg/pbnstReg/buseReg/component.tsx @@ -16,24 +16,9 @@ const formSchema = z.object({ facilityName: z.string().min(2).max(50), }); - - const headMakeColSpan = (upHeadList: TableUpperProps[]) => { - return (<> - <TableRow>{ - upHeadList.map((head: TableUpperProps) => - (!head.upSequnce ? <TableHead rowSpan={2} key={head.id}>{head.title}</TableHead> : - head.upName === 'upChangeRe' && head.upSequnce === 1 ? <TableHead key={head.id} rowSpan={1} colSpan={2}>{'운영대행기간'}</TableHead> : null))} - </TableRow> - <TableRow> - {upHeadList.map((head: TableUpperProps) => - (head.upName === 'upChangeRe' ? <TableHead key={head.id}>{head.title}</TableHead> : null))} - </TableRow> - </>) -} export function PbnstBuseForm() { - const { pubFac } = useWrStore((state) => state); - const { pubMngUpHeadList, erctUswtrCd,cyclCd,seCd,buseCd,rprcsCd,buseMet,rprcLoCd} = pubFac; -const nodeList = headMakeColSpan(pubMngUpHeadList); + const { code ,pubFac } = useWrStore((state) => state); + const { pubMngUpHeadList} = pubFac; const form = useForm<z.infer<typeof formSchema>>({ @@ -79,7 +64,7 @@ const nodeList = headMakeColSpan(pubMngUpHeadList); name="name_1486273033" render={({ field }) => ( <FormUi label=''> - <SelectBox label='' selectArray={cyclCd} className={""} selectClass={selectClass} onSelectValue={onSelectValue } {...field}></SelectBox> + <SelectBox label='' selectArray={code.yn} className={""} selectClass={selectClass} onSelectValue={() =>{} } {...field}></SelectBox> </FormUi> )} /> @@ -103,7 +88,7 @@ const nodeList = headMakeColSpan(pubMngUpHeadList); name="name_8928357542" render={({ field }) => ( <FormUi label="구분"> - <SelectBox selectArray={seCd} className={""} label={""} selectClass={selectClass} onSelectValue={onSelectValue} /> + <SelectBox selectArray={code.yn} className={""} label={""} selectClass={selectClass} onSelectValue={()=>{} } /> </FormUi> )} /> @@ -115,7 +100,7 @@ const nodeList = headMakeColSpan(pubMngUpHeadList); name="name_9484942814" render={({ field }) => ( <FormUi label="사업방식"> - <SelectBox selectArray={buseMet} className={""} label={""} selectClass={selectClass} onSelectValue={onSelectValue}/> + <SelectBox selectArray={code.yn} className={""} label={""} selectClass={selectClass} onSelectValue={()=>{} }/> </FormUi> )} /> @@ -276,7 +261,7 @@ const nodeList = headMakeColSpan(pubMngUpHeadList); name="name_5139286452" render={({ field }) => ( <FormUi label="재처리방식"> - <SelectBox selectArray={rprcsCd} className={""} label={""} selectClass={selectClass} onSelectValue={onSelectValue }/> + <SelectBox selectArray={code.yn} className={""} label={""} selectClass={selectClass} onSelectValue={() =>{} }/> </FormUi> )} /> @@ -288,7 +273,7 @@ const nodeList = headMakeColSpan(pubMngUpHeadList); name="name_7233630277" render={({ field }) => ( <FormUi label="위치(처리장 내외)"> - <SelectBox selectArray={rprcLoCd} className={""} label={""} selectClass={selectClass} onSelectValue={onSelectValue}/> + <SelectBox selectArray={code.yn} className={""} label={""} selectClass={selectClass} onSelectValue={()=>{} }/> </FormUi> )} /> @@ -355,7 +340,7 @@ const nodeList = headMakeColSpan(pubMngUpHeadList); name="name_5139286452" render={({ field }) => ( <FormUi label="눙축수처리방식"> - <SelectBox selectArray={erctUswtrCd} className={""} label={""} selectClass={selectClass} onSelectValue={onSelectValue}/> + <SelectBox selectArray={code.yn} className={""} label={""} selectClass={selectClass} onSelectValue={() =>{}}/> </FormUi> )} /> diff --git a/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/component.tsx b/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/component.tsx index 6ceb41317..df03569c2 100644 --- a/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/component.tsx +++ b/apps/wr/components/ui/form/fcltReg/pbnstReg/mngReg/component.tsx @@ -18,7 +18,6 @@ import { type TableUpperProps, } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import type { fcltOperInfoType, ruseFcltType } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg"; -import { PbnstMngModal } from "@/components/ui/modal/pbnstMng/component"; const formSchema = z.object({ fcltNm: z.string().min(2).max(50), @@ -33,9 +32,8 @@ const formSchema = z.object({ export function PbnstMngForm({ data }: { data: ruseFcltType[] }) { - const { pubFac, pubMng } = useWrStore((state) => state); + const { pubFac } = useWrStore((state) => state); const { pubMngUpHeadList, isInit } = pubFac; - const { fcltOperInfo } = pubMng; const [ruseOperData, setRuseOperData] = useState<fcltOperInfoType[]>(); const [files, setFiles] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); @@ -58,11 +56,7 @@ export function PbnstMngForm({ data }: { data: ruseFcltType[] }) { const selectOptions = data?.map((item) => ({text: item.fcltNm, val: item.pbnstRuseFcltPk})) || [{text:'없음', val:'1'}]; const onSelectValue = (val: string) => { - const selectedData = data?.find((item) => item.pbnstRuseFcltPk === val); - if (selectedData) { - form.reset(selectedData); - setRuseOperData(fcltOperInfo.filter((item) => item.pbnstRuseFcltPk === val)); - } + }; @@ -128,7 +122,7 @@ export function PbnstMngForm({ data }: { data: ruseFcltType[] }) { selectArray={selectOptions} className={""} selectClass={selectClass} - onSelectValue={onSelectValue} + onSelectValue={()=>{}} {...field} /> )} @@ -177,13 +171,14 @@ export function PbnstMngForm({ data }: { data: ruseFcltType[] }) { </div> <div className="h-[200px] overflow-y-auto"> <UiTable - tableData={ruseOperData?ruseOperData:[]} + tableData={[]} headlist={pubMngUpHeadList} pageSize={100} total={-1} headName={""} - cellClick={() => {}} - > + cellClick={() => { } } onPageChange={function (page: number): void { + throw new Error("Function not implemented."); + } } > {nodeList} </UiTable> </div> diff --git a/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx b/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx index 147320992..88d7638cf 100644 --- a/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/rainReg/rainRegForm.tsx @@ -12,11 +12,11 @@ import { Form, FormField, SelectBox } from "@common/business_components/ui"; import { Button, Input } from "@common/components/ui"; import { zodResolver } from "@hookform/resolvers/zod"; import { useEffect, useState } from "react"; -import { useForm, type UseFormReturn } from "react-hook-form"; +import { useForm, useWatch, type UseFormReturn } from "react-hook-form"; import { z } from "zod"; import BdstReg from "../bdstReg/bdstReg"; -export function RainRegForm({ +export default function RainRegForm({ rainForm, isModal, }: { @@ -25,7 +25,6 @@ export function RainRegForm({ }) { const { code, rainReg, rainUpdate, rain } = useWrStore((state) => state); const { rainFcltCd } = code; - const defaultValues: z.infer<typeof rainZod> = rainZod.parse({}); const form = useForm<z.infer<typeof rainZod>>({ @@ -33,11 +32,13 @@ export function RainRegForm({ defaultValues: defaultValues, }); + const [grntchBdstCertYn, instlCstSprtYn, filtrTrtmfctYn] = form.watch([ + "reuseBuilding.0.grntchBdstCertYn", + "reuseBuilding.0.instlCstSprtYn", + "reuseBuilding.0.rainyObj.filtrTrtmfctYn", + ]); - - - - function cleanRainData(raw: any): z.infer<typeof rainZod> { + const cleanRainData =(raw: any): z.infer<typeof rainZod> =>{ return { ...raw, frstArchPrmsnDt: new Date(raw?.frstArchPrmsnDt||null), @@ -56,7 +57,19 @@ export function RainRegForm({ }; } +useEffect(() =>{ + if(grntchBdstCertYn ==='N'){ + form.setValue('reuseBuilding.0.grntchBdstCertYr' ,"" ) + form.setValue('reuseBuilding.0.grntchBdstCertNo' ,"" ) + form.setValue('reuseBuilding.0.grntchBdstCertGrd' ,"" ) + }else if(instlCstSprtYn ==='N'){ + form.setValue('reuseBuilding.0.instlCstSprtAmt' ,0 ) + }else if(filtrTrtmfctYn ==='N'){ + form.setValue('reuseBuilding.0.rainyObj.filtrTrtmfctCpct' ,0 ) + form.setValue('reuseBuilding.0.rainyObj.filtrTrtmfctPrs' ,"" ) + } +},[grntchBdstCertYn,instlCstSprtYn ,filtrTrtmfctYn]) // form 값이 변경될 때마다 로그 출력 @@ -65,23 +78,21 @@ export function RainRegForm({ return () => subscription.unsubscribe(); }, [form]); - - - - function onSubmit(values: z.infer<typeof rainZod>) { - - if (isModal) { - - rainReg(values); - } else { - rainUpdate(values); - } - } - useEffect(() => { console.log("form errors:", form.formState.errors); }, [form.formState.errors]); + + + + const onSubmit =(values: z.infer<typeof rainZod>)=> { + if (isModal) { + rainReg(values); + } else { + rainUpdate(values); + } + } + useEffect(() => { if(rainZod) @@ -89,6 +100,9 @@ export function RainRegForm({ }, [rainForm]); + + + return ( <div className=""> <Form {...form}> @@ -147,7 +161,7 @@ export function RainRegForm({ <Input className="" placeholder="1,000,000" - type="" + type="number" value={field.value ?? 0} onChange={(e) => { field.onChange(e.target.value === "" ? "" : Number(e.target.value)); @@ -195,7 +209,7 @@ export function RainRegForm({ <Input className="" placeholder="1,000,000" - type="" + type="number" value={field.value ?? 0} onChange={(e) => field.onChange(Number(e.target.value))} /> @@ -236,9 +250,10 @@ export function RainRegForm({ <Input className="" placeholder="1,000,000" - type="" + type="number" value={field.value ?? 0} onChange={(e) => field.onChange(Number(e.target.value))} + readOnly={filtrTrtmfctYn!=='Y'} /> </FormUi> @@ -257,6 +272,7 @@ export function RainRegForm({ type="" value={field.value ?? ""} onChange={field.onChange} + readOnly={filtrTrtmfctYn!=='Y'} /> </FormUi> )} @@ -285,6 +301,7 @@ export function RainRegForm({ selectArray={code.yn} onSelectValue={field.onChange} value={field.value ?? code.yn[0]?.val} + /> </FormUi> )} @@ -299,12 +316,13 @@ export function RainRegForm({ <Input className="" placeholder="1,000,000" - type="" + type="number" onChange={(e) => { const value = e.target.value; field.onChange(value === "" ? "" : Number(value)); }} value={field.value ?? 0} + readOnly={instlCstSprtYn!=='Y'} /> </FormUi> )} @@ -341,7 +359,9 @@ export function RainRegForm({ render={({ field }) => ( <FormUi label="인증년도"> <Input className="" placeholder="2024" type="" value={field.value ?? ""} - onChange={field.onChange} /> + onChange={field.onChange} + + readOnly={grntchBdstCertYn!=='Y'}/> </FormUi> )} /> @@ -358,6 +378,7 @@ export function RainRegForm({ type="" value={field.value ?? ""} onChange={field.onChange} + readOnly={grntchBdstCertYn!=='Y'} /> </FormUi> )} @@ -370,7 +391,9 @@ export function RainRegForm({ render={({ field }) => ( <FormUi label="인증등급"> <Input className="" placeholder="A" type="" value={field.value ?? ""} - onChange={field.onChange}/> + onChange={field.onChange} + readOnly={grntchBdstCertYn!=='Y'} + /> </FormUi> )} /> diff --git a/apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx b/apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx index d730cb9fd..11dccc189 100644 --- a/apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx +++ b/apps/wr/components/ui/form/fcltReg/rswtrReg/rswtrRegForm.tsx @@ -9,8 +9,8 @@ import { } from "@common/business_components/ui"; import { Button, Input } from "@common/components/ui"; import { zodResolver } from "@hookform/resolvers/zod"; -import { useFieldArray, useForm } from "react-hook-form"; -import { number, z } from "zod"; +import { useForm } from "react-hook-form"; +import { z } from "zod"; import { useWrStore } from "@/app/store"; import { selectClass } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { @@ -20,7 +20,7 @@ import { import { useEffect } from "react"; import BdstReg from "../bdstReg/bdstReg"; -export function RswtrRegForm({ +export default function RswtrRegForm({ rswtForm, isModal, }: { @@ -39,29 +39,20 @@ export function RswtrRegForm({ }) - // 2. Define a submit handler. - async function onSubmit(values: z.infer<typeof rswtZod>) { - // Do something with the form values. - // ✅ This will be type-safe and validated. - console.log(values); - + const [grntchBdstCertYn, instlCstSprtYn,filtrTrtmfctProcs] = form.watch([ + "reuseBuilding.0.grntchBdstCertYn", + "reuseBuilding.0.instlCstSprtYn", + "reuseBuilding.0.rswtrObj.filtrTrtmfctProcs", + ]); + const onSubmit =(values: z.infer<typeof rswtZod>) => { if (isModal) { - // regRainForm.bdstInfoPk = null; - await rswtReg(values); + rswtReg(values); } else { rswtUpdate(values); } - } - - const onSelectValue = (val: string | number) => { - console.log(val); - - }; - - - function cleanRswtData(raw: any): z.infer<typeof rswtZod> { + const cleanRswtData = (raw: any): z.infer<typeof rswtZod> =>{ return { ...raw, frstArchPrmsnDt: new Date(raw?.frstArchPrmsnDt||null), @@ -81,9 +72,29 @@ export function RswtrRegForm({ } +useEffect(() => { + console.log("form errors:", form.formState.errors); +}, [form.formState.errors]); + + + +useEffect(() =>{ + + console.log("filtrTrtmfctProcs ", filtrTrtmfctProcs) + if(grntchBdstCertYn ==='N'){ + form.setValue('reuseBuilding.0.grntchBdstCertYr' ,"" ) + form.setValue('reuseBuilding.0.grntchBdstCertNo' ,"" ) + form.setValue('reuseBuilding.0.grntchBdstCertGrd' ,"" ) + }else if(instlCstSprtYn ==='N'){ + form.setValue('reuseBuilding.0.instlCstSprtAmt' ,0 ) + } +},[grntchBdstCertYn,instlCstSprtYn,filtrTrtmfctProcs ]) + + + + useEffect(() => { if(rswtZod) - console.log("rswtForm", rswtForm); form.reset( cleanRswtData(rswtForm)) }, [rswtForm]); @@ -98,7 +109,7 @@ useEffect(() => { <h1 className="pl-3 text-xl col-span-10"> ○ 중수도 시설 정보 </h1> - <Button type="submit" className="mr-4 rounded-lg col-span-2"> + <Button size={"sm"} type="submit" className="col-start-12 col-span-1"> 저장 </Button> </div> @@ -151,7 +162,7 @@ useEffect(() => { <Input className="" placeholder="1,000,000" - type="text" + type="number" value={field.value ?? ""} onChange={(e) => field.onChange(Number(e.target.value))} /> @@ -170,7 +181,7 @@ useEffect(() => { <Input className="" placeholder="1,000,000" - type="" + type="number" value={field.value ?? 0} onChange={(e) => field.onChange(Number(e.target.value))} /> @@ -188,7 +199,7 @@ useEffect(() => { <Input className="" placeholder="1,000,000" - type="text" + type="number" value={field.value ?? 0} onChange={(e) => field.onChange(Number(e.target.value))} /> @@ -277,11 +288,12 @@ useEffect(() => { <Input className="" placeholder="1,000,000" - type="" - value={field.value ?? ""} + type="number" + value={field.value ?? 0} onChange={(e) => { field.onChange(Number(e.target.value)); }} + readOnly={instlCstSprtYn!=='Y'} /> </FormUi> )} @@ -320,10 +332,11 @@ useEffect(() => { <Input className="" placeholder="2024" - type="" + type="text" {...field} value={field.value ?? ""} onChange={field.onChange} + readOnly={grntchBdstCertYn!=='Y'} /> </FormUi> )} @@ -341,6 +354,8 @@ useEffect(() => { type="" value={field.value ?? ""} onChange={field.onChange} + readOnly={grntchBdstCertYn!=='Y'} + /> </FormUi> )} @@ -358,6 +373,8 @@ useEffect(() => { type="" value={field.value ?? ""} onChange={field.onChange} + readOnly={grntchBdstCertYn!=='Y'} + /> </FormUi> )} diff --git a/apps/wr/components/ui/modal/bdstRegModal/bdstRegModal.tsx b/apps/wr/components/ui/modal/bdstRegModal/bdstRegModal.tsx index 11c8f04f2..308c01241 100644 --- a/apps/wr/components/ui/modal/bdstRegModal/bdstRegModal.tsx +++ b/apps/wr/components/ui/modal/bdstRegModal/bdstRegModal.tsx @@ -8,13 +8,13 @@ import { import { ScrollArea, SelectBox, UiTable } from "@common/business_components"; import { Button, Input, Label } from "@common/components"; import { useEffect, useState } from "react"; -import { RainRegForm } from "../../form/fcltReg/rainReg/rainRegForm"; +import RainRegForm from "../../form/fcltReg/rainReg/rainRegForm"; import { type selectArray } from "@/app/store/common/code"; import { getCity, tableData } from "@/components/lib/func/commom"; import type { customRswtBdst } from "@/app/store/ruseFcltMng/fcltReg/rswtReg"; -import { HtdflRegForm } from "../../form/fcltReg/htdflReg/htdflRegForm"; +import HtdflRegForm from "../../form/fcltReg/htdflReg/htdflRegForm"; import type { customHtdflBdst } from "@/app/store/ruseFcltMng/fcltReg/htdflReg"; -import {RswtrRegForm} from "../../form/fcltReg/rswtrReg/rswtrRegForm"; +import RswtrRegForm from "../../form/fcltReg/rswtrReg/rswtrRegForm"; export type objSearchType = { sgg: string|number; @@ -144,7 +144,7 @@ export function BdstReg<T extends MoType>({ moType }: BdstRegProps<T>) { { moType === 'RNB'? <RainRegForm rainForm={rainBdstForm as customRainBdst} isModal={true} /> :moType==='RST' - ? <RswtrRegForm rswtForm={rainBdstForm as customRswtBdst} isModal={true} /> + ? <RswtrRegForm rswtForm={rainBdstForm as customRswtBdst} isModal={true}></RswtrRegForm> :<HtdflRegForm htdflForm={rainBdstForm as unknown as customHtdflBdst} isModal={true}></HtdflRegForm> } diff --git a/apps/wr/components/ui/modal/headChModal/headChModal.tsx b/apps/wr/components/ui/modal/headChModal/headChModal.tsx index da4e090ae..979834dbb 100644 --- a/apps/wr/components/ui/modal/headChModal/headChModal.tsx +++ b/apps/wr/components/ui/modal/headChModal/headChModal.tsx @@ -1,36 +1,43 @@ import { useWrStore } from "@/app/store"; -import { pbnSttHeadList } from "@/app/store/ruseFcltMng/fcltSttn/pbnstSttn"; +import type { TableProps } from "@/app/store/ruseFcltMng/fcltReg/pbnstReg"; +import type { TableTripleProps } from "@/app/store/ruseFcltMng/fcltReg/rainReg"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "@common/business_components/ui"; import { Button, Checkbox } from "@common/components/ui"; import { zodResolver } from "@hookform/resolvers/zod"; +import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; -export default function HeadChModal() { - const { pbnStt } = useWrStore((state) => state); +export default function HeadChModal({type }:{type: string }) { + const { sttnCommon ,chSttnHead} = useWrStore((state) => state); - - const items = pbnSttHeadList.map(item => ({id:item.id, label:item.title})); - + const { rainSttHeadList,pbnSttHeadList } =sttnCommon; + let items = rainSttHeadList.map(item => ({id:item.id, label:item.title})); - const FormSchema = z.object({ - items: z.array(z.string()).refine((value) => value.some((item) => item), { - message: "You have to select at least one item.", + data: z.array(z.string()).refine((value) => value.some((item) => item), { + message: "최소한 하나를 선택해주시길 바랍니다.", + }), }) const form = useForm<z.infer<typeof FormSchema>>({ resolver: zodResolver(FormSchema), - }) + defaultValues: { + data: [], + }, + }) + const onSubmit = (val : z.infer<typeof FormSchema>) =>{ - console.log(val) + if(val?.data.length > 0) + chSttnHead(val?.data, 'rain') + } return ( @@ -40,21 +47,20 @@ export default function HeadChModal() { <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8"> <FormField control={form.control} - name="items" + name="data" render={() => ( <FormItem> <div className="mb-4"> - <FormLabel className="text-base">Sidebar</FormLabel> - <FormDescription> - Select the items you want to display in the sidebar. - </FormDescription> + <FormLabel className="text-2xl"> 조회항목 설정</FormLabel> + </div> {items.map((item) => ( <FormField key={item.id} control={form.control} - name="items" - render={({ field }) => { + name="data" + render={({ field }) => + { return ( <FormItem key={item.id} @@ -63,7 +69,9 @@ export default function HeadChModal() { <FormControl> <Checkbox checked={field.value?.includes(item.id)} - onCheckedChange={(checked) => { + onCheckedChange={(checked) => + + { return checked ? field.onChange([...field.value, item.id]) : field.onChange( @@ -71,10 +79,12 @@ export default function HeadChModal() { (value) => value !== item.id ) ); - }} + } + + } /> </FormControl> - <FormLabel className="text-sm font-normal"> + <FormLabel className="text-xl"> {item.label} </FormLabel> </FormItem> @@ -86,7 +96,7 @@ export default function HeadChModal() { </FormItem> )} /> - <Button type="submit">Submit</Button> + <Button type="submit">항목 표출 변경</Button> </form> </Form> </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 0f14c211e..b9e341279 100644 --- a/packages/common/business_components/src/ui/dialog_ui/index.tsx +++ b/packages/common/business_components/src/ui/dialog_ui/index.tsx @@ -1,5 +1,4 @@ -import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTrigger } from "@common/components"; -import { useState } from "react"; +import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader } from "@common/components"; type ModalType = { bodyClass: string; diff --git a/packages/common/business_components/src/ui/search_form/index.tsx b/packages/common/business_components/src/ui/search_form/index.tsx index 3bcd94171..b7588903c 100644 --- a/packages/common/business_components/src/ui/search_form/index.tsx +++ b/packages/common/business_components/src/ui/search_form/index.tsx @@ -1,7 +1,7 @@ function SearchDiv ({children}:{ children: React.ReactNode; }) { return ( <div className="flex card card-border !mt-6"> - {children} + {children} </div> ) } 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 950306231..448f2df04 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 @@ -1,11 +1,275 @@ -import React from 'react' +import React, { useState } from 'react'; +import type { SelectDataType } from '../search_input_select'; +import { SelectBox } from '../select'; -function SearchFormLeft(props: {children: React.ReactNode}) { +/** + * 검색 폼 왼쪽 컴포넌트 타입 + * + * @param isShowPart 구분 조회 여부 + * @param children 자식 컴포넌트 + * @param selectSidoData 시도 데이터 + * @param selectSigunData 시군구 데이터 + * @param selectRegionData 유역 데이터 + * @param selectUnitWaterShedData 단위유역 데이터 + * @param selectMiddleRegionData 중권역 데이터 + * @param selectEnvPartData 환경청 데이터 + * @param selectEnvPartSidoData 환경청 시도 데이터 + * @param selectEnvPartSigunData 환경청 시군구 데이터 + * @param setRtnPartValue 부분 값 변경 핸들러 + */ +type SearchFormLeftProps = { + isShowPart?: boolean | undefined; + children: React.ReactNode; + selectSidoData?: SelectDataType[] | []; + selectSigunData?: SelectDataType[] | []; + selectRegionData?: SelectDataType[] | []; + selectUnitWaterShedData?: SelectDataType[] | []; + selectMiddleRegionData?: SelectDataType[] | []; + selectEnvPartData?: EnvPartSelectDataType[] | []; + selectEnvPartSidoData?: SelectDataType[] | []; + selectEnvPartSigunData?: SelectDataType[] | []; + + setRtnPartValue?: (value: string) => void; + setRtnSidoValue?: (value: string) => void; + setRtnSigunValue?: (value: string) => void; + setRtnRegionValue?: (value: string) => void; + setRtnUnitWaterShedValue?: (value: string) => void; + setRtnMiddleRegionValue?: (value: string) => void; + setRtnEnvPartValue?: (value: string) => void; + setRtnEnvPartSidoValue?: (value: string) => void; + setRtnEnvPartSigunValue?: (value: string) => void; +} + +type EnvPartSelectDataType = SelectDataType & { + adstDliStrCd: string, +} + +const selectPartData:SelectDataType[] = [ + { text: "행정별", val: '0' }, + { text: "유역별", val: '01' }, + { text: "환경청별", val: '02' }, +]; + +function SearchFormLeft({ isShowPart = false, children, selectSidoData = [], selectSigunData = [], selectRegionData = [], selectUnitWaterShedData = [], selectMiddleRegionData = [], selectEnvPartData = [], setRtnPartValue, setRtnSidoValue, setRtnSigunValue, setRtnRegionValue, setRtnUnitWaterShedValue, setRtnMiddleRegionValue, setRtnEnvPartValue, setRtnEnvPartSidoValue, setRtnEnvPartSigunValue }: SearchFormLeftProps) { + const [partValue, setPartValue] = useState<string>('0'); + const [showPart, setShowPart] = useState<string>(''); + const [sidoValue, setSidoValue] = useState<string>('0'); + const [sigunValue, setSigunValue] = useState<string>('0'); + const [regionValue, setRegionValue] = useState<string>('0'); + const [unitWaterShedValue, setUnitWaterShedValue] = useState<string>('0'); + const [middleRegionValue, setMiddleRegionValue] = useState<string>('0'); + const [envPartValue, setEnvPartValue] = useState<string>('0'); + const [envPartSidoValue, setEnvPartSidoValue] = useState<string>('0'); + const [envPartSigunValue, setEnvPartSigunValue] = useState<string>('0'); + + const [filteredSigunData, setFilteredSigunData] = useState<SelectDataType[]>([{ text: "전체", val: '0' }]); + const [filteredUnitWaterShedData, setFilteredUnitWaterShedData] = useState<SelectDataType[]>([{ text: "전체", val: '0' }]); + const [filteredMiddleRegionData, setFilteredMiddleRegionData] = useState<SelectDataType[]>([{ text: "전체", val: '0' }]); + + const [filteredEnvPartData, setFilteredEnvPartData] = useState<EnvPartSelectDataType[]>([{ text: "전체", val: '0', adstDliStrCd:'' }]); + const [filteredEnvPartSidoData, setFilteredEnvPartSidoData] = useState<EnvPartSelectDataType[]>([{ text: "전체", val: '0', adstDliStrCd:'' }]); + const [filteredEnvPartSigunData, setFilteredEnvPartSigunData] = useState<SelectDataType[]>([{ text: "전체", val: '0' }]); + + const [filteredEnvPartSigunDataSelected, setFilteredEnvPartSigunDataSelected] = useState<SelectDataType[]>([]); + + // 시군구 세팅 + const initializeSigunData = (sidoCd: string) => { + if (sidoCd === '0') { + setSigunValue('0'); + setFilteredSigunData([{ text: "전체", val: '0' }]); + } else { + const newFilteredData = [ + { text: "전체", val: '0' }, + ...selectSigunData.filter((item: SelectDataType) => item.val.substring(0, 2) === sidoCd) + ]; + setSigunValue('0'); + setFilteredSigunData(newFilteredData); + } + } + + // 단위유역 세팅 + const initializeUnitWaterShedData = (regionCd: string) => { + if(regionCd === '0') { + setUnitWaterShedValue('0'); + setFilteredUnitWaterShedData([{ text: "전체", val: '0' }]); + } else { + const newFilteredData = [ + { text: "전체", val: '0' }, + ...selectUnitWaterShedData.filter((item: SelectDataType) => item.val.substring(0, 1) === regionCd) + ]; + setUnitWaterShedValue('0'); + setFilteredUnitWaterShedData(newFilteredData); + } + } + + // 중권역 세팅 + const initializeMiddleRegionData = (unitWaterShedCd: string) => { + if(unitWaterShedCd === '0') { + setMiddleRegionValue('0'); + setFilteredMiddleRegionData([{ text: "전체", val: '0' }]); + } else { + const newFilteredData = [ + { text: "전체", val: '0' }, + ...selectMiddleRegionData.filter((item: SelectDataType) => item.val.substring(0, 2) === unitWaterShedCd) + ]; + setMiddleRegionValue('0'); + setFilteredMiddleRegionData(newFilteredData); + } + } + + // 환경청 세팅 - 시도 + const initializeCityDataByEnvPartSido = (envPartCd: string) => { + const foundEnvPart = selectEnvPartData.find((item: EnvPartSelectDataType) => item.val === envPartCd); + const cityArray = foundEnvPart?.adstDliStrCd.toString().split('|').join('').split(','); + + // 시군구 데이터 + const envSigunData = selectSigunData.filter((item: SelectDataType) => cityArray?.includes(item.val)); + + // 환경청 시도 데이터 + const sidoArray = [...new Set(envSigunData.map((item: SelectDataType) => item.val.substring(0, 2)))]; + const envSidoData = selectSidoData.filter((item: SelectDataType) => sidoArray?.includes(item.val)); + setFilteredEnvPartSigunDataSelected(envSigunData); + + setFilteredEnvPartSidoData([ + { text: "전체", val: '0', adstDliStrCd:'' }, + ...envSidoData.map((item: SelectDataType) => ({ text: item.text, val: item.val, adstDliStrCd:'' })) + ]); + } + + // 환경청 세팅 - 시군구 + const initializeCityDataByEnvPartSigun = (sidoCd: string) => { + const envSigunData = filteredEnvPartSigunDataSelected.filter((item: SelectDataType) => item.val.substring(0, 2) === sidoCd); + setFilteredEnvPartSigunData([ + { text: "전체", val: '0'}, + ...envSigunData.map((item: SelectDataType) => ({ text: item.text, val: item.val })) + ]); + } + + const onSelectValue = (val: string, type: string) => { + switch(type) { + case 'part': + setPartValue(val); + if (setRtnPartValue) { + setRtnPartValue(val); + } + // 구분 + if(val == '01') { + setShowPart('01'); + initializeMiddleRegionData('0'); + initializeUnitWaterShedData('0'); + } else if(val == '02') { + setShowPart('02'); + setFilteredEnvPartData([ + { text: "전체", val: '0', adstDliStrCd:'' }, + ...selectEnvPartData.filter((item: EnvPartSelectDataType) => item.val !== null && item.adstDliStrCd !== '') + ]); + setEnvPartValue('0'); + initializeCityDataByEnvPartSido('0'); + } else { + setShowPart('0'); + initializeSigunData('0'); + onSelectValue(selectSigunData[0]?.val || '0', 'sigun'); + } + + // 다른 selectbox 전체로 초기화 + onSelectValue(selectSidoData[0]?.val || '0', 'sido'); + onSelectValue(selectSigunData[0]?.val || '0', 'sigun'); + break; + case 'sido': + setSidoValue(val); + if (setRtnSidoValue) { + setRtnSidoValue(val); + } + initializeSigunData(val); + onSelectValue(selectSigunData[0]?.val || '0', 'sigun'); + break; + case 'sigun': + if (setRtnSigunValue) { + setRtnSigunValue(val); + } + setSigunValue(val); + break; + + // 유역 세팅 + case 'region' : + setRegionValue(val); + if (setRtnRegionValue) { + setRtnRegionValue(val); + } + initializeUnitWaterShedData(val); + onSelectValue(selectUnitWaterShedData[0]?.val || '0', 'unitWaterShed'); + break; + case 'unitWaterShed' : + setUnitWaterShedValue(val); + if (setRtnUnitWaterShedValue) { + setRtnUnitWaterShedValue(val); + } + initializeMiddleRegionData(val); + onSelectValue(selectMiddleRegionData[0]?.val || '0', 'middleRegion'); + break; + case 'middleRegion' : + setMiddleRegionValue(val); + if (setRtnMiddleRegionValue) { + setRtnMiddleRegionValue(val); + } + break; + + // 환경청 세팅 + case 'envPart' : + setEnvPartValue(val); + if (setRtnEnvPartValue) { + setRtnEnvPartValue(val); + } + initializeCityDataByEnvPartSido(val); + onSelectValue(filteredEnvPartSidoData[0]?.val || '0', 'envPartSido'); + break; + case 'envPartSido' : + setEnvPartSidoValue(val); + if (setRtnEnvPartSidoValue) { + setRtnEnvPartSidoValue(val); + } + initializeCityDataByEnvPartSigun(val); + onSelectValue(filteredEnvPartSigunData[0]?.val || '0', 'envPartSigun'); + break; + case 'envPartSigun' : + setEnvPartSigunValue(val); + if (setRtnEnvPartSigunValue) { + setRtnEnvPartSigunValue(val); + } + break; + } + } + return ( - <div className="grid grid-cols-12 gap-4 w-4/5 mx-4"> - {props.children} + isShowPart ? ( + <div className="grid grid-cols-12 gap-5 w-11/12 m-4"> + <SelectBox className="col-span-3" label={'구분'} selectArray={selectPartData} onSelectValue={(val) => onSelectValue(val.toString(), 'part')} value={partValue} selectClass={undefined}/> + {showPart === '01' ? ( + <> + <SelectBox className="col-span-3" label={'유역'} selectArray={selectRegionData} onSelectValue={(val) => onSelectValue(val.toString(), 'region')} value={regionValue} selectClass={undefined}/> + <SelectBox className="col-span-3" label={'단위유역'} selectArray={filteredUnitWaterShedData} onSelectValue={(val) => onSelectValue(val.toString(), 'unitWaterShed')} value={unitWaterShedValue} selectClass={undefined}/> + <SelectBox className="col-span-3" label={'중권역'} selectArray={filteredMiddleRegionData} onSelectValue={(val) => onSelectValue(val.toString(), 'middleRegion')} value={middleRegionValue} selectClass={undefined}/> + </> + ) : showPart === '02' ? ( + <> + <SelectBox className="col-span-3" label={'환경청'} selectArray={filteredEnvPartData} onSelectValue={(val) => onSelectValue(val.toString(), 'envPart')} value={envPartValue} selectClass={undefined}/> + <SelectBox className="col-span-3" label={'시도'} selectArray={filteredEnvPartSidoData} onSelectValue={(val) => onSelectValue(val.toString(), 'envPartSido')} value={envPartSidoValue} selectClass={undefined}/> + <SelectBox className="col-span-3" label={'시군구'} selectArray={filteredEnvPartSigunData} onSelectValue={(val) => onSelectValue(val.toString(), 'envPartSigun')} value={envPartSigunValue} selectClass={undefined}/> + </> + ) : ( + <> + <SelectBox className="col-span-3" label={'시도'} selectArray={selectSidoData} onSelectValue={(val) => onSelectValue(val.toString(), 'sido')} value={sidoValue} selectClass={undefined}/> + <SelectBox className="col-span-3" label={'시군구'} selectArray={filteredSigunData} onSelectValue={(val) => onSelectValue(val.toString(), 'sigun')} value={sigunValue} selectClass={undefined}/> + </> + )} + {children} </div> + ) : ( + <div className="grid grid-cols-12 gap-5 w-11/12 m-4"> + {children} + </div> + ) ) } -export { SearchFormLeft }; \ No newline at end of file +export { SearchFormLeft }; diff --git a/packages/common/business_components/src/ui/search_form_left/searchFormLeft.md b/packages/common/business_components/src/ui/search_form_left/searchFormLeft.md new file mode 100644 index 000000000..18b95b13f --- /dev/null +++ b/packages/common/business_components/src/ui/search_form_left/searchFormLeft.md @@ -0,0 +1,325 @@ +## SearchFormLeft 모듈 +#### 검색영역 좌측 모듈로 행정별, 유역별, 환경청을 선택했을 때 검색 영역을 세팅해주고 childnode를 붙여서 출력해주는 모듈 +#### 1. 컴포넌트 호출방법 +```js +import { SearchFormLeft } from "@common/business_components"; +..... +<SearchFormLeft + isShowPart={true} + selectSidoData={selectSidoData} + selectSigunData={selectSigunData} + selectRegionData={selectRegionData} + selectUnitWaterShedData={selectUnitWaterShedData} + selectMiddleRegionData={selectMiddleRegionData} + selectEnvPartData={selectEnvPartData} + selectEnvPartSidoData={selectEnvPartSidoData} + selectEnvPartSigunData={selectEnvPartSigunData} + setRtnPartValue={(value) => { + setPartValue(value); + }} + setRtnSidoValue={(value) => { + setSidoValue(value); + }} + setRtnSigunValue={(value) => { + setSigunValue(value); + }} + setRtnRegionValue={(value) => { + setRegionValue(value); + }} + setRtnUnitWaterShedValue={(value) => { + setUntitWaterShedValue(value); + }} + setRtnMiddleRegionValue={(value) => { + setMiddleRegionValue(value); + }} + setRtnEnvPartValue={(value) => { + setEnvPartValue(value); + }} + setRtnEnvPartSidoValue={(value) => { + setEnvPartSidoValue(value); + }} + setRtnEnvPartSigunValue={(value) => { + setEnvPartSigunValue(value); + }} +> +``` +  ㆍisShowPart : 검색단에서 구분(행정별,유역별,환경청별) 세팅 여부(보일 경우 : Y, 아닐경우 : N 혹은 미첨부) + +  ㆍselectSidoData : 전체 시도 데이터 + +  ㆍselectSigunData : 전체 시군구구 데이터 + +  ㆍselectRegionData : 전체 유역역 데이터 + +  ㆍselectUnitWaterShedData : 전체 단위유역 데이터 + +  ㆍselectMiddleRegionData : 전체 중권역 데이터 + +  ㆍselectEnvPartData : 환경청 전체 데이터 + +  ㆍsetRtnPartValue : 선택한 구분 set함수(조회시 페이지에서 사용) + +  ㆍsetRtnSidoValue : 선택한 시도 set함수(조회시 페이지에서 사용) + +  ㆍsetRtnSigunValue : 선택한 시군구 set함수(조회시 페이지에서 사용) + +  ㆍsetRtnRegionValue : 선택한 유역 set함수(조회시 페이지에서 사용) + +  ㆍsetRtnUnitWaterShedValue : 선택한 단위유역 set함수(조회시 페이지에서 사용) + +  ㆍsetRtnMiddleRegionValue : 선택한 중유역 set함수(조회시 페이지에서 사용) + +  ㆍsetRtnEnvPartValue : 선택한 환경청 set함수(조회시 페이지에서 사용) + +  ㆍsetRtnEnvPartSidoValue : 선택한 환경청의 시도 set함수(조회시 페이지에서 사용) + +  ㆍsetRtnEnvPartSidoValue : 선택한 환경청 시도의 시군구 set함수(조회시 페이지에서 사용) + +#### 2. 세팅방법 +```js +/** + * store - index.js + * ※ 업무파트별로 common/폴더에 스토어를 만들어놓는걸 추천! + * ※ fetch 구문은 각자가 개발 후 return 된 데이터 타입만 맞추면 된다. + */ + +// 시도 API 호출 함수 추가 +const fetchSidoData = async (): Promise<SelectDataType[]> => { + try { + const res = await getFetch('fo', '/addr/city', null); + const data = res.data; + selectSidoData = [ + { text: "전체", val: '0'}, + ...data.map((item: sidoDataType) => ({ + text: item.sido || '', + val: String(item.adstDstrCd) || '' + })) + ]; + return selectSidoData; + } catch (error) { + console.error('시도 데이터를 가져오는데 실패했습니다:', error); + return selectSidoData; + } +}; + +// 시군구 API 호출 함수 추가 +const fetchSigunData = async (): Promise<SelectDataType[]> => { + try { + const res = await getFetch('fo', '/addr/sgg', null); + const data = res.data; + selectSigunData = [ + { text: "전체", val: '0' }, + ...data + .map((item: sigunDataType) => ({ + text: item.gugun || '', + val: String(item.adstDstrCd) || '' + })) + ]; + return selectSigunData; + } catch (error) { + console.error('시군구 데이터를 가져오는데 실패했습니다:', error); + return selectSigunData; + } +}; + +// 권역 API 호출 함수 추가 +const fetchRegionData = async (): Promise<SelectDataType[]> => { + try { + const res = await getFetch('fo', '/addr/sarea', null); + const data = res.data; + return [ + { text: "전체", val: '0'}, + ...data.map((item: regionDataType) => ({ + text: item.rvbsn || '', + val: String(item.rvbsnCd) || '' + })) + ]; + } catch (error) { + console.error('권역 데이터를 가져오는데 실패했습니다:', error); + return selectRegionData; + } +}; + +// 중권역 API 호출 함수 추가 +const fetchMiddleRegionData = async (): Promise<SelectDataType[]> => { + try { + const res = await getFetch('fo', '/addr/midArea', null); + const data = res.data; + return [ + { text: "전체", val: '0' }, + ...data + .map((item: middleRegionDataType) => ({ + text: item.mdmbsn || '', + val: String(item.rvbsnCd) || '' + })) + ]; + } catch (error) { + console.error('중권역 데이터를 가져오는데 실패했습니다:', error); + return selectMiddleRegionData; + } +}; + +// 단위유역 API 호출 함수 추가 +const fetchUnitWaterShedData = async (): Promise<SelectDataType[]> => { + try { + const res = await getFetch('fo', '/addr/largeArea', null); + const data = res.data; + return [ + { text: "전체", val: '0' }, + ...data + .map((item: unitWaterShedDataType) => ({ + text: item.lgbsn || '', + val: String(item.rvbsnCd) || '' + })) + ]; + } catch (error) { + console.error('단위유역 데이터를 가져오는데 실패했습니다:', error); + return selectUnitWaterShedData; + } +}; + +// 환경청 데이터 +const fetchEnvPartData = async (): Promise<envPartSelectDataType[]> => { + try { + const res = await getFetch('fo', '/addr/govArea', null); + const data = res.data; + selectEnvPartData = [ + { text: "전체", val: '0', adstDliStrCd: '' }, + ...data + .map((item: envPartDataType) => ({ + text: item.lclgvrnmntNm || '', + val: String(item.lclgvrnmntCd) || '', + adstDliStrCd: item.adstDliStrCd || '' + })) + ]; + return selectEnvPartData; + } catch (error) { + console.error('환경청 데이터를 가져오는데 실패했습니다:', error); + return selectEnvPartData; + } +}; + +....... + +// 타입 및 state 반환 +export type CommonType = { + Common: { + isInit: boolean; + selectSidoData: SelectDataType[]; + selectSigunData: SelectDataType[]; + selectPartData: SelectDataType[]; + selectUpdownData: SelectDataType[]; + selectOperationData: SelectDataType[]; + selectFacilityPartData: SelectDataType[]; + selectSearchYear: SelectDataType[]; + selectUnitWaterShedData: SelectDataType[]; + selectRegionData: SelectDataType[]; + selectMiddleRegionData: SelectDataType[]; + selectEnvPartSidoData: SelectDataType[]; + selectEnvPartSigunData: SelectDataType[]; + selectFlowTerm: SelectDataType[]; + selectFlowPanel: SelectDataType[]; + selectEnvPartData: envPartSelectDataType[]; + } +} + +export const commonState:CommonType = { + Common: { + isInit: false, + selectSidoData: selectSidoData, + selectSigunData: selectSigunData, + selectPartData: selectPartData, + selectUpdownData: selectUpdownData, + selectOperationData: selectOperationData, + selectFacilityPartData: selectFacilityPartData, + selectSearchYear: selectSearchYear, + selectRegionData: selectRegionData, + selectUnitWaterShedData: selectUnitWaterShedData, + selectMiddleRegionData: selectMiddleRegionData, + selectEnvPartSidoData : selectEnvPartSidoData, + selectEnvPartSigunData : selectEnvPartSigunData, + selectFlowTerm: selectFlowTerm, + selectFlowPanel: selectFlowPanel, + selectEnvPartData : selectEnvPartData, + } +} + +..... + +// action export +export type CommonAction = { + initializeCommonData: () => Promise<void>; +} + +....... + +// reducer 세팅 +export const CommonReducer:(set:any)=>CommonAction=(set: any) => { + return { + // 시도 변경 이벤트 + initializeCommonData: async () => { + const promiseSet = await Promise.all([fetchSidoData(), fetchSigunData(), fetchRegionData(), fetchUnitWaterShedData(), fetchMiddleRegionData(), fetchEnvPartData()]); + const [sidoData, sggData, regionData, unitData, midData, envData] = promiseSet; + set((state: CommonType) => ({ + Common: { + ...state.Common, + selectSidoData: sidoData, + selectSigunData: sggData, + selectRegionData: regionData, + selectMiddleRegionData: midData, + selectUnitWaterShedData: unitData, + selectEnvPartData: envData + } + }) + )}, + } +} +``` +```js +/** + * page.tsx + */ + +....... + +// store에서 액션 호출 (각 페이지 유형별로 세팅) +const { + .... + ,initializeCommonData + .... +} = useFoStore((state) => state); + +....... + +// 데이터 반환 +const { + isInit, + selectPartData, + selectUpdownData, + selectOperationData, + selectFacilityPartData, + selectSidoData, + selectSigunData, + selectRegionData, + selectUnitWaterShedData, + selectMiddleRegionData, + selectEnvPartData, +} = Common; + +....... + +// 페이지 내에서 사용할 수 있게 state 설정 +const [partValue, setPartValue] = useState<string>("0"); +const [sidoValue, setSidoValue] = useState<string>("0"); +const [sigunValue, setSigunValue] = useState<string>("0"); +const [regionValue, setRegionValue] = useState<string>("0"); +const [untitWaterShedValue, setUntitWaterShedValue] = useState<string>("0"); +const [middleRegionValue, setMiddleRegionValue] = useState<string>("0"); +const [envPartValue, setEnvPartValue] = useState<string>("0"); +const [envPartSidoValue, setEnvPartSidoValue] = useState<string>("0"); +const [envPartSigunValue, setEnvPartSigunValue] = useState<string>("0"); + +<!-- 컴포넌트 호출 --> +``` + + diff --git a/packages/common/business_components/src/ui/search_form_right/index.tsx b/packages/common/business_components/src/ui/search_form_right/index.tsx index 676b90849..fda7eefd6 100644 --- a/packages/common/business_components/src/ui/search_form_right/index.tsx +++ b/packages/common/business_components/src/ui/search_form_right/index.tsx @@ -1,11 +1,11 @@ -import React from 'react' +import React from 'react'; function SearchFormRight(props: {children: React.ReactNode}) { return ( - <div className="w-1/5 mx-5 flex items-center justify-end space-x-2"> + <div className="w-1/12 mx-5 flex flex-col items-center justify-center space-x-2"> {props.children} </div> ) } -export { SearchFormRight }; \ No newline at end of file +export { SearchFormRight }; diff --git a/packages/common/business_components/src/ui/search_input/index.tsx b/packages/common/business_components/src/ui/search_input/index.tsx index bd634aa21..06ffce4ff 100644 --- a/packages/common/business_components/src/ui/search_input/index.tsx +++ b/packages/common/business_components/src/ui/search_input/index.tsx @@ -21,9 +21,9 @@ const SearchInput = React.forwardRef<HTMLInputElement, {className:string, label: return ( <div className={className+" flex items-center"} > - {label && <Label className="w-20 text-base text-gray-600">{label}</Label>} - <Input className="flex-1 ml-8 w-3/4 h-10 border rounded" value={textValue} onChange={changeText} onKeyUp={keyUp}></Input> + {label && <Label className="w-20 text-xl text-gray-600">{label}</Label>} + <Input className="!text-lg flex-1 w-3/4 h-14 border rounded" value={textValue} onChange={changeText} onKeyUp={keyUp}></Input> </div> ) }); -export { SearchInput }; \ No newline at end of file +export { SearchInput }; diff --git a/packages/common/business_components/src/ui/search_input_select/index.tsx b/packages/common/business_components/src/ui/search_input_select/index.tsx index 5a386b77b..bf8787356 100644 --- a/packages/common/business_components/src/ui/search_input_select/index.tsx +++ b/packages/common/business_components/src/ui/search_input_select/index.tsx @@ -24,12 +24,12 @@ const SearchInputSelect = React.forwardRef<HTMLInputElement, {className:string, return ( <div className={className+" flex items-center"} > - {label && <Label className="w-20 text-base text-gray-600">{label}</Label>} + {label && <Label className="w-20 text-xl text-gray-600">{label}</Label>} <div className="flex w-full items-center"> - <Input className="w-2/3 text-lg h-10 p-2 border rounded" value={textValue} onChange={changeText} /> + <Input className="w-2/3 text-xl h-14 p-2 border rounded" value={textValue} onChange={changeText} /> <Select onValueChange={onSelectValue} value={selectValue}> - <SelectTrigger className="ml-2 w-1/3 text-lg" > - <SelectValue placeholder={selectData?.[0]?.text ?? ""} /> + <SelectTrigger className="ml-2 w-1/3" > + <SelectValue placeholder={selectData?.[0]?.text ?? ""} /> </SelectTrigger> {/* <SelectContent ref={refs ? (refs as unknown as RefType)?.selectValue : null}> */} <SelectContent > @@ -42,4 +42,4 @@ const SearchInputSelect = React.forwardRef<HTMLInputElement, {className:string, </div> ) }); -export { SearchInputSelect }; \ No newline at end of file +export { SearchInputSelect }; diff --git a/packages/common/business_components/src/ui/select/index.tsx b/packages/common/business_components/src/ui/select/index.tsx index b03932256..ee6296677 100644 --- a/packages/common/business_components/src/ui/select/index.tsx +++ b/packages/common/business_components/src/ui/select/index.tsx @@ -23,7 +23,7 @@ const SelectBox = React.forwardRef< return ( <div className={className+" flex items-center"} ref={ref}> - {label && <Label className="w-20 text-base text-gray-600">{label}</Label>} + {label && <Label className="w-20 text-xl text-gray-600">{label}</Label>} <Select onValueChange={onSelectValue} value={value !== undefined ? String(value) : undefined}> <SelectTrigger className={selectClass?selectClass:"flex-1 p-2 border rounded"}> <SelectValue placeholder={placeHolder} /> @@ -38,4 +38,4 @@ const SelectBox = React.forwardRef< ) }) -export { SelectBox }; \ No newline at end of file +export { SelectBox }; diff --git a/packages/common/business_components/src/ui/select/lib/selectBox.tsx b/packages/common/business_components/src/ui/select/lib/selectBox.tsx index 08e3abed3..cc4bac4d1 100644 --- a/packages/common/business_components/src/ui/select/lib/selectBox.tsx +++ b/packages/common/business_components/src/ui/select/lib/selectBox.tsx @@ -1,6 +1,6 @@ -import * as React from "react" import * as SelectPrimitive from "@radix-ui/react-select" import { Check, ChevronDown, ChevronUp } from "lucide-react" +import * as React from "react" import { cn } from "../../../lib/utils" @@ -17,7 +17,7 @@ const SelectTrigger = React.forwardRef< <SelectPrimitive.Trigger ref={ref} className={cn( - "flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1", + "flex h-13 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-xl ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1", className )} {...props} @@ -103,7 +103,7 @@ const SelectLabel = React.forwardRef< >(({ className, ...props }, ref) => ( <SelectPrimitive.Label ref={ref} - className={cn("py-1.5 pl-8 pr-2 text-sm font-semibold", className)} + className={cn("py-1.5 pl-8 pr-2 text-lg font-semibold", className)} {...props} /> )) @@ -116,7 +116,7 @@ const SelectItem = React.forwardRef< <SelectPrimitive.Item ref={ref} className={cn( - "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", + "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-lg outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50", className )} {...props} @@ -145,14 +145,6 @@ const SelectSeparator = React.forwardRef< SelectSeparator.displayName = SelectPrimitive.Separator.displayName export { - Select, - SelectGroup, - SelectValue, - SelectTrigger, - SelectContent, - SelectLabel, - SelectItem, - SelectSeparator, - SelectScrollUpButton, - SelectScrollDownButton, + Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue } + diff --git a/packages/common/business_components/src/ui/table/index.tsx b/packages/common/business_components/src/ui/table/index.tsx index c8ba18765..f6da92d7f 100644 --- a/packages/common/business_components/src/ui/table/index.tsx +++ b/packages/common/business_components/src/ui/table/index.tsx @@ -51,7 +51,7 @@ export function UiTable({ tableData, headlist, pageSize, total, children, headNa </div> : <></>} <div className={`card !m-[1.2rem] !p-0r ${className}`}> <Table variant="secondary"> - <TableHeader > + <TableHeader className="font-bold"> {children ? <>{children}</> : <TableRow> {headlist?.map((head) => ( <TableHead key={head.id}>{head.title}</TableHead>