110 lines
3.4 KiB
JavaScript
110 lines
3.4 KiB
JavaScript
window.state = window.state || {};
|
|
state = window.state;
|
|
|
|
state.utils = {
|
|
triggerEvent: function triggerEvent(element, event) {
|
|
if (! element) {
|
|
return;
|
|
}
|
|
element.dispatchEvent(new Event(event.trim()));
|
|
return element;
|
|
},
|
|
triggerMouseEvent: function triggerMouseEvent(element, event) {
|
|
if (! element) {
|
|
return;
|
|
}
|
|
event = event || 'click';
|
|
element.dispatchEvent(new MouseEvent(event, {
|
|
view: window,
|
|
bubbles: true,
|
|
cancelable: true,
|
|
}));
|
|
return element;
|
|
},
|
|
setValue: function setValue(element, value, event) {
|
|
switch (element.type) {
|
|
case 'checkbox':
|
|
element.checked = value === 'true';
|
|
this.triggerEvent(element, event);
|
|
break;
|
|
case 'radio':
|
|
if (element.value === value) {
|
|
element.checked = true;
|
|
this.triggerEvent(element, event);
|
|
} else {
|
|
element.checked = false;
|
|
}
|
|
break;
|
|
default:
|
|
element.value = value;
|
|
this.triggerEvent(element, event);
|
|
}
|
|
},
|
|
onContentChange: function onContentChange(targetNode, func) {
|
|
const observer = new MutationObserver((mutationsList, observer) => {
|
|
for (const mutation of mutationsList) {
|
|
if (mutation.type === 'childList') {
|
|
func(targetNode);
|
|
}
|
|
}
|
|
});
|
|
observer.observe(targetNode, {
|
|
childList: true,
|
|
characterData: true,
|
|
subtree: true
|
|
});
|
|
},
|
|
txtToId: function txtToId(txt) {
|
|
return txt.split(' ').join('-').toLowerCase();
|
|
},
|
|
callXTimes: function callXTimes(func, times) {
|
|
let called = 0;
|
|
return function() {
|
|
if (called < times) {
|
|
called++;
|
|
return func.apply(this);
|
|
}
|
|
}
|
|
},
|
|
debounce: function debounce(func, delay) {
|
|
let lastCallTime = 0;
|
|
return function() {
|
|
const currentCallTime = new Date().getTime();
|
|
if (currentCallTime - lastCallTime > delay) {
|
|
lastCallTime = currentCallTime;
|
|
func.apply(this, arguments);
|
|
}
|
|
}
|
|
},
|
|
onNextUiUpdates: function (func) {
|
|
// brute force this to to ensure that the method is called after next few updates
|
|
onUiUpdate(this.callXTimes(function () { setTimeout(func, 10); }, 50));
|
|
}
|
|
};
|
|
|
|
state.utils.html = {
|
|
setStyle: function setStyle(elements, style) {
|
|
if (elements instanceof NodeList) {
|
|
elements = Array.from(elements);
|
|
} else if (elements instanceof Node){
|
|
elements = [elements];
|
|
} else {
|
|
return;
|
|
}
|
|
elements.forEach(element => {
|
|
for (let key in style) {
|
|
if (style.hasOwnProperty(key)) {
|
|
element.style[key] = style[key];
|
|
}
|
|
}
|
|
});
|
|
},
|
|
createButton: function createButton(text, onclick) {
|
|
const btn = document.createElement('button');
|
|
btn.innerHTML = text;
|
|
btn.onclick = onclick || function () {};
|
|
btn.className = 'gr-button gr-button-lg gr-button-primary';
|
|
return btn;
|
|
}
|
|
};
|