foundation.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import BaseFoundation, { DefaultAdapter } from '../base/foundation';
  2. import { handlePrevent, setFocusToFirstItem, setFocusToLastItem } from '../utils/a11y';
  3. export interface DropdownAdapter extends Partial<DefaultAdapter> {
  4. setPopVisible(visible: boolean): void;
  5. notifyVisibleChange(visible: boolean): void;
  6. }
  7. export default class DropdownFoundation extends BaseFoundation<DropdownAdapter> {
  8. handleVisibleChange(visible: boolean) {
  9. this._adapter.setPopVisible(visible);
  10. this._adapter.notifyVisibleChange(visible);
  11. }
  12. getMenuItemNodes(target: any): HTMLElement[] {
  13. const id = target.attributes['data-popupId'].value;
  14. const menuWrapper = document.getElementById(id);
  15. // if has dropdown item, the item must wrapped by li
  16. return menuWrapper ? Array.from(menuWrapper.getElementsByTagName('li')).filter(item => item.ariaDisabled === "false") : null;
  17. }
  18. setFocusToFirstMenuItem(target: any): void {
  19. const menuItemNodes = this.getMenuItemNodes(target);
  20. menuItemNodes && setFocusToFirstItem(menuItemNodes);
  21. }
  22. setFocusToLastMenuItem(target: any): void {
  23. const menuItemNodes = this.getMenuItemNodes(target);
  24. menuItemNodes && setFocusToLastItem(menuItemNodes);
  25. }
  26. handleKeyDown(event: any): void {
  27. switch (event.key) {
  28. case ' ':
  29. case 'Enter':
  30. event.target.click();
  31. handlePrevent(event);
  32. break;
  33. case 'ArrowDown':
  34. this.setFocusToFirstMenuItem(event.target);
  35. handlePrevent(event);
  36. break;
  37. case 'ArrowUp':
  38. this.setFocusToLastMenuItem(event.target);
  39. handlePrevent(event);
  40. break;
  41. default:
  42. break;
  43. }
  44. }
  45. }