@visactor/vtable-sheet 1.22.13-alpha.0 → 1.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/components/sheet-tab-event-handler.js +1 -1
- package/cjs/components/sheet-tab-event-handler.js.map +1 -1
- package/cjs/components/vtable-sheet.d.ts +18 -12
- package/cjs/components/vtable-sheet.js +77 -48
- package/cjs/components/vtable-sheet.js.map +1 -1
- package/cjs/core/WorkSheet.d.ts +12 -7
- package/cjs/core/WorkSheet.js +38 -67
- package/cjs/core/WorkSheet.js.map +1 -1
- package/cjs/core/table-plugins.d.ts +1 -1
- package/cjs/core/table-plugins.js +45 -24
- package/cjs/core/table-plugins.js.map +1 -1
- package/cjs/event/base-event-manager.d.ts +21 -0
- package/cjs/event/base-event-manager.js +58 -0
- package/cjs/event/base-event-manager.js.map +1 -0
- package/cjs/event/dom-event-manager.d.ts +10 -0
- package/cjs/event/dom-event-manager.js +31 -0
- package/cjs/event/dom-event-manager.js.map +1 -0
- package/cjs/event/event-interfaces.d.ts +46 -0
- package/cjs/event/event-interfaces.js +6 -0
- package/cjs/event/event-interfaces.js.map +1 -0
- package/cjs/event/event-performance.d.ts +20 -0
- package/cjs/event/event-performance.js +94 -0
- package/cjs/event/event-performance.js.map +1 -0
- package/cjs/event/event-validator.d.ts +10 -0
- package/cjs/event/event-validator.js +78 -0
- package/cjs/event/event-validator.js.map +1 -0
- package/cjs/event/formula-event-utils.d.ts +30 -0
- package/cjs/event/formula-event-utils.js +69 -0
- package/cjs/event/formula-event-utils.js.map +1 -0
- package/cjs/event/index.d.ts +9 -0
- package/cjs/event/index.js +78 -0
- package/cjs/event/index.js.map +1 -0
- package/cjs/event/spreadsheet-event-manager.d.ts +27 -0
- package/cjs/event/spreadsheet-event-manager.js +143 -0
- package/cjs/event/spreadsheet-event-manager.js.map +1 -0
- package/cjs/event/table-event-relay.d.ts +30 -0
- package/cjs/event/table-event-relay.js +105 -0
- package/cjs/event/table-event-relay.js.map +1 -0
- package/cjs/event/vtable-sheet-event-bus.d.ts +23 -0
- package/cjs/event/vtable-sheet-event-bus.js +75 -0
- package/cjs/event/vtable-sheet-event-bus.js.map +1 -0
- package/cjs/event/worksheet-event-manager.d.ts +28 -0
- package/cjs/event/worksheet-event-manager.js +82 -0
- package/cjs/event/worksheet-event-manager.js.map +1 -0
- package/cjs/formula/formula-engine.js +7 -4
- package/cjs/formula/formula-engine.js.map +1 -1
- package/cjs/formula/formula-range-selector.d.ts +3 -3
- package/cjs/formula/formula-range-selector.js +4 -4
- package/cjs/formula/formula-range-selector.js.map +1 -1
- package/cjs/formula/index.js +1 -2
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +1 -1
- package/cjs/index.js.map +1 -1
- package/cjs/managers/formula-manager.d.ts +1 -0
- package/cjs/managers/formula-manager.js +33 -2
- package/cjs/managers/formula-manager.js.map +1 -1
- package/cjs/managers/menu-manager.d.ts +2 -0
- package/cjs/managers/menu-manager.js +32 -7
- package/cjs/managers/menu-manager.js.map +1 -1
- package/cjs/managers/sheet-manager.d.ts +4 -1
- package/cjs/managers/sheet-manager.js +40 -5
- package/cjs/managers/sheet-manager.js.map +1 -1
- package/cjs/managers/tab-drag-manager.js +2 -2
- package/cjs/managers/tab-drag-manager.js.map +1 -1
- package/cjs/sheet-helper.d.ts +11 -12
- package/cjs/sheet-helper.js +18 -23
- package/cjs/sheet-helper.js.map +1 -1
- package/cjs/styles/sheet-tab.js +2 -1
- package/cjs/ts-types/formula.js +1 -2
- package/cjs/ts-types/index.d.ts +1 -1
- package/cjs/ts-types/index.js +3 -3
- package/cjs/ts-types/index.js.map +1 -1
- package/cjs/ts-types/spreadsheet-events.d.ts +195 -0
- package/cjs/ts-types/spreadsheet-events.js +26 -0
- package/cjs/ts-types/spreadsheet-events.js.map +1 -0
- package/dist/vtable-sheet.js +1240 -366
- package/dist/vtable-sheet.min.js +1 -1
- package/es/components/sheet-tab-event-handler.js +1 -1
- package/es/components/sheet-tab-event-handler.js.map +1 -1
- package/es/components/vtable-sheet.d.ts +18 -12
- package/es/components/vtable-sheet.js +84 -51
- package/es/components/vtable-sheet.js.map +1 -1
- package/es/core/WorkSheet.d.ts +12 -7
- package/es/core/WorkSheet.js +38 -69
- package/es/core/WorkSheet.js.map +1 -1
- package/es/core/table-plugins.d.ts +1 -1
- package/es/core/table-plugins.js +45 -24
- package/es/core/table-plugins.js.map +1 -1
- package/es/event/base-event-manager.d.ts +21 -0
- package/es/event/base-event-manager.js +52 -0
- package/es/event/base-event-manager.js.map +1 -0
- package/es/event/dom-event-manager.d.ts +10 -0
- package/es/event/dom-event-manager.js +23 -0
- package/es/event/dom-event-manager.js.map +1 -0
- package/es/event/event-interfaces.d.ts +46 -0
- package/es/event/event-interfaces.js +2 -0
- package/es/event/event-interfaces.js.map +1 -0
- package/es/event/event-performance.d.ts +20 -0
- package/es/event/event-performance.js +86 -0
- package/es/event/event-performance.js.map +1 -0
- package/es/event/event-validator.d.ts +10 -0
- package/es/event/event-validator.js +70 -0
- package/es/event/event-validator.js.map +1 -0
- package/es/event/formula-event-utils.d.ts +30 -0
- package/es/event/formula-event-utils.js +61 -0
- package/es/event/formula-event-utils.js.map +1 -0
- package/es/event/index.d.ts +9 -0
- package/es/event/index.js +16 -0
- package/es/event/index.js.map +1 -0
- package/es/event/spreadsheet-event-manager.d.ts +27 -0
- package/es/event/spreadsheet-event-manager.js +137 -0
- package/es/event/spreadsheet-event-manager.js.map +1 -0
- package/es/event/table-event-relay.d.ts +30 -0
- package/es/event/table-event-relay.js +97 -0
- package/es/event/table-event-relay.js.map +1 -0
- package/es/event/vtable-sheet-event-bus.d.ts +23 -0
- package/es/event/vtable-sheet-event-bus.js +67 -0
- package/es/event/vtable-sheet-event-bus.js.map +1 -0
- package/es/event/worksheet-event-manager.d.ts +28 -0
- package/es/event/worksheet-event-manager.js +76 -0
- package/es/event/worksheet-event-manager.js.map +1 -0
- package/es/formula/formula-engine.js +7 -4
- package/es/formula/formula-engine.js.map +1 -1
- package/es/formula/formula-range-selector.d.ts +3 -3
- package/es/formula/formula-range-selector.js +5 -3
- package/es/formula/formula-range-selector.js.map +1 -1
- package/es/formula/index.js +1 -2
- package/es/index.d.ts +1 -1
- package/es/index.js +1 -1
- package/es/index.js.map +1 -1
- package/es/managers/formula-manager.d.ts +1 -0
- package/es/managers/formula-manager.js +33 -2
- package/es/managers/formula-manager.js.map +1 -1
- package/es/managers/menu-manager.d.ts +2 -0
- package/es/managers/menu-manager.js +32 -7
- package/es/managers/menu-manager.js.map +1 -1
- package/es/managers/sheet-manager.d.ts +4 -1
- package/es/managers/sheet-manager.js +39 -5
- package/es/managers/sheet-manager.js.map +1 -1
- package/es/managers/tab-drag-manager.js +2 -2
- package/es/managers/tab-drag-manager.js.map +1 -1
- package/es/sheet-helper.d.ts +11 -12
- package/es/sheet-helper.js +13 -16
- package/es/sheet-helper.js.map +1 -1
- package/es/styles/sheet-tab.js +2 -1
- package/es/ts-types/formula.js +1 -2
- package/es/ts-types/index.d.ts +1 -1
- package/es/ts-types/index.js +2 -2
- package/es/ts-types/index.js.map +1 -1
- package/es/ts-types/spreadsheet-events.d.ts +195 -0
- package/es/ts-types/spreadsheet-events.js +23 -0
- package/es/ts-types/spreadsheet-events.js.map +1 -0
- package/package.json +5 -5
- package/cjs/event/event-manager.d.ts +0 -28
- package/cjs/event/event-manager.js +0 -62
- package/cjs/event/event-manager.js.map +0 -1
- package/cjs/event/event-target.d.ts +0 -12
- package/cjs/event/event-target.js +0 -50
- package/cjs/event/event-target.js.map +0 -1
- package/cjs/ts-types/event.d.ts +0 -90
- package/cjs/ts-types/event.js +0 -11
- package/cjs/ts-types/event.js.map +0 -1
- package/cjs/ts-types/events.d.ts +0 -1
- package/cjs/ts-types/events.js +0 -1
- package/cjs/ts-types/events.js.map +0 -1
- package/es/event/event-manager.d.ts +0 -28
- package/es/event/event-manager.js +0 -54
- package/es/event/event-manager.js.map +0 -1
- package/es/event/event-target.d.ts +0 -12
- package/es/event/event-target.js +0 -42
- package/es/event/event-target.js.map +0 -1
- package/es/ts-types/event.d.ts +0 -90
- package/es/ts-types/event.js +0 -7
- package/es/ts-types/event.js.map +0 -1
- package/es/ts-types/events.d.ts +0 -1
- package/es/ts-types/events.js +0 -1
- package/es/ts-types/events.js.map +0 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { IEventBus, IEventManager, EventManagerConfig } from './event-interfaces';
|
|
2
|
+
import { EventPerformanceOptimizer } from './event-performance';
|
|
3
|
+
export declare abstract class BaseEventManager<T extends Record<string, any>> implements IEventManager<T> {
|
|
4
|
+
protected eventBus: IEventBus;
|
|
5
|
+
protected config: EventManagerConfig;
|
|
6
|
+
protected performanceOptimizer: EventPerformanceOptimizer;
|
|
7
|
+
private callbackMap;
|
|
8
|
+
constructor(eventBus: IEventBus, config?: EventManagerConfig);
|
|
9
|
+
on<K extends keyof T>(type: K, callback: (event: T[K]) => void): void;
|
|
10
|
+
off<K extends keyof T>(type: K, callback?: (event: T[K]) => void): void;
|
|
11
|
+
emit<K extends keyof T>(type: K, event: T[K]): void;
|
|
12
|
+
getListenerCount(type?: keyof T): number;
|
|
13
|
+
clearAllListeners(): void;
|
|
14
|
+
getStatistics(): {
|
|
15
|
+
totalEvents: number;
|
|
16
|
+
listenersByType: Record<string, number>;
|
|
17
|
+
totalListeners: number;
|
|
18
|
+
};
|
|
19
|
+
protected validateEvent(eventType: string, event: any): boolean;
|
|
20
|
+
protected abstract getEventTypes(): string[];
|
|
21
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { EventValidator } from "./event-validator";
|
|
2
|
+
|
|
3
|
+
import { EventPerformanceOptimizer } from "./event-performance";
|
|
4
|
+
|
|
5
|
+
export class BaseEventManager {
|
|
6
|
+
constructor(eventBus, config = {}) {
|
|
7
|
+
this.callbackMap = new WeakMap, this.eventBus = eventBus, this.config = Object.assign({
|
|
8
|
+
enableValidation: !0,
|
|
9
|
+
enablePerformanceMonitoring: !1,
|
|
10
|
+
enableErrorBoundary: !0,
|
|
11
|
+
maxListeners: 100
|
|
12
|
+
}, config), this.performanceOptimizer = new EventPerformanceOptimizer;
|
|
13
|
+
}
|
|
14
|
+
on(type, callback) {
|
|
15
|
+
let finalCallback = callback;
|
|
16
|
+
this.config.enableValidation && (finalCallback = event => {
|
|
17
|
+
this.validateEvent(type, event) && callback(event);
|
|
18
|
+
}), this.eventBus.on(type, finalCallback), finalCallback !== callback && this.callbackMap.set(callback, finalCallback);
|
|
19
|
+
}
|
|
20
|
+
off(type, callback) {
|
|
21
|
+
if (callback) {
|
|
22
|
+
const optimizedCallback = this.callbackMap.get(callback);
|
|
23
|
+
optimizedCallback ? (this.eventBus.off(type, optimizedCallback), this.callbackMap.delete(callback)) : this.eventBus.off(type, callback);
|
|
24
|
+
} else this.eventBus.off(type), this.callbackMap = new WeakMap;
|
|
25
|
+
}
|
|
26
|
+
emit(type, event) {
|
|
27
|
+
this.config.enableValidation && !this.validateEvent(type, event) || this.eventBus.emit(type, event);
|
|
28
|
+
}
|
|
29
|
+
getListenerCount(type) {
|
|
30
|
+
if (type) return this.eventBus.listenerCount(type);
|
|
31
|
+
return this.getEventTypes().reduce(((total, eventType) => total + this.eventBus.listenerCount(eventType)), 0);
|
|
32
|
+
}
|
|
33
|
+
clearAllListeners() {
|
|
34
|
+
this.getEventTypes().forEach((eventType => {
|
|
35
|
+
this.eventBus.removeAllListeners(eventType);
|
|
36
|
+
})), this.performanceOptimizer.clearAll(), this.callbackMap = new WeakMap;
|
|
37
|
+
}
|
|
38
|
+
getStatistics() {
|
|
39
|
+
const eventTypes = this.getEventTypes(), listenersByType = {};
|
|
40
|
+
return eventTypes.forEach((type => {
|
|
41
|
+
listenersByType[type] = this.eventBus.listenerCount(type);
|
|
42
|
+
})), {
|
|
43
|
+
totalEvents: eventTypes.length,
|
|
44
|
+
listenersByType: listenersByType,
|
|
45
|
+
totalListeners: Object.values(listenersByType).reduce(((sum, count) => sum + count), 0)
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
validateEvent(eventType, event) {
|
|
49
|
+
return EventValidator.validate(eventType, event);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=base-event-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/event/base-event-manager.ts"],"names":[],"mappings":"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","file":"base-event-manager.js","sourcesContent":["/**\n * 基础事件管理器\n * 提供通用的事件管理功能,避免代码重复\n */\n\nimport type { IEventBus, IEventManager, EventManagerConfig } from './event-interfaces';\nimport { EventValidator } from './event-validator';\nimport { EventPerformanceOptimizer } from './event-performance';\n\n/**\n * 基础事件管理器\n * 提供类型安全的事件管理功能\n */\nexport abstract class BaseEventManager<T extends Record<string, any>> implements IEventManager<T> {\n protected eventBus: IEventBus;\n protected config: EventManagerConfig;\n protected performanceOptimizer: EventPerformanceOptimizer;\n private callbackMap: WeakMap<Function, Function> = new WeakMap();\n\n constructor(eventBus: IEventBus, config: EventManagerConfig = {}) {\n this.eventBus = eventBus;\n this.config = {\n enableValidation: true,\n enablePerformanceMonitoring: false,\n enableErrorBoundary: true,\n maxListeners: 100,\n ...config\n };\n this.performanceOptimizer = new EventPerformanceOptimizer();\n }\n\n /**\n * 注册事件监听器\n */\n on<K extends keyof T>(type: K, callback: (event: T[K]) => void): void {\n let finalCallback: any = callback;\n\n // 应用验证(暂时禁用性能优化以解决测试问题)\n if (this.config.enableValidation) {\n finalCallback = (event: T[K]) => {\n if (this.validateEvent(type as string, event)) {\n callback(event);\n }\n };\n }\n\n this.eventBus.on(type as string, finalCallback);\n\n // 存储原始回调和包装回调的映射\n if (finalCallback !== callback) {\n this.callbackMap.set(callback, finalCallback);\n }\n }\n\n /**\n * 移除事件监听器\n */\n off<K extends keyof T>(type: K, callback?: (event: T[K]) => void): void {\n if (callback) {\n // 查找优化后的回调\n const optimizedCallback = this.callbackMap.get(callback);\n\n if (optimizedCallback) {\n this.eventBus.off(type as string, optimizedCallback as any);\n this.callbackMap.delete(callback);\n } else {\n // 如果没有找到优化后的回调,尝试直接移除原始回调\n this.eventBus.off(type as string, callback as any);\n }\n } else {\n // 移除所有监听器\n this.eventBus.off(type as string);\n\n // 清理所有相关的回调映射\n this.callbackMap = new WeakMap();\n }\n }\n\n /**\n * 触发事件\n */\n emit<K extends keyof T>(type: K, event: T[K]): void {\n if (this.config.enableValidation && !this.validateEvent(type as string, event)) {\n console.warn(`[BaseEventManager] Invalid event data for type '${String(type)}':`, event);\n return;\n }\n\n this.eventBus.emit(type as string, event);\n }\n\n /**\n * 获取事件监听器数量\n */\n getListenerCount(type?: keyof T): number {\n if (type) {\n return this.eventBus.listenerCount(type as string);\n }\n\n const eventTypes = this.getEventTypes();\n return eventTypes.reduce((total, eventType) => total + this.eventBus.listenerCount(eventType), 0);\n }\n\n /**\n * 清除所有事件监听器\n */\n clearAllListeners(): void {\n const eventTypes = this.getEventTypes();\n eventTypes.forEach(eventType => {\n this.eventBus.removeAllListeners(eventType);\n });\n\n // 清理性能优化器和回调映射\n this.performanceOptimizer.clearAll();\n this.callbackMap = new WeakMap();\n }\n\n /**\n * 获取统计信息\n */\n getStatistics() {\n const eventTypes = this.getEventTypes();\n const listenersByType: Record<string, number> = {};\n\n eventTypes.forEach(type => {\n listenersByType[type] = this.eventBus.listenerCount(type);\n });\n\n return {\n totalEvents: eventTypes.length,\n listenersByType,\n totalListeners: Object.values(listenersByType).reduce((sum, count) => sum + count, 0)\n };\n }\n\n /**\n * 验证事件数据\n * 子类可以重写此方法提供自定义验证\n */\n protected validateEvent(eventType: string, event: any): boolean {\n return EventValidator.validate(eventType, event);\n }\n\n /**\n * 获取当前管理器负责的事件类型列表\n * 子类必须实现此方法\n */\n protected abstract getEventTypes(): string[];\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type VTableSheet from '../components/vtable-sheet';
|
|
2
|
+
export declare class DomEventManager {
|
|
3
|
+
private sheet;
|
|
4
|
+
private boundHandlers;
|
|
5
|
+
constructor(sheet: VTableSheet);
|
|
6
|
+
private setupEventListeners;
|
|
7
|
+
private addEvent;
|
|
8
|
+
private handleWindowResize;
|
|
9
|
+
release(): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export class DomEventManager {
|
|
2
|
+
constructor(sheet) {
|
|
3
|
+
this.boundHandlers = new Map, this.sheet = sheet, this.setupEventListeners();
|
|
4
|
+
}
|
|
5
|
+
setupEventListeners() {
|
|
6
|
+
this.addEvent(window, "resize", this.handleWindowResize.bind(this));
|
|
7
|
+
}
|
|
8
|
+
addEvent(target, eventType, handler) {
|
|
9
|
+
target.addEventListener(eventType, handler), this.boundHandlers.set(`${eventType}-${handler.toString()}`, handler);
|
|
10
|
+
}
|
|
11
|
+
handleWindowResize(event) {
|
|
12
|
+
this.sheet.resize();
|
|
13
|
+
}
|
|
14
|
+
release() {
|
|
15
|
+
const element = this.sheet.getContainer();
|
|
16
|
+
for (const [key, handler] of this.boundHandlers.entries()) {
|
|
17
|
+
const eventType = key.split("-")[0];
|
|
18
|
+
"resize" === eventType ? window.removeEventListener(eventType, handler) : element.removeEventListener(eventType, handler);
|
|
19
|
+
}
|
|
20
|
+
this.boundHandlers.clear();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=dom-event-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/event/dom-event-manager.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,eAAe;IAQ1B,YAAY,KAAkB;QANtB,kBAAa,GAA+B,IAAI,GAAG,EAAE,CAAC;QAO5D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAKO,mBAAmB;QAQzB,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IAQO,QAAQ,CAAC,MAAmB,EAAE,SAAiB,EAAE,OAAsB;QAC7E,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAMO,kBAAkB,CAAC,KAAc;QAEvC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACtB,CAAC;IAKD,OAAO;QACL,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QAG1C,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,EAAE;YACzD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAEpC,IAAI,SAAS,KAAK,QAAQ,EAAE;gBAC1B,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;aAChD;iBAAM;gBACL,OAAO,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;aACjD;SACF;QAGD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;CACF","file":"dom-event-manager.js","sourcesContent":["import type VTableSheet from '../components/vtable-sheet';\n\n/**\n * 事件管理器类\n * 负责处理VTableSheet组件的DOM事件和内部业务逻辑\n */\nexport class DomEventManager {\n private sheet: VTableSheet;\n private boundHandlers: Map<string, EventListener> = new Map();\n\n /**\n * 创建事件管理器实例\n * @param sheet VTableSheet实例\n */\n constructor(sheet: VTableSheet) {\n this.sheet = sheet;\n\n this.setupEventListeners();\n }\n\n /**\n * 设置DOM事件监听\n */\n private setupEventListeners(): void {\n // 获取Sheet元素\n // const element = this.sheet.getContainer();\n\n // // 设置鼠标事件\n // this.addEvent(element, 'mousedown', this.handleMouseDown.bind(this));\n\n // 窗口大小变化事件\n this.addEvent(window, 'resize', this.handleWindowResize.bind(this));\n }\n\n /**\n * 添加DOM事件监听\n * @param target 事件目标\n * @param eventType 事件类型\n * @param handler 事件处理函数\n */\n private addEvent(target: EventTarget, eventType: string, handler: EventListener): void {\n target.addEventListener(eventType, handler);\n this.boundHandlers.set(`${eventType}-${handler.toString()}`, handler);\n }\n\n /**\n * 处理窗口大小变化事件\n * @param event UI事件\n */\n private handleWindowResize(event: UIEvent): void {\n // 更新Sheet大小\n this.sheet.resize();\n }\n\n /**\n * 释放所有事件处理函数\n */\n release(): void {\n const element = this.sheet.getContainer();\n\n // 移除所有DOM事件监听器\n for (const [key, handler] of this.boundHandlers.entries()) {\n const eventType = key.split('-')[0];\n\n if (eventType === 'resize') {\n window.removeEventListener(eventType, handler);\n } else {\n element.removeEventListener(eventType, handler);\n }\n }\n\n // 清空事件处理函数映射\n this.boundHandlers.clear();\n }\n}\n"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface IEventBus {
|
|
2
|
+
on: (eventType: string, callback: (...args: any[]) => void) => void;
|
|
3
|
+
off: (eventType: string, callback?: (...args: any[]) => void) => void;
|
|
4
|
+
emit: (eventType: string, ...args: any[]) => void;
|
|
5
|
+
once: (eventType: string, callback: (...args: any[]) => void) => void;
|
|
6
|
+
removeAllListeners: (eventType?: string) => void;
|
|
7
|
+
listenerCount: (eventType: string) => number;
|
|
8
|
+
}
|
|
9
|
+
export interface IEventManager<T extends Record<string, any>> {
|
|
10
|
+
on: <K extends keyof T>(type: K, callback: (event: T[K]) => void) => void;
|
|
11
|
+
off: <K extends keyof T>(type: K, callback?: (event: T[K]) => void) => void;
|
|
12
|
+
emit: <K extends keyof T>(type: K, event: T[K]) => void;
|
|
13
|
+
clearAllListeners: () => void;
|
|
14
|
+
getListenerCount: (type?: keyof T) => number;
|
|
15
|
+
}
|
|
16
|
+
export interface IEventSource {
|
|
17
|
+
getEventBus: () => IEventBus;
|
|
18
|
+
}
|
|
19
|
+
export interface IWorksheetEventSource extends IEventSource {
|
|
20
|
+
readonly sheetKey: string;
|
|
21
|
+
readonly sheetTitle: string;
|
|
22
|
+
readonly tableInstance?: any;
|
|
23
|
+
}
|
|
24
|
+
export interface ISpreadsheetEventSource extends IEventSource {
|
|
25
|
+
readonly workSheetInstances: Map<string, IWorksheetEventSource>;
|
|
26
|
+
}
|
|
27
|
+
export interface IEventValidator<T = any> {
|
|
28
|
+
validate: (event: T) => boolean;
|
|
29
|
+
getErrorMessage: (event: T) => string;
|
|
30
|
+
}
|
|
31
|
+
export interface EventManagerConfig {
|
|
32
|
+
enableValidation?: boolean;
|
|
33
|
+
enablePerformanceMonitoring?: boolean;
|
|
34
|
+
maxListeners?: number;
|
|
35
|
+
enableErrorBoundary?: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface EventStatistics {
|
|
38
|
+
totalEvents: number;
|
|
39
|
+
listenersByType: Record<string, number>;
|
|
40
|
+
performanceMetrics?: Record<string, {
|
|
41
|
+
avgDuration: number;
|
|
42
|
+
maxDuration: number;
|
|
43
|
+
minDuration: number;
|
|
44
|
+
callCount: number;
|
|
45
|
+
}>;
|
|
46
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/event/event-interfaces.ts"],"names":[],"mappings":"","file":"event-interfaces.js","sourcesContent":["/**\n * 事件系统接口定义\n * 提供松耦合的事件管理架构\n */\n\nimport type { VTableSheetEventType } from '../ts-types/spreadsheet-events';\n\n/**\n * 事件总线接口\n */\nexport interface IEventBus {\n on: (eventType: string, callback: (...args: any[]) => void) => void;\n off: (eventType: string, callback?: (...args: any[]) => void) => void;\n emit: (eventType: string, ...args: any[]) => void;\n once: (eventType: string, callback: (...args: any[]) => void) => void;\n removeAllListeners: (eventType?: string) => void;\n listenerCount: (eventType: string) => number;\n}\n\n/**\n * 事件管理器接口\n */\nexport interface IEventManager<T extends Record<string, any>> {\n on: <K extends keyof T>(type: K, callback: (event: T[K]) => void) => void;\n off: <K extends keyof T>(type: K, callback?: (event: T[K]) => void) => void;\n emit: <K extends keyof T>(type: K, event: T[K]) => void;\n clearAllListeners: () => void;\n getListenerCount: (type?: keyof T) => number;\n}\n\n/**\n * 事件源接口 - 提供事件总线访问\n */\nexport interface IEventSource {\n getEventBus: () => IEventBus;\n}\n\n/**\n * 工作表事件源接口\n */\nexport interface IWorksheetEventSource extends IEventSource {\n readonly sheetKey: string;\n readonly sheetTitle: string;\n readonly tableInstance?: any; // Optional table instance for event relay\n}\n\n/**\n * 电子表格事件源接口\n */\nexport interface ISpreadsheetEventSource extends IEventSource {\n readonly workSheetInstances: Map<string, IWorksheetEventSource>;\n}\n\n/**\n * 事件验证器接口\n */\nexport interface IEventValidator<T = any> {\n validate: (event: T) => boolean;\n getErrorMessage: (event: T) => string;\n}\n\n/**\n * 事件配置接口\n */\nexport interface EventManagerConfig {\n /** 是否启用事件验证 */\n enableValidation?: boolean;\n /** 是否启用性能监控 */\n enablePerformanceMonitoring?: boolean;\n /** 事件监听器最大数量 */\n maxListeners?: number;\n /** 是否启用错误边界 */\n enableErrorBoundary?: boolean;\n}\n\n/**\n * 事件统计信息\n */\nexport interface EventStatistics {\n totalEvents: number;\n listenersByType: Record<string, number>;\n performanceMetrics?: Record<\n string,\n {\n avgDuration: number;\n maxDuration: number;\n minDuration: number;\n callCount: number;\n }\n >;\n}\n"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface DebounceConfig {
|
|
2
|
+
delay: number;
|
|
3
|
+
immediate?: boolean;
|
|
4
|
+
maxWait?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ThrottleConfig {
|
|
7
|
+
interval: number;
|
|
8
|
+
leading?: boolean;
|
|
9
|
+
trailing?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare class EventPerformanceOptimizer {
|
|
12
|
+
private debounceTimers;
|
|
13
|
+
private throttleTimers;
|
|
14
|
+
private lastCallTimes;
|
|
15
|
+
debounce<T extends (...args: any[]) => void>(func: T, config: DebounceConfig): T;
|
|
16
|
+
throttle<T extends (...args: any[]) => void>(func: T, config: ThrottleConfig): T;
|
|
17
|
+
clearAll(): void;
|
|
18
|
+
static getRecommendedDebounceConfig(eventType: string): DebounceConfig | null;
|
|
19
|
+
static getRecommendedThrottleConfig(eventType: string): ThrottleConfig | null;
|
|
20
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export class EventPerformanceOptimizer {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.debounceTimers = new Map, this.throttleTimers = new Map, this.lastCallTimes = new Map;
|
|
4
|
+
}
|
|
5
|
+
debounce(func, config) {
|
|
6
|
+
const {delay: delay, immediate: immediate = !1, maxWait: maxWait} = config;
|
|
7
|
+
let timeout, lastCallTime = 0, lastInvokeTime = 0;
|
|
8
|
+
return (...args) => {
|
|
9
|
+
const now = Date.now();
|
|
10
|
+
if (lastCallTime = now, immediate && !timeout && now - lastInvokeTime > delay) return func(...args),
|
|
11
|
+
void (lastInvokeTime = now);
|
|
12
|
+
if (!timeout || now - lastCallTime >= delay || maxWait && now - lastInvokeTime >= maxWait) return timeout && (clearTimeout(timeout),
|
|
13
|
+
timeout = void 0), func(...args), void (lastInvokeTime = now);
|
|
14
|
+
timeout || (timeout = setTimeout((() => {
|
|
15
|
+
func(...args), lastInvokeTime = Date.now(), timeout = void 0;
|
|
16
|
+
}), delay));
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
throttle(func, config) {
|
|
20
|
+
const {interval: interval, leading: leading = !0, trailing: trailing = !0} = config;
|
|
21
|
+
let timeout, lastArgs, lastInvokeTime = 0;
|
|
22
|
+
return (...args) => {
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
lastArgs = args, lastInvokeTime || leading || (lastInvokeTime = now);
|
|
25
|
+
const remaining = interval - (now - lastInvokeTime);
|
|
26
|
+
remaining <= 0 || remaining > interval ? (timeout && (clearTimeout(timeout), timeout = void 0),
|
|
27
|
+
lastInvokeTime = now, func(...args)) : !timeout && trailing && (timeout = setTimeout((() => {
|
|
28
|
+
lastInvokeTime = leading ? Date.now() : 0, timeout = void 0, lastArgs && func(...lastArgs);
|
|
29
|
+
}), remaining));
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
clearAll() {
|
|
33
|
+
for (const timer of this.debounceTimers.values()) clearTimeout(timer);
|
|
34
|
+
for (const timer of this.throttleTimers.values()) clearTimeout(timer);
|
|
35
|
+
this.debounceTimers.clear(), this.throttleTimers.clear(), this.lastCallTimes.clear();
|
|
36
|
+
}
|
|
37
|
+
static getRecommendedDebounceConfig(eventType) {
|
|
38
|
+
switch (eventType) {
|
|
39
|
+
case "resized":
|
|
40
|
+
case "spreadsheet_resized":
|
|
41
|
+
return {
|
|
42
|
+
delay: 300,
|
|
43
|
+
immediate: !0,
|
|
44
|
+
maxWait: 1e3
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
case "range_data_changed":
|
|
48
|
+
return {
|
|
49
|
+
delay: 100,
|
|
50
|
+
immediate: !1
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
case "formula_calculate_start":
|
|
54
|
+
case "formula_calculate_end":
|
|
55
|
+
return {
|
|
56
|
+
delay: 50,
|
|
57
|
+
immediate: !1
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
default:
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
static getRecommendedThrottleConfig(eventType) {
|
|
65
|
+
switch (eventType) {
|
|
66
|
+
case "mousemove":
|
|
67
|
+
case "scroll":
|
|
68
|
+
return {
|
|
69
|
+
interval: 16,
|
|
70
|
+
leading: !0,
|
|
71
|
+
trailing: !0
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
case "resize":
|
|
75
|
+
return {
|
|
76
|
+
interval: 100,
|
|
77
|
+
leading: !0,
|
|
78
|
+
trailing: !0
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
default:
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=event-performance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/event/event-performance.ts"],"names":[],"mappings":"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","file":"event-performance.js","sourcesContent":["/**\n * 事件性能优化工具\n * 提供防抖、节流等性能优化功能\n */\n\n/**\n * 防抖配置\n */\nexport interface DebounceConfig {\n /** 延迟时间(毫秒) */\n delay: number;\n /** 是否立即执行第一次 */\n immediate?: boolean;\n /** 最大等待时间 */\n maxWait?: number;\n}\n\n/**\n * 节流配置\n */\nexport interface ThrottleConfig {\n /** 间隔时间(毫秒) */\n interval: number;\n /** 是否立即执行第一次 */\n leading?: boolean;\n /** 是否执行最后一次 */\n trailing?: boolean;\n}\n\n/**\n * 事件性能优化器\n */\nexport class EventPerformanceOptimizer {\n private debounceTimers: Map<string, NodeJS.Timeout> = new Map();\n private throttleTimers: Map<string, NodeJS.Timeout> = new Map();\n private lastCallTimes: Map<string, number> = new Map();\n\n /**\n * 创建防抖函数\n */\n debounce<T extends (...args: any[]) => void>(func: T, config: DebounceConfig): T {\n const { delay, immediate = false, maxWait } = config;\n let timeout: NodeJS.Timeout | undefined;\n let lastCallTime = 0;\n let lastInvokeTime = 0;\n\n return ((...args: Parameters<T>) => {\n const now = Date.now();\n lastCallTime = now;\n\n if (immediate && !timeout && now - lastInvokeTime > delay) {\n func(...args);\n lastInvokeTime = now;\n return;\n }\n\n const shouldInvoke = () => {\n const timeSinceLastCall = now - lastCallTime;\n const timeSinceLastInvoke = now - lastInvokeTime;\n\n return !timeout || timeSinceLastCall >= delay || (maxWait && timeSinceLastInvoke >= maxWait);\n };\n\n if (shouldInvoke()) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n func(...args);\n lastInvokeTime = now;\n return;\n }\n\n if (!timeout) {\n timeout = setTimeout(() => {\n func(...args);\n lastInvokeTime = Date.now();\n timeout = undefined;\n }, delay);\n }\n }) as T;\n }\n\n /**\n * 创建节流函数\n */\n throttle<T extends (...args: any[]) => void>(func: T, config: ThrottleConfig): T {\n const { interval, leading = true, trailing = true } = config;\n let timeout: NodeJS.Timeout | undefined;\n let lastInvokeTime = 0;\n let lastArgs: Parameters<T> | undefined;\n\n return ((...args: Parameters<T>) => {\n const now = Date.now();\n lastArgs = args;\n\n if (!lastInvokeTime && !leading) {\n lastInvokeTime = now;\n }\n\n const remaining = interval - (now - lastInvokeTime);\n\n if (remaining <= 0 || remaining > interval) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = undefined;\n }\n\n lastInvokeTime = now;\n func(...args);\n } else if (!timeout && trailing) {\n timeout = setTimeout(() => {\n lastInvokeTime = leading ? Date.now() : 0;\n timeout = undefined;\n if (lastArgs) {\n func(...lastArgs);\n }\n }, remaining);\n }\n }) as T;\n }\n\n /**\n * 清理所有定时器\n */\n clearAll(): void {\n for (const timer of this.debounceTimers.values()) {\n clearTimeout(timer);\n }\n for (const timer of this.throttleTimers.values()) {\n clearTimeout(timer);\n }\n this.debounceTimers.clear();\n this.throttleTimers.clear();\n this.lastCallTimes.clear();\n }\n\n /**\n * 获取推荐的防抖配置\n */\n static getRecommendedDebounceConfig(eventType: string): DebounceConfig | null {\n switch (eventType) {\n case 'resized':\n case 'spreadsheet_resized':\n return { delay: 300, immediate: true, maxWait: 1000 };\n\n case 'range_data_changed':\n return { delay: 100, immediate: false };\n\n case 'formula_calculate_start':\n case 'formula_calculate_end':\n return { delay: 50, immediate: false };\n\n default:\n return null;\n }\n }\n\n /**\n * 获取推荐的节流配置\n */\n static getRecommendedThrottleConfig(eventType: string): ThrottleConfig | null {\n switch (eventType) {\n case 'mousemove':\n case 'scroll':\n return { interval: 16, leading: true, trailing: true }; // ~60fps\n\n case 'resize':\n return { interval: 100, leading: true, trailing: true };\n\n default:\n return null;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class EventValidator {
|
|
2
|
+
static validate(eventType: string, event: any): boolean;
|
|
3
|
+
private static validateSheetEvent;
|
|
4
|
+
private static validateFormulaEvent;
|
|
5
|
+
private static validateDataEvent;
|
|
6
|
+
private static validateImportEvent;
|
|
7
|
+
private static validateExportEvent;
|
|
8
|
+
private static validateCrossSheetEvent;
|
|
9
|
+
static getErrorMessage(eventType: string, event: any): string;
|
|
10
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { VTableSheetEventType } from "../ts-types/spreadsheet-events";
|
|
2
|
+
|
|
3
|
+
export class EventValidator {
|
|
4
|
+
static validate(eventType, event) {
|
|
5
|
+
if (void 0 === event) return !0;
|
|
6
|
+
if (event && "object" != typeof event) return !1;
|
|
7
|
+
switch (eventType) {
|
|
8
|
+
case VTableSheetEventType.SHEET_ADDED:
|
|
9
|
+
case VTableSheetEventType.SHEET_REMOVED:
|
|
10
|
+
case VTableSheetEventType.SHEET_RENAMED:
|
|
11
|
+
case VTableSheetEventType.SHEET_MOVED:
|
|
12
|
+
case VTableSheetEventType.SHEET_VISIBILITY_CHANGED:
|
|
13
|
+
return this.validateSheetEvent(event);
|
|
14
|
+
|
|
15
|
+
case VTableSheetEventType.FORMULA_ERROR:
|
|
16
|
+
case VTableSheetEventType.FORMULA_ADDED:
|
|
17
|
+
case VTableSheetEventType.FORMULA_REMOVED:
|
|
18
|
+
case VTableSheetEventType.FORMULA_CALCULATE_START:
|
|
19
|
+
case VTableSheetEventType.FORMULA_CALCULATE_END:
|
|
20
|
+
case VTableSheetEventType.FORMULA_DEPENDENCY_CHANGED:
|
|
21
|
+
return this.validateFormulaEvent(event);
|
|
22
|
+
|
|
23
|
+
case VTableSheetEventType.DATA_LOADED:
|
|
24
|
+
return this.validateDataEvent(event);
|
|
25
|
+
|
|
26
|
+
case VTableSheetEventType.IMPORT_START:
|
|
27
|
+
case VTableSheetEventType.IMPORT_COMPLETED:
|
|
28
|
+
case VTableSheetEventType.IMPORT_ERROR:
|
|
29
|
+
return this.validateImportEvent(event);
|
|
30
|
+
|
|
31
|
+
case VTableSheetEventType.EXPORT_START:
|
|
32
|
+
case VTableSheetEventType.EXPORT_COMPLETED:
|
|
33
|
+
case VTableSheetEventType.EXPORT_ERROR:
|
|
34
|
+
return this.validateExportEvent(event);
|
|
35
|
+
|
|
36
|
+
case VTableSheetEventType.CROSS_SHEET_REFERENCE_UPDATED:
|
|
37
|
+
return this.validateCrossSheetEvent(event);
|
|
38
|
+
|
|
39
|
+
case VTableSheetEventType.SPREADSHEET_READY:
|
|
40
|
+
case VTableSheetEventType.SPREADSHEET_DESTROYED:
|
|
41
|
+
case VTableSheetEventType.SPREADSHEET_RESIZED:
|
|
42
|
+
case VTableSheetEventType.CROSS_SHEET_FORMULA_CALCULATE_START:
|
|
43
|
+
case VTableSheetEventType.CROSS_SHEET_FORMULA_CALCULATE_END:
|
|
44
|
+
default:
|
|
45
|
+
return !0;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
static validateSheetEvent(event) {
|
|
49
|
+
return event.sheetKey && "string" == typeof event.sheetKey;
|
|
50
|
+
}
|
|
51
|
+
static validateFormulaEvent(event) {
|
|
52
|
+
return !(!event.sheetKey || "string" != typeof event.sheetKey) && (event.type === VTableSheetEventType.FORMULA_ERROR ? event.cell && event.formula && event.error : event.type !== VTableSheetEventType.FORMULA_ADDED && event.type !== VTableSheetEventType.FORMULA_REMOVED || event.cell && "number" == typeof event.cell.row && "number" == typeof event.cell.col);
|
|
53
|
+
}
|
|
54
|
+
static validateDataEvent(event) {
|
|
55
|
+
return event.sheetKey && "string" == typeof event.sheetKey;
|
|
56
|
+
}
|
|
57
|
+
static validateImportEvent(event) {
|
|
58
|
+
return event.fileType && [ "xlsx", "xls", "csv" ].includes(event.fileType);
|
|
59
|
+
}
|
|
60
|
+
static validateExportEvent(event) {
|
|
61
|
+
return event.fileType && [ "xlsx", "csv" ].includes(event.fileType) && "boolean" == typeof event.allSheets;
|
|
62
|
+
}
|
|
63
|
+
static validateCrossSheetEvent(event) {
|
|
64
|
+
return event.sourceSheetKey && "string" == typeof event.sourceSheetKey && Array.isArray(event.targetSheetKeys) && "number" == typeof event.affectedFormulaCount;
|
|
65
|
+
}
|
|
66
|
+
static getErrorMessage(eventType, event) {
|
|
67
|
+
return this.validate(eventType, event) ? "" : `事件数据验证失败: ${eventType} - ${JSON.stringify(event)}`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=event-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/event/event-validator.ts"],"names":[],"mappings":"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","file":"event-validator.js","sourcesContent":["/**\n * 事件验证工具\n * 提供事件数据验证功能\n */\n\nimport { VTableSheetEventType } from '../ts-types/spreadsheet-events';\n\n/**\n * 事件验证器\n */\nexport class EventValidator {\n /**\n * 验证事件数据\n */\n static validate(eventType: string, event: any): boolean {\n // 基础验证:事件可以是 undefined(对于无数据事件)\n if (event === undefined) {\n return true;\n }\n\n // 如果事件存在,必须是对象\n if (event && typeof event !== 'object') {\n return false;\n }\n\n // 根据事件类型进行特定验证\n switch (eventType) {\n // Sheet 相关事件必须包含 sheetKey\n case VTableSheetEventType.SHEET_ADDED:\n case VTableSheetEventType.SHEET_REMOVED:\n case VTableSheetEventType.SHEET_RENAMED:\n case VTableSheetEventType.SHEET_MOVED:\n case VTableSheetEventType.SHEET_VISIBILITY_CHANGED:\n return this.validateSheetEvent(event);\n\n // 公式相关事件必须包含 sheetKey\n case VTableSheetEventType.FORMULA_ERROR:\n case VTableSheetEventType.FORMULA_ADDED:\n case VTableSheetEventType.FORMULA_REMOVED:\n case VTableSheetEventType.FORMULA_CALCULATE_START:\n case VTableSheetEventType.FORMULA_CALCULATE_END:\n case VTableSheetEventType.FORMULA_DEPENDENCY_CHANGED:\n return this.validateFormulaEvent(event);\n\n // 数据相关事件必须包含 sheetKey\n case VTableSheetEventType.DATA_LOADED:\n return this.validateDataEvent(event);\n\n // 导入导出事件\n case VTableSheetEventType.IMPORT_START:\n case VTableSheetEventType.IMPORT_COMPLETED:\n case VTableSheetEventType.IMPORT_ERROR:\n return this.validateImportEvent(event);\n\n case VTableSheetEventType.EXPORT_START:\n case VTableSheetEventType.EXPORT_COMPLETED:\n case VTableSheetEventType.EXPORT_ERROR:\n return this.validateExportEvent(event);\n\n // 跨Sheet事件\n case VTableSheetEventType.CROSS_SHEET_REFERENCE_UPDATED:\n return this.validateCrossSheetEvent(event);\n\n // 电子表格级别事件(不需要sheetKey)\n case VTableSheetEventType.SPREADSHEET_READY:\n case VTableSheetEventType.SPREADSHEET_DESTROYED:\n case VTableSheetEventType.SPREADSHEET_RESIZED:\n case VTableSheetEventType.CROSS_SHEET_FORMULA_CALCULATE_START:\n case VTableSheetEventType.CROSS_SHEET_FORMULA_CALCULATE_END:\n return true;\n\n default:\n // 未知事件类型,默认通过(向后兼容)\n console.warn(`[EventValidator] 未知事件类型: ${eventType}`);\n return true;\n }\n }\n\n /**\n * 验证Sheet事件\n */\n private static validateSheetEvent(event: any): boolean {\n return event.sheetKey && typeof event.sheetKey === 'string';\n }\n\n /**\n * 验证公式事件\n */\n private static validateFormulaEvent(event: any): boolean {\n if (!event.sheetKey || typeof event.sheetKey !== 'string') {\n return false;\n }\n\n // 公式错误事件需要额外的验证\n if (event.type === VTableSheetEventType.FORMULA_ERROR) {\n return event.cell && event.formula && event.error;\n }\n\n // 公式变更事件需要额外的验证\n if (event.type === VTableSheetEventType.FORMULA_ADDED || event.type === VTableSheetEventType.FORMULA_REMOVED) {\n return event.cell && typeof event.cell.row === 'number' && typeof event.cell.col === 'number';\n }\n\n return true;\n }\n\n /**\n * 验证数据事件\n */\n private static validateDataEvent(event: any): boolean {\n return event.sheetKey && typeof event.sheetKey === 'string';\n }\n\n /**\n * 验证导入事件\n */\n private static validateImportEvent(event: any): boolean {\n return event.fileType && ['xlsx', 'xls', 'csv'].includes(event.fileType);\n }\n\n /**\n * 验证导出事件\n */\n private static validateExportEvent(event: any): boolean {\n return event.fileType && ['xlsx', 'csv'].includes(event.fileType) && typeof event.allSheets === 'boolean';\n }\n\n /**\n * 验证跨Sheet事件\n */\n private static validateCrossSheetEvent(event: any): boolean {\n return (\n event.sourceSheetKey &&\n typeof event.sourceSheetKey === 'string' &&\n Array.isArray(event.targetSheetKeys) &&\n typeof event.affectedFormulaCount === 'number'\n );\n }\n\n /**\n * 获取验证错误信息\n */\n static getErrorMessage(eventType: string, event: any): string {\n if (this.validate(eventType, event)) {\n return '';\n }\n\n return `事件数据验证失败: ${eventType} - ${JSON.stringify(event)}`;\n }\n}\n"]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { WorkSheetEventManager } from './worksheet-event-manager';
|
|
2
|
+
import type { FormulaErrorEvent } from '../ts-types/spreadsheet-events';
|
|
3
|
+
export declare class FormulaEventUtils {
|
|
4
|
+
static onFormulaErrorWithUserFeedback(eventManager: WorkSheetEventManager, errorHandler: (error: FormulaErrorEvent) => void): void;
|
|
5
|
+
static onFormulaPerformanceMonitoring(eventManager: WorkSheetEventManager, threshold?: number): void;
|
|
6
|
+
static setupFormulaEventListeners(eventManager: WorkSheetEventManager, listeners: {
|
|
7
|
+
onFormulaAdded?: (cell: {
|
|
8
|
+
row: number;
|
|
9
|
+
col: number;
|
|
10
|
+
}, formula?: string) => void;
|
|
11
|
+
onFormulaRemoved?: (cell: {
|
|
12
|
+
row: number;
|
|
13
|
+
col: number;
|
|
14
|
+
}, formula?: string) => void;
|
|
15
|
+
onFormulaError?: (event: FormulaErrorEvent) => void;
|
|
16
|
+
onFormulaCalculateStart?: (formulaCount?: number) => void;
|
|
17
|
+
onFormulaCalculateEnd?: (formulaCount?: number, duration?: number) => void;
|
|
18
|
+
onFormulaDependencyChanged?: () => void;
|
|
19
|
+
}): void;
|
|
20
|
+
static createFormulaProgressTracker(eventManager: WorkSheetEventManager, onProgress?: (progress: number, total: number) => void): {
|
|
21
|
+
start: () => void;
|
|
22
|
+
end: () => void;
|
|
23
|
+
};
|
|
24
|
+
static createFormulaErrorCollector(eventManager: WorkSheetEventManager): {
|
|
25
|
+
getErrors: () => FormulaErrorEvent[];
|
|
26
|
+
clear: () => void;
|
|
27
|
+
start: () => void;
|
|
28
|
+
end: () => void;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export class FormulaEventUtils {
|
|
2
|
+
static onFormulaErrorWithUserFeedback(eventManager, errorHandler) {
|
|
3
|
+
eventManager.on("formula_error", (event => {
|
|
4
|
+
errorHandler(event);
|
|
5
|
+
}));
|
|
6
|
+
}
|
|
7
|
+
static onFormulaPerformanceMonitoring(eventManager, threshold = 1e3) {
|
|
8
|
+
eventManager.on("formula_calculate_end", (event => {
|
|
9
|
+
event.duration && event.duration;
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
static setupFormulaEventListeners(eventManager, listeners) {
|
|
13
|
+
listeners.onFormulaAdded && eventManager.on("formula_added", (event => {
|
|
14
|
+
listeners.onFormulaAdded(event.cell, event.formula);
|
|
15
|
+
})), listeners.onFormulaRemoved && eventManager.on("formula_removed", (event => {
|
|
16
|
+
listeners.onFormulaRemoved(event.cell, event.formula);
|
|
17
|
+
})), listeners.onFormulaError && eventManager.on("formula_error", listeners.onFormulaError),
|
|
18
|
+
listeners.onFormulaCalculateStart && eventManager.on("formula_calculate_start", (event => {
|
|
19
|
+
listeners.onFormulaCalculateStart(event.formulaCount);
|
|
20
|
+
})), listeners.onFormulaCalculateEnd && eventManager.on("formula_calculate_end", (event => {
|
|
21
|
+
listeners.onFormulaCalculateEnd(event.formulaCount, event.duration);
|
|
22
|
+
})), listeners.onFormulaDependencyChanged && eventManager.on("formula_dependency_changed", (() => {
|
|
23
|
+
listeners.onFormulaDependencyChanged();
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
static createFormulaProgressTracker(eventManager, onProgress) {
|
|
27
|
+
let startTime, totalFormulas;
|
|
28
|
+
const startListener = event => {
|
|
29
|
+
startTime = Date.now(), totalFormulas = event.formulaCount || 0, onProgress && onProgress(0, totalFormulas);
|
|
30
|
+
}, endListener = event => {
|
|
31
|
+
event.duration || Date.now();
|
|
32
|
+
onProgress && onProgress(totalFormulas, totalFormulas);
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
start: () => {
|
|
36
|
+
eventManager.on("formula_calculate_start", startListener), eventManager.on("formula_calculate_end", endListener);
|
|
37
|
+
},
|
|
38
|
+
end: () => {
|
|
39
|
+
eventManager.off("formula_calculate_start", startListener), eventManager.off("formula_calculate_end", endListener);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
static createFormulaErrorCollector(eventManager) {
|
|
44
|
+
const errors = [], errorListener = event => {
|
|
45
|
+
errors.push(event);
|
|
46
|
+
};
|
|
47
|
+
return {
|
|
48
|
+
getErrors: () => [ ...errors ],
|
|
49
|
+
clear: () => {
|
|
50
|
+
errors.length = 0;
|
|
51
|
+
},
|
|
52
|
+
start: () => {
|
|
53
|
+
eventManager.on("formula_error", errorListener);
|
|
54
|
+
},
|
|
55
|
+
end: () => {
|
|
56
|
+
eventManager.off("formula_error", errorListener);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=formula-event-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/event/formula-event-utils.ts"],"names":[],"mappings":"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","file":"formula-event-utils.js","sourcesContent":["/**\n * 公式事件处理工具类\n * 提供常用的公式事件处理功能\n */\n\nimport type { WorkSheetEventManager } from './worksheet-event-manager';\nimport type { FormulaErrorEvent, FormulaCalculateEvent } from '../ts-types/spreadsheet-events';\n\n/**\n * 公式事件处理工具类\n */\nexport class FormulaEventUtils {\n /**\n * 监听公式错误事件并显示用户友好的错误信息\n */\n static onFormulaErrorWithUserFeedback(\n eventManager: WorkSheetEventManager,\n errorHandler: (error: FormulaErrorEvent) => void\n ): void {\n eventManager.on('formula_error', (event: FormulaErrorEvent) => {\n // 调用用户提供的错误处理器\n errorHandler(event);\n\n // 可以在这里添加默认的错误处理逻辑\n console.error(`公式错误 - Sheet: ${event.sheetKey}, 单元格: [${event.cell.row}, ${event.cell.col}]`, event.error);\n });\n }\n\n /**\n * 监听公式计算性能并记录慢查询\n */\n static onFormulaPerformanceMonitoring(\n eventManager: WorkSheetEventManager,\n threshold: number = 1000 // 默认阈值1秒\n ): void {\n eventManager.on('formula_calculate_end', (event: FormulaCalculateEvent) => {\n if (event.duration && event.duration > threshold) {\n console.warn(\n `慢公式计算警告 - Sheet: ${event.sheetKey}, 公式数量: ${event.formulaCount}, 耗时: ${event.duration}ms`\n );\n }\n });\n }\n\n /**\n * 批量监听多个公式相关事件\n */\n static setupFormulaEventListeners(\n eventManager: WorkSheetEventManager,\n listeners: {\n onFormulaAdded?: (cell: { row: number; col: number }, formula?: string) => void;\n onFormulaRemoved?: (cell: { row: number; col: number }, formula?: string) => void;\n onFormulaError?: (event: FormulaErrorEvent) => void;\n onFormulaCalculateStart?: (formulaCount?: number) => void;\n onFormulaCalculateEnd?: (formulaCount?: number, duration?: number) => void;\n onFormulaDependencyChanged?: () => void;\n }\n ): void {\n if (listeners.onFormulaAdded) {\n eventManager.on('formula_added', event => {\n listeners.onFormulaAdded!(event.cell, event.formula);\n });\n }\n\n if (listeners.onFormulaRemoved) {\n eventManager.on('formula_removed', event => {\n listeners.onFormulaRemoved!(event.cell, event.formula);\n });\n }\n\n if (listeners.onFormulaError) {\n eventManager.on('formula_error', listeners.onFormulaError);\n }\n\n if (listeners.onFormulaCalculateStart) {\n eventManager.on('formula_calculate_start', event => {\n listeners.onFormulaCalculateStart!(event.formulaCount);\n });\n }\n\n if (listeners.onFormulaCalculateEnd) {\n eventManager.on('formula_calculate_end', event => {\n listeners.onFormulaCalculateEnd!(event.formulaCount, event.duration);\n });\n }\n\n if (listeners.onFormulaDependencyChanged) {\n eventManager.on('formula_dependency_changed', () => {\n listeners.onFormulaDependencyChanged!();\n });\n }\n }\n\n /**\n * 创建公式计算进度跟踪器\n */\n static createFormulaProgressTracker(\n eventManager: WorkSheetEventManager,\n onProgress?: (progress: number, total: number) => void\n ): {\n start: () => void;\n end: () => void;\n } {\n let startTime: number;\n let totalFormulas: number;\n\n const startListener = (event: FormulaCalculateEvent) => {\n startTime = Date.now();\n totalFormulas = event.formulaCount || 0;\n if (onProgress) {\n onProgress(0, totalFormulas);\n }\n };\n\n const endListener = (event: FormulaCalculateEvent) => {\n const duration = event.duration || Date.now() - startTime;\n if (onProgress) {\n onProgress(totalFormulas, totalFormulas);\n }\n console.log(`公式计算完成 - 数量: ${event.formulaCount}, 耗时: ${duration}ms`);\n };\n\n return {\n start: () => {\n eventManager.on('formula_calculate_start', startListener);\n eventManager.on('formula_calculate_end', endListener);\n },\n end: () => {\n eventManager.off('formula_calculate_start', startListener);\n eventManager.off('formula_calculate_end', endListener);\n }\n };\n }\n\n /**\n * 创建公式错误统计器\n */\n static createFormulaErrorCollector(eventManager: WorkSheetEventManager): {\n getErrors: () => FormulaErrorEvent[];\n clear: () => void;\n start: () => void;\n end: () => void;\n } {\n const errors: FormulaErrorEvent[] = [];\n\n const errorListener = (event: FormulaErrorEvent) => {\n errors.push(event);\n };\n\n return {\n getErrors: () => [...errors],\n clear: () => {\n errors.length = 0;\n },\n start: () => {\n eventManager.on('formula_error', errorListener);\n },\n end: () => {\n eventManager.off('formula_error', errorListener);\n }\n };\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { BaseEventManager } from './base-event-manager';
|
|
2
|
+
export { VTableSheetEventBus } from './vtable-sheet-event-bus';
|
|
3
|
+
export { EventValidator } from './event-validator';
|
|
4
|
+
export { EventPerformanceOptimizer } from './event-performance';
|
|
5
|
+
export { TableEventRelay } from './table-event-relay';
|
|
6
|
+
export { WorkSheetEventManager } from './worksheet-event-manager';
|
|
7
|
+
export { SpreadSheetEventManager } from './spreadsheet-event-manager';
|
|
8
|
+
export { FormulaEventUtils } from './formula-event-utils';
|
|
9
|
+
export type { IEventBus, IEventManager, IEventSource, IWorksheetEventSource, ISpreadsheetEventSource, IEventValidator, EventManagerConfig, EventStatistics } from './event-interfaces';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { BaseEventManager } from "./base-event-manager";
|
|
2
|
+
|
|
3
|
+
export { VTableSheetEventBus } from "./vtable-sheet-event-bus";
|
|
4
|
+
|
|
5
|
+
export { EventValidator } from "./event-validator";
|
|
6
|
+
|
|
7
|
+
export { EventPerformanceOptimizer } from "./event-performance";
|
|
8
|
+
|
|
9
|
+
export { TableEventRelay } from "./table-event-relay";
|
|
10
|
+
|
|
11
|
+
export { WorkSheetEventManager } from "./worksheet-event-manager";
|
|
12
|
+
|
|
13
|
+
export { SpreadSheetEventManager } from "./spreadsheet-event-manager";
|
|
14
|
+
|
|
15
|
+
export { FormulaEventUtils } from "./formula-event-utils";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/event/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC","file":"index.js","sourcesContent":["/**\n * 事件模块导出\n */\n\n// 基础类和接口\nexport { BaseEventManager } from './base-event-manager';\nexport { VTableSheetEventBus } from './vtable-sheet-event-bus';\nexport { EventValidator } from './event-validator';\nexport { EventPerformanceOptimizer } from './event-performance';\n\n// 事件管理器\nexport { TableEventRelay } from './table-event-relay';\nexport { WorkSheetEventManager } from './worksheet-event-manager';\nexport { SpreadSheetEventManager } from './spreadsheet-event-manager';\nexport { FormulaEventUtils } from './formula-event-utils';\n\n// 接口定义\nexport type {\n IEventBus,\n IEventManager,\n IEventSource,\n IWorksheetEventSource,\n ISpreadsheetEventSource,\n IEventValidator,\n EventManagerConfig,\n EventStatistics\n} from './event-interfaces';\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type SpreadSheetEventMap } from '../ts-types/spreadsheet-events';
|
|
2
|
+
import { BaseEventManager } from './base-event-manager';
|
|
3
|
+
import type { ISpreadsheetEventSource } from './event-interfaces';
|
|
4
|
+
export declare class SpreadSheetEventManager extends BaseEventManager<SpreadSheetEventMap> {
|
|
5
|
+
private spreadsheet;
|
|
6
|
+
constructor(spreadsheet: ISpreadsheetEventSource);
|
|
7
|
+
protected getEventTypes(): string[];
|
|
8
|
+
emitReady(): void;
|
|
9
|
+
emitDestroyed(): void;
|
|
10
|
+
emitResized(width: number, height: number): void;
|
|
11
|
+
emitSheetAdded(sheetKey: string, sheetTitle: string, index: number): void;
|
|
12
|
+
emitSheetRemoved(sheetKey: string, sheetTitle: string, index: number): void;
|
|
13
|
+
emitSheetRenamed(sheetKey: string, oldTitle: string, newTitle: string): void;
|
|
14
|
+
emitSheetActivated(sheetKey: string, sheetTitle: string, previousSheetKey?: string, previousSheetTitle?: string): void;
|
|
15
|
+
emitSheetDeactivated(sheetKey: string, sheetTitle: string): void;
|
|
16
|
+
emitSheetMoved(sheetKey: string, fromIndex: number, toIndex: number): void;
|
|
17
|
+
emitSheetVisibilityChanged(sheetKey: string, visible: boolean): void;
|
|
18
|
+
emitImportStart(fileType: 'xlsx' | 'xls' | 'csv'): void;
|
|
19
|
+
emitImportCompleted(fileType: 'xlsx' | 'xls' | 'csv', sheetCount?: number): void;
|
|
20
|
+
emitImportError(fileType: 'xlsx' | 'xls' | 'csv', error: string | Error): void;
|
|
21
|
+
emitExportStart(fileType: 'xlsx' | 'csv', allSheets: boolean): void;
|
|
22
|
+
emitExportCompleted(fileType: 'xlsx' | 'csv', allSheets: boolean, sheetCount?: number): void;
|
|
23
|
+
emitExportError(fileType: 'xlsx' | 'csv', allSheets: boolean, error: string | Error): void;
|
|
24
|
+
emitCrossSheetReferenceUpdated(sourceSheetKey: string, targetSheetKeys: string[], affectedFormulaCount: number): void;
|
|
25
|
+
emitCrossSheetFormulaCalculateStart(): void;
|
|
26
|
+
emitCrossSheetFormulaCalculateEnd(): void;
|
|
27
|
+
}
|