94 lines
3.6 KiB
TypeScript
94 lines
3.6 KiB
TypeScript
import { useState } from "react";
|
|
|
|
import DataGrid from "@/components/module/DataGrid";
|
|
import SearchForm from "@/components/module/SearchForm";
|
|
import type { ColumnConfig } from "@/components/type/DataGrid.type";
|
|
import type { SearchFormValues } from "@/components/type/SearchForm.type";
|
|
import { toGridRows } from "@/components/util/grid/gridFunction";
|
|
import { statisticsApi } from "@/entities/statistics/api/statistics-service";
|
|
import { useAlertStore } from "@/shared/lib";
|
|
import { LoadingWithAnimation } from "@common/components";
|
|
|
|
const StatisticsReviewHistory = () => {
|
|
const { setMessage: alert } = useAlertStore((state) => state);
|
|
const [rowData, setRowData] = useState<Record<string, string | number>[]>([]);
|
|
const [isLoading, setIsLoading] = useState(false);
|
|
|
|
const columns: ColumnConfig[] = [
|
|
{ name: "statsYr", fieldName: "statsYr", header: { text: "연도" }, editable: false },
|
|
{ name: "ctpvNm", fieldName: "ctpvNm", header: { text: "시도" }, editable: false },
|
|
{ name: "sggNm", fieldName: "sggNm", header: { text: "시군구" }, editable: false },
|
|
{ name: "menuNm", fieldName: "menuNm", header: { text: "통계항목" }, editable: false },
|
|
{ name: "chckerOpinionSm", fieldName: "chckerOpinionSm", header: { text: "검토자의견" }, editable: false },
|
|
{ name: "wrterOpinionSm", fieldName: "wrterOpinionSm", header: { text: "처리내역" }, editable: false },
|
|
];
|
|
|
|
const columnLayout = [
|
|
"statsYr",
|
|
"ctpvNm",
|
|
"sggNm",
|
|
"menuNm",
|
|
"chckerOpinionSm",
|
|
"wrterOpinionSm",
|
|
];
|
|
|
|
const handleSearch = async (values: SearchFormValues) => {
|
|
if (!values.year?.trim()) {
|
|
alert("년도를 선택해주세요.");
|
|
return;
|
|
}
|
|
|
|
try {
|
|
setIsLoading(true);
|
|
const res = await statisticsApi.getStatiscicsManagementReviewHistory({
|
|
statsYr: values.year.trim(),
|
|
...(values.bsnmCd?.trim() ? { sewerBzmnCd: values.bsnmCd.trim() } : {}),
|
|
...(values.sido && values.sido !== "ALL" ? { ctpvNm: values.sido } : {}),
|
|
...(values.gugun?.trim() && values.gugun !== "ALL"
|
|
? { sggNm: values.gugun.trim() }
|
|
: {}),
|
|
});
|
|
|
|
if (res.status === "success" && Array.isArray(res.data)) {
|
|
setRowData(toGridRows(res.data));
|
|
} else {
|
|
setRowData([]);
|
|
alert(res.message || "조회된 데이터가 없습니다.");
|
|
}
|
|
} catch {
|
|
setRowData([]);
|
|
alert("데이터 조회 중 오류가 발생했습니다.");
|
|
} finally {
|
|
setIsLoading(false);
|
|
}
|
|
};
|
|
|
|
const handleReset = () => {
|
|
setRowData([]);
|
|
};
|
|
|
|
return (
|
|
<div className="relative">
|
|
<SearchForm onSubmit={handleSearch} onReset={handleReset} />
|
|
{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={{ columns, columnLayout }}
|
|
rowStartNum={2}
|
|
fixedColumns={3}
|
|
rowData={rowData}
|
|
setRowData={setRowData}
|
|
isExcelImport={false}
|
|
enableSort={false}
|
|
/>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default StatisticsReviewHistory;
|