@deephaven/components 0.50.1-beta.5 → 0.51.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 (111) hide show
  1. package/dist/AutoCompleteInput.js.map +1 -1
  2. package/dist/AutoResizeTextarea.js.map +1 -1
  3. package/dist/BasicModal.js.map +1 -1
  4. package/dist/BulkActionBar.js.map +1 -1
  5. package/dist/Button.js.map +1 -1
  6. package/dist/ButtonGroup.js.map +1 -1
  7. package/dist/ButtonOld.js.map +1 -1
  8. package/dist/CardFlip.js.map +1 -1
  9. package/dist/Checkbox.js.map +1 -1
  10. package/dist/Collapse.js.map +1 -1
  11. package/dist/ComboBox.js.map +1 -1
  12. package/dist/CopyButton.js.map +1 -1
  13. package/dist/CustomTimeSelect.js.map +1 -1
  14. package/dist/DateInput.js.map +1 -1
  15. package/dist/DateInputUtils.js.map +1 -1
  16. package/dist/DateTimeInput.js.map +1 -1
  17. package/dist/DateTimeInputUtils.js.map +1 -1
  18. package/dist/DebouncedSearchInput.js.map +1 -1
  19. package/dist/DragUtils.js.map +1 -1
  20. package/dist/DraggableItemList.js.map +1 -1
  21. package/dist/EditableItemList.js.map +1 -1
  22. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  23. package/dist/ItemList.js.map +1 -1
  24. package/dist/ItemListItem.js.map +1 -1
  25. package/dist/LoadingOverlay.js.map +1 -1
  26. package/dist/LoadingSpinner.js.map +1 -1
  27. package/dist/MaskedInput.js.map +1 -1
  28. package/dist/MaskedInputUtils.js.map +1 -1
  29. package/dist/Option.js.map +1 -1
  30. package/dist/RadioGroup.js.map +1 -1
  31. package/dist/RadioItem.js.map +1 -1
  32. package/dist/RandomAreaPlotAnimation.js.map +1 -1
  33. package/dist/SearchInput.js.map +1 -1
  34. package/dist/SearchableCombobox.js.map +1 -1
  35. package/dist/Select.js.map +1 -1
  36. package/dist/SelectValueList.js.map +1 -1
  37. package/dist/SocketedButton.js.map +1 -1
  38. package/dist/SpectrumUtils.d.ts.map +1 -1
  39. package/dist/SpectrumUtils.js +3 -4
  40. package/dist/SpectrumUtils.js.map +1 -1
  41. package/dist/TableViewEmptyState.js.map +1 -1
  42. package/dist/TextWithTooltip.js.map +1 -1
  43. package/dist/ThemeExport.js.map +1 -1
  44. package/dist/TimeInput.js.map +1 -1
  45. package/dist/TimeSlider.js.map +1 -1
  46. package/dist/ToastNotification.js.map +1 -1
  47. package/dist/UISwitch.js.map +1 -1
  48. package/dist/ValidateLabelInput.js.map +1 -1
  49. package/dist/actions/ConfirmActionButton.js.map +1 -1
  50. package/dist/actions/IconActionButton.js.map +1 -1
  51. package/dist/context-actions/ContextActionUtils.js +2 -0
  52. package/dist/context-actions/ContextActionUtils.js.map +1 -1
  53. package/dist/context-actions/ContextActions.js.map +1 -1
  54. package/dist/context-actions/ContextMenu.js.map +1 -1
  55. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  56. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  57. package/dist/context-actions/GlobalContextAction.js.map +1 -1
  58. package/dist/context-actions/GlobalContextActions.js.map +1 -1
  59. package/dist/declaration.d.js.map +1 -1
  60. package/dist/dialogs/ActionButtonDialogTrigger.js.map +1 -1
  61. package/dist/dialogs/ConfirmationDialog.js.map +1 -1
  62. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  63. package/dist/menu-actions/Menu.js.map +1 -1
  64. package/dist/modal/DebouncedModal.js.map +1 -1
  65. package/dist/modal/InfoModal.js.map +1 -1
  66. package/dist/modal/Modal.js.map +1 -1
  67. package/dist/modal/ModalBody.js.map +1 -1
  68. package/dist/modal/ModalFooter.js.map +1 -1
  69. package/dist/modal/ModalHeader.js.map +1 -1
  70. package/dist/navigation/Menu.js.map +1 -1
  71. package/dist/navigation/MenuItem.js.map +1 -1
  72. package/dist/navigation/Page.js.map +1 -1
  73. package/dist/navigation/Stack.js.map +1 -1
  74. package/dist/popper/Popper.js +3 -0
  75. package/dist/popper/Popper.js.map +1 -1
  76. package/dist/popper/Tooltip.js +3 -0
  77. package/dist/popper/Tooltip.js.map +1 -1
  78. package/dist/shortcuts/Shortcut.js.map +1 -1
  79. package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
  80. package/dist/theme/SpectrumThemeProvider.d.ts +17 -0
  81. package/dist/theme/SpectrumThemeProvider.d.ts.map +1 -0
  82. package/dist/theme/SpectrumThemeProvider.js +31 -0
  83. package/dist/theme/SpectrumThemeProvider.js.map +1 -0
  84. package/dist/theme/ThemeProvider.d.ts.map +1 -1
  85. package/dist/theme/ThemeProvider.js +26 -12
  86. package/dist/theme/ThemeProvider.js.map +1 -1
  87. package/dist/theme/ThemeUtils.js.map +1 -1
  88. package/dist/theme/theme-dark/index.d.ts +24 -0
  89. package/dist/theme/theme-dark/index.d.ts.map +1 -1
  90. package/dist/theme/theme-dark/index.js +26 -1
  91. package/dist/theme/theme-dark/index.js.map +1 -1
  92. package/dist/theme/theme-dark/theme-dark-components.css +8 -0
  93. package/dist/theme/theme-dark/theme-dark-components.css.map +1 -0
  94. package/dist/theme/theme-dark/theme-dark-semantic.css +51 -4
  95. package/dist/theme/theme-dark/theme-dark-semantic.css.map +1 -1
  96. package/dist/theme/theme-spectrum/index.d.ts +16 -0
  97. package/dist/theme/theme-spectrum/index.d.ts.map +1 -0
  98. package/dist/theme/theme-spectrum/index.js +22 -0
  99. package/dist/theme/theme-spectrum/index.js.map +1 -0
  100. package/dist/theme/theme-spectrum/theme-spectrum-alias.module.css +192 -0
  101. package/dist/theme/theme-spectrum/theme-spectrum-alias.module.css.map +1 -0
  102. package/dist/theme/theme-spectrum/theme-spectrum-overrides.module.css +7 -0
  103. package/dist/theme/theme-spectrum/theme-spectrum-overrides.module.css.map +1 -0
  104. package/dist/theme/theme-spectrum/theme-spectrum-palette.module.css +211 -0
  105. package/dist/theme/theme-spectrum/theme-spectrum-palette.module.css.map +1 -0
  106. package/dist/theme/useTheme.js.map +1 -1
  107. package/package.json +7 -7
  108. package/dist/SpectrumThemeDark.module.css +0 -9
  109. package/dist/SpectrumThemeDark.module.css.map +0 -1
  110. package/dist/SpectrumThemeLight.module.css +0 -9
  111. package/dist/SpectrumThemeLight.module.css.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenu.js","names":["React","PureComponent","classNames","Log","PromiseUtils","ContextActionUtils","ContextMenuItem","LoadingSpinner","log","module","ContextMenu","handleContextMenu","e","metaKey","stopPropagation","preventDefault","constructor","props","handleBlur","bind","handleCloseSubMenu","handleKeyDown","handleMenuItemClick","handleMenuItemContextMenu","handleMenuItemMouseMove","handleMouseLeave","handleWindowResize","container","createRef","oldFocus","document","activeElement","activeSubMenuRef","subMenuTimer","rAF","initialPosition","top","left","state","menuItems","pendingItems","activeSubMenu","hasOverflow","subMenuTop","subMenuLeft","subMenuParentWidth","subMenuParentHeight","keyboardIndex","mouseIndex","componentDidMount","initMenu","verifyPosition","window","addEventListener","requestAnimationFrame","current","focus","onMenuOpened","componentDidUpdate","prevProps","prevState","actions","setActiveSubMenuPosition","contains","componentWillUnmount","cancelPromises","removeEventListener","cancelAnimationFrame","getKeyboardIndex","options","separateKeyboardMouse","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","updatePosition","oldTop","oldLeft","doNotVerifyPosition","scrollHeight","innerHeight","innerWidth","closeMenu","warn","relatedTarget","element","isContextMenuChild","hasAttribute","parentElement","isEscapeKey","key","newFocus","openSubMenu","shiftKey","getNextMenuItem","HTMLElement","newSubMenu","closeAll","onMenuClosed","closeSubMenu","closeAllMenus","disabled","action","focusIndex","render","menuItemElements","group","menuItemElement","pendingElement","menuStyle","dataTestId","showSubmenu","verifiedTop","verifiedLeft"],"sources":["../../src/context-actions/ContextMenu.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils, CancelablePromise } from '@deephaven/utils';\nimport ContextActionUtils, {\n ContextAction,\n ResolvableContextAction,\n} from './ContextActionUtils';\nimport ContextMenuItem from './ContextMenuItem';\nimport LoadingSpinner from '../LoadingSpinner';\n\nconst log = Log.module('ContextMenu');\n\ninterface ContextMenuProps {\n top: number;\n left: number;\n updatePosition(top: number, left: number): void;\n // only submenus will have these, defaults to 0 otherwise\n // represents the width height of the parent menu item\n subMenuParentWidth: number;\n subMenuParentHeight: number;\n actions: ResolvableContextAction[];\n closeMenu(closeAll: boolean): void;\n onMenuClosed(menu: ContextMenu): void;\n onMenuOpened(menu: ContextMenu): void;\n options: {\n doNotVerifyPosition?: boolean;\n separateKeyboardMouse?: boolean;\n initialKeyboardIndex?: number;\n };\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n}\n\ninterface ContextMenuState {\n menuItems: ContextAction[];\n pendingItems: CancelablePromise<ContextAction[]>[];\n activeSubMenu: number | null;\n hasOverflow: boolean;\n subMenuTop: number | null;\n subMenuLeft: number | null;\n subMenuParentWidth: number;\n subMenuParentHeight: number;\n keyboardIndex: number;\n mouseIndex: number;\n}\n\n/** Do not use this class directly. Use ContextMenuRoot and ContextActions instead. */\nclass ContextMenu extends PureComponent<ContextMenuProps, ContextMenuState> {\n static defaultProps = {\n subMenuParentWidth: 0,\n subMenuParentHeight: 0,\n closeMenu(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n onMenuClosed(): void {\n // no-op\n },\n options: {},\n menuStyle: {},\n 'data-testid': undefined,\n };\n\n static handleContextMenu(e: React.MouseEvent): void {\n if (e.metaKey) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n }\n\n constructor(props: ContextMenuProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleCloseSubMenu = this.handleCloseSubMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleMenuItemContextMenu = this.handleMenuItemContextMenu.bind(this);\n this.handleMenuItemMouseMove = this.handleMenuItemMouseMove.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleWindowResize = this.handleWindowResize.bind(this);\n\n this.container = React.createRef();\n this.oldFocus = document.activeElement;\n this.activeSubMenuRef = React.createRef();\n this.subMenuTimer = 0;\n this.rAF = 0;\n\n this.initialPosition = { top: props.top, left: props.left };\n\n this.state = {\n menuItems: [],\n pendingItems: [],\n activeSubMenu: null,\n hasOverflow: false,\n subMenuTop: null,\n subMenuLeft: null,\n subMenuParentWidth: 0,\n subMenuParentHeight: 0,\n keyboardIndex: -1,\n mouseIndex: -1,\n };\n }\n\n componentDidMount(): void {\n this.initMenu();\n\n this.verifyPosition();\n\n window.addEventListener('resize', this.handleWindowResize);\n\n // rAF is needed to wait for a submenus popper to be created before\n // attempting to set focus, however on a quick mount/unmount when\n // mousing past an item, the submenu could be unmounted before the\n // async rAF finishes, so it is cancelled in willUnmount()\n this.rAF = window.requestAnimationFrame(() => {\n this.container.current?.focus();\n\n const { onMenuOpened } = this.props;\n onMenuOpened(this);\n });\n }\n\n componentDidUpdate(\n prevProps: ContextMenuProps,\n prevState: ContextMenuState\n ): void {\n const { actions } = this.props;\n const { activeSubMenu } = this.state;\n\n if (activeSubMenu !== prevState.activeSubMenu) {\n if (activeSubMenu == null) {\n // close sub menu, refocus parent menu\n this.container.current?.focus();\n } else {\n // open sub menu, set its initial position\n this.setActiveSubMenuPosition();\n }\n }\n\n if (prevProps.actions !== actions) {\n this.initMenu();\n\n if (\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();\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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"}
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","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, CancelablePromise } from '@deephaven/utils';\nimport ContextActionUtils, {\n ContextAction,\n ResolvableContextAction,\n} from './ContextActionUtils';\nimport ContextMenuItem from './ContextMenuItem';\nimport LoadingSpinner from '../LoadingSpinner';\n\nconst log = Log.module('ContextMenu');\n\ninterface ContextMenuProps {\n top: number;\n left: number;\n updatePosition(top: number, left: number): void;\n // only submenus will have these, defaults to 0 otherwise\n // represents the width height of the parent menu item\n subMenuParentWidth: number;\n subMenuParentHeight: number;\n actions: ResolvableContextAction[];\n closeMenu(closeAll: boolean): void;\n onMenuClosed(menu: ContextMenu): void;\n onMenuOpened(menu: ContextMenu): void;\n options: {\n doNotVerifyPosition?: boolean;\n separateKeyboardMouse?: boolean;\n initialKeyboardIndex?: number;\n };\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n}\n\ninterface ContextMenuState {\n menuItems: ContextAction[];\n pendingItems: CancelablePromise<ContextAction[]>[];\n activeSubMenu: number | null;\n hasOverflow: boolean;\n subMenuTop: number | null;\n subMenuLeft: number | null;\n subMenuParentWidth: number;\n subMenuParentHeight: number;\n keyboardIndex: number;\n mouseIndex: number;\n}\n\n/** Do not use this class directly. Use ContextMenuRoot and ContextActions instead. */\nclass ContextMenu extends PureComponent<ContextMenuProps, ContextMenuState> {\n static defaultProps = {\n subMenuParentWidth: 0,\n subMenuParentHeight: 0,\n closeMenu(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n onMenuClosed(): void {\n // no-op\n },\n options: {},\n menuStyle: {},\n 'data-testid': undefined,\n };\n\n static handleContextMenu(e: React.MouseEvent): void {\n if (e.metaKey) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n }\n\n constructor(props: ContextMenuProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleCloseSubMenu = this.handleCloseSubMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleMenuItemContextMenu = this.handleMenuItemContextMenu.bind(this);\n this.handleMenuItemMouseMove = this.handleMenuItemMouseMove.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleWindowResize = this.handleWindowResize.bind(this);\n\n this.container = React.createRef();\n this.oldFocus = document.activeElement;\n this.activeSubMenuRef = React.createRef();\n this.subMenuTimer = 0;\n this.rAF = 0;\n\n this.initialPosition = { top: props.top, left: props.left };\n\n this.state = {\n menuItems: [],\n pendingItems: [],\n activeSubMenu: null,\n hasOverflow: false,\n subMenuTop: null,\n subMenuLeft: null,\n subMenuParentWidth: 0,\n subMenuParentHeight: 0,\n keyboardIndex: -1,\n mouseIndex: -1,\n };\n }\n\n componentDidMount(): void {\n this.initMenu();\n\n this.verifyPosition();\n\n window.addEventListener('resize', this.handleWindowResize);\n\n // rAF is needed to wait for a submenus popper to be created before\n // attempting to set focus, however on a quick mount/unmount when\n // mousing past an item, the submenu could be unmounted before the\n // async rAF finishes, so it is cancelled in willUnmount()\n this.rAF = window.requestAnimationFrame(() => {\n this.container.current?.focus();\n\n const { onMenuOpened } = this.props;\n onMenuOpened(this);\n });\n }\n\n componentDidUpdate(\n prevProps: ContextMenuProps,\n prevState: ContextMenuState\n ): void {\n const { actions } = this.props;\n const { activeSubMenu } = this.state;\n\n if (activeSubMenu !== prevState.activeSubMenu) {\n if (activeSubMenu == null) {\n // close sub menu, refocus parent menu\n this.container.current?.focus();\n } else {\n // open sub menu, set its initial position\n this.setActiveSubMenuPosition();\n }\n }\n\n if (prevProps.actions !== actions) {\n this.initMenu();\n\n if (\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();\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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenuItem.js","names":["React","classNames","FontAwesomeIcon","vsChevronRight","ContextMenuItem","forwardRef","props","ref","handleMenuItemClick","e","menuItem","onMenuItemClick","handleMenuItemMouseMove","onMenuItemMouseMove","handleMenuItemContextMenu","onMenuItemContextMenu","renderCustomMenuElement","element","iconElement","displayShortcut","type","closeMenu","isKeyboardSelected","isMouseSelected","dataTestId","forwardedProps","cloneElement","children","shortcut","getDisplayText","icon","menuItemIcon","isValidElement","style","iconColor","disabled","undefined","color","subMenuIndicator","isSubMenuActive","Boolean","actions","content","menuElement","menuItemDisabled","iconHasOutline","iconOutline","active","description","outline","title","displayName","defaultProps"],"sources":["../../src/context-actions/ContextMenuItem.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsChevronRight, IconDefinition } from '@deephaven/icons';\nimport type { ContextAction } from './ContextActionUtils';\n\ninterface ContextMenuItemProps {\n children?: React.ReactNode;\n closeMenu(closeAll: boolean): void;\n isKeyboardSelected?: boolean;\n isMouseSelected?: boolean;\n menuItem: ContextAction;\n onMenuItemClick(item: ContextAction, e: React.MouseEvent): void;\n onMenuItemMouseMove(item: ContextAction, e: React.MouseEvent): void;\n onMenuItemContextMenu(item: ContextAction, e: React.MouseEvent): void;\n 'data-testid'?: string;\n}\n\nconst ContextMenuItem = React.forwardRef<HTMLDivElement, ContextMenuItemProps>(\n (props: ContextMenuItemProps, ref) => {\n function handleMenuItemClick(e: React.MouseEvent): void {\n const { menuItem, onMenuItemClick } = props;\n onMenuItemClick(menuItem, e);\n }\n\n function handleMenuItemMouseMove(e: React.MouseEvent): void {\n const { menuItem, onMenuItemMouseMove } = props;\n onMenuItemMouseMove(menuItem, e);\n }\n\n function handleMenuItemContextMenu(e: React.MouseEvent): void {\n const { menuItem, onMenuItemContextMenu } = props;\n onMenuItemContextMenu(menuItem, e);\n }\n\n function renderCustomMenuElement(\n element: React.ReactElement,\n iconElement: IconDefinition | React.ReactElement | null,\n displayShortcut: string | undefined\n ): JSX.Element {\n // Don't pass forwardedProps if menuElement is a native DOM node\n if (typeof element.type === 'string') {\n return element;\n }\n const {\n closeMenu,\n menuItem,\n isKeyboardSelected,\n isMouseSelected,\n 'data-testid': dataTestId,\n } = props;\n const forwardedProps = {\n menuItem,\n closeMenu,\n isKeyboardSelected,\n isMouseSelected,\n iconElement,\n displayShortcut,\n 'data-testid': dataTestId,\n };\n return React.cloneElement(element, {\n forwardedProps,\n });\n }\n\n const {\n children,\n menuItem,\n isKeyboardSelected = false,\n isMouseSelected = false,\n 'data-testid': dataTestId,\n } = props;\n\n const displayShortcut = menuItem.shortcut?.getDisplayText();\n let icon: IconDefinition | React.ReactElement | null = null;\n if (menuItem.icon) {\n const menuItemIcon = menuItem.icon;\n if (React.isValidElement(menuItemIcon)) {\n icon = menuItemIcon;\n } else {\n let style: React.CSSProperties | undefined;\n if (\n menuItem.iconColor != null &&\n (menuItem.disabled === undefined || !menuItem.disabled)\n ) {\n style = { color: menuItem.iconColor };\n }\n icon = <FontAwesomeIcon icon={menuItemIcon} style={style} />;\n }\n }\n\n let subMenuIndicator = null;\n const isSubMenuActive = Boolean(children);\n if (menuItem.actions) {\n subMenuIndicator = <FontAwesomeIcon icon={vsChevronRight} />;\n }\n let content = null;\n if (menuItem.menuElement) {\n content = (\n <div className=\"custom-menu-item\" onMouseMove={handleMenuItemMouseMove}>\n {renderCustomMenuElement(menuItem.menuElement, icon, displayShortcut)}\n </div>\n );\n } else {\n const menuItemDisabled = menuItem.disabled;\n const iconHasOutline = menuItem.iconOutline;\n content = (\n <button\n type=\"button\"\n className={classNames(\n 'btn-context-menu',\n { disabled: menuItemDisabled },\n {\n active:\n (isSubMenuActive || isMouseSelected) &&\n (menuItemDisabled === undefined || !menuItemDisabled),\n },\n {\n 'keyboard-active':\n isKeyboardSelected &&\n (menuItemDisabled === undefined || !menuItemDisabled),\n }\n )}\n onClick={handleMenuItemClick}\n onMouseMove={handleMenuItemMouseMove}\n onContextMenu={handleMenuItemContextMenu}\n title={menuItem.description ?? ''}\n >\n <div className=\"btn-context-menu-wrapper\">\n <span className={classNames('icon', { outline: iconHasOutline })}>\n {icon}\n </span>\n <span className=\"title\">{menuItem.title}</span>\n {displayShortcut !== undefined && (\n <span className=\"shortcut\">{displayShortcut}</span>\n )}\n {subMenuIndicator && (\n <span\n className={classNames('submenu-indicator', {\n disabled: menuItemDisabled,\n })}\n >\n {subMenuIndicator}\n </span>\n )}\n </div>\n </button>\n );\n }\n\n return (\n <div className=\"context-menu-item\" ref={ref} data-testid={dataTestId}>\n {children}\n {content}\n </div>\n );\n }\n);\n\nContextMenuItem.displayName = 'ContextMenuItem';\n\nContextMenuItem.defaultProps = {\n children: null,\n isKeyboardSelected: false,\n isMouseSelected: false,\n 'data-testid': undefined,\n};\n\nexport default ContextMenuItem;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ContextMenuItem.js","names":["React","classNames","FontAwesomeIcon","vsChevronRight","jsx","_jsx","jsxs","_jsxs","ContextMenuItem","forwardRef","props","ref","_menuItem$shortcut","handleMenuItemClick","e","menuItem","onMenuItemClick","handleMenuItemMouseMove","onMenuItemMouseMove","handleMenuItemContextMenu","onMenuItemContextMenu","renderCustomMenuElement","element","iconElement","displayShortcut","type","closeMenu","isKeyboardSelected","isMouseSelected","dataTestId","forwardedProps","cloneElement","children","shortcut","getDisplayText","icon","menuItemIcon","isValidElement","style","iconColor","disabled","undefined","color","subMenuIndicator","isSubMenuActive","Boolean","actions","content","menuElement","className","onMouseMove","_menuItem$description","menuItemDisabled","iconHasOutline","iconOutline","active","onClick","onContextMenu","title","description","outline","displayName","defaultProps"],"sources":["../../src/context-actions/ContextMenuItem.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsChevronRight, IconDefinition } from '@deephaven/icons';\nimport type { ContextAction } from './ContextActionUtils';\n\ninterface ContextMenuItemProps {\n children?: React.ReactNode;\n closeMenu(closeAll: boolean): void;\n isKeyboardSelected?: boolean;\n isMouseSelected?: boolean;\n menuItem: ContextAction;\n onMenuItemClick(item: ContextAction, e: React.MouseEvent): void;\n onMenuItemMouseMove(item: ContextAction, e: React.MouseEvent): void;\n onMenuItemContextMenu(item: ContextAction, e: React.MouseEvent): void;\n 'data-testid'?: string;\n}\n\nconst ContextMenuItem = React.forwardRef<HTMLDivElement, ContextMenuItemProps>(\n (props: ContextMenuItemProps, ref) => {\n function handleMenuItemClick(e: React.MouseEvent): void {\n const { menuItem, onMenuItemClick } = props;\n onMenuItemClick(menuItem, e);\n }\n\n function handleMenuItemMouseMove(e: React.MouseEvent): void {\n const { menuItem, onMenuItemMouseMove } = props;\n onMenuItemMouseMove(menuItem, e);\n }\n\n function handleMenuItemContextMenu(e: React.MouseEvent): void {\n const { menuItem, onMenuItemContextMenu } = props;\n onMenuItemContextMenu(menuItem, e);\n }\n\n function renderCustomMenuElement(\n element: React.ReactElement,\n iconElement: IconDefinition | React.ReactElement | null,\n displayShortcut: string | undefined\n ): JSX.Element {\n // Don't pass forwardedProps if menuElement is a native DOM node\n if (typeof element.type === 'string') {\n return element;\n }\n const {\n closeMenu,\n menuItem,\n isKeyboardSelected,\n isMouseSelected,\n 'data-testid': dataTestId,\n } = props;\n const forwardedProps = {\n menuItem,\n closeMenu,\n isKeyboardSelected,\n isMouseSelected,\n iconElement,\n displayShortcut,\n 'data-testid': dataTestId,\n };\n return React.cloneElement(element, {\n forwardedProps,\n });\n }\n\n const {\n children,\n menuItem,\n isKeyboardSelected = false,\n isMouseSelected = false,\n 'data-testid': dataTestId,\n } = props;\n\n const displayShortcut = menuItem.shortcut?.getDisplayText();\n let icon: IconDefinition | React.ReactElement | null = null;\n if (menuItem.icon) {\n const menuItemIcon = menuItem.icon;\n if (React.isValidElement(menuItemIcon)) {\n icon = menuItemIcon;\n } else {\n let style: React.CSSProperties | undefined;\n if (\n menuItem.iconColor != null &&\n (menuItem.disabled === undefined || !menuItem.disabled)\n ) {\n style = { color: menuItem.iconColor };\n }\n icon = <FontAwesomeIcon icon={menuItemIcon} style={style} />;\n }\n }\n\n let subMenuIndicator = null;\n const isSubMenuActive = Boolean(children);\n if (menuItem.actions) {\n subMenuIndicator = <FontAwesomeIcon icon={vsChevronRight} />;\n }\n let content = null;\n if (menuItem.menuElement) {\n content = (\n <div className=\"custom-menu-item\" onMouseMove={handleMenuItemMouseMove}>\n {renderCustomMenuElement(menuItem.menuElement, icon, displayShortcut)}\n </div>\n );\n } else {\n const menuItemDisabled = menuItem.disabled;\n const iconHasOutline = menuItem.iconOutline;\n content = (\n <button\n type=\"button\"\n className={classNames(\n 'btn-context-menu',\n { disabled: menuItemDisabled },\n {\n active:\n (isSubMenuActive || isMouseSelected) &&\n (menuItemDisabled === undefined || !menuItemDisabled),\n },\n {\n 'keyboard-active':\n isKeyboardSelected &&\n (menuItemDisabled === undefined || !menuItemDisabled),\n }\n )}\n onClick={handleMenuItemClick}\n onMouseMove={handleMenuItemMouseMove}\n onContextMenu={handleMenuItemContextMenu}\n title={menuItem.description ?? ''}\n >\n <div className=\"btn-context-menu-wrapper\">\n <span className={classNames('icon', { outline: iconHasOutline })}>\n {icon}\n </span>\n <span className=\"title\">{menuItem.title}</span>\n {displayShortcut !== undefined && (\n <span className=\"shortcut\">{displayShortcut}</span>\n )}\n {subMenuIndicator && (\n <span\n className={classNames('submenu-indicator', {\n disabled: menuItemDisabled,\n })}\n >\n {subMenuIndicator}\n </span>\n )}\n </div>\n </button>\n );\n }\n\n return (\n <div className=\"context-menu-item\" ref={ref} data-testid={dataTestId}>\n {children}\n {content}\n </div>\n );\n }\n);\n\nContextMenuItem.displayName = 'ContextMenuItem';\n\nContextMenuItem.defaultProps = {\n children: null,\n isKeyboardSelected: false,\n isMouseSelected: false,\n 'data-testid': undefined,\n};\n\nexport default ContextMenuItem;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenuRoot.js","names":["React","Component","classNames","ContextMenu","ContextActionUtils","ContextMenuRoot","constructor","props","handleMenuClose","bind","handleContextMenu","container","createRef","openMenu","state","actions","left","top","componentDidMount","current","parentElement","addEventListener","componentWillUnmount","removeEventListener","e","parentRect","getBoundingClientRect","clientY","clientX","target","preventDefault","setState","element","document","elementFromPoint","mouseEvent","MouseEvent","bubbles","cancelable","dispatchEvent","isContextActionEvent","metaKey","ctrlKey","contextActions","getMenuItems","length","menu","render","dataTestId","verifiedTop","verifiedLeft","active"],"sources":["../../src/context-actions/ContextMenuRoot.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport classNames from 'classnames';\nimport ContextMenu from './ContextMenu';\nimport ContextActionUtils, { MenuItem } from './ContextActionUtils';\n\ntype ContextMenuRootProps = Record<string, never> & {\n 'data-testid'?: string;\n};\n\ninterface ContextMenuRootState {\n actions: MenuItem[] | null;\n left: number;\n top: number;\n}\n\n/**\n * Put at your root container, any contextmenu events that are unhandled in the root container will be handled by this\n */\nclass ContextMenuRoot extends Component<\n ContextMenuRootProps,\n ContextMenuRootState\n> {\n constructor(props: ContextMenuRootProps) {\n super(props);\n\n this.handleMenuClose = this.handleMenuClose.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.container = React.createRef();\n this.openMenu = React.createRef();\n\n this.state = {\n actions: null,\n left: 0,\n top: 0,\n };\n }\n\n componentDidMount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.addEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n }\n }\n\n componentWillUnmount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.removeEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n openMenu: React.RefObject<ContextMenu>;\n\n handleContextMenu(e: MouseEvent): void {\n if (!this.container.current) {\n return;\n }\n\n const parentRect = this.container.current.getBoundingClientRect();\n const top = e.clientY - parentRect.top;\n const left = e.clientX - parentRect.left;\n const { actions } = this.state;\n\n // Context menu is open and user clicked on the context-root blocking layer\n // Mac and Linux appear to trigger contextmenu events on mousedown vs. mouseup on Windows\n // Mouseup on Windows triggers blur before contextmenu which effectively does what this path does\n if (actions != null && e.target === this.container.current) {\n // re-emit right clicks that hit the context-root blocking layer\n // while we already have a custom context menu open\n e.preventDefault();\n\n // Set actions to null removes the menu\n // That allows a new menu to be opened on a different element so initial position is set properly\n // Otherwise the instance of this menu may be reused\n // A new contextmenu event is triggered on the element at the location the user clicked on the blocking layer\n this.setState({ actions: null }, () => {\n const element = document.elementFromPoint(left, top); // x y\n\n const mouseEvent = new MouseEvent('contextmenu', {\n clientX: e.clientX,\n clientY: e.clientY,\n bubbles: true,\n cancelable: true,\n });\n\n element?.dispatchEvent(mouseEvent);\n });\n return;\n }\n\n if (!ContextActionUtils.isContextActionEvent(e)) {\n // Open native menu if no custom context actions\n return;\n }\n\n if (e.metaKey || e.ctrlKey) {\n // debug escape hatch to native menu\n return;\n }\n\n const contextActions = ContextActionUtils.getMenuItems(e.contextActions);\n\n if (contextActions.length === 0) {\n // No actions after filtering. Use native menu\n return;\n }\n\n // new clicks, set actions\n e.preventDefault();\n this.setState({\n actions: contextActions,\n top,\n left,\n });\n }\n\n handleMenuClose(menu: ContextMenu): void {\n if (menu === this.openMenu.current) {\n this.setState({ actions: null });\n }\n }\n\n render(): JSX.Element {\n let menu = null;\n const { 'data-testid': dataTestId } = this.props;\n const { actions, top, left } = this.state;\n if (actions) {\n menu = (\n <ContextMenu\n ref={this.openMenu}\n actions={actions}\n onMenuClosed={this.handleMenuClose}\n top={top}\n left={left}\n updatePosition={(verifiedTop, verifiedLeft) => {\n this.setState({ top: verifiedTop, left: verifiedLeft });\n }}\n data-testid={dataTestId}\n />\n );\n }\n return (\n <div\n className={classNames('context-menu-root', { active: actions })}\n ref={this.container}\n >\n {menu}\n </div>\n );\n }\n}\n\nexport default ContextMenuRoot;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ContextMenuRoot.js","names":["React","Component","classNames","ContextMenu","ContextActionUtils","jsx","_jsx","ContextMenuRoot","constructor","props","_defineProperty","handleMenuClose","bind","handleContextMenu","container","createRef","openMenu","state","actions","left","top","componentDidMount","_this$container$curre","current","parentElement","addEventListener","componentWillUnmount","_this$container$curre2","removeEventListener","e","parentRect","getBoundingClientRect","clientY","clientX","target","preventDefault","setState","element","document","elementFromPoint","mouseEvent","MouseEvent","bubbles","cancelable","dispatchEvent","isContextActionEvent","metaKey","ctrlKey","contextActions","getMenuItems","length","menu","render","dataTestId","ref","onMenuClosed","updatePosition","verifiedTop","verifiedLeft","className","active","children"],"sources":["../../src/context-actions/ContextMenuRoot.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport classNames from 'classnames';\nimport ContextMenu from './ContextMenu';\nimport ContextActionUtils, { MenuItem } from './ContextActionUtils';\n\ntype ContextMenuRootProps = Record<string, never> & {\n 'data-testid'?: string;\n};\n\ninterface ContextMenuRootState {\n actions: MenuItem[] | null;\n left: number;\n top: number;\n}\n\n/**\n * Put at your root container, any contextmenu events that are unhandled in the root container will be handled by this\n */\nclass ContextMenuRoot extends Component<\n ContextMenuRootProps,\n ContextMenuRootState\n> {\n constructor(props: ContextMenuRootProps) {\n super(props);\n\n this.handleMenuClose = this.handleMenuClose.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.container = React.createRef();\n this.openMenu = React.createRef();\n\n this.state = {\n actions: null,\n left: 0,\n top: 0,\n };\n }\n\n componentDidMount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.addEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n }\n }\n\n componentWillUnmount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.removeEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n openMenu: React.RefObject<ContextMenu>;\n\n handleContextMenu(e: MouseEvent): void {\n if (!this.container.current) {\n return;\n }\n\n const parentRect = this.container.current.getBoundingClientRect();\n const top = e.clientY - parentRect.top;\n const left = e.clientX - parentRect.left;\n const { actions } = this.state;\n\n // Context menu is open and user clicked on the context-root blocking layer\n // Mac and Linux appear to trigger contextmenu events on mousedown vs. mouseup on Windows\n // Mouseup on Windows triggers blur before contextmenu which effectively does what this path does\n if (actions != null && e.target === this.container.current) {\n // re-emit right clicks that hit the context-root blocking layer\n // while we already have a custom context menu open\n e.preventDefault();\n\n // Set actions to null removes the menu\n // That allows a new menu to be opened on a different element so initial position is set properly\n // Otherwise the instance of this menu may be reused\n // A new contextmenu event is triggered on the element at the location the user clicked on the blocking layer\n this.setState({ actions: null }, () => {\n const element = document.elementFromPoint(left, top); // x y\n\n const mouseEvent = new MouseEvent('contextmenu', {\n clientX: e.clientX,\n clientY: e.clientY,\n bubbles: true,\n cancelable: true,\n });\n\n element?.dispatchEvent(mouseEvent);\n });\n return;\n }\n\n if (!ContextActionUtils.isContextActionEvent(e)) {\n // Open native menu if no custom context actions\n return;\n }\n\n if (e.metaKey || e.ctrlKey) {\n // debug escape hatch to native menu\n return;\n }\n\n const contextActions = ContextActionUtils.getMenuItems(e.contextActions);\n\n if (contextActions.length === 0) {\n // No actions after filtering. Use native menu\n return;\n }\n\n // new clicks, set actions\n e.preventDefault();\n this.setState({\n actions: contextActions,\n top,\n left,\n });\n }\n\n handleMenuClose(menu: ContextMenu): void {\n if (menu === this.openMenu.current) {\n this.setState({ actions: null });\n }\n }\n\n render(): JSX.Element {\n let menu = null;\n const { 'data-testid': dataTestId } = this.props;\n const { actions, top, left } = this.state;\n if (actions) {\n menu = (\n <ContextMenu\n ref={this.openMenu}\n actions={actions}\n onMenuClosed={this.handleMenuClose}\n top={top}\n left={left}\n updatePosition={(verifiedTop, verifiedLeft) => {\n this.setState({ top: verifiedTop, left: verifiedLeft });\n }}\n data-testid={dataTestId}\n />\n );\n }\n return (\n <div\n className={classNames('context-menu-root', { active: actions })}\n ref={this.container}\n >\n {menu}\n </div>\n );\n }\n}\n\nexport default ContextMenuRoot;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalContextAction.js","names":["Component","Log","ContextActionUtils","log","module","GlobalContextAction","constructor","props","handleContextMenu","bind","handleKeyDown","componentDidMount","document","body","addEventListener","componentWillUnmount","removeEventListener","evt","e","contextActions","action","title","menuElement","push","debug","actionsDisabled","shortcut","undefined","matchesEvent","preventDefault","stopPropagation","render"],"sources":["../../src/context-actions/GlobalContextAction.tsx"],"sourcesContent":["import { Component } from 'react';\nimport Log from '@deephaven/log';\nimport ContextActionUtils from './ContextActionUtils';\nimport type { ContextAction, ContextActionEvent } from './ContextActionUtils';\n\nconst log = Log.module('GlobalContextAction');\n\ninterface GlobalContextActionProps {\n action: ContextAction;\n}\n\nclass GlobalContextAction extends Component<GlobalContextActionProps> {\n constructor(props: GlobalContextActionProps) {\n super(props);\n\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentDidMount(): void {\n document.body.addEventListener('contextmenu', this.handleContextMenu);\n document.body.addEventListener('keydown', this.handleKeyDown);\n }\n\n componentWillUnmount(): void {\n document.body.removeEventListener('contextmenu', this.handleContextMenu);\n document.body.removeEventListener('keydown', this.handleKeyDown);\n }\n\n handleContextMenu(evt: MouseEvent): void {\n const e = evt as ContextActionEvent;\n if (e.contextActions == null) {\n e.contextActions = [];\n }\n\n const { action } = this.props;\n\n if (action.title == null && !action.menuElement) {\n return;\n }\n\n if (e.contextActions == null) {\n e.contextActions = [];\n }\n\n e.contextActions.push(action);\n\n log.debug(\n 'Received context menu event at global action! Menu items are now: ',\n e.contextActions\n );\n }\n\n handleKeyDown(e: KeyboardEvent): void {\n const { action } = this.props;\n if (\n !ContextActionUtils.actionsDisabled &&\n action.shortcut !== undefined &&\n action.shortcut.matchesEvent(e)\n ) {\n log.debug('Global hotkey matched!', e);\n\n action.action?.(e);\n\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n render(): null {\n return null;\n }\n}\n\nexport default GlobalContextAction;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,kBAAkB;AAGzB,IAAMC,GAAG,GAAGF,GAAG,CAACG,MAAM,CAAC,qBAAqB,CAAC;AAM7C,MAAMC,mBAAmB,SAASL,SAAS,CAA2B;EACpEM,WAAW,CAACC,KAA+B,EAAE;IAC3C,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACC,aAAa,GAAG,IAAI,CAACA,aAAa,CAACD,IAAI,CAAC,IAAI,CAAC;EACpD;EAEAE,iBAAiB,GAAS;IACxBC,QAAQ,CAACC,IAAI,CAACC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAACN,iBAAiB,CAAC;IACrEI,QAAQ,CAACC,IAAI,CAACC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACJ,aAAa,CAAC;EAC/D;EAEAK,oBAAoB,GAAS;IAC3BH,QAAQ,CAACC,IAAI,CAACG,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAACR,iBAAiB,CAAC;IACxEI,QAAQ,CAACC,IAAI,CAACG,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACN,aAAa,CAAC;EAClE;EAEAF,iBAAiB,CAACS,GAAe,EAAQ;IACvC,IAAMC,CAAC,GAAGD,GAAyB;IACnC,IAAIC,CAAC,CAACC,cAAc,IAAI,IAAI,EAAE;MAC5BD,CAAC,CAACC,cAAc,GAAG,EAAE;IACvB;IAEA,IAAM;MAAEC;IAAO,CAAC,GAAG,IAAI,CAACb,KAAK;IAE7B,IAAIa,MAAM,CAACC,KAAK,IAAI,IAAI,IAAI,CAACD,MAAM,CAACE,WAAW,EAAE;MAC/C;IACF;IAEA,IAAIJ,CAAC,CAACC,cAAc,IAAI,IAAI,EAAE;MAC5BD,CAAC,CAACC,cAAc,GAAG,EAAE;IACvB;IAEAD,CAAC,CAACC,cAAc,CAACI,IAAI,CAACH,MAAM,CAAC;IAE7BjB,GAAG,CAACqB,KAAK,CACP,oEAAoE,EACpEN,CAAC,CAACC,cAAc,CACjB;EACH;EAEAT,aAAa,CAACQ,CAAgB,EAAQ;IACpC,IAAM;MAAEE;IAAO,CAAC,GAAG,IAAI,CAACb,KAAK;IAC7B,IACE,CAACL,kBAAkB,CAACuB,eAAe,IACnCL,MAAM,CAACM,QAAQ,KAAKC,SAAS,IAC7BP,MAAM,CAACM,QAAQ,CAACE,YAAY,CAACV,CAAC,CAAC,EAC/B;MAAA;MACAf,GAAG,CAACqB,KAAK,CAAC,wBAAwB,EAAEN,CAAC,CAAC;MAEtC,kBAAAE,MAAM,CAACA,MAAM,mDAAb,oBAAAA,MAAM,EAAUF,CAAC,CAAC;MAElBA,CAAC,CAACW,cAAc,EAAE;MAClBX,CAAC,CAACY,eAAe,EAAE;IACrB;EACF;EAEAC,MAAM,GAAS;IACb,OAAO,IAAI;EACb;AACF;AAEA,eAAe1B,mBAAmB"}
1
+ {"version":3,"file":"GlobalContextAction.js","names":["Component","Log","ContextActionUtils","log","module","GlobalContextAction","constructor","props","handleContextMenu","bind","handleKeyDown","componentDidMount","document","body","addEventListener","componentWillUnmount","removeEventListener","evt","e","contextActions","action","title","menuElement","push","debug","actionsDisabled","shortcut","undefined","matchesEvent","_action$action","call","preventDefault","stopPropagation","render"],"sources":["../../src/context-actions/GlobalContextAction.tsx"],"sourcesContent":["import { Component } from 'react';\nimport Log from '@deephaven/log';\nimport ContextActionUtils from './ContextActionUtils';\nimport type { ContextAction, ContextActionEvent } from './ContextActionUtils';\n\nconst log = Log.module('GlobalContextAction');\n\ninterface GlobalContextActionProps {\n action: ContextAction;\n}\n\nclass GlobalContextAction extends Component<GlobalContextActionProps> {\n constructor(props: GlobalContextActionProps) {\n super(props);\n\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n }\n\n componentDidMount(): void {\n document.body.addEventListener('contextmenu', this.handleContextMenu);\n document.body.addEventListener('keydown', this.handleKeyDown);\n }\n\n componentWillUnmount(): void {\n document.body.removeEventListener('contextmenu', this.handleContextMenu);\n document.body.removeEventListener('keydown', this.handleKeyDown);\n }\n\n handleContextMenu(evt: MouseEvent): void {\n const e = evt as ContextActionEvent;\n if (e.contextActions == null) {\n e.contextActions = [];\n }\n\n const { action } = this.props;\n\n if (action.title == null && !action.menuElement) {\n return;\n }\n\n if (e.contextActions == null) {\n e.contextActions = [];\n }\n\n e.contextActions.push(action);\n\n log.debug(\n 'Received context menu event at global action! Menu items are now: ',\n e.contextActions\n );\n }\n\n handleKeyDown(e: KeyboardEvent): void {\n const { action } = this.props;\n if (\n !ContextActionUtils.actionsDisabled &&\n action.shortcut !== undefined &&\n action.shortcut.matchesEvent(e)\n ) {\n log.debug('Global hotkey matched!', e);\n\n action.action?.(e);\n\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n render(): null {\n return null;\n }\n}\n\nexport default GlobalContextAction;\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,OAAO;AACjC,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,kBAAkB;AAGzB,IAAMC,GAAG,GAAGF,GAAG,CAACG,MAAM,CAAC,qBAAqB,CAAC;AAM7C,MAAMC,mBAAmB,SAASL,SAAS,CAA2B;EACpEM,WAAWA,CAACC,KAA+B,EAAE;IAC3C,KAAK,CAACA,KAAK,CAAC;IAEZ,IAAI,CAACC,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACC,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACC,aAAa,GAAG,IAAI,CAACA,aAAa,CAACD,IAAI,CAAC,IAAI,CAAC;EACpD;EAEAE,iBAAiBA,CAAA,EAAS;IACxBC,QAAQ,CAACC,IAAI,CAACC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAACN,iBAAiB,CAAC;IACrEI,QAAQ,CAACC,IAAI,CAACC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACJ,aAAa,CAAC;EAC/D;EAEAK,oBAAoBA,CAAA,EAAS;IAC3BH,QAAQ,CAACC,IAAI,CAACG,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAACR,iBAAiB,CAAC;IACxEI,QAAQ,CAACC,IAAI,CAACG,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACN,aAAa,CAAC;EAClE;EAEAF,iBAAiBA,CAACS,GAAe,EAAQ;IACvC,IAAMC,CAAC,GAAGD,GAAyB;IACnC,IAAIC,CAAC,CAACC,cAAc,IAAI,IAAI,EAAE;MAC5BD,CAAC,CAACC,cAAc,GAAG,EAAE;IACvB;IAEA,IAAM;MAAEC;IAAO,CAAC,GAAG,IAAI,CAACb,KAAK;IAE7B,IAAIa,MAAM,CAACC,KAAK,IAAI,IAAI,IAAI,CAACD,MAAM,CAACE,WAAW,EAAE;MAC/C;IACF;IAEA,IAAIJ,CAAC,CAACC,cAAc,IAAI,IAAI,EAAE;MAC5BD,CAAC,CAACC,cAAc,GAAG,EAAE;IACvB;IAEAD,CAAC,CAACC,cAAc,CAACI,IAAI,CAACH,MAAM,CAAC;IAE7BjB,GAAG,CAACqB,KAAK,CACP,oEAAoE,EACpEN,CAAC,CAACC,cACJ,CAAC;EACH;EAEAT,aAAaA,CAACQ,CAAgB,EAAQ;IACpC,IAAM;MAAEE;IAAO,CAAC,GAAG,IAAI,CAACb,KAAK;IAC7B,IACE,CAACL,kBAAkB,CAACuB,eAAe,IACnCL,MAAM,CAACM,QAAQ,KAAKC,SAAS,IAC7BP,MAAM,CAACM,QAAQ,CAACE,YAAY,CAACV,CAAC,CAAC,EAC/B;MAAA,IAAAW,cAAA;MACA1B,GAAG,CAACqB,KAAK,CAAC,wBAAwB,EAAEN,CAAC,CAAC;MAEtC,CAAAW,cAAA,GAAAT,MAAM,CAACA,MAAM,cAAAS,cAAA,uBAAbA,cAAA,CAAAC,IAAA,CAAAV,MAAM,EAAUF,CAAC,CAAC;MAElBA,CAAC,CAACa,cAAc,CAAC,CAAC;MAClBb,CAAC,CAACc,eAAe,CAAC,CAAC;IACrB;EACF;EAEAC,MAAMA,CAAA,EAAS;IACb,OAAO,IAAI;EACb;AACF;AAEA,eAAe5B,mBAAmB"}
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalContextActions.js","names":["React","Component","GlobalContextAction","GlobalContextActions","render","actions","dataTestId","props","actionElements","i","length","action","shortcut","title","menuElement","actionElement","id","push"],"sources":["../../src/context-actions/GlobalContextActions.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport GlobalContextAction from './GlobalContextAction';\nimport type { ContextAction } from './ContextActionUtils';\n\ninterface GlobalContextActionsProps {\n actions: ContextAction[];\n 'data-testid'?: string;\n}\n\nclass GlobalContextActions extends Component<GlobalContextActionsProps> {\n render(): React.ReactNode {\n const { actions, 'data-testid': dataTestId } = this.props;\n const actionElements = [];\n for (let i = 0; i < actions.length; i += 1) {\n const action = actions[i];\n const { shortcut } = action;\n if (action.title != null || action.menuElement || shortcut) {\n const actionElement = (\n <GlobalContextAction\n key={`${action.title}.${shortcut?.id}`}\n action={action}\n data-testid={dataTestId}\n />\n );\n actionElements.push(actionElement);\n }\n }\n return actionElements;\n }\n}\n\nexport default GlobalContextActions;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAQ,OAAO;AAAC,OAClCC,mBAAmB;AAAA;AAQ1B,MAAMC,oBAAoB,SAASF,SAAS,CAA4B;EACtEG,MAAM,GAAoB;IACxB,IAAM;MAAEC,OAAO;MAAE,aAAa,EAAEC;IAAW,CAAC,GAAG,IAAI,CAACC,KAAK;IACzD,IAAMC,cAAc,GAAG,EAAE;IACzB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,OAAO,CAACK,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;MAC1C,IAAME,MAAM,GAAGN,OAAO,CAACI,CAAC,CAAC;MACzB,IAAM;QAAEG;MAAS,CAAC,GAAGD,MAAM;MAC3B,IAAIA,MAAM,CAACE,KAAK,IAAI,IAAI,IAAIF,MAAM,CAACG,WAAW,IAAIF,QAAQ,EAAE;QAC1D,IAAMG,aAAa,gBACjB,KAAC,mBAAmB;UAElB,MAAM,EAAEJ,MAAO;UACf,eAAaL;QAAW,aAFhBK,MAAM,CAACE,KAAK,cAAID,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAEI,EAAE,EAIvC;QACDR,cAAc,CAACS,IAAI,CAACF,aAAa,CAAC;MACpC;IACF;IACA,OAAOP,cAAc;EACvB;AACF;AAEA,eAAeL,oBAAoB"}
1
+ {"version":3,"file":"GlobalContextActions.js","names":["React","Component","GlobalContextAction","jsx","_jsx","GlobalContextActions","render","actions","dataTestId","props","actionElements","i","length","action","shortcut","title","menuElement","actionElement","concat","id","push"],"sources":["../../src/context-actions/GlobalContextActions.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport GlobalContextAction from './GlobalContextAction';\nimport type { ContextAction } from './ContextActionUtils';\n\ninterface GlobalContextActionsProps {\n actions: ContextAction[];\n 'data-testid'?: string;\n}\n\nclass GlobalContextActions extends Component<GlobalContextActionsProps> {\n render(): React.ReactNode {\n const { actions, 'data-testid': dataTestId } = this.props;\n const actionElements = [];\n for (let i = 0; i < actions.length; i += 1) {\n const action = actions[i];\n const { shortcut } = action;\n if (action.title != null || action.menuElement || shortcut) {\n const actionElement = (\n <GlobalContextAction\n key={`${action.title}.${shortcut?.id}`}\n action={action}\n data-testid={dataTestId}\n />\n );\n actionElements.push(actionElement);\n }\n }\n return actionElements;\n }\n}\n\nexport default GlobalContextActions;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAQ,OAAO;AAAC,OAClCC,mBAAmB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAQ1B,MAAMC,oBAAoB,SAASJ,SAAS,CAA4B;EACtEK,MAAMA,CAAA,EAAoB;IACxB,IAAM;MAAEC,OAAO;MAAE,aAAa,EAAEC;IAAW,CAAC,GAAG,IAAI,CAACC,KAAK;IACzD,IAAMC,cAAc,GAAG,EAAE;IACzB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,OAAO,CAACK,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;MAC1C,IAAME,MAAM,GAAGN,OAAO,CAACI,CAAC,CAAC;MACzB,IAAM;QAAEG;MAAS,CAAC,GAAGD,MAAM;MAC3B,IAAIA,MAAM,CAACE,KAAK,IAAI,IAAI,IAAIF,MAAM,CAACG,WAAW,IAAIF,QAAQ,EAAE;QAC1D,IAAMG,aAAa,gBACjBb,IAAA,CAACF,mBAAmB;UAElBW,MAAM,EAAEA,MAAO;UACf,eAAaL;QAAW,MAAAU,MAAA,CAFhBL,MAAM,CAACE,KAAK,OAAAG,MAAA,CAAIJ,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAEK,EAAE,CAGrC,CACF;QACDT,cAAc,CAACU,IAAI,CAACH,aAAa,CAAC;MACpC;IACF;IACA,OAAOP,cAAc;EACvB;AACF;AAEA,eAAeL,oBAAoB"}
@@ -1 +1 @@
1
- {"version":3,"file":"declaration.d.js","names":[],"sources":["../src/declaration.d.ts"],"sourcesContent":["declare module '*.module.scss' {\n const content: Record<string, string>;\n export default content;\n}\n\ndeclare module '*.css?inline' {\n const content: string;\n export default content;\n}\n\ndeclare module '*.scss?inline' {\n const content: string;\n export default content;\n}\n\ndeclare module '*.scss';\n"],"mappings":""}
1
+ {"version":3,"file":"declaration.d.js","names":[],"sources":["../src/declaration.d.ts"],"sourcesContent":["declare module '*.module.css' {\n const content: Record<string, string>;\n export default content;\n}\ndeclare module '*.module.scss' {\n const content: Record<string, string>;\n export default content;\n}\n\ndeclare module '*.css?inline' {\n const content: string;\n export default content;\n}\n\ndeclare module '*.scss?inline' {\n const content: string;\n export default content;\n}\n\ndeclare module '*.scss';\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"ActionButtonDialogTrigger.js","names":["ActionButton","DialogTrigger","Icon","Text","FontAwesomeIcon","ActionButtonDialogTrigger","ariaLabel","icon","isQuiet","labelText","children","onOpenChange","styleProps"],"sources":["../../src/dialogs/ActionButtonDialogTrigger.tsx"],"sourcesContent":["import { ReactElement } from 'react';\nimport { ActionButton, DialogTrigger, Icon, Text } from '@adobe/react-spectrum';\nimport type { SpectrumDialogClose } from '@react-types/dialog';\nimport type { StyleProps } from '@react-types/shared';\nimport type { IconDefinition } from '@fortawesome/fontawesome-common-types';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nexport interface ActionButtonDialogTriggerProps extends StyleProps {\n icon: IconDefinition;\n isQuiet?: boolean;\n labelText?: string;\n ariaLabel?: string;\n children: SpectrumDialogClose | ReactElement;\n onOpenChange?: (isOpen: boolean) => void;\n}\n\n/**\n * Dialog trigger based on an ActionButton.\n */\nexport function ActionButtonDialogTrigger({\n ariaLabel,\n icon,\n isQuiet,\n labelText,\n children,\n onOpenChange,\n ...styleProps\n}: ActionButtonDialogTriggerProps): JSX.Element {\n return (\n <DialogTrigger type=\"popover\" onOpenChange={onOpenChange}>\n <ActionButton\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...styleProps}\n aria-label={ariaLabel ?? labelText}\n isQuiet={isQuiet}\n >\n <Icon>\n <FontAwesomeIcon icon={icon} />\n </Icon>\n {labelText == null ? null : <Text>{labelText}</Text>}\n </ActionButton>\n {children}\n </DialogTrigger>\n );\n}\n\nexport default ActionButtonDialogTrigger;\n"],"mappings":";;;;;;;;AACA,SAASA,YAAY,EAAEC,aAAa,EAAEC,IAAI,EAAEC,IAAI,QAAQ,uBAAuB;AAI/E,SAASC,eAAe,QAAQ,gCAAgC;AAAC;AAAA;AAWjE;AACA;AACA;AACA,OAAO,SAASC,yBAAyB,OAQO;EAAA,IARN;MACxCC,SAAS;MACTC,IAAI;MACJC,OAAO;MACPC,SAAS;MACTC,QAAQ;MACRC;IAE8B,CAAC;IAD5BC,UAAU;EAEb,oBACE,MAAC,aAAa;IAAC,IAAI,EAAC,SAAS;IAAC,YAAY,EAAED,YAAa;IAAA,wBACvD,MAAC;IACC;IAAA,kCACIC,UAAU;MACd,cAAYN,SAAS,aAATA,SAAS,cAATA,SAAS,GAAIG,SAAU;MACnC,OAAO,EAAED,OAAQ;MAAA,wBAEjB,KAAC,IAAI;QAAA,uBACH,KAAC,eAAe;UAAC,IAAI,EAAED;QAAK;MAAG,EAC1B,EACNE,SAAS,IAAI,IAAI,GAAG,IAAI,gBAAG,KAAC,IAAI;QAAA,UAAEA;MAAS,EAAQ;IAAA,GACvC,EACdC,QAAQ;EAAA,EACK;AAEpB;AAEA,eAAeL,yBAAyB"}
1
+ {"version":3,"file":"ActionButtonDialogTrigger.js","names":["ActionButton","DialogTrigger","Icon","Text","FontAwesomeIcon","jsx","_jsx","jsxs","_jsxs","ActionButtonDialogTrigger","_ref","ariaLabel","icon","isQuiet","labelText","children","onOpenChange","styleProps","_objectWithoutProperties","_excluded","type","_objectSpread"],"sources":["../../src/dialogs/ActionButtonDialogTrigger.tsx"],"sourcesContent":["import { ReactElement } from 'react';\nimport { ActionButton, DialogTrigger, Icon, Text } from '@adobe/react-spectrum';\nimport type { SpectrumDialogClose } from '@react-types/dialog';\nimport type { StyleProps } from '@react-types/shared';\nimport type { IconDefinition } from '@fortawesome/fontawesome-common-types';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nexport interface ActionButtonDialogTriggerProps extends StyleProps {\n icon: IconDefinition;\n isQuiet?: boolean;\n labelText?: string;\n ariaLabel?: string;\n children: SpectrumDialogClose | ReactElement;\n onOpenChange?: (isOpen: boolean) => void;\n}\n\n/**\n * Dialog trigger based on an ActionButton.\n */\nexport function ActionButtonDialogTrigger({\n ariaLabel,\n icon,\n isQuiet,\n labelText,\n children,\n onOpenChange,\n ...styleProps\n}: ActionButtonDialogTriggerProps): JSX.Element {\n return (\n <DialogTrigger type=\"popover\" onOpenChange={onOpenChange}>\n <ActionButton\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...styleProps}\n aria-label={ariaLabel ?? labelText}\n isQuiet={isQuiet}\n >\n <Icon>\n <FontAwesomeIcon icon={icon} />\n </Icon>\n {labelText == null ? null : <Text>{labelText}</Text>}\n </ActionButton>\n {children}\n </DialogTrigger>\n );\n}\n\nexport default ActionButtonDialogTrigger;\n"],"mappings":";;;;;;;;AACA,SAASA,YAAY,EAAEC,aAAa,EAAEC,IAAI,EAAEC,IAAI,QAAQ,uBAAuB;AAI/E,SAASC,eAAe,QAAQ,gCAAgC;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAWjE;AACA;AACA;AACA,OAAO,SAASC,yBAAyBA,CAAAC,IAAA,EAQO;EAAA,IARN;MACxCC,SAAS;MACTC,IAAI;MACJC,OAAO;MACPC,SAAS;MACTC,QAAQ;MACRC;IAE8B,CAAC,GAAAN,IAAA;IAD5BO,UAAU,GAAAC,wBAAA,CAAAR,IAAA,EAAAS,SAAA;EAEb,oBACEX,KAAA,CAACP,aAAa;IAACmB,IAAI,EAAC,SAAS;IAACJ,YAAY,EAAEA,YAAa;IAAAD,QAAA,gBACvDP,KAAA,CAACR;IACC;IAAA,EAAAqB,aAAA,CAAAA,aAAA,KACIJ,UAAU;MACd,cAAYN,SAAS,aAATA,SAAS,cAATA,SAAS,GAAIG,SAAU;MACnCD,OAAO,EAAEA,OAAQ;MAAAE,QAAA,gBAEjBT,IAAA,CAACJ,IAAI;QAAAa,QAAA,eACHT,IAAA,CAACF,eAAe;UAACQ,IAAI,EAAEA;QAAK,CAAE;MAAC,CAC3B,CAAC,EACNE,SAAS,IAAI,IAAI,GAAG,IAAI,gBAAGR,IAAA,CAACH,IAAI;QAAAY,QAAA,EAAED;MAAS,CAAO,CAAC;IAAA,EACxC,CAAC,EACdC,QAAQ;EAAA,CACI,CAAC;AAEpB;AAEA,eAAeN,yBAAyB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmationDialog.js","names":["Button","ButtonGroup","Content","Dialog","Divider","Form","Heading","useFormWithDetachedSubmitButton","styles","ConfirmationDialog","heading","confirmationButtonLabel","children","onCancel","onConfirm","formProps","submitButtonProps","spectrumDialogComponentHeading"],"sources":["../../src/dialogs/ConfirmationDialog.tsx"],"sourcesContent":["/* eslint-disable react/jsx-props-no-spreading */\nimport { ReactElement, ReactNode } from 'react';\nimport {\n Button,\n ButtonGroup,\n Content,\n Dialog,\n Divider,\n Form,\n Heading,\n} from '@adobe/react-spectrum';\nimport type { SpectrumLabelableProps } from '@react-types/shared';\nimport { useFormWithDetachedSubmitButton } from '@deephaven/react-hooks';\nimport styles from '../SpectrumComponent.module.scss';\n\nexport interface ConfirmationDialogProps {\n heading: ReactNode;\n confirmationButtonLabel: string;\n children:\n | ReactElement<SpectrumLabelableProps>\n | ReactElement<SpectrumLabelableProps>[];\n onCancel: () => void;\n onConfirm: () => void;\n}\n\nexport function ConfirmationDialog({\n heading,\n confirmationButtonLabel,\n children,\n onCancel,\n onConfirm,\n}: ConfirmationDialogProps): JSX.Element {\n const { formProps, submitButtonProps } = useFormWithDetachedSubmitButton();\n\n return (\n <Dialog>\n <Heading\n level={3}\n UNSAFE_className={styles.spectrumDialogComponentHeading}\n >\n {heading}\n </Heading>\n <Divider />\n <Content>\n <Form\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...formProps}\n >\n {children}\n </Form>\n </Content>\n <ButtonGroup>\n <Button variant=\"secondary\" onPress={onCancel}>\n Cancel\n </Button>\n <Button\n {...submitButtonProps}\n // eslint-disable-next-line react/style-prop-object\n style=\"fill\"\n variant=\"negative\"\n onPress={onConfirm}\n type=\"submit\"\n >\n {confirmationButtonLabel}\n </Button>\n </ButtonGroup>\n </Dialog>\n );\n}\n\nexport default ConfirmationDialog;\n"],"mappings":";;;;;AAAA;;AAEA,SACEA,MAAM,EACNC,WAAW,EACXC,OAAO,EACPC,MAAM,EACNC,OAAO,EACPC,IAAI,EACJC,OAAO,QACF,uBAAuB;AAE9B,SAASC,+BAA+B,QAAQ,wBAAwB;AAAC,OAClEC,MAAM;AAAA;AAAA;AAYb,OAAO,SAASC,kBAAkB,OAMO;EAAA,IANN;IACjCC,OAAO;IACPC,uBAAuB;IACvBC,QAAQ;IACRC,QAAQ;IACRC;EACuB,CAAC;EACxB,IAAM;IAAEC,SAAS;IAAEC;EAAkB,CAAC,GAAGT,+BAA+B,EAAE;EAE1E,oBACE,MAAC,MAAM;IAAA,wBACL,KAAC,OAAO;MACN,KAAK,EAAE,CAAE;MACT,gBAAgB,EAAEC,MAAM,CAACS,8BAA+B;MAAA,UAEvDP;IAAO,EACA,eACV,KAAC,OAAO,KAAG,eACX,KAAC,OAAO;MAAA,uBACN,KAAC;MACC;MAAA,kCACIK,SAAS;QAAA,UAEZH;MAAQ;IACJ,EACC,eACV,MAAC,WAAW;MAAA,wBACV,KAAC,MAAM;QAAC,OAAO,EAAC,WAAW;QAAC,OAAO,EAAEC,QAAS;QAAA,UAAC;MAE/C,EAAS,eACT,KAAC,MAAM,kCACDG,iBAAiB;QACrB;QACA,KAAK,EAAC,MAAM;QACZ,OAAO,EAAC,UAAU;QAClB,OAAO,EAAEF,SAAU;QACnB,IAAI,EAAC,QAAQ;QAAA,UAEZH;MAAuB,GACjB;IAAA,EACG;EAAA,EACP;AAEb;AAEA,eAAeF,kBAAkB"}
1
+ {"version":3,"file":"ConfirmationDialog.js","names":["Button","ButtonGroup","Content","Dialog","Divider","Form","Heading","useFormWithDetachedSubmitButton","styles","jsx","_jsx","jsxs","_jsxs","ConfirmationDialog","_ref","heading","confirmationButtonLabel","children","onCancel","onConfirm","formProps","submitButtonProps","level","UNSAFE_className","spectrumDialogComponentHeading","_objectSpread","variant","onPress","style","type"],"sources":["../../src/dialogs/ConfirmationDialog.tsx"],"sourcesContent":["/* eslint-disable react/jsx-props-no-spreading */\nimport { ReactElement, ReactNode } from 'react';\nimport {\n Button,\n ButtonGroup,\n Content,\n Dialog,\n Divider,\n Form,\n Heading,\n} from '@adobe/react-spectrum';\nimport type { SpectrumLabelableProps } from '@react-types/shared';\nimport { useFormWithDetachedSubmitButton } from '@deephaven/react-hooks';\nimport styles from '../SpectrumComponent.module.scss';\n\nexport interface ConfirmationDialogProps {\n heading: ReactNode;\n confirmationButtonLabel: string;\n children:\n | ReactElement<SpectrumLabelableProps>\n | ReactElement<SpectrumLabelableProps>[];\n onCancel: () => void;\n onConfirm: () => void;\n}\n\nexport function ConfirmationDialog({\n heading,\n confirmationButtonLabel,\n children,\n onCancel,\n onConfirm,\n}: ConfirmationDialogProps): JSX.Element {\n const { formProps, submitButtonProps } = useFormWithDetachedSubmitButton();\n\n return (\n <Dialog>\n <Heading\n level={3}\n UNSAFE_className={styles.spectrumDialogComponentHeading}\n >\n {heading}\n </Heading>\n <Divider />\n <Content>\n <Form\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...formProps}\n >\n {children}\n </Form>\n </Content>\n <ButtonGroup>\n <Button variant=\"secondary\" onPress={onCancel}>\n Cancel\n </Button>\n <Button\n {...submitButtonProps}\n // eslint-disable-next-line react/style-prop-object\n style=\"fill\"\n variant=\"negative\"\n onPress={onConfirm}\n type=\"submit\"\n >\n {confirmationButtonLabel}\n </Button>\n </ButtonGroup>\n </Dialog>\n );\n}\n\nexport default ConfirmationDialog;\n"],"mappings":";;;;;AAAA;;AAEA,SACEA,MAAM,EACNC,WAAW,EACXC,OAAO,EACPC,MAAM,EACNC,OAAO,EACPC,IAAI,EACJC,OAAO,QACF,uBAAuB;AAE9B,SAASC,+BAA+B,QAAQ,wBAAwB;AAAC,OAClEC,MAAM;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAYb,OAAO,SAASC,kBAAkBA,CAAAC,IAAA,EAMO;EAAA,IANN;IACjCC,OAAO;IACPC,uBAAuB;IACvBC,QAAQ;IACRC,QAAQ;IACRC;EACuB,CAAC,GAAAL,IAAA;EACxB,IAAM;IAAEM,SAAS;IAAEC;EAAkB,CAAC,GAAGd,+BAA+B,CAAC,CAAC;EAE1E,oBACEK,KAAA,CAACT,MAAM;IAAAc,QAAA,gBACLP,IAAA,CAACJ,OAAO;MACNgB,KAAK,EAAE,CAAE;MACTC,gBAAgB,EAAEf,MAAM,CAACgB,8BAA+B;MAAAP,QAAA,EAEvDF;IAAO,CACD,CAAC,eACVL,IAAA,CAACN,OAAO,IAAE,CAAC,eACXM,IAAA,CAACR,OAAO;MAAAe,QAAA,eACNP,IAAA,CAACL;MACC;MAAA,EAAAoB,aAAA,CAAAA,aAAA,KACIL,SAAS;QAAAH,QAAA,EAEZA;MAAQ,EACL;IAAC,CACA,CAAC,eACVL,KAAA,CAACX,WAAW;MAAAgB,QAAA,gBACVP,IAAA,CAACV,MAAM;QAAC0B,OAAO,EAAC,WAAW;QAACC,OAAO,EAAET,QAAS;QAAAD,QAAA,EAAC;MAE/C,CAAQ,CAAC,eACTP,IAAA,CAACV,MAAM,EAAAyB,aAAA,CAAAA,aAAA,KACDJ,iBAAiB;QACrB;QACAO,KAAK,EAAC,MAAM;QACZF,OAAO,EAAC,UAAU;QAClBC,OAAO,EAAER,SAAU;QACnBU,IAAI,EAAC,QAAQ;QAAAZ,QAAA,EAEZD;MAAuB,EAClB,CAAC;IAAA,CACE,CAAC;EAAA,CACR,CAAC;AAEb;AAEA,eAAeH,kBAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownMenu.js","names":["React","PureComponent","classNames","Popper","Menu","DropdownMenu","constructor","props","handleClick","bind","handleCloseMenu","handleExited","container","createRef","parent","popper","isOpen","componentDidMount","isShown","current","parentElement","addEventListener","openMenu","componentDidUpdate","prevProps","window","requestAnimationFrame","closeMenu","componentWillUnmount","removeEventListener","hide","show","scheduleUpdate","e","preventDefault","stopPropagation","onMenuClosed","render","actions","onMenuOpened","popperClassName","dataTestId","menuStyle","options","popperOptions","placement","separateKeyboardMouse","undefined"],"sources":["../../src/menu-actions/DropdownMenu.tsx"],"sourcesContent":["/**\n * Add dropdown menu that you add onto any component.\n *\n * Similar to the context-actions package, accepts list of actions to create a dropdown menu.\n * Note: Does not support nested sub-menus.\n *\n * Usage:\n * let actions = [{\n * title: 'My Action',\n * action: () => { alert('My Action Clicked!') }\n * icon: faPrint, // Limited to FontAwesome icons for now.\n * shortcut: Shortcut, // Shortcut class instance\n * group: ContextActions.groups.default, // What group to group the context action with\n * order: null // Int where to order within group\n * }];\n *\n * Usage:\n * 1. Auto bind click to open event to parent\n * <div>\n * Click in this container\n * <DropdownMenu actions={actions}/>\n * </div>\n *\n * 2. Control via prop\n * <div>\n * DropdownMenu will not react to the click event if isShown prop is used\n * <DropdownMenu actions={actions} isShown={isShown} />\n * </div>\n *\n */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { PopperOptions } from 'popper.js';\nimport { Popper } from '../popper';\nimport Menu, { MenuOptions } from './Menu';\nimport { ContextAction } from '../context-actions/ContextActionUtils';\nimport './DropdownMenu.scss';\n\nexport type DropdownAction = ContextAction & { actions?: never };\n\nexport type DropdownActions =\n | (() => DropdownAction[])\n | DropdownAction\n | DropdownAction[];\n\ntype DropdownMenuProps = {\n // Override to prevent nested lists\n actions: DropdownActions;\n isShown: boolean | null;\n onMenuClosed(): void;\n onMenuOpened(): void;\n options: MenuOptions;\n popperOptions: PopperOptions;\n popperClassName: string;\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n};\n\nclass DropdownMenu extends PureComponent<DropdownMenuProps> {\n static defaultProps = {\n isShown: null,\n onMenuClosed(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n options: {},\n popperOptions: {},\n popperClassName: '',\n menuStyle: {},\n 'data-testid': undefined,\n };\n\n constructor(props: DropdownMenuProps) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleCloseMenu = this.handleCloseMenu.bind(this);\n this.handleExited = this.handleExited.bind(this);\n\n this.container = React.createRef();\n this.parent = null;\n this.popper = React.createRef();\n\n this.isOpen = false;\n }\n\n componentDidMount(): void {\n const { isShown } = this.props;\n\n if (isShown === null) {\n if (this.container.current?.parentElement) {\n this.parent = this.container.current.parentElement;\n this.parent.addEventListener('click', this.handleClick);\n }\n } else if (isShown) {\n this.openMenu();\n }\n }\n\n componentDidUpdate(prevProps: DropdownMenuProps): void {\n const { isShown } = this.props;\n\n if (prevProps.isShown !== isShown) {\n if (isShown !== null && isShown) {\n // https://github.com/reactjs/react-transition-group/issues/382\n window.requestAnimationFrame(() => {\n this.openMenu();\n });\n } else {\n this.closeMenu();\n }\n }\n }\n\n componentWillUnmount(): void {\n if (this.parent) {\n this.parent.removeEventListener('click', this.handleClick);\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n parent: Element | null;\n\n popper: React.RefObject<Popper>;\n\n isOpen: boolean;\n\n closeMenu(): void {\n this.popper.current?.hide();\n }\n\n openMenu(): void {\n if (this.popper.current && !this.isOpen) {\n this.popper.current.show();\n this.isOpen = true;\n }\n }\n\n scheduleUpdate(): void {\n this.popper.current?.scheduleUpdate();\n }\n\n handleClick(e: Event): void {\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu();\n }\n\n handleCloseMenu(): void {\n this.closeMenu();\n }\n\n handleExited(): void {\n this.isOpen = false;\n\n const { onMenuClosed } = this.props;\n onMenuClosed();\n }\n\n render(): JSX.Element {\n const {\n actions,\n onMenuOpened,\n popperClassName,\n 'data-testid': dataTestId,\n } = this.props;\n const { menuStyle } = this.props;\n let { options, popperOptions } = this.props;\n popperOptions = { placement: 'bottom', ...popperOptions };\n options = {\n separateKeyboardMouse: true,\n ...options,\n };\n return (\n <div\n className=\"menu-actions-listener\"\n ref={this.container}\n data-testid={dataTestId}\n >\n <Popper\n ref={this.popper}\n options={popperOptions}\n className={classNames('menu-popper', popperClassName)}\n onExited={this.handleExited}\n closeOnBlur\n interactive\n >\n <Menu\n actions={actions}\n closeMenu={this.handleCloseMenu}\n onMenuOpened={onMenuOpened}\n options={options}\n menuStyle={menuStyle}\n />\n </Popper>\n </div>\n );\n }\n}\n\nexport default DropdownMenu;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DropdownMenu.js","names":["React","PureComponent","classNames","Popper","Menu","jsx","_jsx","DropdownMenu","constructor","props","_defineProperty","handleClick","bind","handleCloseMenu","handleExited","container","createRef","parent","popper","isOpen","componentDidMount","isShown","_this$container$curre","current","parentElement","addEventListener","openMenu","componentDidUpdate","prevProps","window","requestAnimationFrame","closeMenu","componentWillUnmount","removeEventListener","_this$popper$current","hide","show","scheduleUpdate","_this$popper$current2","e","preventDefault","stopPropagation","onMenuClosed","render","actions","onMenuOpened","popperClassName","dataTestId","menuStyle","options","popperOptions","_objectSpread","placement","separateKeyboardMouse","className","ref","children","onExited","closeOnBlur","interactive","undefined"],"sources":["../../src/menu-actions/DropdownMenu.tsx"],"sourcesContent":["/**\n * Add dropdown menu that you add onto any component.\n *\n * Similar to the context-actions package, accepts list of actions to create a dropdown menu.\n * Note: Does not support nested sub-menus.\n *\n * Usage:\n * let actions = [{\n * title: 'My Action',\n * action: () => { alert('My Action Clicked!') }\n * icon: faPrint, // Limited to FontAwesome icons for now.\n * shortcut: Shortcut, // Shortcut class instance\n * group: ContextActions.groups.default, // What group to group the context action with\n * order: null // Int where to order within group\n * }];\n *\n * Usage:\n * 1. Auto bind click to open event to parent\n * <div>\n * Click in this container\n * <DropdownMenu actions={actions}/>\n * </div>\n *\n * 2. Control via prop\n * <div>\n * DropdownMenu will not react to the click event if isShown prop is used\n * <DropdownMenu actions={actions} isShown={isShown} />\n * </div>\n *\n */\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { PopperOptions } from 'popper.js';\nimport { Popper } from '../popper';\nimport Menu, { MenuOptions } from './Menu';\nimport { ContextAction } from '../context-actions/ContextActionUtils';\nimport './DropdownMenu.scss';\n\nexport type DropdownAction = ContextAction & { actions?: never };\n\nexport type DropdownActions =\n | (() => DropdownAction[])\n | DropdownAction\n | DropdownAction[];\n\ntype DropdownMenuProps = {\n // Override to prevent nested lists\n actions: DropdownActions;\n isShown: boolean | null;\n onMenuClosed(): void;\n onMenuOpened(): void;\n options: MenuOptions;\n popperOptions: PopperOptions;\n popperClassName: string;\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n};\n\nclass DropdownMenu extends PureComponent<DropdownMenuProps> {\n static defaultProps = {\n isShown: null,\n onMenuClosed(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n options: {},\n popperOptions: {},\n popperClassName: '',\n menuStyle: {},\n 'data-testid': undefined,\n };\n\n constructor(props: DropdownMenuProps) {\n super(props);\n\n this.handleClick = this.handleClick.bind(this);\n this.handleCloseMenu = this.handleCloseMenu.bind(this);\n this.handleExited = this.handleExited.bind(this);\n\n this.container = React.createRef();\n this.parent = null;\n this.popper = React.createRef();\n\n this.isOpen = false;\n }\n\n componentDidMount(): void {\n const { isShown } = this.props;\n\n if (isShown === null) {\n if (this.container.current?.parentElement) {\n this.parent = this.container.current.parentElement;\n this.parent.addEventListener('click', this.handleClick);\n }\n } else if (isShown) {\n this.openMenu();\n }\n }\n\n componentDidUpdate(prevProps: DropdownMenuProps): void {\n const { isShown } = this.props;\n\n if (prevProps.isShown !== isShown) {\n if (isShown !== null && isShown) {\n // https://github.com/reactjs/react-transition-group/issues/382\n window.requestAnimationFrame(() => {\n this.openMenu();\n });\n } else {\n this.closeMenu();\n }\n }\n }\n\n componentWillUnmount(): void {\n if (this.parent) {\n this.parent.removeEventListener('click', this.handleClick);\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n parent: Element | null;\n\n popper: React.RefObject<Popper>;\n\n isOpen: boolean;\n\n closeMenu(): void {\n this.popper.current?.hide();\n }\n\n openMenu(): void {\n if (this.popper.current && !this.isOpen) {\n this.popper.current.show();\n this.isOpen = true;\n }\n }\n\n scheduleUpdate(): void {\n this.popper.current?.scheduleUpdate();\n }\n\n handleClick(e: Event): void {\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu();\n }\n\n handleCloseMenu(): void {\n this.closeMenu();\n }\n\n handleExited(): void {\n this.isOpen = false;\n\n const { onMenuClosed } = this.props;\n onMenuClosed();\n }\n\n render(): JSX.Element {\n const {\n actions,\n onMenuOpened,\n popperClassName,\n 'data-testid': dataTestId,\n } = this.props;\n const { menuStyle } = this.props;\n let { options, popperOptions } = this.props;\n popperOptions = { placement: 'bottom', ...popperOptions };\n options = {\n separateKeyboardMouse: true,\n ...options,\n };\n return (\n <div\n className=\"menu-actions-listener\"\n ref={this.container}\n data-testid={dataTestId}\n >\n <Popper\n ref={this.popper}\n options={popperOptions}\n className={classNames('menu-popper', popperClassName)}\n onExited={this.handleExited}\n closeOnBlur\n interactive\n >\n <Menu\n actions={actions}\n closeMenu={this.handleCloseMenu}\n onMenuOpened={onMenuOpened}\n options={options}\n menuStyle={menuStyle}\n />\n </Popper>\n </div>\n );\n }\n}\n\nexport default DropdownMenu;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Menu.js","names":["React","PureComponent","ContextActionUtils","ContextMenuItem","Menu","constructor","props","handleKeyDown","bind","handleMenuItemClick","handleMenuItemMouseMove","handleMouseLeave","handleCloseMenu","container","createRef","oldFocus","document","activeElement","rAF","options","keyboardIndex","initialKeyboardIndex","state","menuItems","mouseIndex","componentDidMount","initMenu","window","requestAnimationFrame","current","focus","onMenuOpened","componentDidUpdate","prevProps","actions","componentWillUnmount","cancelAnimationFrame","getKeyboardIndex","separateKeyboardMouse","undefined","getMouseIndex","setKeyboardIndex","index","setState","setMouseIndex","getMenuItems","length","sortActions","concat","e","newFocus","key","shiftKey","getNextMenuItem","closeMenu","HTMLElement","preventDefault","stopPropagation","closeAll","onMenuClosed","menuItem","disabled","action","focusIndex","indexOf","render","menuItemElements","dataTestId","i","group","push","menuItemElement","menuStyle"],"sources":["../../src/menu-actions/Menu.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport ContextActionUtils, {\n ContextAction,\n} from '../context-actions/ContextActionUtils';\nimport ContextMenuItem from '../context-actions/ContextMenuItem';\n\nexport type MenuOptions = {\n doNotVerifyPosition?: boolean;\n separateKeyboardMouse?: boolean;\n initialKeyboardIndex?: number;\n};\n\ntype MenuProps = {\n actions: (() => ContextAction[]) | ContextAction | ContextAction[];\n closeMenu(closeAll: boolean): void;\n onMenuClosed(menu: Menu): void;\n onMenuOpened(menu: Menu): void;\n options: MenuOptions;\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n};\n\ntype MenuState = {\n menuItems: ContextAction[];\n keyboardIndex: number;\n mouseIndex: number;\n};\n\n/**\n * Do not use this class directly. Use DropdownMenu instead.\n *\n * Generates list from actions for use by DropdownMenu.\n * It has beem split from the context-actions component, due to divergering requirements,\n * but still re-uses styling from context-menu. Depending on how usage evolves, may get split further.\n *\n */\n\nclass Menu extends PureComponent<MenuProps, MenuState> {\n static defaultProps = {\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 constructor(props: MenuProps) {\n super(props);\n\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleMenuItemMouseMove = this.handleMenuItemMouseMove.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleCloseMenu = this.handleCloseMenu.bind(this);\n\n this.container = React.createRef();\n this.oldFocus = document.activeElement;\n this.rAF = 0;\n\n const { options } = props;\n const keyboardIndex = options.initialKeyboardIndex ?? -1;\n this.state = {\n menuItems: [],\n keyboardIndex,\n mouseIndex: -1,\n };\n }\n\n componentDidMount(): void {\n this.initMenu();\n\n this.rAF = window.requestAnimationFrame(() => {\n // set initial focus to container so keyboard navigation works\n // components can still override focus in onMenuOpened callback\n this.container.current?.focus();\n const { onMenuOpened } = this.props;\n onMenuOpened(this);\n });\n }\n\n componentDidUpdate(prevProps: MenuProps): void {\n const { actions } = this.props;\n if (prevProps.actions !== actions) {\n this.initMenu();\n }\n }\n\n componentWillUnmount(): void {\n cancelAnimationFrame(this.rAF);\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n oldFocus: Element | null;\n\n rAF: number;\n\n getKeyboardIndex(): number | null {\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\n cancelAnimationFrame(this.rAF);\n\n this.setState({\n menuItems: [],\n });\n\n const { actions } = this.props;\n const menuItems = ContextActionUtils.getMenuItems(actions, false);\n\n if (menuItems.length > 0) {\n this.setState(state => ({\n menuItems: ContextActionUtils.sortActions(\n state.menuItems.concat(menuItems)\n ),\n }));\n }\n }\n\n handleKeyDown(e: React.KeyboardEvent): void {\n const { menuItems } = this.state;\n const oldFocus = this.getKeyboardIndex();\n let newFocus = oldFocus;\n\n if (e.key === 'Enter' || e.key === ' ') {\n if (oldFocus != null && oldFocus >= 0 && oldFocus < menuItems.length) {\n this.handleMenuItemClick(menuItems[oldFocus], e);\n }\n return;\n }\n\n if (e.key === 'Escape') {\n newFocus = null;\n } else if (\n e.key === 'ArrowUp' ||\n (e.key === 'Tab' && e.shiftKey === true)\n ) {\n newFocus = ContextActionUtils.getNextMenuItem(\n newFocus ?? 0,\n -1,\n menuItems\n );\n } else if (\n e.key === 'ArrowDown' ||\n (e.key === 'Tab' && e.shiftKey === false)\n ) {\n newFocus = ContextActionUtils.getNextMenuItem(\n newFocus ?? 0,\n 1,\n menuItems\n );\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 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 handleCloseMenu(): void {\n this.closeMenu();\n }\n\n handleMenuItemClick(menuItem: ContextAction, e: React.SyntheticEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n if (\n menuItem != null &&\n (menuItem.disabled === undefined || !menuItem.disabled) &&\n menuItem.action != null\n ) {\n menuItem.action();\n this.closeMenu(true);\n }\n }\n\n handleMenuItemMouseMove(menuItem: ContextAction): void {\n const { menuItems } = this.state;\n const focusIndex = menuItems.indexOf(menuItem);\n this.setMouseIndex(focusIndex);\n }\n\n handleMouseLeave(): void {\n this.setMouseIndex(-1);\n }\n\n render(): JSX.Element {\n const menuItemElements = [];\n const { 'data-testid': dataTestId } = this.props;\n const { keyboardIndex, menuItems, mouseIndex } = 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 isKeyboardSelected={keyboardIndex === i}\n isMouseSelected={mouseIndex === i}\n menuItem={menuItem}\n closeMenu={this.handleCloseMenu}\n onMenuItemClick={this.handleMenuItemClick}\n onMenuItemMouseMove={this.handleMenuItemMouseMove}\n onMenuItemContextMenu={() => false}\n />\n );\n\n menuItemElements.push(menuItemElement);\n }\n\n const { menuStyle } = this.props;\n\n return (\n <div\n className=\"context-menu-container\"\n style={{ ...menuStyle }}\n ref={this.container}\n onKeyDown={this.handleKeyDown}\n onMouseLeave={this.handleMouseLeave}\n role=\"menuitem\"\n tabIndex={0}\n data-testid={dataTestId}\n >\n {menuItemElements}\n </div>\n );\n }\n}\n\nexport default Menu;\n"],"mappings":"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"}
1
+ {"version":3,"file":"Menu.js","names":["React","PureComponent","ContextActionUtils","ContextMenuItem","jsx","_jsx","Menu","constructor","props","_options$initialKeybo","_defineProperty","handleKeyDown","bind","handleMenuItemClick","handleMenuItemMouseMove","handleMouseLeave","handleCloseMenu","container","createRef","oldFocus","document","activeElement","rAF","options","keyboardIndex","initialKeyboardIndex","state","menuItems","mouseIndex","componentDidMount","initMenu","window","requestAnimationFrame","_this$container$curre","current","focus","onMenuOpened","componentDidUpdate","prevProps","actions","componentWillUnmount","cancelAnimationFrame","getKeyboardIndex","separateKeyboardMouse","undefined","getMouseIndex","setKeyboardIndex","index","setState","setMouseIndex","getMenuItems","length","sortActions","concat","e","newFocus","key","shiftKey","_newFocus","getNextMenuItem","_newFocus2","closeMenu","HTMLElement","preventDefault","stopPropagation","closeAll","arguments","onMenuClosed","menuItem","disabled","action","focusIndex","indexOf","render","menuItemElements","dataTestId","i","group","push","menuItemElement","isKeyboardSelected","isMouseSelected","onMenuItemClick","onMenuItemMouseMove","onMenuItemContextMenu","menuStyle","className","style","_objectSpread","ref","onKeyDown","onMouseLeave","role","tabIndex","children"],"sources":["../../src/menu-actions/Menu.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport ContextActionUtils, {\n ContextAction,\n} from '../context-actions/ContextActionUtils';\nimport ContextMenuItem from '../context-actions/ContextMenuItem';\n\nexport type MenuOptions = {\n doNotVerifyPosition?: boolean;\n separateKeyboardMouse?: boolean;\n initialKeyboardIndex?: number;\n};\n\ntype MenuProps = {\n actions: (() => ContextAction[]) | ContextAction | ContextAction[];\n closeMenu(closeAll: boolean): void;\n onMenuClosed(menu: Menu): void;\n onMenuOpened(menu: Menu): void;\n options: MenuOptions;\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n};\n\ntype MenuState = {\n menuItems: ContextAction[];\n keyboardIndex: number;\n mouseIndex: number;\n};\n\n/**\n * Do not use this class directly. Use DropdownMenu instead.\n *\n * Generates list from actions for use by DropdownMenu.\n * It has beem split from the context-actions component, due to divergering requirements,\n * but still re-uses styling from context-menu. Depending on how usage evolves, may get split further.\n *\n */\n\nclass Menu extends PureComponent<MenuProps, MenuState> {\n static defaultProps = {\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 constructor(props: MenuProps) {\n super(props);\n\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleMenuItemMouseMove = this.handleMenuItemMouseMove.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleCloseMenu = this.handleCloseMenu.bind(this);\n\n this.container = React.createRef();\n this.oldFocus = document.activeElement;\n this.rAF = 0;\n\n const { options } = props;\n const keyboardIndex = options.initialKeyboardIndex ?? -1;\n this.state = {\n menuItems: [],\n keyboardIndex,\n mouseIndex: -1,\n };\n }\n\n componentDidMount(): void {\n this.initMenu();\n\n this.rAF = window.requestAnimationFrame(() => {\n // set initial focus to container so keyboard navigation works\n // components can still override focus in onMenuOpened callback\n this.container.current?.focus();\n const { onMenuOpened } = this.props;\n onMenuOpened(this);\n });\n }\n\n componentDidUpdate(prevProps: MenuProps): void {\n const { actions } = this.props;\n if (prevProps.actions !== actions) {\n this.initMenu();\n }\n }\n\n componentWillUnmount(): void {\n cancelAnimationFrame(this.rAF);\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n oldFocus: Element | null;\n\n rAF: number;\n\n getKeyboardIndex(): number | null {\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\n cancelAnimationFrame(this.rAF);\n\n this.setState({\n menuItems: [],\n });\n\n const { actions } = this.props;\n const menuItems = ContextActionUtils.getMenuItems(actions, false);\n\n if (menuItems.length > 0) {\n this.setState(state => ({\n menuItems: ContextActionUtils.sortActions(\n state.menuItems.concat(menuItems)\n ),\n }));\n }\n }\n\n handleKeyDown(e: React.KeyboardEvent): void {\n const { menuItems } = this.state;\n const oldFocus = this.getKeyboardIndex();\n let newFocus = oldFocus;\n\n if (e.key === 'Enter' || e.key === ' ') {\n if (oldFocus != null && oldFocus >= 0 && oldFocus < menuItems.length) {\n this.handleMenuItemClick(menuItems[oldFocus], e);\n }\n return;\n }\n\n if (e.key === 'Escape') {\n newFocus = null;\n } else if (\n e.key === 'ArrowUp' ||\n (e.key === 'Tab' && e.shiftKey === true)\n ) {\n newFocus = ContextActionUtils.getNextMenuItem(\n newFocus ?? 0,\n -1,\n menuItems\n );\n } else if (\n e.key === 'ArrowDown' ||\n (e.key === 'Tab' && e.shiftKey === false)\n ) {\n newFocus = ContextActionUtils.getNextMenuItem(\n newFocus ?? 0,\n 1,\n menuItems\n );\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 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 handleCloseMenu(): void {\n this.closeMenu();\n }\n\n handleMenuItemClick(menuItem: ContextAction, e: React.SyntheticEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n if (\n menuItem != null &&\n (menuItem.disabled === undefined || !menuItem.disabled) &&\n menuItem.action != null\n ) {\n menuItem.action();\n this.closeMenu(true);\n }\n }\n\n handleMenuItemMouseMove(menuItem: ContextAction): void {\n const { menuItems } = this.state;\n const focusIndex = menuItems.indexOf(menuItem);\n this.setMouseIndex(focusIndex);\n }\n\n handleMouseLeave(): void {\n this.setMouseIndex(-1);\n }\n\n render(): JSX.Element {\n const menuItemElements = [];\n const { 'data-testid': dataTestId } = this.props;\n const { keyboardIndex, menuItems, mouseIndex } = 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 isKeyboardSelected={keyboardIndex === i}\n isMouseSelected={mouseIndex === i}\n menuItem={menuItem}\n closeMenu={this.handleCloseMenu}\n onMenuItemClick={this.handleMenuItemClick}\n onMenuItemMouseMove={this.handleMenuItemMouseMove}\n onMenuItemContextMenu={() => false}\n />\n );\n\n menuItemElements.push(menuItemElement);\n }\n\n const { menuStyle } = this.props;\n\n return (\n <div\n className=\"context-menu-container\"\n style={{ ...menuStyle }}\n ref={this.container}\n onKeyDown={this.handleKeyDown}\n onMouseLeave={this.handleMouseLeave}\n role=\"menuitem\"\n tabIndex={0}\n data-testid={dataTestId}\n >\n {menuItemElements}\n </div>\n );\n }\n}\n\nexport default Menu;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DebouncedModal.js","names":["React","useDebouncedValue","DebouncedModal","blockInteraction","children","debounceMs","isOpen","debouncedIsOpen","backgroundColor","cloneElement"],"sources":["../../src/modal/DebouncedModal.tsx"],"sourcesContent":["import React from 'react';\nimport { useDebouncedValue } from '@deephaven/react-hooks';\n\nexport type DebouncedModalProps = {\n /** Whether to block interaction immediately */\n blockInteraction?: boolean;\n\n /** Children to render after the alloted debounce time */\n children: React.ReactElement;\n\n /** Time to debounce */\n debounceMs: number;\n\n /**\n * Will render the `children` `debounceMs` after `isOpen` is set to `true.\n * Will stop rendering immediately after `isOpen` is set to `false`.\n */\n isOpen?: boolean;\n};\n\n/**\n * Display a modal after a debounce time. Blocks the screen from interaction immediately,\n * but then waits the set debounce time before rendering the modal.\n */\nfunction DebouncedModal({\n blockInteraction = true,\n children,\n debounceMs,\n isOpen = false,\n}: DebouncedModalProps): JSX.Element {\n const debouncedIsOpen = useDebouncedValue(isOpen, debounceMs);\n\n return (\n <>\n {blockInteraction && isOpen && (\n <div\n className=\"modal-backdrop\"\n style={{ backgroundColor: 'transparent' }}\n data-testid=\"debounced-modal-backdrop\"\n />\n )}\n {React.cloneElement(children, { isOpen: isOpen && debouncedIsOpen })}\n </>\n );\n}\n\nexport default DebouncedModal;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,iBAAiB,QAAQ,wBAAwB;AAAC;AAAA;AAAA;AAmB3D;AACA;AACA;AACA;AACA,SAASC,cAAc,OAKc;EAAA,IALb;IACtBC,gBAAgB,GAAG,IAAI;IACvBC,QAAQ;IACRC,UAAU;IACVC,MAAM,GAAG;EACU,CAAC;EACpB,IAAMC,eAAe,GAAGN,iBAAiB,CAACK,MAAM,EAAED,UAAU,CAAC;EAE7D,oBACE;IAAA,WACGF,gBAAgB,IAAIG,MAAM,iBACzB;MACE,SAAS,EAAC,gBAAgB;MAC1B,KAAK,EAAE;QAAEE,eAAe,EAAE;MAAc,CAAE;MAC1C,eAAY;IAA0B,EAEzC,eACAR,KAAK,CAACS,YAAY,CAACL,QAAQ,EAAE;MAAEE,MAAM,EAAEA,MAAM,IAAIC;IAAgB,CAAC,CAAC;EAAA,EACnE;AAEP;AAEA,eAAeL,cAAc"}
1
+ {"version":3,"file":"DebouncedModal.js","names":["React","useDebouncedValue","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","DebouncedModal","_ref","blockInteraction","children","debounceMs","isOpen","debouncedIsOpen","className","style","backgroundColor","cloneElement"],"sources":["../../src/modal/DebouncedModal.tsx"],"sourcesContent":["import React from 'react';\nimport { useDebouncedValue } from '@deephaven/react-hooks';\n\nexport type DebouncedModalProps = {\n /** Whether to block interaction immediately */\n blockInteraction?: boolean;\n\n /** Children to render after the alloted debounce time */\n children: React.ReactElement;\n\n /** Time to debounce */\n debounceMs: number;\n\n /**\n * Will render the `children` `debounceMs` after `isOpen` is set to `true.\n * Will stop rendering immediately after `isOpen` is set to `false`.\n */\n isOpen?: boolean;\n};\n\n/**\n * Display a modal after a debounce time. Blocks the screen from interaction immediately,\n * but then waits the set debounce time before rendering the modal.\n */\nfunction DebouncedModal({\n blockInteraction = true,\n children,\n debounceMs,\n isOpen = false,\n}: DebouncedModalProps): JSX.Element {\n const debouncedIsOpen = useDebouncedValue(isOpen, debounceMs);\n\n return (\n <>\n {blockInteraction && isOpen && (\n <div\n className=\"modal-backdrop\"\n style={{ backgroundColor: 'transparent' }}\n data-testid=\"debounced-modal-backdrop\"\n />\n )}\n {React.cloneElement(children, { isOpen: isOpen && debouncedIsOpen })}\n </>\n );\n}\n\nexport default DebouncedModal;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,iBAAiB,QAAQ,wBAAwB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,QAAA,IAAAC,SAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAmB3D;AACA;AACA;AACA;AACA,SAASC,cAAcA,CAAAC,IAAA,EAKc;EAAA,IALb;IACtBC,gBAAgB,GAAG,IAAI;IACvBC,QAAQ;IACRC,UAAU;IACVC,MAAM,GAAG;EACU,CAAC,GAAAJ,IAAA;EACpB,IAAMK,eAAe,GAAGb,iBAAiB,CAACY,MAAM,EAAED,UAAU,CAAC;EAE7D,oBACEL,KAAA,CAAAF,SAAA;IAAAM,QAAA,GACGD,gBAAgB,IAAIG,MAAM,iBACzBV,IAAA;MACEY,SAAS,EAAC,gBAAgB;MAC1BC,KAAK,EAAE;QAAEC,eAAe,EAAE;MAAc,CAAE;MAC1C,eAAY;IAA0B,CACvC,CACF,eACAjB,KAAK,CAACkB,YAAY,CAACP,QAAQ,EAAE;MAAEE,MAAM,EAAEA,MAAM,IAAIC;IAAgB,CAAC,CAAC;EAAA,CACpE,CAAC;AAEP;AAEA,eAAeN,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"InfoModal.js","names":["React","FontAwesomeIcon","Modal","ModalBody","InfoModal","className","icon","isOpen","subtitle","title"],"sources":["../../src/modal/InfoModal.tsx"],"sourcesContent":["import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\nimport Modal from './Modal';\nimport ModalBody from './ModalBody';\nimport './InfoModal.scss';\n\ntype InfoModalProps = {\n /** Class name to give the info modal */\n className?: string;\n\n /** Icon to display in the modal */\n icon?: IconProp;\n\n /** Title to display in the modal */\n title: React.ReactNode;\n\n /** Subtitle/detail to display in the modal */\n subtitle?: React.ReactNode;\n\n /** Whether the modal is open/visible or not. */\n isOpen?: boolean;\n};\n\n/**\n * A modal that displays a message with an icon. Can be used for informational messages, warnings, or errors.\n * Does not have any buttons and cannot be dismissed.\n */\nfunction InfoModal({\n className,\n icon,\n isOpen = false,\n subtitle,\n title,\n}: InfoModalProps): JSX.Element {\n return (\n <Modal isOpen={isOpen} className={className}>\n <ModalBody>\n <div className=\"info-modal\">\n {icon != null && (\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={icon} />\n </div>\n )}\n <div className=\"message-header\">{title}</div>\n {subtitle != null && (\n <div className=\"message-content\">{subtitle}</div>\n )}\n </div>\n </ModalBody>\n </Modal>\n );\n}\n\nexport default InfoModal;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,gCAAgC;AAAC,OAE1DC,KAAK;AAAA,OACLC,SAAS;AAAA;AAAA;AAAA;AAoBhB;AACA;AACA;AACA;AACA,SAASC,SAAS,OAMc;EAAA,IANb;IACjBC,SAAS;IACTC,IAAI;IACJC,MAAM,GAAG,KAAK;IACdC,QAAQ;IACRC;EACc,CAAC;EACf,oBACE,KAAC,KAAK;IAAC,MAAM,EAAEF,MAAO;IAAC,SAAS,EAAEF,SAAU;IAAA,uBAC1C,KAAC,SAAS;MAAA,uBACR;QAAK,SAAS,EAAC,YAAY;QAAA,WACxBC,IAAI,IAAI,IAAI,iBACX;UAAK,SAAS,EAAC,cAAc;UAAA,uBAC3B,KAAC,eAAe;YAAC,IAAI,EAAEA;UAAK;QAAG,EAElC,eACD;UAAK,SAAS,EAAC,gBAAgB;UAAA,UAAEG;QAAK,EAAO,EAC5CD,QAAQ,IAAI,IAAI,iBACf;UAAK,SAAS,EAAC,iBAAiB;UAAA,UAAEA;QAAQ,EAC3C;MAAA;IACG;EACI,EACN;AAEZ;AAEA,eAAeJ,SAAS"}
1
+ {"version":3,"file":"InfoModal.js","names":["React","FontAwesomeIcon","Modal","ModalBody","jsx","_jsx","jsxs","_jsxs","InfoModal","_ref","className","icon","isOpen","subtitle","title","children"],"sources":["../../src/modal/InfoModal.tsx"],"sourcesContent":["import React from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { IconProp } from '@fortawesome/fontawesome-svg-core';\nimport Modal from './Modal';\nimport ModalBody from './ModalBody';\nimport './InfoModal.scss';\n\ntype InfoModalProps = {\n /** Class name to give the info modal */\n className?: string;\n\n /** Icon to display in the modal */\n icon?: IconProp;\n\n /** Title to display in the modal */\n title: React.ReactNode;\n\n /** Subtitle/detail to display in the modal */\n subtitle?: React.ReactNode;\n\n /** Whether the modal is open/visible or not. */\n isOpen?: boolean;\n};\n\n/**\n * A modal that displays a message with an icon. Can be used for informational messages, warnings, or errors.\n * Does not have any buttons and cannot be dismissed.\n */\nfunction InfoModal({\n className,\n icon,\n isOpen = false,\n subtitle,\n title,\n}: InfoModalProps): JSX.Element {\n return (\n <Modal isOpen={isOpen} className={className}>\n <ModalBody>\n <div className=\"info-modal\">\n {icon != null && (\n <div className=\"message-icon\">\n <FontAwesomeIcon icon={icon} />\n </div>\n )}\n <div className=\"message-header\">{title}</div>\n {subtitle != null && (\n <div className=\"message-content\">{subtitle}</div>\n )}\n </div>\n </ModalBody>\n </Modal>\n );\n}\n\nexport default InfoModal;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,gCAAgC;AAAC,OAE1DC,KAAK;AAAA,OACLC,SAAS;AAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAoBhB;AACA;AACA;AACA;AACA,SAASC,SAASA,CAAAC,IAAA,EAMc;EAAA,IANb;IACjBC,SAAS;IACTC,IAAI;IACJC,MAAM,GAAG,KAAK;IACdC,QAAQ;IACRC;EACc,CAAC,GAAAL,IAAA;EACf,oBACEJ,IAAA,CAACH,KAAK;IAACU,MAAM,EAAEA,MAAO;IAACF,SAAS,EAAEA,SAAU;IAAAK,QAAA,eAC1CV,IAAA,CAACF,SAAS;MAAAY,QAAA,eACRR,KAAA;QAAKG,SAAS,EAAC,YAAY;QAAAK,QAAA,GACxBJ,IAAI,IAAI,IAAI,iBACXN,IAAA;UAAKK,SAAS,EAAC,cAAc;UAAAK,QAAA,eAC3BV,IAAA,CAACJ,eAAe;YAACU,IAAI,EAAEA;UAAK,CAAE;QAAC,CAC5B,CACN,eACDN,IAAA;UAAKK,SAAS,EAAC,gBAAgB;UAAAK,QAAA,EAAED;QAAK,CAAM,CAAC,EAC5CD,QAAQ,IAAI,IAAI,iBACfR,IAAA;UAAKK,SAAS,EAAC,iBAAiB;UAAAK,QAAA,EAAEF;QAAQ,CAAM,CACjD;MAAA,CACE;IAAC,CACG;EAAC,CACP,CAAC;AAEZ;AAEA,eAAeL,SAAS"}