61 lines
1.7 KiB
JavaScript
61 lines
1.7 KiB
JavaScript
import ngModule from '../module';
|
|
|
|
directive.$inject = ['$document'];
|
|
export function directive($document) {
|
|
let modifiers = ['alt', 'ctrl', 'meta', 'shift'];
|
|
|
|
function checkAttributes($attrs) {
|
|
let shortcut = $attrs.vnBind.split(' ');
|
|
let keys = {};
|
|
|
|
if (shortcut[0] == '')
|
|
throw new Error('vnBind: Binding keys not defined');
|
|
|
|
if (shortcut.length == 1) {
|
|
keys.altKey = true;
|
|
keys.ctrlKey = true;
|
|
} else {
|
|
let mods = shortcut.splice(0, shortcut.length - 1);
|
|
for (let mod of mods) {
|
|
if (modifiers.indexOf(mod) == -1)
|
|
throw new Error('vnBind: Invalid modifier key in binding');
|
|
|
|
keys[`${mod}Key`] = true;
|
|
}
|
|
}
|
|
|
|
keys.key = shortcut[0];
|
|
if (keys.key == 'space') keys.key = ' ';
|
|
|
|
return keys;
|
|
}
|
|
|
|
return {
|
|
restrict: 'A',
|
|
link: function($scope, $element, $attrs) {
|
|
let shortcut = checkAttributes($attrs);
|
|
|
|
function onKeyUp(event) {
|
|
if (event.defaultPrevented) return;
|
|
let correctShortcut = true;
|
|
|
|
for (const key in shortcut) {
|
|
correctShortcut = correctShortcut
|
|
&& shortcut[key] == event[key];
|
|
}
|
|
if (correctShortcut) {
|
|
event.preventDefault();
|
|
$element.triggerHandler('click');
|
|
}
|
|
}
|
|
|
|
$document.on('keyup', onKeyUp);
|
|
$element.on('$destroy', function() {
|
|
$document.off('keyup', onKeyUp);
|
|
});
|
|
}
|
|
};
|
|
}
|
|
ngModule.directive('vnBind', directive);
|
|
|