@deephaven/components 0.5.2-beta.0 → 0.6.1-demo.10

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.
Files changed (119) hide show
  1. package/dist/AutoCompleteInput.js +410 -448
  2. package/dist/AutoCompleteInput.js.map +1 -1
  3. package/dist/AutoResizeTextarea.js +17 -46
  4. package/dist/AutoResizeTextarea.js.map +1 -1
  5. package/dist/BasicModal.js +18 -19
  6. package/dist/BasicModal.js.map +1 -1
  7. package/dist/Button.js +30 -21
  8. package/dist/Button.js.map +1 -1
  9. package/dist/ButtonGroup.js +6 -4
  10. package/dist/ButtonGroup.js.map +1 -1
  11. package/dist/ButtonOld.js +10 -8
  12. package/dist/ButtonOld.js.map +1 -1
  13. package/dist/CardFlip.js +10 -8
  14. package/dist/CardFlip.js.map +1 -1
  15. package/dist/Checkbox.js +18 -31
  16. package/dist/Checkbox.js.map +1 -1
  17. package/dist/Collapse.js +65 -105
  18. package/dist/Collapse.js.map +1 -1
  19. package/dist/ComboBox.js +432 -460
  20. package/dist/ComboBox.js.map +1 -1
  21. package/dist/CustomTimeSelect.js +485 -517
  22. package/dist/CustomTimeSelect.js.map +1 -1
  23. package/dist/DebouncedSearchInput.js +61 -91
  24. package/dist/DebouncedSearchInput.js.map +1 -1
  25. package/dist/DeephavenSpinner.js +6 -6
  26. package/dist/DeephavenSpinner.js.map +1 -1
  27. package/dist/DragUtils.js +65 -113
  28. package/dist/DragUtils.js.map +1 -1
  29. package/dist/DraggableItemList.d.ts +1 -0
  30. package/dist/DraggableItemList.d.ts.map +1 -1
  31. package/dist/DraggableItemList.js +219 -257
  32. package/dist/DraggableItemList.js.map +1 -1
  33. package/dist/HierarchicalCheckboxMenu.js +160 -227
  34. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  35. package/dist/ItemList.d.ts +4 -2
  36. package/dist/ItemList.d.ts.map +1 -1
  37. package/dist/ItemList.js +595 -598
  38. package/dist/ItemList.js.map +1 -1
  39. package/dist/ItemListItem.js +194 -215
  40. package/dist/ItemListItem.js.map +1 -1
  41. package/dist/LoadingOverlay.js +9 -10
  42. package/dist/LoadingOverlay.js.map +1 -1
  43. package/dist/LoadingSpinner.js +4 -3
  44. package/dist/LoadingSpinner.js.map +1 -1
  45. package/dist/MaskedInput.js +59 -70
  46. package/dist/MaskedInput.js.map +1 -1
  47. package/dist/Option.js +5 -3
  48. package/dist/Option.js.map +1 -1
  49. package/dist/RadioGroup.js +16 -34
  50. package/dist/RadioGroup.js.map +1 -1
  51. package/dist/RadioItem.js +14 -33
  52. package/dist/RadioItem.js.map +1 -1
  53. package/dist/SearchInput.js +42 -75
  54. package/dist/SearchInput.js.map +1 -1
  55. package/dist/Select.js +10 -8
  56. package/dist/Select.js.map +1 -1
  57. package/dist/SelectValueList.js +97 -134
  58. package/dist/SelectValueList.js.map +1 -1
  59. package/dist/SocketedButton.js +13 -11
  60. package/dist/SocketedButton.js.map +1 -1
  61. package/dist/ThemeExport.js.map +1 -1
  62. package/dist/TimeInput.js +16 -53
  63. package/dist/TimeInput.js.map +1 -1
  64. package/dist/TimeSlider.js +62 -88
  65. package/dist/TimeSlider.js.map +1 -1
  66. package/dist/ToastNotification.js +14 -13
  67. package/dist/ToastNotification.js.map +1 -1
  68. package/dist/UISwitch.js +9 -8
  69. package/dist/UISwitch.js.map +1 -1
  70. package/dist/context-actions/ContextActionUtils.js +173 -231
  71. package/dist/context-actions/ContextActionUtils.js.map +1 -1
  72. package/dist/context-actions/ContextActions.js +135 -177
  73. package/dist/context-actions/ContextActions.js.map +1 -1
  74. package/dist/context-actions/ContextMenu.js +509 -543
  75. package/dist/context-actions/ContextMenu.js.map +1 -1
  76. package/dist/context-actions/ContextMenuItem.js +32 -22
  77. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  78. package/dist/context-actions/ContextMenuRoot.js +112 -152
  79. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  80. package/dist/context-actions/GlobalContextAction.js +49 -84
  81. package/dist/context-actions/GlobalContextAction.js.map +1 -1
  82. package/dist/context-actions/GlobalContextActions.js +25 -57
  83. package/dist/context-actions/GlobalContextActions.js.map +1 -1
  84. package/dist/context-actions/index.js +4 -4
  85. package/dist/context-actions/index.js.map +1 -1
  86. package/dist/index.js +39 -39
  87. package/dist/index.js.map +1 -1
  88. package/dist/menu-actions/DropdownMenu.js +126 -159
  89. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  90. package/dist/menu-actions/Menu.js +215 -245
  91. package/dist/menu-actions/Menu.js.map +1 -1
  92. package/dist/menu-actions/index.js +1 -1
  93. package/dist/menu-actions/index.js.map +1 -1
  94. package/dist/navigation/Menu.js +14 -18
  95. package/dist/navigation/Menu.js.map +1 -1
  96. package/dist/navigation/MenuItem.js +15 -14
  97. package/dist/navigation/MenuItem.js.map +1 -1
  98. package/dist/navigation/Page.js +7 -5
  99. package/dist/navigation/Page.js.map +1 -1
  100. package/dist/navigation/Stack.js +14 -39
  101. package/dist/navigation/Stack.js.map +1 -1
  102. package/dist/navigation/index.js +4 -4
  103. package/dist/navigation/index.js.map +1 -1
  104. package/dist/popper/Popper.js +209 -235
  105. package/dist/popper/Popper.js.map +1 -1
  106. package/dist/popper/Tooltip.js +227 -257
  107. package/dist/popper/Tooltip.js.map +1 -1
  108. package/dist/popper/index.js +2 -2
  109. package/dist/popper/index.js.map +1 -1
  110. package/dist/shortcuts/GlobalShortcuts.js +2 -2
  111. package/dist/shortcuts/GlobalShortcuts.js.map +1 -1
  112. package/dist/shortcuts/Shortcut.js +263 -291
  113. package/dist/shortcuts/Shortcut.js.map +1 -1
  114. package/dist/shortcuts/ShortcutRegistry.js +48 -71
  115. package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
  116. package/dist/shortcuts/index.js +4 -4
  117. package/dist/shortcuts/index.js.map +1 -1
  118. package/dist/tsconfig.tsbuildinfo +1 -1
  119. package/package.json +30 -54
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/context-actions/ContextMenu.tsx"],"names":["React","PureComponent","classNames","Log","PromiseUtils","ContextActionUtils","ContextMenuItem","LoadingSpinner","log","module","ContextMenu","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","initMenu","verifyPosition","window","addEventListener","requestAnimationFrame","current","focus","onMenuOpened","prevProps","prevState","actions","setActiveSubMenuPosition","contains","cancelPromises","removeEventListener","cancelAnimationFrame","options","separateKeyboardMouse","getMouseIndex","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","e","warn","relatedTarget","element","isContextMenuChild","hasAttribute","parentElement","key","getKeyboardIndex","newFocus","openSubMenu","isEscapeKey","shiftKey","getNextMenuItem","preventDefault","stopPropagation","setKeyboardIndex","HTMLElement","newSubMenu","closeAll","onMenuClosed","closeAllMenus","closeSubMenu","disabled","action","metaKey","focusIndex","menuItemElements","group","menuItemElement","pendingElement","menuStyle","showSubmenu","handleContextMenu","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","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"}
@@ -2,24 +2,30 @@ import React from 'react';
2
2
  import classNames from 'classnames';
