@deephaven/components 0.11.9-beta.0 → 0.11.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AutoCompleteInput.d.ts +3 -0
- package/dist/AutoCompleteInput.d.ts.map +1 -1
- package/dist/AutoCompleteInput.js +8 -4
- package/dist/AutoCompleteInput.js.map +1 -1
- package/dist/AutoResizeTextarea.d.ts +4 -1
- package/dist/AutoResizeTextarea.d.ts.map +1 -1
- package/dist/AutoResizeTextarea.js +8 -4
- package/dist/AutoResizeTextarea.js.map +1 -1
- package/dist/BasicModal.d.ts +1 -0
- package/dist/BasicModal.d.ts.map +1 -1
- package/dist/BasicModal.js +14 -7
- package/dist/BasicModal.js.map +1 -1
- package/dist/Button.d.ts +1 -1
- package/dist/ButtonGroup.d.ts +3 -0
- package/dist/ButtonGroup.d.ts.map +1 -1
- package/dist/ButtonGroup.js +8 -4
- package/dist/ButtonGroup.js.map +1 -1
- package/dist/CardFlip.d.ts +2 -1
- package/dist/CardFlip.d.ts.map +1 -1
- package/dist/CardFlip.js +4 -2
- package/dist/CardFlip.js.map +1 -1
- package/dist/Checkbox.d.ts +1 -0
- package/dist/Checkbox.d.ts.map +1 -1
- package/dist/Checkbox.js +8 -4
- package/dist/Checkbox.js.map +1 -1
- package/dist/Collapse.d.ts +3 -0
- package/dist/Collapse.d.ts.map +1 -1
- package/dist/Collapse.js +8 -4
- package/dist/Collapse.js.map +1 -1
- package/dist/ComboBox.d.ts +3 -0
- package/dist/ComboBox.d.ts.map +1 -1
- package/dist/ComboBox.js +10 -5
- package/dist/ComboBox.js.map +1 -1
- package/dist/CustomTimeSelect.d.ts +1 -0
- package/dist/CustomTimeSelect.d.ts.map +1 -1
- package/dist/CustomTimeSelect.js +6 -3
- package/dist/CustomTimeSelect.js.map +1 -1
- package/dist/DebouncedSearchInput.d.ts +2 -0
- package/dist/DebouncedSearchInput.d.ts.map +1 -1
- package/dist/DebouncedSearchInput.js +6 -3
- package/dist/DebouncedSearchInput.js.map +1 -1
- package/dist/DeephavenSpinner.d.ts +2 -1
- package/dist/DeephavenSpinner.d.ts.map +1 -1
- package/dist/DeephavenSpinner.js +4 -2
- package/dist/DeephavenSpinner.js.map +1 -1
- package/dist/DraggableItemList.d.ts +2 -0
- package/dist/DraggableItemList.d.ts.map +1 -1
- package/dist/DraggableItemList.js +6 -3
- package/dist/DraggableItemList.js.map +1 -1
- package/dist/HierarchicalCheckboxMenu.d.ts +1 -0
- package/dist/HierarchicalCheckboxMenu.d.ts.map +1 -1
- package/dist/HierarchicalCheckboxMenu.js +12 -6
- package/dist/HierarchicalCheckboxMenu.js.map +1 -1
- package/dist/ItemList.d.ts +2 -0
- package/dist/ItemList.d.ts.map +1 -1
- package/dist/ItemList.js +6 -3
- package/dist/ItemList.js.map +1 -1
- package/dist/ItemListItem.d.ts +2 -0
- package/dist/ItemListItem.d.ts.map +1 -1
- package/dist/ItemListItem.js +5 -2
- package/dist/ItemListItem.js.map +1 -1
- package/dist/LoadingOverlay.d.ts +2 -1
- package/dist/LoadingOverlay.d.ts.map +1 -1
- package/dist/LoadingOverlay.js +4 -2
- package/dist/LoadingOverlay.js.map +1 -1
- package/dist/LoadingSpinner.d.ts +2 -1
- package/dist/LoadingSpinner.d.ts.map +1 -1
- package/dist/LoadingSpinner.js +4 -2
- package/dist/LoadingSpinner.js.map +1 -1
- package/dist/MaskedInput.d.ts +1 -0
- package/dist/MaskedInput.d.ts.map +1 -1
- package/dist/MaskedInput.js +6 -3
- package/dist/MaskedInput.js.map +1 -1
- package/dist/Option.d.ts +2 -1
- package/dist/Option.d.ts.map +1 -1
- package/dist/Option.js +4 -2
- package/dist/Option.js.map +1 -1
- package/dist/RadioGroup.d.ts +1 -0
- package/dist/RadioGroup.d.ts.map +1 -1
- package/dist/RadioGroup.js +4 -2
- package/dist/RadioGroup.js.map +1 -1
- package/dist/SearchInput.d.ts +2 -0
- package/dist/SearchInput.d.ts.map +1 -1
- package/dist/SearchInput.js +6 -3
- package/dist/SearchInput.js.map +1 -1
- package/dist/Select.d.ts +2 -1
- package/dist/Select.d.ts.map +1 -1
- package/dist/Select.js +4 -2
- package/dist/Select.js.map +1 -1
- package/dist/SelectValueList.d.ts +2 -0
- package/dist/SelectValueList.d.ts.map +1 -1
- package/dist/SelectValueList.js +6 -3
- package/dist/SelectValueList.js.map +1 -1
- package/dist/SocketedButton.d.ts +1 -0
- package/dist/SocketedButton.d.ts.map +1 -1
- package/dist/SocketedButton.js +6 -3
- package/dist/SocketedButton.js.map +1 -1
- package/dist/TimeInput.d.ts +1 -0
- package/dist/TimeInput.d.ts.map +1 -1
- package/dist/TimeInput.js +6 -3
- package/dist/TimeInput.js.map +1 -1
- package/dist/TimeSlider.d.ts +2 -1
- package/dist/TimeSlider.d.ts.map +1 -1
- package/dist/TimeSlider.js +18 -9
- package/dist/TimeSlider.js.map +1 -1
- package/dist/ToastNotification.d.ts +2 -1
- package/dist/ToastNotification.d.ts.map +1 -1
- package/dist/ToastNotification.js +4 -2
- package/dist/ToastNotification.js.map +1 -1
- package/dist/UISwitch.d.ts +3 -2
- package/dist/UISwitch.d.ts.map +1 -1
- package/dist/UISwitch.js +4 -2
- package/dist/UISwitch.js.map +1 -1
- package/dist/context-actions/ContextActions.d.ts +1 -0
- package/dist/context-actions/ContextActions.d.ts.map +1 -1
- package/dist/context-actions/ContextActions.js +5 -1
- package/dist/context-actions/ContextActions.js.map +1 -1
- package/dist/context-actions/ContextMenu.d.ts +2 -0
- package/dist/context-actions/ContextMenu.d.ts.map +1 -1
- package/dist/context-actions/ContextMenu.js +6 -3
- package/dist/context-actions/ContextMenu.js.map +1 -1
- package/dist/context-actions/ContextMenuItem.d.ts +1 -0
- package/dist/context-actions/ContextMenuItem.d.ts.map +1 -1
- package/dist/context-actions/ContextMenuItem.js +10 -5
- package/dist/context-actions/ContextMenuItem.js.map +1 -1
- package/dist/context-actions/ContextMenuRoot.d.ts +3 -1
- package/dist/context-actions/ContextMenuRoot.d.ts.map +1 -1
- package/dist/context-actions/ContextMenuRoot.js +5 -1
- package/dist/context-actions/ContextMenuRoot.js.map +1 -1
- package/dist/context-actions/GlobalContextActions.d.ts +1 -0
- package/dist/context-actions/GlobalContextActions.d.ts.map +1 -1
- package/dist/context-actions/GlobalContextActions.js +4 -2
- package/dist/context-actions/GlobalContextActions.js.map +1 -1
- package/dist/menu-actions/DropdownMenu.d.ts +2 -0
- package/dist/menu-actions/DropdownMenu.d.ts.map +1 -1
- package/dist/menu-actions/DropdownMenu.js +6 -3
- package/dist/menu-actions/DropdownMenu.js.map +1 -1
- package/dist/menu-actions/Menu.d.ts +2 -0
- package/dist/menu-actions/Menu.d.ts.map +1 -1
- package/dist/menu-actions/Menu.js +7 -2
- package/dist/menu-actions/Menu.js.map +1 -1
- package/dist/navigation/Menu.d.ts +2 -1
- package/dist/navigation/Menu.d.ts.map +1 -1
- package/dist/navigation/Menu.js +4 -2
- package/dist/navigation/Menu.js.map +1 -1
- package/dist/navigation/MenuItem.d.ts +2 -1
- package/dist/navigation/MenuItem.d.ts.map +1 -1
- package/dist/navigation/MenuItem.js +4 -2
- package/dist/navigation/MenuItem.js.map +1 -1
- package/dist/navigation/Page.d.ts +2 -1
- package/dist/navigation/Page.d.ts.map +1 -1
- package/dist/navigation/Page.js +4 -2
- package/dist/navigation/Page.js.map +1 -1
- package/dist/navigation/Stack.d.ts +2 -1
- package/dist/navigation/Stack.d.ts.map +1 -1
- package/dist/navigation/Stack.js +4 -2
- package/dist/navigation/Stack.js.map +1 -1
- package/dist/popper/Popper.d.ts +3 -0
- package/dist/popper/Popper.d.ts.map +1 -1
- package/dist/popper/Popper.js +9 -3
- package/dist/popper/Popper.js.map +1 -1
- package/dist/popper/Tooltip.d.ts +2 -0
- package/dist/popper/Tooltip.d.ts.map +1 -1
- package/dist/popper/Tooltip.js +6 -3
- package/dist/popper/Tooltip.js.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/context-actions/ContextMenu.tsx"],"names":["React","PureComponent","classNames","Log","PromiseUtils","ContextActionUtils","ContextMenuItem","LoadingSpinner","log","module","ContextMenu","handleContextMenu","e","metaKey","stopPropagation","preventDefault","constructor","props","handleBlur","bind","handleCloseSubMenu","handleKeyDown","handleMenuItemClick","handleMenuItemContextMenu","handleMenuItemMouseMove","handleMouseLeave","handleWindowResize","container","createRef","oldFocus","document","activeElement","activeSubMenuRef","subMenuTimer","rAF","initialPosition","top","left","state","menuItems","pendingItems","activeSubMenu","hasOverflow","subMenuTop","subMenuLeft","subMenuParentWidth","subMenuParentHeight","keyboardIndex","mouseIndex","componentDidMount","initMenu","verifyPosition","window","addEventListener","requestAnimationFrame","current","focus","onMenuOpened","componentDidUpdate","prevProps","prevState","actions","setActiveSubMenuPosition","contains","componentWillUnmount","cancelPromises","removeEventListener","cancelAnimationFrame","getKeyboardIndex","options","separateKeyboardMouse","getMouseIndex","setKeyboardIndex","index","setState","setMouseIndex","initialKeyboardIndex","undefined","getMenuItems","nonPromiseItems","i","length","menuItem","Promise","initMenuPromise","push","sortActions","promise","cancellablePromise","makeCancelable","concat","then","resolvedMenuItems","indexOf","slice","splice","error","isCanceled","map","item","cancel","parentRect","getBoundingClientRect","right","height","width","updatePosition","oldTop","oldLeft","doNotVerifyPosition","scrollHeight","innerHeight","innerWidth","closeMenu","warn","relatedTarget","element","isContextMenuChild","hasAttribute","parentElement","isEscapeKey","key","newFocus","openSubMenu","shiftKey","getNextMenuItem","HTMLElement","newSubMenu","closeAll","onMenuClosed","closeSubMenu","closeAllMenus","disabled","action","focusIndex","render","menuItemElements","group","menuItemElement","pendingElement","menuStyle","showSubmenu","verifiedTop","verifiedLeft"],"mappings":"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","sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils, CancelablePromise } from '@deephaven/utils';\nimport ContextActionUtils, {\n ContextAction,\n ResolvableContextAction,\n} from './ContextActionUtils';\nimport ContextMenuItem from './ContextMenuItem';\nimport LoadingSpinner from '../LoadingSpinner';\n\nconst log = Log.module('ContextMenu');\n\ninterface ContextMenuProps {\n top: number;\n left: number;\n updatePosition(top: number, left: number): void;\n // only submenus will have these, defaults to 0 otherwise\n // represents the width height of the parent menu item\n subMenuParentWidth: number;\n subMenuParentHeight: number;\n actions: ResolvableContextAction[];\n closeMenu(closeAll: boolean): void;\n onMenuClosed(menu: ContextMenu): void;\n onMenuOpened(menu: ContextMenu): void;\n options: {\n doNotVerifyPosition?: boolean;\n separateKeyboardMouse?: boolean;\n initialKeyboardIndex?: number;\n };\n menuStyle: React.CSSProperties;\n}\n\ninterface ContextMenuState {\n menuItems: ContextAction[];\n pendingItems: CancelablePromise<ContextAction[]>[];\n activeSubMenu: number | null;\n hasOverflow: boolean;\n subMenuTop: number | null;\n subMenuLeft: number | null;\n subMenuParentWidth: number;\n subMenuParentHeight: number;\n keyboardIndex: number;\n mouseIndex: number;\n}\n\n/** Do not use this class directly. Use ContextMenuRoot and ContextActions instead. */\nclass ContextMenu extends PureComponent<ContextMenuProps, ContextMenuState> {\n static defaultProps = {\n subMenuParentWidth: 0,\n subMenuParentHeight: 0,\n closeMenu(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n onMenuClosed(): void {\n // no-op\n },\n options: {},\n menuStyle: {},\n };\n\n static handleContextMenu(e: React.MouseEvent): void {\n if (e.metaKey) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n }\n\n constructor(props: ContextMenuProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleCloseSubMenu = this.handleCloseSubMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleMenuItemContextMenu = this.handleMenuItemContextMenu.bind(this);\n this.handleMenuItemMouseMove = this.handleMenuItemMouseMove.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleWindowResize = this.handleWindowResize.bind(this);\n\n this.container = React.createRef();\n this.oldFocus = document.activeElement;\n this.activeSubMenuRef = React.createRef();\n this.subMenuTimer = 0;\n this.rAF = 0;\n\n this.initialPosition = { top: props.top, left: props.left };\n\n this.state = {\n menuItems: [],\n pendingItems: [],\n activeSubMenu: null,\n hasOverflow: false,\n subMenuTop: null,\n subMenuLeft: null,\n subMenuParentWidth: 0,\n subMenuParentHeight: 0,\n keyboardIndex: -1,\n mouseIndex: -1,\n };\n }\n\n componentDidMount(): void {\n this.initMenu();\n\n this.verifyPosition();\n\n window.addEventListener('resize', this.handleWindowResize);\n\n // rAF is needed to wait for a submenus popper to be created before\n // attempting to set focus, however on a quick mount/unmount when\n // mousing past an item, the submenu could be unmounted before the\n // async rAF finishes, so it is cancelled in willUnmount()\n this.rAF = window.requestAnimationFrame(() => {\n this.container.current?.focus();\n\n const { onMenuOpened } = this.props;\n onMenuOpened(this);\n });\n }\n\n componentDidUpdate(\n prevProps: ContextMenuProps,\n prevState: ContextMenuState\n ): void {\n const { actions } = this.props;\n const { activeSubMenu } = this.state;\n\n if (activeSubMenu !== prevState.activeSubMenu) {\n if (activeSubMenu == null) {\n // close sub menu, refocus parent menu\n this.container.current?.focus();\n } else {\n // open sub menu, set its initial position\n this.setActiveSubMenuPosition();\n }\n }\n\n if (prevProps.actions !== actions) {\n this.initMenu();\n\n if (!this.container.current?.contains(document.activeElement)) {\n this.container.current?.focus();\n }\n }\n\n this.verifyPosition();\n }\n\n componentWillUnmount(): void {\n this.cancelPromises();\n window.removeEventListener('resize', this.handleWindowResize);\n cancelAnimationFrame(this.rAF);\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n oldFocus: Element | null;\n\n activeSubMenuRef: React.RefObject<HTMLDivElement>;\n\n subMenuTimer: number;\n\n rAF: number;\n\n initialPosition: { top: number; left: number };\n\n getKeyboardIndex(): number {\n const { options } = this.props;\n if (options.separateKeyboardMouse) {\n const { keyboardIndex } = this.state;\n return keyboardIndex;\n }\n\n return this.getMouseIndex();\n }\n\n setKeyboardIndex(index: number): void {\n const { options } = this.props;\n if (options.separateKeyboardMouse) {\n this.setState({ keyboardIndex: index });\n } else {\n this.setMouseIndex(index);\n }\n }\n\n getMouseIndex(): number {\n const { mouseIndex } = this.state;\n return mouseIndex;\n }\n\n setMouseIndex(index: number): void {\n this.setState({ mouseIndex: index });\n }\n\n initMenu(): void {\n // cancel any pending close and promises\n this.cancelPromises();\n cancelAnimationFrame(this.rAF);\n\n const { options } = this.props;\n let keyboardIndex = options.initialKeyboardIndex;\n if (keyboardIndex === undefined) {\n keyboardIndex = -1;\n }\n\n const { actions } = this.props;\n const menuItems = ContextActionUtils.getMenuItems(actions);\n const nonPromiseItems: ContextAction[] = [];\n for (let i = menuItems.length - 1; i >= 0; i -= 1) {\n const menuItem = menuItems[i];\n if (menuItem instanceof Promise) {\n this.initMenuPromise(menuItem as Promise<ContextAction[]>);\n } else {\n nonPromiseItems.push(menuItem as ContextAction);\n }\n }\n\n this.setState({\n mouseIndex: -1,\n keyboardIndex,\n activeSubMenu: null,\n menuItems: ContextActionUtils.sortActions(nonPromiseItems),\n });\n }\n\n initMenuPromise(promise: Promise<ContextAction[]>): void {\n // make all promises cancellable\n const cancellablePromise = PromiseUtils.makeCancelable(promise);\n\n this.setState(state => ({\n pendingItems: state.pendingItems.concat(cancellablePromise),\n }));\n\n cancellablePromise.then(\n resolvedMenuItems => {\n this.setState(state => {\n const index = state.pendingItems.indexOf(cancellablePromise);\n if (index >= 0) {\n const pendingItems = state.pendingItems.slice();\n pendingItems.splice(index, 1);\n\n return {\n menuItems: ContextActionUtils.sortActions(\n state.menuItems.concat(resolvedMenuItems)\n ),\n pendingItems,\n };\n }\n // This item is stale, don't update the menu\n return null;\n });\n },\n error => {\n if (PromiseUtils.isCanceled(error)) {\n return; // Canceled promise is ignored\n }\n\n // remove failed item from pending list\n this.setState(state => {\n const index = state.pendingItems.indexOf(cancellablePromise);\n if (index >= 0) {\n const pendingItems = state.pendingItems.slice();\n pendingItems.splice(index, 1);\n return {\n pendingItems,\n };\n }\n return null;\n });\n\n // Log the error\n log.error(error);\n }\n );\n }\n\n cancelPromises(): void {\n const { pendingItems } = this.state;\n pendingItems.map(item => item.cancel());\n }\n\n /**\n * Sets the unverfied start position of a submenu. Submenu then self-verfies\n * its own position and potentially reports back a new position.\n */\n setActiveSubMenuPosition(): void {\n if (this.activeSubMenuRef.current === null) return;\n const parentRect = this.activeSubMenuRef.current.getBoundingClientRect();\n\n // intentionally rect.right, we want the sub menu to start at the right edge of the current menu\n this.setState({\n subMenuTop: parentRect.top,\n subMenuLeft: parentRect.right,\n subMenuParentHeight: parentRect.height,\n subMenuParentWidth: parentRect.width,\n });\n }\n\n /**\n * Verifies the position of this menu in relation to the parent to make sure it's on screen.\n * Will update the top left state (updatePosition) if necessary (causing a re-render)\n * By default it tries to top-align with parent, at the right side of the parent.\n * Because we aren't a native context menu and can't escape window bounds, we also do\n * somethings to better fit on screen, such as the \"nudge\" offset position, and further\n * allow overflow scrolling for large menus in a small window.\n */\n verifyPosition(): void {\n const {\n options,\n updatePosition,\n subMenuParentWidth,\n subMenuParentHeight,\n top: oldTop,\n left: oldLeft,\n } = this.props;\n\n if (!this.container.current || options.doNotVerifyPosition) {\n return;\n }\n\n // initial position is used rather than current position,\n // as the number of menu items can change (actions can bubble)\n // and menu should always be positioned relative to spawn point\n let { top, left } = this.initialPosition;\n const {\n width,\n height,\n } = this.container.current?.getBoundingClientRect() ?? {\n width: 0,\n height: 0,\n };\n const hasOverflow =\n (this.container.current?.scrollHeight ?? 0) > window.innerHeight;\n\n if (height === 0 || width === 0) {\n // We don't have a height or width yet, don't bother doing anything\n return;\n }\n\n // does it fit below?\n if (top + height > window.innerHeight) {\n // can it be flipped to above? include offset if submenu (defaults to 0 if not submenu)\n if (top - height - subMenuParentHeight > 0) {\n // flip like a native menu would\n top -= height - subMenuParentHeight;\n } else {\n // still doesnt fit? okay, position at bottom edge\n top = window.innerHeight - height;\n }\n }\n\n if (left + width > window.innerWidth) {\n // less picky about left right positioning, just keep it going off to right\n left = left - width - subMenuParentWidth;\n }\n\n if (oldLeft !== left || oldTop !== top) {\n // parent owns positioning as single source of truth, ask to update props\n this.setState({ hasOverflow });\n updatePosition(top, left);\n }\n }\n\n // since window resize doesn't trigger blur, listen and close the menu\n handleWindowResize(): void {\n if (!this.container.current) {\n return;\n }\n this.closeMenu(true);\n }\n\n handleBlur(e: React.FocusEvent<HTMLDivElement>): void {\n if (!this.container.current) {\n log.warn('Container is null!');\n return;\n }\n\n if (!this.container.current.contains(e.relatedTarget as Node)) {\n let element: HTMLElement | null = e.relatedTarget as HTMLElement;\n let isContextMenuChild = false;\n while (element && !isContextMenuChild) {\n isContextMenuChild = element.hasAttribute('data-dh-context-menu');\n element = element.parentElement;\n }\n\n if (!isContextMenuChild) {\n // close all submenus on blur\n this.closeMenu(true);\n }\n }\n }\n\n /** Returns whether the specified key should remove the menu. Depends on the side the parent is on. */\n isEscapeKey(key: string): boolean {\n const { left } = this.props;\n return (\n key === 'Escape' ||\n (left < 0 && key === 'ArrowRight') ||\n key === 'ArrowLeft'\n );\n }\n\n handleKeyDown(e: React.KeyboardEvent<HTMLDivElement>): void {\n const { menuItems } = this.state;\n const oldFocus = this.getKeyboardIndex();\n let newFocus: number | null = oldFocus;\n let openSubMenu = false;\n\n if (e.key === 'Enter' || e.key === ' ') {\n if (oldFocus >= 0 && oldFocus < menuItems.length) {\n this.handleMenuItemClick(\n menuItems[oldFocus],\n (e as React.SyntheticEvent) as React.MouseEvent\n );\n }\n return;\n }\n\n if (e.key === 'ArrowRight') {\n if (oldFocus >= 0 && oldFocus <= menuItems.length) {\n openSubMenu = true;\n } else {\n newFocus = 0;\n }\n } else if (this.isEscapeKey(e.key)) {\n newFocus = null;\n } else if (e.key === 'ArrowUp' || (e.shiftKey && e.key === 'Tab')) {\n newFocus = ContextActionUtils.getNextMenuItem(newFocus, -1, menuItems);\n } else if (e.key === 'ArrowDown' || e.key === 'Tab') {\n newFocus = ContextActionUtils.getNextMenuItem(newFocus, 1, menuItems);\n }\n\n if (openSubMenu) {\n this.openSubMenu(oldFocus);\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n if (oldFocus !== newFocus) {\n if (newFocus !== null) {\n this.setKeyboardIndex(newFocus);\n } else {\n this.closeMenu();\n if (this.oldFocus instanceof HTMLElement) {\n this.oldFocus.focus();\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n openSubMenu(index: number): void {\n const { menuItems, activeSubMenu } = this.state;\n const newSubMenu = menuItems[index].actions ? index : null;\n if (activeSubMenu === newSubMenu) return;\n this.setState({\n activeSubMenu: newSubMenu,\n subMenuTop: null,\n subMenuLeft: null,\n });\n }\n\n closeMenu(closeAll = false): void {\n const { closeMenu, onMenuClosed } = this.props;\n cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n closeMenu(closeAll);\n onMenuClosed(this);\n });\n }\n\n closeSubMenu(): void {\n this.setState({\n activeSubMenu: null,\n });\n }\n\n handleCloseSubMenu(closeAllMenus: boolean): void {\n if (closeAllMenus) {\n this.closeMenu(true);\n } else {\n this.closeSubMenu();\n }\n }\n\n handleMenuItemClick(menuItem: ContextAction, e: React.MouseEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n const { menuItems } = this.state;\n if (menuItem != null && !menuItem.disabled) {\n if (menuItem.actions != null) {\n this.openSubMenu(menuItems.indexOf(menuItem));\n } else if (menuItem.action != null) {\n menuItem.action();\n this.closeMenu(true);\n }\n }\n }\n\n handleMenuItemContextMenu(\n menuItem: ContextAction,\n e: React.MouseEvent\n ): void {\n if (e.metaKey) {\n return;\n }\n\n this.handleMenuItemClick(menuItem, e);\n }\n\n handleMenuItemMouseMove(menuItem: ContextAction): void {\n const { menuItems } = this.state;\n const focusIndex = menuItems.indexOf(menuItem);\n this.setMouseIndex(focusIndex);\n\n if (\n focusIndex >= 0 &&\n focusIndex < menuItems.length &&\n !menuItem.disabled\n ) {\n this.openSubMenu(focusIndex);\n }\n }\n\n handleMouseLeave(): void {\n this.setMouseIndex(-1);\n }\n\n render(): JSX.Element {\n const menuItemElements = [];\n const { top, left } = this.props;\n const {\n activeSubMenu,\n hasOverflow,\n keyboardIndex,\n menuItems,\n mouseIndex,\n pendingItems,\n subMenuTop,\n subMenuLeft,\n subMenuParentWidth,\n subMenuParentHeight,\n } = this.state;\n for (let i = 0; i < menuItems.length; i += 1) {\n const menuItem = menuItems[i];\n\n if (i > 0 && menuItem.group !== menuItems[i - 1].group) {\n menuItemElements.push(<hr key={`${i}.separator`} />);\n }\n\n const menuItemElement = (\n <ContextMenuItem\n key={i}\n ref={activeSubMenu === i ? this.activeSubMenuRef : null}\n isKeyboardSelected={keyboardIndex === i}\n isMouseSelected={mouseIndex === i}\n menuItem={menuItem}\n closeMenu={this.handleCloseSubMenu}\n onMenuItemClick={this.handleMenuItemClick}\n onMenuItemMouseMove={this.handleMenuItemMouseMove}\n onMenuItemContextMenu={this.handleMenuItemContextMenu}\n />\n );\n\n menuItemElements.push(menuItemElement);\n }\n\n let pendingElement = null;\n if (pendingItems.length > 0) {\n pendingElement = (\n <div className=\"loading\">\n <LoadingSpinner />\n </div>\n );\n }\n\n const { menuStyle } = this.props;\n\n // don't show submenu until it has an position initialized\n const showSubmenu =\n activeSubMenu !== null && subMenuTop !== null && subMenuLeft !== null;\n\n return (\n <>\n <div\n className={classNames(\n { 'has-overflow': hasOverflow },\n 'context-menu-container'\n )}\n style={{ top, left, ...menuStyle }}\n ref={this.container}\n data-dh-context-menu\n onBlur={this.handleBlur}\n onKeyDown={this.handleKeyDown}\n onMouseLeave={this.handleMouseLeave}\n onContextMenu={ContextMenu.handleContextMenu}\n role=\"menuitem\"\n tabIndex={0}\n >\n {menuItemElements}\n {pendingElement}\n </div>\n {showSubmenu &&\n activeSubMenu !== null &&\n subMenuTop !== null &&\n subMenuLeft !== null && (\n <ContextMenu\n key={`sub-${activeSubMenu}`}\n actions={menuItems[activeSubMenu].actions || []}\n closeMenu={this.handleCloseSubMenu}\n top={subMenuTop}\n left={subMenuLeft}\n updatePosition={(verifiedTop, verifiedLeft) => {\n this.setState({\n subMenuTop: verifiedTop,\n subMenuLeft: verifiedLeft,\n });\n }}\n subMenuParentWidth={subMenuParentWidth}\n subMenuParentHeight={subMenuParentHeight}\n />\n )}\n </>\n );\n }\n}\n\nexport default ContextMenu;\n"],"file":"ContextMenu.js"}
|
|
1
|
+
{"version":3,"sources":["../../src/context-actions/ContextMenu.tsx"],"names":["React","PureComponent","classNames","Log","PromiseUtils","ContextActionUtils","ContextMenuItem","LoadingSpinner","log","module","ContextMenu","handleContextMenu","e","metaKey","stopPropagation","preventDefault","constructor","props","handleBlur","bind","handleCloseSubMenu","handleKeyDown","handleMenuItemClick","handleMenuItemContextMenu","handleMenuItemMouseMove","handleMouseLeave","handleWindowResize","container","createRef","oldFocus","document","activeElement","activeSubMenuRef","subMenuTimer","rAF","initialPosition","top","left","state","menuItems","pendingItems","activeSubMenu","hasOverflow","subMenuTop","subMenuLeft","subMenuParentWidth","subMenuParentHeight","keyboardIndex","mouseIndex","componentDidMount","initMenu","verifyPosition","window","addEventListener","requestAnimationFrame","current","focus","onMenuOpened","componentDidUpdate","prevProps","prevState","actions","setActiveSubMenuPosition","contains","componentWillUnmount","cancelPromises","removeEventListener","cancelAnimationFrame","getKeyboardIndex","options","separateKeyboardMouse","getMouseIndex","setKeyboardIndex","index","setState","setMouseIndex","initialKeyboardIndex","undefined","getMenuItems","nonPromiseItems","i","length","menuItem","Promise","initMenuPromise","push","sortActions","promise","cancellablePromise","makeCancelable","concat","then","resolvedMenuItems","indexOf","slice","splice","error","isCanceled","map","item","cancel","parentRect","getBoundingClientRect","right","height","width","updatePosition","oldTop","oldLeft","doNotVerifyPosition","scrollHeight","innerHeight","innerWidth","closeMenu","warn","relatedTarget","element","isContextMenuChild","hasAttribute","parentElement","isEscapeKey","key","newFocus","openSubMenu","shiftKey","getNextMenuItem","HTMLElement","newSubMenu","closeAll","onMenuClosed","closeSubMenu","closeAllMenus","disabled","action","focusIndex","render","menuItemElements","group","menuItemElement","pendingElement","menuStyle","dataTestId","showSubmenu","verifiedTop","verifiedLeft"],"mappings":"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","sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils, CancelablePromise } from '@deephaven/utils';\nimport ContextActionUtils, {\n ContextAction,\n ResolvableContextAction,\n} from './ContextActionUtils';\nimport ContextMenuItem from './ContextMenuItem';\nimport LoadingSpinner from '../LoadingSpinner';\n\nconst log = Log.module('ContextMenu');\n\ninterface ContextMenuProps {\n top: number;\n left: number;\n updatePosition(top: number, left: number): void;\n // only submenus will have these, defaults to 0 otherwise\n // represents the width height of the parent menu item\n subMenuParentWidth: number;\n subMenuParentHeight: number;\n actions: ResolvableContextAction[];\n closeMenu(closeAll: boolean): void;\n onMenuClosed(menu: ContextMenu): void;\n onMenuOpened(menu: ContextMenu): void;\n options: {\n doNotVerifyPosition?: boolean;\n separateKeyboardMouse?: boolean;\n initialKeyboardIndex?: number;\n };\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n}\n\ninterface ContextMenuState {\n menuItems: ContextAction[];\n pendingItems: CancelablePromise<ContextAction[]>[];\n activeSubMenu: number | null;\n hasOverflow: boolean;\n subMenuTop: number | null;\n subMenuLeft: number | null;\n subMenuParentWidth: number;\n subMenuParentHeight: number;\n keyboardIndex: number;\n mouseIndex: number;\n}\n\n/** Do not use this class directly. Use ContextMenuRoot and ContextActions instead. */\nclass ContextMenu extends PureComponent<ContextMenuProps, ContextMenuState> {\n static defaultProps = {\n subMenuParentWidth: 0,\n subMenuParentHeight: 0,\n closeMenu(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n onMenuClosed(): void {\n // no-op\n },\n options: {},\n menuStyle: {},\n 'data-testid': undefined,\n };\n\n static handleContextMenu(e: React.MouseEvent): void {\n if (e.metaKey) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n }\n\n constructor(props: ContextMenuProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleCloseSubMenu = this.handleCloseSubMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleMenuItemContextMenu = this.handleMenuItemContextMenu.bind(this);\n this.handleMenuItemMouseMove = this.handleMenuItemMouseMove.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleWindowResize = this.handleWindowResize.bind(this);\n\n this.container = React.createRef();\n this.oldFocus = document.activeElement;\n this.activeSubMenuRef = React.createRef();\n this.subMenuTimer = 0;\n this.rAF = 0;\n\n this.initialPosition = { top: props.top, left: props.left };\n\n this.state = {\n menuItems: [],\n pendingItems: [],\n activeSubMenu: null,\n hasOverflow: false,\n subMenuTop: null,\n subMenuLeft: null,\n subMenuParentWidth: 0,\n subMenuParentHeight: 0,\n keyboardIndex: -1,\n mouseIndex: -1,\n };\n }\n\n componentDidMount(): void {\n this.initMenu();\n\n this.verifyPosition();\n\n window.addEventListener('resize', this.handleWindowResize);\n\n // rAF is needed to wait for a submenus popper to be created before\n // attempting to set focus, however on a quick mount/unmount when\n // mousing past an item, the submenu could be unmounted before the\n // async rAF finishes, so it is cancelled in willUnmount()\n this.rAF = window.requestAnimationFrame(() => {\n this.container.current?.focus();\n\n const { onMenuOpened } = this.props;\n onMenuOpened(this);\n });\n }\n\n componentDidUpdate(\n prevProps: ContextMenuProps,\n prevState: ContextMenuState\n ): void {\n const { actions } = this.props;\n const { activeSubMenu } = this.state;\n\n if (activeSubMenu !== prevState.activeSubMenu) {\n if (activeSubMenu == null) {\n // close sub menu, refocus parent menu\n this.container.current?.focus();\n } else {\n // open sub menu, set its initial position\n this.setActiveSubMenuPosition();\n }\n }\n\n if (prevProps.actions !== actions) {\n this.initMenu();\n\n if (!this.container.current?.contains(document.activeElement)) {\n this.container.current?.focus();\n }\n }\n\n this.verifyPosition();\n }\n\n componentWillUnmount(): void {\n this.cancelPromises();\n window.removeEventListener('resize', this.handleWindowResize);\n cancelAnimationFrame(this.rAF);\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n oldFocus: Element | null;\n\n activeSubMenuRef: React.RefObject<HTMLDivElement>;\n\n subMenuTimer: number;\n\n rAF: number;\n\n initialPosition: { top: number; left: number };\n\n getKeyboardIndex(): number {\n const { options } = this.props;\n if (options.separateKeyboardMouse) {\n const { keyboardIndex } = this.state;\n return keyboardIndex;\n }\n\n return this.getMouseIndex();\n }\n\n setKeyboardIndex(index: number): void {\n const { options } = this.props;\n if (options.separateKeyboardMouse) {\n this.setState({ keyboardIndex: index });\n } else {\n this.setMouseIndex(index);\n }\n }\n\n getMouseIndex(): number {\n const { mouseIndex } = this.state;\n return mouseIndex;\n }\n\n setMouseIndex(index: number): void {\n this.setState({ mouseIndex: index });\n }\n\n initMenu(): void {\n // cancel any pending close and promises\n this.cancelPromises();\n cancelAnimationFrame(this.rAF);\n\n const { options } = this.props;\n let keyboardIndex = options.initialKeyboardIndex;\n if (keyboardIndex === undefined) {\n keyboardIndex = -1;\n }\n\n const { actions } = this.props;\n const menuItems = ContextActionUtils.getMenuItems(actions);\n const nonPromiseItems: ContextAction[] = [];\n for (let i = menuItems.length - 1; i >= 0; i -= 1) {\n const menuItem = menuItems[i];\n if (menuItem instanceof Promise) {\n this.initMenuPromise(menuItem as Promise<ContextAction[]>);\n } else {\n nonPromiseItems.push(menuItem as ContextAction);\n }\n }\n\n this.setState({\n mouseIndex: -1,\n keyboardIndex,\n activeSubMenu: null,\n menuItems: ContextActionUtils.sortActions(nonPromiseItems),\n });\n }\n\n initMenuPromise(promise: Promise<ContextAction[]>): void {\n // make all promises cancellable\n const cancellablePromise = PromiseUtils.makeCancelable(promise);\n\n this.setState(state => ({\n pendingItems: state.pendingItems.concat(cancellablePromise),\n }));\n\n cancellablePromise.then(\n resolvedMenuItems => {\n this.setState(state => {\n const index = state.pendingItems.indexOf(cancellablePromise);\n if (index >= 0) {\n const pendingItems = state.pendingItems.slice();\n pendingItems.splice(index, 1);\n\n return {\n menuItems: ContextActionUtils.sortActions(\n state.menuItems.concat(resolvedMenuItems)\n ),\n pendingItems,\n };\n }\n // This item is stale, don't update the menu\n return null;\n });\n },\n error => {\n if (PromiseUtils.isCanceled(error)) {\n return; // Canceled promise is ignored\n }\n\n // remove failed item from pending list\n this.setState(state => {\n const index = state.pendingItems.indexOf(cancellablePromise);\n if (index >= 0) {\n const pendingItems = state.pendingItems.slice();\n pendingItems.splice(index, 1);\n return {\n pendingItems,\n };\n }\n return null;\n });\n\n // Log the error\n log.error(error);\n }\n );\n }\n\n cancelPromises(): void {\n const { pendingItems } = this.state;\n pendingItems.map(item => item.cancel());\n }\n\n /**\n * Sets the unverfied start position of a submenu. Submenu then self-verfies\n * its own position and potentially reports back a new position.\n */\n setActiveSubMenuPosition(): void {\n if (this.activeSubMenuRef.current === null) return;\n const parentRect = this.activeSubMenuRef.current.getBoundingClientRect();\n\n // intentionally rect.right, we want the sub menu to start at the right edge of the current menu\n this.setState({\n subMenuTop: parentRect.top,\n subMenuLeft: parentRect.right,\n subMenuParentHeight: parentRect.height,\n subMenuParentWidth: parentRect.width,\n });\n }\n\n /**\n * Verifies the position of this menu in relation to the parent to make sure it's on screen.\n * Will update the top left state (updatePosition) if necessary (causing a re-render)\n * By default it tries to top-align with parent, at the right side of the parent.\n * Because we aren't a native context menu and can't escape window bounds, we also do\n * somethings to better fit on screen, such as the \"nudge\" offset position, and further\n * allow overflow scrolling for large menus in a small window.\n */\n verifyPosition(): void {\n const {\n options,\n updatePosition,\n subMenuParentWidth,\n subMenuParentHeight,\n top: oldTop,\n left: oldLeft,\n } = this.props;\n\n if (!this.container.current || options.doNotVerifyPosition) {\n return;\n }\n\n // initial position is used rather than current position,\n // as the number of menu items can change (actions can bubble)\n // and menu should always be positioned relative to spawn point\n let { top, left } = this.initialPosition;\n const {\n width,\n height,\n } = this.container.current?.getBoundingClientRect() ?? {\n width: 0,\n height: 0,\n };\n const hasOverflow =\n (this.container.current?.scrollHeight ?? 0) > window.innerHeight;\n\n if (height === 0 || width === 0) {\n // We don't have a height or width yet, don't bother doing anything\n return;\n }\n\n // does it fit below?\n if (top + height > window.innerHeight) {\n // can it be flipped to above? include offset if submenu (defaults to 0 if not submenu)\n if (top - height - subMenuParentHeight > 0) {\n // flip like a native menu would\n top -= height - subMenuParentHeight;\n } else {\n // still doesnt fit? okay, position at bottom edge\n top = window.innerHeight - height;\n }\n }\n\n if (left + width > window.innerWidth) {\n // less picky about left right positioning, just keep it going off to right\n left = left - width - subMenuParentWidth;\n }\n\n if (oldLeft !== left || oldTop !== top) {\n // parent owns positioning as single source of truth, ask to update props\n this.setState({ hasOverflow });\n updatePosition(top, left);\n }\n }\n\n // since window resize doesn't trigger blur, listen and close the menu\n handleWindowResize(): void {\n if (!this.container.current) {\n return;\n }\n this.closeMenu(true);\n }\n\n handleBlur(e: React.FocusEvent<HTMLDivElement>): void {\n if (!this.container.current) {\n log.warn('Container is null!');\n return;\n }\n\n if (!this.container.current.contains(e.relatedTarget as Node)) {\n let element: HTMLElement | null = e.relatedTarget as HTMLElement;\n let isContextMenuChild = false;\n while (element && !isContextMenuChild) {\n isContextMenuChild = element.hasAttribute('data-dh-context-menu');\n element = element.parentElement;\n }\n\n if (!isContextMenuChild) {\n // close all submenus on blur\n this.closeMenu(true);\n }\n }\n }\n\n /** Returns whether the specified key should remove the menu. Depends on the side the parent is on. */\n isEscapeKey(key: string): boolean {\n const { left } = this.props;\n return (\n key === 'Escape' ||\n (left < 0 && key === 'ArrowRight') ||\n key === 'ArrowLeft'\n );\n }\n\n handleKeyDown(e: React.KeyboardEvent<HTMLDivElement>): void {\n const { menuItems } = this.state;\n const oldFocus = this.getKeyboardIndex();\n let newFocus: number | null = oldFocus;\n let openSubMenu = false;\n\n if (e.key === 'Enter' || e.key === ' ') {\n if (oldFocus >= 0 && oldFocus < menuItems.length) {\n this.handleMenuItemClick(\n menuItems[oldFocus],\n (e as React.SyntheticEvent) as React.MouseEvent\n );\n }\n return;\n }\n\n if (e.key === 'ArrowRight') {\n if (oldFocus >= 0 && oldFocus <= menuItems.length) {\n openSubMenu = true;\n } else {\n newFocus = 0;\n }\n } else if (this.isEscapeKey(e.key)) {\n newFocus = null;\n } else if (e.key === 'ArrowUp' || (e.shiftKey && e.key === 'Tab')) {\n newFocus = ContextActionUtils.getNextMenuItem(newFocus, -1, menuItems);\n } else if (e.key === 'ArrowDown' || e.key === 'Tab') {\n newFocus = ContextActionUtils.getNextMenuItem(newFocus, 1, menuItems);\n }\n\n if (openSubMenu) {\n this.openSubMenu(oldFocus);\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n if (oldFocus !== newFocus) {\n if (newFocus !== null) {\n this.setKeyboardIndex(newFocus);\n } else {\n this.closeMenu();\n if (this.oldFocus instanceof HTMLElement) {\n this.oldFocus.focus();\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n openSubMenu(index: number): void {\n const { menuItems, activeSubMenu } = this.state;\n const newSubMenu = menuItems[index].actions ? index : null;\n if (activeSubMenu === newSubMenu) return;\n this.setState({\n activeSubMenu: newSubMenu,\n subMenuTop: null,\n subMenuLeft: null,\n });\n }\n\n closeMenu(closeAll = false): void {\n const { closeMenu, onMenuClosed } = this.props;\n cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n closeMenu(closeAll);\n onMenuClosed(this);\n });\n }\n\n closeSubMenu(): void {\n this.setState({\n activeSubMenu: null,\n });\n }\n\n handleCloseSubMenu(closeAllMenus: boolean): void {\n if (closeAllMenus) {\n this.closeMenu(true);\n } else {\n this.closeSubMenu();\n }\n }\n\n handleMenuItemClick(menuItem: ContextAction, e: React.MouseEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n const { menuItems } = this.state;\n if (menuItem != null && !menuItem.disabled) {\n if (menuItem.actions != null) {\n this.openSubMenu(menuItems.indexOf(menuItem));\n } else if (menuItem.action != null) {\n menuItem.action();\n this.closeMenu(true);\n }\n }\n }\n\n handleMenuItemContextMenu(\n menuItem: ContextAction,\n e: React.MouseEvent\n ): void {\n if (e.metaKey) {\n return;\n }\n\n this.handleMenuItemClick(menuItem, e);\n }\n\n handleMenuItemMouseMove(menuItem: ContextAction): void {\n const { menuItems } = this.state;\n const focusIndex = menuItems.indexOf(menuItem);\n this.setMouseIndex(focusIndex);\n\n if (\n focusIndex >= 0 &&\n focusIndex < menuItems.length &&\n !menuItem.disabled\n ) {\n this.openSubMenu(focusIndex);\n }\n }\n\n handleMouseLeave(): void {\n this.setMouseIndex(-1);\n }\n\n render(): JSX.Element {\n const menuItemElements = [];\n const { top, left } = this.props;\n const {\n activeSubMenu,\n hasOverflow,\n keyboardIndex,\n menuItems,\n mouseIndex,\n pendingItems,\n subMenuTop,\n subMenuLeft,\n subMenuParentWidth,\n subMenuParentHeight,\n } = this.state;\n for (let i = 0; i < menuItems.length; i += 1) {\n const menuItem = menuItems[i];\n\n if (i > 0 && menuItem.group !== menuItems[i - 1].group) {\n menuItemElements.push(<hr key={`${i}.separator`} />);\n }\n\n const menuItemElement = (\n <ContextMenuItem\n key={i}\n ref={activeSubMenu === i ? this.activeSubMenuRef : null}\n isKeyboardSelected={keyboardIndex === i}\n isMouseSelected={mouseIndex === i}\n menuItem={menuItem}\n closeMenu={this.handleCloseSubMenu}\n onMenuItemClick={this.handleMenuItemClick}\n onMenuItemMouseMove={this.handleMenuItemMouseMove}\n onMenuItemContextMenu={this.handleMenuItemContextMenu}\n />\n );\n\n menuItemElements.push(menuItemElement);\n }\n\n let pendingElement = null;\n if (pendingItems.length > 0) {\n pendingElement = (\n <div className=\"loading\">\n <LoadingSpinner />\n </div>\n );\n }\n\n const { menuStyle, 'data-testid': dataTestId } = this.props;\n\n // don't show submenu until it has an position initialized\n const showSubmenu =\n activeSubMenu !== null && subMenuTop !== null && subMenuLeft !== null;\n\n return (\n <>\n <div\n className={classNames(\n { 'has-overflow': hasOverflow },\n 'context-menu-container'\n )}\n style={{ top, left, ...menuStyle }}\n ref={this.container}\n data-dh-context-menu\n onBlur={this.handleBlur}\n onKeyDown={this.handleKeyDown}\n onMouseLeave={this.handleMouseLeave}\n onContextMenu={ContextMenu.handleContextMenu}\n role=\"menuitem\"\n tabIndex={0}\n data-testid={dataTestId}\n >\n {menuItemElements}\n {pendingElement}\n </div>\n {showSubmenu &&\n activeSubMenu !== null &&\n subMenuTop !== null &&\n subMenuLeft !== null && (\n <ContextMenu\n key={`sub-${activeSubMenu}`}\n actions={menuItems[activeSubMenu].actions || []}\n closeMenu={this.handleCloseSubMenu}\n top={subMenuTop}\n left={subMenuLeft}\n updatePosition={(verifiedTop, verifiedLeft) => {\n this.setState({\n subMenuTop: verifiedTop,\n subMenuLeft: verifiedLeft,\n });\n }}\n subMenuParentWidth={subMenuParentWidth}\n subMenuParentHeight={subMenuParentHeight}\n />\n )}\n </>\n );\n }\n}\n\nexport default ContextMenu;\n"],"file":"ContextMenu.js"}
|
|
@@ -9,6 +9,7 @@ interface ContextMenuItemProps {
|
|
|
9
9
|
onMenuItemClick(item: ContextAction, e: React.MouseEvent): void;
|
|
10
10
|
onMenuItemMouseMove(item: ContextAction, e: React.MouseEvent): void;
|
|
11
11
|
onMenuItemContextMenu(item: ContextAction, e: React.MouseEvent): void;
|
|
12
|
+
'data-testid'?: string;
|
|
12
13
|
}
|
|
13
14
|
declare const ContextMenuItem: React.ForwardRefExoticComponent<ContextMenuItemProps & React.RefAttributes<HTMLDivElement>>;
|
|
14
15
|
export default ContextMenuItem;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenuItem.d.ts","sourceRoot":"","sources":["../../src/context-actions/ContextMenuItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;IAChE,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;IACpE,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ContextMenuItem.d.ts","sourceRoot":"","sources":["../../src/context-actions/ContextMenuItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;IAChE,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;IACpE,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,QAAA,MAAM,eAAe,6FAkIpB,CAAC;AAWF,eAAe,eAAe,CAAC"}
|
|
@@ -39,7 +39,8 @@ var ContextMenuItem = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
39
39
|
closeMenu,
|
|
40
40
|
menuItem,
|
|
41
41
|
isKeyboardSelected,
|
|
42
|
-
isMouseSelected
|
|
42
|
+
isMouseSelected,
|
|
43
|
+
'data-testid': dataTestId
|
|
43
44
|
} = props;
|
|
44
45
|
var forwardedProps = {
|
|
45
46
|
menuItem,
|
|
@@ -47,7 +48,8 @@ var ContextMenuItem = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
47
48
|
isKeyboardSelected,
|
|
48
49
|
isMouseSelected,
|
|
49
50
|
iconElement,
|
|
50
|
-
displayShortcut
|
|
51
|
+
displayShortcut,
|
|
52
|
+
'data-testid': dataTestId
|
|
51
53
|
};
|
|
52
54
|
return /*#__PURE__*/React.cloneElement(element, {
|
|
53
55
|
forwardedProps
|
|
@@ -58,7 +60,8 @@ var ContextMenuItem = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
58
60
|
children,
|
|
59
61
|
menuItem,
|
|
60
62
|
isKeyboardSelected,
|
|
61
|
-
isMouseSelected
|
|
63
|
+
isMouseSelected,
|
|
64
|
+
'data-testid': dataTestId
|
|
62
65
|
} = props;
|
|
63
66
|
var displayShortcut = (_menuItem$shortcut = menuItem.shortcut) === null || _menuItem$shortcut === void 0 ? void 0 : _menuItem$shortcut.getDisplayText();
|
|
64
67
|
var icon = null;
|
|
@@ -135,14 +138,16 @@ var ContextMenuItem = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
135
138
|
|
|
136
139
|
return /*#__PURE__*/React.createElement("div", {
|
|
137
140
|
className: "context-menu-item",
|
|
138
|
-
ref: ref
|
|
141
|
+
ref: ref,
|
|
142
|
+
"data-testid": dataTestId
|
|
139
143
|
}, children, content);
|
|
140
144
|
});
|
|
141
145
|
ContextMenuItem.displayName = 'ContextMenuItem';
|
|
142
146
|
ContextMenuItem.defaultProps = {
|
|
143
147
|
children: null,
|
|
144
148
|
isKeyboardSelected: false,
|
|
145
|
-
isMouseSelected: false
|
|
149
|
+
isMouseSelected: false,
|
|
150
|
+
'data-testid': undefined
|
|
146
151
|
};
|
|
147
152
|
export default ContextMenuItem;
|
|
148
153
|
//# sourceMappingURL=ContextMenuItem.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/context-actions/ContextMenuItem.tsx"],"names":["React","classNames","FontAwesomeIcon","vsChevronRight","ContextMenuItem","forwardRef","props","ref","handleMenuItemClick","e","menuItem","onMenuItemClick","handleMenuItemMouseMove","onMenuItemMouseMove","handleMenuItemContextMenu","onMenuItemContextMenu","renderCustomMenuElement","element","iconElement","displayShortcut","type","closeMenu","isKeyboardSelected","isMouseSelected","forwardedProps","cloneElement","children","shortcut","getDisplayText","icon","menuItemIcon","isValidElement","style","iconColor","disabled","color","subMenuIndicator","isSubMenuActive","actions","content","menuElement","menuItemDisabled","iconHasOutline","iconOutline","active","description","outline","title","displayName","defaultProps"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SAASC,cAAT,QAA+C,kBAA/C;
|
|
1
|
+
{"version":3,"sources":["../../src/context-actions/ContextMenuItem.tsx"],"names":["React","classNames","FontAwesomeIcon","vsChevronRight","ContextMenuItem","forwardRef","props","ref","handleMenuItemClick","e","menuItem","onMenuItemClick","handleMenuItemMouseMove","onMenuItemMouseMove","handleMenuItemContextMenu","onMenuItemContextMenu","renderCustomMenuElement","element","iconElement","displayShortcut","type","closeMenu","isKeyboardSelected","isMouseSelected","dataTestId","forwardedProps","cloneElement","children","shortcut","getDisplayText","icon","menuItemIcon","isValidElement","style","iconColor","disabled","color","subMenuIndicator","isSubMenuActive","actions","content","menuElement","menuItemDisabled","iconHasOutline","iconOutline","active","description","outline","title","displayName","defaultProps","undefined"],"mappings":"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","sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsChevronRight, IconDefinition } from '@deephaven/icons';\nimport type { ContextAction } from './ContextActionUtils';\n\ninterface ContextMenuItemProps {\n children?: React.ReactNode;\n closeMenu(closeAll: boolean): void;\n isKeyboardSelected?: boolean;\n isMouseSelected?: boolean;\n menuItem: ContextAction;\n onMenuItemClick(item: ContextAction, e: React.MouseEvent): void;\n onMenuItemMouseMove(item: ContextAction, e: React.MouseEvent): void;\n onMenuItemContextMenu(item: ContextAction, e: React.MouseEvent): void;\n 'data-testid'?: string;\n}\n\nconst ContextMenuItem = React.forwardRef<HTMLDivElement, ContextMenuItemProps>(\n (props: ContextMenuItemProps, ref) => {\n function handleMenuItemClick(e: React.MouseEvent) {\n const { menuItem, onMenuItemClick } = props;\n onMenuItemClick(menuItem, e);\n }\n\n function handleMenuItemMouseMove(e: React.MouseEvent) {\n const { menuItem, onMenuItemMouseMove } = props;\n onMenuItemMouseMove(menuItem, e);\n }\n\n function handleMenuItemContextMenu(e: React.MouseEvent) {\n const { menuItem, onMenuItemContextMenu } = props;\n onMenuItemContextMenu(menuItem, e);\n }\n\n function renderCustomMenuElement(\n element: React.ReactElement,\n iconElement: IconDefinition | React.ReactElement | null,\n displayShortcut: string | undefined\n ): JSX.Element {\n // Don't pass forwardedProps if menuElement is a native DOM node\n if (typeof element.type === 'string') {\n return element;\n }\n const {\n closeMenu,\n menuItem,\n isKeyboardSelected,\n isMouseSelected,\n 'data-testid': dataTestId,\n } = props;\n const forwardedProps = {\n menuItem,\n closeMenu,\n isKeyboardSelected,\n isMouseSelected,\n iconElement,\n displayShortcut,\n 'data-testid': dataTestId,\n };\n return React.cloneElement(element, {\n forwardedProps,\n });\n }\n\n const {\n children,\n menuItem,\n isKeyboardSelected,\n isMouseSelected,\n 'data-testid': dataTestId,\n } = props;\n\n const displayShortcut = menuItem.shortcut?.getDisplayText();\n let icon: IconDefinition | React.ReactElement | null = null;\n if (menuItem.icon) {\n const menuItemIcon = menuItem.icon;\n if (React.isValidElement(menuItemIcon)) {\n icon = menuItemIcon;\n } else {\n let style: React.CSSProperties | undefined;\n if (menuItem.iconColor && !menuItem.disabled) {\n style = { color: menuItem.iconColor };\n }\n icon = <FontAwesomeIcon icon={menuItemIcon} style={style} />;\n }\n }\n\n let subMenuIndicator = null;\n const isSubMenuActive = !!children;\n if (menuItem.actions) {\n subMenuIndicator = <FontAwesomeIcon icon={vsChevronRight} />;\n }\n let content = null;\n if (menuItem.menuElement) {\n content = (\n <div className=\"custom-menu-item\" onMouseMove={handleMenuItemMouseMove}>\n {renderCustomMenuElement(menuItem.menuElement, icon, displayShortcut)}\n </div>\n );\n } else {\n const menuItemDisabled = menuItem.disabled;\n const iconHasOutline = menuItem.iconOutline;\n content = (\n <button\n type=\"button\"\n className={classNames(\n 'btn-context-menu',\n { disabled: menuItemDisabled },\n {\n active: (isSubMenuActive || isMouseSelected) && !menuItemDisabled,\n },\n { 'keyboard-active': isKeyboardSelected && !menuItemDisabled }\n )}\n onClick={handleMenuItemClick}\n onMouseMove={handleMenuItemMouseMove}\n onContextMenu={handleMenuItemContextMenu}\n title={menuItem.description || ''}\n >\n <div className=\"btn-context-menu-wrapper\">\n <span className={classNames('icon', { outline: iconHasOutline })}>\n {icon}\n </span>\n <span className=\"title\">{menuItem.title}</span>\n {displayShortcut && (\n <span className=\"shortcut\">{displayShortcut}</span>\n )}\n {subMenuIndicator && (\n <span\n className={classNames('submenu-indicator', {\n disabled: menuItemDisabled,\n })}\n >\n {subMenuIndicator}\n </span>\n )}\n </div>\n </button>\n );\n }\n\n return (\n <div className=\"context-menu-item\" ref={ref} data-testid={dataTestId}>\n {children}\n {content}\n </div>\n );\n }\n);\n\nContextMenuItem.displayName = 'ContextMenuItem';\n\nContextMenuItem.defaultProps = {\n children: null,\n isKeyboardSelected: false,\n isMouseSelected: false,\n 'data-testid': undefined,\n};\n\nexport default ContextMenuItem;\n"],"file":"ContextMenuItem.js"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import React, { Component } from 'react';
|
|
2
2
|
import ContextMenu from './ContextMenu';
|
|
3
3
|
import { MenuItem } from './ContextActionUtils';
|
|
4
|
-
declare type ContextMenuRootProps = Record<string, never
|
|
4
|
+
declare type ContextMenuRootProps = Record<string, never> & {
|
|
5
|
+
'data-testid'?: string;
|
|
6
|
+
};
|
|
5
7
|
interface ContextMenuRootState {
|
|
6
8
|
actions: MenuItem[] | null;
|
|
7
9
|
left: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenuRoot.d.ts","sourceRoot":"","sources":["../../src/context-actions/ContextMenuRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAA2B,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEpE,aAAK,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ContextMenuRoot.d.ts","sourceRoot":"","sources":["../../src/context-actions/ContextMenuRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAA2B,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEpE,aAAK,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,UAAU,oBAAoB;IAC5B,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,cAAM,eAAgB,SAAQ,SAAS,CACrC,oBAAoB,EACpB,oBAAoB,CACrB;gBACa,KAAK,EAAE,oBAAoB;IAevC,iBAAiB,IAAI,IAAI;IASzB,oBAAoB,IAAI,IAAI;IAS5B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAE3C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAEvC,iBAAiB,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI;IA4DtC,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAMxC,MAAM,IAAI,GAAG,CAAC,OAAO;CA4BtB;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -112,6 +112,9 @@ class ContextMenuRoot extends Component {
|
|
|
112
112
|
|
|
113
113
|
render() {
|
|
114
114
|
var menu = null;
|
|
115
|
+
var {
|
|
116
|
+
'data-testid': dataTestId
|
|
117
|
+
} = this.props;
|
|
115
118
|
var {
|
|
116
119
|
actions,
|
|
117
120
|
top,
|
|
@@ -130,7 +133,8 @@ class ContextMenuRoot extends Component {
|
|
|
130
133
|
top: verifiedTop,
|
|
131
134
|
left: verifiedLeft
|
|
132
135
|
});
|
|
133
|
-
}
|
|
136
|
+
},
|
|
137
|
+
"data-testid": dataTestId
|
|
134
138
|
});
|
|
135
139
|
}
|
|
136
140
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/context-actions/ContextMenuRoot.tsx"],"names":["React","Component","classNames","ContextMenu","ContextActionUtils","ContextMenuRoot","constructor","props","handleMenuClose","bind","handleContextMenu","container","createRef","openMenu","state","actions","left","top","componentDidMount","current","parentElement","addEventListener","componentWillUnmount","removeEventListener","e","isContextActionEvent","metaKey","ctrlKey","contextActions","getMenuItems","parentRect","getBoundingClientRect","clientY","clientX","length","target","preventDefault","setState","element","document","elementFromPoint","mouseEvent","MouseEvent","bubbles","cancelable","dispatchEvent","menu","render","verifiedTop","verifiedLeft","active"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,SAAhB,QAAiC,OAAjC;AACA,OAAOC,UAAP,MAAuB,YAAvB;OACOC,W;OACAC,kB;;
|
|
1
|
+
{"version":3,"sources":["../../src/context-actions/ContextMenuRoot.tsx"],"names":["React","Component","classNames","ContextMenu","ContextActionUtils","ContextMenuRoot","constructor","props","handleMenuClose","bind","handleContextMenu","container","createRef","openMenu","state","actions","left","top","componentDidMount","current","parentElement","addEventListener","componentWillUnmount","removeEventListener","e","isContextActionEvent","metaKey","ctrlKey","contextActions","getMenuItems","parentRect","getBoundingClientRect","clientY","clientX","length","target","preventDefault","setState","element","document","elementFromPoint","mouseEvent","MouseEvent","bubbles","cancelable","dispatchEvent","menu","render","dataTestId","verifiedTop","verifiedLeft","active"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport classNames from 'classnames';\nimport ContextMenu from './ContextMenu';\nimport ContextActionUtils, { MenuItem } from './ContextActionUtils';\n\ntype ContextMenuRootProps = Record<string, never> & {\n 'data-testid'?: string;\n};\n\ninterface ContextMenuRootState {\n actions: MenuItem[] | null;\n left: number;\n top: number;\n}\n\n/**\n * Put at your root container, any contextmenu events that are unhandled in the root container will be handled by this\n */\nclass ContextMenuRoot extends Component<\n ContextMenuRootProps,\n ContextMenuRootState\n> {\n constructor(props: ContextMenuRootProps) {\n super(props);\n\n this.handleMenuClose = this.handleMenuClose.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.container = React.createRef();\n this.openMenu = React.createRef();\n\n this.state = {\n actions: null,\n left: 0,\n top: 0,\n };\n }\n\n componentDidMount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.addEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n }\n }\n\n componentWillUnmount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.removeEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n openMenu: React.RefObject<ContextMenu>;\n\n handleContextMenu(e: MouseEvent): void {\n if (!ContextActionUtils.isContextActionEvent(e)) {\n return;\n }\n\n if (!this.container.current) {\n return;\n }\n\n if (e.metaKey || e.ctrlKey) {\n // debug escape hatch to native menu\n return;\n }\n\n const contextActions = ContextActionUtils.getMenuItems(e.contextActions);\n\n const parentRect = this.container.current.getBoundingClientRect();\n const top = e.clientY - parentRect.top;\n const left = e.clientX - parentRect.left;\n\n if (contextActions.length === 0) {\n // This code path seems to only exist for Chrome on Mac\n // Mac appears to trigger contextmenu events on mousedown vs. mouseup on Windows\n // Mouseup on Windows triggers blur before contextmenu which effectively does what this path does\n if (e.target === this.container.current) {\n // re-emit right clicks that hit the context-root blocking layer\n e.preventDefault();\n\n // Set actions to null removes the menu\n // That allows a new menu to be opened on a different element so initial position is set properly\n // Otherwise the instance of this menu may be reused\n // A new contextmenu event is triggered on the element at the location the user clicked on the blocking layer\n this.setState({ actions: null }, () => {\n const element = document.elementFromPoint(left, top); // x y\n\n const mouseEvent = new MouseEvent('contextmenu', {\n clientX: e.clientX,\n clientY: e.clientY,\n bubbles: true,\n cancelable: true,\n });\n\n element?.dispatchEvent(mouseEvent);\n });\n return;\n }\n\n // target was a menu item\n return;\n }\n\n // new clicks, set actions\n e.preventDefault();\n this.setState({\n actions: contextActions,\n top,\n left,\n });\n }\n\n handleMenuClose(menu: ContextMenu): void {\n if (menu === this.openMenu.current) {\n this.setState({ actions: null });\n }\n }\n\n render(): JSX.Element {\n let menu = null;\n const { 'data-testid': dataTestId } = this.props;\n const { actions, top, left } = this.state;\n if (actions) {\n menu = (\n <ContextMenu\n ref={this.openMenu}\n actions={actions}\n onMenuClosed={this.handleMenuClose}\n top={top}\n left={left}\n updatePosition={(verifiedTop, verifiedLeft) => {\n this.setState({ top: verifiedTop, left: verifiedLeft });\n }}\n data-testid={dataTestId}\n />\n );\n }\n return (\n <div\n className={classNames('context-menu-root', { active: actions })}\n ref={this.container}\n >\n {menu}\n </div>\n );\n }\n}\n\nexport default ContextMenuRoot;\n"],"file":"ContextMenuRoot.js"}
|
|
@@ -2,6 +2,7 @@ import React, { Component } from 'react';
|
|
|
2
2
|
import type { ContextAction } from './ContextActionUtils';
|
|
3
3
|
interface GlobalContextActionsProps {
|
|
4
4
|
actions: ContextAction[];
|
|
5
|
+
'data-testid'?: string;
|
|
5
6
|
}
|
|
6
7
|
declare class GlobalContextActions extends Component<GlobalContextActionsProps> {
|
|
7
8
|
render(): React.ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalContextActions.d.ts","sourceRoot":"","sources":["../../src/context-actions/GlobalContextActions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,UAAU,yBAAyB;IACjC,OAAO,EAAE,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"GlobalContextActions.d.ts","sourceRoot":"","sources":["../../src/context-actions/GlobalContextActions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,UAAU,yBAAyB;IACjC,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,cAAM,oBAAqB,SAAQ,SAAS,CAAC,yBAAyB,CAAC;IACrE,MAAM,IAAI,KAAK,CAAC,SAAS;CAmB1B;AAED,eAAe,oBAAoB,CAAC"}
|
|
@@ -4,7 +4,8 @@ import GlobalContextAction from "./GlobalContextAction.js";
|
|
|
4
4
|
class GlobalContextActions extends Component {
|
|
5
5
|
render() {
|
|
6
6
|
var {
|
|
7
|
-
actions
|
|
7
|
+
actions,
|
|
8
|
+
'data-testid': dataTestId
|
|
8
9
|
} = this.props;
|
|
9
10
|
var actionElements = [];
|
|
10
11
|
|
|
@@ -17,7 +18,8 @@ class GlobalContextActions extends Component {
|
|
|
17
18
|
if (action.title || action.menuElement || shortcut) {
|
|
18
19
|
var actionElement = /*#__PURE__*/React.createElement(GlobalContextAction, {
|
|
19
20
|
key: "".concat(action.title, ".").concat(shortcut === null || shortcut === void 0 ? void 0 : shortcut.id),
|
|
20
|
-
action: action
|
|
21
|
+
action: action,
|
|
22
|
+
"data-testid": dataTestId
|
|
21
23
|
});
|
|
22
24
|
actionElements.push(actionElement);
|
|
23
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/context-actions/GlobalContextActions.tsx"],"names":["React","Component","GlobalContextAction","GlobalContextActions","render","actions","props","actionElements","i","length","action","shortcut","title","menuElement","actionElement","id","push"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,SAAhB,QAAiC,OAAjC;OACOC,mB;;
|
|
1
|
+
{"version":3,"sources":["../../src/context-actions/GlobalContextActions.tsx"],"names":["React","Component","GlobalContextAction","GlobalContextActions","render","actions","dataTestId","props","actionElements","i","length","action","shortcut","title","menuElement","actionElement","id","push"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,SAAhB,QAAiC,OAAjC;OACOC,mB;;AAQP,MAAMC,oBAAN,SAAmCF,SAAnC,CAAwE;AACtEG,EAAAA,MAAM,GAAoB;AACxB,QAAM;AAAEC,MAAAA,OAAF;AAAW,qBAAeC;AAA1B,QAAyC,KAAKC,KAApD;AACA,QAAMC,cAAc,GAAG,EAAvB;;AACA,SAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGJ,OAAO,CAACK,MAA5B,EAAoCD,CAAC,IAAI,CAAzC,EAA4C;AAC1C,UAAME,MAAM,GAAGN,OAAO,CAACI,CAAD,CAAtB;AACA,UAAM;AAAEG,QAAAA;AAAF,UAAeD,MAArB;;AACA,UAAIA,MAAM,CAACE,KAAP,IAAgBF,MAAM,CAACG,WAAvB,IAAsCF,QAA1C,EAAoD;AAClD,YAAMG,aAAa,gBACjB,oBAAC,mBAAD;AACE,UAAA,GAAG,YAAKJ,MAAM,CAACE,KAAZ,cAAqBD,QAArB,aAAqBA,QAArB,uBAAqBA,QAAQ,CAAEI,EAA/B,CADL;AAEE,UAAA,MAAM,EAAEL,MAFV;AAGE,yBAAaL;AAHf,UADF;AAOAE,QAAAA,cAAc,CAACS,IAAf,CAAoBF,aAApB;AACD;AACF;;AACD,WAAOP,cAAP;AACD;;AAnBqE;;AAsBxE,eAAeL,oBAAf","sourcesContent":["import React, { Component } from 'react';\nimport GlobalContextAction from './GlobalContextAction';\nimport type { ContextAction } from './ContextActionUtils';\n\ninterface GlobalContextActionsProps {\n actions: ContextAction[];\n 'data-testid'?: string;\n}\n\nclass GlobalContextActions extends Component<GlobalContextActionsProps> {\n render(): React.ReactNode {\n const { actions, 'data-testid': dataTestId } = this.props;\n const actionElements = [];\n for (let i = 0; i < actions.length; i += 1) {\n const action = actions[i];\n const { shortcut } = action;\n if (action.title || action.menuElement || shortcut) {\n const actionElement = (\n <GlobalContextAction\n key={`${action.title}.${shortcut?.id}`}\n action={action}\n data-testid={dataTestId}\n />\n );\n actionElements.push(actionElement);\n }\n }\n return actionElements;\n }\n}\n\nexport default GlobalContextActions;\n"],"file":"GlobalContextActions.js"}
|
|
@@ -47,6 +47,7 @@ declare type DropdownMenuProps = {
|
|
|
47
47
|
popperOptions: PopperOptions;
|
|
48
48
|
popperClassName: string;
|
|
49
49
|
menuStyle: React.CSSProperties;
|
|
50
|
+
'data-testid'?: string;
|
|
50
51
|
};
|
|
51
52
|
declare class DropdownMenu extends PureComponent<DropdownMenuProps> {
|
|
52
53
|
static defaultProps: {
|
|
@@ -57,6 +58,7 @@ declare class DropdownMenu extends PureComponent<DropdownMenuProps> {
|
|
|
57
58
|
popperOptions: {};
|
|
58
59
|
popperClassName: string;
|
|
59
60
|
menuStyle: {};
|
|
61
|
+
'data-testid': undefined;
|
|
60
62
|
};
|
|
61
63
|
constructor(props: DropdownMenuProps);
|
|
62
64
|
componentDidMount(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../src/menu-actions/DropdownMenu.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAa,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,qBAAqB,CAAC;AAE7B,aAAK,iBAAiB,GAAG;IAEvB,OAAO,EACH,CAAC,aAAa,GAAG;QAAE,OAAO,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC,GACrC,CAAC,aAAa,GAAG;QAAE,OAAO,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC,EAAE,CAAC;IAC5C,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,YAAY,IAAI,IAAI,CAAC;IACrB,YAAY,IAAI,IAAI,CAAC;IACrB,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../src/menu-actions/DropdownMenu.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAa,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,qBAAqB,CAAC;AAE7B,aAAK,iBAAiB,GAAG;IAEvB,OAAO,EACH,CAAC,aAAa,GAAG;QAAE,OAAO,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC,GACrC,CAAC,aAAa,GAAG;QAAE,OAAO,CAAC,EAAE,KAAK,CAAA;KAAE,CAAC,EAAE,CAAC;IAC5C,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,YAAY,IAAI,IAAI,CAAC;IACrB,YAAY,IAAI,IAAI,CAAC;IACrB,OAAO,EAAE,WAAW,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,cAAM,YAAa,SAAQ,aAAa,CAAC,iBAAiB,CAAC;IACzD,MAAM,CAAC,YAAY;;wBAED,IAAI;wBAGJ,IAAI;;;;;;MAQpB;gBAEU,KAAK,EAAE,iBAAiB;IAcpC,iBAAiB,IAAI,IAAI;IAazB,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAetD,oBAAoB,IAAI,IAAI;IAM5B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAE3C,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAEvB,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEhC,MAAM,EAAE,OAAO,CAAC;IAEhB,SAAS,IAAI,IAAI;IAIjB,QAAQ,IAAI,IAAI;IAOhB,cAAc,IAAI,IAAI;IAItB,WAAW,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI;IAO3B,eAAe,IAAI,IAAI;IAIvB,YAAY,IAAI,IAAI;IAOpB,MAAM,IAAI,GAAG,CAAC,OAAO;CAuCtB;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -142,7 +142,8 @@ class DropdownMenu extends PureComponent {
|
|
|
142
142
|
var {
|
|
143
143
|
actions,
|
|
144
144
|
onMenuOpened,
|
|
145
|
-
popperClassName
|
|
145
|
+
popperClassName,
|
|
146
|
+
'data-testid': dataTestId
|
|
146
147
|
} = this.props;
|
|
147
148
|
var {
|
|
148
149
|
menuStyle
|
|
@@ -159,7 +160,8 @@ class DropdownMenu extends PureComponent {
|
|
|
159
160
|
}, options);
|
|
160
161
|
return /*#__PURE__*/React.createElement("div", {
|
|
161
162
|
className: "menu-actions-listener",
|
|
162
|
-
ref: this.container
|
|
163
|
+
ref: this.container,
|
|
164
|
+
"data-testid": dataTestId
|
|
163
165
|
}, /*#__PURE__*/React.createElement(Popper, {
|
|
164
166
|
ref: this.popper,
|
|
165
167
|
options: popperOptions,
|
|
@@ -190,7 +192,8 @@ _defineProperty(DropdownMenu, "defaultProps", {
|
|
|
190
192
|
options: {},
|
|
191
193
|
popperOptions: {},
|
|
192
194
|
popperClassName: '',
|
|
193
|
-
menuStyle: {}
|
|
195
|
+
menuStyle: {},
|
|
196
|
+
'data-testid': undefined
|
|
194
197
|
});
|
|
195
198
|
|
|
196
199
|
export default DropdownMenu;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/menu-actions/DropdownMenu.tsx"],"names":["React","PureComponent","classNames","Popper","Menu","DropdownMenu","constructor","props","handleClick","bind","handleCloseMenu","handleExited","container","createRef","parent","popper","isOpen","componentDidMount","isShown","current","parentElement","addEventListener","openMenu","componentDidUpdate","prevProps","window","requestAnimationFrame","closeMenu","componentWillUnmount","removeEventListener","hide","show","scheduleUpdate","e","preventDefault","stopPropagation","onMenuClosed","render","actions","onMenuOpened","popperClassName","menuStyle","options","popperOptions","placement","separateKeyboardMouse"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAOA,KAAP,IAAgBC,aAAhB,QAAqC,OAArC;AACA,OAAOC,UAAP,MAAuB,YAAvB;SAESC,M;OACFC,I;;;
|
|
1
|
+
{"version":3,"sources":["../../src/menu-actions/DropdownMenu.tsx"],"names":["React","PureComponent","classNames","Popper","Menu","DropdownMenu","constructor","props","handleClick","bind","handleCloseMenu","handleExited","container","createRef","parent","popper","isOpen","componentDidMount","isShown","current","parentElement","addEventListener","openMenu","componentDidUpdate","prevProps","window","requestAnimationFrame","closeMenu","componentWillUnmount","removeEventListener","hide","show","scheduleUpdate","e","preventDefault","stopPropagation","onMenuClosed","render","actions","onMenuOpened","popperClassName","dataTestId","menuStyle","options","popperOptions","placement","separateKeyboardMouse","undefined"],"mappings":"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","sourcesContent":["/**\n * Add dropdown menu that you add onto any component.\n *\n * Similar to the context-actions package, accepts list of actions to create a dropdown menu.\n * Note: Does not support nested sub-menus.\n *\n * Usage:\n * let actions = [{\n * title: 'My Action',\n * action: () => { alert('My Action Clicked!') }\n * icon: faPrint, // Limited to FontAwesome icons for now.\n * shortcut: Shortcut, // Shortcut class instance\n * group: ContextActions.groups.default, // What group to group the context action with\n * order: null // Int where to order within group\n * }];\n *\n * Usage:\n * 1. Auto bind click to open event to parent\n * <div>\n * Click in this container\n * <DropdownMenu actions={actions}/>\n * </div>\n *\n * 2. Control via prop\n * <div>\n * DropdownMenu will not react to the click event if isShown prop is used\n * <DropdownMenu actions={actions} isShown={isShown} />\n * </div>\n *\n */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { PopperOptions } from 'popper.js';\nimport { Popper } from '../popper';\nimport Menu, { MenuOptions } from './Menu';\nimport { ContextAction } from '../context-actions/ContextActionUtils';\nimport './DropdownMenu.scss';\n\ntype DropdownMenuProps = {\n // Override to prevent nested lists\n actions:\n | (ContextAction & { actions?: never })\n | (ContextAction & { actions?: never })[];\n isShown: boolean | null;\n onMenuClosed(): void;\n onMenuOpened(): void;\n options: MenuOptions;\n popperOptions: PopperOptions;\n popperClassName: string;\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n};\n\nclass DropdownMenu extends PureComponent<DropdownMenuProps> {\n static defaultProps = {\n isShown: null,\n onMenuClosed(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n options: {},\n popperOptions: {},\n popperClassName: '',\n menuStyle: {},\n 'data-testid': undefined,\n };\n\n constructor(props: DropdownMenuProps) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleCloseMenu = this.handleCloseMenu.bind(this);\n this.handleExited = this.handleExited.bind(this);\n\n this.container = React.createRef();\n this.parent = null;\n this.popper = React.createRef();\n\n this.isOpen = false;\n }\n\n componentDidMount(): void {\n const { isShown } = this.props;\n\n if (isShown === null) {\n if (this.container.current?.parentElement) {\n this.parent = this.container.current.parentElement;\n this.parent.addEventListener('click', this.handleClick);\n }\n } else if (isShown) {\n this.openMenu();\n }\n }\n\n componentDidUpdate(prevProps: DropdownMenuProps): void {\n const { isShown } = this.props;\n\n if (prevProps.isShown !== isShown) {\n if (isShown) {\n // https://github.com/reactjs/react-transition-group/issues/382\n window.requestAnimationFrame(() => {\n this.openMenu();\n });\n } else {\n this.closeMenu();\n }\n }\n }\n\n componentWillUnmount(): void {\n if (this.parent) {\n this.parent.removeEventListener('click', this.handleClick);\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n parent: Element | null;\n\n popper: React.RefObject<Popper>;\n\n isOpen: boolean;\n\n closeMenu(): void {\n this.popper.current?.hide();\n }\n\n openMenu(): void {\n if (this.popper.current && !this.isOpen) {\n this.popper.current.show();\n this.isOpen = true;\n }\n }\n\n scheduleUpdate(): void {\n this.popper.current?.scheduleUpdate();\n }\n\n handleClick(e: Event): void {\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu();\n }\n\n handleCloseMenu(): void {\n this.closeMenu();\n }\n\n handleExited(): void {\n this.isOpen = false;\n\n const { onMenuClosed } = this.props;\n onMenuClosed();\n }\n\n render(): JSX.Element {\n const {\n actions,\n onMenuOpened,\n popperClassName,\n 'data-testid': dataTestId,\n } = this.props;\n const { menuStyle } = this.props;\n let { options, popperOptions } = this.props;\n popperOptions = { placement: 'bottom', ...popperOptions };\n options = {\n separateKeyboardMouse: true,\n ...options,\n };\n return (\n <div\n className=\"menu-actions-listener\"\n ref={this.container}\n data-testid={dataTestId}\n >\n <Popper\n ref={this.popper}\n options={popperOptions}\n className={classNames('menu-popper', popperClassName)}\n onExited={this.handleExited}\n closeOnBlur\n interactive\n >\n <Menu\n actions={actions}\n closeMenu={this.handleCloseMenu}\n onMenuOpened={onMenuOpened}\n options={options}\n menuStyle={menuStyle}\n />\n </Popper>\n </div>\n );\n }\n}\n\nexport default DropdownMenu;\n"],"file":"DropdownMenu.js"}
|
|
@@ -12,6 +12,7 @@ declare type MenuProps = {
|
|
|
12
12
|
onMenuOpened(menu: Menu): void;
|
|
13
13
|
options: MenuOptions;
|
|
14
14
|
menuStyle: React.CSSProperties;
|
|
15
|
+
'data-testid'?: string;
|
|
15
16
|
};
|
|
16
17
|
declare type MenuState = {
|
|
17
18
|
menuItems: ContextAction[];
|
|
@@ -33,6 +34,7 @@ declare class Menu extends PureComponent<MenuProps, MenuState> {
|
|
|
33
34
|
onMenuClosed(): void;
|
|
34
35
|
options: {};
|
|
35
36
|
menuStyle: {};
|
|
37
|
+
'data-testid': undefined;
|
|
36
38
|
};
|
|
37
39
|
constructor(props: MenuProps);
|
|
38
40
|
componentDidMount(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../src/menu-actions/Menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC7C,OAA2B,EACzB,aAAa,EACd,MAAM,uCAAuC,CAAC;AAG/C,oBAAY,WAAW,GAAG;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,aAAK,SAAS,GAAG;IACf,OAAO,EAAE,aAAa,GAAG,aAAa,EAAE,CAAC;IACzC,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC/B,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../src/menu-actions/Menu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC7C,OAA2B,EACzB,aAAa,EACd,MAAM,uCAAuC,CAAC;AAG/C,oBAAY,WAAW,GAAG;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,aAAK,SAAS,GAAG;IACf,OAAO,EAAE,aAAa,GAAG,aAAa,EAAE,CAAC;IACzC,SAAS,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC/B,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,KAAK,CAAC,aAAa,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,aAAK,SAAS,GAAG;IACf,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;GAOG;AAEH,cAAM,IAAK,SAAQ,aAAa,CAAC,SAAS,EAAE,SAAS,CAAC;IACpD,MAAM,CAAC,YAAY;qBACJ,IAAI;wBAGD,IAAI;wBAGJ,IAAI;;;;MAMpB;gBAEU,KAAK,EAAE,SAAS;IAuB5B,iBAAiB,IAAI,IAAI;IAYzB,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAO9C,oBAAoB,IAAI,IAAI;IAI5B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAE3C,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAEzB,GAAG,EAAE,MAAM,CAAC;IAEZ,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAUjC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASrC,aAAa,IAAI,MAAM;IAKvB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIlC,QAAQ,IAAI,IAAI;IAoBhB,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,IAAI;IAiD3C,SAAS,CAAC,QAAQ,UAAQ,GAAG,IAAI;IASjC,eAAe,IAAI,IAAI;IAIvB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,EAAE,KAAK,CAAC,cAAc,GAAG,IAAI;IAU3E,uBAAuB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAMtD,gBAAgB,IAAI,IAAI;IAIxB,MAAM,IAAI,GAAG,CAAC,OAAO;CA4CtB;AAED,eAAe,IAAI,CAAC"}
|
|
@@ -220,6 +220,9 @@ class Menu extends PureComponent {
|
|
|
220
220
|
|
|
221
221
|
render() {
|
|
222
222
|
var menuItemElements = [];
|
|
223
|
+
var {
|
|
224
|
+
'data-testid': dataTestId
|
|
225
|
+
} = this.props;
|
|
223
226
|
var {
|
|
224
227
|
keyboardIndex,
|
|
225
228
|
menuItems,
|
|
@@ -258,7 +261,8 @@ class Menu extends PureComponent {
|
|
|
258
261
|
onKeyDown: this.handleKeyDown,
|
|
259
262
|
onMouseLeave: this.handleMouseLeave,
|
|
260
263
|
role: "menuitem",
|
|
261
|
-
tabIndex: 0
|
|
264
|
+
tabIndex: 0,
|
|
265
|
+
"data-testid": dataTestId
|
|
262
266
|
}, menuItemElements);
|
|
263
267
|
}
|
|
264
268
|
|
|
@@ -275,7 +279,8 @@ _defineProperty(Menu, "defaultProps", {
|
|
|
275
279
|
},
|
|
276
280
|
|
|
277
281
|
options: {},
|
|
278
|
-
menuStyle: {}
|
|
282
|
+
menuStyle: {},
|
|
283
|
+
'data-testid': undefined
|
|
279
284
|
});
|
|
280
285
|
|
|
281
286
|
export default Menu;
|