Files
invyone/frontend/stores/tableDisplayStore.ts
T

113 lines
2.7 KiB
TypeScript

/**
* 테이블 화면 표시 데이터 전역 저장소
* 엑셀 다운로드 등에서 현재 화면에 표시된 데이터에 접근하기 위함
*/
interface TableDisplayState {
data: any[];
column_order: string[];
sort_by: string | null;
sort_order: "asc" | "desc";
table_name: string;
// 🆕 엑셀 다운로드 개선을 위한 추가 필드
filter_conditions?: Record<string, any>; // 필터 조건
search_term?: string; // 검색어
visible_columns?: string[]; // 화면 표시 컬럼
column_labels?: Record<string, string>; // 컬럼 라벨
current_page?: number; // 현재 페이지
page_size?: number; // 페이지 크기
total_items?: number; // 전체 항목 수
}
class TableDisplayStore {
private state: Map<string, TableDisplayState> = 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?: {
filter_conditions?: Record<string, any>;
search_term?: string;
visible_columns?: string[];
column_labels?: Record<string, string>;
current_page?: number;
page_size?: number;
total_items?: number;
}
) {
this.state.set(tableName, {
data,
column_order: columnOrder,
sort_by: sortBy,
sort_order: sortOrder,
table_name: tableName,
...options,
});
this.notifyListeners();
}
/**
* 테이블 표시 데이터 조회
* @param tableName 테이블명
*/
getTableData(tableName: string): TableDisplayState | undefined {
return this.state.get(tableName);
}
/**
* 모든 테이블 데이터 조회
*/
getAllTableData(): Map<string, TableDisplayState> {
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();