3
3
  import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
4
4
  import { vsChevronRight } from '@deephaven/icons';
5
- var ContextMenuItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
5
+ var ContextMenuItem = /*#__PURE__*/React.forwardRef((props, ref) => {
6
6
  var _menuItem$shortcut;
7
7
 
8
8
  function handleMenuItemClick(e) {
9
- var menuItem = props.menuItem,
10
- onMenuItemClick = props.onMenuItemClick;
9
+ var {
10
+ menuItem,
11
+ onMenuItemClick
12
+ } = props;
11
13
  onMenuItemClick(menuItem, e);
12
14
  }
13
15
 
14
16
  function handleMenuItemMouseMove(e) {
15
- var menuItem = props.menuItem,
16
- onMenuItemMouseMove = props.onMenuItemMouseMove;
17
+ var {
18
+ menuItem,
19
+ onMenuItemMouseMove
20
+ } = props;
17
21
  onMenuItemMouseMove(menuItem, e);
18
22
  }
19
23
 
20
24
  function handleMenuItemContextMenu(e) {
21
- var menuItem = props.menuItem,
22
- onMenuItemContextMenu = props.onMenuItemContextMenu;
25
+ var {
26
+ menuItem,
27
+ onMenuItemContextMenu
28
+ } = props;
23
29
  onMenuItemContextMenu(menuItem, e);
24
30
  }
25
31
 
@@ -29,27 +35,31 @@ var ContextMenuItem = /*#__PURE__*/React.forwardRef(function (props, ref) {
29
35
  return element;
30
36
  }
31
37
 
32
- var closeMenu = props.closeMenu,
33
- menuItem = props.menuItem,
34
- isKeyboardSelected = props.isKeyboardSelected,
35
- isMouseSelected = props.isMouseSelected;
38
+ var {
39
+ closeMenu,
40
+ menuItem,
41
+ isKeyboardSelected,
42
+ isMouseSelected
43
+ } = props;
36
44
  var forwardedProps = {
37
- menuItem: menuItem,
38
- closeMenu: closeMenu,
39
- isKeyboardSelected: isKeyboardSelected,
40
- isMouseSelected: isMouseSelected,
41
- iconElement: iconElement,
42
- displayShortcut: displayShortcut
45
+ menuItem,
46
+ closeMenu,
47
+ isKeyboardSelected,
48
+ isMouseSelected,
49
+ iconElement,
50
+ displayShortcut
43
51
  };
44
52
  return /*#__PURE__*/React.cloneElement(element, {
45
- forwardedProps: forwardedProps
53
+ forwardedProps
46
54
  });
47
55
  }
48
56
 
49
- var children = props.children,
50
- menuItem = props.menuItem,
51
- isKeyboardSelected = props.isKeyboardSelected,
52
- isMouseSelected = props.isMouseSelected;
57
+ var {
58
+ children,
59
+ menuItem,
60
+ isKeyboardSelected,
61
+ isMouseSelected
62
+ } = props;
53
63
  var displayShortcut = (_menuItem$shortcut = menuItem.shortcut) === null || _menuItem$shortcut === void 0 ? void 0 : _menuItem$shortcut.getDisplayText();
54
64
  var icon = null;
55
65
 
@@ -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":"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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}\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 } = props;\n const forwardedProps = {\n menuItem,\n closeMenu,\n isKeyboardSelected,\n isMouseSelected,\n iconElement,\n displayShortcut,\n };\n return React.cloneElement(element, {\n forwardedProps,\n });\n }\n\n const { children, menuItem, isKeyboardSelected, isMouseSelected } = 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}>\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};\n\nexport default ContextMenuItem;\n"],"file":"ContextMenuItem.js"}
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":"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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}\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 } = props;\n const forwardedProps = {\n menuItem,\n closeMenu,\n isKeyboardSelected,\n isMouseSelected,\n iconElement,\n displayShortcut,\n };\n return React.cloneElement(element, {\n forwardedProps,\n });\n }\n\n const { children, menuItem, isKeyboardSelected, isMouseSelected } = 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}>\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};\n\nexport default ContextMenuItem;\n"],"file":"ContextMenuItem.js"}
@@ -1,188 +1,148 @@
1
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
2
-
3
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
4
-
5
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
6
-
7
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
8
-
9
- function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
10
-
11
- function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
12
-
13
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
14
-
15
- function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
16
-
17
- function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
18
-
19
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
20
-
21
- function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
22
-
23
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
24
2
 
