UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

81 lines 10.9 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Injectable } from "@angular/core"; import { KEYBOARD_CODE } from "../../constants/keycode.constants"; import * as i0 from "@angular/core"; export class ToolbarKeyboardService { constructor() { this.toolbarItems = []; } setToolbarItems(items, menu) { this.toolbarItems = items; this.menu = menu; } onKeyDown(event) { const { code } = event; if (code === KEYBOARD_CODE.ARROW_LEFT || code === KEYBOARD_CODE.ARROW_RIGHT) { event.preventDefault(); this.navigateByArrow(code); } if (code === KEYBOARD_CODE.TAB) { this.closeMenuIfOpened(); } } navigateByArrow(code) { const activeEl = document.activeElement; const activeIndex = this.toolbarItems.indexOf(activeEl); const first = this.toolbarItems[0]; const last = this.toolbarItems[this.toolbarItems.length - 1]; if (code === KEYBOARD_CODE.ARROW_LEFT) { activeEl === first ? this.focusLast() : this.focusLeft(activeIndex); } if (code === KEYBOARD_CODE.ARROW_RIGHT && activeIndex !== -1) { activeEl === last ? this.focusFirst() : this.focusRight(activeIndex); } } focusFirst() { this.toolbarItems[0].focus(); this.closeMenuIfOpened(); } focusLast() { this.toolbarItems[this.toolbarItems.length - 1].focus(); } focusRight(index) { this.toolbarItems[index + 1]?.focus(); } focusLeft(index) { this.toolbarItems[index - 1]?.focus(); this.closeMenuIfOpened(); } closeMenuIfOpened() { if (this.menu && this.menu?.popup?.isOpen) { this.menu.popup.isOpen = false; } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToolbarKeyboardService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToolbarKeyboardService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToolbarKeyboardService, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGJhci1rZXlib2FyZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90b29sYmFyL3Rvb2xiYXIta2V5Ym9hcmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7O0FBSWxFLE1BQU0sT0FBTyxzQkFBc0I7SUFEbkM7UUFFWSxpQkFBWSxHQUFrQixFQUFFLENBQUM7S0FnRTVDO0lBN0RVLGVBQWUsQ0FBQyxLQUFvQixFQUFFLElBQW9CO1FBQzdELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFTSxTQUFTLENBQUMsS0FBb0I7UUFDakMsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQztRQUV2QixJQUNJLElBQUksS0FBSyxhQUFhLENBQUMsVUFBVTtZQUNqQyxJQUFJLEtBQUssYUFBYSxDQUFDLFdBQVcsRUFDcEM7WUFDRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtRQUVELElBQUksSUFBSSxLQUFLLGFBQWEsQ0FBQyxHQUFHLEVBQUU7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDNUI7SUFDTCxDQUFDO0lBRU8sZUFBZSxDQUFDLElBQW1CO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDeEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsUUFBdUIsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUU3RCxJQUFJLElBQUksS0FBSyxhQUFhLENBQUMsVUFBVSxFQUFFO1lBQ25DLFFBQVEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN2RTtRQUVELElBQUksSUFBSSxLQUFLLGFBQWEsQ0FBQyxXQUFXLElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzFELFFBQVEsS0FBSyxJQUFJO2dCQUNiLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNuQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN0QztJQUNMLENBQUM7SUFFTyxVQUFVO1FBQ2QsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8sU0FBUztRQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFhO1FBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFTyxTQUFTLENBQUMsS0FBYTtRQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8saUJBQWlCO1FBQ3JCLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7WUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztTQUNsQztJQUNMLENBQUM7K0dBaEVRLHNCQUFzQjttSEFBdEIsc0JBQXNCOzs0RkFBdEIsc0JBQXNCO2tCQURsQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5pbXBvcnQgeyBLRVlCT0FSRF9DT0RFIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy9rZXljb2RlLmNvbnN0YW50c1wiO1xuaW1wb3J0IHsgTWVudUNvbXBvbmVudCB9IGZyb20gXCIuLi9tZW51XCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUb29sYmFyS2V5Ym9hcmRTZXJ2aWNlIHtcbiAgICBwcml2YXRlIHRvb2xiYXJJdGVtczogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIHByaXZhdGUgbWVudTogTWVudUNvbXBvbmVudCB8IHVuZGVmaW5lZDtcblxuICAgIHB1YmxpYyBzZXRUb29sYmFySXRlbXMoaXRlbXM6IEhUTUxFbGVtZW50W10sIG1lbnU/OiBNZW51Q29tcG9uZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMudG9vbGJhckl0ZW1zID0gaXRlbXM7XG4gICAgICAgIHRoaXMubWVudSA9IG1lbnU7XG4gICAgfVxuXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGNvZGUgfSA9IGV2ZW50O1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvZGUgPT09IEtFWUJPQVJEX0NPREUuQVJST1dfTEVGVCB8fFxuICAgICAgICAgICAgY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5BUlJPV19SSUdIVFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRlQnlBcnJvdyhjb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2RlID09PSBLRVlCT0FSRF9DT0RFLlRBQikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZU1lbnVJZk9wZW5lZCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBuYXZpZ2F0ZUJ5QXJyb3coY29kZTogS0VZQk9BUkRfQ09ERSk6IHZvaWQge1xuICAgICAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy50b29sYmFySXRlbXMuaW5kZXhPZihhY3RpdmVFbCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy50b29sYmFySXRlbXNbMF07XG4gICAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLnRvb2xiYXJJdGVtc1t0aGlzLnRvb2xiYXJJdGVtcy5sZW5ndGggLSAxXTtcblxuICAgICAgICBpZiAoY29kZSA9PT0gS0VZQk9BUkRfQ09ERS5BUlJPV19MRUZUKSB7XG4gICAgICAgICAgICBhY3RpdmVFbCA9PT0gZmlyc3QgPyB0aGlzLmZvY3VzTGFzdCgpIDogdGhpcy5mb2N1c0xlZnQoYWN0aXZlSW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvZGUgPT09IEtFWUJPQVJEX0NPREUuQVJST1dfUklHSFQgJiYgYWN0aXZlSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBhY3RpdmVFbCA9PT0gbGFzdFxuICAgICAgICAgICAgICAgID8gdGhpcy5mb2N1c0ZpcnN0KClcbiAgICAgICAgICAgICAgICA6IHRoaXMuZm9jdXNSaWdodChhY3RpdmVJbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZvY3VzRmlyc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG9vbGJhckl0ZW1zWzBdLmZvY3VzKCk7XG4gICAgICAgIHRoaXMuY2xvc2VNZW51SWZPcGVuZWQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvY3VzTGFzdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b29sYmFySXRlbXNbdGhpcy50b29sYmFySXRlbXMubGVuZ3RoIC0gMV0uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvY3VzUmlnaHQoaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aGlzLnRvb2xiYXJJdGVtc1tpbmRleCArIDFdPy5mb2N1cygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9jdXNMZWZ0KGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy50b29sYmFySXRlbXNbaW5kZXggLSAxXT8uZm9jdXMoKTtcbiAgICAgICAgdGhpcy5jbG9zZU1lbnVJZk9wZW5lZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xvc2VNZW51SWZPcGVuZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLm1lbnUgJiYgdGhpcy5tZW51Py5wb3B1cD8uaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLm1lbnUucG9wdXAuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=