/** * 테이블 화면 표시 데이터 전역 저장소 * 엑셀 다운로드 등에서 현재 화면에 표시된 데이터에 접근하기 위함 */ interface TableDisplayState { data: any[]; columnOrder: string[]; sortBy: string | null; sortOrder: "asc" | "desc"; tableName: string; // 🆕 엑셀 다운로드 개선을 위한 추가 필드 filterConditions?: Record; // 필터 조건 searchTerm?: string; // 검색어 visibleColumns?: string[]; // 화면 표시 컬럼 columnLabels?: Record; // 컬럼 라벨 currentPage?: number; // 현재 페이지 pageSize?: number; // 페이지 크기 totalItems?: number; // 전체 항목 수 } class TableDisplayStore { private state: Map = new Map(); private listeners: Set<() => void> = new Set(); /** * 테이블 표시 데이터 저장 * @param tableName 테이블명 * @param data 화면에 표시된 데이터 * @param columnOrder 컬럼 순서 * @param sortBy 정렬 컬럼 * @param sortOrder 정렬 방향 * @param options 추가 옵션 (필터, 페이징 등) */ setTableData( tableName: string, data: any[], columnOrder: string[], sortBy: string | null, sortOrder: "asc" | "desc", options?: { filterConditions?: Record; searchTerm?: string; visibleColumns?: string[]; columnLabels?: Record; currentPage?: number; pageSize?: number; totalItems?: number; } ) { this.state.set(tableName, { data, columnOrder, sortBy, sortOrder, tableName, ...options, }); this.notifyListeners(); } /** * 테이블 표시 데이터 조회 * @param tableName 테이블명 */ getTableData(tableName: string): TableDisplayState | undefined { return this.state.get(tableName); } /** * 모든 테이블 데이터 조회 */ getAllTableData(): Map { return new Map(this.state); } /** * 테이블 데이터 삭제 * @param tableName 테이블명 */ clearTableData(tableName: string) { this.state.delete(tableName); this.notifyListeners(); } /** * 모든 데이터 삭제 */ clearAll() { this.state.clear(); this.notifyListeners(); } /** * 변경 리스너 등록 */ subscribe(listener: () => void) { this.listeners.add(listener); return () => { this.listeners.delete(listener); }; } private notifyListeners() { this.listeners.forEach((listener) => listener()); } } // 싱글톤 인스턴스 export const tableDisplayStore = new TableDisplayStore();