UNPKG

@paperbits/core

Version:
53 lines (43 loc) 1.87 kB
import * as ko from "knockout"; import { Keys } from "@paperbits/common/keyboard"; import { Events } from "@paperbits/common/events"; import { getFocusableElements } from "@paperbits/common/html"; ko.bindingHandlers["dialog"] = { init(element: HTMLElement): void { const onKeyDown = (event: KeyboardEvent): void => { const focusableElements = getFocusableElements(element); const firstFocusableElement = <HTMLElement>focusableElements[0]; const lastFocusableElement = <HTMLElement>focusableElements[focusableElements.length - 1]; const isTabPressed = event.key === Keys.Tab; if (!isTabPressed) { return; } if (event.shiftKey) { if (document.activeElement === firstFocusableElement) { lastFocusableElement.focus(); event.preventDefault(); } } else { if (document.activeElement === lastFocusableElement) { firstFocusableElement.focus(); event.preventDefault(); } } }; setTimeout(() => { const focusableElements = getFocusableElements(element); if (focusableElements.length === 0) { return; } const firstFocusableElement = <HTMLElement>focusableElements[0]; if (firstFocusableElement) { firstFocusableElement.focus(); } }, 100); // giving chance to controls to render element.addEventListener(Events.KeyDown, onKeyDown); ko.utils.domNodeDisposal.addDisposeCallback(element, () => { element.removeEventListener(Events.KeyDown, onKeyDown); }); } };