@ngrdt/shortcuts 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/esm2022/index.mjs +5 -0
- package/esm2022/lib/shortcuts/directives/rdt-key-listener.directive.mjs +53 -0
- package/esm2022/lib/shortcuts/providers/rdt-shortcut.service.mjs +125 -0
- package/esm2022/lib/shortcuts/rdt-shortcut.mjs +32 -0
- package/esm2022/lib/shortcuts/rdt-shortcut.models.mjs +13 -0
- package/esm2022/lib/shortcuts/utils.mjs +19 -0
- package/esm2022/lib/shortcuts/windows-browser-shortcuts.mjs +79 -0
- package/esm2022/ngrdt-shortcuts.mjs +5 -0
- package/fesm2022/ngrdt-shortcuts.mjs +321 -0
- package/fesm2022/ngrdt-shortcuts.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/lib/shortcuts/directives/rdt-key-listener.directive.d.ts +12 -0
- package/lib/shortcuts/providers/rdt-shortcut.service.d.ts +18 -0
- package/lib/shortcuts/rdt-shortcut.d.ts +11 -0
- package/lib/shortcuts/rdt-shortcut.models.d.ts +17 -0
- package/lib/shortcuts/utils.d.ts +1 -0
- package/lib/shortcuts/windows-browser-shortcuts.d.ts +1 -0
- package/package.json +28 -0
package/README.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './lib/shortcuts/rdt-shortcut';
|
|
2
|
+
export * from './lib/shortcuts/rdt-shortcut.models';
|
|
3
|
+
export * from './lib/shortcuts/providers/rdt-shortcut.service';
|
|
4
|
+
export * from './lib/shortcuts/directives/rdt-key-listener.directive';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9AbmdyZHQvc2hvcnRjdXRzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMscUNBQXFDLENBQUM7QUFFcEQsY0FBYyxnREFBZ0QsQ0FBQztBQUMvRCxjQUFjLHVEQUF1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvc2hvcnRjdXRzL3JkdC1zaG9ydGN1dCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Nob3J0Y3V0cy9yZHQtc2hvcnRjdXQubW9kZWxzJztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Nob3J0Y3V0cy9wcm92aWRlcnMvcmR0LXNob3J0Y3V0LnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zaG9ydGN1dHMvZGlyZWN0aXZlcy9yZHQta2V5LWxpc3RlbmVyLmRpcmVjdGl2ZSc7XHJcbiJdfQ==
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Directive, EventEmitter, HostListener, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
// Outputs keydown event if only one key was pressed at once
|
|
4
|
+
export class RdtKeyListenerDirective {
|
|
5
|
+
keysPressed = new Set();
|
|
6
|
+
pressedAtOnce = new Set();
|
|
7
|
+
output = new EventEmitter();
|
|
8
|
+
onKeyDown(event) {
|
|
9
|
+
if (!this.pressedAtOnce.has(event.key)) {
|
|
10
|
+
this.keysPressed.add(event.key);
|
|
11
|
+
this.pressedAtOnce.add(event.key);
|
|
12
|
+
if (this.pressedAtOnce.size === 1) {
|
|
13
|
+
this.output.emit(event);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
onKeyUp(event) {
|
|
18
|
+
this.keysPressed.delete(event.key);
|
|
19
|
+
this.pressedAtOnce.delete(event.key);
|
|
20
|
+
if (this.keysPressed.size === 0) {
|
|
21
|
+
this.pressedAtOnce.clear();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
onWindowFocus() {
|
|
25
|
+
this.pressedAtOnce.clear();
|
|
26
|
+
this.keysPressed.clear();
|
|
27
|
+
}
|
|
28
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtKeyListenerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
29
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: RdtKeyListenerDirective, isStandalone: true, selector: "[rdtKeyListener]", outputs: { output: "rdtKeyListener" }, host: { listeners: { "keydown": "onKeyDown($event)", "window:keyup": "onKeyUp($event)", "keyup": "onKeyUp($event)", "window:focus": "onWindowFocus()" } }, ngImport: i0 });
|
|
30
|
+
}
|
|
31
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtKeyListenerDirective, decorators: [{
|
|
32
|
+
type: Directive,
|
|
33
|
+
args: [{
|
|
34
|
+
selector: '[rdtKeyListener]',
|
|
35
|
+
standalone: true,
|
|
36
|
+
}]
|
|
37
|
+
}], propDecorators: { output: [{
|
|
38
|
+
type: Output,
|
|
39
|
+
args: ['rdtKeyListener']
|
|
40
|
+
}], onKeyDown: [{
|
|
41
|
+
type: HostListener,
|
|
42
|
+
args: ['keydown', ['$event']]
|
|
43
|
+
}], onKeyUp: [{
|
|
44
|
+
type: HostListener,
|
|
45
|
+
args: ['window:keyup', ['$event']]
|
|
46
|
+
}, {
|
|
47
|
+
type: HostListener,
|
|
48
|
+
args: ['keyup', ['$event']]
|
|
49
|
+
}], onWindowFocus: [{
|
|
50
|
+
type: HostListener,
|
|
51
|
+
args: ['window:focus']
|
|
52
|
+
}] } });
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LWtleS1saXN0ZW5lci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvc2hvcnRjdXRzL3NyYy9saWIvc2hvcnRjdXRzL2RpcmVjdGl2ZXMvcmR0LWtleS1saXN0ZW5lci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFOUUsNERBQTREO0FBSzVELE1BQU0sT0FBTyx1QkFBdUI7SUFDMUIsV0FBVyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDaEMsYUFBYSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFHMUMsTUFBTSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO0lBR25DLFNBQVMsQ0FBQyxLQUFvQjtRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVsQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFJTyxPQUFPLENBQUMsS0FBb0I7UUFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFHTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzQixDQUFDO3VHQWpDVSx1QkFBdUI7MkZBQXZCLHVCQUF1Qjs7MkZBQXZCLHVCQUF1QjtrQkFKbkMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsa0JBQWtCO29CQUM1QixVQUFVLEVBQUUsSUFBSTtpQkFDakI7OEJBTUMsTUFBTTtzQkFETCxNQUFNO3VCQUFDLGdCQUFnQjtnQkFJaEIsU0FBUztzQkFEaEIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBYzNCLE9BQU87c0JBRmQsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7O3NCQUN2QyxZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFVekIsYUFBYTtzQkFEcEIsWUFBWTt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vLyBPdXRwdXRzIGtleWRvd24gZXZlbnQgaWYgb25seSBvbmUga2V5IHdhcyBwcmVzc2VkIGF0IG9uY2VcclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbcmR0S2V5TGlzdGVuZXJdJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmR0S2V5TGlzdGVuZXJEaXJlY3RpdmUge1xyXG4gIHByaXZhdGUga2V5c1ByZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuICBwcml2YXRlIHByZXNzZWRBdE9uY2UgPSBuZXcgU2V0PHN0cmluZz4oKTtcclxuXHJcbiAgQE91dHB1dCgncmR0S2V5TGlzdGVuZXInKVxyXG4gIG91dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgcHJpdmF0ZSBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICghdGhpcy5wcmVzc2VkQXRPbmNlLmhhcyhldmVudC5rZXkpKSB7XHJcbiAgICAgIHRoaXMua2V5c1ByZXNzZWQuYWRkKGV2ZW50LmtleSk7XHJcbiAgICAgIHRoaXMucHJlc3NlZEF0T25jZS5hZGQoZXZlbnQua2V5KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnByZXNzZWRBdE9uY2Uuc2l6ZSA9PT0gMSkge1xyXG4gICAgICAgIHRoaXMub3V0cHV0LmVtaXQoZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAnLCBbJyRldmVudCddKVxyXG4gIEBIb3N0TGlzdGVuZXIoJ2tleXVwJywgWyckZXZlbnQnXSlcclxuICBwcml2YXRlIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIHRoaXMua2V5c1ByZXNzZWQuZGVsZXRlKGV2ZW50LmtleSk7XHJcbiAgICB0aGlzLnByZXNzZWRBdE9uY2UuZGVsZXRlKGV2ZW50LmtleSk7XHJcbiAgICBpZiAodGhpcy5rZXlzUHJlc3NlZC5zaXplID09PSAwKSB7XHJcbiAgICAgIHRoaXMucHJlc3NlZEF0T25jZS5jbGVhcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmZvY3VzJylcclxuICBwcml2YXRlIG9uV2luZG93Rm9jdXMoKSB7XHJcbiAgICB0aGlzLnByZXNzZWRBdE9uY2UuY2xlYXIoKTtcclxuICAgIHRoaXMua2V5c1ByZXNzZWQuY2xlYXIoKTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import hotkeys from 'hotkeys-js';
|
|
3
|
+
import { filter, Observable, Subject } from 'rxjs';
|
|
4
|
+
import { DEFAULT_SHORTCUT_CONFIG, IGNORED_KEYCODES, SHORTCUT_SPLIT_KEY, ShortcutSrcElement, } from '../rdt-shortcut.models';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class RdtShortcutService {
|
|
7
|
+
bound = new Map();
|
|
8
|
+
subject$ = new Subject();
|
|
9
|
+
observable$ = this.subject$.asObservable();
|
|
10
|
+
constructor() {
|
|
11
|
+
// Enables hotkeys on input elements
|
|
12
|
+
// Enables hotkeys on input elements
|
|
13
|
+
hotkeys.filter = function (event) {
|
|
14
|
+
if (IGNORED_KEYCODES.includes(event.code)) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const tagName = event.target.tagName;
|
|
18
|
+
const isInputEl = /^(INPUT|TEXTAREA|SELECT)$/.test(tagName);
|
|
19
|
+
const scope = isInputEl
|
|
20
|
+
? ShortcutSrcElement.INPUT
|
|
21
|
+
: ShortcutSrcElement.OTHER;
|
|
22
|
+
hotkeys.setScope(scope);
|
|
23
|
+
return true;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
listen(shortcut, config) {
|
|
27
|
+
const patchedConfig = {
|
|
28
|
+
...DEFAULT_SHORTCUT_CONFIG,
|
|
29
|
+
...config,
|
|
30
|
+
};
|
|
31
|
+
if (Array.isArray(shortcut)) {
|
|
32
|
+
return this.listenArray(shortcut, patchedConfig);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return this.listenSingle(shortcut, patchedConfig);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
listenArray(shortcuts, config) {
|
|
39
|
+
return new Observable((subscriber) => {
|
|
40
|
+
const set = new Set(shortcuts);
|
|
41
|
+
try {
|
|
42
|
+
shortcuts.forEach((s) => this.bind(s, config));
|
|
43
|
+
}
|
|
44
|
+
catch (ex) {
|
|
45
|
+
subscriber.error(ex);
|
|
46
|
+
}
|
|
47
|
+
const sub = this.observable$
|
|
48
|
+
.pipe(filter((evt) => set.has(evt.shortcut)))
|
|
49
|
+
.subscribe(subscriber);
|
|
50
|
+
return () => {
|
|
51
|
+
sub.unsubscribe();
|
|
52
|
+
shortcuts.forEach((s) => this.unbind(s, config));
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
listenSingle(shortcut, config) {
|
|
57
|
+
return new Observable((subscriber) => {
|
|
58
|
+
try {
|
|
59
|
+
this.bind(shortcut, config);
|
|
60
|
+
}
|
|
61
|
+
catch (ex) {
|
|
62
|
+
subscriber.error(ex);
|
|
63
|
+
}
|
|
64
|
+
const sub = this.observable$
|
|
65
|
+
.pipe(filter((evt) => evt.shortcut === shortcut))
|
|
66
|
+
.subscribe(subscriber);
|
|
67
|
+
return () => {
|
|
68
|
+
sub.unsubscribe();
|
|
69
|
+
this.unbind(shortcut, config);
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
bind(shortcut, config) {
|
|
74
|
+
const options = {
|
|
75
|
+
element: config.element,
|
|
76
|
+
splitKey: SHORTCUT_SPLIT_KEY,
|
|
77
|
+
};
|
|
78
|
+
if (this.bound.get(config.element)?.[shortcut.hotkeysValue]) {
|
|
79
|
+
throw new Error(`Shortcut ${shortcut} is already binded!`);
|
|
80
|
+
}
|
|
81
|
+
if (!this.bound.has(config.element)) {
|
|
82
|
+
const newObj = {
|
|
83
|
+
[shortcut.hotkeysValue]: shortcut,
|
|
84
|
+
};
|
|
85
|
+
this.bound.set(config.element, newObj);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.bound.get(config.element)[shortcut.hotkeysValue] = shortcut;
|
|
89
|
+
}
|
|
90
|
+
hotkeys(shortcut.hotkeysValue, options, this.keyHandlerFactory(config));
|
|
91
|
+
}
|
|
92
|
+
unbind(shortcut, config) {
|
|
93
|
+
const obj = this.bound.get(config.element);
|
|
94
|
+
if (obj?.[shortcut.hotkeysValue]) {
|
|
95
|
+
obj[shortcut.hotkeysValue] = undefined;
|
|
96
|
+
if (Object.keys(obj).every((key) => obj[key] === undefined)) {
|
|
97
|
+
this.bound.delete(config.element);
|
|
98
|
+
}
|
|
99
|
+
hotkeys.unbind(shortcut.hotkeysValue);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
keyHandlerFactory(config) {
|
|
103
|
+
return (keyboardEvent, hotkeysEvent) => {
|
|
104
|
+
if (config.preventDefault) {
|
|
105
|
+
keyboardEvent.preventDefault();
|
|
106
|
+
}
|
|
107
|
+
const evt = {
|
|
108
|
+
shortcut: this.bound.get(config.element)[hotkeysEvent.shortcut],
|
|
109
|
+
src: hotkeysEvent.scope,
|
|
110
|
+
originalEvent: keyboardEvent,
|
|
111
|
+
};
|
|
112
|
+
this.subject$.next(evt);
|
|
113
|
+
return !config.preventDefault;
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtShortcutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
117
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtShortcutService, providedIn: 'root' });
|
|
118
|
+
}
|
|
119
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtShortcutService, decorators: [{
|
|
120
|
+
type: Injectable,
|
|
121
|
+
args: [{
|
|
122
|
+
providedIn: 'root',
|
|
123
|
+
}]
|
|
124
|
+
}], ctorParameters: () => [] });
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXNob3J0Y3V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvc2hvcnRjdXRzL3NyYy9saWIvc2hvcnRjdXRzL3Byb3ZpZGVycy9yZHQtc2hvcnRjdXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sT0FBcUMsTUFBTSxZQUFZLENBQUM7QUFDL0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUVsQixrQkFBa0IsR0FDbkIsTUFBTSx3QkFBd0IsQ0FBQzs7QUFjaEMsTUFBTSxPQUFPLGtCQUFrQjtJQUNyQixLQUFLLEdBQ1gsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNKLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBb0IsQ0FBQztJQUMzQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUVuRDtRQUNFLG9DQUFvQztRQUNwQyxvQ0FBb0M7UUFDcEMsT0FBTyxDQUFDLE1BQU0sR0FBRyxVQUFVLEtBQW9CO1lBQzdDLElBQUksZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMxQyxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBSSxLQUFLLENBQUMsTUFBc0IsQ0FBQyxPQUFPLENBQUM7WUFDdEQsTUFBTSxTQUFTLEdBQUcsMkJBQTJCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVELE1BQU0sS0FBSyxHQUFHLFNBQVM7Z0JBQ3JCLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLO2dCQUMxQixDQUFDLENB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QUMsS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUM1RCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRU8saUJBQWlCLENBQUMsTUFBbUM7UUFDM0QsT0FBTyxDQUFDLGFBQTRCLEVBQUUsWUFBMEIsRUFBRSxFQUFFO1lBQ2xFLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMxQixhQUFhLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDakMsQ0FBQztZQUNELE1BQU0sR0FBRyxHQUFxQjtnQkFDNUIsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO2dCQUNoRSxHQUFHLEVBQUUsWUFBWSxDQUFDLEtBQTJCO2dCQUM3QyxhQUFhLEVBQUUsYUFBYTthQUM3QixDQUFDO1lBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7UUFDaEMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzt1R0E5SFUsa0JBQWtCOzJHQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7MkZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IGhvdGtleXMsIHsgSG90a2V5c0V2ZW50LCBLZXlIYW5kbGVyIH0gZnJvbSAnaG90a2V5cy1qcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSZHRTaG9ydGN1dCB9IGZyb20gJy4uL3JkdC1zaG9ydGN1dCc7XHJcbmltcG9ydCB7XHJcbiAgREVGQVVMVF9TSE9SVENVVF9DT05GSUcsXHJcbiAgUmR0U2hvcnRjdXRDb25maWcsXHJcbiAgSUdOT1JFRF9LRVlDT0RFUyxcclxuICBTSE9SVENVVF9TUExJVF9LRVksXHJcbiAgUmR0U2hvcnRjdXRFdmVudCxcclxuICBTaG9ydGN1dFNyY0VsZW1lbnQsXHJcbn0gZnJvbSAnLi4vcmR0LXNob3J0Y3V0Lm1vZGVscyc7XHJcblxyXG5pbnRlcmZhY2UgSG90a2V5c09wdGlvbnMge1xyXG4gIHNjb3BlPzogc3RyaW5nO1xyXG4gIGVsZW1lbnQ/OiBIVE1MRWxlbWVudCB8IG51bGw7XHJcbiAga2V5dXA/OiBib29sZWFuIHwgbnVsbDtcclxuICBrZXlkb3duPzogYm9vbGVhbiB8IG51bGw7XHJcbiAgY2FwdHVyZT86IGJvb2xlYW47XHJcbiAgc3BsaXRLZXk/OiBzdHJpbmc7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZHRTaG9ydGN1dFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgYm91bmQ6IE1hcDxIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCwgUmVjb3JkPHN0cmluZywgUmR0U2hvcnRjdXQ+PiA9XHJcbiAgICBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSBzdWJqZWN0JCA9IG5ldyBTdWJqZWN0PFJkdFNob3J0Y3V0RXZlbnQ+KCk7XHJcbiAgcHJpdmF0ZSBvYnNlcnZhYmxlJCA9IHRoaXMuc3ViamVjdCQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgLy8gRW5hYmxlcyBob3RrZXlzIG9uIGlucHV0IGVsZW1lbnRzXHJcbiAgICAvLyBFbmFibGVzIGhvdGtleXMgb24gaW5wdXQgZWxlbWVudHNcclxuICAgIGhvdGtleXMuZmlsdGVyID0gZnVuY3Rpb24gKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgIGlmIChJR05PUkVEX0tFWUNPREVTLmluY2x1ZGVzKGV2ZW50LmNvZGUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRhZ05hbWUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS50YWdOYW1lO1xyXG4gICAgICBjb25zdCBpc0lucHV0RWwgPSAvXihJTlBVVHxURVhUQVJFQXxTRUxFQ1QpJC8udGVzdCh0YWdOYW1lKTtcclxuICAgICAgY29uc3Qgc2NvcGUgPSBpc0lucHV0RWxcclxuICAgICAgICA/IFNob3J0Y3V0U3JjRWxlbWVudC5JTlBVVFxyXG4gICAgICAgIDogU2hvcnRjdXRTcmNFbGVtZW50Lk9USEVSO1xyXG4gICAgICBob3RrZXlzLnNldFNjb3BlKHNjb3BlKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgbGlzdGVuKHNob3J0Y3V0OiBSZHRTaG9ydGN1dCB8IFJkdFNob3J0Y3V0W10sIGNvbmZpZz86IFJkdFNob3J0Y3V0Q29uZmlnKSB7XHJcbiAgICBjb25zdCBwYXRjaGVkQ29uZmlnID0ge1xyXG4gICAgICAuLi5ERUZBVUxUX1NIT1JUQ1VUX0NPTkZJRyxcclxuICAgICAgLi4uY29uZmlnLFxyXG4gICAgfSBhcyBSZXF1aXJlZDxSZHRTaG9ydGN1dENvbmZpZz47XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzaG9ydGN1dCkpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuQXJyYXkoc2hvcnRjdXQsIHBhdGNoZWRDb25maWcpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuU2luZ2xlKHNob3J0Y3V0LCBwYXRjaGVkQ29uZmlnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbGlzdGVuQXJyYXkoXHJcbiAgICBzaG9ydGN1dHM6IFJkdFNob3J0Y3V0W10sXHJcbiAgICBjb25maWc6IFJlcXVpcmVkPFJkdFNob3J0Y3V0Q29uZmlnPlxyXG4gICkge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFJkdFNob3J0Y3V0RXZlbnQ+KChzdWJzY3JpYmVyKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoc2hvcnRjdXRzKTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgc2hvcnRjdXRzLmZvckVhY2goKHMpID0+IHRoaXMuYmluZChzLCBjb25maWcpKTtcclxuICAgICAgfSBjYXRjaCAoZXgpIHtcclxuICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGV4KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3Qgc3ViID0gdGhpcy5vYnNlcnZhYmxlJFxyXG4gICAgICAgIC5waXBlKGZpbHRlcigoZXZ0KSA9PiBzZXQuaGFzKGV2dC5zaG9ydGN1dCkpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XHJcblxyXG4gICAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHNob3J0Y3V0cy5mb3JFYWNoKChzKSA9PiB0aGlzLnVuYmluZChzLCBjb25maWcpKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsaXN0ZW5TaW5nbGUoXHJcbiAgICBzaG9ydGN1dDogUmR0U2hvcnRjdXQsXHJcbiAgICBjb25maWc6IFJlcXVpcmVkPFJkdFNob3J0Y3V0Q29uZmlnPlxyXG4gICkge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFJkdFNob3J0Y3V0RXZlbnQ+KChzdWJzY3JpYmVyKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5iaW5kKHNob3J0Y3V0LCBjb25maWcpO1xyXG4gICAgICB9IGNhdGNoIChleCkge1xyXG4gICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBzdWIgPSB0aGlzLm9ic2VydmFibGUkXHJcbiAgICAgICAgLnBpcGUoZmlsdGVyKChldnQpID0+IGV2dC5zaG9ydGN1dCA9PT0gc2hvcnRjdXQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XHJcblxyXG4gICAgICByZXR1cm4gKCkgPT4ge1xyXG4gICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHRoaXMudW5iaW5kKHNob3J0Y3V0LCBjb25maWcpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJpbmQoc2hvcnRjdXQ6IFJkdFNob3J0Y3V0LCBjb25maWc6IFJlcXVpcmVkPFJkdFNob3J0Y3V0Q29uZmlnPikge1xyXG4gICAgY29uc3Qgb3B0aW9uczogSG90a2V5c09wdGlvbnMgPSB7XHJcbiAgICAgIGVsZW1lbnQ6IGNvbmZpZy5lbGVtZW50LFxyXG4gICAgICBzcGxpdEtleTogU0hPUlRDVVRfU1BMSVRfS0VZLFxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodGhpcy5ib3VuZC5nZXQoY29uZmlnLmVsZW1lbnQpPy5bc2hvcnRjdXQuaG90a2V5c1ZhbHVlXSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNob3J0Y3V0ICR7c2hvcnRjdXR9IGlzIGFscmVhZHkgYmluZGVkIWApO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmJvdW5kLmhhcyhjb25maWcuZWxlbWVudCkpIHtcclxuICAgICAgY29uc3QgbmV3T2JqID0ge1xyXG4gICAgICAgIFtzaG9ydGN1dC5ob3RrZXlzVmFsdWVdOiBzaG9ydGN1dCxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5ib3VuZC5zZXQoY29uZmlnLmVsZW1lbnQsIG5ld09iaik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmJvdW5kLmdldChjb25maWcuZWxlbWVudCkhW3Nob3J0Y3V0LmhvdGtleXNWYWx1ZV0gPSBzaG9ydGN1dDtcclxuICAgIH1cclxuXHJcbiAgICBob3RrZXlzKHNob3J0Y3V0LmhvdGtleXNWYWx1ZSwgb3B0aW9ucywgdGhpcy5rZXlIYW5kbGVyRmFjdG9yeShjb25maWcpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5iaW5kKHNob3J0Y3V0OiBSZHRTaG9ydGN1dCwgY29uZmlnOiBSZHRTaG9ydGN1dENvbmZpZykge1xyXG4gICAgY29uc3Qgb2JqID0gdGhpcy5ib3VuZC5nZXQoY29uZmlnLmVsZW1lbnQpO1xyXG4gICAgaWYgKG9iaj8uW3Nob3J0Y3V0LmhvdGtleXNWYWx1ZV0pIHtcclxuICAgICAgb2JqW3Nob3J0Y3V0LmhvdGtleXNWYWx1ZV0gPSB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBSZHRTaG9ydGN1dDtcclxuICAgICAgaWYgKE9iamVjdC5rZXlzKG9iaikuZXZlcnkoKGtleSkgPT4gb2JqW2tleV0gPT09IHVuZGVmaW5lZCkpIHtcclxuICAgICAgICB0aGlzLmJvdW5kLmRlbGV0ZShjb25maWcuZWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgICAgaG90a2V5cy51bmJpbmQoc2hvcnRjdXQuaG90a2V5c1ZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUga2V5SGFuZGxlckZhY3RvcnkoY29uZmlnOiBSZXF1aXJlZDxSZHRTaG9ydGN1dENvbmZpZz4pOiBLZXlIYW5kbGVyIHtcclxuICAgIHJldHVybiAoa2V5Ym9hcmRFdmVudDogS2V5Ym9hcmRFdmVudCwgaG90a2V5c0V2ZW50OiBIb3RrZXlzRXZlbnQpID0+IHtcclxuICAgICAgaWYgKGNvbmZpZy5wcmV2ZW50RGVmYXVsdCkge1xyXG4gICAgICAgIGtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBldnQ6IFJkdFNob3J0Y3V0RXZlbnQgPSB7XHJcbiAgICAgICAgc2hvcnRjdXQ6IHRoaXMuYm91bmQuZ2V0KGNvbmZpZy5lbGVtZW50KSFbaG90a2V5c0V2ZW50LnNob3J0Y3V0XSxcclxuICAgICAgICBzcmM6IGhvdGtleXNFdmVudC5zY29wZSBhcyBTaG9ydGN1dFNyY0VsZW1lbnQsXHJcbiAgICAgICAgb3JpZ2luYWxFdmVudDoga2V5Ym9hcmRFdmVudCxcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5zdWJqZWN0JC5uZXh0KGV2dCk7XHJcbiAgICAgIHJldHVybiAhY29uZmlnLnByZXZlbnREZWZhdWx0O1xyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { isBrowserShortcut } from './utils';
|
|
2
|
+
import { SHORTCUT_SPLIT_KEY } from './rdt-shortcut.models';
|
|
3
|
+
import { RdtStringUtils } from '@ngrdt/utils';
|
|
4
|
+
export class RdtShortcut {
|
|
5
|
+
hotkeysValue;
|
|
6
|
+
keys;
|
|
7
|
+
label;
|
|
8
|
+
get lastKey() {
|
|
9
|
+
return this.keys[this.keys.length - 1];
|
|
10
|
+
}
|
|
11
|
+
constructor(keys) {
|
|
12
|
+
this.keys = keys;
|
|
13
|
+
this.hotkeysValue = RdtShortcut.joinKeys(keys);
|
|
14
|
+
this.label = RdtShortcut.makeLabel(keys);
|
|
15
|
+
}
|
|
16
|
+
static joinKeys(keys) {
|
|
17
|
+
return keys.join(SHORTCUT_SPLIT_KEY);
|
|
18
|
+
}
|
|
19
|
+
static makeLabel(keys) {
|
|
20
|
+
return keys.map(RdtStringUtils.capitalize).join('+');
|
|
21
|
+
}
|
|
22
|
+
static create(...keys) {
|
|
23
|
+
if (isBrowserShortcut(keys)) {
|
|
24
|
+
throw new Error(`Shortcut ${RdtShortcut.joinKeys(keys)} is a browser shortcut!`);
|
|
25
|
+
}
|
|
26
|
+
return new RdtShortcut(keys);
|
|
27
|
+
}
|
|
28
|
+
static createUnsafe(...keys) {
|
|
29
|
+
return new RdtShortcut(keys);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXNob3J0Y3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vQG5ncmR0L3Nob3J0Y3V0cy9zcmMvbGliL3Nob3J0Y3V0cy9yZHQtc2hvcnRjdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFOUMsTUFBTSxPQUFPLFdBQVc7SUFDYixZQUFZLENBQVM7SUFDckIsSUFBSSxDQUFXO0lBQ2YsS0FBSyxDQUFTO0lBRXZCLElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsWUFBb0IsSUFBYztRQUNoQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFTyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQWM7UUFDcEMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBYztRQUNyQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQWM7UUFDN0IsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQ2IsWUFBWSxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FDaEUsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBYztRQUNuQyxPQUFPLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQnJvd3NlclNob3J0Y3V0IH0gZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCB7IFNIT1JUQ1VUX1NQTElUX0tFWSB9IGZyb20gJy4vcmR0LXNob3J0Y3V0Lm1vZGVscyc7XHJcbmltcG9ydCB7IFJkdFN0cmluZ1V0aWxzIH0gZnJvbSAnQG5ncmR0L3V0aWxzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBSZHRTaG9ydGN1dCB7XHJcbiAgcmVhZG9ubHkgaG90a2V5c1ZhbHVlOiBzdHJpbmc7XHJcbiAgcmVhZG9ubHkga2V5czogc3RyaW5nW107XHJcbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcclxuXHJcbiAgZ2V0IGxhc3RLZXkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5rZXlzW3RoaXMua2V5cy5sZW5ndGggLSAxXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioa2V5czogc3RyaW5nW10pIHtcclxuICAgIHRoaXMua2V5cyA9IGtleXM7XHJcbiAgICB0aGlzLmhvdGtleXNWYWx1ZSA9IFJkdFNob3J0Y3V0LmpvaW5LZXlzKGtleXMpO1xyXG4gICAgdGhpcy5sYWJlbCA9IFJkdFNob3J0Y3V0Lm1ha2VMYWJlbChrZXlzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGpvaW5LZXlzKGtleXM6IHN0cmluZ1tdKSB7XHJcbiAgICByZXR1cm4ga2V5cy5qb2luKFNIT1JUQ1VUX1NQTElUX0tFWSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBtYWtlTGFiZWwoa2V5czogc3RyaW5nW10pIHtcclxuICAgIHJldHVybiBrZXlzLm1hcChSZHRTdHJpbmdVdGlscy5jYXBpdGFsaXplKS5qb2luKCcrJyk7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgY3JlYXRlKC4uLmtleXM6IHN0cmluZ1tdKSB7XHJcbiAgICBpZiAoaXNCcm93c2VyU2hvcnRjdXQoa2V5cykpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgIGBTaG9ydGN1dCAke1JkdFNob3J0Y3V0LmpvaW5LZXlzKGtleXMpfSBpcyBhIGJyb3dzZXIgc2hvcnRjdXQhYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBSZHRTaG9ydGN1dChrZXlzKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBjcmVhdGVVbnNhZmUoLi4ua2V5czogc3RyaW5nW10pIHtcclxuICAgIHJldHVybiBuZXcgUmR0U2hvcnRjdXQoa2V5cyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const SHORTCUT_SPLIT_KEY = ':';
|
|
2
|
+
// Fn key on Thinkpad is emitted as event.code === 'WakeUp' so F1-12 shortcuts won't work
|
|
3
|
+
export const IGNORED_KEYCODES = ['WakeUp'];
|
|
4
|
+
export var ShortcutSrcElement;
|
|
5
|
+
(function (ShortcutSrcElement) {
|
|
6
|
+
ShortcutSrcElement["INPUT"] = "input";
|
|
7
|
+
ShortcutSrcElement["OTHER"] = "other";
|
|
8
|
+
})(ShortcutSrcElement || (ShortcutSrcElement = {}));
|
|
9
|
+
export const DEFAULT_SHORTCUT_CONFIG = {
|
|
10
|
+
preventDefault: true,
|
|
11
|
+
element: undefined,
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXNob3J0Y3V0Lm1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL0BuZ3JkdC9zaG9ydGN1dHMvc3JjL2xpYi9zaG9ydGN1dHMvcmR0LXNob3J0Y3V0Lm1vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFFdEMseUZBQXlGO0FBQ3pGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFM0MsTUFBTSxDQUFOLElBQVksa0JBR1g7QUFIRCxXQUFZLGtCQUFrQjtJQUM1QixxQ0FBZSxDQUFBO0lBQ2YscUNBQWUsQ0FBQTtBQUNqQixDQUFDLEVBSFcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQUc3QjtBQWFELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFzQjtJQUN4RCxjQUFjLEVBQUUsSUFBSTtJQUNwQixPQUFPLEVBQUUsU0FBUztDQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmR0U2hvcnRjdXQgfSBmcm9tICcuL3JkdC1zaG9ydGN1dCc7XHJcblxyXG5leHBvcnQgY29uc3QgU0hPUlRDVVRfU1BMSVRfS0VZID0gJzonO1xyXG5cclxuLy8gRm4ga2V5IG9uIFRoaW5rcGFkIGlzIGVtaXR0ZWQgYXMgZXZlbnQuY29kZSA9PT0gJ1dha2VVcCcgc28gRjEtMTIgc2hvcnRjdXRzIHdvbid0IHdvcmtcclxuZXhwb3J0IGNvbnN0IElHTk9SRURfS0VZQ09ERVMgPSBbJ1dha2VVcCddO1xyXG5cclxuZXhwb3J0IGVudW0gU2hvcnRjdXRTcmNFbGVtZW50IHtcclxuICBJTlBVVCA9ICdpbnB1dCcsXHJcbiAgT1RIRVIgPSAnb3RoZXInLFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJkdFNob3J0Y3V0RXZlbnQge1xyXG4gIHNob3J0Y3V0OiBSZHRTaG9ydGN1dDtcclxuICBzcmM6IFNob3J0Y3V0U3JjRWxlbWVudDtcclxuICBvcmlnaW5hbEV2ZW50OiBLZXlib2FyZEV2ZW50O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJkdFNob3J0Y3V0Q29uZmlnIHtcclxuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XHJcbiAgZWxlbWVudD86IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9TSE9SVENVVF9DT05GSUc6IFJkdFNob3J0Y3V0Q29uZmlnID0ge1xyXG4gIHByZXZlbnREZWZhdWx0OiB0cnVlLFxyXG4gIGVsZW1lbnQ6IHVuZGVmaW5lZCxcclxufTtcclxuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// https://support.google.com/chrome/answer/157179
|
|
2
|
+
import { SHORTCUT_SPLIT_KEY } from './rdt-shortcut.models';
|
|
3
|
+
import { WINDOWS_BROWSER_SHORCUTS } from './windows-browser-shortcuts';
|
|
4
|
+
function sortAndBuildShortcut(shortcut) {
|
|
5
|
+
const cpy = [...shortcut];
|
|
6
|
+
cpy.sort();
|
|
7
|
+
return shortcut.join(SHORTCUT_SPLIT_KEY);
|
|
8
|
+
}
|
|
9
|
+
function buildShortcutSet(shortcuts) {
|
|
10
|
+
const set = new Set();
|
|
11
|
+
shortcuts.forEach((s) => set.add(sortAndBuildShortcut(s)));
|
|
12
|
+
return set;
|
|
13
|
+
}
|
|
14
|
+
const BROWSER_SHORTCUT_SET = buildShortcutSet(WINDOWS_BROWSER_SHORCUTS);
|
|
15
|
+
export function isBrowserShortcut(keys) {
|
|
16
|
+
const sorted = sortAndBuildShortcut(keys);
|
|
17
|
+
return BROWSER_SHORTCUT_SET.has(sorted);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvc2hvcnRjdXRzL3NyYy9saWIvc2hvcnRjdXRzL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGtEQUFrRDtBQUNsRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV2RSxTQUFTLG9CQUFvQixDQUFDLFFBQWtCO0lBQzlDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztJQUMxQixHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDWCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxTQUFxQjtJQUM3QyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzlCLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sb0JBQW9CLEdBQUcsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUV4RSxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBYztJQUM5QyxNQUFNLE1BQU0sR0FBRyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxPQUFPLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vY2hyb21lL2Fuc3dlci8xNTcxNzlcclxuaW1wb3J0IHsgU0hPUlRDVVRfU1BMSVRfS0VZIH0gZnJvbSAnLi9yZHQtc2hvcnRjdXQubW9kZWxzJztcclxuaW1wb3J0IHsgV0lORE9XU19CUk9XU0VSX1NIT1JDVVRTIH0gZnJvbSAnLi93aW5kb3dzLWJyb3dzZXItc2hvcnRjdXRzJztcclxuXHJcbmZ1bmN0aW9uIHNvcnRBbmRCdWlsZFNob3J0Y3V0KHNob3J0Y3V0OiBzdHJpbmdbXSkge1xyXG4gIGNvbnN0IGNweSA9IFsuLi5zaG9ydGN1dF07XHJcbiAgY3B5LnNvcnQoKTtcclxuICByZXR1cm4gc2hvcnRjdXQuam9pbihTSE9SVENVVF9TUExJVF9LRVkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBidWlsZFNob3J0Y3V0U2V0KHNob3J0Y3V0czogc3RyaW5nW11bXSkge1xyXG4gIGNvbnN0IHNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xyXG4gIHNob3J0Y3V0cy5mb3JFYWNoKChzKSA9PiBzZXQuYWRkKHNvcnRBbmRCdWlsZFNob3J0Y3V0KHMpKSk7XHJcbiAgcmV0dXJuIHNldDtcclxufVxyXG5cclxuY29uc3QgQlJPV1NFUl9TSE9SVENVVF9TRVQgPSBidWlsZFNob3J0Y3V0U2V0KFdJTkRPV1NfQlJPV1NFUl9TSE9SQ1VUUyk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2VyU2hvcnRjdXQoa2V5czogc3RyaW5nW10pIHtcclxuICBjb25zdCBzb3J0ZWQgPSBzb3J0QW5kQnVpbGRTaG9ydGN1dChrZXlzKTtcclxuICByZXR1cm4gQlJPV1NFUl9TSE9SVENVVF9TRVQuaGFzKHNvcnRlZCk7XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export const WINDOWS_BROWSER_SHORCUTS = [
|
|
2
|
+
['ctrl', 'n'],
|
|
3
|
+
['ctrl', 'shift', 'n'],
|
|
4
|
+
['ctrl', 't'],
|
|
5
|
+
['ctrl', 'shift', 't'],
|
|
6
|
+
['ctrl', 'tab'],
|
|
7
|
+
['ctrl', 'pagedown'],
|
|
8
|
+
['ctrl', 'shift', 'tab'],
|
|
9
|
+
['ctrl', 'pageup'],
|
|
10
|
+
...[...Array(9).keys()].map(num => ['ctrl', String(num + 1)]), // ctrl + 1-9
|
|
11
|
+
['alt', 'home'],
|
|
12
|
+
['alt', 'left'],
|
|
13
|
+
['alt', 'right'],
|
|
14
|
+
['ctrl', 'w'],
|
|
15
|
+
['ctrl', 'f4'],
|
|
16
|
+
['ctrl', 'shift', 'w'],
|
|
17
|
+
['alt', 'f4'],
|
|
18
|
+
['alt', 'space', 'n'],
|
|
19
|
+
['alt', 'space', 'x'],
|
|
20
|
+
['alt', 'f', 'x'],
|
|
21
|
+
['ctrl', 'shift', 'pageup'],
|
|
22
|
+
['ctrl', 'shift', 'pagedown'],
|
|
23
|
+
['alt', 'f'],
|
|
24
|
+
['alt', 'e'],
|
|
25
|
+
['ctrl', 'shift', 'b'],
|
|
26
|
+
['ctrl', 'shift', 'o'],
|
|
27
|
+
['ctrl', 'h'],
|
|
28
|
+
['ctrl', 'j'],
|
|
29
|
+
['shift', 'esc'],
|
|
30
|
+
['shift', 'alt', 't'],
|
|
31
|
+
['f10'],
|
|
32
|
+
['f6'],
|
|
33
|
+
['ctrl', 'f'],
|
|
34
|
+
['f3'],
|
|
35
|
+
['ctrl', 'g'],
|
|
36
|
+
['ctrl', 'shift', 'g'],
|
|
37
|
+
['ctrl', 'shift', 'j'],
|
|
38
|
+
['f12'],
|
|
39
|
+
['ctrl', 'shift', 'del'],
|
|
40
|
+
['f1'],
|
|
41
|
+
['ctrl', 'shift', 'm'],
|
|
42
|
+
['alt', 'shift', 'i'],
|
|
43
|
+
['f7'],
|
|
44
|
+
['ctrl', 'f6'],
|
|
45
|
+
['alt', 'shift', 'a'],
|
|
46
|
+
['ctrl', 'l'],
|
|
47
|
+
['alt', 'd'],
|
|
48
|
+
['f6'],
|
|
49
|
+
['ctrl', 'k'],
|
|
50
|
+
['ctrl', 'e'],
|
|
51
|
+
['ctrl', 'p'],
|
|
52
|
+
['ctrl', 's'],
|
|
53
|
+
['f5'],
|
|
54
|
+
['ctrl', 'r'],
|
|
55
|
+
['shift', 'f5'],
|
|
56
|
+
['ctrl', 'shift', 'r'],
|
|
57
|
+
['esc'],
|
|
58
|
+
['tab'],
|
|
59
|
+
['shift', 'tab'],
|
|
60
|
+
['ctrl', 'o'],
|
|
61
|
+
['ctrl', 'u'],
|
|
62
|
+
['ctrl', 'd'],
|
|
63
|
+
['ctrl', 'shift', 'd'],
|
|
64
|
+
['f11'],
|
|
65
|
+
['ctrl', '+'],
|
|
66
|
+
['ctrl', '-'],
|
|
67
|
+
['ctrl', '0'],
|
|
68
|
+
['space'],
|
|
69
|
+
['pagedown'],
|
|
70
|
+
['shift', 'space'],
|
|
71
|
+
['pageup'],
|
|
72
|
+
['home'],
|
|
73
|
+
['end'],
|
|
74
|
+
['ctrl', 'left'],
|
|
75
|
+
['ctrl', 'right'],
|
|
76
|
+
['ctrl', 'backspace'],
|
|
77
|
+
['alt', 'home'],
|
|
78
|
+
];
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93cy1icm93c2VyLXNob3J0Y3V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL0BuZ3JkdC9zaG9ydGN1dHMvc3JjL2xpYi9zaG9ydGN1dHMvd2luZG93cy1icm93c2VyLXNob3J0Y3V0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRztJQUN0QyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7SUFDYixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDO0lBQ3RCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztJQUNiLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7SUFDdEIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO0lBQ2YsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDO0lBQ3BCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUM7SUFDeEIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO0lBQ2xCLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWE7SUFDNUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQ2YsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO0lBQ2YsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO0lBQ2hCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztJQUNiLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQztJQUNkLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUM7SUFDdEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDO0lBQ2IsQ0FBQyxLQUFLLEVBQUUsT0FB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QUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFdJTkRPV1NfQlJPV1NFUl9TSE9SQ1VUUyA9IFtcclxuICBbJ2N0cmwnLCAnbiddLFxyXG4gIFsnY3RybCcsICdzaGlmdCcsICduJ10sXHJcbiAgWydjdHJsJywgJ3QnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAndCddLFxyXG4gIFsnY3RybCcsICd0YWInXSxcclxuICBbJ2N0cmwnLCAncGFnZWRvd24nXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAndGFiJ10sXHJcbiAgWydjdHJsJywgJ3BhZ2V1cCddLFxyXG4gIC4uLlsuLi5BcnJheSg5KS5rZXlzKCldLm1hcChudW0gPT4gWydjdHJsJywgU3RyaW5nKG51bSArIDEpXSksIC8vIGN0cmwgKyAxLTlcclxuICBbJ2FsdCcsICdob21lJ10sXHJcbiAgWydhbHQnLCAnbGVmdCddLFxyXG4gIFsnYWx0JywgJ3JpZ2h0J10sXHJcbiAgWydjdHJsJywgJ3cnXSxcclxuICBbJ2N0cmwnLCAnZjQnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAndyddLFxyXG4gIFsnYWx0JywgJ2Y0J10sXHJcbiAgWydhbHQnLCAnc3BhY2UnLCAnbiddLFxyXG4gIFsnYWx0JywgJ3NwYWNlJywgJ3gnXSxcclxuICBbJ2FsdCcsICdmJywgJ3gnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAncGFnZXVwJ10sXHJcbiAgWydjdHJsJywgJ3NoaWZ0JywgJ3BhZ2Vkb3duJ10sXHJcbiAgWydhbHQnLCAnZiddLFxyXG4gIFsnYWx0JywgJ2UnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAnYiddLFxyXG4gIFsnY3RybCcsICdzaGlmdCcsICdvJ10sXHJcbiAgWydjdHJsJywgJ2gnXSxcclxuICBbJ2N0cmwnLCAnaiddLFxyXG4gIFsnc2hpZnQnLCAnZXNjJ10sXHJcbiAgWydzaGlmdCcsICdhbHQnLCAndCddLFxyXG4gIFsnZjEwJ10sXHJcbiAgWydmNiddLFxyXG4gIFsnY3RybCcsICdmJ10sXHJcbiAgWydmMyddLFxyXG4gIFsnY3RybCcsICdnJ10sXHJcbiAgWydjdHJsJywgJ3NoaWZ0JywgJ2cnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAnaiddLFxyXG4gIFsnZjEyJ10sXHJcbiAgWydjdHJsJywgJ3NoaWZ0JywgJ2RlbCddLFxyXG4gIFsnZjEnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAnbSddLFxyXG4gIFsnYWx0JywgJ3NoaWZ0JywgJ2knXSxcclxuICBbJ2Y3J10sXHJcbiAgWydjdHJsJywgJ2Y2J10sXHJcbiAgWydhbHQnLCAnc2hpZnQnLCAnYSddLFxyXG4gIFsnY3RybCcsICdsJ10sXHJcbiAgWydhbHQnLCAnZCddLFxyXG4gIFsnZjYnXSxcclxuICBbJ2N0cmwnLCAnayddLFxyXG4gIFsnY3RybCcsICdlJ10sXHJcbiAgWydjdHJsJywgJ3AnXSxcclxuICBbJ2N0cmwnLCAncyddLFxyXG4gIFsnZjUnXSxcclxuICBbJ2N0cmwnLCAnciddLFxyXG4gIFsnc2hpZnQnLCAnZjUnXSxcclxuICBbJ2N0cmwnLCAnc2hpZnQnLCAnciddLFxyXG4gIFsnZXNjJ10sXHJcbiAgWyd0YWInXSxcclxuICBbJ3NoaWZ0JywgJ3RhYiddLFxyXG4gIFsnY3RybCcsICdvJ10sXHJcbiAgWydjdHJsJywgJ3UnXSxcclxuICBbJ2N0cmwnLCAnZCddLFxyXG4gIFsnY3RybCcsICdzaGlmdCcsICdkJ10sXHJcbiAgWydmMTEnXSxcclxuICBbJ2N0cmwnLCAnKyddLFxyXG4gIFsnY3RybCcsICctJ10sXHJcbiAgWydjdHJsJywgJzAnXSxcclxuICBbJ3NwYWNlJ10sXHJcbiAgWydwYWdlZG93biddLFxyXG4gIFsnc2hpZnQnLCAnc3BhY2UnXSxcclxuICBbJ3BhZ2V1cCddLFxyXG4gIFsnaG9tZSddLFxyXG4gIFsnZW5kJ10sXHJcbiAgWydjdHJsJywgJ2xlZnQnXSxcclxuICBbJ2N0cmwnLCAncmlnaHQnXSxcclxuICBbJ2N0cmwnLCAnYmFja3NwYWNlJ10sXHJcbiAgWydhbHQnLCAnaG9tZSddLFxyXG5dO1xyXG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdyZHQtc2hvcnRjdXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vQG5ncmR0L3Nob3J0Y3V0cy9zcmMvbmdyZHQtc2hvcnRjdXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuIl19
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { RdtStringUtils } from '@ngrdt/utils';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { Injectable, EventEmitter, Directive, Output, HostListener } from '@angular/core';
|
|
4
|
+
import hotkeys from 'hotkeys-js';
|
|
5
|
+
import { Subject, Observable, filter } from 'rxjs';
|
|
6
|
+
|
|
7
|
+
const SHORTCUT_SPLIT_KEY = ':';
|
|
8
|
+
// Fn key on Thinkpad is emitted as event.code === 'WakeUp' so F1-12 shortcuts won't work
|
|
9
|
+
const IGNORED_KEYCODES = ['WakeUp'];
|
|
10
|
+
var ShortcutSrcElement;
|
|
11
|
+
(function (ShortcutSrcElement) {
|
|
12
|
+
ShortcutSrcElement["INPUT"] = "input";
|
|
13
|
+
ShortcutSrcElement["OTHER"] = "other";
|
|
14
|
+
})(ShortcutSrcElement || (ShortcutSrcElement = {}));
|
|
15
|
+
const DEFAULT_SHORTCUT_CONFIG = {
|
|
16
|
+
preventDefault: true,
|
|
17
|
+
element: undefined,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const WINDOWS_BROWSER_SHORCUTS = [
|
|
21
|
+
['ctrl', 'n'],
|
|
22
|
+
['ctrl', 'shift', 'n'],
|
|
23
|
+
['ctrl', 't'],
|
|
24
|
+
['ctrl', 'shift', 't'],
|
|
25
|
+
['ctrl', 'tab'],
|
|
26
|
+
['ctrl', 'pagedown'],
|
|
27
|
+
['ctrl', 'shift', 'tab'],
|
|
28
|
+
['ctrl', 'pageup'],
|
|
29
|
+
...[...Array(9).keys()].map(num => ['ctrl', String(num + 1)]), // ctrl + 1-9
|
|
30
|
+
['alt', 'home'],
|
|
31
|
+
['alt', 'left'],
|
|
32
|
+
['alt', 'right'],
|
|
33
|
+
['ctrl', 'w'],
|
|
34
|
+
['ctrl', 'f4'],
|
|
35
|
+
['ctrl', 'shift', 'w'],
|
|
36
|
+
['alt', 'f4'],
|
|
37
|
+
['alt', 'space', 'n'],
|
|
38
|
+
['alt', 'space', 'x'],
|
|
39
|
+
['alt', 'f', 'x'],
|
|
40
|
+
['ctrl', 'shift', 'pageup'],
|
|
41
|
+
['ctrl', 'shift', 'pagedown'],
|
|
42
|
+
['alt', 'f'],
|
|
43
|
+
['alt', 'e'],
|
|
44
|
+
['ctrl', 'shift', 'b'],
|
|
45
|
+
['ctrl', 'shift', 'o'],
|
|
46
|
+
['ctrl', 'h'],
|
|
47
|
+
['ctrl', 'j'],
|
|
48
|
+
['shift', 'esc'],
|
|
49
|
+
['shift', 'alt', 't'],
|
|
50
|
+
['f10'],
|
|
51
|
+
['f6'],
|
|
52
|
+
['ctrl', 'f'],
|
|
53
|
+
['f3'],
|
|
54
|
+
['ctrl', 'g'],
|
|
55
|
+
['ctrl', 'shift', 'g'],
|
|
56
|
+
['ctrl', 'shift', 'j'],
|
|
57
|
+
['f12'],
|
|
58
|
+
['ctrl', 'shift', 'del'],
|
|
59
|
+
['f1'],
|
|
60
|
+
['ctrl', 'shift', 'm'],
|
|
61
|
+
['alt', 'shift', 'i'],
|
|
62
|
+
['f7'],
|
|
63
|
+
['ctrl', 'f6'],
|
|
64
|
+
['alt', 'shift', 'a'],
|
|
65
|
+
['ctrl', 'l'],
|
|
66
|
+
['alt', 'd'],
|
|
67
|
+
['f6'],
|
|
68
|
+
['ctrl', 'k'],
|
|
69
|
+
['ctrl', 'e'],
|
|
70
|
+
['ctrl', 'p'],
|
|
71
|
+
['ctrl', 's'],
|
|
72
|
+
['f5'],
|
|
73
|
+
['ctrl', 'r'],
|
|
74
|
+
['shift', 'f5'],
|
|
75
|
+
['ctrl', 'shift', 'r'],
|
|
76
|
+
['esc'],
|
|
77
|
+
['tab'],
|
|
78
|
+
['shift', 'tab'],
|
|
79
|
+
['ctrl', 'o'],
|
|
80
|
+
['ctrl', 'u'],
|
|
81
|
+
['ctrl', 'd'],
|
|
82
|
+
['ctrl', 'shift', 'd'],
|
|
83
|
+
['f11'],
|
|
84
|
+
['ctrl', '+'],
|
|
85
|
+
['ctrl', '-'],
|
|
86
|
+
['ctrl', '0'],
|
|
87
|
+
['space'],
|
|
88
|
+
['pagedown'],
|
|
89
|
+
['shift', 'space'],
|
|
90
|
+
['pageup'],
|
|
91
|
+
['home'],
|
|
92
|
+
['end'],
|
|
93
|
+
['ctrl', 'left'],
|
|
94
|
+
['ctrl', 'right'],
|
|
95
|
+
['ctrl', 'backspace'],
|
|
96
|
+
['alt', 'home'],
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
// https://support.google.com/chrome/answer/157179
|
|
100
|
+
function sortAndBuildShortcut(shortcut) {
|
|
101
|
+
const cpy = [...shortcut];
|
|
102
|
+
cpy.sort();
|
|
103
|
+
return shortcut.join(SHORTCUT_SPLIT_KEY);
|
|
104
|
+
}
|
|
105
|
+
function buildShortcutSet(shortcuts) {
|
|
106
|
+
const set = new Set();
|
|
107
|
+
shortcuts.forEach((s) => set.add(sortAndBuildShortcut(s)));
|
|
108
|
+
return set;
|
|
109
|
+
}
|
|
110
|
+
const BROWSER_SHORTCUT_SET = buildShortcutSet(WINDOWS_BROWSER_SHORCUTS);
|
|
111
|
+
function isBrowserShortcut(keys) {
|
|
112
|
+
const sorted = sortAndBuildShortcut(keys);
|
|
113
|
+
return BROWSER_SHORTCUT_SET.has(sorted);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
class RdtShortcut {
|
|
117
|
+
hotkeysValue;
|
|
118
|
+
keys;
|
|
119
|
+
label;
|
|
120
|
+
get lastKey() {
|
|
121
|
+
return this.keys[this.keys.length - 1];
|
|
122
|
+
}
|
|
123
|
+
constructor(keys) {
|
|
124
|
+
this.keys = keys;
|
|
125
|
+
this.hotkeysValue = RdtShortcut.joinKeys(keys);
|
|
126
|
+
this.label = RdtShortcut.makeLabel(keys);
|
|
127
|
+
}
|
|
128
|
+
static joinKeys(keys) {
|
|
129
|
+
return keys.join(SHORTCUT_SPLIT_KEY);
|
|
130
|
+
}
|
|
131
|
+
static makeLabel(keys) {
|
|
132
|
+
return keys.map(RdtStringUtils.capitalize).join('+');
|
|
133
|
+
}
|
|
134
|
+
static create(...keys) {
|
|
135
|
+
if (isBrowserShortcut(keys)) {
|
|
136
|
+
throw new Error(`Shortcut ${RdtShortcut.joinKeys(keys)} is a browser shortcut!`);
|
|
137
|
+
}
|
|
138
|
+
return new RdtShortcut(keys);
|
|
139
|
+
}
|
|
140
|
+
static createUnsafe(...keys) {
|
|
141
|
+
return new RdtShortcut(keys);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
class RdtShortcutService {
|
|
146
|
+
bound = new Map();
|
|
147
|
+
subject$ = new Subject();
|
|
148
|
+
observable$ = this.subject$.asObservable();
|
|
149
|
+
constructor() {
|
|
150
|
+
// Enables hotkeys on input elements
|
|
151
|
+
// Enables hotkeys on input elements
|
|
152
|
+
hotkeys.filter = function (event) {
|
|
153
|
+
if (IGNORED_KEYCODES.includes(event.code)) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
const tagName = event.target.tagName;
|
|
157
|
+
const isInputEl = /^(INPUT|TEXTAREA|SELECT)$/.test(tagName);
|
|
158
|
+
const scope = isInputEl
|
|
159
|
+
? ShortcutSrcElement.INPUT
|
|
160
|
+
: ShortcutSrcElement.OTHER;
|
|
161
|
+
hotkeys.setScope(scope);
|
|
162
|
+
return true;
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
listen(shortcut, config) {
|
|
166
|
+
const patchedConfig = {
|
|
167
|
+
...DEFAULT_SHORTCUT_CONFIG,
|
|
168
|
+
...config,
|
|
169
|
+
};
|
|
170
|
+
if (Array.isArray(shortcut)) {
|
|
171
|
+
return this.listenArray(shortcut, patchedConfig);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
return this.listenSingle(shortcut, patchedConfig);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
listenArray(shortcuts, config) {
|
|
178
|
+
return new Observable((subscriber) => {
|
|
179
|
+
const set = new Set(shortcuts);
|
|
180
|
+
try {
|
|
181
|
+
shortcuts.forEach((s) => this.bind(s, config));
|
|
182
|
+
}
|
|
183
|
+
catch (ex) {
|
|
184
|
+
subscriber.error(ex);
|
|
185
|
+
}
|
|
186
|
+
const sub = this.observable$
|
|
187
|
+
.pipe(filter((evt) => set.has(evt.shortcut)))
|
|
188
|
+
.subscribe(subscriber);
|
|
189
|
+
return () => {
|
|
190
|
+
sub.unsubscribe();
|
|
191
|
+
shortcuts.forEach((s) => this.unbind(s, config));
|
|
192
|
+
};
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
listenSingle(shortcut, config) {
|
|
196
|
+
return new Observable((subscriber) => {
|
|
197
|
+
try {
|
|
198
|
+
this.bind(shortcut, config);
|
|
199
|
+
}
|
|
200
|
+
catch (ex) {
|
|
201
|
+
subscriber.error(ex);
|
|
202
|
+
}
|
|
203
|
+
const sub = this.observable$
|
|
204
|
+
.pipe(filter((evt) => evt.shortcut === shortcut))
|
|
205
|
+
.subscribe(subscriber);
|
|
206
|
+
return () => {
|
|
207
|
+
sub.unsubscribe();
|
|
208
|
+
this.unbind(shortcut, config);
|
|
209
|
+
};
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
bind(shortcut, config) {
|
|
213
|
+
const options = {
|
|
214
|
+
element: config.element,
|
|
215
|
+
splitKey: SHORTCUT_SPLIT_KEY,
|
|
216
|
+
};
|
|
217
|
+
if (this.bound.get(config.element)?.[shortcut.hotkeysValue]) {
|
|
218
|
+
throw new Error(`Shortcut ${shortcut} is already binded!`);
|
|
219
|
+
}
|
|
220
|
+
if (!this.bound.has(config.element)) {
|
|
221
|
+
const newObj = {
|
|
222
|
+
[shortcut.hotkeysValue]: shortcut,
|
|
223
|
+
};
|
|
224
|
+
this.bound.set(config.element, newObj);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
this.bound.get(config.element)[shortcut.hotkeysValue] = shortcut;
|
|
228
|
+
}
|
|
229
|
+
hotkeys(shortcut.hotkeysValue, options, this.keyHandlerFactory(config));
|
|
230
|
+
}
|
|
231
|
+
unbind(shortcut, config) {
|
|
232
|
+
const obj = this.bound.get(config.element);
|
|
233
|
+
if (obj?.[shortcut.hotkeysValue]) {
|
|
234
|
+
obj[shortcut.hotkeysValue] = undefined;
|
|
235
|
+
if (Object.keys(obj).every((key) => obj[key] === undefined)) {
|
|
236
|
+
this.bound.delete(config.element);
|
|
237
|
+
}
|
|
238
|
+
hotkeys.unbind(shortcut.hotkeysValue);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
keyHandlerFactory(config) {
|
|
242
|
+
return (keyboardEvent, hotkeysEvent) => {
|
|
243
|
+
if (config.preventDefault) {
|
|
244
|
+
keyboardEvent.preventDefault();
|
|
245
|
+
}
|
|
246
|
+
const evt = {
|
|
247
|
+
shortcut: this.bound.get(config.element)[hotkeysEvent.shortcut],
|
|
248
|
+
src: hotkeysEvent.scope,
|
|
249
|
+
originalEvent: keyboardEvent,
|
|
250
|
+
};
|
|
251
|
+
this.subject$.next(evt);
|
|
252
|
+
return !config.preventDefault;
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtShortcutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
256
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtShortcutService, providedIn: 'root' });
|
|
257
|
+
}
|
|
258
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtShortcutService, decorators: [{
|
|
259
|
+
type: Injectable,
|
|
260
|
+
args: [{
|
|
261
|
+
providedIn: 'root',
|
|
262
|
+
}]
|
|
263
|
+
}], ctorParameters: () => [] });
|
|
264
|
+
|
|
265
|
+
// Outputs keydown event if only one key was pressed at once
|
|
266
|
+
class RdtKeyListenerDirective {
|
|
267
|
+
keysPressed = new Set();
|
|
268
|
+
pressedAtOnce = new Set();
|
|
269
|
+
output = new EventEmitter();
|
|
270
|
+
onKeyDown(event) {
|
|
271
|
+
if (!this.pressedAtOnce.has(event.key)) {
|
|
272
|
+
this.keysPressed.add(event.key);
|
|
273
|
+
this.pressedAtOnce.add(event.key);
|
|
274
|
+
if (this.pressedAtOnce.size === 1) {
|
|
275
|
+
this.output.emit(event);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
onKeyUp(event) {
|
|
280
|
+
this.keysPressed.delete(event.key);
|
|
281
|
+
this.pressedAtOnce.delete(event.key);
|
|
282
|
+
if (this.keysPressed.size === 0) {
|
|
283
|
+
this.pressedAtOnce.clear();
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
onWindowFocus() {
|
|
287
|
+
this.pressedAtOnce.clear();
|
|
288
|
+
this.keysPressed.clear();
|
|
289
|
+
}
|
|
290
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtKeyListenerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
291
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: RdtKeyListenerDirective, isStandalone: true, selector: "[rdtKeyListener]", outputs: { output: "rdtKeyListener" }, host: { listeners: { "keydown": "onKeyDown($event)", "window:keyup": "onKeyUp($event)", "keyup": "onKeyUp($event)", "window:focus": "onWindowFocus()" } }, ngImport: i0 });
|
|
292
|
+
}
|
|
293
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtKeyListenerDirective, decorators: [{
|
|
294
|
+
type: Directive,
|
|
295
|
+
args: [{
|
|
296
|
+
selector: '[rdtKeyListener]',
|
|
297
|
+
standalone: true,
|
|
298
|
+
}]
|
|
299
|
+
}], propDecorators: { output: [{
|
|
300
|
+
type: Output,
|
|
301
|
+
args: ['rdtKeyListener']
|
|
302
|
+
}], onKeyDown: [{
|
|
303
|
+
type: HostListener,
|
|
304
|
+
args: ['keydown', ['$event']]
|
|
305
|
+
}], onKeyUp: [{
|
|
306
|
+
type: HostListener,
|
|
307
|
+
args: ['window:keyup', ['$event']]
|
|
308
|
+
}, {
|
|
309
|
+
type: HostListener,
|
|
310
|
+
args: ['keyup', ['$event']]
|
|
311
|
+
}], onWindowFocus: [{
|
|
312
|
+
type: HostListener,
|
|
313
|
+
args: ['window:focus']
|
|
314
|
+
}] } });
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Generated bundle index. Do not edit.
|
|
318
|
+
*/
|
|
319
|
+
|
|
320
|
+
export { DEFAULT_SHORTCUT_CONFIG, IGNORED_KEYCODES, RdtKeyListenerDirective, RdtShortcut, RdtShortcutService, SHORTCUT_SPLIT_KEY, ShortcutSrcElement };
|
|
321
|
+
//# sourceMappingURL=ngrdt-shortcuts.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngrdt-shortcuts.mjs","sources":["../../../../@ngrdt/shortcuts/src/lib/shortcuts/rdt-shortcut.models.ts","../../../../@ngrdt/shortcuts/src/lib/shortcuts/windows-browser-shortcuts.ts","../../../../@ngrdt/shortcuts/src/lib/shortcuts/utils.ts","../../../../@ngrdt/shortcuts/src/lib/shortcuts/rdt-shortcut.ts","../../../../@ngrdt/shortcuts/src/lib/shortcuts/providers/rdt-shortcut.service.ts","../../../../@ngrdt/shortcuts/src/lib/shortcuts/directives/rdt-key-listener.directive.ts","../../../../@ngrdt/shortcuts/src/ngrdt-shortcuts.ts"],"sourcesContent":["import { RdtShortcut } from './rdt-shortcut';\r\n\r\nexport const SHORTCUT_SPLIT_KEY = ':';\r\n\r\n// Fn key on Thinkpad is emitted as event.code === 'WakeUp' so F1-12 shortcuts won't work\r\nexport const IGNORED_KEYCODES = ['WakeUp'];\r\n\r\nexport enum ShortcutSrcElement {\r\n INPUT = 'input',\r\n OTHER = 'other',\r\n}\r\n\r\nexport interface RdtShortcutEvent {\r\n shortcut: RdtShortcut;\r\n src: ShortcutSrcElement;\r\n originalEvent: KeyboardEvent;\r\n}\r\n\r\nexport interface RdtShortcutConfig {\r\n preventDefault?: boolean;\r\n element?: HTMLElement | undefined;\r\n}\r\n\r\nexport const DEFAULT_SHORTCUT_CONFIG: RdtShortcutConfig = {\r\n preventDefault: true,\r\n element: undefined,\r\n};\r\n","export const WINDOWS_BROWSER_SHORCUTS = [\r\n ['ctrl', 'n'],\r\n ['ctrl', 'shift', 'n'],\r\n ['ctrl', 't'],\r\n ['ctrl', 'shift', 't'],\r\n ['ctrl', 'tab'],\r\n ['ctrl', 'pagedown'],\r\n ['ctrl', 'shift', 'tab'],\r\n ['ctrl', 'pageup'],\r\n ...[...Array(9).keys()].map(num => ['ctrl', String(num + 1)]), // ctrl + 1-9\r\n ['alt', 'home'],\r\n ['alt', 'left'],\r\n ['alt', 'right'],\r\n ['ctrl', 'w'],\r\n ['ctrl', 'f4'],\r\n ['ctrl', 'shift', 'w'],\r\n ['alt', 'f4'],\r\n ['alt', 'space', 'n'],\r\n ['alt', 'space', 'x'],\r\n ['alt', 'f', 'x'],\r\n ['ctrl', 'shift', 'pageup'],\r\n ['ctrl', 'shift', 'pagedown'],\r\n ['alt', 'f'],\r\n ['alt', 'e'],\r\n ['ctrl', 'shift', 'b'],\r\n ['ctrl', 'shift', 'o'],\r\n ['ctrl', 'h'],\r\n ['ctrl', 'j'],\r\n ['shift', 'esc'],\r\n ['shift', 'alt', 't'],\r\n ['f10'],\r\n ['f6'],\r\n ['ctrl', 'f'],\r\n ['f3'],\r\n ['ctrl', 'g'],\r\n ['ctrl', 'shift', 'g'],\r\n ['ctrl', 'shift', 'j'],\r\n ['f12'],\r\n ['ctrl', 'shift', 'del'],\r\n ['f1'],\r\n ['ctrl', 'shift', 'm'],\r\n ['alt', 'shift', 'i'],\r\n ['f7'],\r\n ['ctrl', 'f6'],\r\n ['alt', 'shift', 'a'],\r\n ['ctrl', 'l'],\r\n ['alt', 'd'],\r\n ['f6'],\r\n ['ctrl', 'k'],\r\n ['ctrl', 'e'],\r\n ['ctrl', 'p'],\r\n ['ctrl', 's'],\r\n ['f5'],\r\n ['ctrl', 'r'],\r\n ['shift', 'f5'],\r\n ['ctrl', 'shift', 'r'],\r\n ['esc'],\r\n ['tab'],\r\n ['shift', 'tab'],\r\n ['ctrl', 'o'],\r\n ['ctrl', 'u'],\r\n ['ctrl', 'd'],\r\n ['ctrl', 'shift', 'd'],\r\n ['f11'],\r\n ['ctrl', '+'],\r\n ['ctrl', '-'],\r\n ['ctrl', '0'],\r\n ['space'],\r\n ['pagedown'],\r\n ['shift', 'space'],\r\n ['pageup'],\r\n ['home'],\r\n ['end'],\r\n ['ctrl', 'left'],\r\n ['ctrl', 'right'],\r\n ['ctrl', 'backspace'],\r\n ['alt', 'home'],\r\n];\r\n","// https://support.google.com/chrome/answer/157179\r\nimport { SHORTCUT_SPLIT_KEY } from './rdt-shortcut.models';\r\nimport { WINDOWS_BROWSER_SHORCUTS } from './windows-browser-shortcuts';\r\n\r\nfunction sortAndBuildShortcut(shortcut: string[]) {\r\n const cpy = [...shortcut];\r\n cpy.sort();\r\n return shortcut.join(SHORTCUT_SPLIT_KEY);\r\n}\r\n\r\nfunction buildShortcutSet(shortcuts: string[][]) {\r\n const set = new Set<string>();\r\n shortcuts.forEach((s) => set.add(sortAndBuildShortcut(s)));\r\n return set;\r\n}\r\n\r\nconst BROWSER_SHORTCUT_SET = buildShortcutSet(WINDOWS_BROWSER_SHORCUTS);\r\n\r\nexport function isBrowserShortcut(keys: string[]) {\r\n const sorted = sortAndBuildShortcut(keys);\r\n return BROWSER_SHORTCUT_SET.has(sorted);\r\n}\r\n","import { isBrowserShortcut } from './utils';\r\nimport { SHORTCUT_SPLIT_KEY } from './rdt-shortcut.models';\r\nimport { RdtStringUtils } from '@ngrdt/utils';\r\n\r\nexport class RdtShortcut {\r\n readonly hotkeysValue: string;\r\n readonly keys: string[];\r\n readonly label: string;\r\n\r\n get lastKey() {\r\n return this.keys[this.keys.length - 1];\r\n }\r\n\r\n private constructor(keys: string[]) {\r\n this.keys = keys;\r\n this.hotkeysValue = RdtShortcut.joinKeys(keys);\r\n this.label = RdtShortcut.makeLabel(keys);\r\n }\r\n\r\n private static joinKeys(keys: string[]) {\r\n return keys.join(SHORTCUT_SPLIT_KEY);\r\n }\r\n\r\n private static makeLabel(keys: string[]) {\r\n return keys.map(RdtStringUtils.capitalize).join('+');\r\n }\r\n\r\n static create(...keys: string[]) {\r\n if (isBrowserShortcut(keys)) {\r\n throw new Error(\r\n `Shortcut ${RdtShortcut.joinKeys(keys)} is a browser shortcut!`\r\n );\r\n }\r\n return new RdtShortcut(keys);\r\n }\r\n\r\n static createUnsafe(...keys: string[]) {\r\n return new RdtShortcut(keys);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport hotkeys, { HotkeysEvent, KeyHandler } from 'hotkeys-js';\r\nimport { filter, Observable, Subject } from 'rxjs';\r\nimport { RdtShortcut } from '../rdt-shortcut';\r\nimport {\r\n DEFAULT_SHORTCUT_CONFIG,\r\n RdtShortcutConfig,\r\n IGNORED_KEYCODES,\r\n SHORTCUT_SPLIT_KEY,\r\n RdtShortcutEvent,\r\n ShortcutSrcElement,\r\n} from '../rdt-shortcut.models';\r\n\r\ninterface HotkeysOptions {\r\n scope?: string;\r\n element?: HTMLElement | null;\r\n keyup?: boolean | null;\r\n keydown?: boolean | null;\r\n capture?: boolean;\r\n splitKey?: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RdtShortcutService {\r\n private bound: Map<HTMLElement | undefined, Record<string, RdtShortcut>> =\r\n new Map();\r\n private subject$ = new Subject<RdtShortcutEvent>();\r\n private observable$ = this.subject$.asObservable();\r\n\r\n constructor() {\r\n // Enables hotkeys on input elements\r\n // Enables hotkeys on input elements\r\n hotkeys.filter = function (event: KeyboardEvent) {\r\n if (IGNORED_KEYCODES.includes(event.code)) {\r\n return false;\r\n }\r\n const tagName = (event.target as HTMLElement).tagName;\r\n const isInputEl = /^(INPUT|TEXTAREA|SELECT)$/.test(tagName);\r\n const scope = isInputEl\r\n ? ShortcutSrcElement.INPUT\r\n : ShortcutSrcElement.OTHER;\r\n hotkeys.setScope(scope);\r\n return true;\r\n };\r\n }\r\n\r\n listen(shortcut: RdtShortcut | RdtShortcut[], config?: RdtShortcutConfig) {\r\n const patchedConfig = {\r\n ...DEFAULT_SHORTCUT_CONFIG,\r\n ...config,\r\n } as Required<RdtShortcutConfig>;\r\n if (Array.isArray(shortcut)) {\r\n return this.listenArray(shortcut, patchedConfig);\r\n } else {\r\n return this.listenSingle(shortcut, patchedConfig);\r\n }\r\n }\r\n\r\n private listenArray(\r\n shortcuts: RdtShortcut[],\r\n config: Required<RdtShortcutConfig>\r\n ) {\r\n return new Observable<RdtShortcutEvent>((subscriber) => {\r\n const set = new Set(shortcuts);\r\n\r\n try {\r\n shortcuts.forEach((s) => this.bind(s, config));\r\n } catch (ex) {\r\n subscriber.error(ex);\r\n }\r\n\r\n const sub = this.observable$\r\n .pipe(filter((evt) => set.has(evt.shortcut)))\r\n .subscribe(subscriber);\r\n\r\n return () => {\r\n sub.unsubscribe();\r\n shortcuts.forEach((s) => this.unbind(s, config));\r\n };\r\n });\r\n }\r\n\r\n private listenSingle(\r\n shortcut: RdtShortcut,\r\n config: Required<RdtShortcutConfig>\r\n ) {\r\n return new Observable<RdtShortcutEvent>((subscriber) => {\r\n try {\r\n this.bind(shortcut, config);\r\n } catch (ex) {\r\n subscriber.error(ex);\r\n }\r\n\r\n const sub = this.observable$\r\n .pipe(filter((evt) => evt.shortcut === shortcut))\r\n .subscribe(subscriber);\r\n\r\n return () => {\r\n sub.unsubscribe();\r\n this.unbind(shortcut, config);\r\n };\r\n });\r\n }\r\n\r\n private bind(shortcut: RdtShortcut, config: Required<RdtShortcutConfig>) {\r\n const options: HotkeysOptions = {\r\n element: config.element,\r\n splitKey: SHORTCUT_SPLIT_KEY,\r\n };\r\n\r\n if (this.bound.get(config.element)?.[shortcut.hotkeysValue]) {\r\n throw new Error(`Shortcut ${shortcut} is already binded!`);\r\n }\r\n if (!this.bound.has(config.element)) {\r\n const newObj = {\r\n [shortcut.hotkeysValue]: shortcut,\r\n };\r\n this.bound.set(config.element, newObj);\r\n } else {\r\n this.bound.get(config.element)![shortcut.hotkeysValue] = shortcut;\r\n }\r\n\r\n hotkeys(shortcut.hotkeysValue, options, this.keyHandlerFactory(config));\r\n }\r\n\r\n private unbind(shortcut: RdtShortcut, config: RdtShortcutConfig) {\r\n const obj = this.bound.get(config.element);\r\n if (obj?.[shortcut.hotkeysValue]) {\r\n obj[shortcut.hotkeysValue] = undefined as unknown as RdtShortcut;\r\n if (Object.keys(obj).every((key) => obj[key] === undefined)) {\r\n this.bound.delete(config.element);\r\n }\r\n hotkeys.unbind(shortcut.hotkeysValue);\r\n }\r\n }\r\n\r\n private keyHandlerFactory(config: Required<RdtShortcutConfig>): KeyHandler {\r\n return (keyboardEvent: KeyboardEvent, hotkeysEvent: HotkeysEvent) => {\r\n if (config.preventDefault) {\r\n keyboardEvent.preventDefault();\r\n }\r\n const evt: RdtShortcutEvent = {\r\n shortcut: this.bound.get(config.element)![hotkeysEvent.shortcut],\r\n src: hotkeysEvent.scope as ShortcutSrcElement,\r\n originalEvent: keyboardEvent,\r\n };\r\n this.subject$.next(evt);\r\n return !config.preventDefault;\r\n };\r\n }\r\n}\r\n","import { Directive, EventEmitter, HostListener, Output } from '@angular/core';\r\n\r\n// Outputs keydown event if only one key was pressed at once\r\n@Directive({\r\n selector: '[rdtKeyListener]',\r\n standalone: true,\r\n})\r\nexport class RdtKeyListenerDirective {\r\n private keysPressed = new Set<string>();\r\n private pressedAtOnce = new Set<string>();\r\n\r\n @Output('rdtKeyListener')\r\n output = new EventEmitter<KeyboardEvent>();\r\n\r\n @HostListener('keydown', ['$event'])\r\n private onKeyDown(event: KeyboardEvent) {\r\n if (!this.pressedAtOnce.has(event.key)) {\r\n this.keysPressed.add(event.key);\r\n this.pressedAtOnce.add(event.key);\r\n\r\n if (this.pressedAtOnce.size === 1) {\r\n this.output.emit(event);\r\n }\r\n }\r\n }\r\n\r\n @HostListener('window:keyup', ['$event'])\r\n @HostListener('keyup', ['$event'])\r\n private onKeyUp(event: KeyboardEvent) {\r\n this.keysPressed.delete(event.key);\r\n this.pressedAtOnce.delete(event.key);\r\n if (this.keysPressed.size === 0) {\r\n this.pressedAtOnce.clear();\r\n }\r\n }\r\n\r\n @HostListener('window:focus')\r\n private onWindowFocus() {\r\n this.pressedAtOnce.clear();\r\n this.keysPressed.clear();\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class RdtKeyListenerDirective {
|
|
4
|
+
private keysPressed;
|
|
5
|
+
private pressedAtOnce;
|
|
6
|
+
output: EventEmitter<KeyboardEvent>;
|
|
7
|
+
private onKeyDown;
|
|
8
|
+
private onKeyUp;
|
|
9
|
+
private onWindowFocus;
|
|
10
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RdtKeyListenerDirective, never>;
|
|
11
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<RdtKeyListenerDirective, "[rdtKeyListener]", never, {}, { "output": "rdtKeyListener"; }, never, never, true, never>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { RdtShortcut } from '../rdt-shortcut';
|
|
3
|
+
import { RdtShortcutConfig, RdtShortcutEvent } from '../rdt-shortcut.models';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class RdtShortcutService {
|
|
6
|
+
private bound;
|
|
7
|
+
private subject$;
|
|
8
|
+
private observable$;
|
|
9
|
+
constructor();
|
|
10
|
+
listen(shortcut: RdtShortcut | RdtShortcut[], config?: RdtShortcutConfig): Observable<RdtShortcutEvent>;
|
|
11
|
+
private listenArray;
|
|
12
|
+
private listenSingle;
|
|
13
|
+
private bind;
|
|
14
|
+
private unbind;
|
|
15
|
+
private keyHandlerFactory;
|
|
16
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RdtShortcutService, never>;
|
|
17
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<RdtShortcutService>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class RdtShortcut {
|
|
2
|
+
readonly hotkeysValue: string;
|
|
3
|
+
readonly keys: string[];
|
|
4
|
+
readonly label: string;
|
|
5
|
+
get lastKey(): string;
|
|
6
|
+
private constructor();
|
|
7
|
+
private static joinKeys;
|
|
8
|
+
private static makeLabel;
|
|
9
|
+
static create(...keys: string[]): RdtShortcut;
|
|
10
|
+
static createUnsafe(...keys: string[]): RdtShortcut;
|
|
11
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { RdtShortcut } from './rdt-shortcut';
|
|
2
|
+
export declare const SHORTCUT_SPLIT_KEY = ":";
|
|
3
|
+
export declare const IGNORED_KEYCODES: string[];
|
|
4
|
+
export declare enum ShortcutSrcElement {
|
|
5
|
+
INPUT = "input",
|
|
6
|
+
OTHER = "other"
|
|
7
|
+
}
|
|
8
|
+
export interface RdtShortcutEvent {
|
|
9
|
+
shortcut: RdtShortcut;
|
|
10
|
+
src: ShortcutSrcElement;
|
|
11
|
+
originalEvent: KeyboardEvent;
|
|
12
|
+
}
|
|
13
|
+
export interface RdtShortcutConfig {
|
|
14
|
+
preventDefault?: boolean;
|
|
15
|
+
element?: HTMLElement | undefined;
|
|
16
|
+
}
|
|
17
|
+
export declare const DEFAULT_SHORTCUT_CONFIG: RdtShortcutConfig;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isBrowserShortcut(keys: string[]): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const WINDOWS_BROWSER_SHORCUTS: string[][];
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ngrdt/shortcuts",
|
|
3
|
+
"version": "0.0.6",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^18.2.0",
|
|
6
|
+
"@angular/core": "^18.2.0",
|
|
7
|
+
"hotkeys-js": ">=3.10.0",
|
|
8
|
+
"@ngrdt/utils": ">=0.0.4",
|
|
9
|
+
"rxjs": ">=7.0.0"
|
|
10
|
+
},
|
|
11
|
+
"sideEffects": false,
|
|
12
|
+
"module": "fesm2022/ngrdt-shortcuts.mjs",
|
|
13
|
+
"typings": "index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
"./package.json": {
|
|
16
|
+
"default": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./index.d.ts",
|
|
20
|
+
"esm2022": "./esm2022/ngrdt-shortcuts.mjs",
|
|
21
|
+
"esm": "./esm2022/ngrdt-shortcuts.mjs",
|
|
22
|
+
"default": "./fesm2022/ngrdt-shortcuts.mjs"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"tslib": "^2.3.0"
|
|
27
|
+
}
|
|
28
|
+
}
|