UNPKG

@visactor/vchart

Version:

charts lib based @visactor/VGrammar

228 lines (217 loc) 12.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: !0 }), exports.EventDispatcher = void 0; const bubble_1 = require("./bubble"), vutils_1 = require("@visactor/vutils"), event_1 = require("../constant/event"), factory_1 = require("../core/factory"), util_1 = require("../util"), componentTypeMap = { cartesianAxis: "axis", "cartesianAxis-band": "axis", "cartesianAxis-linear": "axis", "cartesianAxis-time": "axis", polarAxis: "axis", "polarAxis-band": "axis", "polarAxis-linear": "axis", discreteLegend: "legend", continuousLegend: "legend", colorLegend: "legend", sizeLegend: "legend" }; class EventDispatcher { constructor(vchart, compiler) { this._viewBubbles = new Map, this._windowBubbles = new Map, this._canvasBubbles = new Map, this._viewListeners = new Map, this._windowListeners = new Map, this._canvasListeners = new Map, this._onDelegate = listenerParams => { var _a; const chart = this.globalInstance.getChart(), model = (0, vutils_1.isValid)(listenerParams.modelId) && (null == chart ? void 0 : chart.getModelById(listenerParams.modelId)) || void 0, mark = (0, vutils_1.isValid)(listenerParams.markId) && (null == chart ? void 0 : chart.getMarkById(listenerParams.markId)) || null, node = (0, vutils_1.get)(listenerParams.event, "target"); let datum = listenerParams.datum; model && "component" === model.modelType && (datum = null !== (_a = model.getDatum(node)) && void 0 !== _a ? _a : datum); const params = { event: listenerParams.event, item: listenerParams.item, source: listenerParams.source, datum: datum, chart: chart, model: model, mark: null != mark ? mark : void 0, node: node }; this.dispatch(listenerParams.type, params); }, this._onDelegateInteractionEvent = listenerParams => { const chart = this.globalInstance.getChart(), event = listenerParams.event; let graphics = null; event.graphics && (graphics = event.graphics); const params = { event: listenerParams.event, chart: chart, graphics: graphics, datums: graphics && graphics.map((g => (0, util_1.getDatumOfGraphic)(g))) }; this.dispatch(listenerParams.type, params); }, this.globalInstance = vchart, this._compiler = compiler; } register(eType, handler) { var _a, _b, _c, _d, _e; this._parseQuery(handler); const bubbles = this.getEventBubble((null === (_a = handler.filter) || void 0 === _a ? void 0 : _a.source) || event_1.Event_Source_Type.chart), listeners = this.getEventListeners((null === (_b = handler.filter) || void 0 === _b ? void 0 : _b.source) || event_1.Event_Source_Type.chart); bubbles.get(eType) || bubbles.set(eType, new bubble_1.Bubble); if (bubbles.get(eType).addHandler(handler, null === (_c = handler.filter) || void 0 === _c ? void 0 : _c.level), this._isValidEvent(eType) && !listeners.has(eType)) { const callback = this._onDelegate.bind(this); this._compiler.addEventListener(null === (_d = handler.filter) || void 0 === _d ? void 0 : _d.source, eType, callback), listeners.set(eType, callback); } else if (this._isInteractionEvent(eType) && !listeners.has(eType)) { const callback = this._onDelegateInteractionEvent.bind(this); this._compiler.addEventListener(null === (_e = handler.filter) || void 0 === _e ? void 0 : _e.source, eType, callback), listeners.set(eType, callback); } return this; } unregister(eType, handler) { var _a, _b, _c, _d; let clean = !1; const bubbles = this.getEventBubble((null === (_a = null == handler ? void 0 : handler.filter) || void 0 === _a ? void 0 : _a.source) || event_1.Event_Source_Type.chart), listeners = this.getEventListeners((null === (_b = null == handler ? void 0 : handler.filter) || void 0 === _b ? void 0 : _b.source) || event_1.Event_Source_Type.chart); if (handler) { const bubble = bubbles.get(eType); null == bubble || bubble.removeHandler(handler), 0 === (null == bubble ? void 0 : bubble.getCount()) && (null == bubble || bubble.release(), bubbles.delete(eType), clean = !0), (null === (_c = null == handler ? void 0 : handler.wrappedCallback) || void 0 === _c ? void 0 : _c.cancel) && handler.wrappedCallback.cancel(); } else { const bubble = bubbles.get(eType); null == bubble || bubble.release(), bubbles.delete(eType), clean = !0; } if (clean && this._isValidEvent(eType)) { const callback = listeners.get(eType); this._compiler.removeEventListener((null === (_d = null == handler ? void 0 : handler.filter) || void 0 === _d ? void 0 : _d.source) || event_1.Event_Source_Type.chart, eType, callback), listeners.delete(eType); } return this; } dispatch(eType, params, level) { const bubble = this.getEventBubble(params.source || event_1.Event_Source_Type.chart).get(eType); if (!bubble) return this; let stopBubble = !1; if (level) { const handlers = bubble.getHandlers(level); stopBubble = this._invoke(handlers, eType, params); } else { let i = 0; for (;!stopBubble && i < event_1.EventBubbleLevels.length; ) stopBubble = this._invoke(bubble.getHandlers(event_1.EventBubbleLevels[i]), eType, params), i++; } return this; } prevent(eType, except) { return [ "canvas", "chart", "window" ].forEach((type => { const bubble = this.getEventBubble(type).get(eType); bubble && bubble.getAllHandlers().forEach((handler => { except ? event_1.EventBubbleLevels.indexOf(handler.filter.level) < event_1.EventBubbleLevels.indexOf(except.level) && handler.callback !== except.handler && bubble.preventHandler(handler) : bubble.preventHandler(handler); })); })), this; } allow(eType) { return [ "canvas", "chart", "window" ].forEach((type => { const bubble = this.getEventBubble(type).get(eType); bubble && bubble.getAllHandlers().forEach((handler => bubble.allowHandler(handler))); })), this; } clear() { [ event_1.Event_Source_Type.chart, event_1.Event_Source_Type.window, event_1.Event_Source_Type.canvas ].forEach((type => { const listeners = this.getEventListeners(type); for (const entry of listeners.entries()) this._compiler.removeEventListener(type, entry[0], entry[1]); listeners.clear(); })), [ this._viewBubbles, this._windowBubbles, this._canvasBubbles ].forEach((bubbles => { for (const bubble of bubbles.values()) bubble.release(); bubbles.clear(); })); } release() { this.clear(), this.globalInstance = null, this._compiler = null; } _filter(filter, evt, params) { var _a, _b, _c; if ((0, vutils_1.isFunction)(filter.filter) && !filter.filter(params)) return !1; if (filter.nodeName && (0, vutils_1.get)(params, "node.name") !== filter.nodeName) return !1; if (filter.markName && (null === (_a = null == params ? void 0 : params.mark) || void 0 === _a ? void 0 : _a.name) !== filter.markName) return !1; let modelType = null === (_b = params.model) || void 0 === _b ? void 0 : _b.type; return componentTypeMap[modelType] && (modelType = componentTypeMap[modelType]), (!filter.type || modelType === filter.type) && (!("mark" === filter.level && !filter.type && !(null == params ? void 0 : params.mark)) && (!("model" === filter.level && !filter.type && !(null == params ? void 0 : params.model)) && (!(0, vutils_1.isValid)(filter.userId) || (null === (_c = params.model) || void 0 === _c ? void 0 : _c.userId) === filter.userId))); } _prepareParams(filter, params) { var _a, _b, _c; if (filter.markName && params.mark) { const markGraphic = null === (_c = null === (_b = (_a = params.mark).getGraphics) || void 0 === _b ? void 0 : _b.call(_a)) || void 0 === _c ? void 0 : _c[0]; return Object.assign(Object.assign({}, params), { item: markGraphic, datum: (0, util_1.getDatumOfGraphic)(markGraphic) }); } return Object.assign({}, params); } _invoke(handlers, type, params) { return handlers.map((handler => { var _a, _b, _c; const filter = handler.filter; if (!handler.prevented && (!handler.query || this._filter(filter, type, params))) { const stopBubble = (handler.wrappedCallback || handler.callback).call(null, this._prepareParams(filter, params)), doStopBubble = null != stopBubble ? stopBubble : null === (_a = handler.query) || void 0 === _a ? void 0 : _a.consume; return doStopBubble && (null === (_b = params.event) || void 0 === _b || _b.stopPropagation(), null === (_c = params.event) || void 0 === _c || _c.preventDefault()), !!doStopBubble; } })).some((r => !0 === r)); } _getQueryLevel(query) { return query ? query.level ? query.level : (0, vutils_1.isValid)(query.id) ? event_1.Event_Bubble_Level.model : event_1.Event_Bubble_Level.vchart : event_1.Event_Bubble_Level.vchart; } _parseQuery(handler) { var _a; const query = handler.query; (null == query ? void 0 : query.throttle) ? handler.wrappedCallback = (0, vutils_1.throttle)(handler.callback, query.throttle) : (null == query ? void 0 : query.debounce) && (handler.wrappedCallback = (0, vutils_1.debounce)(handler.callback, query.debounce)); let level = this._getQueryLevel(query), type = null, source = event_1.Event_Source_Type.chart, nodeName = null, markName = null, userId = null; return (null == query ? void 0 : query.nodeName) && (nodeName = query.nodeName), (null == query ? void 0 : query.markName) && (markName = query.markName), !(null == query ? void 0 : query.type) || level !== event_1.Event_Bubble_Level.model && level !== event_1.Event_Bubble_Level.mark || (type = query.type), (null == query ? void 0 : query.source) && (source = query.source), (0, vutils_1.isValid)(null == query ? void 0 : query.id) && (userId = null == query ? void 0 : query.id, level = event_1.Event_Bubble_Level.model), handler.filter = { level: level, markName: markName, type: type, source: source, nodeName: nodeName, userId: userId, filter: null !== (_a = null == query ? void 0 : query.filter) && void 0 !== _a ? _a : null }, handler; } getEventBubble(source) { switch (source) { case event_1.Event_Source_Type.chart: return this._viewBubbles; case event_1.Event_Source_Type.window: return this._windowBubbles; case event_1.Event_Source_Type.canvas: return this._canvasBubbles; default: return this._viewBubbles; } } getEventListeners(source) { switch (source) { case event_1.Event_Source_Type.chart: return this._viewListeners; case event_1.Event_Source_Type.window: return this._windowListeners; case event_1.Event_Source_Type.canvas: return this._canvasListeners; default: return this._viewListeners; } } _isValidEvent(eType) { return event_1.BASE_EVENTS.includes(eType) || Object.values(event_1.HOOK_EVENT).includes(eType); } _isInteractionEvent(eType) { let interactionType; return eType && (interactionType = eType.split(":")[0], interactionType) && factory_1.Factory.hasInteractionTrigger(interactionType); } } exports.EventDispatcher = EventDispatcher; //# sourceMappingURL=event-dispatcher.js.map