@tethys/cdk 14.2.0-next.7 → 14.2.1
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/esm2020/hotkey/hotkey-dispatcher.mjs +8 -26
- package/fesm2015/tethys-cdk-hotkey.mjs +8 -25
- package/fesm2015/tethys-cdk-hotkey.mjs.map +1 -1
- package/fesm2020/tethys-cdk-hotkey.mjs +7 -25
- package/fesm2020/tethys-cdk-hotkey.mjs.map +1 -1
- package/hotkey/hotkey-dispatcher.d.ts +1 -2
- package/package.json +1 -1
|
@@ -10,7 +10,6 @@ import * as i0 from "@angular/core";
|
|
|
10
10
|
export class ThyHotkeyDispatcher extends ThyEventDispatcher {
|
|
11
11
|
constructor(document, ngZone) {
|
|
12
12
|
super(document, ngZone, 'keydown');
|
|
13
|
-
this.hotkeyRecords = [];
|
|
14
13
|
}
|
|
15
14
|
createKeydownObservable(scope) {
|
|
16
15
|
if (scope === this.document) {
|
|
@@ -20,43 +19,26 @@ export class ThyHotkeyDispatcher extends ThyEventDispatcher {
|
|
|
20
19
|
return fromEvent(scope, 'keydown');
|
|
21
20
|
}
|
|
22
21
|
}
|
|
23
|
-
checkHotkeyConflict(scope, hotkeys) {
|
|
24
|
-
return this.hotkeyRecords.every(record => {
|
|
25
|
-
if (scope === record.scope) {
|
|
26
|
-
return hotkeys.every(hotkey => {
|
|
27
|
-
if (record.hotkeys.includes(hotkey)) {
|
|
28
|
-
throw new Error(`'${hotkey}' hotkey conflict detected`);
|
|
29
|
-
}
|
|
30
|
-
return true;
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
return true;
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
22
|
/**
|
|
39
23
|
* 热键事件订阅
|
|
40
24
|
*/
|
|
41
25
|
keydown(hotkey, scope) {
|
|
42
26
|
const hotkeys = isString(hotkey) ? hotkey.split(',') : hotkey;
|
|
43
27
|
const scopeElement = coerceElement(isUndefinedOrNull(scope) ? this.document : scope);
|
|
44
|
-
if (!this.checkHotkeyConflict(scopeElement, hotkeys)) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
const hotkeyRecord = { scope: scopeElement, hotkeys };
|
|
48
|
-
this.hotkeyRecords.push(hotkeyRecord);
|
|
49
28
|
const keydown = this.createKeydownObservable(scopeElement);
|
|
50
|
-
return new Observable(
|
|
29
|
+
return new Observable(subscriber => {
|
|
51
30
|
const subscription = keydown
|
|
52
31
|
.pipe(filter((event) => hotkeys.some(key => isHotkey(event, key))))
|
|
53
32
|
.subscribe((event) => {
|
|
54
|
-
|
|
55
|
-
|
|
33
|
+
this.keydownSubscriber = subscriber;
|
|
34
|
+
// setTimeout 是为了解决 Hotkey 冲突时仅执行最后订阅的事件
|
|
35
|
+
setTimeout(() => {
|
|
36
|
+
this.keydownSubscriber?.next(event);
|
|
37
|
+
this.keydownSubscriber = null;
|
|
38
|
+
});
|
|
56
39
|
});
|
|
57
40
|
return () => {
|
|
58
41
|
subscription.unsubscribe();
|
|
59
|
-
this.hotkeyRecords = this.hotkeyRecords.filter(record => record !== hotkeyRecord);
|
|
60
42
|
};
|
|
61
43
|
});
|
|
62
44
|
}
|
|
@@ -70,4 +52,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImpor
|
|
|
70
52
|
type: Inject,
|
|
71
53
|
args: [DOCUMENT]
|
|
72
54
|
}] }, { type: i0.NgZone }]; } });
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90a2V5LWRpc3BhdGNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jZGsvaG90a2V5L2hvdGtleS1kaXNwYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7QUFHcEMsTUFBTSxPQUFPLG1CQUFvQixTQUFRLGtCQUFrQjtJQUd2RCxZQUE4QixRQUFhLEVBQUUsTUFBYztRQUN2RCxLQUFLLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sdUJBQXVCLENBQUMsS0FBeUI7UUFDckQsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUN6QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0I7YUFBTTtZQUNILE9BQU8sU0FBUyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU8sQ0FBQyxNQUF5QixFQUFFLEtBQWdEO1FBQy9FLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzlELE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzNELE9BQU8sSUFBSSxVQUFVLENBQWdCLFVBQVUsQ0FBQyxFQUFFO1lBQzlDLE1BQU0sWUFBWSxHQUFHLE9BQU87aUJBQ3ZCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFvQixFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ2pGLFNBQVMsQ0FBQyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQztnQkFDcEMsd0NBQXdDO2dCQUN4QyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNaLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7Z0JBQ2xDLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxDQUFDLENBQUM7WUFDUCxPQUFPLEdBQUcsRUFBRTtnQkFDUixZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDL0IsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOztnSEFyQ1EsbUJBQW1CLGtCQUdSLFFBQVE7b0hBSG5CLG1CQUFtQixjQUROLE1BQU07MkZBQ25CLG1CQUFtQjtrQkFEL0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQUlqQixNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2VyY2VFbGVtZW50IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaHlFdmVudERpc3BhdGNoZXIgfSBmcm9tICdAdGV0aHlzL2Nkay9ldmVudCc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YnNjcmliZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGlzU3RyaW5nLCBpc1VuZGVmaW5lZE9yTnVsbCB9IGZyb20gJ0B0ZXRoeXMvY2RrL2lzJztcbmltcG9ydCB7IGlzSG90a2V5IH0gZnJvbSAnLi9ob3RrZXknO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFRoeUhvdGtleURpc3BhdGNoZXIgZXh0ZW5kcyBUaHlFdmVudERpc3BhdGNoZXIge1xuICAgIHByaXZhdGUga2V5ZG93blN1YnNjcmliZXI6IFN1YnNjcmliZXI8S2V5Ym9hcmRFdmVudD47XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBkb2N1bWVudDogYW55LCBuZ1pvbmU6IE5nWm9uZSkge1xuICAgICAgICBzdXBlcihkb2N1bWVudCwgbmdab25lLCAna2V5ZG93bicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlS2V5ZG93bk9ic2VydmFibGUoc2NvcGU6IEVsZW1lbnQgfCBEb2N1bWVudCkge1xuICAgICAgICBpZiAoc2NvcGUgPT09IHRoaXMuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNjcmliZShudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQoc2NvcGUsICdrZXlkb3duJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAg54Ot6ZSu5LqL5Lu26K6i6ZiFXG4gICAgICovXG4gICAga2V5ZG93bihob3RrZXk6IHN0cmluZyB8IHN0cmluZ1tdLCBzY29wZT86IEVsZW1lbnRSZWY8RWxlbWVudD4gfCBFbGVtZW50IHwgRG9jdW1lbnQpOiBPYnNlcnZhYmxlPEtleWJvYXJkRXZlbnQ+IHtcbiAgICAgICAgY29uc3QgaG90a2V5cyA9IGlzU3RyaW5nKGhvdGtleSkgPyBob3RrZXkuc3BsaXQoJywnKSA6IGhvdGtleTtcbiAgICAgICAgY29uc3Qgc2NvcGVFbGVtZW50ID0gY29lcmNlRWxlbWVudChpc1VuZGVmaW5lZE9yTnVsbChzY29wZSkgPyB0aGlzLmRvY3VtZW50IDogc2NvcGUpO1xuICAgICAgICBjb25zdCBrZXlkb3duID0gdGhpcy5jcmVhdGVLZXlkb3duT2JzZXJ2YWJsZShzY29wZUVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8S2V5Ym9hcmRFdmVudD4oc3Vic2NyaWJlciA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBrZXlkb3duXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gaG90a2V5cy5zb21lKGtleSA9PiBpc0hvdGtleShldmVudCwga2V5KSkpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMua2V5ZG93blN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXRUaW1lb3V0IOaYr+S4uuS6huino+WGsyBIb3RrZXkg5Yay56qB5pe25LuF5omn6KGM5pyA5ZCO6K6i6ZiF55qE5LqL5Lu2XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5rZXlkb3duU3Vic2NyaWJlcj8ubmV4dChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmtleWRvd25TdWJzY3JpYmVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|
|
@@ -33,7 +33,6 @@ function isHotkey(event, key) {
|
|
|
33
33
|
class ThyHotkeyDispatcher extends ThyEventDispatcher {
|
|
34
34
|
constructor(document, ngZone) {
|
|
35
35
|
super(document, ngZone, 'keydown');
|
|
36
|
-
this.hotkeyRecords = [];
|
|
37
36
|
}
|
|
38
37
|
createKeydownObservable(scope) {
|
|
39
38
|
if (scope === this.document) {
|
|
@@ -43,43 +42,27 @@ class ThyHotkeyDispatcher extends ThyEventDispatcher {
|
|
|
43
42
|
return fromEvent(scope, 'keydown');
|
|
44
43
|
}
|
|
45
44
|
}
|
|
46
|
-
checkHotkeyConflict(scope, hotkeys) {
|
|
47
|
-
return this.hotkeyRecords.every(record => {
|
|
48
|
-
if (scope === record.scope) {
|
|
49
|
-
return hotkeys.every(hotkey => {
|
|
50
|
-
if (record.hotkeys.includes(hotkey)) {
|
|
51
|
-
throw new Error(`'${hotkey}' hotkey conflict detected`);
|
|
52
|
-
}
|
|
53
|
-
return true;
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
45
|
/**
|
|
62
46
|
* 热键事件订阅
|
|
63
47
|
*/
|
|
64
48
|
keydown(hotkey, scope) {
|
|
65
49
|
const hotkeys = isString(hotkey) ? hotkey.split(',') : hotkey;
|
|
66
50
|
const scopeElement = coerceElement(isUndefinedOrNull(scope) ? this.document : scope);
|
|
67
|
-
if (!this.checkHotkeyConflict(scopeElement, hotkeys)) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const hotkeyRecord = { scope: scopeElement, hotkeys };
|
|
71
|
-
this.hotkeyRecords.push(hotkeyRecord);
|
|
72
51
|
const keydown = this.createKeydownObservable(scopeElement);
|
|
73
|
-
return new Observable(
|
|
52
|
+
return new Observable(subscriber => {
|
|
74
53
|
const subscription = keydown
|
|
75
54
|
.pipe(filter((event) => hotkeys.some(key => isHotkey(event, key))))
|
|
76
55
|
.subscribe((event) => {
|
|
77
|
-
|
|
78
|
-
|
|
56
|
+
this.keydownSubscriber = subscriber;
|
|
57
|
+
// setTimeout 是为了解决 Hotkey 冲突时仅执行最后订阅的事件
|
|
58
|
+
setTimeout(() => {
|
|
59
|
+
var _a;
|
|
60
|
+
(_a = this.keydownSubscriber) === null || _a === void 0 ? void 0 : _a.next(event);
|
|
61
|
+
this.keydownSubscriber = null;
|
|
62
|
+
});
|
|
79
63
|
});
|
|
80
64
|
return () => {
|
|
81
65
|
subscription.unsubscribe();
|
|
82
|
-
this.hotkeyRecords = this.hotkeyRecords.filter(record => record !== hotkeyRecord);
|
|
83
66
|
};
|
|
84
67
|
});
|
|
85
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tethys-cdk-hotkey.mjs","sources":["../../../cdk/hotkey/hotkey.ts","../../../cdk/hotkey/hotkey-dispatcher.ts","../../../cdk/hotkey/hotkey.directive.ts","../../../cdk/hotkey/module.ts","../../../cdk/hotkey/tethys-cdk-hotkey.ts"],"sourcesContent":["const modifierKeyNames: string[] = [`Control`, 'Alt', 'Meta', 'Shift'];\n\n// We don't want to show `Shift` when `event.key` is capital\nfunction showShift(event: KeyboardEvent): boolean {\n const { shiftKey, code, key } = event;\n return shiftKey && !(code.startsWith('Key') && key.toUpperCase() === key);\n}\n\nexport function hotkey(event: KeyboardEvent): string {\n const { ctrlKey, altKey, metaKey, key } = event;\n const hotkeyString: string[] = [];\n const modifiers: boolean[] = [ctrlKey, altKey, metaKey, showShift(event)];\n for (const [i, mod] of modifiers.entries()) {\n if (mod) hotkeyString.push(modifierKeyNames[i]);\n }\n\n if (!modifierKeyNames.includes(key)) {\n hotkeyString.push(key);\n }\n\n return hotkeyString.join('+');\n}\n\nexport function isHotkey(event: KeyboardEvent, key: string) {\n return key.toUpperCase() === hotkey(event).toUpperCase();\n}\n","import { coerceElement } from '@angular/cdk/coercion';\nimport { DOCUMENT } from '@angular/common';\nimport { Inject, Injectable, NgZone, ElementRef } from '@angular/core';\nimport { ThyEventDispatcher } from '@tethys/cdk/event';\nimport { fromEvent, Observable } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { isString, isUndefinedOrNull } from '@tethys/cdk/is';\nimport { isHotkey } from './hotkey';\n\n@Injectable({ providedIn: 'root' })\nexport class ThyHotkeyDispatcher extends ThyEventDispatcher {\n private hotkeyRecords: { scope: Element | Document; hotkeys: string[] }[] = [];\n\n constructor(@Inject(DOCUMENT) document: any, ngZone: NgZone) {\n super(document, ngZone, 'keydown');\n }\n\n private createKeydownObservable(scope: Element | Document) {\n if (scope === this.document) {\n return this.subscribe(null);\n } else {\n return fromEvent(scope, 'keydown');\n }\n }\n\n private checkHotkeyConflict(scope: Element | Document, hotkeys: string[]) {\n return this.hotkeyRecords.every(record => {\n if (scope === record.scope) {\n return hotkeys.every(hotkey => {\n if (record.hotkeys.includes(hotkey)) {\n throw new Error(`'${hotkey}' hotkey conflict detected`);\n }\n return true;\n });\n } else {\n return true;\n }\n });\n }\n\n /**\n * 热键事件订阅\n */\n keydown(hotkey: string | string[], scope?: ElementRef<Element> | Element | Document): Observable<KeyboardEvent> {\n const hotkeys = isString(hotkey) ? hotkey.split(',') : hotkey;\n const scopeElement = coerceElement(isUndefinedOrNull(scope) ? this.document : scope);\n if (!this.checkHotkeyConflict(scopeElement, hotkeys)) {\n return;\n }\n const hotkeyRecord = { scope: scopeElement, hotkeys };\n this.hotkeyRecords.push(hotkeyRecord);\n const keydown = this.createKeydownObservable(scopeElement);\n return new Observable<KeyboardEvent>(observer => {\n const subscription = keydown\n .pipe(filter((event: KeyboardEvent) => hotkeys.some(key => isHotkey(event, key))))\n .subscribe((event: KeyboardEvent) => {\n event.stopPropagation();\n observer.next(event);\n });\n return () => {\n subscription.unsubscribe();\n this.hotkeyRecords = this.hotkeyRecords.filter(record => record !== hotkeyRecord);\n };\n });\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Directive, ElementRef, EventEmitter, Inject, Input, OnInit, Output, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { isFormElement, isString } from '@tethys/cdk/is';\nimport { ThyHotkeyDispatcher } from './hotkey-dispatcher';\n\n/**\n * @name thyHotkey\n */\n@Directive({ selector: '[thyHotkey]' })\nexport class ThyHotkeyDirective implements OnInit, OnDestroy {\n /**\n * 热键对应 Code,多个热键组合支持通过数组或逗号分割的形式传入\n */\n @Input() thyHotkey: string | string[];\n\n /**\n * 配置热键触发范围,默认绑定在 document 上\n */\n @Input() thyHotkeyScope?: string | Element | ElementRef<Element>;\n\n /**\n * 热键触发后的事件\n */\n @Output() thyHotkeyListener: EventEmitter<KeyboardEvent> = new EventEmitter();\n\n private subscription: Subscription = null;\n\n constructor(\n @Inject(DOCUMENT) private document: Document,\n private hotkeyDispatcher: ThyHotkeyDispatcher,\n private elementRef: ElementRef<HTMLElement>\n ) {}\n\n ngOnInit(): void {\n const scope = isString(this.thyHotkeyScope) ? this.document.querySelector(this.thyHotkeyScope) : this.thyHotkeyScope;\n this.subscription = this.hotkeyDispatcher.keydown(this.thyHotkey, scope).subscribe(event => {\n event.preventDefault();\n if (isFormElement(this.elementRef)) {\n this.elementRef.nativeElement.focus();\n } else {\n this.elementRef.nativeElement.click();\n }\n this.thyHotkeyListener.emit(event);\n });\n }\n\n ngOnDestroy(): void {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { ThyHotkeyDirective } from './hotkey.directive';\n\n@NgModule({\n imports: [],\n exports: [ThyHotkeyDirective],\n declarations: [ThyHotkeyDirective],\n providers: []\n})\nexport class ThyHotkeyModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ThyHotkeyDispatcher"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tethys-cdk-hotkey.mjs","sources":["../../../cdk/hotkey/hotkey.ts","../../../cdk/hotkey/hotkey-dispatcher.ts","../../../cdk/hotkey/hotkey.directive.ts","../../../cdk/hotkey/module.ts","../../../cdk/hotkey/tethys-cdk-hotkey.ts"],"sourcesContent":["const modifierKeyNames: string[] = [`Control`, 'Alt', 'Meta', 'Shift'];\n\n// We don't want to show `Shift` when `event.key` is capital\nfunction showShift(event: KeyboardEvent): boolean {\n const { shiftKey, code, key } = event;\n return shiftKey && !(code.startsWith('Key') && key.toUpperCase() === key);\n}\n\nexport function hotkey(event: KeyboardEvent): string {\n const { ctrlKey, altKey, metaKey, key } = event;\n const hotkeyString: string[] = [];\n const modifiers: boolean[] = [ctrlKey, altKey, metaKey, showShift(event)];\n for (const [i, mod] of modifiers.entries()) {\n if (mod) hotkeyString.push(modifierKeyNames[i]);\n }\n\n if (!modifierKeyNames.includes(key)) {\n hotkeyString.push(key);\n }\n\n return hotkeyString.join('+');\n}\n\nexport function isHotkey(event: KeyboardEvent, key: string) {\n return key.toUpperCase() === hotkey(event).toUpperCase();\n}\n","import { coerceElement } from '@angular/cdk/coercion';\nimport { DOCUMENT } from '@angular/common';\nimport { Inject, Injectable, NgZone, ElementRef } from '@angular/core';\nimport { ThyEventDispatcher } from '@tethys/cdk/event';\nimport { fromEvent, Observable, Subscriber } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { isString, isUndefinedOrNull } from '@tethys/cdk/is';\nimport { isHotkey } from './hotkey';\n\n@Injectable({ providedIn: 'root' })\nexport class ThyHotkeyDispatcher extends ThyEventDispatcher {\n private keydownSubscriber: Subscriber<KeyboardEvent>;\n\n constructor(@Inject(DOCUMENT) document: any, ngZone: NgZone) {\n super(document, ngZone, 'keydown');\n }\n\n private createKeydownObservable(scope: Element | Document) {\n if (scope === this.document) {\n return this.subscribe(null);\n } else {\n return fromEvent(scope, 'keydown');\n }\n }\n\n /**\n * 热键事件订阅\n */\n keydown(hotkey: string | string[], scope?: ElementRef<Element> | Element | Document): Observable<KeyboardEvent> {\n const hotkeys = isString(hotkey) ? hotkey.split(',') : hotkey;\n const scopeElement = coerceElement(isUndefinedOrNull(scope) ? this.document : scope);\n const keydown = this.createKeydownObservable(scopeElement);\n return new Observable<KeyboardEvent>(subscriber => {\n const subscription = keydown\n .pipe(filter((event: KeyboardEvent) => hotkeys.some(key => isHotkey(event, key))))\n .subscribe((event: KeyboardEvent) => {\n this.keydownSubscriber = subscriber;\n // setTimeout 是为了解决 Hotkey 冲突时仅执行最后订阅的事件\n setTimeout(() => {\n this.keydownSubscriber?.next(event);\n this.keydownSubscriber = null;\n });\n });\n return () => {\n subscription.unsubscribe();\n };\n });\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Directive, ElementRef, EventEmitter, Inject, Input, OnInit, Output, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { isFormElement, isString } from '@tethys/cdk/is';\nimport { ThyHotkeyDispatcher } from './hotkey-dispatcher';\n\n/**\n * @name thyHotkey\n */\n@Directive({ selector: '[thyHotkey]' })\nexport class ThyHotkeyDirective implements OnInit, OnDestroy {\n /**\n * 热键对应 Code,多个热键组合支持通过数组或逗号分割的形式传入\n */\n @Input() thyHotkey: string | string[];\n\n /**\n * 配置热键触发范围,默认绑定在 document 上\n */\n @Input() thyHotkeyScope?: string | Element | ElementRef<Element>;\n\n /**\n * 热键触发后的事件\n */\n @Output() thyHotkeyListener: EventEmitter<KeyboardEvent> = new EventEmitter();\n\n private subscription: Subscription = null;\n\n constructor(\n @Inject(DOCUMENT) private document: Document,\n private hotkeyDispatcher: ThyHotkeyDispatcher,\n private elementRef: ElementRef<HTMLElement>\n ) {}\n\n ngOnInit(): void {\n const scope = isString(this.thyHotkeyScope) ? this.document.querySelector(this.thyHotkeyScope) : this.thyHotkeyScope;\n this.subscription = this.hotkeyDispatcher.keydown(this.thyHotkey, scope).subscribe(event => {\n event.preventDefault();\n if (isFormElement(this.elementRef)) {\n this.elementRef.nativeElement.focus();\n } else {\n this.elementRef.nativeElement.click();\n }\n this.thyHotkeyListener.emit(event);\n });\n }\n\n ngOnDestroy(): void {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { ThyHotkeyDirective } from './hotkey.directive';\n\n@NgModule({\n imports: [],\n exports: [ThyHotkeyDirective],\n declarations: [ThyHotkeyDirective],\n providers: []\n})\nexport class ThyHotkeyModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ThyHotkeyDispatcher"],"mappings":"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"}
|
|
@@ -33,7 +33,6 @@ function isHotkey(event, key) {
|
|
|
33
33
|
class ThyHotkeyDispatcher extends ThyEventDispatcher {
|
|
34
34
|
constructor(document, ngZone) {
|
|
35
35
|
super(document, ngZone, 'keydown');
|
|
36
|
-
this.hotkeyRecords = [];
|
|
37
36
|
}
|
|
38
37
|
createKeydownObservable(scope) {
|
|
39
38
|
if (scope === this.document) {
|
|
@@ -43,43 +42,26 @@ class ThyHotkeyDispatcher extends ThyEventDispatcher {
|
|
|
43
42
|
return fromEvent(scope, 'keydown');
|
|
44
43
|
}
|
|
45
44
|
}
|
|
46
|
-
checkHotkeyConflict(scope, hotkeys) {
|
|
47
|
-
return this.hotkeyRecords.every(record => {
|
|
48
|
-
if (scope === record.scope) {
|
|
49
|
-
return hotkeys.every(hotkey => {
|
|
50
|
-
if (record.hotkeys.includes(hotkey)) {
|
|
51
|
-
throw new Error(`'${hotkey}' hotkey conflict detected`);
|
|
52
|
-
}
|
|
53
|
-
return true;
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
return true;
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
45
|
/**
|
|
62
46
|
* 热键事件订阅
|
|
63
47
|
*/
|
|
64
48
|
keydown(hotkey, scope) {
|
|
65
49
|
const hotkeys = isString(hotkey) ? hotkey.split(',') : hotkey;
|
|
66
50
|
const scopeElement = coerceElement(isUndefinedOrNull(scope) ? this.document : scope);
|
|
67
|
-
if (!this.checkHotkeyConflict(scopeElement, hotkeys)) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const hotkeyRecord = { scope: scopeElement, hotkeys };
|
|
71
|
-
this.hotkeyRecords.push(hotkeyRecord);
|
|
72
51
|
const keydown = this.createKeydownObservable(scopeElement);
|
|
73
|
-
return new Observable(
|
|
52
|
+
return new Observable(subscriber => {
|
|
74
53
|
const subscription = keydown
|
|
75
54
|
.pipe(filter((event) => hotkeys.some(key => isHotkey(event, key))))
|
|
76
55
|
.subscribe((event) => {
|
|
77
|
-
|
|
78
|
-
|
|
56
|
+
this.keydownSubscriber = subscriber;
|
|
57
|
+
// setTimeout 是为了解决 Hotkey 冲突时仅执行最后订阅的事件
|
|
58
|
+
setTimeout(() => {
|
|
59
|
+
this.keydownSubscriber?.next(event);
|
|
60
|
+
this.keydownSubscriber = null;
|
|
61
|
+
});
|
|
79
62
|
});
|
|
80
63
|
return () => {
|
|
81
64
|
subscription.unsubscribe();
|
|
82
|
-
this.hotkeyRecords = this.hotkeyRecords.filter(record => record !== hotkeyRecord);
|
|
83
65
|
};
|
|
84
66
|
});
|
|
85
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tethys-cdk-hotkey.mjs","sources":["../../../cdk/hotkey/hotkey.ts","../../../cdk/hotkey/hotkey-dispatcher.ts","../../../cdk/hotkey/hotkey.directive.ts","../../../cdk/hotkey/module.ts","../../../cdk/hotkey/tethys-cdk-hotkey.ts"],"sourcesContent":["const modifierKeyNames: string[] = [`Control`, 'Alt', 'Meta', 'Shift'];\n\n// We don't want to show `Shift` when `event.key` is capital\nfunction showShift(event: KeyboardEvent): boolean {\n const { shiftKey, code, key } = event;\n return shiftKey && !(code.startsWith('Key') && key.toUpperCase() === key);\n}\n\nexport function hotkey(event: KeyboardEvent): string {\n const { ctrlKey, altKey, metaKey, key } = event;\n const hotkeyString: string[] = [];\n const modifiers: boolean[] = [ctrlKey, altKey, metaKey, showShift(event)];\n for (const [i, mod] of modifiers.entries()) {\n if (mod) hotkeyString.push(modifierKeyNames[i]);\n }\n\n if (!modifierKeyNames.includes(key)) {\n hotkeyString.push(key);\n }\n\n return hotkeyString.join('+');\n}\n\nexport function isHotkey(event: KeyboardEvent, key: string) {\n return key.toUpperCase() === hotkey(event).toUpperCase();\n}\n","import { coerceElement } from '@angular/cdk/coercion';\nimport { DOCUMENT } from '@angular/common';\nimport { Inject, Injectable, NgZone, ElementRef } from '@angular/core';\nimport { ThyEventDispatcher } from '@tethys/cdk/event';\nimport { fromEvent, Observable } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { isString, isUndefinedOrNull } from '@tethys/cdk/is';\nimport { isHotkey } from './hotkey';\n\n@Injectable({ providedIn: 'root' })\nexport class ThyHotkeyDispatcher extends ThyEventDispatcher {\n private hotkeyRecords: { scope: Element | Document; hotkeys: string[] }[] = [];\n\n constructor(@Inject(DOCUMENT) document: any, ngZone: NgZone) {\n super(document, ngZone, 'keydown');\n }\n\n private createKeydownObservable(scope: Element | Document) {\n if (scope === this.document) {\n return this.subscribe(null);\n } else {\n return fromEvent(scope, 'keydown');\n }\n }\n\n private checkHotkeyConflict(scope: Element | Document, hotkeys: string[]) {\n return this.hotkeyRecords.every(record => {\n if (scope === record.scope) {\n return hotkeys.every(hotkey => {\n if (record.hotkeys.includes(hotkey)) {\n throw new Error(`'${hotkey}' hotkey conflict detected`);\n }\n return true;\n });\n } else {\n return true;\n }\n });\n }\n\n /**\n * 热键事件订阅\n */\n keydown(hotkey: string | string[], scope?: ElementRef<Element> | Element | Document): Observable<KeyboardEvent> {\n const hotkeys = isString(hotkey) ? hotkey.split(',') : hotkey;\n const scopeElement = coerceElement(isUndefinedOrNull(scope) ? this.document : scope);\n if (!this.checkHotkeyConflict(scopeElement, hotkeys)) {\n return;\n }\n const hotkeyRecord = { scope: scopeElement, hotkeys };\n this.hotkeyRecords.push(hotkeyRecord);\n const keydown = this.createKeydownObservable(scopeElement);\n return new Observable<KeyboardEvent>(observer => {\n const subscription = keydown\n .pipe(filter((event: KeyboardEvent) => hotkeys.some(key => isHotkey(event, key))))\n .subscribe((event: KeyboardEvent) => {\n event.stopPropagation();\n observer.next(event);\n });\n return () => {\n subscription.unsubscribe();\n this.hotkeyRecords = this.hotkeyRecords.filter(record => record !== hotkeyRecord);\n };\n });\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Directive, ElementRef, EventEmitter, Inject, Input, OnInit, Output, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { isFormElement, isString } from '@tethys/cdk/is';\nimport { ThyHotkeyDispatcher } from './hotkey-dispatcher';\n\n/**\n * @name thyHotkey\n */\n@Directive({ selector: '[thyHotkey]' })\nexport class ThyHotkeyDirective implements OnInit, OnDestroy {\n /**\n * 热键对应 Code,多个热键组合支持通过数组或逗号分割的形式传入\n */\n @Input() thyHotkey: string | string[];\n\n /**\n * 配置热键触发范围,默认绑定在 document 上\n */\n @Input() thyHotkeyScope?: string | Element | ElementRef<Element>;\n\n /**\n * 热键触发后的事件\n */\n @Output() thyHotkeyListener: EventEmitter<KeyboardEvent> = new EventEmitter();\n\n private subscription: Subscription = null;\n\n constructor(\n @Inject(DOCUMENT) private document: Document,\n private hotkeyDispatcher: ThyHotkeyDispatcher,\n private elementRef: ElementRef<HTMLElement>\n ) {}\n\n ngOnInit(): void {\n const scope = isString(this.thyHotkeyScope) ? this.document.querySelector(this.thyHotkeyScope) : this.thyHotkeyScope;\n this.subscription = this.hotkeyDispatcher.keydown(this.thyHotkey, scope).subscribe(event => {\n event.preventDefault();\n if (isFormElement(this.elementRef)) {\n this.elementRef.nativeElement.focus();\n } else {\n this.elementRef.nativeElement.click();\n }\n this.thyHotkeyListener.emit(event);\n });\n }\n\n ngOnDestroy(): void {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { ThyHotkeyDirective } from './hotkey.directive';\n\n@NgModule({\n imports: [],\n exports: [ThyHotkeyDirective],\n declarations: [ThyHotkeyDirective],\n providers: []\n})\nexport class ThyHotkeyModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ThyHotkeyDispatcher"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tethys-cdk-hotkey.mjs","sources":["../../../cdk/hotkey/hotkey.ts","../../../cdk/hotkey/hotkey-dispatcher.ts","../../../cdk/hotkey/hotkey.directive.ts","../../../cdk/hotkey/module.ts","../../../cdk/hotkey/tethys-cdk-hotkey.ts"],"sourcesContent":["const modifierKeyNames: string[] = [`Control`, 'Alt', 'Meta', 'Shift'];\n\n// We don't want to show `Shift` when `event.key` is capital\nfunction showShift(event: KeyboardEvent): boolean {\n const { shiftKey, code, key } = event;\n return shiftKey && !(code.startsWith('Key') && key.toUpperCase() === key);\n}\n\nexport function hotkey(event: KeyboardEvent): string {\n const { ctrlKey, altKey, metaKey, key } = event;\n const hotkeyString: string[] = [];\n const modifiers: boolean[] = [ctrlKey, altKey, metaKey, showShift(event)];\n for (const [i, mod] of modifiers.entries()) {\n if (mod) hotkeyString.push(modifierKeyNames[i]);\n }\n\n if (!modifierKeyNames.includes(key)) {\n hotkeyString.push(key);\n }\n\n return hotkeyString.join('+');\n}\n\nexport function isHotkey(event: KeyboardEvent, key: string) {\n return key.toUpperCase() === hotkey(event).toUpperCase();\n}\n","import { coerceElement } from '@angular/cdk/coercion';\nimport { DOCUMENT } from '@angular/common';\nimport { Inject, Injectable, NgZone, ElementRef } from '@angular/core';\nimport { ThyEventDispatcher } from '@tethys/cdk/event';\nimport { fromEvent, Observable, Subscriber } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport { isString, isUndefinedOrNull } from '@tethys/cdk/is';\nimport { isHotkey } from './hotkey';\n\n@Injectable({ providedIn: 'root' })\nexport class ThyHotkeyDispatcher extends ThyEventDispatcher {\n private keydownSubscriber: Subscriber<KeyboardEvent>;\n\n constructor(@Inject(DOCUMENT) document: any, ngZone: NgZone) {\n super(document, ngZone, 'keydown');\n }\n\n private createKeydownObservable(scope: Element | Document) {\n if (scope === this.document) {\n return this.subscribe(null);\n } else {\n return fromEvent(scope, 'keydown');\n }\n }\n\n /**\n * 热键事件订阅\n */\n keydown(hotkey: string | string[], scope?: ElementRef<Element> | Element | Document): Observable<KeyboardEvent> {\n const hotkeys = isString(hotkey) ? hotkey.split(',') : hotkey;\n const scopeElement = coerceElement(isUndefinedOrNull(scope) ? this.document : scope);\n const keydown = this.createKeydownObservable(scopeElement);\n return new Observable<KeyboardEvent>(subscriber => {\n const subscription = keydown\n .pipe(filter((event: KeyboardEvent) => hotkeys.some(key => isHotkey(event, key))))\n .subscribe((event: KeyboardEvent) => {\n this.keydownSubscriber = subscriber;\n // setTimeout 是为了解决 Hotkey 冲突时仅执行最后订阅的事件\n setTimeout(() => {\n this.keydownSubscriber?.next(event);\n this.keydownSubscriber = null;\n });\n });\n return () => {\n subscription.unsubscribe();\n };\n });\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Directive, ElementRef, EventEmitter, Inject, Input, OnInit, Output, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { isFormElement, isString } from '@tethys/cdk/is';\nimport { ThyHotkeyDispatcher } from './hotkey-dispatcher';\n\n/**\n * @name thyHotkey\n */\n@Directive({ selector: '[thyHotkey]' })\nexport class ThyHotkeyDirective implements OnInit, OnDestroy {\n /**\n * 热键对应 Code,多个热键组合支持通过数组或逗号分割的形式传入\n */\n @Input() thyHotkey: string | string[];\n\n /**\n * 配置热键触发范围,默认绑定在 document 上\n */\n @Input() thyHotkeyScope?: string | Element | ElementRef<Element>;\n\n /**\n * 热键触发后的事件\n */\n @Output() thyHotkeyListener: EventEmitter<KeyboardEvent> = new EventEmitter();\n\n private subscription: Subscription = null;\n\n constructor(\n @Inject(DOCUMENT) private document: Document,\n private hotkeyDispatcher: ThyHotkeyDispatcher,\n private elementRef: ElementRef<HTMLElement>\n ) {}\n\n ngOnInit(): void {\n const scope = isString(this.thyHotkeyScope) ? this.document.querySelector(this.thyHotkeyScope) : this.thyHotkeyScope;\n this.subscription = this.hotkeyDispatcher.keydown(this.thyHotkey, scope).subscribe(event => {\n event.preventDefault();\n if (isFormElement(this.elementRef)) {\n this.elementRef.nativeElement.focus();\n } else {\n this.elementRef.nativeElement.click();\n }\n this.thyHotkeyListener.emit(event);\n });\n }\n\n ngOnDestroy(): void {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport { ThyHotkeyDirective } from './hotkey.directive';\n\n@NgModule({\n imports: [],\n exports: [ThyHotkeyDirective],\n declarations: [ThyHotkeyDirective],\n providers: []\n})\nexport class ThyHotkeyModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ThyHotkeyDispatcher"],"mappings":"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"}
|
|
@@ -3,10 +3,9 @@ import { ThyEventDispatcher } from '@tethys/cdk/event';
|
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class ThyHotkeyDispatcher extends ThyEventDispatcher {
|
|
6
|
-
private
|
|
6
|
+
private keydownSubscriber;
|
|
7
7
|
constructor(document: any, ngZone: NgZone);
|
|
8
8
|
private createKeydownObservable;
|
|
9
|
-
private checkHotkeyConflict;
|
|
10
9
|
/**
|
|
11
10
|
* 热键事件订阅
|
|
12
11
|
*/
|