mirror of
https://github.com/kevinpapst/kimai2.git
synced 2025-01-10 19:47:35 +00:00
17a815e5a9
* do not rely on node_modules path * bump eslint to v9, run eslint via npm task, remove from build task * loosen dependencies and update all packages * rebuild assets with latest frontend packages * bump webpack encore and dependencies * bump to latest stable yarn * explicitly mention dependencies
51 lines
No EOL
1.4 KiB
JavaScript
51 lines
No EOL
1.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.
|
|
*/
|
|
|
|
import KimaiPlugin from "../KimaiPlugin";
|
|
|
|
export default class KimaiHotkeys extends KimaiPlugin {
|
|
|
|
getId()
|
|
{
|
|
return 'hotkeys';
|
|
}
|
|
|
|
init()
|
|
{
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key
|
|
|
|
const selector = '[data-hotkey="ctrl+Enter"]';
|
|
|
|
window.addEventListener('keyup', (ev) => {
|
|
if (ev.ctrlKey && ev.key === 'Enter') {
|
|
const elements = [...document.querySelectorAll(selector)].filter(element => this.isVisible(element));
|
|
|
|
if (elements.length > 1) {
|
|
console.warn('KimaiHotkeys: More than one visible element matches ${selector}. No action triggered.');
|
|
}
|
|
|
|
if (elements.length === 1) {
|
|
ev.stopPropagation();
|
|
ev.preventDefault();
|
|
|
|
elements[0].click();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
// adopted from Bootstrap 5.1.1, MIT
|
|
isVisible (element)
|
|
{
|
|
if (!element || element.getClientRects().length === 0) {
|
|
return false;
|
|
}
|
|
|
|
return getComputedStyle(element).getPropertyValue('visibility') === 'visible';
|
|
}
|
|
} |