remove: GovSidoSigunguSearchForm 컴포넌트 삭제

This commit is contained in:
swcho
2025-08-04 18:38:34 +09:00
parent f82a392ef6
commit 3f039d34a9
@@ -1,360 +0,0 @@
import React, { useEffect, useState } from 'react';
import { SelectBox } from '@common/business_components/ui/select';
import { Label } from '@radix-ui/react-label';
export type comCodeState = {
code: {
isInit: boolean;
chBuCd: SelectDataType[]
rainFcltCd: SelectDataType[];
bdstUsgCd: SelectDataType[];
cityCd: SelectDataType[];
sggCd: SelectDataType[];
rvbsnCd: SelectDataType[];
mdmbsnCd: SelectDataType[];
lgbsnCd: SelectDataType[];
lclgvrnmntCd: EnvPartSelectDataType[];
orgwtKndCd: SelectDataType[];
yn: SelectDataType[];
buildingType: {
RST: string,
RNB: string,
HTB: string
}
};
};
type SelectDataType = {
text: string;
val: string;
sido?: string; // 시도 코드 (선택 사항)
}
type EnvPartSelectDataType = SelectDataType & {
adstDliStrCd: string,
}
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: { val: string, text: string }) => void; // setRtnEnvPartSigunValue prop 타입을 객체로 변경
resetTrigger?: boolean;
}
function GovSidoSigunguSearchForm({ isShowPart = false, children, selectSidoData = [], selectSigunData = [], selectRegionData = [], selectUnitWaterShedData = [], selectMiddleRegionData = [], selectEnvPartData = [], setRtnPartValue, setRtnSidoValue, setRtnSigunValue, setRtnRegionValue, setRtnUnitWaterShedValue, setRtnMiddleRegionValue, setRtnEnvPartValue, setRtnEnvPartSidoValue, setRtnEnvPartSigunValue, resetTrigger = false }: SearchFormLeftProps) {
//환경청별 시도 시군구
const [envPartValue, setEnvPartValue] = useState<string>('0');
const [envPartSidoValue, setEnvPartSidoValue] = useState<string>('0'); // 환경청 선택 시 시/도 값
const [envPartSigunValue, setEnvPartSigunValue] = useState<string>('0'); // 환경청 선택 시 시/군/구 값
const [filteredEnvPartSigunDataSelected, setFilteredEnvPartSigunDataSelected] = useState<SelectDataType[]>([]);
// API로부터 가져온 전체 데이터 목록 (필터링 전)
const [allEnvPartOptions, setAllEnvPartOptions] = useState<EnvPartSelectDataType[]>([]);
const [allSidoOptions, setAllSidoOptions] = useState<SelectDataType[]>([]);
const [allSigunOptions, setAllSigunOptions] = useState<SelectDataType[]>([]);
// 조회된 조건에 맞는 환경청 시도 시군 (SelectBox에 실제 사용될 데이터)
const [filteredEnvPartData, setFilteredEnvPartData] = useState<EnvPartSelectDataType[]>([{ text: "전체", val: '0', adstDliStrCd: '', sido: '0' }]);
const [filteredEnvPartSidoData, setFilteredEnvPartSidoData] = useState<EnvPartSelectDataType[]>([{ text: "전체", val: '0', adstDliStrCd: '', sido: '0' }]);
const [filteredEnvPartSigunData, setFilteredEnvPartSigunData] = useState<SelectDataType[]>([{ text: "전체", val: '0', sido: '0' }]);
// 시군구 데이터
const getSggCd = async (): Promise<SelectDataType[]> => {
try {
const response = await fetch('http://con.mind-one.co.kr:11082/api/v1/addr/sgg', { method: "GET", headers: { accept: "application/json" } });
if (!response.ok) throw new Error(`시군구 데이터 오류: ${response.status}`);
const res = await response.json();
const sgg = res.data;
const sggCd = sgg.map((item: any) => ({
val: item.adstDstrCd,
sido: item.sido,
text: item.gugun,
}));
sggCd.unshift({ val: '0', text: '전체' }); // "전체" 옵션 추가
return sggCd;
} catch (error) {
console.error('시군구 데이터를 가져오는데 실패했습니다:', error);
return [{ val: '0', text: '전체', sido: '0' }];
}
};
// 시도 데이터
const getCityCd = async (): Promise<SelectDataType[]> => {
try {
const response = await fetch('http://con.mind-one.co.kr:11082/api/v1/addr/city', { method: "GET", headers: { accept: "application/json" } });
if (!response.ok) throw new Error(`시도 데이터 오류: ${response.status}`);
const res = await response.json();
const city = res.data;
const cityCd = city.map((item: any) => ({
val: item.adstDstrCd,
text: item.sido,
}));
cityCd.unshift({ val: '0', text: '전체' });
return cityCd;
} catch (error) {
console.error('시도 데이터를 가져오는데 실패했습니다:', error);
return [{ val: '0', text: '전체', sido: '0' }];
}
};
// 환경청 데이터
const getEnvPartCd = async (): Promise<EnvPartSelectDataType[]> => {
try {
const response = await fetch('http://con.mind-one.co.kr:11082/api/v1/addr/govArea', { method: "GET", headers: { accept: "application/json" } });
if (!response.ok) throw new Error(`환경청 데이터 오류: ${response.status}`);
const res = await response.json();
const lclgvrnmnt = res.data.filter((item: { lclgvrnmntNm: string; }) => {
// item.lclgvrnmntNm이 null이나 undefined가 아닌지 확인 후 endsWith 사용
return item.lclgvrnmntNm && item.lclgvrnmntNm.endsWith("환경청");
});
const lclgvrnmntCd = lclgvrnmnt.map((item: any) => ({
val: item.lclgvrnmntCd,
text: item.lclgvrnmntNm,
adstDliStrCd: item.adstDliStrCd || ''
}));
lclgvrnmntCd.unshift({ val: '0', text: '전체', adstDliStrCd: '' });
return lclgvrnmntCd;
} catch (error) {
console.error('환경청 데이터를 가져오는데 실패했습니다:', error);
return [{ val: '0', text: '전체', adstDliStrCd: '', sido: '0' }];
}
};
useEffect(() => {
const loadInitialData = async () => {
const [envParts, sidos, siguns] = await Promise.all([
getEnvPartCd(),
getCityCd(),
getSggCd()
]);
setAllEnvPartOptions(envParts.filter(item => item.val !== '0'));
setFilteredEnvPartData(envParts);
setAllSidoOptions(sidos.filter(item => item.val !== '0'));
// 초기 filteredEnvPartSidoData는 모든 시/도를 포함 (환경청 "전체" 선택 시)
setFilteredEnvPartSidoData(sidos.map(s => ({ ...s, adstDliStrCd: '' })));
setAllSigunOptions(siguns.filter(item => item.val !== '0'));
// 초기 filteredEnvPartSigunData는 모든 시/군/구를 포함 (환경청 "전체", 시/도 "전체" 선택 시)
setFilteredEnvPartSigunData(siguns);
// 만약 isShowPart가 true이고, partValue가 'G'(환경청별)로 기본 설정되어 있다면,
// 초기 envPartValue ('0')에 대한 시도/시군구 목록을 설정합니다.
initializeCityDataByEnvPartSido(envPartValue); // envPartValue 기본값 '0'
};
if (isShowPart) {
loadInitialData();
}
}, [isShowPart]); // isShowPart가 변경될 때 데이터를 다시 로드
// 환경청 세팅 - 시도
const initializeCityDataByEnvPartSido = (envPartCd: string) => {
const foundEnvPart = allEnvPartOptions.find((item: EnvPartSelectDataType) => item.val === envPartCd);
console.log('foundEnvPart:', foundEnvPart);
let relevantSidos: SelectDataType[] = []; // 기본값을 빈 배열로 설정
let relevantSigunsForSidoDerivation: SelectDataType[] = []; // 기본값을 빈 배열로 설정
if (envPartCd === '0') { // "전체" 환경청 선택 시
relevantSidos = [...allSidoOptions];
relevantSigunsForSidoDerivation = [...allSigunOptions];
} else if (foundEnvPart && foundEnvPart.adstDliStrCd) { // 특정 환경청 선택 & 해당 환경청에 adstDliStrCd 정보가 있는 경우
// adstDliStrCd가 시도 코드를 포함한다고 가정 (주석 참고)
const cityCodesInEnvPart = foundEnvPart.adstDliStrCd.toString().split('|').join('').split(',').filter(c => c);
console.log('cityCodesInEnvPart:', cityCodesInEnvPart);
// 1. allSigunOptions에서 val이 cityCodesInEnvPart에 포함된 데이터의 sido만 추출
const relevantSigunSidos = Array.from(
new Set(
allSigunOptions
.filter(sigungu => cityCodesInEnvPart.includes(sigungu.val))
.map(sigungu => sigungu.sido)
)
);
console.log('relevantSigunTexts:', relevantSigunSidos);
// 2. relevantSigunsForSidoDerivation은 해당 sido만을 가진 배열로 반환
relevantSidos = allSidoOptions.filter(sido => relevantSigunSidos.includes(sido.text));
console.log('relevantSidos:', relevantSidos);
// 해당 시도들에 속하는 시군구들 (가나다순 오름차순 정렬)
relevantSigunsForSidoDerivation = allSigunOptions
.filter(sigun => {
const sigunSidoPrefix = sigun.val.substring(0, 2);
return relevantSidos.some(s => s.val === sigunSidoPrefix);
})
.sort((a, b) => a.text.localeCompare(b.text, 'ko'));
}
// 특정 환경청이 선택되었으나, foundEnvPart가 없거나 adstDliStrCd 정보가 없는 경우,
// relevantSidos와 relevantSigunsForSidoDerivation은 초기 빈 배열 상태를 유지합니다.
setFilteredEnvPartSidoData([
{ text: "전체", val: '0', adstDliStrCd: '', sido: '0' },
...relevantSidos.map((item: SelectDataType) => ({ text: item.text, val: item.val, adstDliStrCd: '', sido: '0' }))
]);
setFilteredEnvPartSigunDataSelected(relevantSigunsForSidoDerivation);
// 시/도 선택이 "전체"('0')로 초기화되므로, 해당 시/군/구 목록도 업데이트
initializeCityDataByEnvPartSigun('0');
}
// 환경청 세팅 - 시군구
const initializeCityDataByEnvPartSigun = (selectedSidoInEnvPart: string) => {
let sigunsToList: SelectDataType[];
if (selectedSidoInEnvPart === '0') { // 선택된 시도가 "전체"이면
// filteredEnvPartSigunDataSelected는 이미 해당 환경청에 맞는 시군구들로 필터링 되어있음
sigunsToList = [...filteredEnvPartSigunDataSelected];
} else {
sigunsToList = filteredEnvPartSigunDataSelected.filter((item: SelectDataType) => item.val.substring(0, 2) === selectedSidoInEnvPart);
}
setFilteredEnvPartSigunData([
{ text: "전체", val: '0' },
...sigunsToList
]);
}
const onSelectValue = (val: string, type: string) => {
switch (type) {
// 환경청 세팅
case 'envPart':
setEnvPartValue(val);
setRtnEnvPartValue?.(val);
initializeCityDataByEnvPartSido(val);
setEnvPartSidoValue('0'); // 시도 "전체"로 초기화
setEnvPartSigunValue('0'); // 시군구 "전체"로 초기화
// 부모에게도 초기화된 값 전달 (text 포함)
if (setRtnEnvPartSidoValue) {
const sidoDefault = filteredEnvPartSidoData.find(item => item.val === '0') || { val: '0', text: '전체' };
// setRtnEnvPartSidoValue(sidoDefault.val); // 이전 방식: 값만 전달
// TODO: 만약 시도 값도 객체로 전달해야 한다면 아래와 같이 수정
// setRtnEnvPartSidoValue({ val: sidoDefault.val, text: sidoDefault.text });
}
if (setRtnEnvPartSigunValue) {
const sigunDefault = filteredEnvPartSigunData.find(item => item.val === '0') || { val: '0', text: '전체' };
setRtnEnvPartSigunValue({ val: sigunDefault.val, text: sigunDefault.text });
}
break;
case 'envPartSido': // 환경청별 - 시도 선택
setEnvPartSidoValue(val);
setRtnEnvPartSidoValue?.(val);
initializeCityDataByEnvPartSigun(val);
setEnvPartSigunValue('0'); // 시군구 "전체"로 초기화
if (setRtnEnvPartSigunValue) {
const sigunDefault = filteredEnvPartSigunData.find(item => item.val === '0') || { val: '0', text: '전체' };
setRtnEnvPartSigunValue({ val: sigunDefault.val, text: sigunDefault.text });
}
break;
case 'envPartSigun': // 환경청별 - 시군구 선택
setEnvPartSigunValue(val);
const selectedSigun = filteredEnvPartSigunData.find(item => item.val === val);
if (setRtnEnvPartSigunValue && selectedSigun) {
setRtnEnvPartSigunValue({ val: selectedSigun.val, text: selectedSigun.text });
} else if (setRtnEnvPartSigunValue && val === '0') { // "전체"를 명시적으로 처리 (find 실패 대비)
setRtnEnvPartSigunValue({ val: '0', text: '전체' });
}
break;
}
}
// 리셋 함수
const resetAllValues = () => {
setEnvPartValue('0');
setEnvPartSidoValue('0');
setEnvPartSigunValue('0');
// 필터링된 목록들도 초기 "전체" 또는 전체 목록으로 리셋
setFilteredEnvPartSigunData([{ text: "전체", val: '0', sido: '0' }, ...allSigunOptions]);
setFilteredEnvPartData([{ text: "전체", val: '0', adstDliStrCd: '', sido: '0' }, ...allEnvPartOptions]);
setFilteredEnvPartSidoData([{ text: "전체", val: '0', adstDliStrCd: '', sido: '0' }, ...allSidoOptions.map(s => ({ ...s, adstDliStrCd: '' }))]);
setFilteredEnvPartSigunData([{ text: "전체", val: '0', sido: '0' }, ...allSigunOptions]);
setFilteredEnvPartSigunDataSelected(allSigunOptions);
setRtnPartValue?.('A');
setRtnSidoValue?.('0');
setRtnSigunValue?.('0');
setRtnRegionValue?.('0');
setRtnUnitWaterShedValue?.('0');
setRtnMiddleRegionValue?.('0');
setRtnEnvPartValue?.('0');
setRtnEnvPartSidoValue?.('0');
setRtnEnvPartSigunValue?.({ val: '0', text: '전체' });
};
// 리셋 트리거 변경 감지
useEffect(() => {
if (resetTrigger) {
resetAllValues();
// 리셋 후 트리거를 false로 설정하는 로직은 부모 컴포넌트에서 처리해야 할 수 있습니다.
// 여기서는 resetTrigger props가 true일 때 리셋을 수행합니다.
}
}, [resetTrigger]);
return (
isShowPart ? (
<div className="flex items-center my-4">
<>
<Label className="text-xl text-gray-600 font-medium whitespace-nowrap ml-2 mr-4">환경청</Label>
<SelectBox
className="w-[160px] mr-8"
label={''}
selectArray={filteredEnvPartData}
onSelectValue={(val) => onSelectValue(val.toString(), 'envPart')}
value={envPartValue}
selectClass={'rounded-lg bg-white truncate'}
/>
<Label className="text-xl text-gray-600 font-medium whitespace-nowrap mr-4">시도</Label>
<SelectBox
className="w-[160px] mr-8"
label={''}
selectArray={filteredEnvPartSidoData}
onSelectValue={(val) => onSelectValue(val.toString(), 'envPartSido')}
value={envPartSidoValue}
selectClass={'rounded-lg bg-white truncate'}
/>
<Label className="text-xl text-gray-600 font-medium whitespace-nowrap mr-4">시군구</Label>
<SelectBox
className="w-[160px] mr-8"
label={''}
selectArray={filteredEnvPartSigunData}
onSelectValue={(val) => onSelectValue(val.toString(), 'envPartSigun')}
value={envPartSigunValue}
selectClass={'rounded-lg bg-white truncate'}
/>
</>
{children}
</div>
) : (
<div className="grid grid-cols-12 gap-5 w-11/12 m-4">
{children}
</div>
)
)
}
export { GovSidoSigunguSearchForm };