@deephaven/components 1.2.1-plotly-rc.2 → 1.2.1-plotly-rc3.3

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 (155) 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/CardFlip.js.map +1 -1
  7. package/dist/Checkbox.js.map +1 -1
  8. package/dist/Collapse.js.map +1 -1
  9. package/dist/ComponentUtils.js.map +1 -1
  10. package/dist/CopyButton.js.map +1 -1
  11. package/dist/CustomTimeSelect.js.map +1 -1
  12. package/dist/DateInput.js.map +1 -1
  13. package/dist/DateInputUtils.js.map +1 -1
  14. package/dist/DateTimeInput.js.map +1 -1
  15. package/dist/DateTimeInputUtils.js.map +1 -1
  16. package/dist/DebouncedSearchInput.js.map +1 -1
  17. package/dist/DragUtils.js.map +1 -1
  18. package/dist/DraggableItemList.js.map +1 -1
  19. package/dist/EditableItemList.js.map +1 -1
  20. package/dist/ErrorBoundary.js.map +1 -1
  21. package/dist/ErrorView.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/SplitButtonGroup.js.map +1 -1
  39. package/dist/TableViewEmptyState.js.map +1 -1
  40. package/dist/TextWithTooltip.js.map +1 -1
  41. package/dist/ThemeExport.js.map +1 -1
  42. package/dist/TimeInput.js.map +1 -1
  43. package/dist/TimeSlider.js.map +1 -1
  44. package/dist/ToastNotification.js.map +1 -1
  45. package/dist/UIConstants.js.map +1 -1
  46. package/dist/UISwitch.js.map +1 -1
  47. package/dist/XComponent.js.map +1 -1
  48. package/dist/XComponentMap.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/actions/index.js.map +1 -1
  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/context-actions/index.js.map +1 -1
  60. package/dist/declaration.d.js.map +1 -1
  61. package/dist/dialogs/ActionButtonDialogTrigger.js.map +1 -1
  62. package/dist/dialogs/ConfirmationDialog.js.map +1 -1
  63. package/dist/dialogs/index.js.map +1 -1
  64. package/dist/index.js.map +1 -1
  65. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  66. package/dist/menu-actions/Menu.js.map +1 -1
  67. package/dist/menu-actions/index.js.map +1 -1
  68. package/dist/modal/DebouncedModal.js.map +1 -1
  69. package/dist/modal/InfoModal.js.map +1 -1
  70. package/dist/modal/Modal.js.map +1 -1
  71. package/dist/modal/ModalBody.js.map +1 -1
  72. package/dist/modal/ModalFooter.js.map +1 -1
  73. package/dist/modal/ModalHeader.js.map +1 -1
  74. package/dist/modal/index.js.map +1 -1
  75. package/dist/navigation/Menu.js.map +1 -1
  76. package/dist/navigation/MenuItem.js.map +1 -1
  77. package/dist/navigation/NavTab.js.map +1 -1
  78. package/dist/navigation/NavTabList.js.map +1 -1
  79. package/dist/navigation/Page.js.map +1 -1
  80. package/dist/navigation/Stack.js.map +1 -1
  81. package/dist/navigation/index.js.map +1 -1
  82. package/dist/popper/Popper.js.map +1 -1
  83. package/dist/popper/Tooltip.js.map +1 -1
  84. package/dist/popper/index.js.map +1 -1
  85. package/dist/shortcuts/GlobalShortcuts.js.map +1 -1
  86. package/dist/shortcuts/NavigationShortcuts.js.map +1 -1
  87. package/dist/shortcuts/Shortcut.js.map +1 -1
  88. package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
  89. package/dist/shortcuts/index.js.map +1 -1
  90. package/dist/spectrum/ActionGroup.js.map +1 -1
  91. package/dist/spectrum/ActionMenu.js.map +1 -1
  92. package/dist/spectrum/CheckboxGroup.js.map +1 -1
  93. package/dist/spectrum/Heading.js.map +1 -1
  94. package/dist/spectrum/ItemContent.js.map +1 -1
  95. package/dist/spectrum/ItemTooltip.js.map +1 -1
  96. package/dist/spectrum/ListActionGroup.js.map +1 -1
  97. package/dist/spectrum/ListActionMenu.js.map +1 -1
  98. package/dist/spectrum/TabPanels.js.map +1 -1
  99. package/dist/spectrum/Text.js.map +1 -1
  100. package/dist/spectrum/View.js.map +1 -1
  101. package/dist/spectrum/buttons.js.map +1 -1
  102. package/dist/spectrum/collections.js.map +1 -1
  103. package/dist/spectrum/comboBox/ComboBox.js.map +1 -1
  104. package/dist/spectrum/comboBox/ComboBoxNormalized.js.map +1 -1
  105. package/dist/spectrum/comboBox/index.js.map +1 -1
  106. package/dist/spectrum/content.js.map +1 -1
  107. package/dist/spectrum/dateAndTime.js.map +1 -1
  108. package/dist/spectrum/forms.js.map +1 -1
  109. package/dist/spectrum/icons.js.map +1 -1
  110. package/dist/spectrum/index.js.map +1 -1
  111. package/dist/spectrum/layout.js.map +1 -1
  112. package/dist/spectrum/listView/ListView.js.map +1 -1
  113. package/dist/spectrum/listView/ListViewNormalized.js.map +1 -1
  114. package/dist/spectrum/listView/ListViewWrapper.js.map +1 -1
  115. package/dist/spectrum/listView/index.js.map +1 -1
  116. package/dist/spectrum/navigation.js.map +1 -1
  117. package/dist/spectrum/overlays.js.map +1 -1
  118. package/dist/spectrum/picker/Picker.js.map +1 -1
  119. package/dist/spectrum/picker/PickerNormalized.js.map +1 -1
  120. package/dist/spectrum/picker/PickerProps.js.map +1 -1
  121. package/dist/spectrum/picker/index.js.map +1 -1
  122. package/dist/spectrum/picker/usePickerItemScale.js.map +1 -1
  123. package/dist/spectrum/picker/usePickerNormalizedProps.js.map +1 -1
  124. package/dist/spectrum/picker/usePickerProps.js.map +1 -1
  125. package/dist/spectrum/picker/usePickerScrollOnOpen.js.map +1 -1
  126. package/dist/spectrum/shared.js.map +1 -1
  127. package/dist/spectrum/status.js.map +1 -1
  128. package/dist/spectrum/utils/index.js.map +1 -1
  129. package/dist/spectrum/utils/itemUtils.js.map +1 -1
  130. package/dist/spectrum/utils/itemWrapperUtils.js.map +1 -1
  131. package/dist/spectrum/utils/propsUtils.js.map +1 -1
  132. package/dist/spectrum/utils/themeUtils.js.map +1 -1
  133. package/dist/spectrum/utils/useOnChangeTrackUncontrolled.js.map +1 -1
  134. package/dist/spectrum/utils/useRenderNormalizedItem.js.map +1 -1
  135. package/dist/spectrum/utils/useStaticItemInitialScrollPosition.js.map +1 -1
  136. package/dist/spectrum/utils/useStringifiedMultiSelection.js.map +1 -1
  137. package/dist/spectrum/utils/useStringifiedSelection.js.map +1 -1
  138. package/dist/theme/Logo.js.map +1 -1
  139. package/dist/theme/SpectrumThemeProvider.js.map +1 -1
  140. package/dist/theme/ThemeModel.js.map +1 -1
  141. package/dist/theme/ThemePicker.js.map +1 -1
  142. package/dist/theme/ThemeProvider.js.map +1 -1
  143. package/dist/theme/ThemeUtils.js.map +1 -1
  144. package/dist/theme/colorUtils.js.map +1 -1
  145. package/dist/theme/index.js.map +1 -1
  146. package/dist/theme/theme-dark/index.js.map +1 -1
  147. package/dist/theme/theme-light/index.js.map +1 -1
  148. package/dist/theme/theme-spectrum/index.js.map +1 -1
  149. package/dist/theme/useExternalTheme.js.map +1 -1
  150. package/dist/theme/useSpectrumThemeProvider.js.map +1 -1
  151. package/dist/theme/useTheme.js.map +1 -1
  152. package/dist/transitions/FadeTransition.js.map +1 -1
  153. package/dist/transitions/SlideTransition.js.map +1 -1
  154. package/dist/transitions/index.js.map +1 -1
  155. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"TimeSlider.js","names":["React","useCallback","useMemo","useRef","useState","useEffect","classNames","TimeInput","StyleExports","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","HANDLE_SIZE","parseInt","POPOVER_WIDTH","SECONDS_IN_DAY","SNAP_NEAREST_MINUTES","TimeSlider","_ref","startTime","propStartTime","endTime","propEndTime","onChange","isStartModified","isEndModified","dataTestId","setStartTime","setEndTime","track","setTimeOnPropTimeChange","updateTime","newStartTime","newEndTime","start","end","handleStartTimeChange","handleEndTimeChange","className","children","PopOvers","onStartTimeChange","onEndTimeChange","ref","TrackFills","Array","fill","map","value","index","Handle","time","setTime","concat","props","swapTimes","firstTime","setFirstTime","secondTime","setSecondTime","firstTimeRef","secondTimeRef","firstTimeSelectionRef","secondTimeSelectionRef","setFocusOnSwapTimesChange","current","_secondTimeRef$curren","setSelection","_firstTimeRef$current","onFirstTimeChange","onSecondTimeChange","onFirstTimeSelect","selection","onSecondTimeSelect","style","flexBasis","modified","allowValueWrapping","onSelect","undefined","transform","ONE_HOUR","handleOffset","calculatePositionAsTime","clientX","trackRect","getBoundingClientRect","leftEdge","Math","max","left","preciseTime","min","width","roundedTime","round","limitMax","handleMouseMove","_ref2","handleMouseUp","_ref3","window","removeEventListener","document","documentElement","classList","remove","startDragListening","addEventListener","add","stopDragListening","handleMouseDown","removeListenersOnUnmount","type","onMouseDown"],"sources":["../src/TimeSlider.tsx"],"sourcesContent":["/* eslint-disable react/no-array-index-key */\n// array maps being used are static, this is fine.\n\nimport React, {\n useCallback,\n useMemo,\n useRef,\n useState,\n useEffect,\n} from 'react';\nimport classNames from 'classnames';\nimport TimeInput, {\n type SelectionSegment,\n type TimeInputElement,\n} from './TimeInput';\nimport StyleExports from './TimeSlider.module.scss';\nimport './TimeSlider.scss';\n\nconst HANDLE_SIZE = parseInt(StyleExports['handle-size'], 10);\nconst POPOVER_WIDTH = parseInt(StyleExports['popover-width'], 10);\nconst SECONDS_IN_DAY = 24 * 60 * 60 - 1; // Max is actually 23:59:59\nconst SNAP_NEAREST_MINUTES = 5 * 60; // rounds in 5 minute intervals\n\ntype TimeSliderProps = {\n startTime: number;\n endTime: number;\n onChange: (value: { startTime: number; endTime: number }) => void;\n isStartModified?: boolean;\n isEndModified?: boolean;\n 'data-testid'?: string;\n};\n\n/**\n * Creates a time slider for setting a start and end time, that can also run overnight\n * @param props takes times in seconds 0 - 86399 and a callback\n */\nfunction TimeSlider({\n startTime: propStartTime,\n endTime: propEndTime,\n onChange,\n isStartModified = false,\n isEndModified = false,\n 'data-testid': dataTestId,\n}: TimeSliderProps): JSX.Element {\n const [startTime, setStartTime] = useState(propStartTime);\n const [endTime, setEndTime] = useState(propEndTime);\n\n const track = useRef<HTMLDivElement>(null); // we need the track width while calulculating time from handle drag\n\n // updates state if props change\n useEffect(\n function setTimeOnPropTimeChange() {\n setStartTime(propStartTime);\n setEndTime(propEndTime);\n },\n [propStartTime, propEndTime]\n );\n\n const updateTime = useCallback(\n (newStartTime: number, newEndTime: number) => {\n let start = newStartTime;\n let end = newEndTime;\n if (start === end) {\n if (end < SECONDS_IN_DAY) {\n end += 1;\n } else {\n start -= 1;\n }\n }\n\n setStartTime(start);\n setEndTime(end);\n onChange({ startTime: start, endTime: end });\n },\n [setStartTime, setEndTime, onChange]\n );\n\n const handleStartTimeChange = useCallback(\n (newStartTime: number) => {\n updateTime(newStartTime, endTime);\n },\n [updateTime, endTime]\n );\n\n const handleEndTimeChange = useCallback(\n (newEndTime: number) => {\n updateTime(startTime, newEndTime);\n },\n [updateTime, startTime]\n );\n\n return (\n <div className=\"time-slider\" data-testid={dataTestId}>\n <PopOvers\n startTime={startTime}\n endTime={endTime}\n onStartTimeChange={handleStartTimeChange}\n onEndTimeChange={handleEndTimeChange}\n isStartModified={isStartModified}\n isEndModified={isEndModified}\n />\n <div className=\"track\" ref={track}>\n <TrackFills startTime={startTime} endTime={endTime} />\n <div className=\"ticks\">\n {Array(24)\n .fill(null)\n .map((value, index) => (\n <div className=\"tick\" key={index} />\n ))}\n </div>\n <Handle\n track={track}\n time={startTime}\n setTime={handleStartTimeChange}\n />\n <Handle track={track} time={endTime} setTime={handleEndTimeChange} />\n </div>\n\n <div className=\"tick-labels\">\n <div className=\"tick-label\">0:00</div>\n <div className=\"tick-label-wrapper\">\n {Array(24)\n .fill(null)\n .map((value, index) => (\n <div className=\"tick-label\" key={index}>{`${index + 1}:00`}</div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\ntype PopOversProps = {\n startTime: number;\n endTime: number;\n onStartTimeChange: (time: number) => void;\n onEndTimeChange: (time: number) => void;\n isStartModified: boolean;\n isEndModified: boolean;\n 'data-testid'?: string;\n};\n\nfunction PopOvers(props: PopOversProps): JSX.Element {\n const {\n startTime,\n endTime,\n onStartTimeChange,\n onEndTimeChange,\n isStartModified,\n isEndModified,\n 'data-testid': dataTestId,\n } = props;\n\n const swapTimes = startTime > endTime;\n\n const [firstTime, setFirstTime] = useState(swapTimes ? endTime : startTime);\n const [secondTime, setSecondTime] = useState(swapTimes ? startTime : endTime);\n const firstTimeRef = useRef<TimeInputElement>(null);\n const secondTimeRef = useRef<TimeInputElement>(null);\n // Keep track of selection in both time inputs\n const firstTimeSelectionRef = useRef<SelectionSegment | null>(null);\n const secondTimeSelectionRef = useRef<SelectionSegment | null>(null);\n\n useEffect(\n function setTimeOnPropTimeChange() {\n setFirstTime(startTime > endTime ? endTime : startTime);\n setSecondTime(startTime > endTime ? startTime : endTime);\n },\n [startTime, endTime]\n );\n\n useEffect(\n function setFocusOnSwapTimesChange() {\n if (firstTimeSelectionRef.current !== null) {\n secondTimeRef.current?.setSelection(firstTimeSelectionRef.current);\n }\n if (secondTimeSelectionRef.current !== null) {\n firstTimeRef.current?.setSelection(secondTimeSelectionRef.current);\n }\n },\n [swapTimes]\n );\n\n function onFirstTimeChange(value: number): void {\n if (startTime <= endTime) {\n onStartTimeChange(value);\n } else {\n onEndTimeChange(value);\n }\n }\n\n function onSecondTimeChange(value: number): void {\n if (startTime <= endTime) {\n onEndTimeChange(value);\n } else {\n onStartTimeChange(value);\n }\n }\n\n const onFirstTimeSelect = useCallback(selection => {\n firstTimeSelectionRef.current = selection;\n secondTimeSelectionRef.current = null;\n }, []);\n\n const onSecondTimeSelect = useCallback(selection => {\n firstTimeSelectionRef.current = null;\n secondTimeSelectionRef.current = selection;\n }, []);\n\n return (\n <div className=\"time-slider-popovers\">\n <div\n className=\"flex\"\n style={{\n flexBasis: `calc(${(firstTime / SECONDS_IN_DAY) * 100}% - ${\n POPOVER_WIDTH / 2\n }px)`,\n }}\n />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: swapTimes ? isEndModified : isStartModified,\n })}\n >\n {swapTimes ? 'End Time' : 'Start Time'}\n </label>\n <TimeInput\n ref={firstTimeRef}\n allowValueWrapping={false}\n value={firstTime}\n onChange={onFirstTimeChange}\n onSelect={onFirstTimeSelect}\n data-testid={\n dataTestId !== undefined ? `${dataTestId}-input-1` : undefined\n }\n />\n </div>\n <div className=\"flex-spacer\" />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: swapTimes ? isStartModified : isEndModified,\n })}\n >\n {swapTimes ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n ref={secondTimeRef}\n allowValueWrapping={false}\n value={secondTime}\n onChange={onSecondTimeChange}\n onSelect={onSecondTimeSelect}\n data-testid={\n dataTestId !== undefined ? `${dataTestId}-input-2` : undefined\n }\n />\n </div>\n <div\n className=\"flex\"\n style={{\n flexBasis: `calc(${\n ((SECONDS_IN_DAY - secondTime) / SECONDS_IN_DAY) * 100\n }% - ${POPOVER_WIDTH / 2}px)`,\n }}\n />\n </div>\n );\n}\n\ntype TrackFillsProps = {\n startTime: number;\n endTime: number;\n 'data-testid'?: string;\n};\n\n/**\n * Shades the area between or outside of handles according to if start or endtime is greater.\n */\nfunction TrackFills(props: TrackFillsProps): JSX.Element {\n const { startTime, endTime, 'data-testid': dataTestId } = props;\n return (\n <div className=\"track-fills\" data-testid={dataTestId}>\n {startTime > endTime && (\n <>\n <div\n className=\"track-fill track-fill-start\"\n style={{ transform: `scaleX(${endTime / SECONDS_IN_DAY})` }}\n />\n <div\n className=\"track-fill track-fill-end\"\n style={{\n transform: `scaleX(${\n (SECONDS_IN_DAY - startTime) / SECONDS_IN_DAY\n })`,\n }}\n />\n </>\n )}\n {startTime < endTime && (\n <div\n className=\"track-fill track-fill-middle\"\n style={{\n transform: `translateX(${\n (startTime / SECONDS_IN_DAY) * 100\n }%) scaleX(${(endTime - startTime) / SECONDS_IN_DAY})`,\n }}\n />\n )}\n </div>\n );\n}\n\ntype HandleProps = {\n track: React.RefObject<HTMLDivElement>;\n time: number;\n setTime: (time: number) => void;\n 'data-testid'?: string;\n};\n\n/**\n * Creates a draggable handle the sets the time\n */\nfunction Handle(props: HandleProps): JSX.Element {\n const { track, time, setTime, 'data-testid': dataTestId } = props;\n\n /**\n * Takes the time and generate our translation string taking into account handle offset.\n * The handle offset changes for the first and last tick range dynmaically. Normally,\n * the center of the handle (size/2) is the selection origin, but at edges, it becomes either\n * end of the handle, requireing a relative offset range of 0 - 0.5, and 0.5 - 1 of handle size.\n * @param t time in seconds\n */\n const transform = useMemo(() => {\n const ONE_HOUR = 60 * 60;\n let handleOffset = HANDLE_SIZE / 2;\n if (time < ONE_HOUR) {\n handleOffset = (time / ONE_HOUR) * (HANDLE_SIZE / 2); // 0 - 0.5 Handle size\n } else if (time > 23 * ONE_HOUR) {\n handleOffset =\n HANDLE_SIZE / 2 +\n (1 / (SECONDS_IN_DAY - 23 * ONE_HOUR)) *\n (time - 23 * ONE_HOUR) *\n (HANDLE_SIZE / 2); // 0.5 - 1 Handle size\n }\n return `translateX(calc(${\n (time / SECONDS_IN_DAY) * 100\n }% - ${handleOffset}px))`;\n }, [time]);\n\n const calculatePositionAsTime = useCallback(\n (clientX: number) => {\n if (!track.current) {\n return 0;\n }\n const trackRect = track.current.getBoundingClientRect();\n const leftEdge = Math.max(clientX - trackRect.left, 0);\n // get position as 0-1 on slider and mulitply by seconds in a day to convert to time\n const preciseTime =\n SECONDS_IN_DAY * Math.min(1, leftEdge / trackRect.width);\n // snap to nearest N(5) minute interval\n const roundedTime =\n SNAP_NEAREST_MINUTES * Math.round(preciseTime / SNAP_NEAREST_MINUTES);\n // prevent over-rounding to 24:00:00\n const limitMax = Math.min(SECONDS_IN_DAY, roundedTime);\n return limitMax;\n },\n [track]\n );\n\n const handleMouseMove = useCallback(\n ({ clientX }: MouseEvent) => {\n setTime(calculatePositionAsTime(clientX));\n },\n [setTime, calculatePositionAsTime]\n );\n\n const handleMouseUp = useCallback(\n ({ clientX }: MouseEvent) => {\n setTime(calculatePositionAsTime(clientX));\n\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.remove('drag-pointer-events-none');\n },\n [setTime, calculatePositionAsTime, handleMouseMove]\n );\n\n const startDragListening = useCallback(() => {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.add('drag-pointer-events-none');\n }, [handleMouseMove, handleMouseUp]);\n\n const stopDragListening = useCallback(() => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.remove('drag-pointer-events-none');\n }, [handleMouseMove, handleMouseUp]);\n\n const handleMouseDown = useCallback(() => {\n startDragListening();\n }, [startDragListening]);\n\n useEffect(\n function removeListenersOnUnmount() {\n return () => {\n stopDragListening();\n };\n },\n [stopDragListening]\n );\n\n return (\n <div className=\"handle-track\" style={{ transform }}>\n <button\n className=\"handle\"\n type=\"button\"\n aria-label=\"Change time\"\n onMouseDown={handleMouseDown}\n data-testid={dataTestId}\n />\n </div>\n );\n}\n\nexport default TimeSlider;\n"],"mappings":"AAAA;AACA;;AAEA,OAAOA,KAAK,IACVC,WAAW,EACXC,OAAO,EACPC,MAAM,EACNC,QAAQ,EACRC,SAAS,QACJ,OAAO;AACd,OAAOC,UAAU,MAAM,YAAY;AAAC,OAC7BC,SAAS;AAAA,OAITC,YAAY;AAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAAA,SAAAC,QAAA,IAAAC,SAAA;AAGnB,IAAMC,WAAW,GAAGC,QAAQ,CAACR,YAAY,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;AAC7D,IAAMS,aAAa,GAAGD,QAAQ,CAACR,YAAY,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC;AACjE,IAAMU,cAAc,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACzC,IAAMC,oBAAoB,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;;AAWrC;AACA;AACA;AACA;AACA,SAASC,UAAUA,CAAAC,IAAA,EAOc;EAAA,IAPb;IAClBC,SAAS,EAAEC,aAAa;IACxBC,OAAO,EAAEC,WAAW;IACpBC,QAAQ;IACRC,eAAe,GAAG,KAAK;IACvBC,aAAa,GAAG,KAAK;IACrB,aAAa,EAAEC;EACA,CAAC,GAAAR,IAAA;EAChB,IAAM,CAACC,SAAS,EAAEQ,YAAY,CAAC,GAAG1B,QAAQ,CAACmB,aAAa,CAAC;EACzD,IAAM,CAACC,OAAO,EAAEO,UAAU,CAAC,GAAG3B,QAAQ,CAACqB,WAAW,CAAC;EAEnD,IAAMO,KAAK,GAAG7B,MAAM,CAAiB,IAAI,CAAC,CAAC,CAAC;;EAE5C;EACAE,SAAS,CACP,SAAS4B,uBAAuBA,CAAA,EAAG;IACjCH,YAAY,CAACP,aAAa,CAAC;IAC3BQ,UAAU,CAACN,WAAW,CAAC;EACzB,CAAC,EACD,CAACF,aAAa,EAAEE,WAAW,CAC7B,CAAC;EAED,IAAMS,UAAU,GAAGjC,WAAW,CAC5B,CAACkC,YAAoB,EAAEC,UAAkB,KAAK;IAC5C,IAAIC,KAAK,GAAGF,YAAY;IACxB,IAAIG,GAAG,GAAGF,UAAU;IACpB,IAAIC,KAAK,KAAKC,GAAG,EAAE;MACjB,IAAIA,GAAG,GAAGpB,cAAc,EAAE;QACxBoB,GAAG,IAAI,CAAC;MACV,CAAC,MAAM;QACLD,KAAK,IAAI,CAAC;MACZ;IACF;IAEAP,YAAY,CAACO,KAAK,CAAC;IACnBN,UAAU,CAACO,GAAG,CAAC;IACfZ,QAAQ,CAAC;MAAEJ,SAAS,EAAEe,KAAK;MAAEb,OAAO,EAAEc;IAAI,CAAC,CAAC;EAC9C,CAAC,EACD,CAACR,YAAY,EAAEC,UAAU,EAAEL,QAAQ,CACrC,CAAC;EAED,IAAMa,qBAAqB,GAAGtC,WAAW,CACtCkC,YAAoB,IAAK;IACxBD,UAAU,CAACC,YAAY,EAAEX,OAAO,CAAC;EACnC,CAAC,EACD,CAACU,UAAU,EAAEV,OAAO,CACtB,CAAC;EAED,IAAMgB,mBAAmB,GAAGvC,WAAW,CACpCmC,UAAkB,IAAK;IACtBF,UAAU,CAACZ,SAAS,EAAEc,UAAU,CAAC;EACnC,CAAC,EACD,CAACF,UAAU,EAAEZ,SAAS,CACxB,CAAC;EAED,oBACEV,KAAA;IAAK6B,SAAS,EAAC,aAAa;IAAC,eAAaZ,UAAW;IAAAa,QAAA,gBACnDhC,IAAA,CAACiC,QAAQ;MACPrB,SAAS,EAAEA,SAAU;MACrBE,OAAO,EAAEA,OAAQ;MACjBoB,iBAAiB,EAAEL,qBAAsB;MACzCM,eAAe,EAAEL,mBAAoB;MACrCb,eAAe,EAAEA,eAAgB;MACjCC,aAAa,EAAEA;IAAc,CAC9B,CAAC,eACFhB,KAAA;MAAK6B,SAAS,EAAC,OAAO;MAACK,GAAG,EAAEd,KAAM;MAAAU,QAAA,gBAChChC,IAAA,CAACqC,UAAU;QAACzB,SAAS,EAAEA,SAAU;QAACE,OAAO,EAAEA;MAAQ,CAAE,CAAC,eACtDd,IAAA;QAAK+B,SAAS,EAAC,OAAO;QAAAC,QAAA,EACnBM,KAAK,CAAC,EAAE,CAAC,CACPC,IAAI,CAAC,IAAI,CAAC,CACVC,GAAG,CAAC,CAACC,KAAK,EAAEC,KAAK,kBAChB1C,IAAA;UAAK+B,SAAS,EAAC;QAAM,GAAMW,KAAQ,CACpC;MAAC,CACD,CAAC,eACN1C,IAAA,CAAC2C,MAAM;QACLrB,KAAK,EAAEA,KAAM;QACbsB,IAAI,EAAEhC,SAAU;QAChBiC,OAAO,EAAEhB;MAAsB,CAChC,CAAC,eACF7B,IAAA,CAAC2C,MAAM;QAACrB,KAAK,EAAEA,KAAM;QAACsB,IAAI,EAAE9B,OAAQ;QAAC+B,OAAO,EAAEf;MAAoB,CAAE,CAAC;IAAA,CAClE,CAAC,eAEN5B,KAAA;MAAK6B,SAAS,EAAC,aAAa;MAAAC,QAAA,gBAC1BhC,IAAA;QAAK+B,SAAS,EAAC,YAAY;QAAAC,QAAA,EAAC;MAAI,CAAK,CAAC,eACtChC,IAAA;QAAK+B,SAAS,EAAC,oBAAoB;QAAAC,QAAA,EAChCM,KAAK,CAAC,EAAE,CAAC,CACPC,IAAI,CAAC,IAAI,CAAC,CACVC,GAAG,CAAC,CAACC,KAAK,EAAEC,KAAK,kBAChB1C,IAAA;UAAK+B,SAAS,EAAC,YAAY;UAAAC,QAAA,KAAAc,MAAA,CAAiBJ,KAAK,GAAG,CAAC;QAAA,GAApBA,KAA+B,CACjE;MAAC,CACD,CAAC;IAAA,CACH,CAAC;EAAA,CACH,CAAC;AAEV;AAYA,SAAST,QAAQA,CAACc,KAAoB,EAAe;EACnD,IAAM;IACJnC,SAAS;IACTE,OAAO;IACPoB,iBAAiB;IACjBC,eAAe;IACflB,eAAe;IACfC,aAAa;IACb,aAAa,EAAEC;EACjB,CAAC,GAAG4B,KAAK;EAET,IAAMC,SAAS,GAAGpC,SAAS,GAAGE,OAAO;EAErC,IAAM,CAACmC,SAAS,EAAEC,YAAY,CAAC,GAAGxD,QAAQ,CAACsD,SAAS,GAAGlC,OAAO,GAAGF,SAAS,CAAC;EAC3E,IAAM,CAACuC,UAAU,EAAEC,aAAa,CAAC,GAAG1D,QAAQ,CAACsD,SAAS,GAAGpC,SAAS,GAAGE,OAAO,CAAC;EAC7E,IAAMuC,YAAY,GAAG5D,MAAM,CAAmB,IAAI,CAAC;EACnD,IAAM6D,aAAa,GAAG7D,MAAM,CAAmB,IAAI,CAAC;EACpD;EACA,IAAM8D,qBAAqB,GAAG9D,MAAM,CAA0B,IAAI,CAAC;EACnE,IAAM+D,sBAAsB,GAAG/D,MAAM,CAA0B,IAAI,CAAC;EAEpEE,SAAS,CACP,SAAS4B,uBAAuBA,CAAA,EAAG;IACjC2B,YAAY,CAACtC,SAAS,GAAGE,OAAO,GAAGA,OAAO,GAAGF,SAAS,CAAC;IACvDwC,aAAa,CAACxC,SAAS,GAAGE,OAAO,GAAGF,SAAS,GAAGE,OAAO,CAAC;EAC1D,CAAC,EACD,CAACF,SAAS,EAAEE,OAAO,CACrB,CAAC;EAEDnB,SAAS,CACP,SAAS8D,yBAAyBA,CAAA,EAAG;IACnC,IAAIF,qBAAqB,CAACG,OAAO,KAAK,IAAI,EAAE;MAAA,IAAAC,qBAAA;MAC1C,CAAAA,qBAAA,GAAAL,aAAa,CAACI,OAAO,cAAAC,qBAAA,uBAArBA,qBAAA,CAAuBC,YAAY,CAACL,qBAAqB,CAACG,OAAO,CAAC;IACpE;IACA,IAAIF,sBAAsB,CAACE,OAAO,KAAK,IAAI,EAAE;MAAA,IAAAG,qBAAA;MAC3C,CAAAA,qBAAA,GAAAR,YAAY,CAACK,OAAO,cAAAG,qBAAA,uBAApBA,qBAAA,CAAsBD,YAAY,CAACJ,sBAAsB,CAACE,OAAO,CAAC;IACpE;EACF,CAAC,EACD,CAACV,SAAS,CACZ,CAAC;EAED,SAASc,iBAAiBA,CAACrB,KAAa,EAAQ;IAC9C,IAAI7B,SAAS,IAAIE,OAAO,EAAE;MACxBoB,iBAAiB,CAACO,KAAK,CAAC;IAC1B,CAAC,MAAM;MACLN,eAAe,CAACM,KAAK,CAAC;IACxB;EACF;EAEA,SAASsB,kBAAkBA,CAACtB,KAAa,EAAQ;IAC/C,IAAI7B,SAAS,IAAIE,OAAO,EAAE;MACxBqB,eAAe,CAACM,KAAK,CAAC;IACxB,CAAC,MAAM;MACLP,iBAAiB,CAACO,KAAK,CAAC;IAC1B;EACF;EAEA,IAAMuB,iBAAiB,GAAGzE,WAAW,CAAC0E,SAAS,IAAI;IACjDV,qBAAqB,CAACG,OAAO,GAAGO,SAAS;IACzCT,sBAAsB,CAACE,OAAO,GAAG,IAAI;EACvC,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMQ,kBAAkB,GAAG3E,WAAW,CAAC0E,SAAS,IAAI;IAClDV,qBAAqB,CAACG,OAAO,GAAG,IAAI;IACpCF,sBAAsB,CAACE,OAAO,GAAGO,SAAS;EAC5C,CAAC,EAAE,EAAE,CAAC;EAEN,oBACE/D,KAAA;IAAK6B,SAAS,EAAC,sBAAsB;IAAAC,QAAA,gBACnChC,IAAA;MACE+B,SAAS,EAAC,MAAM;MAChBoC,KAAK,EAAE;QACLC,SAAS,UAAAtB,MAAA,CAAWG,SAAS,GAAGzC,cAAc,GAAI,GAAG,UAAAsC,MAAA,CACnDvC,aAAa,GAAG,CAAC;MAErB;IAAE,CACH,CAAC,eACFL,KAAA;MAAK6B,SAAS,EAAC,eAAe;MAAAC,QAAA,gBAC5BhC,IAAA;QACE+B,SAAS,EAAEnC,UAAU,CAAC;UACpByE,QAAQ,EAAErB,SAAS,GAAG9B,aAAa,GAAGD;QACxC,CAAC,CAAE;QAAAe,QAAA,EAEFgB,SAAS,GAAG,UAAU,GAAG;MAAY,CACjC,CAAC,eACRhD,IAAA,CAACH,SAAS;QACRuC,GAAG,EAAEiB,YAAa;QAClBiB,kBAAkB,EAAE,KAAM;QAC1B7B,KAAK,EAAEQ,SAAU;QACjBjC,QAAQ,EAAE8C,iBAAkB;QAC5BS,QAAQ,EAAEP,iBAAkB;QAC5B,eACE7C,UAAU,KAAKqD,SAAS,MAAA1B,MAAA,CAAM3B,UAAU,gBAAaqD;MACtD,CACF,CAAC;IAAA,CACC,CAAC,eACNxE,IAAA;MAAK+B,SAAS,EAAC;IAAa,CAAE,CAAC,eAC/B7B,KAAA;MAAK6B,SAAS,EAAC,eAAe;MAAAC,QAAA,gBAC5BhC,IAAA;QACE+B,SAAS,EAAEnC,UAAU,CAAC;UACpByE,QAAQ,EAAErB,SAAS,GAAG/B,eAAe,GAAGC;QAC1C,CAAC,CAAE;QAAAc,QAAA,EAEFgB,SAAS,GAAG,YAAY,GAAG;MAAU,CACjC,CAAC,eACRhD,IAAA,CAACH,SAAS;QACRuC,GAAG,EAAEkB,aAAc;QACnBgB,kBAAkB,EAAE,KAAM;QAC1B7B,KAAK,EAAEU,UAAW;QAClBnC,QAAQ,EAAE+C,kBAAmB;QAC7BQ,QAAQ,EAAEL,kBAAmB;QAC7B,eACE/C,UAAU,KAAKqD,SAAS,MAAA1B,MAAA,CAAM3B,UAAU,gBAAaqD;MACtD,CACF,CAAC;IAAA,CACC,CAAC,eACNxE,IAAA;MACE+B,SAAS,EAAC,MAAM;MAChBoC,KAAK,EAAE;QACLC,SAAS,UAAAtB,MAAA,CACN,CAACtC,cAAc,GAAG2C,UAAU,IAAI3C,cAAc,GAAI,GAAG,UAAAsC,MAAA,CACjDvC,aAAa,GAAG,CAAC;MAC1B;IAAE,CACH,CAAC;EAAA,CACC,CAAC;AAEV;AAQA;AACA;AACA;AACA,SAAS8B,UAAUA,CAACU,KAAsB,EAAe;EACvD,IAAM;IAAEnC,SAAS;IAAEE,OAAO;IAAE,aAAa,EAAEK;EAAW,CAAC,GAAG4B,KAAK;EAC/D,oBACE7C,KAAA;IAAK6B,SAAS,EAAC,aAAa;IAAC,eAAaZ,UAAW;IAAAa,QAAA,GAClDpB,SAAS,GAAGE,OAAO,iBAClBZ,KAAA,CAAAE,SAAA;MAAA4B,QAAA,gBACEhC,IAAA;QACE+B,SAAS,EAAC,6BAA6B;QACvCoC,KAAK,EAAE;UAAEM,SAAS,YAAA3B,MAAA,CAAYhC,OAAO,GAAGN,cAAc;QAAI;MAAE,CAC7D,CAAC,eACFR,IAAA;QACE+B,SAAS,EAAC,2BAA2B;QACrCoC,KAAK,EAAE;UACLM,SAAS,YAAA3B,MAAA,CACP,CAACtC,cAAc,GAAGI,SAAS,IAAIJ,cAAc;QAEjD;MAAE,CACH,CAAC;IAAA,CACF,CACH,EACAI,SAAS,GAAGE,OAAO,iBAClBd,IAAA;MACE+B,SAAS,EAAC,8BAA8B;MACxCoC,KAAK,EAAE;QACLM,SAAS,gBAAA3B,MAAA,CACNlC,SAAS,GAAGJ,cAAc,GAAI,GAAG,gBAAAsC,MAAA,CACvB,CAAChC,OAAO,GAAGF,SAAS,IAAIJ,cAAc;MACrD;IAAE,CACH,CACF;EAAA,CACE,CAAC;AAEV;AASA;AACA;AACA;AACA,SAASmC,MAAMA,CAACI,KAAkB,EAAe;EAC/C,IAAM;IAAEzB,KAAK;IAAEsB,IAAI;IAAEC,OAAO;IAAE,aAAa,EAAE1B;EAAW,CAAC,GAAG4B,KAAK;;EAEjE;AACF;AACA;AACA;AACA;AACA;AACA;EACE,IAAM0B,SAAS,GAAGjF,OAAO,CAAC,MAAM;IAC9B,IAAMkF,QAAQ,GAAG,EAAE,GAAG,EAAE;IACxB,IAAIC,YAAY,GAAGtE,WAAW,GAAG,CAAC;IAClC,IAAIuC,IAAI,GAAG8B,QAAQ,EAAE;MACnBC,YAAY,GAAI/B,IAAI,GAAG8B,QAAQ,IAAKrE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,MAAM,IAAIuC,IAAI,GAAG,EAAE,GAAG8B,QAAQ,EAAE;MAC/BC,YAAY,GACVtE,WAAW,GAAG,CAAC,GACd,CAAC,IAAIG,cAAc,GAAG,EAAE,GAAGkE,QAAQ,CAAC,IAClC9B,IAAI,GAAG,EAAE,GAAG8B,QAAQ,CAAC,IACrBrE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC;IACzB;;IACA,0BAAAyC,MAAA,CACGF,IAAI,GAAGpC,cAAc,GAAI,GAAG,UAAAsC,MAAA,CACxB6B,YAAY;EACrB,CAAC,EAAE,CAAC/B,IAAI,CAAC,CAAC;EAEV,IAAMgC,uBAAuB,GAAGrF,WAAW,CACxCsF,OAAe,IAAK;IACnB,IAAI,CAACvD,KAAK,CAACoC,OAAO,EAAE;MAClB,OAAO,CAAC;IACV;IACA,IAAMoB,SAAS,GAAGxD,KAAK,CAACoC,OAAO,CAACqB,qBAAqB,CAAC,CAAC;IACvD,IAAMC,QAAQ,GAAGC,IAAI,CAACC,GAAG,CAACL,OAAO,GAAGC,SAAS,CAACK,IAAI,EAAE,CAAC,CAAC;IACtD;IACA,IAAMC,WAAW,GACf5E,cAAc,GAAGyE,IAAI,CAACI,GAAG,CAAC,CAAC,EAAEL,QAAQ,GAAGF,SAAS,CAACQ,KAAK,CAAC;IAC1D;IACA,IAAMC,WAAW,GACf9E,oBAAoB,GAAGwE,IAAI,CAACO,KAAK,CAACJ,WAAW,GAAG3E,oBAAoB,CAAC;IACvE;IACA,IAAMgF,QAAQ,GAAGR,IAAI,CAACI,GAAG,CAAC7E,cAAc,EAAE+E,WAAW,CAAC;IACtD,OAAOE,QAAQ;EACjB,CAAC,EACD,CAACnE,KAAK,CACR,CAAC;EAED,IAAMoE,eAAe,GAAGnG,WAAW,CACjCoG,KAAA,IAA6B;IAAA,IAA5B;MAAEd;IAAoB,CAAC,GAAAc,KAAA;IACtB9C,OAAO,CAAC+B,uBAAuB,CAACC,OAAO,CAAC,CAAC;EAC3C,CAAC,EACD,CAAChC,OAAO,EAAE+B,uBAAuB,CACnC,CAAC;EAED,IAAMgB,aAAa,GAAGrG,WAAW,CAC/BsG,KAAA,IAA6B;IAAA,IAA5B;MAAEhB;IAAoB,CAAC,GAAAgB,KAAA;IACtBhD,OAAO,CAAC+B,uBAAuB,CAACC,OAAO,CAAC,CAAC;IAEzCiB,MAAM,CAACC,mBAAmB,CAAC,WAAW,EAAEL,eAAe,CAAC;IACxDI,MAAM,CAACC,mBAAmB,CAAC,SAAS,EAAEH,aAAa,CAAC;IACpDI,QAAQ,CAACC,eAAe,CAACC,SAAS,CAACC,MAAM,CAAC,0BAA0B,CAAC;EACvE,CAAC,EACD,CAACtD,OAAO,EAAE+B,uBAAuB,EAAEc,eAAe,CACpD,CAAC;EAED,IAAMU,kBAAkB,GAAG7G,WAAW,CAAC,MAAM;IAC3CuG,MAAM,CAACO,gBAAgB,CAAC,WAAW,EAAEX,eAAe,CAAC;IACrDI,MAAM,CAACO,gBAAgB,CAAC,SAAS,EAAET,aAAa,CAAC;IACjDI,QAAQ,CAACC,eAAe,CAACC,SAAS,CAACI,GAAG,CAAC,0BAA0B,CAAC;EACpE,CAAC,EAAE,CAACZ,eAAe,EAAEE,aAAa,CAAC,CAAC;EAEpC,IAAMW,iBAAiB,GAAGhH,WAAW,CAAC,MAAM;IAC1CuG,MAAM,CAACC,mBAAmB,CAAC,WAAW,EAAEL,eAAe,CAAC;IACxDI,MAAM,CAACC,mBAAmB,CAAC,SAAS,EAAEH,aAAa,CAAC;IACpDI,QAAQ,CAACC,eAAe,CAACC,SAAS,CAACC,MAAM,CAAC,0BAA0B,CAAC;EACvE,CAAC,EAAE,CAACT,eAAe,EAAEE,aAAa,CAAC,CAAC;EAEpC,IAAMY,eAAe,GAAGjH,WAAW,CAAC,MAAM;IACxC6G,kBAAkB,CAAC,CAAC;EACtB,CAAC,EAAE,CAACA,kBAAkB,CAAC,CAAC;EAExBzG,SAAS,CACP,SAAS8G,wBAAwBA,CAAA,EAAG;IAClC,OAAO,MAAM;MACXF,iBAAiB,CAAC,CAAC;IACrB,CAAC;EACH,CAAC,EACD,CAACA,iBAAiB,CACpB,CAAC;EAED,oBACEvG,IAAA;IAAK+B,SAAS,EAAC,cAAc;IAACoC,KAAK,EAAE;MAAEM;IAAU,CAAE;IAAAzC,QAAA,eACjDhC,IAAA;MACE+B,SAAS,EAAC,QAAQ;MAClB2E,IAAI,EAAC,QAAQ;MACb,cAAW,aAAa;MACxBC,WAAW,EAAEH,eAAgB;MAC7B,eAAarF;IAAW,CACzB;EAAC,CACC,CAAC;AAEV;AAEA,eAAeT,UAAU","ignoreList":[]}
