azure-devops-ui
Version:
React components for building web UI in Azure DevOps
149 lines (148 loc) • 6.39 kB
JavaScript
var EventGroup = /** @class */ (function () {
function EventGroup(parent) {
this.id = EventGroup.uniqueId++;
this.isDisposed = false;
this.parent = parent;
this.eventRecords = [];
}
EventGroup.raise = function (target, eventName, eventArgs, bubbleEvent) {
var returnValue;
if (EventGroup.isElement(target)) {
var event_1 = document.createEvent("HTMLEvents");
event_1.initEvent(eventName, bubbleEvent || false, true);
Object.assign(event_1, eventArgs);
}
else {
while (target && returnValue !== false) {
var events = target.__events__;
var eventRecords = events ? events[eventName] : null;
if (eventRecords) {
for (var id in eventRecords) {
if (eventRecords.hasOwnProperty(id)) {
var eventRecordList = eventRecords[id];
for (var listIndex = 0; returnValue !== false && listIndex < eventRecordList.length; listIndex++) {
var record = eventRecordList[listIndex];
if (record.objectCallback) {
returnValue = record.objectCallback.call(record.parent, eventArgs);
}
}
}
}
}
target = bubbleEvent ? target.parent : null;
}
}
return returnValue;
};
EventGroup.isElement = function (target) {
return !!target && (!!target.addEventListener || (typeof HTMLElement !== "undefined" && target instanceof HTMLElement));
};
EventGroup.prototype.dispose = function () {
if (!this.isDisposed) {
this.isDisposed = true;
this.off();
this.parent = null;
}
};
EventGroup.prototype.on = function (target, eventName, callback) {
var _this = this;
if (eventName.indexOf(",") > -1) {
var events = eventName.split(/[,]+/);
for (var event_2 in events) {
this.on(target, event_2, callback);
}
}
else {
var parent_1 = this.parent;
var eventRecord = {
target: target,
eventName: eventName,
parent: parent_1,
callback: callback
};
if (!target.__events__) {
target.__events__ = {};
}
var events = target.__events__;
if (!events[eventName]) {
events[eventName] = {};
}
if (!events[eventName][this.id]) {
events[eventName][this.id] = [];
}
events[eventName][this.id].push(eventRecord);
if (EventGroup.isElement(target)) {
var processElementEvent = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
if (_this.isDisposed) {
return;
}
var result = callback.apply(parent_1, args);
if (result === false && args[0]) {
var e = args[0];
e.preventDefault && e.preventDefault();
e.stopPropagation && e.stopPropagation();
e.cancelBubble = true;
}
return result;
};
eventRecord.elementCallback = processElementEvent;
if (target.addEventListener) {
target.addEventListener(eventName, processElementEvent);
}
}
else {
var processObjectEvent = function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
if (_this.isDisposed) {
return;
}
return callback.apply(parent_1, args);
};
eventRecord.objectCallback = processObjectEvent;
}
this.eventRecords.push(eventRecord);
}
};
EventGroup.prototype.off = function (target, eventName, callback) {
// For instead of foreach
for (var i = 0; i < this.eventRecords.length; i++) {
var eventRecord = this.eventRecords[i];
if ((!target || target === eventRecord.target) &&
(!eventName || eventName === eventRecord.eventName) &&
(!callback || callback === eventRecord.callback)) {
var events = eventRecord.target.__events__;
var targetArrayLookup = events[eventRecord.eventName];
var targetArray = targetArrayLookup ? targetArrayLookup[this.id] : null;
if (targetArray) {
if (targetArray.length === 1 || !callback) {
delete events[eventRecord.eventName][this.id];
}
else {
targetArray.splice(targetArray.indexOf(eventRecord), 1);
}
// If there's no more event IDs attached, remove the eventName
if (Object.keys(events[eventRecord.eventName]).length === 0) {
delete events[eventRecord.eventName];
}
}
if (eventRecord.elementCallback) {
eventRecord.target.removeEventListener(eventRecord.eventName, eventRecord.elementCallback, eventRecord.options);
}
this.eventRecords.splice(i--, 1);
}
}
};
EventGroup.prototype.raise = function (eventName, eventArgs, bubbleEvent) {
return EventGroup.raise(this.parent, eventName, eventArgs, bubbleEvent);
};
EventGroup.uniqueId = 0;
return EventGroup;
}());
export { EventGroup };