123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- import BaseFoundation, { DefaultAdapter } from '../base/foundation';
- import isEnterPress from '../utils/isEnterPress';
- const addKeys = function addKeys(originKeys: (string | number)[] = [], ...willAddKeys: (string | number)[]) {
- const keySet = new Set(originKeys);
- willAddKeys.forEach(key => key && keySet.add(key));
- return Array.from(keySet);
- };
- const removeKeys = function removeKeys(originKeys: (string | number)[] = [], ...willRemoveKeys: (string | number)[]) {
- const keySet = new Set(originKeys);
- willRemoveKeys.forEach(key => key && keySet.delete(key));
- return Array.from(keySet);
- };
- export interface OnOpenChangeData {
- itemKey: string | number;
- openKeys: (string | number)[];
- isOpen: boolean;
- }
- export interface OnClickData extends OnOpenChangeData {
- domEvent: any;
- }
- export interface OnSelectData extends OnOpenChangeData {
- domEvent: any;
- }
- export interface SubNavAdapter<P = Record<string, any>, S = Record<string, any>> extends DefaultAdapter<P, S> {
- updateIsHovered(isHovered: boolean): void;
- getOpenKeys(): (string | number)[];
- getOpenKeysIsControlled(): boolean;
- getCanUpdateOpenKeys(): boolean;
- updateOpen(isOpen: boolean): void;
- notifyGlobalOpenChange(data: OnOpenChangeData): void;
- notifyGlobalOnSelect(data: OnSelectData): void;
- notifyGlobalOnClick(data: OnClickData): void;
- getIsSelected(itemKey: string | number): boolean;
- getIsOpen(): boolean;
- }
- export default class SubNavFoundation<P = Record<string, any>, S = Record<string, any>> extends BaseFoundation<SubNavAdapter<P, S>, P, S> {
- constructor(adapter: SubNavAdapter<P, S>) {
- super({ ...adapter });
- }
- _timer: number;
- init() {
- // this.log('invoke SubNavFoundation init()');
- this._timer = null;
- }
- destroy() {} // eslint-disable-line
- clearDelayTimer() {
- if (this._timer) {
- clearTimeout(this._timer);
- this._timer = null;
- }
- }
- isValidKey(itemKey: string | number) {
- // eslint-disable-next-line eqeqeq
- return itemKey != null && (typeof itemKey === 'number' || typeof itemKey === 'string');
- }
- handleDropdownVisibleChange(visible: boolean) {
- const itemKey = this.getProp('itemKey');
- const openKeysIsControlled = this._adapter.getOpenKeysIsControlled();
- const canUpdateOpenKeys = this._adapter.getCanUpdateOpenKeys();
- const rawOpenKeys = this._adapter.getOpenKeys();
- const openKeys = visible ? addKeys(rawOpenKeys, itemKey) : removeKeys(rawOpenKeys, itemKey);
- this.clearDelayTimer();
- if (!openKeysIsControlled) {
- if (canUpdateOpenKeys) {
- this._adapter.updateOpen(visible);
- }
- // this._adapter.updateIsHovered(visible);
- }
- this._adapter.notifyGlobalOpenChange({ itemKey, openKeys, isOpen: visible });
- }
- /**
- *
- * @param {Event} e
- * @param {HTMLElement} titleRef
- */
- handleClick(e: any, titleRef: any) {
- const { itemKey, disabled } = this.getProps();
- if (disabled) {
- return;
- }
- // this.log(e, titleRef, titleRef.contains(e.target));
- const clickedDomIsTitle = titleRef && titleRef.contains(e.target);
- let isOpen = Boolean(this._adapter.getIsOpen());
- if (!clickedDomIsTitle) {
- isOpen = false;
- } else {
- isOpen = !isOpen;
- }
- const openKeys = isOpen
- ? addKeys(this._adapter.getOpenKeys(), itemKey)
- : removeKeys(this._adapter.getOpenKeys(), itemKey);
- const cbVal = { itemKey, openKeys, isOpen, domEvent: e };
- const openKeysIsControlled = this._adapter.getOpenKeysIsControlled();
- const canUpdateOpenKeys = this._adapter.getCanUpdateOpenKeys();
- if (!openKeysIsControlled && canUpdateOpenKeys) {
- this._adapter.updateOpen(isOpen);
- }
- this._adapter.notifyGlobalOpenChange(cbVal);
- this._adapter.notifyGlobalOnClick(cbVal);
- }
- /**
- * A11y: simulate sub nav click
- * @param e
- * @param titleRef
- */
- handleKeyPress(e: any, titleRef: any) {
- if (isEnterPress(e)) {
- this.handleClick(e, titleRef);
- }
- }
- }
|