@deephaven/components 1.22.1-alpha-pivot-builder.0 → 1.22.2-alpha-pivot-builder.0

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 (241) hide show
  1. package/dist/AutoCompleteInput.js +41 -79
  2. package/dist/AutoCompleteInput.js.map +1 -1
  3. package/dist/AutoResizeTextarea.js +29 -13
  4. package/dist/AutoResizeTextarea.js.map +1 -1
  5. package/dist/BasicModal.js +17 -15
  6. package/dist/BasicModal.js.map +1 -1
  7. package/dist/BulkActionBar.js +3 -5
  8. package/dist/BulkActionBar.js.map +1 -1
  9. package/dist/Button.js +24 -25
  10. package/dist/Button.js.map +1 -1
  11. package/dist/CardFlip.js +4 -6
  12. package/dist/CardFlip.js.map +1 -1
  13. package/dist/Checkbox.js +22 -13
  14. package/dist/Checkbox.js.map +1 -1
  15. package/dist/Collapse.js +6 -9
  16. package/dist/Collapse.js.map +1 -1
  17. package/dist/CopyButton.js +14 -6
  18. package/dist/CopyButton.js.map +1 -1
  19. package/dist/CustomTimeSelect.js +49 -88
  20. package/dist/CustomTimeSelect.js.map +1 -1
  21. package/dist/DateInput.js +25 -10
  22. package/dist/DateInput.js.map +1 -1
  23. package/dist/DateInputUtils.js +1 -3
  24. package/dist/DateInputUtils.js.map +1 -1
  25. package/dist/DateTimeInput.js +28 -12
  26. package/dist/DateTimeInput.js.map +1 -1
  27. package/dist/DebouncedSearchInput.js +10 -19
  28. package/dist/DebouncedSearchInput.js.map +1 -1
  29. package/dist/DragUtils.js +15 -6
  30. package/dist/DragUtils.js.map +1 -1
  31. package/dist/DraggableItemList.js +42 -57
  32. package/dist/DraggableItemList.js.map +1 -1
  33. package/dist/EditableItemList.js +28 -13
  34. package/dist/EditableItemList.js.map +1 -1
  35. package/dist/ErrorBoundary.js +6 -11
  36. package/dist/ErrorBoundary.js.map +1 -1
  37. package/dist/ErrorView.js +20 -8
  38. package/dist/ErrorView.js.map +1 -1
  39. package/dist/HierarchicalCheckboxMenu.js +30 -28
  40. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  41. package/dist/ItemList.js +96 -168
  42. package/dist/ItemList.js.map +1 -1
  43. package/dist/ItemListItem.js +46 -60
  44. package/dist/ItemListItem.js.map +1 -1
  45. package/dist/LoadingOverlay.js +13 -9
  46. package/dist/LoadingOverlay.js.map +1 -1
  47. package/dist/LoadingSpinner.js +3 -4
  48. package/dist/LoadingSpinner.js.map +1 -1
  49. package/dist/MaskedInput.js +44 -41
  50. package/dist/MaskedInput.js.map +1 -1
  51. package/dist/MaskedInputUtils.js +1 -3
  52. package/dist/MaskedInputUtils.js.map +1 -1
  53. package/dist/Option.js +1 -3
  54. package/dist/Option.js.map +1 -1
  55. package/dist/RadioGroup.js +17 -9
  56. package/dist/RadioGroup.js.map +1 -1
  57. package/dist/RadioItem.js +25 -14
  58. package/dist/RadioItem.js.map +1 -1
  59. package/dist/RandomAreaPlotAnimation.js +17 -13
  60. package/dist/RandomAreaPlotAnimation.js.map +1 -1
  61. package/dist/SearchInput.js +13 -14
  62. package/dist/SearchInput.js.map +1 -1
  63. package/dist/SearchableCombobox.js +3 -5
  64. package/dist/SearchableCombobox.js.map +1 -1
  65. package/dist/Select.js +5 -7
  66. package/dist/Select.js.map +1 -1
  67. package/dist/SelectValueList.js +21 -30
  68. package/dist/SelectValueList.js.map +1 -1
  69. package/dist/SocketedButton.js +18 -17
  70. package/dist/SocketedButton.js.map +1 -1
  71. package/dist/SplitButtonGroup.js +4 -6
  72. package/dist/SplitButtonGroup.js.map +1 -1
  73. package/dist/TableViewEmptyState.js +14 -6
  74. package/dist/TableViewEmptyState.js.map +1 -1
  75. package/dist/TextWithTooltip.js +3 -4
  76. package/dist/TextWithTooltip.js.map +1 -1
  77. package/dist/TimeInput.js +29 -12
  78. package/dist/TimeInput.js.map +1 -1
  79. package/dist/TimeSlider.js +46 -38
  80. package/dist/TimeSlider.js.map +1 -1
  81. package/dist/ToastNotification.js +9 -10
  82. package/dist/ToastNotification.js.map +1 -1
  83. package/dist/UISwitch.js +8 -9
  84. package/dist/UISwitch.js.map +1 -1
  85. package/dist/actions/ConfirmActionButton.js +7 -9
  86. package/dist/actions/ConfirmActionButton.js.map +1 -1
  87. package/dist/actions/IconActionButton.js +3 -5
  88. package/dist/actions/IconActionButton.js.map +1 -1
  89. package/dist/context-actions/ContextActionUtils.js +1 -3
  90. package/dist/context-actions/ContextActionUtils.js.map +1 -1
  91. package/dist/context-actions/ContextActions.js +8 -18
  92. package/dist/context-actions/ContextActions.js.map +1 -1
  93. package/dist/context-actions/ContextMenu.js +53 -89
  94. package/dist/context-actions/ContextMenu.js.map +1 -1
  95. package/dist/context-actions/ContextMenuItem.js +11 -11
  96. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  97. package/dist/context-actions/ContextMenuRoot.js +6 -11
  98. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  99. package/dist/context-actions/GlobalContextAction.js +2 -6
  100. package/dist/context-actions/GlobalContextAction.js.map +1 -1
  101. package/dist/context-actions/GlobalContextActions.js +4 -7
  102. package/dist/context-actions/GlobalContextActions.js.map +1 -1
  103. package/dist/dialogs/ActionButtonDialogTrigger.js +7 -9
  104. package/dist/dialogs/ActionButtonDialogTrigger.js.map +1 -1
  105. package/dist/dialogs/ConfirmationDialog.js +8 -11
  106. package/dist/dialogs/ConfirmationDialog.js.map +1 -1
  107. package/dist/menu-actions/DropdownMenu.js +12 -22
  108. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  109. package/dist/menu-actions/Menu.js +19 -45
  110. package/dist/menu-actions/Menu.js.map +1 -1
  111. package/dist/modal/DebouncedModal.js +8 -9
  112. package/dist/modal/DebouncedModal.js.map +1 -1
  113. package/dist/modal/InfoModal.js +6 -7
  114. package/dist/modal/InfoModal.js.map +1 -1
  115. package/dist/modal/Modal.js +27 -15
  116. package/dist/modal/Modal.js.map +1 -1
  117. package/dist/modal/ModalBody.js +4 -6
  118. package/dist/modal/ModalBody.js.map +1 -1
  119. package/dist/modal/ModalFooter.js +3 -5
  120. package/dist/modal/ModalFooter.js.map +1 -1
  121. package/dist/modal/ModalHeader.js +7 -8
  122. package/dist/modal/ModalHeader.js.map +1 -1
  123. package/dist/navigation/DashboardList.js +17 -6
  124. package/dist/navigation/DashboardList.js.map +1 -1
  125. package/dist/navigation/Menu.js +4 -5
  126. package/dist/navigation/Menu.js.map +1 -1
  127. package/dist/navigation/MenuItem.js +7 -10
  128. package/dist/navigation/MenuItem.js.map +1 -1
  129. package/dist/navigation/NavTab.js +14 -17
  130. package/dist/navigation/NavTab.js.map +1 -1
  131. package/dist/navigation/NavTabList.js +39 -33
  132. package/dist/navigation/NavTabList.js.map +1 -1
  133. package/dist/navigation/Page.js +5 -7
  134. package/dist/navigation/Page.js.map +1 -1
  135. package/dist/navigation/Stack.js +20 -7
  136. package/dist/navigation/Stack.js.map +1 -1
  137. package/dist/popper/Popper.js +30 -57
  138. package/dist/popper/Popper.js.map +1 -1
  139. package/dist/popper/Tooltip.js +24 -54
  140. package/dist/popper/Tooltip.js.map +1 -1
  141. package/dist/shortcuts/Shortcut.js +10 -15
  142. package/dist/shortcuts/Shortcut.js.map +1 -1
  143. package/dist/shortcuts/ShortcutRegistry.js +1 -3
  144. package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
  145. package/dist/spectrum/ActionGroup.js +7 -9
  146. package/dist/spectrum/ActionGroup.js.map +1 -1
  147. package/dist/spectrum/ActionMenu.js +3 -5
  148. package/dist/spectrum/ActionMenu.js.map +1 -1
  149. package/dist/spectrum/CheckboxGroup.js +1 -3
  150. package/dist/spectrum/CheckboxGroup.js.map +1 -1
  151. package/dist/spectrum/Heading.js +2 -4
  152. package/dist/spectrum/Heading.js.map +1 -1
  153. package/dist/spectrum/ItemContent.js +16 -10
  154. package/dist/spectrum/ItemContent.js.map +1 -1
  155. package/dist/spectrum/ItemTooltip.js +2 -4
  156. package/dist/spectrum/ItemTooltip.js.map +1 -1
  157. package/dist/spectrum/TabPanels.js +3 -4
  158. package/dist/spectrum/TabPanels.js.map +1 -1
  159. package/dist/spectrum/Text.js +2 -4
  160. package/dist/spectrum/Text.js.map +1 -1
  161. package/dist/spectrum/View.js +11 -14
  162. package/dist/spectrum/View.js.map +1 -1
  163. package/dist/spectrum/comboBox/ComboBox.js +5 -9
  164. package/dist/spectrum/comboBox/ComboBox.js.map +1 -1
  165. package/dist/spectrum/comboBox/ComboBoxNormalized.js +3 -7
  166. package/dist/spectrum/comboBox/ComboBoxNormalized.js.map +1 -1
  167. package/dist/spectrum/listView/ListView.js +11 -11
  168. package/dist/spectrum/listView/ListView.js.map +1 -1
  169. package/dist/spectrum/listView/ListViewNormalized.js +22 -24
  170. package/dist/spectrum/listView/ListViewNormalized.js.map +1 -1
  171. package/dist/spectrum/listView/ListViewWrapper.js +11 -15
  172. package/dist/spectrum/listView/ListViewWrapper.js.map +1 -1
  173. package/dist/spectrum/multiSelect/MultiSelect.js +113 -100
  174. package/dist/spectrum/multiSelect/MultiSelect.js.map +1 -1
  175. package/dist/spectrum/multiSelect/MultiSelectListBox.js +9 -11
  176. package/dist/spectrum/multiSelect/MultiSelectListBox.js.map +1 -1
  177. package/dist/spectrum/multiSelect/MultiSelectNormalized.js +3 -7
  178. package/dist/spectrum/multiSelect/MultiSelectNormalized.js.map +1 -1
  179. package/dist/spectrum/multiSelect/MultiSelectTag.js +5 -7
  180. package/dist/spectrum/multiSelect/MultiSelectTag.js.map +1 -1
  181. package/dist/spectrum/multiSelect/useMultiSelectFilter.js +20 -14
  182. package/dist/spectrum/multiSelect/useMultiSelectFilter.js.map +1 -1
  183. package/dist/spectrum/multiSelect/useMultiSelectKeyboard.js +27 -20
  184. package/dist/spectrum/multiSelect/useMultiSelectKeyboard.js.map +1 -1
  185. package/dist/spectrum/multiSelect/useMultiSelectLoadingSpinner.js +14 -7
  186. package/dist/spectrum/multiSelect/useMultiSelectLoadingSpinner.js.map +1 -1
  187. package/dist/spectrum/multiSelect/useMultiSelectNormalizedProps.js +20 -22
  188. package/dist/spectrum/multiSelect/useMultiSelectNormalizedProps.js.map +1 -1
  189. package/dist/spectrum/multiSelect/useMultiSelectScrollListener.js +13 -6
  190. package/dist/spectrum/multiSelect/useMultiSelectScrollListener.js.map +1 -1
  191. package/dist/spectrum/multiSelect/useMultiSelectState.js +16 -9
  192. package/dist/spectrum/multiSelect/useMultiSelectState.js.map +1 -1
  193. package/dist/spectrum/picker/Picker.js +5 -9
  194. package/dist/spectrum/picker/Picker.js.map +1 -1
  195. package/dist/spectrum/picker/PickerNormalized.js +2 -6
  196. package/dist/spectrum/picker/PickerNormalized.js.map +1 -1
  197. package/dist/spectrum/picker/usePickerItemScale.js +2 -3
  198. package/dist/spectrum/picker/usePickerItemScale.js.map +1 -1
  199. package/dist/spectrum/picker/usePickerNormalizedProps.js +31 -33
  200. package/dist/spectrum/picker/usePickerNormalizedProps.js.map +1 -1
  201. package/dist/spectrum/picker/usePickerProps.js +26 -29
  202. package/dist/spectrum/picker/usePickerProps.js.map +1 -1
  203. package/dist/spectrum/picker/usePickerScrollOnOpen.js +6 -9
  204. package/dist/spectrum/picker/usePickerScrollOnOpen.js.map +1 -1
  205. package/dist/spectrum/utils/itemUtils.js +4 -6
  206. package/dist/spectrum/utils/itemUtils.js.map +1 -1
  207. package/dist/spectrum/utils/propsUtils.js +35 -37
  208. package/dist/spectrum/utils/propsUtils.js.map +1 -1
  209. package/dist/spectrum/utils/themeUtils.js +5 -7
  210. package/dist/spectrum/utils/themeUtils.js.map +1 -1
  211. package/dist/spectrum/utils/useOnChangeTrackUncontrolled.js +13 -6
  212. package/dist/spectrum/utils/useOnChangeTrackUncontrolled.js.map +1 -1
  213. package/dist/spectrum/utils/useRenderNormalizedItem.js +5 -7
  214. package/dist/spectrum/utils/useRenderNormalizedItem.js.map +1 -1
  215. package/dist/spectrum/utils/useStaticItemInitialScrollPosition.js +4 -6
  216. package/dist/spectrum/utils/useStaticItemInitialScrollPosition.js.map +1 -1
  217. package/dist/spectrum/utils/useStringifiedMultiSelection.js +5 -7
  218. package/dist/spectrum/utils/useStringifiedMultiSelection.js.map +1 -1
  219. package/dist/spectrum/utils/useStringifiedSelection.js +5 -7
  220. package/dist/spectrum/utils/useStringifiedSelection.js.map +1 -1
  221. package/dist/theme/FontBootstrap.js +13 -5
  222. package/dist/theme/FontBootstrap.js.map +1 -1
  223. package/dist/theme/FontsLoaded.js +1 -3
  224. package/dist/theme/FontsLoaded.js.map +1 -1
  225. package/dist/theme/Logo.js +2 -4
  226. package/dist/theme/Logo.js.map +1 -1
  227. package/dist/theme/SpectrumThemeProvider.js +17 -9
  228. package/dist/theme/SpectrumThemeProvider.js.map +1 -1
  229. package/dist/theme/ThemePicker.js +4 -5
  230. package/dist/theme/ThemePicker.js.map +1 -1
  231. package/dist/theme/ThemeProvider.js +20 -8
  232. package/dist/theme/ThemeProvider.js.map +1 -1
  233. package/dist/theme/ThemeUtils.js +35 -19
  234. package/dist/theme/ThemeUtils.js.map +1 -1
  235. package/dist/theme/useExternalTheme.js +16 -7
  236. package/dist/theme/useExternalTheme.js.map +1 -1
  237. package/dist/transitions/FadeTransition.js +5 -6
  238. package/dist/transitions/FadeTransition.js.map +1 -1
  239. package/dist/transitions/SlideTransition.js +6 -7
  240. package/dist/transitions/SlideTransition.js.map +1 -1
  241. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"ContextActionUtils.js","names":["isPromise","value","then","undefined","ContextActionUtils","disableAllActions","actionsDisabled","enableAllActions","isContextActionEvent","e","Array","isArray","contextActions","compareActions","a","b","group","_a$group","_b$group","order","_a$order","_b$order","title","_a$title","_b$title","sortActions","actions","sortedActions","slice","sort","isMacPlatform","platform","window","navigator","startsWith","getModifierKey","isModifierKeyDown","event","modifierKey","getMenuItems","actionsParam","includePromises","arguments","length","menuItems","i","action","newMenuItems","Promise","push","concat","filter","menuElement","getNextMenuItem","startIndex","delta","firstIndex","menuIndex","item","disabled","_defineProperty"],"sources":["../../src/context-actions/ContextActionUtils.ts"],"sourcesContent":["import { type IconDefinition } from '@deephaven/icons';\nimport type React from 'react';\nimport type { Shortcut } from '../shortcuts';\n\nexport type ResolvableContextAction =\n | ContextAction\n | Promise<ContextAction[]>\n | (() => Promise<ContextAction[]> | ContextAction[] | ContextAction);\n\nexport type MenuItem = ContextAction | Promise<ContextAction[]>;\n\nexport interface ContextAction {\n title?: string | JSX.Element;\n description?: string;\n action?: (event: Event) => void;\n actions?: ResolvableContextAction[];\n icon?: IconDefinition | React.ReactElement<unknown>;\n iconColor?: string;\n shortcut?: Shortcut;\n\n /* Display text for the shortcut if the shortcut is not wired up through the Shortcut class */\n shortcutText?: string;\n isGlobal?: boolean;\n group?: number;\n order?: number;\n disabled?: boolean;\n menuElement?: React.ReactElement;\n iconOutline?: boolean;\n}\n\nexport interface ContextActionEvent extends MouseEvent {\n contextActions: ResolvableContextAction[];\n}\n\nexport function isPromise<A, T>(value: A | Promise<T>): value is Promise<T> {\n return (value as Promise<T>).then !== undefined;\n}\n\nclass ContextActionUtils {\n static actionsDisabled = false;\n\n static disableAllActions(): void {\n ContextActionUtils.actionsDisabled = true;\n }\n\n static enableAllActions(): void {\n ContextActionUtils.actionsDisabled = false;\n }\n\n static isContextActionEvent(e: MouseEvent): e is ContextActionEvent {\n return Array.isArray((e as ContextActionEvent).contextActions);\n }\n\n /**\n * Compare two action items. Useful in Array.sort\n * @param a First context action to compare\n * @param b Second context action to compare\n */\n static compareActions(a: ContextAction, b: ContextAction): number {\n if (a.group !== b.group) {\n return (a.group ?? 0) > (b.group ?? 0) ? 1 : -1;\n }\n\n if (a.order !== b.order) {\n return (a.order ?? 0) > (b.order ?? 0) ? 1 : -1;\n }\n\n if (a.title !== b.title) {\n return (a.title ?? '') > (b.title ?? '') ? 1 : -1;\n }\n\n if (a !== b) {\n return a > b ? 1 : -1;\n }\n\n return 0;\n }\n\n /**\n *\n * @param actions The array of actions to sort\n */\n static sortActions(actions: ContextAction[]): ContextAction[] {\n if (actions == null || !Array.isArray(actions)) {\n return [];\n }\n\n const sortedActions = actions.slice();\n sortedActions.sort(ContextActionUtils.compareActions);\n return sortedActions;\n }\n\n static isMacPlatform(): boolean {\n const { platform } = window.navigator;\n return platform.startsWith('Mac');\n }\n\n /**\n * Retrieve the preferred modifier key based on the current platform\n */\n static getModifierKey(): 'metaKey' | 'ctrlKey' {\n if (ContextActionUtils.isMacPlatform()) {\n return 'metaKey';\n }\n\n return 'ctrlKey';\n }\n\n /**\n * Returns true if the modifier key for the current platform is down for the event (Ctrl for windows/linux, Command (meta) for mac)\n * @param event The event to get the meta key status from\n */\n static isModifierKeyDown(\n event: KeyboardEvent | MouseEvent | React.KeyboardEvent | React.MouseEvent\n ): boolean {\n const modifierKey = ContextActionUtils.getModifierKey();\n return event[modifierKey];\n }\n\n /**\n * Returns the menu items for the provided context actions, or empty array if none found.\n * @param actionsParam The actions to get menu items for\n * @param includePromises Whether or not to include promises in the returned menu items\n */\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises?: true\n ): MenuItem[];\n\n // If ignoring promises, then the return type is narrowed\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises: false\n ): ContextAction[];\n\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises = true\n ): MenuItem[] {\n let menuItems: MenuItem[] = [];\n let actions = actionsParam;\n if (!Array.isArray(actions)) {\n actions = [actions];\n }\n\n for (let i = 0; i < actions.length; i += 1) {\n const action = actions[i];\n let newMenuItems:\n | ContextAction\n | ContextAction[]\n | Promise<ContextAction[]>;\n if (typeof action === 'function') {\n newMenuItems = action();\n } else {\n newMenuItems = action;\n }\n\n if (newMenuItems != null) {\n if (newMenuItems instanceof Promise) {\n if (includePromises) {\n menuItems.push(newMenuItems);\n }\n } else if (Array.isArray(newMenuItems)) {\n menuItems = menuItems.concat(newMenuItems);\n } else {\n menuItems.push(newMenuItems);\n }\n }\n }\n\n menuItems = menuItems.filter(\n action =>\n (action as ContextAction).title !== undefined ||\n (action as Promise<ContextAction[]>).then != null ||\n (action as ContextAction).menuElement\n );\n\n return menuItems;\n }\n\n /**\n * Returns the index of the next menu item in a list that doesn't have a disabled=true prop\n * @param startIndex the starting position for the iteration\n * @param delta the direction of travel, -1 or 1\n * @param menuItems an array of menuItems\n */\n static getNextMenuItem(\n startIndex: number,\n delta: -1 | 1,\n menuItems: MenuItem[]\n ): number {\n let firstIndex = startIndex;\n if (firstIndex < 0 && delta < 0) {\n // if menu index is -1 and delta -1 manually set start point\n firstIndex = menuItems.length;\n }\n // find the next non disabled menu option, iterating the list only once\n for (let i = 1; i < menuItems.length + 1; i += 1) {\n const menuIndex =\n (firstIndex + delta * i + menuItems.length) % menuItems.length;\n const item = menuItems[menuIndex];\n if (!(item instanceof Promise) && item.disabled !== true) {\n return menuIndex;\n }\n }\n return startIndex;\n }\n}\n\nexport default ContextActionUtils;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ContextActionUtils.js","names":["isPromise","value","then","undefined","ContextActionUtils","disableAllActions","actionsDisabled","enableAllActions","isContextActionEvent","e","Array","isArray","contextActions","compareActions","a","b","group","_a$group","_b$group","order","_a$order","_b$order","title","_a$title","_b$title","sortActions","actions","sortedActions","slice","sort","isMacPlatform","platform","window","navigator","startsWith","getModifierKey","isModifierKeyDown","event","modifierKey","getMenuItems","actionsParam","includePromises","arguments","length","menuItems","i","action","newMenuItems","Promise","push","concat","filter","menuElement","getNextMenuItem","startIndex","delta","firstIndex","menuIndex","item","disabled","_defineProperty"],"sources":["../../src/context-actions/ContextActionUtils.ts"],"sourcesContent":["import { type IconDefinition } from '@deephaven/icons';\nimport type React from 'react';\nimport type { Shortcut } from '../shortcuts';\n\nexport type ResolvableContextAction =\n | ContextAction\n | Promise<ContextAction[]>\n | (() => Promise<ContextAction[]> | ContextAction[] | ContextAction);\n\nexport type MenuItem = ContextAction | Promise<ContextAction[]>;\n\nexport interface ContextAction {\n title?: string | JSX.Element;\n description?: string;\n action?: (event: Event) => void;\n actions?: ResolvableContextAction[];\n icon?: IconDefinition | React.ReactElement<unknown>;\n iconColor?: string;\n shortcut?: Shortcut;\n\n /* Display text for the shortcut if the shortcut is not wired up through the Shortcut class */\n shortcutText?: string;\n isGlobal?: boolean;\n group?: number;\n order?: number;\n disabled?: boolean;\n menuElement?: React.ReactElement;\n iconOutline?: boolean;\n}\n\nexport interface ContextActionEvent extends MouseEvent {\n contextActions: ResolvableContextAction[];\n}\n\nexport function isPromise<A, T>(value: A | Promise<T>): value is Promise<T> {\n return (value as Promise<T>).then !== undefined;\n}\n\nclass ContextActionUtils {\n static actionsDisabled = false;\n\n static disableAllActions(): void {\n ContextActionUtils.actionsDisabled = true;\n }\n\n static enableAllActions(): void {\n ContextActionUtils.actionsDisabled = false;\n }\n\n static isContextActionEvent(e: MouseEvent): e is ContextActionEvent {\n return Array.isArray((e as ContextActionEvent).contextActions);\n }\n\n /**\n * Compare two action items. Useful in Array.sort\n * @param a First context action to compare\n * @param b Second context action to compare\n */\n static compareActions(a: ContextAction, b: ContextAction): number {\n if (a.group !== b.group) {\n return (a.group ?? 0) > (b.group ?? 0) ? 1 : -1;\n }\n\n if (a.order !== b.order) {\n return (a.order ?? 0) > (b.order ?? 0) ? 1 : -1;\n }\n\n if (a.title !== b.title) {\n return (a.title ?? '') > (b.title ?? '') ? 1 : -1;\n }\n\n if (a !== b) {\n return a > b ? 1 : -1;\n }\n\n return 0;\n }\n\n /**\n *\n * @param actions The array of actions to sort\n */\n static sortActions(actions: ContextAction[]): ContextAction[] {\n if (actions == null || !Array.isArray(actions)) {\n return [];\n }\n\n const sortedActions = actions.slice();\n sortedActions.sort(ContextActionUtils.compareActions);\n return sortedActions;\n }\n\n static isMacPlatform(): boolean {\n const { platform } = window.navigator;\n return platform.startsWith('Mac');\n }\n\n /**\n * Retrieve the preferred modifier key based on the current platform\n */\n static getModifierKey(): 'metaKey' | 'ctrlKey' {\n if (ContextActionUtils.isMacPlatform()) {\n return 'metaKey';\n }\n\n return 'ctrlKey';\n }\n\n /**\n * Returns true if the modifier key for the current platform is down for the event (Ctrl for windows/linux, Command (meta) for mac)\n * @param event The event to get the meta key status from\n */\n static isModifierKeyDown(\n event: KeyboardEvent | MouseEvent | React.KeyboardEvent | React.MouseEvent\n ): boolean {\n const modifierKey = ContextActionUtils.getModifierKey();\n return event[modifierKey];\n }\n\n /**\n * Returns the menu items for the provided context actions, or empty array if none found.\n * @param actionsParam The actions to get menu items for\n * @param includePromises Whether or not to include promises in the returned menu items\n */\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises?: true\n ): MenuItem[];\n\n // If ignoring promises, then the return type is narrowed\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises: false\n ): ContextAction[];\n\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises = true\n ): MenuItem[] {\n let menuItems: MenuItem[] = [];\n let actions = actionsParam;\n if (!Array.isArray(actions)) {\n actions = [actions];\n }\n\n for (let i = 0; i < actions.length; i += 1) {\n const action = actions[i];\n let newMenuItems:\n | ContextAction\n | ContextAction[]\n | Promise<ContextAction[]>;\n if (typeof action === 'function') {\n newMenuItems = action();\n } else {\n newMenuItems = action;\n }\n\n if (newMenuItems != null) {\n if (newMenuItems instanceof Promise) {\n if (includePromises) {\n menuItems.push(newMenuItems);\n }\n } else if (Array.isArray(newMenuItems)) {\n menuItems = menuItems.concat(newMenuItems);\n } else {\n menuItems.push(newMenuItems);\n }\n }\n }\n\n menuItems = menuItems.filter(\n action =>\n (action as ContextAction).title !== undefined ||\n (action as Promise<ContextAction[]>).then != null ||\n (action as ContextAction).menuElement\n );\n\n return menuItems;\n }\n\n /**\n * Returns the index of the next menu item in a list that doesn't have a disabled=true prop\n * @param startIndex the starting position for the iteration\n * @param delta the direction of travel, -1 or 1\n * @param menuItems an array of menuItems\n */\n static getNextMenuItem(\n startIndex: number,\n delta: -1 | 1,\n menuItems: MenuItem[]\n ): number {\n let firstIndex = startIndex;\n if (firstIndex < 0 && delta < 0) {\n // if menu index is -1 and delta -1 manually set start point\n firstIndex = menuItems.length;\n }\n // find the next non disabled menu option, iterating the list only once\n for (let i = 1; i < menuItems.length + 1; i += 1) {\n const menuIndex =\n (firstIndex + delta * i + menuItems.length) % menuItems.length;\n const item = menuItems[menuIndex];\n if (!(item instanceof Promise) && item.disabled !== true) {\n return menuIndex;\n }\n }\n return startIndex;\n }\n}\n\nexport default ContextActionUtils;\n"],"mappings":";;;AAkCA,OAAO,SAASA,SAASA,CAAOC,KAAqB,EAAuB;EAC1E,OAAQA,KAAK,CAAgBC,IAAI,KAAKC,SAAS;AACjD;AAEA,MAAMC,kBAAkB,CAAC;EAGvB,OAAOC,iBAAiBA,CAAA,EAAS;IAC/BD,kBAAkB,CAACE,eAAe,GAAG,IAAI;EAC3C;EAEA,OAAOC,gBAAgBA,CAAA,EAAS;IAC9BH,kBAAkB,CAACE,eAAe,GAAG,KAAK;EAC5C;EAEA,OAAOE,oBAAoBA,CAACC,CAAa,EAA2B;IAClE,OAAOC,KAAK,CAACC,OAAO,CAAEF,CAAC,CAAwBG,cAAc,CAAC;EAChE;;EAEA;AACF;AACA;AACA;AACA;EACE,OAAOC,cAAcA,CAACC,CAAgB,EAAEC,CAAgB,EAAU;IAChE,IAAID,CAAC,CAACE,KAAK,KAAKD,CAAC,CAACC,KAAK,EAAE;MAAA,IAAAC,QAAA,EAAAC,QAAA;MACvB,OAAO,EAAAD,QAAA,GAACH,CAAC,CAACE,KAAK,cAAAC,QAAA,cAAAA,QAAA,GAAI,CAAC,MAAAC,QAAA,GAAKH,CAAC,CAACC,KAAK,cAAAE,QAAA,cAAAA,QAAA,GAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjD;IAEA,IAAIJ,CAAC,CAACK,KAAK,KAAKJ,CAAC,CAACI,KAAK,EAAE;MAAA,IAAAC,QAAA,EAAAC,QAAA;MACvB,OAAO,EAAAD,QAAA,GAACN,CAAC,CAACK,KAAK,cAAAC,QAAA,cAAAA,QAAA,GAAI,CAAC,MAAAC,QAAA,GAAKN,CAAC,CAACI,KAAK,cAAAE,QAAA,cAAAA,QAAA,GAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjD;IAEA,IAAIP,CAAC,CAACQ,KAAK,KAAKP,CAAC,CAACO,KAAK,EAAE;MAAA,IAAAC,QAAA,EAAAC,QAAA;MACvB,OAAO,EAAAD,QAAA,GAACT,CAAC,CAACQ,KAAK,cAAAC,QAAA,cAAAA,QAAA,GAAI,EAAE,MAAAC,QAAA,GAAKT,CAAC,CAACO,KAAK,cAAAE,QAAA,cAAAA,QAAA,GAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnD;IAEA,IAAIV,CAAC,KAAKC,CAAC,EAAE;MACX,OAAOD,CAAC,GAAGC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB;IAEA,OAAO,CAAC;EACV;;EAEA;AACF;AACA;AACA;EACE,OAAOU,WAAWA,CAACC,OAAwB,EAAmB;IAC5D,IAAIA,OAAO,IAAI,IAAI,IAAI,CAAChB,KAAK,CAACC,OAAO,CAACe,OAAO,CAAC,EAAE;MAC9C,OAAO,EAAE;IACX;IAEA,IAAMC,aAAa,GAAGD,OAAO,CAACE,KAAK,CAAC,CAAC;IACrCD,aAAa,CAACE,IAAI,CAACzB,kBAAkB,CAACS,cAAc,CAAC;IACrD,OAAOc,aAAa;EACtB;EAEA,OAAOG,aAAaA,CAAA,EAAY;IAC9B,IAAQC,QAAQ,GAAKC,MAAM,CAACC,SAAS,CAA7BF,QAAQ;IAChB,OAAOA,QAAQ,CAACG,UAAU,CAAC,KAAK,CAAC;EACnC;;EAEA;AACF;AACA;EACE,OAAOC,cAAcA,CAAA,EAA0B;IAC7C,IAAI/B,kBAAkB,CAAC0B,aAAa,CAAC,CAAC,EAAE;MACtC,OAAO,SAAS;IAClB;IAEA,OAAO,SAAS;EAClB;;EAEA;AACF;AACA;AACA;EACE,OAAOM,iBAAiBA,CACtBC,KAA0E,EACjE;IACT,IAAMC,WAAW,GAAGlC,kBAAkB,CAAC+B,cAAc,CAAC,CAAC;IACvD,OAAOE,KAAK,CAACC,WAAW,CAAC;EAC3B;;EAEA;AACF;AACA;AACA;AACA;;EAME;;EAMA,OAAOC,YAAYA,CACjBC,YAAiE,EAErD;IAAA,IADZC,eAAe,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAvC,SAAA,GAAAuC,SAAA,MAAG,IAAI;IAEtB,IAAIE,SAAqB,GAAG,EAAE;IAC9B,IAAIlB,OAAO,GAAGc,YAAY;IAC1B,IAAI,CAAC9B,KAAK,CAACC,OAAO,CAACe,OAAO,CAAC,EAAE;MAC3BA,OAAO,GAAG,CAACA,OAAO,CAAC;IACrB;IAEA,KAAK,IAAImB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGnB,OAAO,CAACiB,MAAM,EAAEE,CAAC,IAAI,CAAC,EAAE;MAC1C,IAAMC,MAAM,GAAGpB,OAAO,CAACmB,CAAC,CAAC;MACzB,IAAIE,YAGwB;MAC5B,IAAI,OAAOD,MAAM,KAAK,UAAU,EAAE;QAChCC,YAAY,GAAGD,MAAM,CAAC,CAAC;MACzB,CAAC,MAAM;QACLC,YAAY,GAAGD,MAAM;MACvB;MAEA,IAAIC,YAAY,IAAI,IAAI,EAAE;QACxB,IAAIA,YAAY,YAAYC,OAAO,EAAE;UACnC,IAAIP,eAAe,EAAE;YACnBG,SAAS,CAACK,IAAI,CAACF,YAAY,CAAC;UAC9B;QACF,CAAC,MAAM,IAAIrC,KAAK,CAACC,OAAO,CAACoC,YAAY,CAAC,EAAE;UACtCH,SAAS,GAAGA,SAAS,CAACM,MAAM,CAACH,YAAY,CAAC;QAC5C,CAAC,MAAM;UACLH,SAAS,CAACK,IAAI,CAACF,YAAY,CAAC;QAC9B;MACF;IACF;IAEAH,SAAS,GAAGA,SAAS,CAACO,MAAM,CAC1BL,MAAM,IACHA,MAAM,CAAmBxB,KAAK,KAAKnB,SAAS,IAC5C2C,MAAM,CAA8B5C,IAAI,IAAI,IAAI,IAChD4C,MAAM,CAAmBM,WAC9B,CAAC;IAED,OAAOR,SAAS;EAClB;;EAEA;AACF;AACA;AACA;AACA;AACA;EACE,OAAOS,eAAeA,CACpBC,UAAkB,EAClBC,KAAa,EACbX,SAAqB,EACb;IACR,IAAIY,UAAU,GAAGF,UAAU;IAC3B,IAAIE,UAAU,GAAG,CAAC,IAAID,KAAK,GAAG,CAAC,EAAE;MAC/B;MACAC,UAAU,GAAGZ,SAAS,CAACD,MAAM;IAC/B;IACA;IACA,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,SAAS,CAACD,MAAM,GAAG,CAAC,EAAEE,CAAC,IAAI,CAAC,EAAE;MAChD,IAAMY,SAAS,GACb,CAACD,UAAU,GAAGD,KAAK,GAAGV,CAAC,GAAGD,SAAS,CAACD,MAAM,IAAIC,SAAS,CAACD,MAAM;MAChE,IAAMe,IAAI,GAAGd,SAAS,CAACa,SAAS,CAAC;MACjC,IAAI,EAAEC,IAAI,YAAYV,OAAO,CAAC,IAAIU,IAAI,CAACC,QAAQ,KAAK,IAAI,EAAE;QACxD,OAAOF,SAAS;MAClB;IACF;IACA,OAAOH,UAAU;EACnB;AACF;AAACM,eAAA,CAzKKxD,kBAAkB,qBACG,KAAK;AA0KhC,eAAeA,kBAAkB","ignoreList":[]}
