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);
|
||
|
|