ERP-node/frontend/stores/tableDisplayStore.ts

111 lines
2.3 KiB
TypeScript
Raw Normal View History

2025-11-05 10:23:00 +09:00
/**
*
*
*/
interface TableDisplayState {
data: any[];
columnOrder: string[];
sortBy: string | null;
sortOrder: "asc" | "desc";
tableName: string;
}
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
*/
setTableData(
tableName: string,
data: any[],
columnOrder: string[],
sortBy: string | null,
sortOrder: "asc" | "desc"
) {
this.state.set(tableName, {
data,
columnOrder,
sortBy,
sortOrder,
tableName,
});
console.log("📦 [TableDisplayStore] 데이터 저장:", {
tableName,
dataCount: data.length,
columnOrderLength: columnOrder.length,
sortBy,
sortOrder,
firstRow: data[0],
});
this.notifyListeners();
}
/**
*
* @param tableName
*/
getTableData(tableName: string): TableDisplayState | undefined {
const state = this.state.get(tableName);
console.log("📤 [TableDisplayStore] 데이터 조회:", {
tableName,
found: !!state,
dataCount: state?.data.length,
});
return state;
}
/**
*
*/
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();