@@ -91,15 +91,13 @@ class ContextActions extends Component {
91
91
  }
92
92
  }
93
93
  handleContextMenu(e) {
94
- var {
95
- ignoreClassNames = []
96
- } = this.props;
94
+ var _this$props$ignoreCla = this.props.ignoreClassNames,
95
+ ignoreClassNames = _this$props$ignoreCla === void 0 ? [] : _this$props$ignoreCla;
97
96
  if (ignoreClassNames.length > 0) {
98
97
  var el = e.target;
99
98
  var _loop = function _loop() {
100
- var {
101
- classList
102
- } = el;
99
+ var _el = el,
100
+ classList = _el.classList;
103
101
  var ignoredClassName = ignoreClassNames.find(className => classList.contains(className));
104
102
  if (ignoredClassName !== undefined) {
105
103
  log.debug2("Contextmenu event ignored based on the target className \"".concat(ignoredClassName, "\""));
@@ -121,9 +119,7 @@ class ContextActions extends Component {
121
119
  if (!ContextActionUtils.isContextActionEvent(e)) {
122
120
  return;
123
121
  }
124
- var {
125
- actions
126
- } = this.props;
122
+ var actions = this.props.actions;
127
123
  if (actions != null) {
128
124
  var contextActions = actions;
129
125
  if (Array.isArray(contextActions)) {
@@ -134,9 +130,7 @@ class ContextActions extends Component {
134
130
  log.debug('Received context menu event! Menu items are now: ', e.contextActions);
135
131
  }
136
132
  handleKeyDown(e) {
137
- var {
138
- keyboardActions
139
- } = this.state;
133
+ var keyboardActions = this.state.keyboardActions;
140
134
  for (var i = 0; i < keyboardActions.length; i += 1) {
141
135
  var keyboardAction = keyboardActions[i];
142
136
  if (!ContextActionUtils.actionsDisabled && keyboardAction.shortcut != null && keyboardAction.shortcut.matchesEvent(e)) {
@@ -150,12 +144,8 @@ class ContextActions extends Component {
150
144
  }
151
145
  }
152
146
  render() {
153
- var {
154
- 'data-testid': dataTestId
155
- } = this.props;
156
- var {
157
- globalActions
158
- } = this.state;
147
+ var dataTestId = this.props['data-testid'];
148
+ var globalActions = this.state.globalActions;
159
149
  return /*#__PURE__*/_jsx("div", {
160
150
  className: "context-actions-listener",
161
151
  ref: this.container,
@@ -1 +1 @@
1
- {"version":3,"file":"ContextActions.js","names":["React","Component","Log","ContextActionUtils","isPromise","GlobalContextActions","jsx","_jsx","log","module","ContextActions","triggerMenu","element","clientX","clientY","actions","length","mouseEvent","MouseEvent","bubbles","cancelable","contextActions","dispatchEvent","constructor","props","_defineProperty","handleContextMenu","bind","handleKeyDown","container","createRef","state","globalActions","keyboardActions","getDerivedStateFromProps","Array","isArray","filter","action","isGlobal","undefined","shortcut","componentDidMount","_this$container$curre","current","parentElement","addEventListener","componentWillUnmount","_this$container$curre2","removeEventListener","e","ignoreClassNames","el","target","_loop","classList","ignoredClassName","find","className","contains","debug2","concat","v","_ret","isContextActionEvent","debug","i","keyboardAction","actionsDisabled","matchesEvent","_keyboardAction$actio","call","stopPropagation","preventDefault","render","dataTestId","ref","children","default","high","medium","low","global","edit"],"sources":["../../src/context-actions/ContextActions.tsx"],"sourcesContent":["/**\n * Just a simple utility class for displaying a popup menu.\n */\nimport React, { Component } from 'react';\nimport Log from '@deephaven/log';\nimport ContextActionUtils, {\n type ResolvableContextAction,\n type ContextAction,\n type ContextActionEvent,\n isPromise,\n} from './ContextActionUtils';\nimport GlobalContextActions from './GlobalContextActions';\nimport './ContextActions.scss';\n\nconst log = Log.module('ContextActions');\n\ninterface ContextActionsProps {\n actions?: ResolvableContextAction | ResolvableContextAction[];\n ignoreClassNames?: string[];\n 'data-testid'?: string;\n}\n\ninterface ContextActionsState {\n globalActions: ContextAction[];\n keyboardActions: ContextAction[];\n}\n\n/**\n * ContextActions that you add onto any component.\n *\n * Usage:\n * let actions = [{\n * title: 'My Action', // Omit the title to hide it from the context menu\n * action: () => { alert('My Action Clicked!') }\n * actions: [] // Submenu of actions\n * icon: faPrint, // Limited to FontAwesome icons for now.\n * iconColor: '#ff0000, // Color to use for the icon\n * shortcut: Shortcut, // Defaults to null\n * isGlobal: false, // Global context action. Defaults to false.\n * group: ContextActions.groups.default, // What group to group the context action with\n * order: null, // Int where to order within group\n * disabled: true // disable action\n * menuElement: null // Custom menu element for displaying in context menu. When null, creates a default menu item based on title\n * }];\n *\n * <div>\n * Right click in this container\n * <ContextActions actions={actions}/>\n * </div>\n *\n * Right clicking the container will then build the context menu, bubbling up until an element with a ContextMenuRoot is on it.\n * You should generally have a ContextMenuRoot on the root node of your document.\n */\nclass ContextActions extends Component<\n ContextActionsProps,\n ContextActionsState\n> {\n /**\n * Group you can assign to context menu actions to group them together.\n * Lower group IDs appear at the top of the list.\n * Groups are separated by a separator item.\n * Items within groups are ordered by their order property, then by their title.\n */\n static groups = {\n default: undefined,\n high: 100,\n medium: 5000,\n low: 10000,\n global: 100000,\n\n edit: 100,\n };\n\n static triggerMenu(\n element: Element,\n clientX: number,\n clientY: number,\n actions: ResolvableContextAction[]\n ): void {\n if (actions.length === 0) {\n return;\n }\n\n const mouseEvent: Partial<ContextActionEvent> = new MouseEvent(\n 'contextmenu',\n {\n clientX,\n clientY,\n bubbles: true,\n cancelable: true,\n }\n );\n mouseEvent.contextActions = actions;\n\n element.dispatchEvent(mouseEvent as ContextActionEvent);\n }\n\n constructor(props: ContextActionsProps) {\n super(props);\n\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n\n this.container = React.createRef();\n\n this.state = { globalActions: [], keyboardActions: [] };\n }\n\n static getDerivedStateFromProps(\n props: ContextActionsProps\n ): ContextActionsState {\n if (props.actions == null || !Array.isArray(props.actions)) {\n return { globalActions: [], keyboardActions: [] };\n }\n const globalActions = props.actions.filter(\n action =>\n !isPromise(action) && typeof action !== 'function' && action.isGlobal\n ) as ContextAction[];\n const keyboardActions = props.actions.filter(\n action =>\n !isPromise(action) &&\n typeof action !== 'function' &&\n (action.isGlobal === undefined || !action.isGlobal) &&\n action.shortcut != null\n ) as ContextAction[];\n\n return { globalActions, keyboardActions };\n }\n\n componentDidMount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.addEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n this.container.current.parentElement.addEventListener(\n 'keydown',\n this.handleKeyDown\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 this.container.current.parentElement.removeEventListener(\n 'keydown',\n this.handleKeyDown\n );\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n handleContextMenu(e: MouseEvent): void {\n const { ignoreClassNames = [] } = this.props;\n if (ignoreClassNames.length > 0) {\n let el = e.target as Element | null;\n while (el != null) {\n const { classList } = el;\n const ignoredClassName = ignoreClassNames.find(className =>\n classList.contains(className)\n );\n if (ignoredClassName !== undefined) {\n log.debug2(\n `Contextmenu event ignored based on the target className \"${ignoredClassName}\"`\n );\n return;\n }\n el = el.parentElement;\n }\n }\n if (!ContextActionUtils.isContextActionEvent(e)) {\n (e as ContextActionEvent).contextActions = [];\n }\n\n if (!ContextActionUtils.isContextActionEvent(e)) {\n return;\n }\n\n const { actions } = this.props;\n if (actions != null) {\n let contextActions = actions;\n if (Array.isArray(contextActions)) {\n contextActions = contextActions.filter(\n action =>\n isPromise(action) ||\n typeof action === 'function' ||\n action.isGlobal === undefined ||\n !action.isGlobal\n );\n }\n\n e.contextActions = e.contextActions.concat(contextActions);\n }\n\n log.debug(\n 'Received context menu event! Menu items are now: ',\n e.contextActions\n );\n }\n\n handleKeyDown(e: KeyboardEvent): void {\n const { keyboardActions } = this.state;\n for (let i = 0; i < keyboardActions.length; i += 1) {\n const keyboardAction = keyboardActions[i];\n if (\n !ContextActionUtils.actionsDisabled &&\n keyboardAction.shortcut != null &&\n keyboardAction.shortcut.matchesEvent(e)\n ) {\n log.debug('Context hotkey matched!', e);\n\n keyboardAction.action?.(e);\n\n e.stopPropagation();\n e.preventDefault();\n\n log.debug2('Matched hotkey returned false, key event not consumed');\n }\n }\n }\n\n render(): JSX.Element {\n const { 'data-testid': dataTestId } = this.props;\n const { globalActions } = this.state;\n return (\n <div\n className=\"context-actions-listener\"\n ref={this.container}\n data-testid={dataTestId}\n >\n <GlobalContextActions actions={globalActions} />\n </div>\n );\n }\n}\n\nexport default ContextActions;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ContextActions.js","names":["React","Component","Log","ContextActionUtils","isPromise","GlobalContextActions","jsx","_jsx","log","module","ContextActions","triggerMenu","element","clientX","clientY","actions","length","mouseEvent","MouseEvent","bubbles","cancelable","contextActions","dispatchEvent","constructor","props","_defineProperty","handleContextMenu","bind","handleKeyDown","container","createRef","state","globalActions","keyboardActions","getDerivedStateFromProps","Array","isArray","filter","action","isGlobal","undefined","shortcut","componentDidMount","_this$container$curre","current","parentElement","addEventListener","componentWillUnmount","_this$container$curre2","removeEventListener","e","_this$props$ignoreCla","ignoreClassNames","el","target","_loop","_el","classList","ignoredClassName","find","className","contains","debug2","concat","v","_ret","isContextActionEvent","debug","i","keyboardAction","actionsDisabled","matchesEvent","_keyboardAction$actio","call","stopPropagation","preventDefault","render","dataTestId","ref","children","default","high","medium","low","global","edit"],"sources":["../../src/context-actions/ContextActions.tsx"],"sourcesContent":["/**\n * Just a simple utility class for displaying a popup menu.\n */\nimport React, { Component } from 'react';\nimport Log from '@deephaven/log';\nimport ContextActionUtils, {\n type ResolvableContextAction,\n type ContextAction,\n type ContextActionEvent,\n isPromise,\n} from './ContextActionUtils';\nimport GlobalContextActions from './GlobalContextActions';\nimport './ContextActions.scss';\n\nconst log = Log.module('ContextActions');\n\ninterface ContextActionsProps {\n actions?: ResolvableContextAction | ResolvableContextAction[];\n ignoreClassNames?: string[];\n 'data-testid'?: string;\n}\n\ninterface ContextActionsState {\n globalActions: ContextAction[];\n keyboardActions: ContextAction[];\n}\n\n/**\n * ContextActions that you add onto any component.\n *\n * Usage:\n * let actions = [{\n * title: 'My Action', // Omit the title to hide it from the context menu\n * action: () => { alert('My Action Clicked!') }\n * actions: [] // Submenu of actions\n * icon: faPrint, // Limited to FontAwesome icons for now.\n * iconColor: '#ff0000, // Color to use for the icon\n * shortcut: Shortcut, // Defaults to null\n * isGlobal: false, // Global context action. Defaults to false.\n * group: ContextActions.groups.default, // What group to group the context action with\n * order: null, // Int where to order within group\n * disabled: true // disable action\n * menuElement: null // Custom menu element for displaying in context menu. When null, creates a default menu item based on title\n * }];\n *\n * <div>\n * Right click in this container\n * <ContextActions actions={actions}/>\n * </div>\n *\n * Right clicking the container will then build the context menu, bubbling up until an element with a ContextMenuRoot is on it.\n * You should generally have a ContextMenuRoot on the root node of your document.\n */\nclass ContextActions extends Component<\n ContextActionsProps,\n ContextActionsState\n> {\n /**\n * Group you can assign to context menu actions to group them together.\n * Lower group IDs appear at the top of the list.\n * Groups are separated by a separator item.\n * Items within groups are ordered by their order property, then by their title.\n */\n static groups = {\n default: undefined,\n high: 100,\n medium: 5000,\n low: 10000,\n global: 100000,\n\n edit: 100,\n };\n\n static triggerMenu(\n element: Element,\n clientX: number,\n clientY: number,\n actions: ResolvableContextAction[]\n ): void {\n if (actions.length === 0) {\n return;\n }\n\n const mouseEvent: Partial<ContextActionEvent> = new MouseEvent(\n 'contextmenu',\n {\n clientX,\n clientY,\n bubbles: true,\n cancelable: true,\n }\n );\n mouseEvent.contextActions = actions;\n\n element.dispatchEvent(mouseEvent as ContextActionEvent);\n }\n\n constructor(props: ContextActionsProps) {\n super(props);\n\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n\n this.container = React.createRef();\n\n this.state = { globalActions: [], keyboardActions: [] };\n }\n\n static getDerivedStateFromProps(\n props: ContextActionsProps\n ): ContextActionsState {\n if (props.actions == null || !Array.isArray(props.actions)) {\n return { globalActions: [], keyboardActions: [] };\n }\n const globalActions = props.actions.filter(\n action =>\n !isPromise(action) && typeof action !== 'function' && action.isGlobal\n ) as ContextAction[];\n const keyboardActions = props.actions.filter(\n action =>\n !isPromise(action) &&\n typeof action !== 'function' &&\n (action.isGlobal === undefined || !action.isGlobal) &&\n action.shortcut != null\n ) as ContextAction[];\n\n return { globalActions, keyboardActions };\n }\n\n componentDidMount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.addEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n this.container.current.parentElement.addEventListener(\n 'keydown',\n this.handleKeyDown\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 this.container.current.parentElement.removeEventListener(\n 'keydown',\n this.handleKeyDown\n );\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n handleContextMenu(e: MouseEvent): void {\n const { ignoreClassNames = [] } = this.props;\n if (ignoreClassNames.length > 0) {\n let el = e.target as Element | null;\n while (el != null) {\n const { classList } = el;\n const ignoredClassName = ignoreClassNames.find(className =>\n classList.contains(className)\n );\n if (ignoredClassName !== undefined) {\n log.debug2(\n `Contextmenu event ignored based on the target className \"${ignoredClassName}\"`\n );\n return;\n }\n el = el.parentElement;\n }\n }\n if (!ContextActionUtils.isContextActionEvent(e)) {\n (e as ContextActionEvent).contextActions = [];\n }\n\n if (!ContextActionUtils.isContextActionEvent(e)) {\n return;\n }\n\n const { actions } = this.props;\n if (actions != null) {\n let contextActions = actions;\n if (Array.isArray(contextActions)) {\n contextActions = contextActions.filter(\n action =>\n isPromise(action) ||\n typeof action === 'function' ||\n action.isGlobal === undefined ||\n !action.isGlobal\n );\n }\n\n e.contextActions = e.contextActions.concat(contextActions);\n }\n\n log.debug(\n 'Received context menu event! Menu items are now: ',\n e.contextActions\n );\n }\n\n handleKeyDown(e: KeyboardEvent): void {\n const { keyboardActions } = this.state;\n for (let i = 0; i < keyboardActions.length; i += 1) {\n const keyboardAction = keyboardActions[i];\n if (\n !ContextActionUtils.actionsDisabled &&\n keyboardAction.shortcut != null &&\n keyboardAction.shortcut.matchesEvent(e)\n ) {\n log.debug('Context hotkey matched!', e);\n\n keyboardAction.action?.(e);\n\n e.stopPropagation();\n e.preventDefault();\n\n log.debug2('Matched hotkey returned false, key event not consumed');\n }\n }\n }\n\n render(): JSX.Element {\n const { 'data-testid': dataTestId } = this.props;\n const { globalActions } = this.state;\n return (\n <div\n className=\"context-actions-listener\"\n ref={this.container}\n data-testid={dataTestId}\n >\n <GlobalContextActions actions={globalActions} />\n </div>\n );\n }\n}\n\nexport default ContextActions;\n"],"mappings":"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","ignoreList":[]}
@@ -71,19 +71,13 @@ class ContextMenu extends PureComponent {
71
71
  this.rAF = window.requestAnimationFrame(() => {
72
72
  var _this$container$curre;
73
73
  (_this$container$curre = this.container.current) === null || _this$container$curre === void 0 || _this$container$curre.focus();
74
- var {
75
- onMenuOpened
76
- } = this.props;
74
+ var onMenuOpened = this.props.onMenuOpened;
77
75
  onMenuOpened(this);
78
76
  });
79
77
  }
80
78
  componentDidUpdate(prevProps, prevState) {
81
- var {
82
- actions
83
- } = this.props;
84
- var {
85
- activeSubMenu
86
- } = this.state;
79
+ var actions = this.props.actions;
80
+ var activeSubMenu = this.state.activeSubMenu;
87
81
  if (activeSubMenu !== prevState.activeSubMenu) {
88
82
  if (activeSubMenu == null) {
89
83
  var _this$container$curre2;
@@ -109,21 +103,15 @@ class ContextMenu extends PureComponent {
109
103
  cancelAnimationFrame(this.rAF);
110
104
  }
111
105
  getKeyboardIndex() {
112
- var {
113
- options
114
- } = this.props;
106
+ var options = this.props.options;
115
107
  if (options.separateKeyboardMouse !== undefined && options.separateKeyboardMouse) {
116
- var {
117
- keyboardIndex
118
- } = this.state;
108
+ var keyboardIndex = this.state.keyboardIndex;
119
109
  return keyboardIndex;
120
110
  }
121
111
  return this.getMouseIndex();
122
112
  }
123
113
  setKeyboardIndex(index) {
124
- var {
125
- options
126
- } = this.props;
114
+ var options = this.props.options;
127
115
  if (options.separateKeyboardMouse !== undefined && options.separateKeyboardMouse) {
128
116
  this.setState({
129
117
  keyboardIndex: index
@@ -133,9 +121,7 @@ class ContextMenu extends PureComponent {
133
121
  }
134
122
  }
135
123
  getMouseIndex() {
136
- var {
137
- mouseIndex
138
- } = this.state;
124
+ var mouseIndex = this.state.mouseIndex;
139
125
  return mouseIndex;
140
126
  }
141
127
  setMouseIndex(index) {
@@ -147,16 +133,12 @@ class ContextMenu extends PureComponent {
147
133
  // cancel any pending close and promises
148
134
  this.cancelPromises();
149
135
  cancelAnimationFrame(this.rAF);
150
- var {
151
- options
152
- } = this.props;
136
+ var options = this.props.options;
153
137
  var keyboardIndex = options.initialKeyboardIndex;
154
138
  if (keyboardIndex === undefined) {
155
139
  keyboardIndex = -1;
156
140
  }
157
- var {
158
- actions
159
- } = this.props;
141
+ var actions = this.props.actions;
160
142
  var menuItems = ContextActionUtils.getMenuItems(actions);
161
143
  var nonPromiseItems = [];
162
144
  for (var i = menuItems.length - 1; i >= 0; i -= 1) {
@@ -217,9 +199,7 @@ class ContextMenu extends PureComponent {
217
199
  });
218
200
  }
219
201
  cancelPromises() {
220
- var {
221
- pendingItems
222
- } = this.state;
202
+ var pendingItems = this.state.pendingItems;
223
203
  pendingItems.map(item => item.cancel());
224
204
  }
225
205
 
@@ -250,14 +230,13 @@ class ContextMenu extends PureComponent {
250
230
  */
251
231
  verifyPosition() {
252
232
  var _this$container$curre4, _this$container$curre5, _this$container$curre6, _this$container$curre7;
253
- var {
254
- options,
255
- updatePosition,
256
- subMenuParentWidth,
257
- subMenuParentHeight,
258
- top: oldTop,
259
- left: oldLeft
260
- } = this.props;
233
+ var _this$props = this.props,
234
+ options = _this$props.options,
235
+ updatePosition = _this$props.updatePosition,
236
+ subMenuParentWidth = _this$props.subMenuParentWidth,
237
+ subMenuParentHeight = _this$props.subMenuParentHeight,
238
+ oldTop = _this$props.top,
239
+ oldLeft = _this$props.left;
261
240
  if (!this.container.current || options.doNotVerifyPosition != null && options.doNotVerifyPosition) {
262
241
  return;
263
242
  }
@@ -265,17 +244,15 @@ class ContextMenu extends PureComponent {
265
244
  // initial position is used rather than current position,
266
245
  // as the number of menu items can change (actions can bubble)
267
246
  // and menu should always be positioned relative to spawn point
268
- var {
269
- top,
270
- left
271
- } = this.initialPosition;
272
- var {
273
- width,
274
- height
275
- } = (_this$container$curre4 = (_this$container$curre5 = this.container.current) === null || _this$container$curre5 === void 0 ? void 0 : _this$container$curre5.getBoundingClientRect()) !== null && _this$container$curre4 !== void 0 ? _this$container$curre4 : {
276
- width: 0,
277
- height: 0
278
- };
247
+ var _this$initialPosition = this.initialPosition,
248
+ top = _this$initialPosition.top,
249
+ left = _this$initialPosition.left;
250
+ var _ref = (_this$container$curre4 = (_this$container$curre5 = this.container.current) === null || _this$container$curre5 === void 0 ? void 0 : _this$container$curre5.getBoundingClientRect()) !== null && _this$container$curre4 !== void 0 ? _this$container$curre4 : {
251
+ width: 0,
252
+ height: 0
253
+ },
254
+ width = _ref.width,
255
+ height = _ref.height;
279
256
  var hasOverflow = ((_this$container$curre6 = (_this$container$curre7 = this.container.current) === null || _this$container$curre7 === void 0 ? void 0 : _this$container$curre7.scrollHeight) !== null && _this$container$curre6 !== void 0 ? _this$container$curre6 : 0) > window.innerHeight;
280
257
  if (height === 0 || width === 0) {
281
258
  // We don't have a height or width yet, don't bother doing anything
@@ -334,15 +311,11 @@ class ContextMenu extends PureComponent {
334
311
 
335
312
  /** Returns whether the specified key should remove the menu. Depends on the side the parent is on. */
336
313
  isEscapeKey(key) {
337
- var {
338
- left
339
- } = this.props;
314
+ var left = this.props.left;
340
315
  return key === 'Escape' || left < 0 && key === 'ArrowRight' || key === 'ArrowLeft';
341
316
  }
342
317
  handleKeyDown(e) {
343
- var {
344
- menuItems
345
- } = this.state;
318
+ var menuItems = this.state.menuItems;
346
319
  var oldFocus = this.getKeyboardIndex();
347
320
  var newFocus = oldFocus;
348
321
  var openSubMenu = false;
@@ -385,10 +358,9 @@ class ContextMenu extends PureComponent {
385
358
  }
386
359
  }
387
360
  openSubMenu(index) {
388
- var {
389
- menuItems,
390
- activeSubMenu
391
- } = this.state;
361
+ var _this$state = this.state,
362
+ menuItems = _this$state.menuItems,
363
+ activeSubMenu = _this$state.activeSubMenu;
392
364
  var newSubMenu = menuItems[index].actions ? index : null;
393
365
  if (activeSubMenu === newSubMenu) return;
394
366
  this.setState({
@@ -399,10 +371,9 @@ class ContextMenu extends PureComponent {
399
371
  }
400
372
  closeMenu() {
401
373
  var closeAll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
402
- var {
403
- closeMenu,
404
- onMenuClosed
405
- } = this.props;
374
+ var _this$props2 = this.props,
375
+ closeMenu = _this$props2.closeMenu,
376
+ onMenuClosed = _this$props2.onMenuClosed;
406
377
  cancelAnimationFrame(this.rAF);
407
378
  this.rAF = window.requestAnimationFrame(() => {
408
379
  closeMenu(closeAll);
@@ -424,9 +395,7 @@ class ContextMenu extends PureComponent {
424
395
  handleMenuItemClick(menuItem, e) {
425
396
  e.preventDefault();
426
397
  e.stopPropagation();
427
- var {
428
- menuItems
429
- } = this.state;
398
+ var menuItems = this.state.menuItems;
430
399
  if (menuItem != null && (menuItem.disabled === undefined || !menuItem.disabled)) {
431
400
  if (menuItem.actions != null) {
432
401
  this.openSubMenu(menuItems.indexOf(menuItem));
@@ -443,9 +412,7 @@ class ContextMenu extends PureComponent {
443
412
  this.handleMenuItemClick(menuItem, e);
444
413
  }
445
414
  handleMenuItemMouseMove(menuItem) {
446
- var {
447
- menuItems
448
- } = this.state;
415
+ var menuItems = this.state.menuItems;
449
416
  var focusIndex = menuItems.indexOf(menuItem);
450
417
  this.setMouseIndex(focusIndex);
451
418
  if (focusIndex >= 0 && focusIndex < menuItems.length && (menuItem.disabled === undefined || !menuItem.disabled)) {
@@ -457,22 +424,20 @@ class ContextMenu extends PureComponent {
457
424
  }
458
425
  render() {
459
426
  var menuItemElements = [];
460
- var {
461
- top,
462
- left
463
- } = this.props;
464
- var {
465
- activeSubMenu,
466
- hasOverflow,
467
- keyboardIndex,
468
- menuItems,
469
- mouseIndex,
470
- pendingItems,
471
- subMenuTop,
472
- subMenuLeft,
473
- subMenuParentWidth,
474
- subMenuParentHeight
475
- } = this.state;
427
+ var _this$props3 = this.props,
428
+ top = _this$props3.top,
429
+ left = _this$props3.left;
430
+ var _this$state2 = this.state,
431
+ activeSubMenu = _this$state2.activeSubMenu,
432
+ hasOverflow = _this$state2.hasOverflow,
433
+ keyboardIndex = _this$state2.keyboardIndex,
434
+ menuItems = _this$state2.menuItems,
435
+ mouseIndex = _this$state2.mouseIndex,
436
+ pendingItems = _this$state2.pendingItems,
437
+ subMenuTop = _this$state2.subMenuTop,
438
+ subMenuLeft = _this$state2.subMenuLeft,
439
+ subMenuParentWidth = _this$state2.subMenuParentWidth,
440
+ subMenuParentHeight = _this$state2.subMenuParentHeight;
476
441
  for (var i = 0; i < menuItems.length; i += 1) {
477
442
  var menuItem = menuItems[i];
478
443
  if (i > 0 && menuItem.group !== menuItems[i - 1].group) {
@@ -499,10 +464,9 @@ class ContextMenu extends PureComponent {
499
464
  })
500
465
  });
501
466
  }
502
- var {
503
- menuStyle,
504
- 'data-testid': dataTestId
505
- } = this.props;
467
+ var _this$props4 = this.props,
468
+ menuStyle = _this$props4.menuStyle,
469
+ dataTestId = _this$props4['data-testid'];
506
470
 
507
471
  // don't show submenu until it has an position initialized
508
472
  var showSubmenu = activeSubMenu !== null && subMenuTop !== null && subMenuLeft !== null;
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenu.js","names":["React","PureComponent","classNames","Log","PromiseUtils","ContextActionUtils","ContextMenuItem","LoadingSpinner","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","log","module","ContextMenu","handleContextMenu","e","metaKey","stopPropagation","preventDefault","constructor","props","_defineProperty","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","_this$container$curre","current","focus","onMenuOpened","componentDidUpdate","prevProps","prevState","actions","_this$container$curre2","setActiveSubMenuPosition","contains","_this$container$curre3","componentWillUnmount","cancelPromises","removeEventListener","cancelAnimationFrame","getKeyboardIndex","options","separateKeyboardMouse","undefined","getMouseIndex","setKeyboardIndex","index","setState","setMouseIndex","initialKeyboardIndex","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","_this$container$curre4","_this$container$curre5","_this$container$curre6","_this$container$curre7","updatePosition","oldTop","oldLeft","doNotVerifyPosition","scrollHeight","innerHeight","innerWidth","closeMenu","warn","relatedTarget","element","isContextMenuChild","hasAttribute","parentElement","isEscapeKey","key","newFocus","openSubMenu","shiftKey","getNextMenuItem","HTMLElement","newSubMenu","closeAll","arguments","onMenuClosed","closeSubMenu","closeAllMenus","disabled","action","nativeEvent","focusIndex","render","menuItemElements","group","menuItemElement","ref","isKeyboardSelected","isMouseSelected","onMenuItemClick","onMenuItemMouseMove","onMenuItemContextMenu","pendingElement","className","children","menuStyle","dataTestId","showSubmenu","style","_objectSpread","onBlur","onKeyDown","onMouseLeave","onContextMenu","role","tabIndex","verifiedTop","verifiedLeft"],"sources":["../../src/context-actions/ContextMenu.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils, type CancelablePromise } from '@deephaven/utils';\nimport ContextActionUtils, {\n type ContextAction,\n type 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 (\n this.container.current == null ||\n !this.container.current.contains(document.activeElement)\n ) {\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 (\n options.separateKeyboardMouse !== undefined &&\n options.separateKeyboardMouse\n ) {\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 (\n options.separateKeyboardMouse !== undefined &&\n options.separateKeyboardMouse\n ) {\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 (\n !this.container.current ||\n (options.doNotVerifyPosition != null && options.doNotVerifyPosition)\n ) {\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 { width, 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 (\n menuItem != null &&\n (menuItem.disabled === undefined || !menuItem.disabled)\n ) {\n if (menuItem.actions != null) {\n this.openSubMenu(menuItems.indexOf(menuItem));\n } else if (menuItem.action != null) {\n menuItem.action(e.nativeEvent);\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 === undefined || !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 className=\"loading-spinner-vertical-align\" />\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"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ContextMenu.js","names":["React","PureComponent","classNames","Log","PromiseUtils","ContextActionUtils","ContextMenuItem","LoadingSpinner","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","log","module","ContextMenu","handleContextMenu","e","metaKey","stopPropagation","preventDefault","constructor","props","_defineProperty","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","_this$container$curre","current","focus","onMenuOpened","componentDidUpdate","prevProps","prevState","actions","_this$container$curre2","setActiveSubMenuPosition","contains","_this$container$curre3","componentWillUnmount","cancelPromises","removeEventListener","cancelAnimationFrame","getKeyboardIndex","options","separateKeyboardMouse","undefined","getMouseIndex","setKeyboardIndex","index","setState","setMouseIndex","initialKeyboardIndex","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","_this$container$curre4","_this$container$curre5","_this$container$curre6","_this$container$curre7","_this$props","updatePosition","oldTop","oldLeft","doNotVerifyPosition","_this$initialPosition","_ref","scrollHeight","innerHeight","innerWidth","closeMenu","warn","relatedTarget","element","isContextMenuChild","hasAttribute","parentElement","isEscapeKey","key","newFocus","openSubMenu","shiftKey","getNextMenuItem","HTMLElement","_this$state","newSubMenu","closeAll","arguments","_this$props2","onMenuClosed","closeSubMenu","closeAllMenus","disabled","action","nativeEvent","focusIndex","render","menuItemElements","_this$props3","_this$state2","group","menuItemElement","ref","isKeyboardSelected","isMouseSelected","onMenuItemClick","onMenuItemMouseMove","onMenuItemContextMenu","pendingElement","className","children","_this$props4","menuStyle","dataTestId","showSubmenu","style","_objectSpread","onBlur","onKeyDown","onMouseLeave","onContextMenu","role","tabIndex","verifiedTop","verifiedLeft"],"sources":["../../src/context-actions/ContextMenu.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils, type CancelablePromise } from '@deephaven/utils';\nimport ContextActionUtils, {\n type ContextAction,\n type 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 (\n this.container.current == null ||\n !this.container.current.contains(document.activeElement)\n ) {\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 (\n options.separateKeyboardMouse !== undefined &&\n options.separateKeyboardMouse\n ) {\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 (\n options.separateKeyboardMouse !== undefined &&\n options.separateKeyboardMouse\n ) {\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 (\n !this.container.current ||\n (options.doNotVerifyPosition != null && options.doNotVerifyPosition)\n ) {\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 { width, 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 (\n menuItem != null &&\n (menuItem.disabled === undefined || !menuItem.disabled)\n ) {\n if (menuItem.actions != null) {\n this.openSubMenu(menuItems.indexOf(menuItem));\n } else if (menuItem.action != null) {\n menuItem.action(e.nativeEvent);\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 === undefined || !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 className=\"loading-spinner-vertical-align\" />\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"],"mappings":"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","ignoreList":[]}