1
+ {"version":3,"file":"TimeSlider.js","names":["React","useCallback","useMemo","useRef","useState","useEffect","classNames","TimeInput","StyleExports","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","HANDLE_SIZE","parseInt","POPOVER_WIDTH","SECONDS_IN_DAY","SNAP_NEAREST_MINUTES","TimeSlider","_ref","startTime","propStartTime","endTime","propEndTime","onChange","isStartModified","isEndModified","dataTestId","setStartTime","setEndTime","track","setTimeOnPropTimeChange","updateTime","newStartTime","newEndTime","start","end","handleStartTimeChange","handleEndTimeChange","className","children","PopOvers","onStartTimeChange","onEndTimeChange","ref","TrackFills","Array","fill","map","value","index","Handle","time","setTime","concat","props","swapTimes","firstTime","setFirstTime","secondTime","setSecondTime","firstTimeRef","secondTimeRef","firstTimeSelectionRef","secondTimeSelectionRef","setFocusOnSwapTimesChange","current","_secondTimeRef$curren","setSelection","_firstTimeRef$current","onFirstTimeChange","onSecondTimeChange","onFirstTimeSelect","selection","onSecondTimeSelect","style","flexBasis","modified","allowValueWrapping","onSelect","undefined","transform","ONE_HOUR","handleOffset","calculatePositionAsTime","clientX","trackRect","getBoundingClientRect","leftEdge","Math","max","left","preciseTime","min","width","roundedTime","round","limitMax","handleMouseMove","_ref2","handleMouseUp","_ref3","window","removeEventListener","document","documentElement","classList","remove","startDragListening","addEventListener","add","stopDragListening","handleMouseDown","removeListenersOnUnmount","type","onMouseDown"],"sources":["../src/TimeSlider.tsx"],"sourcesContent":["/* eslint-disable react/no-array-index-key */\n// array maps being used are static, this is fine.\n\nimport React, {\n useCallback,\n useMemo,\n useRef,\n useState,\n useEffect,\n} from 'react';\nimport classNames from 'classnames';\nimport TimeInput, {\n type SelectionSegment,\n type TimeInputElement,\n} from './TimeInput';\nimport StyleExports from './TimeSlider.module.scss';\nimport './TimeSlider.scss';\n\nconst HANDLE_SIZE = parseInt(StyleExports['handle-size'], 10);\nconst POPOVER_WIDTH = parseInt(StyleExports['popover-width'], 10);\nconst SECONDS_IN_DAY = 24 * 60 * 60 - 1; // Max is actually 23:59:59\nconst SNAP_NEAREST_MINUTES = 5 * 60; // rounds in 5 minute intervals\n\ntype TimeSliderProps = {\n startTime: number;\n endTime: number;\n onChange: (value: { startTime: number; endTime: number }) => void;\n isStartModified?: boolean;\n isEndModified?: boolean;\n 'data-testid'?: string;\n};\n\n/**\n * Creates a time slider for setting a start and end time, that can also run overnight\n * @param props takes times in seconds 0 - 86399 and a callback\n */\nfunction TimeSlider({\n startTime: propStartTime,\n endTime: propEndTime,\n onChange,\n isStartModified = false,\n isEndModified = false,\n 'data-testid': dataTestId,\n}: TimeSliderProps): JSX.Element {\n const [startTime, setStartTime] = useState(propStartTime);\n const [endTime, setEndTime] = useState(propEndTime);\n\n const track = useRef<HTMLDivElement>(null); // we need the track width while calulculating time from handle drag\n\n // updates state if props change\n useEffect(\n function setTimeOnPropTimeChange() {\n setStartTime(propStartTime);\n setEndTime(propEndTime);\n },\n [propStartTime, propEndTime]\n );\n\n const updateTime = useCallback(\n (newStartTime: number, newEndTime: number) => {\n let start = newStartTime;\n let end = newEndTime;\n if (start === end) {\n if (end < SECONDS_IN_DAY) {\n end += 1;\n } else {\n start -= 1;\n }\n }\n\n setStartTime(start);\n setEndTime(end);\n onChange({ startTime: start, endTime: end });\n },\n [setStartTime, setEndTime, onChange]\n );\n\n const handleStartTimeChange = useCallback(\n (newStartTime: number) => {\n updateTime(newStartTime, endTime);\n },\n [updateTime, endTime]\n );\n\n const handleEndTimeChange = useCallback(\n (newEndTime: number) => {\n updateTime(startTime, newEndTime);\n },\n [updateTime, startTime]\n );\n\n return (\n <div className=\"time-slider\" data-testid={dataTestId}>\n <PopOvers\n startTime={startTime}\n endTime={endTime}\n onStartTimeChange={handleStartTimeChange}\n onEndTimeChange={handleEndTimeChange}\n isStartModified={isStartModified}\n isEndModified={isEndModified}\n />\n <div className=\"track\" ref={track}>\n <TrackFills startTime={startTime} endTime={endTime} />\n <div className=\"ticks\">\n {Array(24)\n .fill(null)\n .map((value, index) => (\n <div className=\"tick\" key={index} />\n ))}\n </div>\n <Handle\n track={track}\n time={startTime}\n setTime={handleStartTimeChange}\n />\n <Handle track={track} time={endTime} setTime={handleEndTimeChange} />\n </div>\n\n <div className=\"tick-labels\">\n <div className=\"tick-label\">0:00</div>\n <div className=\"tick-label-wrapper\">\n {Array(24)\n .fill(null)\n .map((value, index) => (\n <div className=\"tick-label\" key={index}>{`${index + 1}:00`}</div>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\ntype PopOversProps = {\n startTime: number;\n endTime: number;\n onStartTimeChange: (time: number) => void;\n onEndTimeChange: (time: number) => void;\n isStartModified: boolean;\n isEndModified: boolean;\n 'data-testid'?: string;\n};\n\nfunction PopOvers(props: PopOversProps): JSX.Element {\n const {\n startTime,\n endTime,\n onStartTimeChange,\n onEndTimeChange,\n isStartModified,\n isEndModified,\n 'data-testid': dataTestId,\n } = props;\n\n const swapTimes = startTime > endTime;\n\n const [firstTime, setFirstTime] = useState(swapTimes ? endTime : startTime);\n const [secondTime, setSecondTime] = useState(swapTimes ? startTime : endTime);\n const firstTimeRef = useRef<TimeInputElement>(null);\n const secondTimeRef = useRef<TimeInputElement>(null);\n // Keep track of selection in both time inputs\n const firstTimeSelectionRef = useRef<SelectionSegment | null>(null);\n const secondTimeSelectionRef = useRef<SelectionSegment | null>(null);\n\n useEffect(\n function setTimeOnPropTimeChange() {\n setFirstTime(startTime > endTime ? endTime : startTime);\n setSecondTime(startTime > endTime ? startTime : endTime);\n },\n [startTime, endTime]\n );\n\n useEffect(\n function setFocusOnSwapTimesChange() {\n if (firstTimeSelectionRef.current !== null) {\n secondTimeRef.current?.setSelection(firstTimeSelectionRef.current);\n }\n if (secondTimeSelectionRef.current !== null) {\n firstTimeRef.current?.setSelection(secondTimeSelectionRef.current);\n }\n },\n [swapTimes]\n );\n\n function onFirstTimeChange(value: number): void {\n if (startTime <= endTime) {\n onStartTimeChange(value);\n } else {\n onEndTimeChange(value);\n }\n }\n\n function onSecondTimeChange(value: number): void {\n if (startTime <= endTime) {\n onEndTimeChange(value);\n } else {\n onStartTimeChange(value);\n }\n }\n\n const onFirstTimeSelect = useCallback(selection => {\n firstTimeSelectionRef.current = selection;\n secondTimeSelectionRef.current = null;\n }, []);\n\n const onSecondTimeSelect = useCallback(selection => {\n firstTimeSelectionRef.current = null;\n secondTimeSelectionRef.current = selection;\n }, []);\n\n return (\n <div className=\"time-slider-popovers\">\n <div\n className=\"flex\"\n style={{\n flexBasis: `calc(${(firstTime / SECONDS_IN_DAY) * 100}% - ${\n POPOVER_WIDTH / 2\n }px)`,\n }}\n />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: swapTimes ? isEndModified : isStartModified,\n })}\n >\n {swapTimes ? 'End Time' : 'Start Time'}\n </label>\n <TimeInput\n ref={firstTimeRef}\n allowValueWrapping={false}\n value={firstTime}\n onChange={onFirstTimeChange}\n onSelect={onFirstTimeSelect}\n data-testid={\n dataTestId !== undefined ? `${dataTestId}-input-1` : undefined\n }\n />\n </div>\n <div className=\"flex-spacer\" />\n <div className=\"handle-popper\">\n <label\n className={classNames({\n modified: swapTimes ? isStartModified : isEndModified,\n })}\n >\n {swapTimes ? 'Start Time' : 'End Time'}\n </label>\n <TimeInput\n ref={secondTimeRef}\n allowValueWrapping={false}\n value={secondTime}\n onChange={onSecondTimeChange}\n onSelect={onSecondTimeSelect}\n data-testid={\n dataTestId !== undefined ? `${dataTestId}-input-2` : undefined\n }\n />\n </div>\n <div\n className=\"flex\"\n style={{\n flexBasis: `calc(${\n ((SECONDS_IN_DAY - secondTime) / SECONDS_IN_DAY) * 100\n }% - ${POPOVER_WIDTH / 2}px)`,\n }}\n />\n </div>\n );\n}\n\ntype TrackFillsProps = {\n startTime: number;\n endTime: number;\n 'data-testid'?: string;\n};\n\n/**\n * Shades the area between or outside of handles according to if start or endtime is greater.\n */\nfunction TrackFills(props: TrackFillsProps): JSX.Element {\n const { startTime, endTime, 'data-testid': dataTestId } = props;\n return (\n <div className=\"track-fills\" data-testid={dataTestId}>\n {startTime > endTime && (\n <>\n <div\n className=\"track-fill track-fill-start\"\n style={{ transform: `scaleX(${endTime / SECONDS_IN_DAY})` }}\n />\n <div\n className=\"track-fill track-fill-end\"\n style={{\n transform: `scaleX(${\n (SECONDS_IN_DAY - startTime) / SECONDS_IN_DAY\n })`,\n }}\n />\n </>\n )}\n {startTime < endTime && (\n <div\n className=\"track-fill track-fill-middle\"\n style={{\n transform: `translateX(${\n (startTime / SECONDS_IN_DAY) * 100\n }%) scaleX(${(endTime - startTime) / SECONDS_IN_DAY})`,\n }}\n />\n )}\n </div>\n );\n}\n\ntype HandleProps = {\n track: React.RefObject<HTMLDivElement>;\n time: number;\n setTime: (time: number) => void;\n 'data-testid'?: string;\n};\n\n/**\n * Creates a draggable handle the sets the time\n */\nfunction Handle(props: HandleProps): JSX.Element {\n const { track, time, setTime, 'data-testid': dataTestId } = props;\n\n /**\n * Takes the time and generate our translation string taking into account handle offset.\n * The handle offset changes for the first and last tick range dynmaically. Normally,\n * the center of the handle (size/2) is the selection origin, but at edges, it becomes either\n * end of the handle, requireing a relative offset range of 0 - 0.5, and 0.5 - 1 of handle size.\n * @param t time in seconds\n */\n const transform = useMemo(() => {\n const ONE_HOUR = 60 * 60;\n let handleOffset = HANDLE_SIZE / 2;\n if (time < ONE_HOUR) {\n handleOffset = (time / ONE_HOUR) * (HANDLE_SIZE / 2); // 0 - 0.5 Handle size\n } else if (time > 23 * ONE_HOUR) {\n handleOffset =\n HANDLE_SIZE / 2 +\n (1 / (SECONDS_IN_DAY - 23 * ONE_HOUR)) *\n (time - 23 * ONE_HOUR) *\n (HANDLE_SIZE / 2); // 0.5 - 1 Handle size\n }\n return `translateX(calc(${\n (time / SECONDS_IN_DAY) * 100\n }% - ${handleOffset}px))`;\n }, [time]);\n\n const calculatePositionAsTime = useCallback(\n (clientX: number) => {\n if (!track.current) {\n return 0;\n }\n const trackRect = track.current.getBoundingClientRect();\n const leftEdge = Math.max(clientX - trackRect.left, 0);\n // get position as 0-1 on slider and mulitply by seconds in a day to convert to time\n const preciseTime =\n SECONDS_IN_DAY * Math.min(1, leftEdge / trackRect.width);\n // snap to nearest N(5) minute interval\n const roundedTime =\n SNAP_NEAREST_MINUTES * Math.round(preciseTime / SNAP_NEAREST_MINUTES);\n // prevent over-rounding to 24:00:00\n const limitMax = Math.min(SECONDS_IN_DAY, roundedTime);\n return limitMax;\n },\n [track]\n );\n\n const handleMouseMove = useCallback(\n ({ clientX }: MouseEvent) => {\n setTime(calculatePositionAsTime(clientX));\n },\n [setTime, calculatePositionAsTime]\n );\n\n const handleMouseUp = useCallback(\n ({ clientX }: MouseEvent) => {\n setTime(calculatePositionAsTime(clientX));\n\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.remove('drag-pointer-events-none');\n },\n [setTime, calculatePositionAsTime, handleMouseMove]\n );\n\n const startDragListening = useCallback(() => {\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.add('drag-pointer-events-none');\n }, [handleMouseMove, handleMouseUp]);\n\n const stopDragListening = useCallback(() => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n document.documentElement.classList.remove('drag-pointer-events-none');\n }, [handleMouseMove, handleMouseUp]);\n\n const handleMouseDown = useCallback(() => {\n startDragListening();\n }, [startDragListening]);\n\n useEffect(\n function removeListenersOnUnmount() {\n return () => {\n stopDragListening();\n };\n },\n [stopDragListening]\n );\n\n return (\n <div className=\"handle-track\" style={{ transform }}>\n <button\n className=\"handle\"\n type=\"button\"\n aria-label=\"Change time\"\n onMouseDown={handleMouseDown}\n data-testid={dataTestId}\n />\n </div>\n );\n}\n\nexport default TimeSlider;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ToastNotification.js","names":["React","classNames","CSSTransition","vsClose","Button","ThemeExport","FadeTransition","jsx","_jsx","jsxs","_jsxs","ToastNotification","_ref","buttons","isShown","classNamesProp","message","type","onClick","onDismiss","dataTestId","hasButtons","length","in","timeout","transitionMs","mountOnEnter","unmountOnExit","children","className","role","onKeyPress","transitionSlowMs","kind","icon","tooltip","TYPE","Object","freeze","ERROR"],"sources":["../src/ToastNotification.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { CSSTransition } from 'react-transition-group';\nimport { vsClose } from '@deephaven/icons';\nimport Button from './Button';\nimport ThemeExport from './ThemeExport';\nimport './ToastNotification.scss';\nimport { FadeTransition } from './transitions';\n\ntype ToastNotificationProps = {\n buttons?: (typeof Button)[];\n classNames?: string;\n isShown?: boolean;\n message?: string;\n type?: string;\n 'data-testid'?: string;\n\n onClick?: React.EventHandler<\n React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>\n >;\n onDismiss?: React.MouseEventHandler<HTMLButtonElement>;\n};\n\nfunction ToastNotification({\n buttons,\n isShown = false,\n classNames: classNamesProp,\n message,\n type,\n onClick,\n onDismiss,\n 'data-testid': dataTestId,\n}: ToastNotificationProps): JSX.Element {\n const hasButtons = buttons && buttons.length !== 0;\n\n return (\n <CSSTransition\n in={isShown}\n timeout={ThemeExport.transitionMs}\n classNames=\"toast-notification-slide-up\"\n mountOnEnter\n unmountOnExit\n >\n <div\n className={classNames('toast-notification', classNamesProp, type)}\n role=\"presentation\"\n onClick={onClick}\n onKeyPress={onClick}\n data-testid={dataTestId}\n >\n <div className=\"message-container\">\n <span className=\"message\">{message}</span>\n </div>\n <FadeTransition\n in={hasButtons}\n timeout={ThemeExport.transitionSlowMs}\n mountOnEnter\n unmountOnExit\n >\n <div className=\"buttons-container\">{buttons}</div>\n </FadeTransition>\n {onDismiss && (\n <Button\n kind=\"ghost\"\n icon={vsClose}\n tooltip=\"Close notification\"\n className=\"my-2\"\n onClick={onDismiss}\n />\n )}\n </div>\n </CSSTransition>\n );\n}\n\nToastNotification.TYPE = Object.freeze({\n ERROR: 'error',\n});\n\nexport default ToastNotification;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,aAAa,QAAQ,wBAAwB;AACtD,SAASC,OAAO,QAAQ,kBAAkB;AAAC,OACpCC,MAAM;AAAA,OACNC,WAAW;AAAA;AAAA,SAETC,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAgBvB,SAASC,iBAAiBA,CAAAC,IAAA,EASc;EAAA,IATb;IACzBC,OAAO;IACPC,OAAO,GAAG,KAAK;IACfb,UAAU,EAAEc,cAAc;IAC1BC,OAAO;IACPC,IAAI;IACJC,OAAO;IACPC,SAAS;IACT,aAAa,EAAEC;EACO,CAAC,GAAAR,IAAA;EACvB,IAAMS,UAAU,GAAGR,OAAO,IAAIA,OAAO,CAACS,MAAM,KAAK,CAAC;EAElD,oBACEd,IAAA,CAACN,aAAa;IACZqB,EAAE,EAAET,OAAQ;IACZU,OAAO,EAAEnB,WAAW,CAACoB,YAAa;IAClCxB,UAAU,EAAC,6BAA6B;IACxCyB,YAAY;IACZC,aAAa;IAAAC,QAAA,eAEblB,KAAA;MACEmB,SAAS,EAAE5B,UAAU,CAAC,oBAAoB,EAAEc,cAAc,EAAEE,IAAI,CAAE;MAClEa,IAAI,EAAC,cAAc;MACnBZ,OAAO,EAAEA,OAAQ;MACjBa,UAAU,EAAEb,OAAQ;MACpB,eAAaE,UAAW;MAAAQ,QAAA,gBAExBpB,IAAA;QAAKqB,SAAS,EAAC,mBAAmB;QAAAD,QAAA,eAChCpB,IAAA;UAAMqB,SAAS,EAAC,SAAS;UAAAD,QAAA,EAAEZ;QAAO,CAAO;MAAC,CACvC,CAAC,eACNR,IAAA,CAACF,cAAc;QACbiB,EAAE,EAAEF,UAAW;QACfG,OAAO,EAAEnB,WAAW,CAAC2B,gBAAiB;QACtCN,YAAY;QACZC,aAAa;QAAAC,QAAA,eAEbpB,IAAA;UAAKqB,SAAS,EAAC,mBAAmB;UAAAD,QAAA,EAAEf;QAAO,CAAM;MAAC,CACpC,CAAC,EAChBM,SAAS,iBACRX,IAAA,CAACJ,MAAM;QACL6B,IAAI,EAAC,OAAO;QACZC,IAAI,EAAE/B,OAAQ;QACdgC,OAAO,EAAC,oBAAoB;QAC5BN,SAAS,EAAC,MAAM;QAChBX,OAAO,EAAEC;MAAU,CACpB,CACF;IAAA,CACE;EAAC,CACO,CAAC;AAEpB;AAEAR,iBAAiB,CAACyB,IAAI,GAAGC,MAAM,CAACC,MAAM,CAAC;EACrCC,KAAK,EAAE;AACT,CAAC,CAAC;AAEF,eAAe5B,iBAAiB","ignoreList":[]}
1
+ {"version":3,"file":"ToastNotification.js","names":["React","classNames","CSSTransition","vsClose","Button","ThemeExport","FadeTransition","jsx","_jsx","jsxs","_jsxs","ToastNotification","_ref","buttons","isShown","classNamesProp","message","type","onClick","onDismiss","dataTestId","hasButtons","length","in","timeout","transitionMs","mountOnEnter","unmountOnExit","children","className","role","onKeyPress","transitionSlowMs","kind","icon","tooltip","TYPE","Object","freeze","ERROR"],"sources":["../src/ToastNotification.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { CSSTransition } from 'react-transition-group';\nimport { vsClose } from '@deephaven/icons';\nimport Button from './Button';\nimport ThemeExport from './ThemeExport';\nimport './ToastNotification.scss';\nimport { FadeTransition } from './transitions';\n\ntype ToastNotificationProps = {\n buttons?: (typeof Button)[];\n classNames?: string;\n isShown?: boolean;\n message?: string;\n type?: string;\n 'data-testid'?: string;\n\n onClick?: React.EventHandler<\n React.MouseEvent<HTMLDivElement> | React.KeyboardEvent<HTMLDivElement>\n >;\n onDismiss?: React.MouseEventHandler<HTMLButtonElement>;\n};\n\nfunction ToastNotification({\n buttons,\n isShown = false,\n classNames: classNamesProp,\n message,\n type,\n onClick,\n onDismiss,\n 'data-testid': dataTestId,\n}: ToastNotificationProps): JSX.Element {\n const hasButtons = buttons && buttons.length !== 0;\n\n return (\n <CSSTransition\n in={isShown}\n timeout={ThemeExport.transitionMs}\n classNames=\"toast-notification-slide-up\"\n mountOnEnter\n unmountOnExit\n >\n <div\n className={classNames('toast-notification', classNamesProp, type)}\n role=\"presentation\"\n onClick={onClick}\n onKeyPress={onClick}\n data-testid={dataTestId}\n >\n <div className=\"message-container\">\n <span className=\"message\">{message}</span>\n </div>\n <FadeTransition\n in={hasButtons}\n timeout={ThemeExport.transitionSlowMs}\n mountOnEnter\n unmountOnExit\n >\n <div className=\"buttons-container\">{buttons}</div>\n </FadeTransition>\n {onDismiss && (\n <Button\n kind=\"ghost\"\n icon={vsClose}\n tooltip=\"Close notification\"\n className=\"my-2\"\n onClick={onDismiss}\n />\n )}\n </div>\n </CSSTransition>\n );\n}\n\nToastNotification.TYPE = Object.freeze({\n ERROR: 'error',\n});\n\nexport default ToastNotification;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,aAAa,QAAQ,wBAAwB;AACtD,SAASC,OAAO,QAAQ,kBAAkB;AAAC,OACpCC,MAAM;AAAA,OACNC,WAAW;AAAA;AAAA,SAETC,cAAc;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAgBvB,SAASC,iBAAiBA,CAAAC,IAAA,EASc;EAAA,IATb;IACzBC,OAAO;IACPC,OAAO,GAAG,KAAK;IACfb,UAAU,EAAEc,cAAc;IAC1BC,OAAO;IACPC,IAAI;IACJC,OAAO;IACPC,SAAS;IACT,aAAa,EAAEC;EACO,CAAC,GAAAR,IAAA;EACvB,IAAMS,UAAU,GAAGR,OAAO,IAAIA,OAAO,CAACS,MAAM,KAAK,CAAC;EAElD,oBACEd,IAAA,CAACN,aAAa;IACZqB,EAAE,EAAET,OAAQ;IACZU,OAAO,EAAEnB,WAAW,CAACoB,YAAa;IAClCxB,UAAU,EAAC,6BAA6B;IACxCyB,YAAY;IACZC,aAAa;IAAAC,QAAA,eAEblB,KAAA;MACEmB,SAAS,EAAE5B,UAAU,CAAC,oBAAoB,EAAEc,cAAc,EAAEE,IAAI,CAAE;MAClEa,IAAI,EAAC,cAAc;MACnBZ,OAAO,EAAEA,OAAQ;MACjBa,UAAU,EAAEb,OAAQ;MACpB,eAAaE,UAAW;MAAAQ,QAAA,gBAExBpB,IAAA;QAAKqB,SAAS,EAAC,mBAAmB;QAAAD,QAAA,eAChCpB,IAAA;UAAMqB,SAAS,EAAC,SAAS;UAAAD,QAAA,EAAEZ;QAAO,CAAO;MAAC,CACvC,CAAC,eACNR,IAAA,CAACF,cAAc;QACbiB,EAAE,EAAEF,UAAW;QACfG,OAAO,EAAEnB,WAAW,CAAC2B,gBAAiB;QACtCN,YAAY;QACZC,aAAa;QAAAC,QAAA,eAEbpB,IAAA;UAAKqB,SAAS,EAAC,mBAAmB;UAAAD,QAAA,EAAEf;QAAO,CAAM;MAAC,CACpC,CAAC,EAChBM,SAAS,iBACRX,IAAA,CAACJ,MAAM;QACL6B,IAAI,EAAC,OAAO;QACZC,IAAI,EAAE/B,OAAQ;QACdgC,OAAO,EAAC,oBAAoB;QAC5BN,SAAS,EAAC,MAAM;QAChBX,OAAO,EAAEC;MAAU,CACpB,CACF;IAAA,CACE;EAAC,CACO,CAAC;AAEpB;AAEAR,iBAAiB,CAACyB,IAAI,GAAGC,MAAM,CAACC,MAAM,CAAC;EACrCC,KAAK,EAAE;AACT,CAAC,CAAC;AAEF,eAAe5B,iBAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"UIConstants.js","names":["ACTION_ICON_HEIGHT","LIST_VIEW_ROW_HEIGHTS","compact","medium","large","regular","spacious","PICKER_ITEM_HEIGHTS","PICKER_TOP_OFFSET","TABLE_ROW_HEIGHT"],"sources":["../src/UIConstants.ts"],"sourcesContent":["export const ACTION_ICON_HEIGHT = 24;\n\n// Copied from https://github.com/adobe/react-spectrum/blob/b2d25ef23b827ec2427bf47b343e6dbd66326ed3/packages/%40react-spectrum/list/src/ListView.tsx#L78\nexport const LIST_VIEW_ROW_HEIGHTS = {\n compact: {\n medium: 32,\n large: 40,\n },\n regular: {\n medium: 40,\n large: 50,\n },\n spacious: {\n medium: 48,\n large: 60,\n },\n} as const;\n\n// https://github.com/adobe/react-spectrum/blob/main/packages/%40react-spectrum/listbox/src/ListBoxBase.tsx#L56\nexport const PICKER_ITEM_HEIGHTS = {\n medium: 32,\n large: 48,\n} as const;\n\nexport const PICKER_TOP_OFFSET = 4;\nexport const TABLE_ROW_HEIGHT = 33;\n"],"mappings":"AAAA,OAAO,IAAMA,kBAAkB,GAAG,EAAE;;AAEpC;AACA,OAAO,IAAMC,qBAAqB,GAAG;EACnCC,OAAO,EAAE;IACPC,MAAM,EAAE,EAAE;IACVC,KAAK,EAAE;EACT,CAAC;EACDC,OAAO,EAAE;IACPF,MAAM,EAAE,EAAE;IACVC,KAAK,EAAE;EACT,CAAC;EACDE,QAAQ,EAAE;IACRH,MAAM,EAAE,EAAE;IACVC,KAAK,EAAE;EACT;AACF,CAAU;;AAEV;AACA,OAAO,IAAMG,mBAAmB,GAAG;EACjCJ,MAAM,EAAE,EAAE;EACVC,KAAK,EAAE;AACT,CAAU;AAEV,OAAO,IAAMI,iBAAiB,GAAG,CAAC;AAClC,OAAO,IAAMC,gBAAgB,GAAG,EAAE","ignoreList":[]}
1
+ {"version":3,"file":"UIConstants.js","names":["ACTION_ICON_HEIGHT","LIST_VIEW_ROW_HEIGHTS","compact","medium","large","regular","spacious","PICKER_ITEM_HEIGHTS","PICKER_TOP_OFFSET","TABLE_ROW_HEIGHT"],"sources":["../src/UIConstants.ts"],"sourcesContent":["export const ACTION_ICON_HEIGHT = 24;\n\n// Copied from https://github.com/adobe/react-spectrum/blob/b2d25ef23b827ec2427bf47b343e6dbd66326ed3/packages/%40react-spectrum/list/src/ListView.tsx#L78\nexport const LIST_VIEW_ROW_HEIGHTS = {\n compact: {\n medium: 32,\n large: 40,\n },\n regular: {\n medium: 40,\n large: 50,\n },\n spacious: {\n medium: 48,\n large: 60,\n },\n} as const;\n\n// https://github.com/adobe/react-spectrum/blob/main/packages/%40react-spectrum/listbox/src/ListBoxBase.tsx#L56\nexport const PICKER_ITEM_HEIGHTS = {\n medium: 32,\n large: 48,\n} as const;\n\nexport const PICKER_TOP_OFFSET = 4;\nexport const TABLE_ROW_HEIGHT = 33;\n"],"mappings":"AAAA,OAAO,IAAMA,kBAAkB,GAAG,EAAE;;AAEpC;AACA,OAAO,IAAMC,qBAAqB,GAAG;EACnCC,OAAO,EAAE;IACPC,MAAM,EAAE,EAAE;IACVC,KAAK,EAAE;EACT,CAAC;EACDC,OAAO,EAAE;IACPF,MAAM,EAAE,EAAE;IACVC,KAAK,EAAE;EACT,CAAC;EACDE,QAAQ,EAAE;IACRH,MAAM,EAAE,EAAE;IACVC,KAAK,EAAE;EACT;AACF,CAAU;;AAEV;AACA,OAAO,IAAMG,mBAAmB,GAAG;EACjCJ,MAAM,EAAE,EAAE;EACVC,KAAK,EAAE;AACT,CAAU;AAEV,OAAO,IAAMI,iBAAiB,GAAG,CAAC;AAClC,OAAO,IAAMC,gBAAgB,GAAG,EAAE"}
@@ -1 +1 @@
1
- {"version":3,"file":"UISwitch.js","names":["React","classNames","jsx","_jsx","UISwitch","_ref","on","id","className","isInvalid","disabled","onClick","dataTestId","type","active","children"],"sources":["../src/UISwitch.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport './UISwitch.scss';\n\nexport type UISwitchProps = {\n on: boolean;\n onClick: React.MouseEventHandler<HTMLButtonElement>;\n id?: string;\n className?: string;\n isInvalid?: boolean;\n disabled?: boolean;\n 'data-testid'?: string;\n};\n\nfunction UISwitch({\n on,\n id,\n className,\n isInvalid,\n disabled = false,\n onClick,\n 'data-testid': dataTestId,\n}: UISwitchProps): JSX.Element {\n return (\n <button\n type=\"button\"\n className={classNames(\n 'btn',\n 'btn-switch',\n className,\n { active: on },\n { 'is-invalid': isInvalid }\n )}\n id={id}\n onClick={onClick}\n disabled={disabled}\n data-testid={dataTestId}\n >\n <div className=\"handle\" />\n </button>\n );\n}\n\nexport default UISwitch;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,UAAU,MAAM,YAAY;AAAC;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAapC,SAASC,QAAQA,CAAAC,IAAA,EAQc;EAAA,IARb;IAChBC,EAAE;IACFC,EAAE;IACFC,SAAS;IACTC,SAAS;IACTC,QAAQ,GAAG,KAAK;IAChBC,OAAO;IACP,aAAa,EAAEC;EACF,CAAC,GAAAP,IAAA;EACd,oBACEF,IAAA;IACEU,IAAI,EAAC,QAAQ;IACbL,SAAS,EAAEP,UAAU,CACnB,KAAK,EACL,YAAY,EACZO,SAAS,EACT;MAAEM,MAAM,EAAER;IAAG,CAAC,EACd;MAAE,YAAY,EAAEG;IAAU,CAC5B,CAAE;IACFF,EAAE,EAAEA,EAAG;IACPI,OAAO,EAAEA,OAAQ;IACjBD,QAAQ,EAAEA,QAAS;IACnB,eAAaE,UAAW;IAAAG,QAAA,eAExBZ,IAAA;MAAKK,SAAS,EAAC;IAAQ,CAAE;EAAC,CACpB,CAAC;AAEb;AAEA,eAAeJ,QAAQ","ignoreList":[]}
1
+ {"version":3,"file":"UISwitch.js","names":["React","classNames","jsx","_jsx","UISwitch","_ref","on","id","className","isInvalid","disabled","onClick","dataTestId","type","active","children"],"sources":["../src/UISwitch.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport './UISwitch.scss';\n\nexport type UISwitchProps = {\n on: boolean;\n onClick: React.MouseEventHandler<HTMLButtonElement>;\n id?: string;\n className?: string;\n isInvalid?: boolean;\n disabled?: boolean;\n 'data-testid'?: string;\n};\n\nfunction UISwitch({\n on,\n id,\n className,\n isInvalid,\n disabled = false,\n onClick,\n 'data-testid': dataTestId,\n}: UISwitchProps): JSX.Element {\n return (\n <button\n type=\"button\"\n className={classNames(\n 'btn',\n 'btn-switch',\n className,\n { active: on },\n { 'is-invalid': isInvalid }\n )}\n id={id}\n onClick={onClick}\n disabled={disabled}\n data-testid={dataTestId}\n >\n <div className=\"handle\" />\n </button>\n );\n}\n\nexport default UISwitch;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,UAAU,MAAM,YAAY;AAAC;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAapC,SAASC,QAAQA,CAAAC,IAAA,EAQc;EAAA,IARb;IAChBC,EAAE;IACFC,EAAE;IACFC,SAAS;IACTC,SAAS;IACTC,QAAQ,GAAG,KAAK;IAChBC,OAAO;IACP,aAAa,EAAEC;EACF,CAAC,GAAAP,IAAA;EACd,oBACEF,IAAA;IACEU,IAAI,EAAC,QAAQ;IACbL,SAAS,EAAEP,UAAU,CACnB,KAAK,EACL,YAAY,EACZO,SAAS,EACT;MAAEM,MAAM,EAAER;IAAG,CAAC,EACd;MAAE,YAAY,EAAEG;IAAU,CAC5B,CAAE;IACFF,EAAE,EAAEA,EAAG;IACPI,OAAO,EAAEA,OAAQ;IACjBD,QAAQ,EAAEA,QAAS;IACnB,eAAaE,UAAW;IAAAG,QAAA,eAExBZ,IAAA;MAAKK,SAAS,EAAC;IAAQ,CAAE;EAAC,CACpB,CAAC;AAEb;AAEA,eAAeJ,QAAQ"}
@@ -1 +1 @@
1
- {"version":3,"file":"XComponent.js","names":["React","forwardRef","canHaveRef","useXComponent","jsx","_jsx","createXComponent","Component","_Component$displayNam","forwardedRefComponent","XComponent","props","ref","ReplacementComponent","_objectSpread","displayName","concat","name","Original","isXComponent"],"sources":["../src/XComponent.tsx"],"sourcesContent":["import React, { type ComponentType, forwardRef } from 'react';\nimport { canHaveRef } from './ComponentUtils';\nimport { useXComponent, type XComponentType } from './XComponentMap';\n\n/**\n * Helper function that will wrap the provided component, and return an ExtendableComponent type.\n * Whenever that ExtendableComponent is used, it will check if there is a replacement component for the provided component on the context.\n * If there is, it will use that component instead of the provided component.\n * This is a similar concept to how swizzling is done in Docusaurus or obj-c, but for any React component.\n *\n * Usage:\n *\n * ```tsx\n * function MyComponent() {\n * return <div>MyComponent</div>;\n * }\n *\n * const XMyComponent = extendableComponent(MyComponent);\n *\n * function MyReplacementComponent() {\n * return <div>MyReplacementComponent</div>;\n * }\n *\n * <XMyComponent /> // Will render MyComponent\n *\n * <XComponentMapProvider value={new Map([[XMyComponent, MyReplacementComponent]])}>\n * <XMyComponent /> // Will render MyReplacementComponent\n * </XComponentMapProvider>\n *\n * ```\n *\n * Is useful in cases where we have a component deep down in the component tree that we want to replace with a different component, but don't want to\n * have to provide props at the top level just to hook into that.\n *\n * @param Component The component to wrap\n * @returns The wrapped component\n */\nexport function createXComponent<P extends Record<string, unknown>>(\n Component: React.ComponentType<P>\n): XComponentType<P> {\n let forwardedRefComponent: XComponentType<P>;\n function XComponent(\n props: P,\n ref: React.ForwardedRef<ComponentType<P>>\n ): JSX.Element {\n const ReplacementComponent = useXComponent(forwardedRefComponent);\n return canHaveRef(Component) ? (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <ReplacementComponent {...props} ref={ref} />\n ) : (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <ReplacementComponent {...props} />\n );\n }\n\n // Add the display name so this appears as a tag in the React DevTools\n // Need to add it here, and then when it's wrapped with the `forwardRef` it will automatically get the display name of the original component\n XComponent.displayName = `XComponent(${\n Component.displayName ?? Component.name\n })`;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n forwardedRefComponent = forwardRef(XComponent) as any;\n\n forwardedRefComponent.Original = Component;\n forwardedRefComponent.isXComponent = true;\n\n return forwardedRefComponent;\n}\n\nexport default createXComponent;\n"],"mappings":";;;;;AAAA,OAAOA,KAAK,IAAwBC,UAAU,QAAQ,OAAO;AAAC,SACrDC,UAAU;AAAA,SACVC,aAAa;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAhCA,SAAAC,GAAA,IAAAC,IAAA;AAiCA,OAAO,SAASC,gBAAgBA,CAC9BC,SAAiC,EACd;EAAA,IAAAC,qBAAA;EACnB,IAAIC,qBAAwC;EAC5C,SAASC,UAAUA,CACjBC,KAAQ,EACRC,GAAyC,EAC5B;IACb,IAAMC,oBAAoB,GAAGV,aAAa,CAACM,qBAAqB,CAAC;IACjE,OAAOP,UAAU,CAACK,SAAS,CAAC;IAAA;IAC1B;IACAF,IAAA,CAACQ,oBAAoB,EAAAC,aAAA,CAAAA,aAAA,KAAKH,KAAK;MAAEC,GAAG,EAAEA;IAAI,EAAE,CAAC;IAAA;IAE7C;IACAP,IAAA,CAACQ,oBAAoB,EAAAC,aAAA,KAAKH,KAAK,CAAG,CACnC;EACH;;EAEA;EACA;EACAD,UAAU,CAACK,WAAW,iBAAAC,MAAA,EAAAR,qBAAA,GACpBD,SAAS,CAACQ,WAAW,cAAAP,qBAAA,cAAAA,qBAAA,GAAID,SAAS,CAACU,IAAI,MACtC;;EAEH;EACAR,qBAAqB,gBAAGR,UAAU,CAACS,UAAU,CAAQ;EAErDD,qBAAqB,CAACS,QAAQ,GAAGX,SAAS;EAC1CE,qBAAqB,CAACU,YAAY,GAAG,IAAI;EAEzC,OAAOV,qBAAqB;AAC9B;AAEA,eAAeH,gBAAgB","ignoreList":[]}
1
+ {"version":3,"file":"XComponent.js","names":["React","forwardRef","canHaveRef","useXComponent","jsx","_jsx","createXComponent","Component","_Component$displayNam","forwardedRefComponent","XComponent","props","ref","ReplacementComponent","_objectSpread","displayName","concat","name","Original","isXComponent"],"sources":["../src/XComponent.tsx"],"sourcesContent":["import React, { type ComponentType, forwardRef } from 'react';\nimport { canHaveRef } from './ComponentUtils';\nimport { useXComponent, type XComponentType } from './XComponentMap';\n\n/**\n * Helper function that will wrap the provided component, and return an ExtendableComponent type.\n * Whenever that ExtendableComponent is used, it will check if there is a replacement component for the provided component on the context.\n * If there is, it will use that component instead of the provided component.\n * This is a similar concept to how swizzling is done in Docusaurus or obj-c, but for any React component.\n *\n * Usage:\n *\n * ```tsx\n * function MyComponent() {\n * return <div>MyComponent</div>;\n * }\n *\n * const XMyComponent = extendableComponent(MyComponent);\n *\n * function MyReplacementComponent() {\n * return <div>MyReplacementComponent</div>;\n * }\n *\n * <XMyComponent /> // Will render MyComponent\n *\n * <XComponentMapProvider value={new Map([[XMyComponent, MyReplacementComponent]])}>\n * <XMyComponent /> // Will render MyReplacementComponent\n * </XComponentMapProvider>\n *\n * ```\n *\n * Is useful in cases where we have a component deep down in the component tree that we want to replace with a different component, but don't want to\n * have to provide props at the top level just to hook into that.\n *\n * @param Component The component to wrap\n * @returns The wrapped component\n */\nexport function createXComponent<P extends Record<string, unknown>>(\n Component: React.ComponentType<P>\n): XComponentType<P> {\n let forwardedRefComponent: XComponentType<P>;\n function XComponent(\n props: P,\n ref: React.ForwardedRef<ComponentType<P>>\n ): JSX.Element {\n const ReplacementComponent = useXComponent(forwardedRefComponent);\n return canHaveRef(Component) ? (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <ReplacementComponent {...props} ref={ref} />\n ) : (\n // eslint-disable-next-line react/jsx-props-no-spreading\n <ReplacementComponent {...props} />\n );\n }\n\n // Add the display name so this appears as a tag in the React DevTools\n // Need to add it here, and then when it's wrapped with the `forwardRef` it will automatically get the display name of the original component\n XComponent.displayName = `XComponent(${\n Component.displayName ?? Component.name\n })`;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n forwardedRefComponent = forwardRef(XComponent) as any;\n\n forwardedRefComponent.Original = Component;\n forwardedRefComponent.isXComponent = true;\n\n return forwardedRefComponent;\n}\n\nexport default createXComponent;\n"],"mappings":";;;;;AAAA,OAAOA,KAAK,IAAwBC,UAAU,QAAQ,OAAO;AAAC,SACrDC,UAAU;AAAA,SACVC,aAAa;AAEtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAhCA,SAAAC,GAAA,IAAAC,IAAA;AAiCA,OAAO,SAASC,gBAAgBA,CAC9BC,SAAiC,EACd;EAAA,IAAAC,qBAAA;EACnB,IAAIC,qBAAwC;EAC5C,SAASC,UAAUA,CACjBC,KAAQ,EACRC,GAAyC,EAC5B;IACb,IAAMC,oBAAoB,GAAGV,aAAa,CAACM,qBAAqB,CAAC;IACjE,OAAOP,UAAU,CAACK,SAAS,CAAC;IAAA;IAC1B;IACAF,IAAA,CAACQ,oBAAoB,EAAAC,aAAA,CAAAA,aAAA,KAAKH,KAAK;MAAEC,GAAG,EAAEA;IAAI,EAAE,CAAC;IAAA;IAE7C;IACAP,IAAA,CAACQ,oBAAoB,EAAAC,aAAA,KAAKH,KAAK,CAAG,CACnC;EACH;;EAEA;EACA;EACAD,UAAU,CAACK,WAAW,iBAAAC,MAAA,EAAAR,qBAAA,GACpBD,SAAS,CAACQ,WAAW,cAAAP,qBAAA,cAAAA,qBAAA,GAAID,SAAS,CAACU,IAAI,MACtC;;EAEH;EACAR,qBAAqB,gBAAGR,UAAU,CAACS,UAAU,CAAQ;EAErDD,qBAAqB,CAACS,QAAQ,GAAGX,SAAS;EAC1CE,qBAAqB,CAACU,YAAY,GAAG,IAAI;EAEzC,OAAOV,qBAAqB;AAC9B;AAEA,eAAeH,gBAAgB"}
@@ -1 +1 @@
1
- {"version":3,"file":"XComponentMap.js","names":["React","useContext","XComponentMapContext","createContext","Map","XComponentMapProvider","Provider","useXComponent","Component","_ctx$get","ctx","get","Original"],"sources":["../src/XComponentMap.ts"],"sourcesContent":["import React, { useContext } from 'react';\n\n/** Type for an extended component. Can fetch the original component using `.Original` */\nexport type XComponentType<P extends Record<string, unknown>> =\n React.ForwardRefExoticComponent<\n React.PropsWithoutRef<P> & React.RefAttributes<unknown>\n > & {\n Original: React.ComponentType<P>;\n isXComponent: boolean;\n };\n\nexport const XComponentMapContext = React.createContext(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new Map<React.ComponentType<any>, React.ComponentType<any>>()\n);\n\nexport const XComponentMapProvider = XComponentMapContext.Provider;\n\n/**\n * Use the replacement component for the provided component if it exists, or just return the provided component.\n * @param Component Component to check if there's a replacement for\n * @returns The replacement component if it exists, otherwise the original component\n */\nexport function useXComponent<P extends Record<string, unknown>>(\n Component: XComponentType<P>\n): React.ComponentType<P> {\n const ctx = useContext(XComponentMapContext);\n return ctx.get(Component) ?? Component.Original;\n}\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,UAAU,QAAQ,OAAO;;AAEzC;;AASA,OAAO,IAAMC,oBAAoB,gBAAGF,KAAK,CAACG,aAAa;AACrD;AACA,IAAIC,GAAG,CAAqD,CAC9D,CAAC;AAED,OAAO,IAAMC,qBAAqB,GAAGH,oBAAoB,CAACI,QAAQ;;AAElE;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAC3BC,SAA4B,EACJ;EAAA,IAAAC,QAAA;EACxB,IAAMC,GAAG,GAAGT,UAAU,CAACC,oBAAoB,CAAC;EAC5C,QAAAO,QAAA,GAAOC,GAAG,CAACC,GAAG,CAACH,SAAS,CAAC,cAAAC,QAAA,cAAAA,QAAA,GAAID,SAAS,CAACI,QAAQ;AACjD","ignoreList":[]}
1
+ {"version":3,"file":"XComponentMap.js","names":["React","useContext","XComponentMapContext","createContext","Map","XComponentMapProvider","Provider","useXComponent","Component","_ctx$get","ctx","get","Original"],"sources":["../src/XComponentMap.ts"],"sourcesContent":["import React, { useContext } from 'react';\n\n/** Type for an extended component. Can fetch the original component using `.Original` */\nexport type XComponentType<P extends Record<string, unknown>> =\n React.ForwardRefExoticComponent<\n React.PropsWithoutRef<P> & React.RefAttributes<unknown>\n > & {\n Original: React.ComponentType<P>;\n isXComponent: boolean;\n };\n\nexport const XComponentMapContext = React.createContext(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n new Map<React.ComponentType<any>, React.ComponentType<any>>()\n);\n\nexport const XComponentMapProvider = XComponentMapContext.Provider;\n\n/**\n * Use the replacement component for the provided component if it exists, or just return the provided component.\n * @param Component Component to check if there's a replacement for\n * @returns The replacement component if it exists, otherwise the original component\n */\nexport function useXComponent<P extends Record<string, unknown>>(\n Component: XComponentType<P>\n): React.ComponentType<P> {\n const ctx = useContext(XComponentMapContext);\n return ctx.get(Component) ?? Component.Original;\n}\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,UAAU,QAAQ,OAAO;;AAEzC;;AASA,OAAO,IAAMC,oBAAoB,gBAAGF,KAAK,CAACG,aAAa;AACrD;AACA,IAAIC,GAAG,CAAqD,CAC9D,CAAC;AAED,OAAO,IAAMC,qBAAqB,GAAGH,oBAAoB,CAACI,QAAQ;;AAElE;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAC3BC,SAA4B,EACJ;EAAA,IAAAC,QAAA;EACxB,IAAMC,GAAG,GAAGT,UAAU,CAACC,oBAAoB,CAAC;EAC5C,QAAAO,QAAA,GAAOC,GAAG,CAACC,GAAG,CAACH,SAAS,CAAC,cAAAC,QAAA,cAAAA,QAAA,GAAID,SAAS,CAACI,QAAQ;AACjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmActionButton.js","names":["useCallback","vsTrash","ActionButtonDialogTrigger","ConfirmationDialog","ACTION_ICON_HEIGHT","jsx","_jsx","ConfirmActionButton","_ref","ariaLabel","heading","confirmationButtonLabel","isHidden","children","tooltip","onConfirm","renderDialog","close","onCancel","icon","isQuiet","height"],"sources":["../../src/actions/ConfirmActionButton.tsx"],"sourcesContent":["import { type ReactElement, type ReactNode, useCallback } from 'react';\nimport type { SpectrumLabelableProps } from '@react-types/shared';\nimport { vsTrash } from '@deephaven/icons';\nimport { ActionButtonDialogTrigger, ConfirmationDialog } from '../dialogs';\nimport { ACTION_ICON_HEIGHT } from '../UIConstants';\n\nexport interface ConfirmActionButtonProps {\n ariaLabel: string;\n heading: ReactNode;\n confirmationButtonLabel: string;\n children:\n | ReactElement<SpectrumLabelableProps>\n | ReactElement<SpectrumLabelableProps>[];\n isHidden?: boolean;\n tooltip?: string;\n onConfirm: () => void;\n}\n\nexport function ConfirmActionButton({\n ariaLabel,\n heading,\n confirmationButtonLabel,\n isHidden,\n children,\n tooltip,\n onConfirm,\n}: ConfirmActionButtonProps): JSX.Element {\n const renderDialog = useCallback(\n close => (\n <ConfirmationDialog\n heading={heading}\n confirmationButtonLabel={confirmationButtonLabel}\n onCancel={close}\n onConfirm={() => {\n close();\n onConfirm();\n }}\n >\n {children}\n </ConfirmationDialog>\n ),\n [children, confirmationButtonLabel, heading, onConfirm]\n );\n\n return (\n <ActionButtonDialogTrigger\n ariaLabel={ariaLabel}\n icon={vsTrash}\n isHidden={isHidden}\n isQuiet\n height={ACTION_ICON_HEIGHT}\n tooltip={tooltip}\n >\n {renderDialog}\n </ActionButtonDialogTrigger>\n );\n}\n\nexport default ConfirmActionButton;\n"],"mappings":"AAAA,SAA4CA,WAAW,QAAQ,OAAO;AAEtE,SAASC,OAAO,QAAQ,kBAAkB;AAAC,SAClCC,yBAAyB,EAAEC,kBAAkB;AAAA,SAC7CC,kBAAkB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAc3B,OAAO,SAASC,mBAAmBA,CAAAC,IAAA,EAQO;EAAA,IARN;IAClCC,SAAS;IACTC,OAAO;IACPC,uBAAuB;IACvBC,QAAQ;IACRC,QAAQ;IACRC,OAAO;IACPC,SAAS,EAATA;EACwB,CAAC,GAAAP,IAAA;EACzB,IAAMQ,YAAY,GAAGhB,WAAW,CAC9BiB,KAAK,iBACHX,IAAA,CAACH,kBAAkB;IACjBO,OAAO,EAAEA,OAAQ;IACjBC,uBAAuB,EAAEA,uBAAwB;IACjDO,QAAQ,EAAED,KAAM;IAChBF,SAAS,EAAEA,CAAA,KAAM;MACfE,KAAK,CAAC,CAAC;MACPF,UAAS,CAAC,CAAC;IACb,CAAE;IAAAF,QAAA,EAEDA;EAAQ,CACS,CACrB,EACD,CAACA,QAAQ,EAAEF,uBAAuB,EAAED,OAAO,EAAEK,UAAS,CACxD,CAAC;EAED,oBACET,IAAA,CAACJ,yBAAyB;IACxBO,SAAS,EAAEA,SAAU;IACrBU,IAAI,EAAElB,OAAQ;IACdW,QAAQ,EAAEA,QAAS;IACnBQ,OAAO;IACPC,MAAM,EAAEjB,kBAAmB;IAC3BU,OAAO,EAAEA,OAAQ;IAAAD,QAAA,EAEhBG;EAAY,CACY,CAAC;AAEhC;AAEA,eAAeT,mBAAmB","ignoreList":[]}
1
+ {"version":3,"file":"ConfirmActionButton.js","names":["useCallback","vsTrash","ActionButtonDialogTrigger","ConfirmationDialog","ACTION_ICON_HEIGHT","jsx","_jsx","ConfirmActionButton","_ref","ariaLabel","heading","confirmationButtonLabel","isHidden","children","tooltip","onConfirm","renderDialog","close","onCancel","icon","isQuiet","height"],"sources":["../../src/actions/ConfirmActionButton.tsx"],"sourcesContent":["import { type ReactElement, type ReactNode, useCallback } from 'react';\nimport type { SpectrumLabelableProps } from '@react-types/shared';\nimport { vsTrash } from '@deephaven/icons';\nimport { ActionButtonDialogTrigger, ConfirmationDialog } from '../dialogs';\nimport { ACTION_ICON_HEIGHT } from '../UIConstants';\n\nexport interface ConfirmActionButtonProps {\n ariaLabel: string;\n heading: ReactNode;\n confirmationButtonLabel: string;\n children:\n | ReactElement<SpectrumLabelableProps>\n | ReactElement<SpectrumLabelableProps>[];\n isHidden?: boolean;\n tooltip?: string;\n onConfirm: () => void;\n}\n\nexport function ConfirmActionButton({\n ariaLabel,\n heading,\n confirmationButtonLabel,\n isHidden,\n children,\n tooltip,\n onConfirm,\n}: ConfirmActionButtonProps): JSX.Element {\n const renderDialog = useCallback(\n close => (\n <ConfirmationDialog\n heading={heading}\n confirmationButtonLabel={confirmationButtonLabel}\n onCancel={close}\n onConfirm={() => {\n close();\n onConfirm();\n }}\n >\n {children}\n </ConfirmationDialog>\n ),\n [children, confirmationButtonLabel, heading, onConfirm]\n );\n\n return (\n <ActionButtonDialogTrigger\n ariaLabel={ariaLabel}\n icon={vsTrash}\n isHidden={isHidden}\n isQuiet\n height={ACTION_ICON_HEIGHT}\n tooltip={tooltip}\n >\n {renderDialog}\n </ActionButtonDialogTrigger>\n );\n}\n\nexport default ConfirmActionButton;\n"],"mappings":"AAAA,SAA4CA,WAAW,QAAQ,OAAO;AAEtE,SAASC,OAAO,QAAQ,kBAAkB;AAAC,SAClCC,yBAAyB,EAAEC,kBAAkB;AAAA,SAC7CC,kBAAkB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAc3B,OAAO,SAASC,mBAAmBA,CAAAC,IAAA,EAQO;EAAA,IARN;IAClCC,SAAS;IACTC,OAAO;IACPC,uBAAuB;IACvBC,QAAQ;IACRC,QAAQ;IACRC,OAAO;IACPC,SAAS,EAATA;EACwB,CAAC,GAAAP,IAAA;EACzB,IAAMQ,YAAY,GAAGhB,WAAW,CAC9BiB,KAAK,iBACHX,IAAA,CAACH,kBAAkB;IACjBO,OAAO,EAAEA,OAAQ;IACjBC,uBAAuB,EAAEA,uBAAwB;IACjDO,QAAQ,EAAED,KAAM;IAChBF,SAAS,EAAEA,CAAA,KAAM;MACfE,KAAK,CAAC,CAAC;MACPF,UAAS,CAAC,CAAC;IACb,CAAE;IAAAF,QAAA,EAEDA;EAAQ,CACS,CACrB,EACD,CAACA,QAAQ,EAAEF,uBAAuB,EAAED,OAAO,EAAEK,UAAS,CACxD,CAAC;EAED,oBACET,IAAA,CAACJ,yBAAyB;IACxBO,SAAS,EAAEA,SAAU;IACrBU,IAAI,EAAElB,OAAQ;IACdW,QAAQ,EAAEA,QAAS;IACnBQ,OAAO;IACPC,MAAM,EAAEjB,kBAAmB;IAC3BU,OAAO,EAAEA,OAAQ;IAAAD,QAAA,EAEhBG;EAAY,CACY,CAAC;AAEhC;AAEA,eAAeT,mBAAmB"}
@@ -1 +1 @@
1
- {"version":3,"file":"IconActionButton.js","names":["FontAwesomeIcon","ActionButton","Icon","Tooltip","ACTION_ICON_HEIGHT","jsx","_jsx","jsxs","_jsxs","IconActionButton","_ref","icon","label","tooltip","props","_objectWithoutProperties","_excluded","_objectSpread","isQuiet","height","children","UNSAFE_className","undefined","displayName"],"sources":["../../src/actions/IconActionButton.tsx"],"sourcesContent":["/* eslint-disable react/jsx-props-no-spreading */\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport type { IconProp } from '@fortawesome/fontawesome-svg-core';\nimport { ActionButton, Icon, type ActionButtonProps } from '../spectrum';\nimport { Tooltip } from '../popper';\nimport { ACTION_ICON_HEIGHT } from '../UIConstants';\n\nexport interface IconActionButtonProps\n extends Omit<ActionButtonProps, 'aria-label' | 'isQuiet' | 'height'> {\n icon: IconProp;\n label: string;\n tooltip?: string;\n}\n\nexport function IconActionButton({\n icon,\n label,\n tooltip,\n ...props\n}: IconActionButtonProps): JSX.Element {\n return (\n <ActionButton\n {...props}\n aria-label={label}\n isQuiet\n height={ACTION_ICON_HEIGHT}\n >\n <Icon\n UNSAFE_className={\n tooltip == null ? undefined : 'action-button-icon-with-tooltip'\n }\n >\n <FontAwesomeIcon icon={icon} />\n </Icon>\n {tooltip == null ? null : <Tooltip>{tooltip}</Tooltip>}\n </ActionButton>\n );\n}\nIconActionButton.displayName = 'IconActionButton';\n\nexport default IconActionButton;\n"],"mappings":";;;;;;;;AAAA;AACA,SAASA,eAAe,QAAQ,gCAAgC;AAAC,SAExDC,YAAY,EAAEC,IAAI;AAAA,SAClBC,OAAO;AAAA,SACPC,kBAAkB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAS3B,OAAO,SAASC,gBAAgBA,CAAAC,IAAA,EAKO;EAAA,IALN;MAC/BC,IAAI;MACJC,KAAK;MACLC;IAEqB,CAAC,GAAAH,IAAA;IADnBI,KAAK,GAAAC,wBAAA,CAAAL,IAAA,EAAAM,SAAA;EAER,oBACER,KAAA,CAACP,YAAY,EAAAgB,aAAA,CAAAA,aAAA,KACPH,KAAK;IACT,cAAYF,KAAM;IAClBM,OAAO;IACPC,MAAM,EAAEf,kBAAmB;IAAAgB,QAAA,gBAE3Bd,IAAA,CAACJ,IAAI;MACHmB,gBAAgB,EACdR,OAAO,IAAI,IAAI,GAAGS,SAAS,GAAG,iCAC/B;MAAAF,QAAA,eAEDd,IAAA,CAACN,eAAe;QAACW,IAAI,EAAEA;MAAK,CAAE;IAAC,CAC3B,CAAC,EACNE,OAAO,IAAI,IAAI,GAAG,IAAI,gBAAGP,IAAA,CAACH,OAAO;MAAAiB,QAAA,EAAEP;IAAO,CAAU,CAAC;EAAA,EAC1C,CAAC;AAEnB;AACAJ,gBAAgB,CAACc,WAAW,GAAG,kBAAkB;AAEjD,eAAed,gBAAgB","ignoreList":[]}
1
+ {"version":3,"file":"IconActionButton.js","names":["FontAwesomeIcon","ActionButton","Icon","Tooltip","ACTION_ICON_HEIGHT","jsx","_jsx","jsxs","_jsxs","IconActionButton","_ref","icon","label","tooltip","props","_objectWithoutProperties","_excluded","_objectSpread","isQuiet","height","children","UNSAFE_className","undefined","displayName"],"sources":["../../src/actions/IconActionButton.tsx"],"sourcesContent":["/* eslint-disable react/jsx-props-no-spreading */\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport type { IconProp } from '@fortawesome/fontawesome-svg-core';\nimport { ActionButton, Icon, type ActionButtonProps } from '../spectrum';\nimport { Tooltip } from '../popper';\nimport { ACTION_ICON_HEIGHT } from '../UIConstants';\n\nexport interface IconActionButtonProps\n extends Omit<ActionButtonProps, 'aria-label' | 'isQuiet' | 'height'> {\n icon: IconProp;\n label: string;\n tooltip?: string;\n}\n\nexport function IconActionButton({\n icon,\n label,\n tooltip,\n ...props\n}: IconActionButtonProps): JSX.Element {\n return (\n <ActionButton\n {...props}\n aria-label={label}\n isQuiet\n height={ACTION_ICON_HEIGHT}\n >\n <Icon\n UNSAFE_className={\n tooltip == null ? undefined : 'action-button-icon-with-tooltip'\n }\n >\n <FontAwesomeIcon icon={icon} />\n </Icon>\n {tooltip == null ? null : <Tooltip>{tooltip}</Tooltip>}\n </ActionButton>\n );\n}\nIconActionButton.displayName = 'IconActionButton';\n\nexport default IconActionButton;\n"],"mappings":";;;;;;;;AAAA;AACA,SAASA,eAAe,QAAQ,gCAAgC;AAAC,SAExDC,YAAY,EAAEC,IAAI;AAAA,SAClBC,OAAO;AAAA,SACPC,kBAAkB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAS3B,OAAO,SAASC,gBAAgBA,CAAAC,IAAA,EAKO;EAAA,IALN;MAC/BC,IAAI;MACJC,KAAK;MACLC;IAEqB,CAAC,GAAAH,IAAA;IADnBI,KAAK,GAAAC,wBAAA,CAAAL,IAAA,EAAAM,SAAA;EAER,oBACER,KAAA,CAACP,YAAY,EAAAgB,aAAA,CAAAA,aAAA,KACPH,KAAK;IACT,cAAYF,KAAM;IAClBM,OAAO;IACPC,MAAM,EAAEf,kBAAmB;IAAAgB,QAAA,gBAE3Bd,IAAA,CAACJ,IAAI;MACHmB,gBAAgB,EACdR,OAAO,IAAI,IAAI,GAAGS,SAAS,GAAG,iCAC/B;MAAAF,QAAA,eAEDd,IAAA,CAACN,eAAe;QAACW,IAAI,EAAEA;MAAK,CAAE;IAAC,CAC3B,CAAC,EACNE,OAAO,IAAI,IAAI,GAAG,IAAI,gBAAGP,IAAA,CAACH,OAAO;MAAAiB,QAAA,EAAEP;IAAO,CAAU,CAAC;EAAA,EAC1C,CAAC;AAEnB;AACAJ,gBAAgB,CAACc,WAAW,GAAG,kBAAkB;AAEjD,eAAed,gBAAgB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/actions/index.ts"],"sourcesContent":["export * from './ConfirmActionButton';\nexport * from './IconActionButton';\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/actions/index.ts"],"sourcesContent":["export * from './ConfirmActionButton';\nexport * from './IconActionButton';\n"],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"ContextActionUtils.js","names":["isPromise","value","then","undefined","ContextActionUtils","disableAllActions","actionsDisabled","enableAllActions","isContextActionEvent","e","Array","isArray","contextActions","compareActions","a","b","group","_a$group","_b$group","order","_a$order","_b$order","title","_a$title","_b$title","sortActions","actions","sortedActions","slice","sort","isMacPlatform","platform","window","navigator","startsWith","getModifierKey","isModifierKeyDown","event","modifierKey","getMenuItems","actionsParam","includePromises","arguments","length","menuItems","i","action","newMenuItems","Promise","push","concat","filter","menuElement","getNextMenuItem","startIndex","delta","firstIndex","menuIndex","item","disabled","_defineProperty"],"sources":["../../src/context-actions/ContextActionUtils.ts"],"sourcesContent":["import { type IconDefinition } from '@deephaven/icons';\nimport type React from 'react';\nimport type { Shortcut } from '../shortcuts';\n\nexport type ResolvableContextAction =\n | ContextAction\n | Promise<ContextAction[]>\n | (() => Promise<ContextAction[]> | ContextAction[] | ContextAction);\n\nexport type MenuItem = ContextAction | Promise<ContextAction[]>;\n\nexport interface ContextAction {\n title?: string | JSX.Element;\n description?: string;\n action?: (event: Event) => void;\n actions?: ResolvableContextAction[];\n icon?: IconDefinition | React.ReactElement<unknown>;\n iconColor?: string;\n shortcut?: Shortcut;\n\n /* Display text for the shortcut if the shortcut is not wired up through the Shortcut class */\n shortcutText?: string;\n isGlobal?: boolean;\n group?: number;\n order?: number;\n disabled?: boolean;\n menuElement?: React.ReactElement;\n iconOutline?: boolean;\n}\n\nexport interface ContextActionEvent extends MouseEvent {\n contextActions: ResolvableContextAction[];\n}\n\nexport function isPromise<A, T>(value: A | Promise<T>): value is Promise<T> {\n return (value as Promise<T>).then !== undefined;\n}\n\nclass ContextActionUtils {\n static actionsDisabled = false;\n\n static disableAllActions(): void {\n ContextActionUtils.actionsDisabled = true;\n }\n\n static enableAllActions(): void {\n ContextActionUtils.actionsDisabled = false;\n }\n\n static isContextActionEvent(e: MouseEvent): e is ContextActionEvent {\n return Array.isArray((e as ContextActionEvent).contextActions);\n }\n\n /**\n * Compare two action items. Useful in Array.sort\n * @param a First context action to compare\n * @param b Second context action to compare\n */\n static compareActions(a: ContextAction, b: ContextAction): number {\n if (a.group !== b.group) {\n return (a.group ?? 0) > (b.group ?? 0) ? 1 : -1;\n }\n\n if (a.order !== b.order) {\n return (a.order ?? 0) > (b.order ?? 0) ? 1 : -1;\n }\n\n if (a.title !== b.title) {\n return (a.title ?? '') > (b.title ?? '') ? 1 : -1;\n }\n\n if (a !== b) {\n return a > b ? 1 : -1;\n }\n\n return 0;\n }\n\n /**\n *\n * @param actions The array of actions to sort\n */\n static sortActions(actions: ContextAction[]): ContextAction[] {\n if (actions == null || !Array.isArray(actions)) {\n return [];\n }\n\n const sortedActions = actions.slice();\n sortedActions.sort(ContextActionUtils.compareActions);\n return sortedActions;\n }\n\n static isMacPlatform(): boolean {\n const { platform } = window.navigator;\n return platform.startsWith('Mac');\n }\n\n /**\n * Retrieve the preferred modifier key based on the current platform\n */\n static getModifierKey(): 'metaKey' | 'ctrlKey' {\n if (ContextActionUtils.isMacPlatform()) {\n return 'metaKey';\n }\n\n return 'ctrlKey';\n }\n\n /**\n * Returns true if the modifier key for the current platform is down for the event (Ctrl for windows/linux, Command (meta) for mac)\n * @param event The event to get the meta key status from\n */\n static isModifierKeyDown(\n event: KeyboardEvent | MouseEvent | React.KeyboardEvent | React.MouseEvent\n ): boolean {\n const modifierKey = ContextActionUtils.getModifierKey();\n return event[modifierKey];\n }\n\n /**\n * Returns the menu items for the provided context actions, or empty array if none found.\n * @param actionsParam The actions to get menu items for\n * @param includePromises Whether or not to include promises in the returned menu items\n */\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises?: true\n ): MenuItem[];\n\n // If ignoring promises, then the return type is narrowed\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises: false\n ): ContextAction[];\n\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises = true\n ): MenuItem[] {\n let menuItems: MenuItem[] = [];\n let actions = actionsParam;\n if (!Array.isArray(actions)) {\n actions = [actions];\n }\n\n for (let i = 0; i < actions.length; i += 1) {\n const action = actions[i];\n let newMenuItems:\n | ContextAction\n | ContextAction[]\n | Promise<ContextAction[]>;\n if (typeof action === 'function') {\n newMenuItems = action();\n } else {\n newMenuItems = action;\n }\n\n if (newMenuItems != null) {\n if (newMenuItems instanceof Promise) {\n if (includePromises) {\n menuItems.push(newMenuItems);\n }\n } else if (Array.isArray(newMenuItems)) {\n menuItems = menuItems.concat(newMenuItems);\n } else {\n menuItems.push(newMenuItems);\n }\n }\n }\n\n menuItems = menuItems.filter(\n action =>\n (action as ContextAction).title !== undefined ||\n (action as Promise<ContextAction[]>).then != null ||\n (action as ContextAction).menuElement\n );\n\n return menuItems;\n }\n\n /**\n * Returns the index of the next menu item in a list that doesn't have a disabled=true prop\n * @param startIndex the starting position for the iteration\n * @param delta the direction of travel, -1 or 1\n * @param menuItems an array of menuItems\n */\n static getNextMenuItem(\n startIndex: number,\n delta: -1 | 1,\n menuItems: MenuItem[]\n ): number {\n let firstIndex = startIndex;\n if (firstIndex < 0 && delta < 0) {\n // if menu index is -1 and delta -1 manually set start point\n firstIndex = menuItems.length;\n }\n // find the next non disabled menu option, iterating the list only once\n for (let i = 1; i < menuItems.length + 1; i += 1) {\n const menuIndex =\n (firstIndex + delta * i + menuItems.length) % menuItems.length;\n const item = menuItems[menuIndex];\n if (!(item instanceof Promise) && item.disabled !== true) {\n return menuIndex;\n }\n }\n return startIndex;\n }\n}\n\nexport default ContextActionUtils;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ContextActionUtils.js","names":["isPromise","value","then","undefined","ContextActionUtils","disableAllActions","actionsDisabled","enableAllActions","isContextActionEvent","e","Array","isArray","contextActions","compareActions","a","b","group","_a$group","_b$group","order","_a$order","_b$order","title","_a$title","_b$title","sortActions","actions","sortedActions","slice","sort","isMacPlatform","platform","window","navigator","startsWith","getModifierKey","isModifierKeyDown","event","modifierKey","getMenuItems","actionsParam","includePromises","arguments","length","menuItems","i","action","newMenuItems","Promise","push","concat","filter","menuElement","getNextMenuItem","startIndex","delta","firstIndex","menuIndex","item","disabled","_defineProperty"],"sources":["../../src/context-actions/ContextActionUtils.ts"],"sourcesContent":["import { type IconDefinition } from '@deephaven/icons';\nimport type React from 'react';\nimport type { Shortcut } from '../shortcuts';\n\nexport type ResolvableContextAction =\n | ContextAction\n | Promise<ContextAction[]>\n | (() => Promise<ContextAction[]> | ContextAction[] | ContextAction);\n\nexport type MenuItem = ContextAction | Promise<ContextAction[]>;\n\nexport interface ContextAction {\n title?: string | JSX.Element;\n description?: string;\n action?: (event: Event) => void;\n actions?: ResolvableContextAction[];\n icon?: IconDefinition | React.ReactElement<unknown>;\n iconColor?: string;\n shortcut?: Shortcut;\n\n /* Display text for the shortcut if the shortcut is not wired up through the Shortcut class */\n shortcutText?: string;\n isGlobal?: boolean;\n group?: number;\n order?: number;\n disabled?: boolean;\n menuElement?: React.ReactElement;\n iconOutline?: boolean;\n}\n\nexport interface ContextActionEvent extends MouseEvent {\n contextActions: ResolvableContextAction[];\n}\n\nexport function isPromise<A, T>(value: A | Promise<T>): value is Promise<T> {\n return (value as Promise<T>).then !== undefined;\n}\n\nclass ContextActionUtils {\n static actionsDisabled = false;\n\n static disableAllActions(): void {\n ContextActionUtils.actionsDisabled = true;\n }\n\n static enableAllActions(): void {\n ContextActionUtils.actionsDisabled = false;\n }\n\n static isContextActionEvent(e: MouseEvent): e is ContextActionEvent {\n return Array.isArray((e as ContextActionEvent).contextActions);\n }\n\n /**\n * Compare two action items. Useful in Array.sort\n * @param a First context action to compare\n * @param b Second context action to compare\n */\n static compareActions(a: ContextAction, b: ContextAction): number {\n if (a.group !== b.group) {\n return (a.group ?? 0) > (b.group ?? 0) ? 1 : -1;\n }\n\n if (a.order !== b.order) {\n return (a.order ?? 0) > (b.order ?? 0) ? 1 : -1;\n }\n\n if (a.title !== b.title) {\n return (a.title ?? '') > (b.title ?? '') ? 1 : -1;\n }\n\n if (a !== b) {\n return a > b ? 1 : -1;\n }\n\n return 0;\n }\n\n /**\n *\n * @param actions The array of actions to sort\n */\n static sortActions(actions: ContextAction[]): ContextAction[] {\n if (actions == null || !Array.isArray(actions)) {\n return [];\n }\n\n const sortedActions = actions.slice();\n sortedActions.sort(ContextActionUtils.compareActions);\n return sortedActions;\n }\n\n static isMacPlatform(): boolean {\n const { platform } = window.navigator;\n return platform.startsWith('Mac');\n }\n\n /**\n * Retrieve the preferred modifier key based on the current platform\n */\n static getModifierKey(): 'metaKey' | 'ctrlKey' {\n if (ContextActionUtils.isMacPlatform()) {\n return 'metaKey';\n }\n\n return 'ctrlKey';\n }\n\n /**\n * Returns true if the modifier key for the current platform is down for the event (Ctrl for windows/linux, Command (meta) for mac)\n * @param event The event to get the meta key status from\n */\n static isModifierKeyDown(\n event: KeyboardEvent | MouseEvent | React.KeyboardEvent | React.MouseEvent\n ): boolean {\n const modifierKey = ContextActionUtils.getModifierKey();\n return event[modifierKey];\n }\n\n /**\n * Returns the menu items for the provided context actions, or empty array if none found.\n * @param actionsParam The actions to get menu items for\n * @param includePromises Whether or not to include promises in the returned menu items\n */\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises?: true\n ): MenuItem[];\n\n // If ignoring promises, then the return type is narrowed\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises: false\n ): ContextAction[];\n\n static getMenuItems(\n actionsParam: ResolvableContextAction | ResolvableContextAction[],\n includePromises = true\n ): MenuItem[] {\n let menuItems: MenuItem[] = [];\n let actions = actionsParam;\n if (!Array.isArray(actions)) {\n actions = [actions];\n }\n\n for (let i = 0; i < actions.length; i += 1) {\n const action = actions[i];\n let newMenuItems:\n | ContextAction\n | ContextAction[]\n | Promise<ContextAction[]>;\n if (typeof action === 'function') {\n newMenuItems = action();\n } else {\n newMenuItems = action;\n }\n\n if (newMenuItems != null) {\n if (newMenuItems instanceof Promise) {\n if (includePromises) {\n menuItems.push(newMenuItems);\n }\n } else if (Array.isArray(newMenuItems)) {\n menuItems = menuItems.concat(newMenuItems);\n } else {\n menuItems.push(newMenuItems);\n }\n }\n }\n\n menuItems = menuItems.filter(\n action =>\n (action as ContextAction).title !== undefined ||\n (action as Promise<ContextAction[]>).then != null ||\n (action as ContextAction).menuElement\n );\n\n return menuItems;\n }\n\n /**\n * Returns the index of the next menu item in a list that doesn't have a disabled=true prop\n * @param startIndex the starting position for the iteration\n * @param delta the direction of travel, -1 or 1\n * @param menuItems an array of menuItems\n */\n static getNextMenuItem(\n startIndex: number,\n delta: -1 | 1,\n menuItems: MenuItem[]\n ): number {\n let firstIndex = startIndex;\n if (firstIndex < 0 && delta < 0) {\n // if menu index is -1 and delta -1 manually set start point\n firstIndex = menuItems.length;\n }\n // find the next non disabled menu option, iterating the list only once\n for (let i = 1; i < menuItems.length + 1; i += 1) {\n const menuIndex =\n (firstIndex + delta * i + menuItems.length) % menuItems.length;\n const item = menuItems[menuIndex];\n if (!(item instanceof Promise) && item.disabled !== true) {\n return menuIndex;\n }\n }\n return startIndex;\n }\n}\n\nexport default ContextActionUtils;\n"],"mappings":";;;AAkCA,OAAO,SAASA,SAASA,CAAOC,KAAqB,EAAuB;EAC1E,OAAQA,KAAK,CAAgBC,IAAI,KAAKC,SAAS;AACjD;AAEA,MAAMC,kBAAkB,CAAC;EAGvB,OAAOC,iBAAiBA,CAAA,EAAS;IAC/BD,kBAAkB,CAACE,eAAe,GAAG,IAAI;EAC3C;EAEA,OAAOC,gBAAgBA,CAAA,EAAS;IAC9BH,kBAAkB,CAACE,eAAe,GAAG,KAAK;EAC5C;EAEA,OAAOE,oBAAoBA,CAACC,CAAa,EAA2B;IAClE,OAAOC,KAAK,CAACC,OAAO,CAAEF,CAAC,CAAwBG,cAAc,CAAC;EAChE;;EAEA;AACF;AACA;AACA;AACA;EACE,OAAOC,cAAcA,CAACC,CAAgB,EAAEC,CAAgB,EAAU;IAChE,IAAID,CAAC,CAACE,KAAK,KAAKD,CAAC,CAACC,KAAK,EAAE;MAAA,IAAAC,QAAA,EAAAC,QAAA;MACvB,OAAO,EAAAD,QAAA,GAACH,CAAC,CAACE,KAAK,cAAAC,QAAA,cAAAA,QAAA,GAAI,CAAC,MAAAC,QAAA,GAAKH,CAAC,CAACC,KAAK,cAAAE,QAAA,cAAAA,QAAA,GAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjD;IAEA,IAAIJ,CAAC,CAACK,KAAK,KAAKJ,CAAC,CAACI,KAAK,EAAE;MAAA,IAAAC,QAAA,EAAAC,QAAA;MACvB,OAAO,EAAAD,QAAA,GAACN,CAAC,CAACK,KAAK,cAAAC,QAAA,cAAAA,QAAA,GAAI,CAAC,MAAAC,QAAA,GAAKN,CAAC,CAACI,KAAK,cAAAE,QAAA,cAAAA,QAAA,GAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjD;IAEA,IAAIP,CAAC,CAACQ,KAAK,KAAKP,CAAC,CAACO,KAAK,EAAE;MAAA,IAAAC,QAAA,EAAAC,QAAA;MACvB,OAAO,EAAAD,QAAA,GAACT,CAAC,CAACQ,KAAK,cAAAC,QAAA,cAAAA,QAAA,GAAI,EAAE,MAAAC,QAAA,GAAKT,CAAC,CAACO,KAAK,cAAAE,QAAA,cAAAA,QAAA,GAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnD;IAEA,IAAIV,CAAC,KAAKC,CAAC,EAAE;MACX,OAAOD,CAAC,GAAGC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB;IAEA,OAAO,CAAC;EACV;;EAEA;AACF;AACA;AACA;EACE,OAAOU,WAAWA,CAACC,OAAwB,EAAmB;IAC5D,IAAIA,OAAO,IAAI,IAAI,IAAI,CAAChB,KAAK,CAACC,OAAO,CAACe,OAAO,CAAC,EAAE;MAC9C,OAAO,EAAE;IACX;IAEA,IAAMC,aAAa,GAAGD,OAAO,CAACE,KAAK,CAAC,CAAC;IACrCD,aAAa,CAACE,IAAI,CAACzB,kBAAkB,CAACS,cAAc,CAAC;IACrD,OAAOc,aAAa;EACtB;EAEA,OAAOG,aAAaA,CAAA,EAAY;IAC9B,IAAM;MAAEC;IAAS,CAAC,GAAGC,MAAM,CAACC,SAAS;IACrC,OAAOF,QAAQ,CAACG,UAAU,CAAC,KAAK,CAAC;EACnC;;EAEA;AACF;AACA;EACE,OAAOC,cAAcA,CAAA,EAA0B;IAC7C,IAAI/B,kBAAkB,CAAC0B,aAAa,CAAC,CAAC,EAAE;MACtC,OAAO,SAAS;IAClB;IAEA,OAAO,SAAS;EAClB;;EAEA;AACF;AACA;AACA;EACE,OAAOM,iBAAiBA,CACtBC,KAA0E,EACjE;IACT,IAAMC,WAAW,GAAGlC,kBAAkB,CAAC+B,cAAc,CAAC,CAAC;IACvD,OAAOE,KAAK,CAACC,WAAW,CAAC;EAC3B;;EAEA;AACF;AACA;AACA;AACA;;EAME;;EAMA,OAAOC,YAAYA,CACjBC,YAAiE,EAErD;IAAA,IADZC,eAAe,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAvC,SAAA,GAAAuC,SAAA,MAAG,IAAI;IAEtB,IAAIE,SAAqB,GAAG,EAAE;IAC9B,IAAIlB,OAAO,GAAGc,YAAY;IAC1B,IAAI,CAAC9B,KAAK,CAACC,OAAO,CAACe,OAAO,CAAC,EAAE;MAC3BA,OAAO,GAAG,CAACA,OAAO,CAAC;IACrB;IAEA,KAAK,IAAImB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGnB,OAAO,CAACiB,MAAM,EAAEE,CAAC,IAAI,CAAC,EAAE;MAC1C,IAAMC,MAAM,GAAGpB,OAAO,CAACmB,CAAC,CAAC;MACzB,IAAIE,YAGwB;MAC5B,IAAI,OAAOD,MAAM,KAAK,UAAU,EAAE;QAChCC,YAAY,GAAGD,MAAM,CAAC,CAAC;MACzB,CAAC,MAAM;QACLC,YAAY,GAAGD,MAAM;MACvB;MAEA,IAAIC,YAAY,IAAI,IAAI,EAAE;QACxB,IAAIA,YAAY,YAAYC,OAAO,EAAE;UACnC,IAAIP,eAAe,EAAE;YACnBG,SAAS,CAACK,IAAI,CAACF,YAAY,CAAC;UAC9B;QACF,CAAC,MAAM,IAAIrC,KAAK,CAACC,OAAO,CAACoC,YAAY,CAAC,EAAE;UACtCH,SAAS,GAAGA,SAAS,CAACM,MAAM,CAACH,YAAY,CAAC;QAC5C,CAAC,MAAM;UACLH,SAAS,CAACK,IAAI,CAACF,YAAY,CAAC;QAC9B;MACF;IACF;IAEAH,SAAS,GAAGA,SAAS,CAACO,MAAM,CAC1BL,MAAM,IACHA,MAAM,CAAmBxB,KAAK,KAAKnB,SAAS,IAC5C2C,MAAM,CAA8B5C,IAAI,IAAI,IAAI,IAChD4C,MAAM,CAAmBM,WAC9B,CAAC;IAED,OAAOR,SAAS;EAClB;;EAEA;AACF;AACA;AACA;AACA;AACA;EACE,OAAOS,eAAeA,CACpBC,UAAkB,EAClBC,KAAa,EACbX,SAAqB,EACb;IACR,IAAIY,UAAU,GAAGF,UAAU;IAC3B,IAAIE,UAAU,GAAG,CAAC,IAAID,KAAK,GAAG,CAAC,EAAE;MAC/B;MACAC,UAAU,GAAGZ,SAAS,CAACD,MAAM;IAC/B;IACA;IACA,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,SAAS,CAACD,MAAM,GAAG,CAAC,EAAEE,CAAC,IAAI,CAAC,EAAE;MAChD,IAAMY,SAAS,GACb,CAACD,UAAU,GAAGD,KAAK,GAAGV,CAAC,GAAGD,SAAS,CAACD,MAAM,IAAIC,SAAS,CAACD,MAAM;MAChE,IAAMe,IAAI,GAAGd,SAAS,CAACa,SAAS,CAAC;MACjC,IAAI,EAAEC,IAAI,YAAYV,OAAO,CAAC,IAAIU,IAAI,CAACC,QAAQ,KAAK,IAAI,EAAE;QACxD,OAAOF,SAAS;MAClB;IACF;IACA,OAAOH,UAAU;EACnB;AACF;AAACM,eAAA,CAzKKxD,kBAAkB,qBACG,KAAK;AA0KhC,eAAeA,kBAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"ContextActions.js","names":["React","Component","Log","ContextActionUtils","isPromise","GlobalContextActions","jsx","_jsx","log","module","ContextActions","triggerMenu","element","clientX","clientY","actions","length","mouseEvent","MouseEvent","bubbles","cancelable","contextActions","dispatchEvent","constructor","props","_defineProperty","handleContextMenu","bind","handleKeyDown","container","createRef","state","globalActions","keyboardActions","getDerivedStateFromProps","Array","isArray","filter","action","isGlobal","undefined","shortcut","componentDidMount","_this$container$curre","current","parentElement","addEventListener","componentWillUnmount","_this$container$curre2","removeEventListener","e","ignoreClassNames","el","target","_loop","classList","ignoredClassName","find","className","contains","debug2","concat","v","_ret","isContextActionEvent","debug","i","keyboardAction","actionsDisabled","matchesEvent","_keyboardAction$actio","call","stopPropagation","preventDefault","render","dataTestId","ref","children","default","high","medium","low","global","edit"],"sources":["../../src/context-actions/ContextActions.tsx"],"sourcesContent":["/**\n * Just a simple utility class for displaying a popup menu.\n */\nimport React, { Component } from 'react';\nimport Log from '@deephaven/log';\nimport ContextActionUtils, {\n type ResolvableContextAction,\n isPromise,\n} from './ContextActionUtils';\nimport type { ContextAction, ContextActionEvent } from './ContextActionUtils';\nimport GlobalContextActions from './GlobalContextActions';\nimport './ContextActions.scss';\n\nconst log = Log.module('ContextActions');\n\ninterface ContextActionsProps {\n actions?: ResolvableContextAction | ResolvableContextAction[];\n ignoreClassNames?: string[];\n 'data-testid'?: string;\n}\n\ninterface ContextActionsState {\n globalActions: ContextAction[];\n keyboardActions: ContextAction[];\n}\n\n/**\n * ContextActions that you add onto any component.\n *\n * Usage:\n * let actions = [{\n * title: 'My Action', // Omit the title to hide it from the context menu\n * action: () => { alert('My Action Clicked!') }\n * actions: [] // Submenu of actions\n * icon: faPrint, // Limited to FontAwesome icons for now.\n * iconColor: '#ff0000, // Color to use for the icon\n * shortcut: Shortcut, // Defaults to null\n * isGlobal: false, // Global context action. Defaults to false.\n * group: ContextActions.groups.default, // What group to group the context action with\n * order: null, // Int where to order within group\n * disabled: true // disable action\n * menuElement: null // Custom menu element for displaying in context menu. When null, creates a default menu item based on title\n * }];\n *\n * <div>\n * Right click in this container\n * <ContextActions actions={actions}/>\n * </div>\n *\n * Right clicking the container will then build the context menu, bubbling up until an element with a ContextMenuRoot is on it.\n * You should generally have a ContextMenuRoot on the root node of your document.\n */\nclass ContextActions extends Component<\n ContextActionsProps,\n ContextActionsState\n> {\n /**\n * Group you can assign to context menu actions to group them together.\n * Lower group IDs appear at the top of the list.\n * Groups are separated by a separator item.\n * Items within groups are ordered by their order property, then by their title.\n */\n static groups = {\n default: undefined,\n high: 100,\n medium: 5000,\n low: 10000,\n global: 100000,\n\n edit: 100,\n };\n\n static triggerMenu(\n element: Element,\n clientX: number,\n clientY: number,\n actions: ResolvableContextAction[]\n ): void {\n if (actions.length === 0) {\n return;\n }\n\n const mouseEvent: Partial<ContextActionEvent> = new MouseEvent(\n 'contextmenu',\n {\n clientX,\n clientY,\n bubbles: true,\n cancelable: true,\n }\n );\n mouseEvent.contextActions = actions;\n\n element.dispatchEvent(mouseEvent as ContextActionEvent);\n }\n\n constructor(props: ContextActionsProps) {\n super(props);\n\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n\n this.container = React.createRef();\n\n this.state = { globalActions: [], keyboardActions: [] };\n }\n\n static getDerivedStateFromProps(\n props: ContextActionsProps\n ): ContextActionsState {\n if (props.actions == null || !Array.isArray(props.actions)) {\n return { globalActions: [], keyboardActions: [] };\n }\n const globalActions = props.actions.filter(\n action =>\n !isPromise(action) && typeof action !== 'function' && action.isGlobal\n ) as ContextAction[];\n const keyboardActions = props.actions.filter(\n action =>\n !isPromise(action) &&\n typeof action !== 'function' &&\n (action.isGlobal === undefined || !action.isGlobal) &&\n action.shortcut != null\n ) as ContextAction[];\n\n return { globalActions, keyboardActions };\n }\n\n componentDidMount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.addEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n this.container.current.parentElement.addEventListener(\n 'keydown',\n this.handleKeyDown\n );\n }\n }\n\n componentWillUnmount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.removeEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n this.container.current.parentElement.removeEventListener(\n 'keydown',\n this.handleKeyDown\n );\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n handleContextMenu(e: MouseEvent): void {\n const { ignoreClassNames = [] } = this.props;\n if (ignoreClassNames.length > 0) {\n let el = e.target as Element | null;\n while (el != null) {\n const { classList } = el;\n const ignoredClassName = ignoreClassNames.find(className =>\n classList.contains(className)\n );\n if (ignoredClassName !== undefined) {\n log.debug2(\n `Contextmenu event ignored based on the target className \"${ignoredClassName}\"`\n );\n return;\n }\n el = el.parentElement;\n }\n }\n if (!ContextActionUtils.isContextActionEvent(e)) {\n (e as ContextActionEvent).contextActions = [];\n }\n\n if (!ContextActionUtils.isContextActionEvent(e)) {\n return;\n }\n\n const { actions } = this.props;\n if (actions != null) {\n let contextActions = actions;\n if (Array.isArray(contextActions)) {\n contextActions = contextActions.filter(\n action =>\n isPromise(action) ||\n typeof action === 'function' ||\n action.isGlobal === undefined ||\n !action.isGlobal\n );\n }\n\n e.contextActions = e.contextActions.concat(contextActions);\n }\n\n log.debug(\n 'Received context menu event! Menu items are now: ',\n e.contextActions\n );\n }\n\n handleKeyDown(e: KeyboardEvent): void {\n const { keyboardActions } = this.state;\n for (let i = 0; i < keyboardActions.length; i += 1) {\n const keyboardAction = keyboardActions[i];\n if (\n !ContextActionUtils.actionsDisabled &&\n keyboardAction.shortcut != null &&\n keyboardAction.shortcut.matchesEvent(e)\n ) {\n log.debug('Context hotkey matched!', e);\n\n keyboardAction.action?.(e);\n\n e.stopPropagation();\n e.preventDefault();\n\n log.debug2('Matched hotkey returned false, key event not consumed');\n }\n }\n }\n\n render(): JSX.Element {\n const { 'data-testid': dataTestId } = this.props;\n const { globalActions } = this.state;\n return (\n <div\n className=\"context-actions-listener\"\n ref={this.container}\n data-testid={dataTestId}\n >\n <GlobalContextActions actions={globalActions} />\n </div>\n );\n }\n}\n\nexport default ContextActions;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ContextActions.js","names":["React","Component","Log","ContextActionUtils","isPromise","GlobalContextActions","jsx","_jsx","log","module","ContextActions","triggerMenu","element","clientX","clientY","actions","length","mouseEvent","MouseEvent","bubbles","cancelable","contextActions","dispatchEvent","constructor","props","_defineProperty","handleContextMenu","bind","handleKeyDown","container","createRef","state","globalActions","keyboardActions","getDerivedStateFromProps","Array","isArray","filter","action","isGlobal","undefined","shortcut","componentDidMount","_this$container$curre","current","parentElement","addEventListener","componentWillUnmount","_this$container$curre2","removeEventListener","e","ignoreClassNames","el","target","_loop","classList","ignoredClassName","find","className","contains","debug2","concat","v","_ret","isContextActionEvent","debug","i","keyboardAction","actionsDisabled","matchesEvent","_keyboardAction$actio","call","stopPropagation","preventDefault","render","dataTestId","ref","children","default","high","medium","low","global","edit"],"sources":["../../src/context-actions/ContextActions.tsx"],"sourcesContent":["/**\n * Just a simple utility class for displaying a popup menu.\n */\nimport React, { Component } from 'react';\nimport Log from '@deephaven/log';\nimport ContextActionUtils, {\n type ResolvableContextAction,\n isPromise,\n} from './ContextActionUtils';\nimport type { ContextAction, ContextActionEvent } from './ContextActionUtils';\nimport GlobalContextActions from './GlobalContextActions';\nimport './ContextActions.scss';\n\nconst log = Log.module('ContextActions');\n\ninterface ContextActionsProps {\n actions?: ResolvableContextAction | ResolvableContextAction[];\n ignoreClassNames?: string[];\n 'data-testid'?: string;\n}\n\ninterface ContextActionsState {\n globalActions: ContextAction[];\n keyboardActions: ContextAction[];\n}\n\n/**\n * ContextActions that you add onto any component.\n *\n * Usage:\n * let actions = [{\n * title: 'My Action', // Omit the title to hide it from the context menu\n * action: () => { alert('My Action Clicked!') }\n * actions: [] // Submenu of actions\n * icon: faPrint, // Limited to FontAwesome icons for now.\n * iconColor: '#ff0000, // Color to use for the icon\n * shortcut: Shortcut, // Defaults to null\n * isGlobal: false, // Global context action. Defaults to false.\n * group: ContextActions.groups.default, // What group to group the context action with\n * order: null, // Int where to order within group\n * disabled: true // disable action\n * menuElement: null // Custom menu element for displaying in context menu. When null, creates a default menu item based on title\n * }];\n *\n * <div>\n * Right click in this container\n * <ContextActions actions={actions}/>\n * </div>\n *\n * Right clicking the container will then build the context menu, bubbling up until an element with a ContextMenuRoot is on it.\n * You should generally have a ContextMenuRoot on the root node of your document.\n */\nclass ContextActions extends Component<\n ContextActionsProps,\n ContextActionsState\n> {\n /**\n * Group you can assign to context menu actions to group them together.\n * Lower group IDs appear at the top of the list.\n * Groups are separated by a separator item.\n * Items within groups are ordered by their order property, then by their title.\n */\n static groups = {\n default: undefined,\n high: 100,\n medium: 5000,\n low: 10000,\n global: 100000,\n\n edit: 100,\n };\n\n static triggerMenu(\n element: Element,\n clientX: number,\n clientY: number,\n actions: ResolvableContextAction[]\n ): void {\n if (actions.length === 0) {\n return;\n }\n\n const mouseEvent: Partial<ContextActionEvent> = new MouseEvent(\n 'contextmenu',\n {\n clientX,\n clientY,\n bubbles: true,\n cancelable: true,\n }\n );\n mouseEvent.contextActions = actions;\n\n element.dispatchEvent(mouseEvent as ContextActionEvent);\n }\n\n constructor(props: ContextActionsProps) {\n super(props);\n\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n\n this.container = React.createRef();\n\n this.state = { globalActions: [], keyboardActions: [] };\n }\n\n static getDerivedStateFromProps(\n props: ContextActionsProps\n ): ContextActionsState {\n if (props.actions == null || !Array.isArray(props.actions)) {\n return { globalActions: [], keyboardActions: [] };\n }\n const globalActions = props.actions.filter(\n action =>\n !isPromise(action) && typeof action !== 'function' && action.isGlobal\n ) as ContextAction[];\n const keyboardActions = props.actions.filter(\n action =>\n !isPromise(action) &&\n typeof action !== 'function' &&\n (action.isGlobal === undefined || !action.isGlobal) &&\n action.shortcut != null\n ) as ContextAction[];\n\n return { globalActions, keyboardActions };\n }\n\n componentDidMount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.addEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n this.container.current.parentElement.addEventListener(\n 'keydown',\n this.handleKeyDown\n );\n }\n }\n\n componentWillUnmount(): void {\n if (this.container.current?.parentElement) {\n this.container.current.parentElement.removeEventListener(\n 'contextmenu',\n this.handleContextMenu\n );\n this.container.current.parentElement.removeEventListener(\n 'keydown',\n this.handleKeyDown\n );\n }\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n handleContextMenu(e: MouseEvent): void {\n const { ignoreClassNames = [] } = this.props;\n if (ignoreClassNames.length > 0) {\n let el = e.target as Element | null;\n while (el != null) {\n const { classList } = el;\n const ignoredClassName = ignoreClassNames.find(className =>\n classList.contains(className)\n );\n if (ignoredClassName !== undefined) {\n log.debug2(\n `Contextmenu event ignored based on the target className \"${ignoredClassName}\"`\n );\n return;\n }\n el = el.parentElement;\n }\n }\n if (!ContextActionUtils.isContextActionEvent(e)) {\n (e as ContextActionEvent).contextActions = [];\n }\n\n if (!ContextActionUtils.isContextActionEvent(e)) {\n return;\n }\n\n const { actions } = this.props;\n if (actions != null) {\n let contextActions = actions;\n if (Array.isArray(contextActions)) {\n contextActions = contextActions.filter(\n action =>\n isPromise(action) ||\n typeof action === 'function' ||\n action.isGlobal === undefined ||\n !action.isGlobal\n );\n }\n\n e.contextActions = e.contextActions.concat(contextActions);\n }\n\n log.debug(\n 'Received context menu event! Menu items are now: ',\n e.contextActions\n );\n }\n\n handleKeyDown(e: KeyboardEvent): void {\n const { keyboardActions } = this.state;\n for (let i = 0; i < keyboardActions.length; i += 1) {\n const keyboardAction = keyboardActions[i];\n if (\n !ContextActionUtils.actionsDisabled &&\n keyboardAction.shortcut != null &&\n keyboardAction.shortcut.matchesEvent(e)\n ) {\n log.debug('Context hotkey matched!', e);\n\n keyboardAction.action?.(e);\n\n e.stopPropagation();\n e.preventDefault();\n\n log.debug2('Matched hotkey returned false, key event not consumed');\n }\n }\n }\n\n render(): JSX.Element {\n const { 'data-testid': dataTestId } = this.props;\n const { globalActions } = this.state;\n return (\n <div\n className=\"context-actions-listener\"\n ref={this.container}\n data-testid={dataTestId}\n >\n <GlobalContextActions actions={globalActions} />\n </div>\n );\n }\n}\n\nexport default ContextActions;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ContextMenu.js","names":["React","PureComponent","classNames","Log","PromiseUtils","ContextActionUtils","ContextMenuItem","LoadingSpinner","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","log","module","ContextMenu","handleContextMenu","e","metaKey","stopPropagation","preventDefault","constructor","props","_defineProperty","handleBlur","bind","handleCloseSubMenu","handleKeyDown","handleMenuItemClick","handleMenuItemContextMenu","handleMenuItemMouseMove","handleMouseLeave","handleWindowResize","container","createRef","oldFocus","document","activeElement","activeSubMenuRef","subMenuTimer","rAF","initialPosition","top","left","state","menuItems","pendingItems","activeSubMenu","hasOverflow","subMenuTop","subMenuLeft","subMenuParentWidth","subMenuParentHeight","keyboardIndex","mouseIndex","componentDidMount","initMenu","verifyPosition","window","addEventListener","requestAnimationFrame","_this$container$curre","current","focus","onMenuOpened","componentDidUpdate","prevProps","prevState","actions","_this$container$curre2","setActiveSubMenuPosition","contains","_this$container$curre3","componentWillUnmount","cancelPromises","removeEventListener","cancelAnimationFrame","getKeyboardIndex","options","separateKeyboardMouse","undefined","getMouseIndex","setKeyboardIndex","index","setState","setMouseIndex","initialKeyboardIndex","getMenuItems","nonPromiseItems","i","length","menuItem","Promise","initMenuPromise","push","sortActions","promise","cancellablePromise","makeCancelable","concat","then","resolvedMenuItems","indexOf","slice","splice","error","isCanceled","map","item","cancel","parentRect","getBoundingClientRect","right","height","width","_this$container$curre4","_this$container$curre5","_this$container$curre6","_this$container$curre7","updatePosition","oldTop","oldLeft","doNotVerifyPosition","scrollHeight","innerHeight","innerWidth","closeMenu","warn","relatedTarget","element","isContextMenuChild","hasAttribute","parentElement","isEscapeKey","key","newFocus","openSubMenu","shiftKey","getNextMenuItem","HTMLElement","newSubMenu","closeAll","arguments","onMenuClosed","closeSubMenu","closeAllMenus","disabled","action","nativeEvent","focusIndex","render","menuItemElements","group","menuItemElement","ref","isKeyboardSelected","isMouseSelected","onMenuItemClick","onMenuItemMouseMove","onMenuItemContextMenu","pendingElement","className","children","menuStyle","dataTestId","showSubmenu","style","_objectSpread","onBlur","onKeyDown","onMouseLeave","onContextMenu","role","tabIndex","verifiedTop","verifiedLeft"],"sources":["../../src/context-actions/ContextMenu.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils, type CancelablePromise } from '@deephaven/utils';\nimport ContextActionUtils, {\n type ContextAction,\n type ResolvableContextAction,\n} from './ContextActionUtils';\nimport ContextMenuItem from './ContextMenuItem';\nimport LoadingSpinner from '../LoadingSpinner';\n\nconst log = Log.module('ContextMenu');\n\ninterface ContextMenuProps {\n top: number;\n left: number;\n updatePosition: (top: number, left: number) => void;\n // only submenus will have these, defaults to 0 otherwise\n // represents the width height of the parent menu item\n subMenuParentWidth: number;\n subMenuParentHeight: number;\n actions: ResolvableContextAction[];\n closeMenu: (closeAll: boolean) => void;\n onMenuClosed: (menu: ContextMenu) => void;\n onMenuOpened: (menu: ContextMenu) => void;\n options: {\n doNotVerifyPosition?: boolean;\n separateKeyboardMouse?: boolean;\n initialKeyboardIndex?: number;\n };\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n}\n\ninterface ContextMenuState {\n menuItems: ContextAction[];\n pendingItems: CancelablePromise<ContextAction[]>[];\n activeSubMenu: number | null;\n hasOverflow: boolean;\n subMenuTop: number | null;\n subMenuLeft: number | null;\n subMenuParentWidth: number;\n subMenuParentHeight: number;\n keyboardIndex: number;\n mouseIndex: number;\n}\n\n/** Do not use this class directly. Use ContextMenuRoot and ContextActions instead. */\nclass ContextMenu extends PureComponent<ContextMenuProps, ContextMenuState> {\n static defaultProps = {\n subMenuParentWidth: 0,\n subMenuParentHeight: 0,\n closeMenu(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n onMenuClosed(): void {\n // no-op\n },\n options: {},\n menuStyle: {},\n 'data-testid': undefined,\n };\n\n static handleContextMenu(e: React.MouseEvent): void {\n if (e.metaKey) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n }\n\n constructor(props: ContextMenuProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleCloseSubMenu = this.handleCloseSubMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleMenuItemContextMenu = this.handleMenuItemContextMenu.bind(this);\n this.handleMenuItemMouseMove = this.handleMenuItemMouseMove.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleWindowResize = this.handleWindowResize.bind(this);\n\n this.container = React.createRef();\n this.oldFocus = document.activeElement;\n this.activeSubMenuRef = React.createRef();\n this.subMenuTimer = 0;\n this.rAF = 0;\n\n this.initialPosition = { top: props.top, left: props.left };\n\n this.state = {\n menuItems: [],\n pendingItems: [],\n activeSubMenu: null,\n hasOverflow: false,\n subMenuTop: null,\n subMenuLeft: null,\n subMenuParentWidth: 0,\n subMenuParentHeight: 0,\n keyboardIndex: -1,\n mouseIndex: -1,\n };\n }\n\n componentDidMount(): void {\n this.initMenu();\n\n this.verifyPosition();\n\n window.addEventListener('resize', this.handleWindowResize);\n\n // rAF is needed to wait for a submenus popper to be created before\n // attempting to set focus, however on a quick mount/unmount when\n // mousing past an item, the submenu could be unmounted before the\n // async rAF finishes, so it is cancelled in willUnmount()\n this.rAF = window.requestAnimationFrame(() => {\n this.container.current?.focus();\n\n const { onMenuOpened } = this.props;\n onMenuOpened(this);\n });\n }\n\n componentDidUpdate(\n prevProps: ContextMenuProps,\n prevState: ContextMenuState\n ): void {\n const { actions } = this.props;\n const { activeSubMenu } = this.state;\n\n if (activeSubMenu !== prevState.activeSubMenu) {\n if (activeSubMenu == null) {\n // close sub menu, refocus parent menu\n this.container.current?.focus();\n } else {\n // open sub menu, set its initial position\n this.setActiveSubMenuPosition();\n }\n }\n\n if (prevProps.actions !== actions) {\n this.initMenu();\n\n if (\n this.container.current == null ||\n !this.container.current.contains(document.activeElement)\n ) {\n this.container.current?.focus();\n }\n }\n\n this.verifyPosition();\n }\n\n componentWillUnmount(): void {\n this.cancelPromises();\n window.removeEventListener('resize', this.handleWindowResize);\n cancelAnimationFrame(this.rAF);\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n oldFocus: Element | null;\n\n activeSubMenuRef: React.RefObject<HTMLDivElement>;\n\n subMenuTimer: number;\n\n rAF: number;\n\n initialPosition: { top: number; left: number };\n\n getKeyboardIndex(): number {\n const { options } = this.props;\n if (\n options.separateKeyboardMouse !== undefined &&\n options.separateKeyboardMouse\n ) {\n const { keyboardIndex } = this.state;\n return keyboardIndex;\n }\n\n return this.getMouseIndex();\n }\n\n setKeyboardIndex(index: number): void {\n const { options } = this.props;\n if (\n options.separateKeyboardMouse !== undefined &&\n options.separateKeyboardMouse\n ) {\n this.setState({ keyboardIndex: index });\n } else {\n this.setMouseIndex(index);\n }\n }\n\n getMouseIndex(): number {\n const { mouseIndex } = this.state;\n return mouseIndex;\n }\n\n setMouseIndex(index: number): void {\n this.setState({ mouseIndex: index });\n }\n\n initMenu(): void {\n // cancel any pending close and promises\n this.cancelPromises();\n cancelAnimationFrame(this.rAF);\n\n const { options } = this.props;\n let keyboardIndex = options.initialKeyboardIndex;\n if (keyboardIndex === undefined) {\n keyboardIndex = -1;\n }\n\n const { actions } = this.props;\n const menuItems = ContextActionUtils.getMenuItems(actions);\n const nonPromiseItems: ContextAction[] = [];\n for (let i = menuItems.length - 1; i >= 0; i -= 1) {\n const menuItem = menuItems[i];\n if (menuItem instanceof Promise) {\n this.initMenuPromise(menuItem as Promise<ContextAction[]>);\n } else {\n nonPromiseItems.push(menuItem as ContextAction);\n }\n }\n\n this.setState({\n mouseIndex: -1,\n keyboardIndex,\n activeSubMenu: null,\n menuItems: ContextActionUtils.sortActions(nonPromiseItems),\n });\n }\n\n initMenuPromise(promise: Promise<ContextAction[]>): void {\n // make all promises cancellable\n const cancellablePromise = PromiseUtils.makeCancelable(promise);\n\n this.setState(state => ({\n pendingItems: state.pendingItems.concat(cancellablePromise),\n }));\n\n cancellablePromise.then(\n resolvedMenuItems => {\n this.setState(state => {\n const index = state.pendingItems.indexOf(cancellablePromise);\n if (index >= 0) {\n const pendingItems = state.pendingItems.slice();\n pendingItems.splice(index, 1);\n\n return {\n menuItems: ContextActionUtils.sortActions(\n state.menuItems.concat(resolvedMenuItems)\n ),\n pendingItems,\n };\n }\n // This item is stale, don't update the menu\n return null;\n });\n },\n error => {\n if (PromiseUtils.isCanceled(error)) {\n return; // Canceled promise is ignored\n }\n\n // remove failed item from pending list\n this.setState(state => {\n const index = state.pendingItems.indexOf(cancellablePromise);\n if (index >= 0) {\n const pendingItems = state.pendingItems.slice();\n pendingItems.splice(index, 1);\n return {\n pendingItems,\n };\n }\n return null;\n });\n\n // Log the error\n log.error(error);\n }\n );\n }\n\n cancelPromises(): void {\n const { pendingItems } = this.state;\n pendingItems.map(item => item.cancel());\n }\n\n /**\n * Sets the unverfied start position of a submenu. Submenu then self-verfies\n * its own position and potentially reports back a new position.\n */\n setActiveSubMenuPosition(): void {\n if (this.activeSubMenuRef.current === null) return;\n const parentRect = this.activeSubMenuRef.current.getBoundingClientRect();\n\n // intentionally rect.right, we want the sub menu to start at the right edge of the current menu\n this.setState({\n subMenuTop: parentRect.top,\n subMenuLeft: parentRect.right,\n subMenuParentHeight: parentRect.height,\n subMenuParentWidth: parentRect.width,\n });\n }\n\n /**\n * Verifies the position of this menu in relation to the parent to make sure it's on screen.\n * Will update the top left state (updatePosition) if necessary (causing a re-render)\n * By default it tries to top-align with parent, at the right side of the parent.\n * Because we aren't a native context menu and can't escape window bounds, we also do\n * somethings to better fit on screen, such as the \"nudge\" offset position, and further\n * allow overflow scrolling for large menus in a small window.\n */\n verifyPosition(): void {\n const {\n options,\n updatePosition,\n subMenuParentWidth,\n subMenuParentHeight,\n top: oldTop,\n left: oldLeft,\n } = this.props;\n\n if (\n !this.container.current ||\n (options.doNotVerifyPosition != null && options.doNotVerifyPosition)\n ) {\n return;\n }\n\n // initial position is used rather than current position,\n // as the number of menu items can change (actions can bubble)\n // and menu should always be positioned relative to spawn point\n let { top, left } = this.initialPosition;\n const { width, height } =\n this.container.current?.getBoundingClientRect() ?? {\n width: 0,\n height: 0,\n };\n const hasOverflow =\n (this.container.current?.scrollHeight ?? 0) > window.innerHeight;\n\n if (height === 0 || width === 0) {\n // We don't have a height or width yet, don't bother doing anything\n return;\n }\n\n // does it fit below?\n if (top + height > window.innerHeight) {\n // can it be flipped to above? include offset if submenu (defaults to 0 if not submenu)\n if (top - height - subMenuParentHeight > 0) {\n // flip like a native menu would\n top -= height - subMenuParentHeight;\n } else {\n // still doesnt fit? okay, position at bottom edge\n top = window.innerHeight - height;\n }\n }\n\n if (left + width > window.innerWidth) {\n // less picky about left right positioning, just keep it going off to right\n left = left - width - subMenuParentWidth;\n }\n\n if (oldLeft !== left || oldTop !== top) {\n // parent owns positioning as single source of truth, ask to update props\n this.setState({ hasOverflow });\n updatePosition(top, left);\n }\n }\n\n // since window resize doesn't trigger blur, listen and close the menu\n handleWindowResize(): void {\n if (!this.container.current) {\n return;\n }\n this.closeMenu(true);\n }\n\n handleBlur(e: React.FocusEvent<HTMLDivElement>): void {\n if (!this.container.current) {\n log.warn('Container is null!');\n return;\n }\n\n if (!this.container.current.contains(e.relatedTarget as Node)) {\n let element: HTMLElement | null = e.relatedTarget as HTMLElement;\n let isContextMenuChild = false;\n while (element && !isContextMenuChild) {\n isContextMenuChild = element.hasAttribute('data-dh-context-menu');\n element = element.parentElement;\n }\n\n if (!isContextMenuChild) {\n // close all submenus on blur\n this.closeMenu(true);\n }\n }\n }\n\n /** Returns whether the specified key should remove the menu. Depends on the side the parent is on. */\n isEscapeKey(key: string): boolean {\n const { left } = this.props;\n return (\n key === 'Escape' ||\n (left < 0 && key === 'ArrowRight') ||\n key === 'ArrowLeft'\n );\n }\n\n handleKeyDown(e: React.KeyboardEvent<HTMLDivElement>): void {\n const { menuItems } = this.state;\n const oldFocus = this.getKeyboardIndex();\n let newFocus: number | null = oldFocus;\n let openSubMenu = false;\n\n if (e.key === 'Enter' || e.key === ' ') {\n if (oldFocus >= 0 && oldFocus < menuItems.length) {\n this.handleMenuItemClick(\n menuItems[oldFocus],\n e as React.SyntheticEvent as React.MouseEvent\n );\n }\n return;\n }\n\n if (e.key === 'ArrowRight') {\n if (oldFocus >= 0 && oldFocus <= menuItems.length) {\n openSubMenu = true;\n } else {\n newFocus = 0;\n }\n } else if (this.isEscapeKey(e.key)) {\n newFocus = null;\n } else if (e.key === 'ArrowUp' || (e.shiftKey && e.key === 'Tab')) {\n newFocus = ContextActionUtils.getNextMenuItem(newFocus, -1, menuItems);\n } else if (e.key === 'ArrowDown' || e.key === 'Tab') {\n newFocus = ContextActionUtils.getNextMenuItem(newFocus, 1, menuItems);\n }\n\n if (openSubMenu) {\n this.openSubMenu(oldFocus);\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n if (oldFocus !== newFocus) {\n if (newFocus !== null) {\n this.setKeyboardIndex(newFocus);\n } else {\n this.closeMenu();\n if (this.oldFocus instanceof HTMLElement) {\n this.oldFocus.focus();\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n openSubMenu(index: number): void {\n const { menuItems, activeSubMenu } = this.state;\n const newSubMenu = menuItems[index].actions ? index : null;\n if (activeSubMenu === newSubMenu) return;\n this.setState({\n activeSubMenu: newSubMenu,\n subMenuTop: null,\n subMenuLeft: null,\n });\n }\n\n closeMenu(closeAll = false): void {\n const { closeMenu, onMenuClosed } = this.props;\n cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n closeMenu(closeAll);\n onMenuClosed(this);\n });\n }\n\n closeSubMenu(): void {\n this.setState({\n activeSubMenu: null,\n });\n }\n\n handleCloseSubMenu(closeAllMenus: boolean): void {\n if (closeAllMenus) {\n this.closeMenu(true);\n } else {\n this.closeSubMenu();\n }\n }\n\n handleMenuItemClick(menuItem: ContextAction, e: React.MouseEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n const { menuItems } = this.state;\n if (\n menuItem != null &&\n (menuItem.disabled === undefined || !menuItem.disabled)\n ) {\n if (menuItem.actions != null) {\n this.openSubMenu(menuItems.indexOf(menuItem));\n } else if (menuItem.action != null) {\n menuItem.action(e.nativeEvent);\n this.closeMenu(true);\n }\n }\n }\n\n handleMenuItemContextMenu(\n menuItem: ContextAction,\n e: React.MouseEvent\n ): void {\n if (e.metaKey) {\n return;\n }\n\n this.handleMenuItemClick(menuItem, e);\n }\n\n handleMenuItemMouseMove(menuItem: ContextAction): void {\n const { menuItems } = this.state;\n const focusIndex = menuItems.indexOf(menuItem);\n this.setMouseIndex(focusIndex);\n\n if (\n focusIndex >= 0 &&\n focusIndex < menuItems.length &&\n (menuItem.disabled === undefined || !menuItem.disabled)\n ) {\n this.openSubMenu(focusIndex);\n }\n }\n\n handleMouseLeave(): void {\n this.setMouseIndex(-1);\n }\n\n render(): JSX.Element {\n const menuItemElements = [];\n const { top, left } = this.props;\n const {\n activeSubMenu,\n hasOverflow,\n keyboardIndex,\n menuItems,\n mouseIndex,\n pendingItems,\n subMenuTop,\n subMenuLeft,\n subMenuParentWidth,\n subMenuParentHeight,\n } = this.state;\n for (let i = 0; i < menuItems.length; i += 1) {\n const menuItem = menuItems[i];\n\n if (i > 0 && menuItem.group !== menuItems[i - 1].group) {\n menuItemElements.push(<hr key={`${i}.separator`} />);\n }\n\n const menuItemElement = (\n <ContextMenuItem\n key={i}\n ref={activeSubMenu === i ? this.activeSubMenuRef : null}\n isKeyboardSelected={keyboardIndex === i}\n isMouseSelected={mouseIndex === i}\n menuItem={menuItem}\n closeMenu={this.handleCloseSubMenu}\n onMenuItemClick={this.handleMenuItemClick}\n onMenuItemMouseMove={this.handleMenuItemMouseMove}\n onMenuItemContextMenu={this.handleMenuItemContextMenu}\n />\n );\n\n menuItemElements.push(menuItemElement);\n }\n\n let pendingElement = null;\n if (pendingItems.length > 0) {\n pendingElement = (\n <div className=\"loading\">\n <LoadingSpinner className=\"loading-spinner-vertical-align\" />\n </div>\n );\n }\n\n const { menuStyle, 'data-testid': dataTestId } = this.props;\n\n // don't show submenu until it has an position initialized\n const showSubmenu =\n activeSubMenu !== null && subMenuTop !== null && subMenuLeft !== null;\n\n return (\n <>\n <div\n className={classNames(\n { 'has-overflow': hasOverflow },\n 'context-menu-container'\n )}\n style={{ top, left, ...menuStyle }}\n ref={this.container}\n data-dh-context-menu\n onBlur={this.handleBlur}\n onKeyDown={this.handleKeyDown}\n onMouseLeave={this.handleMouseLeave}\n onContextMenu={ContextMenu.handleContextMenu}\n role=\"menuitem\"\n tabIndex={0}\n data-testid={dataTestId}\n >\n {menuItemElements}\n {pendingElement}\n </div>\n {showSubmenu &&\n activeSubMenu !== null &&\n subMenuTop !== null &&\n subMenuLeft !== null && (\n <ContextMenu\n key={`sub-${activeSubMenu}`}\n actions={menuItems[activeSubMenu].actions || []}\n closeMenu={this.handleCloseSubMenu}\n top={subMenuTop}\n left={subMenuLeft}\n updatePosition={(verifiedTop, verifiedLeft) => {\n this.setState({\n subMenuTop: verifiedTop,\n subMenuLeft: verifiedLeft,\n });\n }}\n subMenuParentWidth={subMenuParentWidth}\n subMenuParentHeight={subMenuParentHeight}\n />\n )}\n </>\n );\n }\n}\n\nexport default ContextMenu;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"ContextMenu.js","names":["React","PureComponent","classNames","Log","PromiseUtils","ContextActionUtils","ContextMenuItem","LoadingSpinner","jsx","_jsx","jsxs","_jsxs","Fragment","_Fragment","log","module","ContextMenu","handleContextMenu","e","metaKey","stopPropagation","preventDefault","constructor","props","_defineProperty","handleBlur","bind","handleCloseSubMenu","handleKeyDown","handleMenuItemClick","handleMenuItemContextMenu","handleMenuItemMouseMove","handleMouseLeave","handleWindowResize","container","createRef","oldFocus","document","activeElement","activeSubMenuRef","subMenuTimer","rAF","initialPosition","top","left","state","menuItems","pendingItems","activeSubMenu","hasOverflow","subMenuTop","subMenuLeft","subMenuParentWidth","subMenuParentHeight","keyboardIndex","mouseIndex","componentDidMount","initMenu","verifyPosition","window","addEventListener","requestAnimationFrame","_this$container$curre","current","focus","onMenuOpened","componentDidUpdate","prevProps","prevState","actions","_this$container$curre2","setActiveSubMenuPosition","contains","_this$container$curre3","componentWillUnmount","cancelPromises","removeEventListener","cancelAnimationFrame","getKeyboardIndex","options","separateKeyboardMouse","undefined","getMouseIndex","setKeyboardIndex","index","setState","setMouseIndex","initialKeyboardIndex","getMenuItems","nonPromiseItems","i","length","menuItem","Promise","initMenuPromise","push","sortActions","promise","cancellablePromise","makeCancelable","concat","then","resolvedMenuItems","indexOf","slice","splice","error","isCanceled","map","item","cancel","parentRect","getBoundingClientRect","right","height","width","_this$container$curre4","_this$container$curre5","_this$container$curre6","_this$container$curre7","updatePosition","oldTop","oldLeft","doNotVerifyPosition","scrollHeight","innerHeight","innerWidth","closeMenu","warn","relatedTarget","element","isContextMenuChild","hasAttribute","parentElement","isEscapeKey","key","newFocus","openSubMenu","shiftKey","getNextMenuItem","HTMLElement","newSubMenu","closeAll","arguments","onMenuClosed","closeSubMenu","closeAllMenus","disabled","action","nativeEvent","focusIndex","render","menuItemElements","group","menuItemElement","ref","isKeyboardSelected","isMouseSelected","onMenuItemClick","onMenuItemMouseMove","onMenuItemContextMenu","pendingElement","className","children","menuStyle","dataTestId","showSubmenu","style","_objectSpread","onBlur","onKeyDown","onMouseLeave","onContextMenu","role","tabIndex","verifiedTop","verifiedLeft"],"sources":["../../src/context-actions/ContextMenu.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { PromiseUtils, type CancelablePromise } from '@deephaven/utils';\nimport ContextActionUtils, {\n type ContextAction,\n type ResolvableContextAction,\n} from './ContextActionUtils';\nimport ContextMenuItem from './ContextMenuItem';\nimport LoadingSpinner from '../LoadingSpinner';\n\nconst log = Log.module('ContextMenu');\n\ninterface ContextMenuProps {\n top: number;\n left: number;\n updatePosition: (top: number, left: number) => void;\n // only submenus will have these, defaults to 0 otherwise\n // represents the width height of the parent menu item\n subMenuParentWidth: number;\n subMenuParentHeight: number;\n actions: ResolvableContextAction[];\n closeMenu: (closeAll: boolean) => void;\n onMenuClosed: (menu: ContextMenu) => void;\n onMenuOpened: (menu: ContextMenu) => void;\n options: {\n doNotVerifyPosition?: boolean;\n separateKeyboardMouse?: boolean;\n initialKeyboardIndex?: number;\n };\n menuStyle: React.CSSProperties;\n 'data-testid'?: string;\n}\n\ninterface ContextMenuState {\n menuItems: ContextAction[];\n pendingItems: CancelablePromise<ContextAction[]>[];\n activeSubMenu: number | null;\n hasOverflow: boolean;\n subMenuTop: number | null;\n subMenuLeft: number | null;\n subMenuParentWidth: number;\n subMenuParentHeight: number;\n keyboardIndex: number;\n mouseIndex: number;\n}\n\n/** Do not use this class directly. Use ContextMenuRoot and ContextActions instead. */\nclass ContextMenu extends PureComponent<ContextMenuProps, ContextMenuState> {\n static defaultProps = {\n subMenuParentWidth: 0,\n subMenuParentHeight: 0,\n closeMenu(): void {\n // no-op\n },\n onMenuOpened(): void {\n // no-op\n },\n onMenuClosed(): void {\n // no-op\n },\n options: {},\n menuStyle: {},\n 'data-testid': undefined,\n };\n\n static handleContextMenu(e: React.MouseEvent): void {\n if (e.metaKey) {\n return;\n }\n\n e.stopPropagation();\n e.preventDefault();\n }\n\n constructor(props: ContextMenuProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleCloseSubMenu = this.handleCloseSubMenu.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMenuItemClick = this.handleMenuItemClick.bind(this);\n this.handleMenuItemContextMenu = this.handleMenuItemContextMenu.bind(this);\n this.handleMenuItemMouseMove = this.handleMenuItemMouseMove.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleWindowResize = this.handleWindowResize.bind(this);\n\n this.container = React.createRef();\n this.oldFocus = document.activeElement;\n this.activeSubMenuRef = React.createRef();\n this.subMenuTimer = 0;\n this.rAF = 0;\n\n this.initialPosition = { top: props.top, left: props.left };\n\n this.state = {\n menuItems: [],\n pendingItems: [],\n activeSubMenu: null,\n hasOverflow: false,\n subMenuTop: null,\n subMenuLeft: null,\n subMenuParentWidth: 0,\n subMenuParentHeight: 0,\n keyboardIndex: -1,\n mouseIndex: -1,\n };\n }\n\n componentDidMount(): void {\n this.initMenu();\n\n this.verifyPosition();\n\n window.addEventListener('resize', this.handleWindowResize);\n\n // rAF is needed to wait for a submenus popper to be created before\n // attempting to set focus, however on a quick mount/unmount when\n // mousing past an item, the submenu could be unmounted before the\n // async rAF finishes, so it is cancelled in willUnmount()\n this.rAF = window.requestAnimationFrame(() => {\n this.container.current?.focus();\n\n const { onMenuOpened } = this.props;\n onMenuOpened(this);\n });\n }\n\n componentDidUpdate(\n prevProps: ContextMenuProps,\n prevState: ContextMenuState\n ): void {\n const { actions } = this.props;\n const { activeSubMenu } = this.state;\n\n if (activeSubMenu !== prevState.activeSubMenu) {\n if (activeSubMenu == null) {\n // close sub menu, refocus parent menu\n this.container.current?.focus();\n } else {\n // open sub menu, set its initial position\n this.setActiveSubMenuPosition();\n }\n }\n\n if (prevProps.actions !== actions) {\n this.initMenu();\n\n if (\n this.container.current == null ||\n !this.container.current.contains(document.activeElement)\n ) {\n this.container.current?.focus();\n }\n }\n\n this.verifyPosition();\n }\n\n componentWillUnmount(): void {\n this.cancelPromises();\n window.removeEventListener('resize', this.handleWindowResize);\n cancelAnimationFrame(this.rAF);\n }\n\n container: React.RefObject<HTMLDivElement>;\n\n oldFocus: Element | null;\n\n activeSubMenuRef: React.RefObject<HTMLDivElement>;\n\n subMenuTimer: number;\n\n rAF: number;\n\n initialPosition: { top: number; left: number };\n\n getKeyboardIndex(): number {\n const { options } = this.props;\n if (\n options.separateKeyboardMouse !== undefined &&\n options.separateKeyboardMouse\n ) {\n const { keyboardIndex } = this.state;\n return keyboardIndex;\n }\n\n return this.getMouseIndex();\n }\n\n setKeyboardIndex(index: number): void {\n const { options } = this.props;\n if (\n options.separateKeyboardMouse !== undefined &&\n options.separateKeyboardMouse\n ) {\n this.setState({ keyboardIndex: index });\n } else {\n this.setMouseIndex(index);\n }\n }\n\n getMouseIndex(): number {\n const { mouseIndex } = this.state;\n return mouseIndex;\n }\n\n setMouseIndex(index: number): void {\n this.setState({ mouseIndex: index });\n }\n\n initMenu(): void {\n // cancel any pending close and promises\n this.cancelPromises();\n cancelAnimationFrame(this.rAF);\n\n const { options } = this.props;\n let keyboardIndex = options.initialKeyboardIndex;\n if (keyboardIndex === undefined) {\n keyboardIndex = -1;\n }\n\n const { actions } = this.props;\n const menuItems = ContextActionUtils.getMenuItems(actions);\n const nonPromiseItems: ContextAction[] = [];\n for (let i = menuItems.length - 1; i >= 0; i -= 1) {\n const menuItem = menuItems[i];\n if (menuItem instanceof Promise) {\n this.initMenuPromise(menuItem as Promise<ContextAction[]>);\n } else {\n nonPromiseItems.push(menuItem as ContextAction);\n }\n }\n\n this.setState({\n mouseIndex: -1,\n keyboardIndex,\n activeSubMenu: null,\n menuItems: ContextActionUtils.sortActions(nonPromiseItems),\n });\n }\n\n initMenuPromise(promise: Promise<ContextAction[]>): void {\n // make all promises cancellable\n const cancellablePromise = PromiseUtils.makeCancelable(promise);\n\n this.setState(state => ({\n pendingItems: state.pendingItems.concat(cancellablePromise),\n }));\n\n cancellablePromise.then(\n resolvedMenuItems => {\n this.setState(state => {\n const index = state.pendingItems.indexOf(cancellablePromise);\n if (index >= 0) {\n const pendingItems = state.pendingItems.slice();\n pendingItems.splice(index, 1);\n\n return {\n menuItems: ContextActionUtils.sortActions(\n state.menuItems.concat(resolvedMenuItems)\n ),\n pendingItems,\n };\n }\n // This item is stale, don't update the menu\n return null;\n });\n },\n error => {\n if (PromiseUtils.isCanceled(error)) {\n return; // Canceled promise is ignored\n }\n\n // remove failed item from pending list\n this.setState(state => {\n const index = state.pendingItems.indexOf(cancellablePromise);\n if (index >= 0) {\n const pendingItems = state.pendingItems.slice();\n pendingItems.splice(index, 1);\n return {\n pendingItems,\n };\n }\n return null;\n });\n\n // Log the error\n log.error(error);\n }\n );\n }\n\n cancelPromises(): void {\n const { pendingItems } = this.state;\n pendingItems.map(item => item.cancel());\n }\n\n /**\n * Sets the unverfied start position of a submenu. Submenu then self-verfies\n * its own position and potentially reports back a new position.\n */\n setActiveSubMenuPosition(): void {\n if (this.activeSubMenuRef.current === null) return;\n const parentRect = this.activeSubMenuRef.current.getBoundingClientRect();\n\n // intentionally rect.right, we want the sub menu to start at the right edge of the current menu\n this.setState({\n subMenuTop: parentRect.top,\n subMenuLeft: parentRect.right,\n subMenuParentHeight: parentRect.height,\n subMenuParentWidth: parentRect.width,\n });\n }\n\n /**\n * Verifies the position of this menu in relation to the parent to make sure it's on screen.\n * Will update the top left state (updatePosition) if necessary (causing a re-render)\n * By default it tries to top-align with parent, at the right side of the parent.\n * Because we aren't a native context menu and can't escape window bounds, we also do\n * somethings to better fit on screen, such as the \"nudge\" offset position, and further\n * allow overflow scrolling for large menus in a small window.\n */\n verifyPosition(): void {\n const {\n options,\n updatePosition,\n subMenuParentWidth,\n subMenuParentHeight,\n top: oldTop,\n left: oldLeft,\n } = this.props;\n\n if (\n !this.container.current ||\n (options.doNotVerifyPosition != null && options.doNotVerifyPosition)\n ) {\n return;\n }\n\n // initial position is used rather than current position,\n // as the number of menu items can change (actions can bubble)\n // and menu should always be positioned relative to spawn point\n let { top, left } = this.initialPosition;\n const { width, height } =\n this.container.current?.getBoundingClientRect() ?? {\n width: 0,\n height: 0,\n };\n const hasOverflow =\n (this.container.current?.scrollHeight ?? 0) > window.innerHeight;\n\n if (height === 0 || width === 0) {\n // We don't have a height or width yet, don't bother doing anything\n return;\n }\n\n // does it fit below?\n if (top + height > window.innerHeight) {\n // can it be flipped to above? include offset if submenu (defaults to 0 if not submenu)\n if (top - height - subMenuParentHeight > 0) {\n // flip like a native menu would\n top -= height - subMenuParentHeight;\n } else {\n // still doesnt fit? okay, position at bottom edge\n top = window.innerHeight - height;\n }\n }\n\n if (left + width > window.innerWidth) {\n // less picky about left right positioning, just keep it going off to right\n left = left - width - subMenuParentWidth;\n }\n\n if (oldLeft !== left || oldTop !== top) {\n // parent owns positioning as single source of truth, ask to update props\n this.setState({ hasOverflow });\n updatePosition(top, left);\n }\n }\n\n // since window resize doesn't trigger blur, listen and close the menu\n handleWindowResize(): void {\n if (!this.container.current) {\n return;\n }\n this.closeMenu(true);\n }\n\n handleBlur(e: React.FocusEvent<HTMLDivElement>): void {\n if (!this.container.current) {\n log.warn('Container is null!');\n return;\n }\n\n if (!this.container.current.contains(e.relatedTarget as Node)) {\n let element: HTMLElement | null = e.relatedTarget as HTMLElement;\n let isContextMenuChild = false;\n while (element && !isContextMenuChild) {\n isContextMenuChild = element.hasAttribute('data-dh-context-menu');\n element = element.parentElement;\n }\n\n if (!isContextMenuChild) {\n // close all submenus on blur\n this.closeMenu(true);\n }\n }\n }\n\n /** Returns whether the specified key should remove the menu. Depends on the side the parent is on. */\n isEscapeKey(key: string): boolean {\n const { left } = this.props;\n return (\n key === 'Escape' ||\n (left < 0 && key === 'ArrowRight') ||\n key === 'ArrowLeft'\n );\n }\n\n handleKeyDown(e: React.KeyboardEvent<HTMLDivElement>): void {\n const { menuItems } = this.state;\n const oldFocus = this.getKeyboardIndex();\n let newFocus: number | null = oldFocus;\n let openSubMenu = false;\n\n if (e.key === 'Enter' || e.key === ' ') {\n if (oldFocus >= 0 && oldFocus < menuItems.length) {\n this.handleMenuItemClick(\n menuItems[oldFocus],\n e as React.SyntheticEvent as React.MouseEvent\n );\n }\n return;\n }\n\n if (e.key === 'ArrowRight') {\n if (oldFocus >= 0 && oldFocus <= menuItems.length) {\n openSubMenu = true;\n } else {\n newFocus = 0;\n }\n } else if (this.isEscapeKey(e.key)) {\n newFocus = null;\n } else if (e.key === 'ArrowUp' || (e.shiftKey && e.key === 'Tab')) {\n newFocus = ContextActionUtils.getNextMenuItem(newFocus, -1, menuItems);\n } else if (e.key === 'ArrowDown' || e.key === 'Tab') {\n newFocus = ContextActionUtils.getNextMenuItem(newFocus, 1, menuItems);\n }\n\n if (openSubMenu) {\n this.openSubMenu(oldFocus);\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n if (oldFocus !== newFocus) {\n if (newFocus !== null) {\n this.setKeyboardIndex(newFocus);\n } else {\n this.closeMenu();\n if (this.oldFocus instanceof HTMLElement) {\n this.oldFocus.focus();\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n }\n\n openSubMenu(index: number): void {\n const { menuItems, activeSubMenu } = this.state;\n const newSubMenu = menuItems[index].actions ? index : null;\n if (activeSubMenu === newSubMenu) return;\n this.setState({\n activeSubMenu: newSubMenu,\n subMenuTop: null,\n subMenuLeft: null,\n });\n }\n\n closeMenu(closeAll = false): void {\n const { closeMenu, onMenuClosed } = this.props;\n cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n closeMenu(closeAll);\n onMenuClosed(this);\n });\n }\n\n closeSubMenu(): void {\n this.setState({\n activeSubMenu: null,\n });\n }\n\n handleCloseSubMenu(closeAllMenus: boolean): void {\n if (closeAllMenus) {\n this.closeMenu(true);\n } else {\n this.closeSubMenu();\n }\n }\n\n handleMenuItemClick(menuItem: ContextAction, e: React.MouseEvent): void {\n e.preventDefault();\n e.stopPropagation();\n\n const { menuItems } = this.state;\n if (\n menuItem != null &&\n (menuItem.disabled === undefined || !menuItem.disabled)\n ) {\n if (menuItem.actions != null) {\n this.openSubMenu(menuItems.indexOf(menuItem));\n } else if (menuItem.action != null) {\n menuItem.action(e.nativeEvent);\n this.closeMenu(true);\n }\n }\n }\n\n handleMenuItemContextMenu(\n menuItem: ContextAction,\n e: React.MouseEvent\n ): void {\n if (e.metaKey) {\n return;\n }\n\n this.handleMenuItemClick(menuItem, e);\n }\n\n handleMenuItemMouseMove(menuItem: ContextAction): void {\n const { menuItems } = this.state;\n const focusIndex = menuItems.indexOf(menuItem);\n this.setMouseIndex(focusIndex);\n\n if (\n focusIndex >= 0 &&\n focusIndex < menuItems.length &&\n (menuItem.disabled === undefined || !menuItem.disabled)\n ) {\n this.openSubMenu(focusIndex);\n }\n }\n\n handleMouseLeave(): void {\n this.setMouseIndex(-1);\n }\n\n render(): JSX.Element {\n const menuItemElements = [];\n const { top, left } = this.props;\n const {\n activeSubMenu,\n hasOverflow,\n keyboardIndex,\n menuItems,\n mouseIndex,\n pendingItems,\n subMenuTop,\n subMenuLeft,\n subMenuParentWidth,\n subMenuParentHeight,\n } = this.state;\n for (let i = 0; i < menuItems.length; i += 1) {\n const menuItem = menuItems[i];\n\n if (i > 0 && menuItem.group !== menuItems[i - 1].group) {\n menuItemElements.push(<hr key={`${i}.separator`} />);\n }\n\n const menuItemElement = (\n <ContextMenuItem\n key={i}\n ref={activeSubMenu === i ? this.activeSubMenuRef : null}\n isKeyboardSelected={keyboardIndex === i}\n isMouseSelected={mouseIndex === i}\n menuItem={menuItem}\n closeMenu={this.handleCloseSubMenu}\n onMenuItemClick={this.handleMenuItemClick}\n onMenuItemMouseMove={this.handleMenuItemMouseMove}\n onMenuItemContextMenu={this.handleMenuItemContextMenu}\n />\n );\n\n menuItemElements.push(menuItemElement);\n }\n\n let pendingElement = null;\n if (pendingItems.length > 0) {\n pendingElement = (\n <div className=\"loading\">\n <LoadingSpinner className=\"loading-spinner-vertical-align\" />\n </div>\n );\n }\n\n const { menuStyle, 'data-testid': dataTestId } = this.props;\n\n // don't show submenu until it has an position initialized\n const showSubmenu =\n activeSubMenu !== null && subMenuTop !== null && subMenuLeft !== null;\n\n return (\n <>\n <div\n className={classNames(\n { 'has-overflow': hasOverflow },\n 'context-menu-container'\n )}\n style={{ top, left, ...menuStyle }}\n ref={this.container}\n data-dh-context-menu\n onBlur={this.handleBlur}\n onKeyDown={this.handleKeyDown}\n onMouseLeave={this.handleMouseLeave}\n onContextMenu={ContextMenu.handleContextMenu}\n role=\"menuitem\"\n tabIndex={0}\n data-testid={dataTestId}\n >\n {menuItemElements}\n {pendingElement}\n </div>\n {showSubmenu &&\n activeSubMenu !== null &&\n subMenuTop !== null &&\n subMenuLeft !== null && (\n <ContextMenu\n key={`sub-${activeSubMenu}`}\n actions={menuItems[activeSubMenu].actions || []}\n closeMenu={this.handleCloseSubMenu}\n top={subMenuTop}\n left={subMenuLeft}\n updatePosition={(verifiedTop, verifiedLeft) => {\n this.setState({\n subMenuTop: verifiedTop,\n subMenuLeft: verifiedLeft,\n });\n }}\n subMenuParentWidth={subMenuParentWidth}\n subMenuParentHeight={subMenuParentHeight}\n />\n )}\n </>\n );\n }\n}\n\nexport default ContextMenu;\n"],"mappings":"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"}