UNPKG

tabulator-tables

Version:

Interactive table generation JavaScript library

105 lines (82 loc) 2.17 kB
export default class ExternalEventBus { constructor(table, optionsList, debug){ this.table = table; this.events = {}; this.optionsList = optionsList || {}; this.subscriptionNotifiers = {}; this.dispatch = debug ? this._debugDispatch.bind(this) : this._dispatch.bind(this); this.debug = debug; } subscriptionChange(key, callback){ if(!this.subscriptionNotifiers[key]){ this.subscriptionNotifiers[key] = []; } this.subscriptionNotifiers[key].push(callback); if(this.subscribed(key)){ this._notifySubscriptionChange(key, true); } } subscribe(key, callback){ if(!this.events[key]){ this.events[key] = []; } this.events[key].push(callback); this._notifySubscriptionChange(key, true); } unsubscribe(key, callback){ var index; if(this.events[key]){ if(callback){ index = this.events[key].findIndex((item) => { return item === callback; }); if(index > -1){ this.events[key].splice(index, 1); }else{ console.warn("Cannot remove event, no matching event found:", key, callback); return; } }else{ delete this.events[key]; } }else{ console.warn("Cannot remove event, no events set on:", key); return; } this._notifySubscriptionChange(key, false); } subscribed(key){ return this.events[key] && this.events[key].length; } _notifySubscriptionChange(key, subscribed){ var notifiers = this.subscriptionNotifiers[key]; if(notifiers){ notifiers.forEach((callback)=>{ callback(subscribed); }); } } _dispatch(){ var args = Array.from(arguments), key = args.shift(), result; if(this.events[key]){ this.events[key].forEach((callback, i) => { let callResult = callback.apply(this.table, args); if(!i){ result = callResult; } }); } return result; } _debugDispatch(){ var args = Array.from(arguments), key = args[0]; args[0] = "ExternalEvent:" + args[0]; if(this.debug === true || this.debug.includes(key)){ console.log(...args); } return this._dispatch(...arguments); } }