- 환경청, 시도/시군구 선택 컴포넌트 구현 (govSidoSigunguSearchForm.tsx)
- API 데이터 처리 수정
This commit is contained in:
swcho
2025-05-30 18:06:49 +09:00
parent 23992f5d37
commit 1d71170478
6 changed files with 392 additions and 42 deletions
+8 -6
View File
@@ -10,11 +10,13 @@ export const postData = async (url: string, data: object): Promise<any> => {
};
const res = await fetch(`${BASE_URL}/${url}`, options);
if (res.ok) {
const text = await res.text();
if (text) {
return JSON.parse(text); // JSON 데이터가 있으면 파싱하여 반환
}
return true; // 응답 본문이 비어 있으면 true 반환
const resData = await res.json();
return resData;
// const text = await res.text();
// if (text) {
// return JSON.parse(text); // JSON 데이터가 있으면 파싱하여 반환
// }
// return true; // 응답 본문이 비어 있으면 true 반환
}
};
@@ -61,6 +63,6 @@ export const deleteData = async (url: string, data?: object): Promise<any> => {
body: data ? JSON.stringify(data) : undefined,
};
const res = await fetch(url.startsWith('/') ? `${url}` : `${BASE_URL}/${url}`, options);
if(res.status === 204) return true
if (res.status === 204) return true
return res;
};
@@ -137,7 +137,7 @@ export function SidoSigunguSelectBox({
const sigunguList = useMemo(() => sigunguMap[sido] || [{ id: 0, name: '전체' }], [sido]);
return (
<div className={`flex items-center ${className}`}>
<div className={`flex items-center justify-center ${className} mr-8`}>
<SelectBox2
className="w-48 mr-8"
selectClass="w-48 rounded-lg bg-white truncate"
@@ -147,7 +147,7 @@ export function SidoSigunguSelectBox({
onSelectValue={val => onSidoChange(Number(val))}
/>
<SelectBox2
className="w-48 mr-8"
className="w-48"
selectClass="w-48 rounded-lg bg-white truncate"
label="시군구"
selectArray={sigunguList.map(opt => ({ val: opt.id, text: opt.name }))}
@@ -0,0 +1,331 @@
import React, { useEffect, useState } from 'react';
import { SelectBox } from '@common/business_components/ui/select';
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: string) => void;
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 initializeSigunData = (sidoCd: string) => {
if (sidoCd === '0') {
// setSigunValue('0');
setFilteredEnvPartSigunData([{ text: "전체", val: '0' }, ...allSigunOptions]); // 전체 시군구
} else {
const newFilteredData = [
{ text: "전체", val: '0' },
...allSigunOptions.filter((item: SelectDataType) => item.val.substring(0, 2) === sidoCd)
];
// setSigunValue('0');
setFilteredEnvPartSigunData(newFilteredData);
}
}
// 환경청 세팅 - 시도
const initializeCityDataByEnvPartSido = (envPartCd: string) => {
const foundEnvPart = allEnvPartOptions.find((item: EnvPartSelectDataType) => item.val === envPartCd);
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'); // 시군구 "전체"로 초기화
// onSelectValue(filteredEnvPartSidoData[0]?.val || '0', 'envPartSido'); // 이 부분은 setEnvPartSidoValue('0')와 initializeCityDataByEnvPartSigun('0')으로 대체됨
break;
case 'envPartSido': // 환경청별 - 시도 선택
setEnvPartSidoValue(val);
setRtnEnvPartSidoValue?.(val);
initializeCityDataByEnvPartSigun(val);
setEnvPartSigunValue('0'); // 시군구 "전체"로 초기화
// onSelectValue(filteredEnvPartSigunData[0]?.val || '0', 'envPartSigun');
break;
case 'envPartSigun': // 환경청별 - 시군구 선택
setEnvPartSigunValue(val);
setRtnEnvPartSigunValue?.(val);
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?.('0');
};
// 리셋 트리거 변경 감지
useEffect(() => {
if (resetTrigger) {
resetAllValues();
// 리셋 후 트리거를 false로 설정하는 로직은 부모 컴포넌트에서 처리해야 할 수 있습니다.
// 여기서는 resetTrigger props가 true일 때 리셋을 수행합니다.
}
}, [resetTrigger]);
return (
isShowPart ? (
<div className="grid grid-cols-12 gap-5 w-11/12 m-4">
<>
<SelectBox className="col-span-2" label={'환경청'} selectArray={filteredEnvPartData} onSelectValue={(val) => onSelectValue(val.toString(), 'envPart')} value={envPartValue} selectClass={'rounded-lg bg-white truncate'} />
<SelectBox className="col-span-2" label={'시도'} selectArray={filteredEnvPartSidoData} onSelectValue={(val) => onSelectValue(val.toString(), 'envPartSido')} value={envPartSidoValue} selectClass={'rounded-lg bg-white truncate'} />
<SelectBox className="col-span-2" 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 };
+32 -13
View File
@@ -1,10 +1,12 @@
'use client'
import ContentLayout from '@/components/ui/contentLayout'
import { SearchDiv, SearchFormLeft, SelectBox, SearchFormRight, Form, UiTable } from '@common/business_components/ui'
import ListDiv from '@common/business_components/ui/list_div'
import { Button } from '@common/components/ui'
import React, { type ReactNode } from 'react'
import { GovSidoSigunguSearchForm } from '@/components/ui/govSidoSigunguSearchForm'
import { Form, SearchFormRight, SelectBox } from '@common/business_components/ui'
import { SidoSigunguSelectBox } from '../components/ui/SidoSigunguSelectBox'
import { SelectBox2 } from '@common/business_components/ui/select/index-2'
import ListDiv from '@common/business_components/ui/list_div'
import { Button, Label } from '@common/components/ui'
import { type ReactNode } from 'react'
type TitleName = {
mainTitle: string
@@ -30,6 +32,10 @@ type BaseLayout = {
graphBtn?: boolean
firstDivBtn?: boolean
searchBox?: SelectBox
sido?: number
setSido?: (sido: number) => void
sigungu?: number
setSigungu?: (sigungu: number) => void
}
// TODO: 나중에 이벤트 추가되면 파라미터 추가 필요 ?
/**
@@ -41,7 +47,7 @@ type BaseLayout = {
* @param graphBtn : 하단에 그래프 버튼 유무 처리
* @returns
*/
const BaseLayout = ({ children, titleName, form, onSubmitEvent, graphBtn = false, searchBox }: BaseLayout) => {
const BaseLayout = ({ children, titleName, form, onSubmitEvent, graphBtn = false, searchBox, sido, setSido, sigungu, setSigungu }: BaseLayout) => {
return (
<ContentLayout title={titleName.mainTitle}>
<ListDiv>
@@ -57,14 +63,27 @@ const BaseLayout = ({ children, titleName, form, onSubmitEvent, graphBtn = false
</div>
)}
<div className="flex items-center w-full">
<div className="flex-1">
<SearchFormLeft>
<SelectBox2 label={searchBox?.labelNm?.first ?? ''} selectArray={[{ text: '한강 유역청', val: '1' }]} className="col-span-2" onSelectValue={(val) => { }} selectClass={undefined} />
<SelectBox2 label={searchBox?.labelNm?.second ?? ''} selectArray={[{ text: '경기도', val: '1' }]} className="col-span-2" onSelectValue={() => { }} selectClass='' />
<SelectBox2 label={searchBox?.labelNm?.third ?? ''} selectArray={[{ text: '양평군', val: '1' }]} className="col-span-3" onSelectValue={() => { }} selectClass='' />
<SelectBox2 label={searchBox?.labelNm?.fourth ?? ''} selectArray={[{ text: '양평하수처리장', val: '1' }]} className="col-span-3" onSelectValue={() => { }} selectClass='' />
</SearchFormLeft>
</div>
{/* <div className="flex-1">
<div className="grid grid-cols-8 gap-5 m-4"> */}
{/* <SelectBox2 label={"환경청"} selectArray={[{ text: '한강 유역청', val: '1' }]} className="col-span-2" selectClass="rounded-lg bg-white truncate" onSelectValue={(val) => { }} />
<SidoSigunguSelectBox
className='col-span-2'
sido={sido ?? 0}
sigungu={sigungu ?? 0}
onSidoChange={(sido) => {
setSido?.(sido);
setSigungu?.(sigungu ?? 0);
}}
onSigunguChange={setSigungu ?? (() => { })}
/>
<SelectBox2 label={"하수처리장"} selectArray={[{ text: '양평하수처리장', val: '1' }]} className="col-span-2" selectClass="rounded-lg bg-white truncate" onSelectValue={() => { }} />
<SelectBox2 label={"하수처리구역"} selectArray={[{ text: '하수처리구역', val: '1' }]} className="col-span-2" selectClass="rounded-lg bg-white truncate" onSelectValue={() => { }} /> */}
<GovSidoSigunguSearchForm isShowPart={true} >
<SelectBox2 label={"하수처리장"} selectArray={[{ text: '양평하수처리장', val: '1' }]} className="col-span-2" selectClass="rounded-lg bg-white truncate" onSelectValue={() => { }} />
<SelectBox2 label={"하수처리구역"} selectArray={[{ text: '하수처리구역', val: '1' }]} className="col-span-2" selectClass="rounded-lg bg-white truncate" onSelectValue={() => { }} />
</GovSidoSigunguSearchForm>
{/* </div>
</div> */}
{searchBox?.searchChk ? <SearchFormRight><Button>조회</Button></SearchFormRight> : null}
</div>
</ListDiv>
+17 -16
View File
@@ -62,11 +62,11 @@ const IrSetting = () => {
const [selectedDate, setSelectedDate] = useState(new Date());
const [input1, setInput1] = useState('');
const [input2, setInput2] = useState('');
const [select1, setSelect1] = useState('');
const [select2, setSelect2] = useState('');
const [select3, setSelect3] = useState('');
const [select4, setSelect4] = useState('');
const [select5, setSelect5] = useState('');
const [select1, setSelect1] = useState(0);
const [select2, setSelect2] = useState(0);
const [select3, setSelect3] = useState(0);
const [select4, setSelect4] = useState(0);
const [select5, setSelect5] = useState(0);
const [formResetKey, setFormResetKey] = useState(0); // FileUploadForm 리셋을 위한 key 상태
// 폼 초기화 함수
@@ -89,11 +89,11 @@ const IrSetting = () => {
setSelectedDate(new Date()); // 날짜 선택 초기화
setInput1(''); // 입력 필드 초기화
setInput2(''); // 입력 필드 초기화
setSelect1(''); // 선택 필드 초기화
setSelect2('');
setSelect3('');
setSelect4('');
setSelect5('');
setSelect1(0); // 선택 필드 초기화
setSelect2(0);
setSelect3(0);
setSelect4(0);
setSelect5(0);
setFormResetKey(prevKey => prevKey + 1); // FileUploadForm 재마운트를 위해 key 변경
};
@@ -122,13 +122,10 @@ const IrSetting = () => {
// 추후 API 엔드포인트에 맞게 URL 수정 필요
const data = await postData('v1/inftwtAnls', analysisData);
console.log("Response from backend:", data);
if (data.ok) {
if (data) {
alert("분석 데이터가 성공적으로 제출되었습니다.");
resetAllForms(); // 성공 시 폼 초기화 함수 호출
} else {
alert("분석 데이터 제출 중 오류가 발생했습니다.");
// resetAllForms(); // 실패 시 폼 초기화 함수 호출
}
} else alert("분석 데이터 제출 중 오류가 발생했습니다.");
};
// 침입수 분석 실행 버튼 클릭 핸들러
@@ -232,7 +229,11 @@ const IrSetting = () => {
form={form}
onSubmitEvent={() => { }}
graphBtn={false}
searchBox={{ title: '분석 대상지역 선택' }} >
searchBox={{ title: '분석 대상지역 선택' }}
sido={select2}
setSido={setSelect2}
sigungu={select3}
setSigungu={setSelect3}>
<div className="grid gap-4">
<FormSection name='suyeongaPlace' form={form} titleNm='▷ 오수관망도'>
<FileUploadForm
+2 -5
View File
@@ -136,13 +136,10 @@ export default function RTKForm() {
console.log("Submitting combined analysis data to backend");
// 추후 API 엔드포인트에 맞게 URL 수정 필요
const data = await postData('v1/rdiiAnls', analysisData);
if (data.ok) {
if (data) {
alert("분석 데이터가 성공적으로 제출되었습니다.");
resetAllForms(); // 성공 시 폼 초기화 함수 호출
} else {
alert("분석 데이터 제출 중 오류가 발생했습니다.");
// resetAllForms();
}
} else alert("분석 데이터 제출 중 오류가 발생했습니다.");
};
// 침입수 분석 실행 버튼 클릭 핸들러