Files
frontend/apps/st/src/components/statistics/input/StatisticsReviewHistory.tsx
T

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;