25
3
  import React, { Component } from 'react';
26
4
  import classNames from 'classnames';
27
- import ContextMenu from './ContextMenu';
28
- import ContextActionUtils from './ContextActionUtils';
5
+ import ContextMenu from "./ContextMenu.js";
6
+ import ContextActionUtils from "./ContextActionUtils.js";
29
7
 
30
8
  /**
31
9
  * Put at your root container, any contextmenu events that are unhandled in the root container will be handled by this
32
10
  */
33
- var ContextMenuRoot = /*#__PURE__*/function (_Component) {
34
- _inherits(ContextMenuRoot, _Component);
35
-
36
- var _super = _createSuper(ContextMenuRoot);
37
-
38
- function ContextMenuRoot(props) {
39
- var _this;
11
+ class ContextMenuRoot extends Component {
12
+ constructor(props) {
13
+ super(props);
40
14
 
41
- _classCallCheck(this, ContextMenuRoot);
15
+ _defineProperty(this, "container", void 0);
42
16
 
43
- _this = _super.call(this, props);
17
+ _defineProperty(this, "openMenu", void 0);
44
18
 
45
- _defineProperty(_assertThisInitialized(_this), "container", void 0);
46
-
47
- _defineProperty(_assertThisInitialized(_this), "openMenu", void 0);
48
-
49
- _this.handleMenuClose = _this.handleMenuClose.bind(_assertThisInitialized(_this));
50
- _this.handleContextMenu = _this.handleContextMenu.bind(_assertThisInitialized(_this));
51
- _this.container = /*#__PURE__*/React.createRef();
52
- _this.openMenu = /*#__PURE__*/React.createRef();
53
- _this.state = {
19
+ this.handleMenuClose = this.handleMenuClose.bind(this);
20
+ this.handleContextMenu = this.handleContextMenu.bind(this);
21
+ this.container = /*#__PURE__*/React.createRef();
22
+ this.openMenu = /*#__PURE__*/React.createRef();
23
+ this.state = {
54
24
  actions: null,
55
25
  left: 0,
56
26
  top: 0
57
27
  };
58
- return _this;
59
28
  }
60
29
 
61
- _createClass(ContextMenuRoot, [{
62
- key: "componentDidMount",
63
- value: function componentDidMount() {
64
- var _this$container$curre;
30
+ componentDidMount() {
31
+ var _this$container$curre;
65
32
 
66
- if ((_this$container$curre = this.container.current) !== null && _this$container$curre !== void 0 && _this$container$curre.parentElement) {
67
- this.container.current.parentElement.addEventListener('contextmenu', this.handleContextMenu);
68
- }
33
+ if ((_this$container$curre = this.container.current) !== null && _this$container$curre !== void 0 && _this$container$curre.parentElement) {
34
+ this.container.current.parentElement.addEventListener('contextmenu', this.handleContextMenu);
69
35
  }
70
- }, {
71
- key: "componentWillUnmount",
72
- value: function componentWillUnmount() {
73
- var _this$container$curre2;
74
-
75
- if ((_this$container$curre2 = this.container.current) !== null && _this$container$curre2 !== void 0 && _this$container$curre2.parentElement) {
76
- this.container.current.parentElement.removeEventListener('contextmenu', this.handleContextMenu);
77
- }
36
+ }
37
+
38
+ componentWillUnmount() {
39
+ var _this$container$curre2;
40
+
41
+ if ((_this$container$curre2 = this.container.current) !== null && _this$container$curre2 !== void 0 && _this$container$curre2.parentElement) {
42
+ this.container.current.parentElement.removeEventListener('contextmenu', this.handleContextMenu);
78
43
  }
79
- }, {
80
- key: "handleContextMenu",
81
- value: function handleContextMenu(e) {
82
- if (!ContextActionUtils.isContextActionEvent(e)) {
83
- return;
84
- }
44
+ }
85
45
 
86
- if (!this.container.current) {
87
- return;
88
- }
46
+ handleContextMenu(e) {
47
+ if (!ContextActionUtils.isContextActionEvent(e)) {
48
+ return;
49
+ }
89
50
 
90
- if (e.metaKey || e.ctrlKey) {
91
- // debug escape hatch to native menu
92
- return;
93
- }
94
-
95
- var contextActions = ContextActionUtils.getMenuItems(e.contextActions);
96
- var parentRect = this.container.current.getBoundingClientRect();
97
- var top = e.clientY - parentRect.top;
98
- var left = e.clientX - parentRect.left;
99
-
100
- if (contextActions.length === 0) {
101
- // This code path seems to only exist for Chrome on Mac
102
- // Mac appears to trigger contextmenu events on mousedown vs. mouseup on Windows
103
- // Mouseup on Windows triggers blur before contextmenu which effectively does what this path does
104
- if (e.target === this.container.current) {
105
- // re-emit right clicks that hit the context-root blocking layer
106
- e.preventDefault(); // Set actions to null removes the menu
107
- // That allows a new menu to be opened on a different element so initial position is set properly
108
- // Otherwise the instance of this menu may be reused
109
- // A new contextmenu event is triggered on the element at the location the user clicked on the blocking layer
51
+ if (!this.container.current) {
52
+ return;
53
+ }
110
54
 
111
- this.setState({
112
- actions: null
113
- }, function () {
114
- var element = document.elementFromPoint(left, top); // x y
115
-
116
- var mouseEvent = new MouseEvent('contextmenu', {
117
- clientX: e.clientX,
118
- clientY: e.clientY,
119
- bubbles: true,
120
- cancelable: true
121
- });
122
- element === null || element === void 0 ? void 0 : element.dispatchEvent(mouseEvent);
123
- });
124
- return;
125
- } // target was a menu item
55
+ if (e.metaKey || e.ctrlKey) {
56
+ // debug escape hatch to native menu
57
+ return;
58
+ }
126
59
 
60
+ var contextActions = ContextActionUtils.getMenuItems(e.contextActions);
61
+ var parentRect = this.container.current.getBoundingClientRect();
62
+ var top = e.clientY - parentRect.top;
63
+ var left = e.clientX - parentRect.left;
64
+
65
+ if (contextActions.length === 0) {
66
+ // This code path seems to only exist for Chrome on Mac
67
+ // Mac appears to trigger contextmenu events on mousedown vs. mouseup on Windows
68
+ // Mouseup on Windows triggers blur before contextmenu which effectively does what this path does
69
+ if (e.target === this.container.current) {
70
+ // re-emit right clicks that hit the context-root blocking layer
71
+ e.preventDefault(); // Set actions to null removes the menu
72
+ // That allows a new menu to be opened on a different element so initial position is set properly
73
+ // Otherwise the instance of this menu may be reused
74
+ // A new contextmenu event is triggered on the element at the location the user clicked on the blocking layer
127
75
 
76
+ this.setState({
77
+ actions: null
78
+ }, () => {
79
+ var element = document.elementFromPoint(left, top); // x y
80
+
81
+ var mouseEvent = new MouseEvent('contextmenu', {
82
+ clientX: e.clientX,
83
+ clientY: e.clientY,
84
+ bubbles: true,
85
+ cancelable: true
86
+ });
87
+ element === null || element === void 0 ? void 0 : element.dispatchEvent(mouseEvent);
88
+ });
128
89
  return;
129
- } // new clicks, set actions
90
+ } // target was a menu item
130
91
 
131
92
 
132
- e.preventDefault();
93
+ return;
94
+ } // new clicks, set actions
95
+
96
+
97
+ e.preventDefault();
98
+ this.setState({
99
+ actions: contextActions,
100
+ top,
101
+ left
102
+ });
103
+ }
104
+
105
+ handleMenuClose(menu) {
106
+ if (menu === this.openMenu.current) {
133
107
  this.setState({
134
- actions: contextActions,
135
- top: top,
136
- left: left
108
+ actions: null
137
109
  });
138
110
  }
139
- }, {
140
- key: "handleMenuClose",
141
- value: function handleMenuClose(menu) {
142
- if (menu === this.openMenu.current) {
143
- this.setState({
144
- actions: null
145
- });
146
- }
147
- }
148
- }, {
149
- key: "render",
150
- value: function render() {
151
- var _this2 = this;
152
-
153
- var menu = null;
154
- var _this$state = this.state,
155
- actions = _this$state.actions,
156
- top = _this$state.top,
157
- left = _this$state.left;
158
-
159
- if (actions) {
160
- menu = /*#__PURE__*/React.createElement(ContextMenu, {
161
- ref: this.openMenu,
162
- actions: actions,
163
- onMenuClosed: this.handleMenuClose,
164
- top: top,
165
- left: left,
166
- updatePosition: function updatePosition(verifiedTop, verifiedLeft) {
167
- _this2.setState({
168
- top: verifiedTop,
169
- left: verifiedLeft
170
- });
171
- }
172
- });
173
- }
174
-
175
- return /*#__PURE__*/React.createElement("div", {
176
- className: classNames('context-menu-root', {
177
- active: actions
178
- }),
179
- ref: this.container
180
- }, menu);
111
+ }
112
+
113
+ render() {
114
+ var menu = null;
115
+ var {
116
+ actions,
117
+ top,
118
+ left
119
+ } = this.state;
120
+
121
+ if (actions) {
122
+ menu = /*#__PURE__*/React.createElement(ContextMenu, {
123
+ ref: this.openMenu,
124
+ actions: actions,
125
+ onMenuClosed: this.handleMenuClose,
126
+ top: top,
127
+ left: left,
128
+ updatePosition: (verifiedTop, verifiedLeft) => {
129
+ this.setState({
130
+ top: verifiedTop,
131
+ left: verifiedLeft
132
+ });
133
+ }
134
+ });
181
135
  }
182
- }]);
183
136
 
184
- return ContextMenuRoot;
185
- }(Component);
137
+ return /*#__PURE__*/React.createElement("div", {
138
+ className: classNames('context-menu-root', {
139
+ active: actions
140
+ }),
141
+ ref: this.container
142
+ }, menu);
143
+ }
144
+
145
+ }
186
146
 
187
147
  export default ContextMenuRoot;
188
148
  //# sourceMappingURL=ContextMenuRoot.js.map