0
0
Fork 0
mirror of https://github.com/kevinpapst/kimai2.git synced 2025-01-10 19:47:35 +00:00
kevinpapst_kimai2/assets/js/plugins/KimaiReducedClickHandler.js
2024-08-28 17:16:37 +02:00

86 lines
2.4 KiB
JavaScript

/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/*!
* [KIMAI] KimaiReducedClickHandler: abstract class
*/
import KimaiPlugin from "../KimaiPlugin";
export default class KimaiReducedClickHandler extends KimaiPlugin {
/**
* No _underscore naming for now, as it would be mangled otherwise
* @param {string} selector
* @param {callback} callback
* @param {array<string>} stopSelector
*/
addClickHandler(selector, callback, stopSelector) {
document.body.addEventListener('click', (event) => {
// event.currentTarget is ALWAYS the body
let target = event.target;
while (target !== null) {
const tagName = target.tagName.toUpperCase();
if (tagName === 'BODY') {
return;
}
if (target.matches(selector)) {
break;
}
// when an element is clicked, which can trigger stuff itself, we don't want the event to be processed
if (tagName === 'A' || tagName === 'BUTTON' || tagName === 'INPUT' || tagName === 'LABEL') {
return;
}
for (let x of stopSelector) {
if (target.matches(x)) {
return;
}
}
target = target.parentNode;
}
if (target === null) {
return;
}
// just in case an inner element is editable, then this should not be triggered
if (target.isContentEditable || target.parentNode.isContentEditable) {
return;
}
if (!target.matches(selector)) {
return;
}
for (let x of stopSelector) {
if (target.matches(x)) {
return;
}
}
event.preventDefault();
event.stopPropagation();
let href = target.dataset['href'];
if (href === undefined || href === null) {
href = target.href;
}
if (href === undefined || href === null || href === '') {
return;
}
callback(href);
});
}
}