remove: GovSidoSigunguSearchForm 컴포넌트 삭제
This commit is contained in:
@@ -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 };
|
||||
Reference in New Issue
Block a user