From e7a46ac3a23a8e716bebf4ad7e2292ce2b6ca92c Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 27 Jul 2025 14:43:42 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EB=85=84=EC=9B=94=20=EC=BA=98=EB=A6=B0?= =?UTF-8?q?=EB=8D=94=20=EB=85=84=20readonly=20=EC=98=B5=EC=85=98=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(not=20necessary)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business_components/src/ui/date_month_picker/index.tsx | 3 +++ .../src/ui/date_month_picker/mothPicker.tsx | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/common/business_components/src/ui/date_month_picker/index.tsx b/packages/common/business_components/src/ui/date_month_picker/index.tsx index 1b97d9ce1..a8da0ff0e 100644 --- a/packages/common/business_components/src/ui/date_month_picker/index.tsx +++ b/packages/common/business_components/src/ui/date_month_picker/index.tsx @@ -18,6 +18,7 @@ type MonthPickerProps = { selectClass?: string; readOnly?: boolean; startYear?: number; // 시작 연도 props 추가 + yearReadOnly?: boolean; }; // yyyyMM → Date 객체 @@ -39,6 +40,7 @@ export const DateMonthPicker = ({ selectClass, readOnly = false, startYear, + yearReadOnly = false, }: MonthPickerProps) => { const [open, setOpen] = useState(false); @@ -78,6 +80,7 @@ export const DateMonthPicker = ({ currentMonth={parsedDate} onMonthChange={handleSelect} startYear={startYear} + yearReadOnly={yearReadOnly} /> diff --git a/packages/common/business_components/src/ui/date_month_picker/mothPicker.tsx b/packages/common/business_components/src/ui/date_month_picker/mothPicker.tsx index 6afbde5e6..b5bc10ba5 100644 --- a/packages/common/business_components/src/ui/date_month_picker/mothPicker.tsx +++ b/packages/common/business_components/src/ui/date_month_picker/mothPicker.tsx @@ -29,9 +29,10 @@ export type MonthPickerProps = { shouldClosePopover?: boolean ) => void; startYear?: number; + yearReadOnly?: boolean; }; -export function MonthPicker({ currentMonth, onMonthChange, startYear }: MonthPickerProps) { +export function MonthPicker({ currentMonth, onMonthChange, startYear, yearReadOnly }: MonthPickerProps) { const today = startOfToday(); const currentYear = today.getFullYear(); @@ -73,6 +74,7 @@ const selectedYear = parseInt(yearFromProp);
{ setGubun(e.target.value); }} + /> */} + setReportGubun(String(val))} + selectContentClass="z-[101]" + labelClass='whitespace-nowrap text-xl text-gray-600 pr-2' /> + {/* 승인년도 필터 */} = ({ const [detailBizId, setDetailBizId] = useState(0); const [city, setCity] = useState(0); const [sgg, setSgg] = useState(0); - const [ctpvCd, setCtpvCd] = useState('0'); - const [sigungu, setSigungu] = useState('0'); - const [gubun, setGubun] = useState(""); // 하수정비기본계획 report + const [ctpvCd, setCtpvCd] = useState('0'); // 하수정비기본계획 report + const [sigungu, setSigungu] = useState('0'); // 하수정비기본계획 report + const [gubun, setGubun] = useState(""); // 하수정비기본계획 report + const [reportGubun, setReportGubun] = useState("0"); // 하수정비기본계획 report const [start1, setStart1] = useState(""); const [start2, setStart2] = useState(""); const [end1, setEnd1] = useState(""); @@ -83,6 +84,7 @@ const SearchModal: React.FC = ({ const [yearFilter, setYearFilter] = useState({ start: "", end: "" }); const [filteredSiguns, setFilteredSiguns] = useState([{ val: '0', text: '전체', sido: '0' }]); + // 하수정비기본계획 report const sidos = useCityCd(); const siguns = useSggCd(); const reportOriginData = useDcTree(""); //:Folder[] @@ -136,6 +138,7 @@ const SearchModal: React.FC = ({ setSgg(0); setCtpvCd('0'); setSigungu('0'); + setReportGubun('0'); setYearFilter({ start: "", end: "", @@ -293,6 +296,11 @@ const SearchModal: React.FC = ({ const sigunguOption = filteredSiguns.find((n) => n.val === sigungu); filterReportData = filterReportData.filter(item => item.sigungu === sigunguOption?.text); } + if (reportGubun !== "0") { // 보고서구분검색 + const reportGubunOption = reportGubuns.find((n) => n.val === reportGubun); + filterReportData = filterReportData.filter(item => item.reportGubun === reportGubunOption?.text); + } + if (yearFilter.start != "" && yearFilter.end == "") //승인년도검색 filterReportData = filterReportData.filter(item => (item.approvalYear) ? item.approvalYear >= yearFilter.start + "년" : null); if (yearFilter.start == "" && yearFilter.end != "") @@ -678,6 +686,8 @@ const SearchModal: React.FC = ({ ctpvCd={ctpvCd} sigungu={sigungu} filteredSiguns={filteredSiguns} + reportGubun={reportGubun} + setReportGubun={setReportGubun} yearFilter={yearFilter} handleSearch={handleSearch} handleCtpvCdChange={handleCtpvCdChange} diff --git a/apps/sn/app/(map-layout)/map/components/searchModalReportApi.ts b/apps/sn/app/(map-layout)/map/searchModal/searchModalReportApi.ts similarity index 90% rename from apps/sn/app/(map-layout)/map/components/searchModalReportApi.ts rename to apps/sn/app/(map-layout)/map/searchModal/searchModalReportApi.ts index 8cb349056..bcee09fdd 100644 --- a/apps/sn/app/(map-layout)/map/components/searchModalReportApi.ts +++ b/apps/sn/app/(map-layout)/map/searchModal/searchModalReportApi.ts @@ -31,6 +31,14 @@ const isYear = (value: string): boolean => { return /^[0-9]{4}년$/.test(value); }; +export const reportGubuns = [{val: '0', text: '전체'}, {val: '1', text: '보고서'} + , {val: '2', text: '요약보고서'} , {val: '3', text: '부록'}, {val: '4', text: '기타'}]; + +/** + * Flatten a hierarchical folder structure into a flat array. + * @param data - The hierarchical folder data to flatten. + * @returns An array of flattened folders with their paths and levels. + */ export function flattenFolders(data: Folder[]): FlattenedFolder[] { const result: FlattenedFolder[] = []; const exceptNodeNm = ["부분","통합","전체"]; @@ -165,12 +173,14 @@ export const getCityCd = async (): Promise => { if (!response.ok) throw new Error(`시도 데이터 오류: ${response.status}`); const res = await response.json(); const city = res.data; - const cityCd = city.map((item: any) => ({ + let citys:SelectDataType[] = city.map((item: {adstDstrCd:string, sido:string}) => ({ val: item.adstDstrCd, text: item.sido, })); - cityCd.unshift({ val: '0', text: '전체' }); - return cityCd; + citys = citys.sort((a:SelectDataType, b:SelectDataType) => a.text.localeCompare(b.text)); + citys.unshift({ val: '0', text: '전체' }); + console.log("citys:", citys); + return citys; } catch (error) { console.error('시도 데이터를 가져오는데 실패했습니다:', error); return [{ val: '0', text: '전체', sido: '0' }]; @@ -186,9 +196,9 @@ export const useSggCd = () => { if (result) { setData(result); } + console.log("useSggCd호출"); }; fetch(); - console.log("useSggCd호출"); }, []); return data; }; @@ -222,9 +232,9 @@ export const useCityCd = () => { if (result) { setData(result); } + console.log("useCityCd호출"); }; fetch(); - console.log("useCityCd호출"); }, []); return data; }; diff --git a/packages/common/business_components/src/ui/select/index.tsx b/packages/common/business_components/src/ui/select/index.tsx index 82db6da45..f9dac92d6 100644 --- a/packages/common/business_components/src/ui/select/index.tsx +++ b/packages/common/business_components/src/ui/select/index.tsx @@ -28,6 +28,7 @@ const SelectBox = React.forwardRef< value?: string | number; readOnly?: boolean; // readOnly 속성 추가 selectContentClass?: string; + labelClass?: string; } >( ( @@ -40,6 +41,7 @@ const SelectBox = React.forwardRef< value, readOnly = false, selectContentClass, + labelClass = "w-20 whitespace-nowrap text-xl text-gray-600", }, ref, ) => { @@ -66,7 +68,7 @@ const SelectBox = React.forwardRef< return (
{label && ( -