You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Connected.Components/TScripts/mudEventManager.js

140 lines
4.3 KiB

2 years ago
// Copyright (c) MudBlazor 2021
// MudBlazor licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
//Functions related to MudThrottledEventManager
class MudThrottledEventManager {
constructor() {
this.mapper = {};
}
subscribe(eventName, elementId, projection, throotleInterval, key, properties, dotnetReference) {
const handlerRef = this.throttleEventHandler.bind(this, key);
let elem = document.getElementById(elementId);
if (elem) {
elem.addEventListener(eventName, handlerRef, false);
let projector = null;
if (projection) {
const parts = projection.split('.');
let functionPointer = window;
let functionReferenceFound = true;
if (parts.length == 0 || parts.length == 1) {
functionPointer = functionPointer[projection];
}
else {
for (let i = 0; i < parts.length; i++) {
functionPointer = functionPointer[parts[i]];
if (!functionPointer) {
functionReferenceFound = false;
break;
}
}
}
if (functionReferenceFound === true) {
projector = functionPointer;
}
}
this.mapper[key] = {
eventName: eventName,
handler: handlerRef,
delay: throotleInterval,
timerId: -1,
reference: dotnetReference,
elementId: elementId,
properties: properties,
projection: projector,
};
}
}
subscribeGlobal(eventName, throotleInterval, key, properties, dotnetReference) {
let handlerRef = throotleInterval > 0 ?
this.throttleEventHandler.bind(this, key) :
this.eventHandler.bind(this, key);
document.addEventListener(eventName, handlerRef, false);
this.mapper[key] = {
eventName: eventName,
handler: handlerRef,
delay: throotleInterval,
timerId: -1,
reference: dotnetReference,
elementId: document,
properties: properties,
projection: null,
};
}
throttleEventHandler(key, event) {
const entry = this.mapper[key];
if (!entry) {
return;
}
clearTimeout(entry.timerId);
entry.timerId = window.setTimeout(
this.eventHandler.bind(this, key, event),
entry.delay
);
}
eventHandler(key, event) {
const entry = this.mapper[key];
if (!entry) {
return;
}
var elem = document.getElementById(entry.elementId);
if (elem != event.srcElement && entry.elementId != document) {
return;
}
const eventEntry = {};
for (var i = 0; i < entry.properties.length; i++) {
eventEntry[entry.properties[i]] = event[entry.properties[i]];
}
if (entry.projection) {
if (typeof entry.projection === "function") {
entry.projection.apply(null, [eventEntry, event]);
}
}
entry.reference.invokeMethodAsync('OnEventOccur', key, JSON.stringify(eventEntry));
}
unsubscribe(key) {
const entry = this.mapper[key];
if (!entry) {
return;
}
entry.reference = null;
if (document == entry.elementId) {
document.removeEventListener(entry.eventName, entry.handler, false);
} else {
const elem = document.getElementById(entry.elementId);
if (elem) {
elem.removeEventListener(entry.eventName, entry.handler, false);
}
}
delete this.mapper[key];
}
};
window.mudThrottledEventManager = new MudThrottledEventManager();
window.mudEventProjections = {
correctOffset: function (eventEntry, event) {
var target = event.target.getBoundingClientRect();
eventEntry.offsetX = event.clientX - target.x;
eventEntry.offsetY = event.clientY - target.y;
}
};