211 lines
6.3 KiB
TypeScript
211 lines
6.3 KiB
TypeScript
/**
|
|
* 📄 useSearchModalStore
|
|
* 검색 모달 Zustand 스토어
|
|
*
|
|
* - 검색 모달 열기/닫기 및 탭 전환 상태 관리
|
|
* - 기본정보 및 운영정보 탭 데이터 필터링 및 조회
|
|
* - 테이블 데이터 및 페이지네이션 상태 관리
|
|
* - 지역(시도/시군구) 및 날짜 범위 필터링 기능
|
|
* - 로딩 상태 및 리셋 플래그 관리
|
|
* - Zustand를 통한 중앙 집중식 상태 관리
|
|
* - 데이터 변경 감지 및 불필요한 재렌더링 방지
|
|
*/
|
|
import { create } from "zustand";
|
|
|
|
|
|
// 날짜 조합 함수
|
|
const getDateString = (
|
|
year: string,
|
|
month: string,
|
|
day: string,
|
|
defaultDate: string,
|
|
) => {
|
|
if (!year && !month && !day) return defaultDate;
|
|
const y = year || defaultDate.slice(0, 4);
|
|
const m = month || defaultDate.slice(4, 6);
|
|
const d = day || defaultDate.slice(6, 8);
|
|
return `${y}${m}${d}`;
|
|
};
|
|
|
|
// 오늘 날짜 계산
|
|
const today = new Date();
|
|
const todayYear = today.getFullYear().toString();
|
|
const todayMonth = (today.getMonth() + 1).toString().padStart(2, "0");
|
|
const todayDate = today.getDate().toString().padStart(2, "0");
|
|
|
|
export interface SearchModalState {
|
|
// 모달 열림 상태
|
|
isSearchModalOpen: boolean;
|
|
// 탭 관련
|
|
activeTab: string;
|
|
basicType: string;
|
|
workType: string;
|
|
// 최초 렌더 방지 플래그
|
|
showTable: boolean;
|
|
// 테이블 데이터
|
|
tableData: any[];
|
|
detailTableData: any[];
|
|
tableCount: number;
|
|
detailTableCount: number;
|
|
// 페이지네이션
|
|
curPage: number;
|
|
detailCurPage: number;
|
|
// 로딩 상태
|
|
isLoading: boolean;
|
|
isDetailLoading: boolean;
|
|
// 리셋 플래그
|
|
isResetPage: boolean;
|
|
isResetDetailPage: boolean;
|
|
isResetSelection: boolean;
|
|
isResetDetailSelection: boolean;
|
|
// 사업 ID
|
|
detailBizId: number;
|
|
// 지역 필터
|
|
ctpvCd: string;
|
|
ctpvName: string;
|
|
sggCd: string;
|
|
sggName: string;
|
|
// 범위 필터
|
|
start1: string;
|
|
start2: string;
|
|
end1: string;
|
|
end2: string;
|
|
// 변수 필터
|
|
var1: string;
|
|
var2: string;
|
|
// 연도 필터
|
|
yearFilter: { start: string; end: string };
|
|
// 날짜 관련
|
|
today: Date;
|
|
todayYear: string;
|
|
todayMonth: string;
|
|
todayDate: string;
|
|
|
|
// setters
|
|
setIsSearchModalOpen: (open: boolean) => void;
|
|
setActiveTab: (tab: string) => void;
|
|
setBasicType: (type: string) => void;
|
|
setWorkType: (type: string) => void;
|
|
setShowTable: (show: boolean) => void;
|
|
setTableData: (data: any[]) => void;
|
|
setDetailTableData: (data: any[]) => void;
|
|
setTableCount: (count: number) => void;
|
|
setDetailTableCount: (count: number) => void;
|
|
setCurPage: (page: number) => void;
|
|
setDetailCurPage: (page: number) => void;
|
|
setIsLoading: (loading: boolean) => void;
|
|
setIsDetailLoading: (loading: boolean) => void;
|
|
setIsResetPage: (reset: boolean) => void;
|
|
setIsResetDetailPage: (reset: boolean) => void;
|
|
setIsResetSelection: (reset: boolean) => void;
|
|
setIsResetDetailSelection: (reset: boolean) => void;
|
|
setDetailBizId: (id: number) => void;
|
|
setCtpvCd: (cd: string) => void;
|
|
setCtpvName: (name: string) => void;
|
|
setSggCd: (cd: string) => void;
|
|
setSggName: (name: string) => void;
|
|
setStart1: (val: string) => void;
|
|
setStart2: (val: string) => void;
|
|
setEnd1: (val: string) => void;
|
|
setEnd2: (val: string) => void;
|
|
setVar1: (val: string) => void;
|
|
setVar2: (val: string) => void;
|
|
setYearFilter: (filter: { start: string; end: string }) => void;
|
|
|
|
getDateString: (year: string, month: string, day: string, defaultDate: string) => string;
|
|
resetFilters: () => void; // 초기화 액션
|
|
}
|
|
|
|
const useSearchModalStore = create<SearchModalState>((set) => ({
|
|
isSearchModalOpen: false,
|
|
activeTab: "basic",
|
|
basicType: "tb_ms_swage_ppl",
|
|
workType: "['200', '201', '204']",
|
|
showTable: false,
|
|
tableData: [],
|
|
detailTableData: [],
|
|
tableCount: 0,
|
|
detailTableCount: 0,
|
|
curPage: 1,
|
|
detailCurPage: 1,
|
|
isLoading: false,
|
|
isDetailLoading: false,
|
|
isResetPage: false,
|
|
isResetDetailPage: false,
|
|
isResetSelection: false,
|
|
isResetDetailSelection: false,
|
|
detailBizId: 0,
|
|
ctpvCd: "0",
|
|
ctpvName: "",
|
|
sggCd: "0",
|
|
sggName: "",
|
|
start1: "",
|
|
start2: "",
|
|
end1: "",
|
|
end2: "",
|
|
var1: "",
|
|
var2: "",
|
|
yearFilter: { start: "", end: "" },
|
|
today,
|
|
todayYear,
|
|
todayMonth,
|
|
todayDate,
|
|
setIsSearchModalOpen: (isSearchModalOpen) => set({ isSearchModalOpen }),
|
|
setActiveTab: (tab) => set({ activeTab: tab }),
|
|
setBasicType: (type) => set({ basicType: type }),
|
|
setWorkType: (type) => set({ workType: type }),
|
|
setShowTable: (show) => set({ showTable: show }),
|
|
setTableData: (data) => set({ tableData: data }),
|
|
setDetailTableData: (data) => set({ detailTableData: data }),
|
|
setTableCount: (count) => set({ tableCount: count }),
|
|
setDetailTableCount: (count) => set({ detailTableCount: count }),
|
|
setCurPage: (page) => set({ curPage: page }),
|
|
setDetailCurPage: (page) => set({ detailCurPage: page }),
|
|
setIsLoading: (loading) => set({ isLoading: loading }),
|
|
setIsDetailLoading: (loading) => set({ isDetailLoading: loading }),
|
|
setIsResetPage: (reset) => set({ isResetPage: reset }),
|
|
setIsResetDetailPage: (reset) => set({ isResetDetailPage: reset }),
|
|
setIsResetSelection: (reset) => set({ isResetSelection: reset }),
|
|
setIsResetDetailSelection: (reset) => set({ isResetDetailSelection: reset }),
|
|
setDetailBizId: (id) => set({ detailBizId: id }),
|
|
setCtpvCd: (cd) => set({ ctpvCd: cd }),
|
|
setCtpvName: (name) => set({ ctpvName: name }),
|
|
setSggCd: (cd) => set({ sggCd: cd }),
|
|
setSggName: (name) => set({ sggName: name }),
|
|
setStart1: (val) => set({ start1: val }),
|
|
setStart2: (val) => set({ start2: val }),
|
|
setEnd1: (val) => set({ end1: val }),
|
|
setEnd2: (val) => set({ end2: val }),
|
|
setVar1: (val) => set({ var1: val }),
|
|
setVar2: (val) => set({ var2: val }),
|
|
setYearFilter: (filter) => set({ yearFilter: filter }),
|
|
|
|
getDateString: getDateString,
|
|
// 초기화 액션
|
|
resetFilters: () =>
|
|
set({
|
|
showTable: false,
|
|
start1: "",
|
|
start2: "",
|
|
end1: "",
|
|
end2: "",
|
|
var1: "",
|
|
var2: "",
|
|
ctpvCd: "0",
|
|
sggCd: "0",
|
|
yearFilter: { start: "", end: "" },
|
|
tableData: [],
|
|
detailTableData: [],
|
|
tableCount: 0,
|
|
detailTableCount: 0,
|
|
curPage: 1,
|
|
detailCurPage: 1,
|
|
isResetPage: true,
|
|
isResetDetailPage: true,
|
|
isResetSelection: true,
|
|
isResetDetailSelection: true,
|
|
detailBizId: 0,
|
|
}),
|
|
}));
|
|
|
|
export default useSearchModalStore; |