mirror of
https://github.com/kevinpapst/kimai2.git
synced 2025-01-10 19:47:35 +00:00
86 lines
2.4 KiB
JavaScript
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);
|
|
});
|
|
}
|
|
|
|
}
|