UNPKG

tabulator-tables

Version:

Interactive table generation JavaScript library

162 lines (124 loc) 3.42 kB
export default class InternalEventBus { constructor(debug){ this.events = {}; this.subscriptionNotifiers = {}; this.dispatch = debug ? this._debugDispatch.bind(this) : this._dispatch.bind(this); this.chain = debug ? this._debugChain.bind(this) : this._chain.bind(this); this.confirm = debug ? this._debugConfirm.bind(this) : this._confirm.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, priority = 10000){ if(!this.events[key]){ this.events[key] = []; } this.events[key].push({callback, priority}); this.events[key].sort((a, b) => { return a.priority - b.priority; }); this._notifySubscriptionChange(key, true); } unsubscribe(key, callback){ var index; if(this.events[key]){ if(callback){ index = this.events[key].findIndex((item) => { return item.callback === callback; }); if(index > -1){ this.events[key].splice(index, 1); }else{ console.warn("Cannot remove event, no matching event found:", key, callback); return; } } }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; } _chain(key, args, initialValue, fallback){ var value = initialValue; if(!Array.isArray(args)){ args = [args]; } if(this.subscribed(key)){ this.events[key].forEach((subscriber, i) => { value = subscriber.callback.apply(this, args.concat([value])); }); return value; }else{ return typeof fallback === "function" ? fallback() : fallback; } } _confirm(key, args){ var confirmed = false; if(!Array.isArray(args)){ args = [args]; } if(this.subscribed(key)){ this.events[key].forEach((subscriber, i) => { if(subscriber.callback.apply(this, args)){ confirmed = true; } }); } return confirmed; } _notifySubscriptionChange(key, subscribed){ var notifiers = this.subscriptionNotifiers[key]; if(notifiers){ notifiers.forEach((callback)=>{ callback(subscribed); }); } } _dispatch(){ var args = Array.from(arguments), key = args.shift(); if(this.events[key]){ this.events[key].forEach((subscriber) => { subscriber.callback.apply(this, args); }); } } _debugDispatch(){ var args = Array.from(arguments), key = args[0]; args[0] = "InternalEvent:" + key; if(this.debug === true || this.debug.includes(key)){ console.log(...args); } return this._dispatch(...arguments); } _debugChain(){ var args = Array.from(arguments), key = args[0]; args[0] = "InternalEvent:" + key; if(this.debug === true || this.debug.includes(key)){ console.log(...args); } return this._chain(...arguments); } _debugConfirm(){ var args = Array.from(arguments), key = args[0]; args[0] = "InternalEvent:" + key; if(this.debug === true || this.debug.includes(key)){ console.log(...args); } return this._confirm(...arguments); } }