angular2-hotkeys
Version:
Angular 16 and Ivy Compatible. Older versions might work but isn't officially tested.
47 lines • 6.8 kB
JavaScript
import { Directive, Input } from '@angular/core';
import { Hotkey } from './hotkey.model';
import { HotkeysService } from './hotkeys.service';
import * as Mousetrap from 'mousetrap';
import * as i0 from "@angular/core";
import * as i1 from "./hotkeys.service";
export class HotkeysDirective {
constructor(hotkeysService, elementRef) {
this.hotkeysService = hotkeysService;
this.elementRef = elementRef;
this.hotkeysList = [];
this.oldHotkeys = [];
// Bind hotkeys to the current element (and any children)
this.mousetrap = new Mousetrap.default(this.elementRef.nativeElement);
}
ngOnInit() {
for (const hotkey of this.hotkeys) {
const combo = Object.keys(hotkey)[0];
const hotkeyObj = new Hotkey(combo, hotkey[combo]);
const oldHotkey = this.hotkeysService.get(combo);
if (oldHotkey !== null) { // We let the user overwrite callbacks temporarily if you specify it in HTML
this.oldHotkeys.push(oldHotkey);
this.hotkeysService.remove(oldHotkey);
}
this.hotkeysList.push(hotkeyObj);
this.mousetrap.bind(hotkeyObj.combo, hotkeyObj.callback);
}
}
ngOnDestroy() {
for (const hotkey of this.hotkeysList) {
this.mousetrap.unbind(hotkey.combo);
}
this.hotkeysService.add(this.oldHotkeys);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: HotkeysDirective, deps: [{ token: i1.HotkeysService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.2", type: HotkeysDirective, selector: "[hotkeys]", inputs: { hotkeys: "hotkeys" }, providers: [HotkeysService], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.2", ngImport: i0, type: HotkeysDirective, decorators: [{
type: Directive,
args: [{
selector: '[hotkeys]',
providers: [HotkeysService]
}]
}], ctorParameters: function () { return [{ type: i1.HotkeysService }, { type: i0.ElementRef }]; }, propDecorators: { hotkeys: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90a2V5cy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2hvdGtleXMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQXlCLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxPQUFPLEtBQUssU0FBUyxNQUFNLFdBQVcsQ0FBQzs7O0FBTXZDLE1BQU0sT0FBTyxnQkFBZ0I7SUFPekIsWUFBb0IsY0FBOEIsRUFBVSxVQUFzQjtRQUE5RCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBSDFFLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBQzNCLGVBQVUsR0FBYSxFQUFFLENBQUM7UUFHOUIseURBQXlEO1FBQ3pELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSyxTQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxRQUFRO1FBQ0osS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQy9CLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsTUFBTSxTQUFTLEdBQVcsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzNELE1BQU0sU0FBUyxHQUFXLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBVyxDQUFDO1lBQ25FLElBQUksU0FBUyxLQUFLLElBQUksRUFBRSxFQUFFLDRFQUE0RTtnQkFDbEcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3pDO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDNUQ7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQzs4R0EvQlEsZ0JBQWdCO2tHQUFoQixnQkFBZ0Isb0VBRmQsQ0FBQyxjQUFjLENBQUM7OzJGQUVsQixnQkFBZ0I7a0JBSjVCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQztpQkFDOUI7OEhBRVksT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV4dGVuZGVkS2V5Ym9hcmRFdmVudCwgSG90a2V5IH0gZnJvbSAnLi9ob3RrZXkubW9kZWwnO1xuaW1wb3J0IHsgSG90a2V5c1NlcnZpY2UgfSBmcm9tICcuL2hvdGtleXMuc2VydmljZSc7XG5pbXBvcnQgeyBNb3VzZXRyYXBJbnN0YW5jZSB9IGZyb20gJ21vdXNldHJhcCc7XG5pbXBvcnQgKiBhcyBNb3VzZXRyYXAgZnJvbSAnbW91c2V0cmFwJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbaG90a2V5c10nLFxuICAgIHByb3ZpZGVyczogW0hvdGtleXNTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBIb3RrZXlzRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIEBJbnB1dCgpIGhvdGtleXM6IHsgW2NvbWJvOiBzdHJpbmddOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGNvbWJvOiBzdHJpbmcpID0+IEV4dGVuZGVkS2V5Ym9hcmRFdmVudCB9W107XG5cbiAgICBwcml2YXRlIG1vdXNldHJhcDogTW91c2V0cmFwSW5zdGFuY2U7XG4gICAgcHJpdmF0ZSBob3RrZXlzTGlzdDogSG90a2V5W10gPSBbXTtcbiAgICBwcml2YXRlIG9sZEhvdGtleXM6IEhvdGtleVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGhvdGtleXNTZXJ2aWNlOiBIb3RrZXlzU2VydmljZSwgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgICAgIC8vIEJpbmQgaG90a2V5cyB0byB0aGUgY3VycmVudCBlbGVtZW50IChhbmQgYW55IGNoaWxkcmVuKVxuICAgICAgICB0aGlzLm1vdXNldHJhcCA9IG5ldyAoTW91c2V0cmFwIGFzIGFueSkuZGVmYXVsdCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGZvciAoY29uc3QgaG90a2V5IG9mIHRoaXMuaG90a2V5cykge1xuICAgICAgICAgICAgY29uc3QgY29tYm8gPSBPYmplY3Qua2V5cyhob3RrZXkpWzBdO1xuICAgICAgICAgICAgY29uc3QgaG90a2V5T2JqOiBIb3RrZXkgPSBuZXcgSG90a2V5KGNvbWJvLCBob3RrZXlbY29tYm9dKTtcbiAgICAgICAgICAgIGNvbnN0IG9sZEhvdGtleTogSG90a2V5ID0gdGhpcy5ob3RrZXlzU2VydmljZS5nZXQoY29tYm8pIGFzIEhvdGtleTtcbiAgICAgICAgICAgIGlmIChvbGRIb3RrZXkgIT09IG51bGwpIHsgLy8gV2UgbGV0IHRoZSB1c2VyIG92ZXJ3cml0ZSBjYWxsYmFja3MgdGVtcG9yYXJpbHkgaWYgeW91IHNwZWNpZnkgaXQgaW4gSFRNTFxuICAgICAgICAgICAgICAgIHRoaXMub2xkSG90a2V5cy5wdXNoKG9sZEhvdGtleSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3RrZXlzU2VydmljZS5yZW1vdmUob2xkSG90a2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaG90a2V5c0xpc3QucHVzaChob3RrZXlPYmopO1xuICAgICAgICAgICAgdGhpcy5tb3VzZXRyYXAuYmluZChob3RrZXlPYmouY29tYm8sIGhvdGtleU9iai5jYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBob3RrZXkgb2YgdGhpcy5ob3RrZXlzTGlzdCkge1xuICAgICAgICAgICAgdGhpcy5tb3VzZXRyYXAudW5iaW5kKGhvdGtleS5jb21ibyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ob3RrZXlzU2VydmljZS5hZGQodGhpcy5vbGRIb3RrZXlzKTtcbiAgICB9XG5cbn1cbiJdfQ==