113 lines
4.4 KiB
TypeScript
113 lines
4.4 KiB
TypeScript
import { useState, useMemo } from "react";
|
|
import { DataGrid } from "@rsone/components";
|
|
import SearchForm from "@/components/module/SearchForm";
|
|
import SaveButton from "@/components/button/SaveButton";
|
|
import ApproveButton from "@/components/button/ApproveButton";
|
|
import ReviewOpinionButton from "@/components/button/ReviewOpinionButton";
|
|
import ReturnButton from "@/components/button/ReturnButton";
|
|
import { LoadingWithAnimation } from "@common/components";
|
|
|
|
import { useAlertStore } from "@/shared/lib";
|
|
import { StatsInputStatusInfoList } from "@/components/util/column/review/StatsInputStatusRvwColumn";
|
|
import { statisticsManagementApi } from "@/entities/statistics/api/statistics-management-service";
|
|
import type { StatsInputStatusReviewItem } from "@/entities/statistics/model/statistics-input-review-interface";
|
|
import { toGridRows } from "@/components/util/grid/gridFunction";
|
|
import type { SearchFormValues } from "@/components/type/SearchForm.type";
|
|
|
|
// 하수도 통계 검토 00. 통계 입력 현황
|
|
const StatsInputStatusRvw = () => {
|
|
const { setMessage: alert } = useAlertStore((state) => state);
|
|
const [rowData, setRowData] = useState<Record<string, string | number>[]>([]);
|
|
const [isLoading, setIsLoading] = useState<boolean>(false);
|
|
|
|
const columnInfo = useMemo(() => {
|
|
const { columns, columnLayout } = StatsInputStatusInfoList;
|
|
return {
|
|
columnLayout,
|
|
columns: columns.map((col) => ({
|
|
...col,
|
|
editable: false as const,
|
|
})),
|
|
};
|
|
}, []);
|
|
|
|
const handleReset = () => {
|
|
setRowData([]);
|
|
};
|
|
|
|
const handleSearch = async (values: SearchFormValues) => {
|
|
if (!values.sido || values.sido === 'ALL') {
|
|
alert('시도를 선택해주세요.');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
setIsLoading(true);
|
|
|
|
const response = await statisticsManagementApi.getStatsInputStatusList({
|
|
sido: values.sido,
|
|
gugun: values.gugun === 'ALL' ? '' : values.gugun,
|
|
yr: values.year,
|
|
bsnmCd: values.bsnmCd
|
|
});
|
|
|
|
if (response.status === 'success' && response.data) {
|
|
const rawList = response.data.sewerageSupplyRateList ?? [];
|
|
const convertedData: StatsInputStatusReviewItem[] = rawList.map((item: StatsInputStatusReviewItem) => ({
|
|
...item,
|
|
status: item.status || '미확인',
|
|
}));
|
|
|
|
setRowData(toGridRows(convertedData));
|
|
} else {
|
|
setRowData([]);
|
|
alert(response.message || "조회된 데이터가 없습니다.");
|
|
}
|
|
} catch (error) {
|
|
console.error("입력현황 조회 중 에러 발생:", error);
|
|
alert('데이터 조회 중 오류가 발생했습니다.');
|
|
setRowData([]);
|
|
} finally {
|
|
setIsLoading(false);
|
|
}
|
|
};
|
|
|
|
const approveFunc = () => console.log('approveFunc');
|
|
const saveFunc = () => console.log('submit');
|
|
const reviewOpinionFunc = () => console.log('reviewOpinionFunc');
|
|
const returnFunc = () => console.log('returnFunc');
|
|
|
|
return (
|
|
<div className="relative">
|
|
<SearchForm onSubmit={handleSearch} onReset={handleReset} />
|
|
|
|
<div className="card !py-0">
|
|
<div className="flex justify-end items-center gap-[0.6rem] m-[0.6rem]">
|
|
<ReviewOpinionButton reviewOpinionFunc={reviewOpinionFunc} />
|
|
<ApproveButton approveFunc={approveFunc} />
|
|
<ReturnButton returnFunc={returnFunc} />
|
|
<SaveButton saveFunc={saveFunc} />
|
|
</div>
|
|
</div>
|
|
|
|
{isLoading && (
|
|
<div className="absolute inset-0 z-50 [data-theme='black']:bg-transparent rounded-lg p-10 flex justify-center items-center">
|
|
<div className="relative size-[5rem]">
|
|
<LoadingWithAnimation color="primary" />
|
|
</div>
|
|
</div>
|
|
)}
|
|
|
|
<DataGrid
|
|
columnInfo={columnInfo}
|
|
isExcelImport={false}
|
|
rowStartNum={2}
|
|
fixedColumns={2}
|
|
rowData={rowData}
|
|
setRowData={setRowData}
|
|
/>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default StatsInputStatusRvw; |