@ngneat/hotkeys
Version:
A declarative library for handling hotkeys in Angular applications
1 lines • 32.1 kB
Source Map (JSON)
{"version":3,"file":"ngneat-hotkeys.mjs","sources":["../../../../projects/ngneat/hotkeys/src/lib/utils/array.ts","../../../../projects/ngneat/hotkeys/src/lib/utils/platform.ts","../../../../projects/ngneat/hotkeys/src/lib/hotkeys.service.ts","../../../../projects/ngneat/hotkeys/src/lib/hotkeys.directive.ts","../../../../projects/ngneat/hotkeys/src/lib/hotkeys-shortcut.pipe.ts","../../../../projects/ngneat/hotkeys/src/lib/hotkeys-help/hotkeys-help.component.ts","../../../../projects/ngneat/hotkeys/src/lib/hotkeys-help/hotkeys-help.component.html","../../../../projects/ngneat/hotkeys/src/ngneat-hotkeys.ts"],"sourcesContent":["export function coerceArray(params: any | any[]) {\n return Array.isArray(params) ? params : [params];\n}\n","export type Platform = 'apple' | 'pc';\n\nexport function hostPlatform(): Platform {\n const appleDevices = ['Mac', 'iPhone', 'iPad'];\n return appleDevices.some((d) => navigator.userAgent.includes(d)) ? 'apple' : 'pc';\n}\n\nexport function normalizeKeys(keys: string, platform: Platform): string {\n const transformMap = {\n up: 'ArrowUp',\n down: 'ArrowDown',\n left: 'ArrowLeft',\n right: 'ArrowRight',\n };\n\n function transform(key: string): string {\n if (platform === 'pc' && key === 'meta') {\n key = 'control';\n }\n\n if (key in transformMap) {\n key = transformMap[key];\n }\n\n return key;\n }\n\n return keys\n .toLowerCase()\n .split('>')\n .map((s) => s.split('.').map(transform).join('.'))\n .join('>');\n}\n","import { DOCUMENT } from '@angular/common';\nimport { computed, Inject, Injectable, signal } from '@angular/core';\nimport { EventManager } from '@angular/platform-browser';\nimport { EMPTY, fromEvent, Observable, of, Subject, Subscriber, Subscription } from 'rxjs';\nimport { debounceTime, filter, finalize, mergeMap, takeUntil, tap } from 'rxjs/operators';\n\nimport { coerceArray } from './utils/array';\nimport { hostPlatform, normalizeKeys } from './utils/platform';\n\nexport type AllowInElement = 'INPUT' | 'TEXTAREA' | 'SELECT' | 'CONTENTEDITABLE';\nexport type Options = {\n group: string;\n element: HTMLElement;\n trigger: 'keydown' | 'keyup';\n allowIn: AllowInElement[];\n description: string;\n showInHelpMenu: boolean;\n preventDefault: boolean;\n global?: boolean;\n};\n\nexport interface HotkeyGroup {\n group: string;\n hotkeys: { keys: string; description: string }[];\n}\n\nexport type Hotkey = Partial<Options> & { keys: string };\nexport type HotkeyCallback = (event: KeyboardEvent | Hotkey, keys: string, target: HTMLElement) => void;\n\ninterface HotkeySummary {\n hotkey: Hotkey;\n subject: Subject<Hotkey>;\n}\n\ninterface SequenceSummary {\n subscription: Subscription;\n observer: Observable<Hotkey>;\n hotkeyMap: Map<string, HotkeySummary>;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class HotkeysService {\n private readonly hotkeys = new Map<string, Hotkey>();\n private readonly dispose = new Subject<string>();\n private readonly defaults: Options = {\n trigger: 'keydown',\n allowIn: [],\n element: this.document.documentElement,\n group: undefined,\n description: undefined,\n showInHelpMenu: true,\n preventDefault: true,\n };\n private callbacks: HotkeyCallback[] = [];\n private sequenceMaps = new Map<HTMLElement, SequenceSummary>();\n private sequenceDebounce: number = 250;\n\n private _isActive = signal(true);\n // readonly interface for the isActive value\n isActive = computed(() => this._isActive());\n\n constructor(\n private eventManager: EventManager,\n @Inject(DOCUMENT) private document: Document,\n ) {}\n\n getHotkeys(): Hotkey[] {\n const sequenceKeys = Array.from(this.sequenceMaps.values())\n .map((s) => [s.hotkeyMap].reduce((_acc, val) => [...val.values()], []))\n .reduce((_x, y) => y, [])\n .map((h) => h.hotkey);\n\n return Array.from(this.hotkeys.values()).concat(sequenceKeys);\n }\n\n getShortcuts(): HotkeyGroup[] {\n const hotkeys = this.getHotkeys();\n const groups: HotkeyGroup[] = [];\n\n for (const hotkey of hotkeys) {\n if (!hotkey.showInHelpMenu) {\n continue;\n }\n\n let group = groups.find((g) => g.group === hotkey.group);\n if (!group) {\n group = { group: hotkey.group, hotkeys: [] };\n groups.push(group);\n }\n\n const normalizedKeys = normalizeKeys(hotkey.keys, hostPlatform());\n group.hotkeys.push({ keys: normalizedKeys, description: hotkey.description });\n }\n\n return groups;\n }\n\n addSequenceShortcut(options: Hotkey): Observable<Hotkey> {\n const getSequenceObserver = (element: HTMLElement, eventName: string) => {\n let sequence = '';\n return fromEvent<KeyboardEvent>(element, eventName).pipe(\n tap(\n (e) =>\n (sequence = `${sequence}${sequence ? '>' : ''}${e.ctrlKey ? 'control.' : ''}${e.altKey ? 'alt.' : ''}${\n e.shiftKey ? 'shift.' : ''\n }${e.key}`),\n ),\n debounceTime(this.sequenceDebounce),\n mergeMap(() => {\n const resultSequence = sequence;\n sequence = '';\n const summary = this.sequenceMaps.get(element);\n if (summary.hotkeyMap.has(resultSequence)) {\n const hotkeySummary = summary.hotkeyMap.get(resultSequence);\n hotkeySummary.subject.next(hotkeySummary.hotkey);\n return of(hotkeySummary.hotkey);\n } else {\n return EMPTY;\n }\n }),\n );\n };\n\n const mergedOptions = { ...this.defaults, ...options };\n let normalizedKeys = normalizeKeys(mergedOptions.keys, hostPlatform());\n\n const getSequenceCompleteObserver = (): Observable<Hotkey> => {\n const hotkeySummary = {\n subject: new Subject<Hotkey>(),\n hotkey: mergedOptions,\n };\n\n const hotkeyElement = mergedOptions.global ? this.document.documentElement : mergedOptions.element;\n\n if (this.sequenceMaps.has(hotkeyElement)) {\n const sequenceSummary = this.sequenceMaps.get(hotkeyElement);\n\n if (sequenceSummary.hotkeyMap.has(normalizedKeys)) {\n console.error('Duplicated shortcut');\n return of(null);\n }\n\n sequenceSummary.hotkeyMap.set(normalizedKeys, hotkeySummary);\n } else {\n const observer = getSequenceObserver(hotkeyElement, mergedOptions.trigger);\n const subscription = observer.subscribe();\n\n const hotkeyMap = new Map<string, HotkeySummary>([[normalizedKeys, hotkeySummary]]);\n const sequenceSummary = { subscription, observer, hotkeyMap };\n this.sequenceMaps.set(hotkeyElement, sequenceSummary);\n }\n\n return hotkeySummary.subject.asObservable();\n };\n\n return getSequenceCompleteObserver().pipe(\n takeUntil<Hotkey>(this.dispose.pipe(filter((v) => v === normalizedKeys))),\n filter((hotkey) => !this.targetIsExcluded(hotkey.allowIn)),\n filter((hotkey) => this._isActive()),\n tap((hotkey) => {\n this.callbacks.forEach((cb) => cb(hotkey, normalizedKeys, hotkey.element));\n }),\n finalize(() => this.removeShortcuts(normalizedKeys)),\n );\n }\n\n addShortcut(options: Hotkey): Observable<KeyboardEvent> {\n const mergedOptions = { ...this.defaults, ...options };\n const normalizedKeys = normalizeKeys(mergedOptions.keys, hostPlatform());\n\n if (this.hotkeys.has(normalizedKeys)) {\n console.error('Duplicated shortcut');\n return of(null);\n }\n\n this.hotkeys.set(normalizedKeys, mergedOptions);\n const event = `${mergedOptions.trigger}.${normalizedKeys}`;\n\n return new Observable((observer) => {\n const handler = (e: KeyboardEvent) => {\n const hotkey = this.hotkeys.get(normalizedKeys);\n const skipShortcutTrigger = this.targetIsExcluded(hotkey.allowIn);\n\n if (skipShortcutTrigger) {\n return;\n }\n\n if (mergedOptions.preventDefault) {\n e.preventDefault();\n }\n\n if (this._isActive()) {\n this.callbacks.forEach((cb) => cb(e, normalizedKeys, hotkey.element));\n observer.next(e);\n }\n };\n\n const dispose = this.eventManager.addEventListener(\n mergedOptions.global ? this.document.documentElement : mergedOptions.element,\n event,\n handler,\n );\n\n return () => {\n this.hotkeys.delete(normalizedKeys);\n dispose();\n };\n }).pipe(\n filter(() => this._isActive()),\n takeUntil<KeyboardEvent>(this.dispose.pipe(filter((v) => v === normalizedKeys))),\n );\n }\n\n removeShortcuts(hotkeys: string | string[]): void {\n const coercedHotkeys = coerceArray(hotkeys).map((hotkey) => normalizeKeys(hotkey, hostPlatform()));\n coercedHotkeys.forEach((hotkey) => {\n this.hotkeys.delete(hotkey);\n this.dispose.next(hotkey);\n\n this.sequenceMaps.forEach((v, k) => {\n const summary = v.hotkeyMap.get(hotkey);\n if (summary) {\n summary.subject.observers\n .filter((o: Subscriber<Hotkey>) => !o.closed)\n .forEach((o: Subscriber<Hotkey>) => o.unsubscribe());\n\n v.hotkeyMap.delete(hotkey);\n }\n if (v.hotkeyMap.size === 0) {\n v.subscription.unsubscribe();\n this.sequenceMaps.delete(k);\n }\n });\n });\n }\n\n setSequenceDebounce(debounce: number): void {\n this.sequenceDebounce = debounce;\n }\n\n onShortcut(callback: HotkeyCallback): () => void {\n this.callbacks.push(callback);\n\n return () => (this.callbacks = this.callbacks.filter((cb) => cb !== callback));\n }\n\n registerHelpModal(openHelpModalFn: () => void, helpShortcut: string = '') {\n this.addShortcut({ keys: helpShortcut || 'shift.?', showInHelpMenu: false, preventDefault: false }).subscribe(\n (e) => {\n const skipMenu =\n /^(input|textarea|select)$/i.test(document.activeElement.nodeName) ||\n (e.target as HTMLElement).isContentEditable;\n\n if (!skipMenu && this.hotkeys.size) {\n openHelpModalFn();\n }\n },\n );\n }\n\n private targetIsExcluded(allowIn?: AllowInElement[]) {\n const activeElement = this.document.activeElement;\n const elementName = activeElement.nodeName;\n const elementIsContentEditable = (activeElement as HTMLElement).isContentEditable;\n let isExcluded = ['INPUT', 'SELECT', 'TEXTAREA'].includes(elementName) || elementIsContentEditable;\n\n if (isExcluded && allowIn?.length) {\n for (let t of allowIn) {\n if (activeElement.nodeName === t || (t === 'CONTENTEDITABLE' && elementIsContentEditable)) {\n isExcluded = false;\n break;\n }\n }\n }\n\n return isExcluded;\n }\n\n pause() {\n this._isActive.set(false);\n }\n\n resume() {\n this._isActive.set(true);\n }\n}\n","import {\n computed,\n Directive,\n ElementRef,\n EventEmitter,\n inject,\n input,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { merge, Subscription } from 'rxjs';\nimport { mergeAll } from 'rxjs/operators';\n\nimport { Hotkey, HotkeysService, Options as ServiceOptions } from './hotkeys.service';\nimport { coerceArray } from './utils/array';\n\ntype Options = Omit<ServiceOptions, 'group' | 'element' | 'description'>;\n\n@Directive({\n standalone: true,\n selector: '[hotkeys]',\n})\nexport class HotkeysDirective implements OnChanges, OnDestroy {\n private hotkeysService = inject(HotkeysService);\n private elementRef = inject(ElementRef);\n private subscription: Subscription;\n\n hotkeys = input<string>();\n // allows the user to set the value by just adding the attribute to the element\n isSequence = input(false, {\n transform: (value: boolean | string) => (typeof value === 'string' ? value === '' || value === 'true' : value),\n });\n isGlobal = input(false, {\n transform: (value: boolean | string) => (typeof value === 'string' ? value === '' || value === 'true' : value),\n });\n hotkeysGroup = input<string>();\n hotkeysOptions = input<Partial<Options>>({});\n hotkeysDescription = input<string>();\n @Output() hotkey = new EventEmitter<KeyboardEvent | Hotkey>();\n\n private _hotkey = computed(() => ({\n keys: this.hotkeys(),\n group: this.hotkeysGroup(),\n description: this.hotkeysDescription(),\n global: this.isGlobal(),\n ...this.hotkeysOptions(),\n }));\n\n ngOnChanges(changes: SimpleChanges): void {\n this.deleteHotkeys();\n if (!this.hotkeys) {\n return;\n }\n\n this.setHotkeys(this._hotkey());\n }\n\n ngOnDestroy() {\n this.deleteHotkeys();\n }\n\n private deleteHotkeys() {\n if (this.subscription) {\n this.subscription.unsubscribe();\n }\n this.subscription = null;\n }\n\n private setHotkeys(hotkeys: Hotkey | Hotkey[]) {\n const coercedHotkeys = coerceArray(hotkeys);\n this.subscription = merge(\n coercedHotkeys.map((hotkey) => {\n return this.isSequence()\n ? this.hotkeysService.addSequenceShortcut({ ...hotkey, element: this.elementRef.nativeElement })\n : this.hotkeysService.addShortcut({ ...hotkey, element: this.elementRef.nativeElement });\n }),\n )\n .pipe(mergeAll())\n .subscribe((e) => this.hotkey.next(e));\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\nimport { hostPlatform } from './utils/platform';\nimport { CustomAliases } from './utils/alias';\n\nconst symbols = {\n shift: '⇧',\n backspace: '⌫',\n tab: '⇥',\n space: '␣',\n left: '←',\n right: '→',\n up: '↑',\n down: '↓',\n enter: '⌤',\n};\n\nconst appleSymbols = {\n meta: '⌘',\n altleft: '⌥',\n control: '⌃',\n escape: '⎋',\n};\n\nconst pcSymbols = {\n control: 'Ctrl',\n altleft: 'Alt',\n escape: 'Esc',\n};\n\n@Pipe({\n standalone: true,\n name: 'hotkeysShortcut',\n})\nexport class HotkeysShortcutPipe implements PipeTransform {\n private readonly symbols;\n constructor() {\n const platform = hostPlatform();\n this.symbols = this.getPlatformSymbols(platform);\n }\n\n transform(value: string, dotSeparator = ' + ', thenSeparator = ' then ', aliases: CustomAliases = {}): any {\n if (!value) {\n return '';\n }\n return value\n .split('>')\n .map((s) =>\n s\n .split('.')\n .map((c) => c.toLowerCase())\n .map((c) => aliases[c] || this.symbols[c] || c)\n .join(dotSeparator),\n )\n .join(thenSeparator);\n }\n\n private getPlatformSymbols(platform): any {\n return platform === 'apple' ? { ...symbols, ...appleSymbols } : { ...symbols, ...pcSymbols };\n }\n}\n","import { Component, EventEmitter, inject, Input, Output } from '@angular/core';\nimport { HotkeysService } from '../hotkeys.service';\nimport { HotkeysShortcutPipe } from '../hotkeys-shortcut.pipe';\n\n@Component({\n standalone: true,\n imports: [HotkeysShortcutPipe],\n templateUrl: './hotkeys-help.component.html',\n styleUrls: ['./hotkeys-help.component.scss'],\n})\nexport class HotkeysHelpComponent {\n private hotkeysService = inject(HotkeysService);\n @Input() title = 'Available Shortcuts';\n @Output() readonly dismiss = new EventEmitter();\n hotkeys = this.hotkeysService.getShortcuts();\n\n handleDismiss() {\n this.dismiss.emit();\n }\n}\n","<div class=\"modal-header\">\n @if (title) {\n <div class=\"hotkeys-help-header\">\n <span class=\"hotkeys-help-header-title\">{{ title }}</span>\n </div>\n }\n <button type=\"button\" class=\"hotkeys-help-header-dismiss-button\" (click)=\"handleDismiss()\">✕</button>\n</div>\n<div class=\"modal-body preview-modal-body\">\n @for (hotkeyGroup of hotkeys; track $index) {\n <table class=\"hotkeys-table-help\">\n @if (hotkeyGroup.group) {\n <thead>\n <tr>\n <th class=\"hotkeys-table-help-group\" colspan=\"2\">{{ hotkeyGroup.group }}</th>\n </tr>\n </thead>\n }\n <tbody>\n @for (hotkey of hotkeyGroup.hotkeys; track hotkey) {\n <tr class=\"hotkeys-table-help-shortcut\">\n <td class=\"hotkeys-table-help-shortcut-description\">{{ hotkey.description }}</td>\n <td class=\"hotkeys-table-help-shortcut-keys\">\n <kbd [innerHTML]=\"hotkey.keys | hotkeysShortcut\"></kbd>\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}