devextreme-angular
Version:
Angular UI and visualization components based on DevExtreme widgets
103 lines • 13.4 kB
JavaScript
/*!
* devextreme-angular
* Version: 20.2.5
* Build date: Fri Jan 15 2021
*
* Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED
*
* This software may be modified and distributed under the terms
* of the MIT license. See the LICENSE file in the root of the project for details.
*
* https://github.com/DevExpress/devextreme-angular
*/
import { EventEmitter } from '@angular/core';
var NgEventsStrategy = /** @class */ (function () {
function NgEventsStrategy(instance, zone) {
this.instance = instance;
this.zone = zone;
this.subscriptions = {};
this.events = {};
}
NgEventsStrategy.prototype.hasEvent = function (name) {
return this.getEmitter(name).observers.length !== 0;
};
NgEventsStrategy.prototype.fireEvent = function (name, args) {
var emitter = this.getEmitter(name);
if (emitter.observers.length) {
var internalSubs = this.subscriptions[name] || [];
if (internalSubs.length === emitter.observers.length)
emitter.next(args && args[0]);
else
this.zone.run(function () { return emitter.next(args && args[0]); });
}
};
NgEventsStrategy.prototype.on = function (name, handler) {
var _this = this;
if (typeof name === 'string') {
var eventSubscriptions = this.subscriptions[name] || [], subcription = this.getEmitter(name).subscribe(handler.bind(this.instance)), unsubscribe = subcription.unsubscribe.bind(subcription);
eventSubscriptions.push({ handler: handler, unsubscribe: unsubscribe });
this.subscriptions[name] = eventSubscriptions;
}
else {
var handlersObj_1 = name;
Object.keys(handlersObj_1).forEach(function (event) { return _this.on(event, handlersObj_1[event]); });
}
};
NgEventsStrategy.prototype.off = function (name, handler) {
var eventSubscriptions = this.subscriptions[name] || [];
if (handler) {
eventSubscriptions.some(function (subscription, i) {
if (subscription.handler === handler) {
subscription.unsubscribe();
eventSubscriptions.splice(i, 1);
return true;
}
});
}
else {
eventSubscriptions.forEach(function (subscription) {
subscription.unsubscribe();
});
eventSubscriptions.splice(0, eventSubscriptions.length);
}
};
NgEventsStrategy.prototype.dispose = function () { };
NgEventsStrategy.prototype.addEmitter = function (eventName, emitter) {
this.events[eventName] = emitter;
};
NgEventsStrategy.prototype.getEmitter = function (eventName) {
if (!this.events[eventName]) {
this.events[eventName] = new EventEmitter();
}
return this.events[eventName];
};
return NgEventsStrategy;
}());
export { NgEventsStrategy };
var EmitterHelper = /** @class */ (function () {
function EmitterHelper(zone, component) {
this.zone = zone;
this.component = component;
this.lockedValueChangeEvent = false;
}
EmitterHelper.prototype.fireNgEvent = function (eventName, eventArgs) {
if (this.lockedValueChangeEvent && eventName === 'valueChange') {
return;
}
var emitter = this.component[eventName];
if (emitter && emitter.observers.length) {
this.zone.run(function () {
emitter.next(eventArgs && eventArgs[0]);
});
}
};
EmitterHelper.prototype.createEmitters = function (events) {
var _this = this;
events.forEach(function (event) {
_this.component[event.emit] = new EventEmitter();
});
};
return EmitterHelper;
}());
export { EmitterHelper };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLXN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZGV2ZXh0cmVtZS1hbmd1bGFyL2NvcmUvIiwic291cmNlcyI6WyJldmVudHMtc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBT3JEO0lBSUksMEJBQW9CLFFBQWEsRUFBVSxJQUFZO1FBQW5DLGFBQVEsR0FBUixRQUFRLENBQUs7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFRO1FBSC9DLGtCQUFhLEdBQTRDLEVBQUUsQ0FBQztRQUM1RCxXQUFNLEdBQXlDLEVBQUUsQ0FBQztJQUVDLENBQUM7SUFFNUQsbUNBQVEsR0FBUixVQUFTLElBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxvQ0FBUyxHQUFULFVBQVUsSUFBSSxFQUFFLElBQUk7UUFDaEIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO1lBQzFCLElBQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BELElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU07Z0JBQ2hELE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztnQkFFOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBTSxPQUFBLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUE3QixDQUE2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LElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUMsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFRCxzQ0FBYyxHQUFkLFVBQWUsTUFBYTtRQUE1QixpQkFJQztRQUhHLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBQSxLQUFLO1lBQ2hCLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0wsb0JBQUM7QUFBRCxDQUFDLEFBdEJELElBc0JDIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBkZXZleHRyZW1lLWFuZ3VsYXJcbiAqIFZlcnNpb246IDIwLjIuNVxuICogQnVpbGQgZGF0ZTogRnJpIEphbiAxNSAyMDIxXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEyIC0gMjAyMSBEZXZlbG9wZXIgRXhwcmVzcyBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRURcbiAqXG4gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zXG4gKiBvZiB0aGUgTUlUIGxpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoZSBwcm9qZWN0IGZvciBkZXRhaWxzLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9EZXZFeHByZXNzL2RldmV4dHJlbWUtYW5ndWxhclxuICovXG5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IER4Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnQnO1xyXG5cclxuaW50ZXJmYWNlIElFdmVudFN1YnNjcmlwdGlvbiB7XHJcbiAgICBoYW5kbGVyOiBhbnk7XHJcbiAgICB1bnN1YnNjcmliZTogKCkgPT4gdm9pZDtcclxufVxyXG5leHBvcnQgY2xhc3MgTmdFdmVudHNTdHJhdGVneSB7XHJcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IHsgW2tleTogc3RyaW5nXTogSUV2ZW50U3Vic2NyaXB0aW9uW10gfSA9IHt9O1xyXG4gICAgcHJpdmF0ZSBldmVudHM6IHsgW2tleTogc3RyaW5nXTogRXZlbnRFbWl0dGVyPGFueT4gfSA9IHt9O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaW5zdGFuY2U6IGFueSwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHsgfVxyXG5cclxuICAgIGhhc0V2ZW50KG5hbWU6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldEVtaXR0ZXIobmFtZSkub2JzZXJ2ZXJzLmxlbmd0aCAhPT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBmaXJlRXZlbnQobmFtZSwgYXJncykge1xyXG4gICAgICAgIGxldCBlbWl0dGVyID0gdGhpcy5nZXRFbWl0dGVyKG5hbWUpO1xyXG4gICAgICAgIGlmIChlbWl0dGVyLm9ic2VydmVycy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxTdWJzID0gdGhpcy5zdWJzY3JpcHRpb25zW25hbWVdIHx8IFtdO1xyXG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxTdWJzLmxlbmd0aCA9PT0gZW1pdHRlci5vYnNlcnZlcnMubGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgZW1pdHRlci5uZXh0KGFyZ3MgJiYgYXJnc1swXSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4gZW1pdHRlci5uZXh0KGFyZ3MgJiYgYXJnc1swXSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbihuYW1lOiBzdHJpbmcgfCBPYmplY3QsIGhhbmRsZXI/OiBGdW5jdGlvbikge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgbGV0IGV2ZW50U3Vic2NyaXB0aW9ucyA9IHRoaXMuc3Vic2NyaXB0aW9uc1tuYW1lXSB8fCBbXSxcclxuICAgICAgICAgICAgICAgIHN1YmNyaXB0aW9uID0gdGhpcy5nZXRFbWl0dGVyKG5hbWUpLnN1YnNjcmliZShoYW5kbGVyLmJpbmQodGhpcy5pbnN0YW5jZSkpLFxyXG4gICAgICAgICAgICAgICAgdW5zdWJzY3JpYmUgPSBzdWJjcmlwdGlvbi51bnN1YnNjcmliZS5iaW5kKHN1YmNyaXB0aW9uKTtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50U3Vic2NyaXB0aW9ucy5wdXNoKHsgaGFuZGxlciwgdW5zdWJzY3JpYmUgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1tuYW1lXSA9IGV2ZW50U3Vic2NyaXB0aW9ucztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgaGFuZGxlcnNPYmogPSBuYW1lO1xyXG5cclxuICAgICAgICAgICAgT2JqZWN0LmtleXMoaGFuZGxlcnNPYmopLmZvckVhY2goZXZlbnQgPT4gdGhpcy5vbihldmVudCwgaGFuZGxlcnNPYmpbZXZlbnRdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9mZihuYW1lLCBoYW5kbGVyKSB7XHJcbiAgICAgICAgbGV0IGV2ZW50U3Vic2NyaXB0aW9ucyA9IHRoaXMuc3Vic2NyaXB0aW9uc1tuYW1lXSB8fCBbXTtcclxuXHJcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcclxuICAgICAgICAgICAgZXZlbnRTdWJzY3JpcHRpb25zLnNvbWUoKHN1YnNjcmlwdGlvbiwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbi5oYW5kbGVyID09PSBoYW5kbGVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRTdWJzY3JpcHRpb25zLnNwbGljZShpLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZXZlbnRTdWJzY3JpcHRpb25zLmZvckVhY2goc3Vic2NyaXB0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZXZlbnRTdWJzY3JpcHRpb25zLnNwbGljZSgwLCBldmVudFN1YnNjcmlwdGlvbnMubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcG9zZSgpIHt9XHJcblxyXG4gICAgcHVibGljIGFkZEVtaXR0ZXIoZXZlbnROYW1lOiBzdHJpbmcsIGVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+KSB7XHJcbiAgICAgICAgdGhpcy5ldmVudHNbZXZlbnROYW1lXSA9IGVtaXR0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRFbWl0dGVyKGV2ZW50TmFtZTogc3RyaW5nKTogRXZlbnRFbWl0dGVyPGFueT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5ldmVudHNbZXZlbnROYW1lXSkge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50c1tldmVudE5hbWVdID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5ldmVudHNbZXZlbnROYW1lXTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEVtaXR0ZXJIZWxwZXIge1xyXG4gICAgbG9ja2VkVmFsdWVDaGFuZ2VFdmVudCA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgem9uZTogTmdab25lLCBwcml2YXRlIGNvbXBvbmVudDogRHhDb21wb25lbnQpIHsgfVxyXG5cclxuICAgIGZpcmVOZ0V2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBldmVudEFyZ3M6IGFueSkge1xyXG4gICAgICAgIGlmICh0aGlzLmxvY2tlZFZhbHVlQ2hhbmdlRXZlbnQgJiYgZXZlbnROYW1lID09PSAndmFsdWVDaGFuZ2UnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGVtaXR0ZXIgPSB0aGlzLmNvbXBvbmVudFtldmVudE5hbWVdO1xyXG4gICAgICAgIGlmIChlbWl0dGVyICYmIGVtaXR0ZXIub2JzZXJ2ZXJzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGVtaXR0ZXIubmV4dChldmVudEFyZ3MgJiYgZXZlbnRBcmdzWzBdKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUVtaXR0ZXJzKGV2ZW50czogYW55W10pIHtcclxuICAgICAgICBldmVudHMuZm9yRWFjaChldmVudCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50W2V2ZW50LmVtaXRdID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcblxyXG4iXX0=