| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | import BaseFoundation, { DefaultAdapter } from '../base/foundation';import { handlePrevent, setFocusToFirstItem, setFocusToLastItem } from '../utils/a11y';export interface DropdownAdapter extends Partial<DefaultAdapter> {    setPopVisible(visible: boolean): void;    notifyVisibleChange(visible: boolean): void;}export default class DropdownFoundation extends BaseFoundation<DropdownAdapter> {    handleVisibleChange(visible: boolean) {        this._adapter.setPopVisible(visible);        this._adapter.notifyVisibleChange(visible);    }    getMenuItemNodes(target: any): HTMLElement[] {        const id = target.attributes['data-popupid'].value;        const menuWrapper = document.getElementById(id);        // if has dropdown item, the item must wrapped by li        return menuWrapper ? Array.from(menuWrapper.getElementsByTagName('li')).filter(item => item.ariaDisabled === "false") : null;    }    setFocusToFirstMenuItem(target: any): void {        const menuItemNodes = this.getMenuItemNodes(target);        menuItemNodes && setFocusToFirstItem(menuItemNodes);    }    setFocusToLastMenuItem(target: any): void {        const menuItemNodes = this.getMenuItemNodes(target);        menuItemNodes && setFocusToLastItem(menuItemNodes);    }    handleKeyDown(event: any): void {        switch (event.key) {            case ' ':            case 'Enter':                event.target.click();                handlePrevent(event);                break;            case 'ArrowDown':                this.setFocusToFirstMenuItem(event.target);                handlePrevent(event);                break;            case 'ArrowUp':                this.setFocusToLastMenuItem(event.target);                handlePrevent(event);                break;            default:                break;        }    }}
 |