@deephaven/components 0.15.6-vite.21 → 0.15.7-beta.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 (91) hide show
  1. package/dist/AutoCompleteInput.js.map +1 -1
  2. package/dist/AutoResizeTextarea.js.map +1 -1
  3. package/dist/BaseStyleSheet.css +11560 -0
  4. package/dist/BaseStyleSheet.css.map +1 -0
  5. package/dist/BasicModal.js.map +1 -1
  6. package/dist/Button.js.map +1 -1
  7. package/dist/ButtonGroup.js.map +1 -1
  8. package/dist/ButtonOld.js.map +1 -1
  9. package/dist/CardFlip.js.map +1 -1
  10. package/dist/Checkbox.js.map +1 -1
  11. package/dist/Collapse.js.map +1 -1
  12. package/dist/ComboBox.js.map +1 -1
  13. package/dist/CustomTimeSelect.d.ts +2 -2
  14. package/dist/CustomTimeSelect.d.ts.map +1 -1
  15. package/dist/CustomTimeSelect.js +0 -1
  16. package/dist/CustomTimeSelect.js.map +1 -1
  17. package/dist/DebouncedSearchInput.js.map +1 -1
  18. package/dist/DeephavenSpinner.js.map +1 -1
  19. package/dist/DragUtils.js.map +1 -1
  20. package/dist/DraggableItemList.js +1 -1
  21. package/dist/DraggableItemList.js.map +1 -1
  22. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  23. package/dist/ItemList.js +1 -1
  24. package/dist/ItemList.js.map +1 -1
  25. package/dist/ItemListItem.js.map +1 -1
  26. package/dist/LoadingOverlay.js.map +1 -1
  27. package/dist/LoadingSpinner.js.map +1 -1
  28. package/dist/MaskedInput.d.ts.map +1 -1
  29. package/dist/MaskedInput.js +22 -9
  30. package/dist/MaskedInput.js.map +1 -1
  31. package/dist/Option.js.map +1 -1
  32. package/dist/RadioGroup.js.map +1 -1
  33. package/dist/RadioItem.js.map +1 -1
  34. package/dist/SearchInput.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/ThemeExport.js.map +1 -1
  39. package/dist/TimeInput.d.ts +8 -1
  40. package/dist/TimeInput.d.ts.map +1 -1
  41. package/dist/TimeInput.js +24 -6
  42. package/dist/TimeInput.js.map +1 -1
  43. package/dist/TimeSlider.d.ts.map +1 -1
  44. package/dist/TimeSlider.js +37 -6
  45. package/dist/TimeSlider.js.map +1 -1
  46. package/dist/ToastNotification.js.map +1 -1
  47. package/dist/UISwitch.js.map +1 -1
  48. package/dist/ValidateLabelInput.css +8 -0
  49. package/dist/ValidateLabelInput.css.map +1 -0
  50. package/dist/ValidateLabelInput.d.ts +28 -0
  51. package/dist/ValidateLabelInput.d.ts.map +1 -0
  52. package/dist/ValidateLabelInput.js +50 -0
  53. package/dist/ValidateLabelInput.js.map +1 -0
  54. package/dist/context-actions/ContextActionUtils.js.map +1 -1
  55. package/dist/context-actions/ContextActions.js.map +1 -1
  56. package/dist/context-actions/ContextMenu.js.map +1 -1
  57. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  58. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  59. package/dist/context-actions/GlobalContextAction.js.map +1 -1
  60. package/dist/context-actions/GlobalContextActions.js.map +1 -1
  61. package/dist/context-actions/index.js.map +1 -1
  62. package/dist/declaration.d.js.map +1 -1
  63. package/dist/index.d.ts +2 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +2 -1
  66. package/dist/index.js.map +1 -1
  67. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  68. package/dist/menu-actions/Menu.js.map +1 -1
  69. package/dist/menu-actions/index.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/Page.js.map +1 -1
  78. package/dist/navigation/Stack.js.map +1 -1
  79. package/dist/navigation/index.js.map +1 -1
  80. package/dist/popper/Popper.js.map +1 -1
  81. package/dist/popper/Tooltip.d.ts +2 -0
  82. package/dist/popper/Tooltip.d.ts.map +1 -1
  83. package/dist/popper/Tooltip.js +4 -1
  84. package/dist/popper/Tooltip.js.map +1 -1
  85. package/dist/popper/index.js.map +1 -1
  86. package/dist/shortcuts/GlobalShortcuts.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/package.json +9 -9
  91. package/scss/BaseStyleSheet.scss +0 -847
@@ -1 +1 @@
1
- {"version":3,"file":"ItemList.js","names":["React","PureComponent","memoize","FixedSizeList","List","AutoSizer","Log","RangeUtils","ItemListItem","ContextActionUtils","log","module","ItemList","renderItem","item","displayValue","value","constructor","props","index","selectedRanges","isSelected","max","CACHE_SIZE","itemIndex","key","isFocused","style","disableSelect","content","handleItemContextMenu","handleItemDoubleClick","handleItemMouseDown","handleItemFocus","handleItemBlur","handleItemMouseMove","handleItemMouseUp","onKeyDown","component","forwardRef","ref","displayName","items","bind","handleItemsRendered","handleWindowMouseUp","handleKeyDown","handleMouseLeave","handleScroll","handleResize","renderInnerElement","list","createRef","listContainer","isStickyBottom","state","focusIndex","mouseDownIndex","overscanStartIndex","height","isDragging","isStuckToBottom","scrollOffset","componentDidMount","isListAtBottom","scrollToBottom","componentDidUpdate","prevProps","prevState","propSelectedRanges","sendViewportUpdate","setSelectedRanges","onSelectionChange","onFocusChange","componentWillUnmount","window","removeEventListener","focus","current","getElement","focusSelector","elements","querySelectorAll","elementIndex","focusItem","setState","element","HTMLElement","scrollToItem","scrollIntoView","block","e","isModifierDown","isModifierKeyDown","toggleSelect","shiftKey","isDoubleClickSelect","onSelect","selectRange","target","indexOf","tagName","toLowerCase","button","length","selectItem","addEventListener","debug2","currentTarget","relatedTarget","contains","isDragSelect","isMultiSelect","getItemSelected","deselectAll","Math","min","isDeselectOnClick","isShiftDown","resetMouseState","itemCount","oldFocus","newFocus","stopPropagation","preventDefault","lastRange","scrollUpdateWasRequested","isDeselectable","deselectItem","deselectRange","range","validateRange","onViewportChange","rowHeight","topRow","floor","bottomRow","ceil","offset","getCachedItem","render","overscanCount","dataTestId","width","getItemData","getOuterElement","getInnerElement","DEFAULT_ROW_HEIGHT","DEFAULT_OVERSCAN","undefined"],"sources":["../src/ItemList.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport memoize from 'memoizee';\nimport {\n FixedSizeList as List,\n ListOnItemsRenderedProps,\n ListOnScrollProps,\n} from 'react-window';\nimport AutoSizer, { Size } from 'react-virtualized-auto-sizer';\nimport Log from '@deephaven/log';\nimport { RangeUtils, Range } from '@deephaven/utils';\nimport ItemListItem from './ItemListItem';\nimport { ContextActionUtils } from './context-actions';\nimport './ItemList.scss';\n\nconst log = Log.module('ItemList');\n\nexport interface DefaultListItem {\n value?: string;\n displayValue?: string;\n}\n\nexport type RenderItemProps<T> = {\n item: T;\n itemIndex: number;\n isFocused: boolean;\n isSelected: boolean;\n style: React.CSSProperties;\n};\n\nexport type RenderItemFn<T> = (props: RenderItemProps<T>) => React.ReactNode;\n\nexport type ItemDragEventHandler = (\n index: number,\n event: React.DragEvent<HTMLDivElement>\n) => void;\n\nexport type ItemListProps<T> = {\n // Total item count\n itemCount: number;\n rowHeight: number;\n // Offset of the top item in the items array\n offset: number;\n // Item object format expected by the default renderItem function\n // Can be anything as long as it's supported by the renderItem\n // Default renderItem will look for a `displayValue` property, fallback\n // to the `value` property, or stringify the object if neither are defined\n items: T[];\n // Whether clicking a selected item should deselect in the item list or not. Defaults to true\n isDeselectOnClick: boolean;\n // Whether selection requires a double click or not\n isDoubleClickSelect: boolean;\n // Whether to allow dragging to change the selection after clicking\n isDragSelect: boolean;\n // Whether to allow multiple selections in this item list\n isMultiSelect: boolean;\n // Set to true if you want the list to scroll when new items are added and it's already at the bottom\n isStickyBottom: boolean;\n // Fired when an item gets focused\n onFocusChange(index: number | null): void;\n\n // Fired when an item is clicked. With multiple selection, fired on double click.\n onSelect(index: number, event: React.SyntheticEvent): void;\n onSelectionChange(ranges: Range[]): void;\n onViewportChange(topRow: number, bottomRow: number): void;\n overscanCount: number;\n selectedRanges: Range[];\n disableSelect: boolean;\n renderItem: RenderItemFn<T>;\n focusSelector: string;\n 'data-testid'?: string;\n};\n\ntype ItemListState = {\n focusIndex: number | null;\n mouseDownIndex: number | null;\n selectedRanges: Range[];\n overscanStartIndex: number;\n height: number | null;\n isDragging: boolean;\n isStuckToBottom: boolean;\n scrollOffset: number | null;\n};\n\n/**\n * Show items in a long scrollable list.\n * Can be navigated via keyboard or mouse.\n */\nexport class ItemList<T> extends PureComponent<\n ItemListProps<T>,\n ItemListState\n> {\n static CACHE_SIZE = 1000;\n\n static DEFAULT_ROW_HEIGHT = 20;\n\n // By drawing an additional 10 items on each side, tab/keyboard navigation works better (as the next element exists)\n static DEFAULT_OVERSCAN = 10;\n\n static defaultProps = {\n offset: 0,\n items: [],\n rowHeight: ItemList.DEFAULT_ROW_HEIGHT,\n\n isDeselectOnClick: true,\n\n isDoubleClickSelect: false,\n\n isDragSelect: true,\n\n isMultiSelect: false,\n\n isStickyBottom: false,\n\n disableSelect: false,\n\n onFocusChange(): void {\n // no-op\n },\n onSelect(): void {\n // no-op\n },\n onSelectionChange(): void {\n // no-op\n },\n onViewportChange(): void {\n // no-op\n },\n\n overscanCount: ItemList.DEFAULT_OVERSCAN,\n\n renderItem: ItemList.renderItem,\n selectedRanges: [],\n\n focusSelector: '.item-list-item',\n\n 'data-testid': undefined,\n };\n\n static renderItem<P extends DefaultListItem>({\n item,\n }: RenderItemProps<P>): JSX.Element {\n return (\n <div className=\"item-list-item-content\">\n {item && (item.displayValue || item.value || `${item}`)}\n </div>\n );\n }\n\n constructor(props: ItemListProps<T>) {\n super(props);\n\n this.handleItemBlur = this.handleItemBlur.bind(this);\n this.handleItemContextMenu = this.handleItemContextMenu.bind(this);\n this.handleItemFocus = this.handleItemFocus.bind(this);\n this.handleItemDoubleClick = this.handleItemDoubleClick.bind(this);\n this.handleItemMouseDown = this.handleItemMouseDown.bind(this);\n this.handleItemMouseMove = this.handleItemMouseMove.bind(this);\n this.handleItemMouseUp = this.handleItemMouseUp.bind(this);\n this.handleItemsRendered = this.handleItemsRendered.bind(this);\n this.handleWindowMouseUp = this.handleWindowMouseUp.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleScroll = this.handleScroll.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.renderInnerElement = this.renderInnerElement.bind(this);\n\n this.list = React.createRef();\n this.listContainer = React.createRef();\n\n const { isStickyBottom, selectedRanges } = props;\n\n this.state = {\n focusIndex: null,\n mouseDownIndex: null,\n selectedRanges,\n overscanStartIndex: 0,\n height: null,\n isDragging: false,\n isStuckToBottom: isStickyBottom,\n scrollOffset: null,\n };\n }\n\n componentDidMount(): void {\n const { isStickyBottom } = this.props;\n if (isStickyBottom && !this.isListAtBottom()) {\n this.scrollToBottom();\n }\n }\n\n componentDidUpdate(\n prevProps: ItemListProps<T>,\n prevState: ItemListState\n ): void {\n const { selectedRanges: propSelectedRanges } = this.props;\n const {\n focusIndex,\n isStuckToBottom,\n scrollOffset,\n height,\n selectedRanges,\n } = this.state;\n if (isStuckToBottom && !this.isListAtBottom()) {\n this.scrollToBottom();\n }\n\n if (\n scrollOffset !== prevState.scrollOffset ||\n height !== prevState.height\n ) {\n this.sendViewportUpdate();\n }\n\n if (\n propSelectedRanges !== prevProps.selectedRanges &&\n propSelectedRanges !== selectedRanges\n ) {\n this.setSelectedRanges(propSelectedRanges);\n } else if (selectedRanges !== prevState.selectedRanges) {\n const { onSelectionChange } = this.props;\n onSelectionChange(selectedRanges);\n }\n\n if (focusIndex !== prevState.focusIndex) {\n const { onFocusChange } = this.props;\n onFocusChange(focusIndex);\n }\n }\n\n componentWillUnmount(): void {\n window.removeEventListener('mouseup', this.handleWindowMouseUp);\n }\n\n list: React.RefObject<List>;\n\n listContainer: React.RefObject<HTMLDivElement>;\n\n getItemSelected = memoize(\n (index: number, selectedRanges: Range[]) =>\n RangeUtils.isSelected(selectedRanges, index),\n { max: ItemList.CACHE_SIZE }\n );\n\n getCachedItem = memoize(\n (\n itemIndex: number,\n key: number,\n item: T,\n isFocused: boolean,\n isSelected: boolean,\n renderItem: RenderItemFn<T>,\n style: React.CSSProperties,\n disableSelect: boolean\n ) => {\n const content = renderItem({\n item,\n itemIndex,\n isFocused,\n isSelected,\n style,\n });\n\n return (\n <ItemListItem\n onContextMenu={this.handleItemContextMenu}\n onDoubleClick={this.handleItemDoubleClick}\n onMouseDown={this.handleItemMouseDown}\n onFocus={this.handleItemFocus}\n onBlur={this.handleItemBlur}\n disableSelect={disableSelect}\n onMouseMove={this.handleItemMouseMove}\n onMouseUp={this.handleItemMouseUp}\n isFocused={isFocused}\n isSelected={isSelected}\n itemIndex={itemIndex}\n style={style}\n key={key}\n >\n {content}\n </ItemListItem>\n );\n },\n { max: ItemList.CACHE_SIZE }\n );\n\n getOuterElement = memoize((onKeyDown: React.KeyboardEventHandler) => {\n const component = React.forwardRef<HTMLDivElement>((props, ref) => (\n // We need to add the tabIndex to make sure it is focusable, otherwise we can't get key events\n <div\n ref={ref}\n tabIndex={-1}\n onKeyDown={onKeyDown}\n role=\"presentation\"\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n />\n ));\n component.displayName = 'ItemListOuterElement';\n return component;\n });\n\n getInnerElement = memoize(() => {\n const component = React.forwardRef<HTMLDivElement>((props, ref) => (\n <div\n className=\"item-list-inner-element\"\n ref={ref}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n />\n ));\n component.displayName = 'ItemListInnerElement';\n return component;\n });\n\n getItemData = memoize(\n (items: T[], selectedRanges: Range[], renderItem: RenderItemFn<T>) => ({\n items,\n selectedRanges,\n renderItem,\n })\n );\n\n focus(): void {\n this.listContainer.current?.focus();\n }\n\n getElement(itemIndex: number): Element | null {\n if (this.listContainer.current == null) {\n return null;\n }\n\n const { focusSelector } = this.props;\n const { overscanStartIndex } = this.state;\n const elements = this.listContainer.current.querySelectorAll(focusSelector);\n const elementIndex = itemIndex - overscanStartIndex;\n return elements[elementIndex];\n }\n\n focusItem(itemIndex: number): void {\n const { disableSelect } = this.props;\n if (disableSelect) return;\n\n this.setState({ focusIndex: itemIndex });\n\n const element = this.getElement(itemIndex);\n if (element instanceof HTMLElement) {\n element.focus();\n }\n }\n\n scrollToItem(itemIndex: number): void {\n const element = this.getElement(itemIndex);\n if (element != null) {\n element.scrollIntoView({ block: 'center' });\n }\n }\n\n handleItemContextMenu(\n itemIndex: number,\n e: React.MouseEvent<HTMLDivElement>\n ): void {\n // Update the selection, but don't consume the mouse event - it will trigger the context menu\n const { selectedRanges } = this.state;\n const isSelected = RangeUtils.isSelected(selectedRanges, itemIndex);\n\n // When right-clicking, we want to maintain the current selection if the right click happened within the selection even if the modifier key isn't down\n const isModifierDown =\n isSelected || ContextActionUtils.isModifierKeyDown(e);\n this.toggleSelect(itemIndex, e.shiftKey, isModifierDown, false);\n }\n\n handleItemDoubleClick(itemIndex: number, e: React.MouseEvent): void {\n const { isDoubleClickSelect, onSelect } = this.props;\n\n if (isDoubleClickSelect) {\n this.setState(\n ({ selectedRanges }) => ({\n selectedRanges: RangeUtils.selectRange(selectedRanges, [\n itemIndex,\n itemIndex,\n ]),\n }),\n () => {\n onSelect(itemIndex, e);\n }\n );\n }\n }\n\n handleItemMouseDown(index: number, e: React.MouseEvent): void {\n const { selectedRanges } = this.state;\n\n if (\n e.target instanceof HTMLElement &&\n ['button', 'select', 'input', 'textarea'].indexOf(\n e.target.tagName.toLowerCase()\n ) !== -1\n ) {\n // allow these elements to do their own behaviours\n return;\n }\n\n if (e.button === 2 && selectedRanges.length === 0) {\n // allow right click to act as a selection if selection is empty\n this.focusItem(index);\n this.selectItem(index);\n return;\n }\n\n if (e.button != null && e.button !== 0) {\n return;\n }\n\n this.setState({ mouseDownIndex: index });\n\n window.addEventListener('mouseup', this.handleWindowMouseUp);\n\n // Leave selection until mouse up, to allow for dragging behaviour\n }\n\n handleItemBlur(itemIndex: number, e: React.FocusEvent): void {\n log.debug2('item blur', itemIndex, e.currentTarget, e.relatedTarget);\n if (\n !e.relatedTarget ||\n (this.listContainer.current &&\n e.relatedTarget instanceof HTMLElement &&\n !this.listContainer.current.contains(e.relatedTarget))\n ) {\n // Next focused element is outside of the ItemList\n this.setState({ focusIndex: null });\n }\n }\n\n handleItemFocus(itemIndex: number, e: React.FocusEvent): void {\n log.debug2('item focus', itemIndex, e.target);\n this.setState(state => {\n const { focusIndex } = state;\n if (focusIndex !== itemIndex) {\n return { focusIndex: itemIndex };\n }\n return null;\n });\n }\n\n handleItemMouseMove(itemIndex: number, e: React.MouseEvent): void {\n const { isDragSelect, isMultiSelect, disableSelect } = this.props;\n const { mouseDownIndex, selectedRanges } = this.state;\n\n if (mouseDownIndex == null || disableSelect) return;\n\n this.setState({ isDragging: true });\n\n if (isDragSelect || mouseDownIndex === itemIndex) {\n this.focusItem(itemIndex);\n\n if (isMultiSelect) {\n if (\n !isDragSelect &&\n !this.getItemSelected(itemIndex, selectedRanges) &&\n !ContextActionUtils.isModifierKeyDown(e)\n ) {\n // If there's already a selection and they select outside of that range while dragging without a modifier key, start a new selection with just the new item\n this.deselectAll();\n }\n this.selectRange([\n Math.min(mouseDownIndex, itemIndex),\n Math.max(mouseDownIndex, itemIndex),\n ]);\n } else {\n this.toggleSelect(\n itemIndex,\n e.shiftKey,\n ContextActionUtils.isModifierKeyDown(e),\n false\n );\n }\n }\n }\n\n handleItemMouseUp(index: number, e: React.MouseEvent): void {\n const { isDeselectOnClick, isDoubleClickSelect, onSelect } = this.props;\n const { mouseDownIndex, isDragging } = this.state;\n\n if (\n e.target instanceof HTMLElement &&\n ['button', 'select', 'input', 'textarea'].indexOf(\n e.target.tagName.toLowerCase()\n ) !== -1\n ) {\n return;\n }\n\n if (mouseDownIndex === index && !isDragging) {\n const isShiftDown = e.shiftKey;\n const isModifierDown = ContextActionUtils.isModifierKeyDown(e);\n this.focusItem(index);\n this.toggleSelect(index, isShiftDown, isModifierDown, isDeselectOnClick);\n\n if (!isDoubleClickSelect && !isShiftDown && !isModifierDown) {\n onSelect(index, e);\n }\n }\n\n this.resetMouseState();\n }\n\n handleItemsRendered({ overscanStartIndex }: ListOnItemsRenderedProps): void {\n this.setState({ overscanStartIndex });\n }\n\n handleResize({ height }: Size): void {\n this.setState({ height });\n }\n\n handleMouseLeave(): void {\n this.setState({ mouseDownIndex: null });\n }\n\n handleWindowMouseUp(): void {\n this.resetMouseState();\n window.removeEventListener('mouseup', this.handleWindowMouseUp);\n }\n\n handleKeyDown(e: React.KeyboardEvent): void {\n const { isMultiSelect, itemCount, onSelect } = this.props;\n const { focusIndex: oldFocus } = this.state;\n let newFocus = oldFocus;\n\n if (e.key === 'Enter' || e.key === ' ') {\n if (!isMultiSelect && newFocus != null) {\n this.setState({ selectedRanges: [[newFocus, newFocus]] }, () => {\n if (newFocus != null) {\n onSelect(newFocus, e);\n }\n });\n }\n return;\n }\n\n if (e.key === 'ArrowUp') {\n if (newFocus != null && newFocus >= 0) {\n newFocus = Math.max(0, newFocus - 1);\n } else {\n newFocus = itemCount - 1;\n }\n } else if (e.key === 'ArrowDown') {\n if (newFocus != null && newFocus >= 0) {\n newFocus = Math.min(newFocus + 1, itemCount - 1);\n } else {\n newFocus = 0;\n }\n } else {\n return;\n }\n\n if (oldFocus !== newFocus) {\n e.stopPropagation();\n e.preventDefault();\n\n this.focusItem(newFocus);\n\n const { selectedRanges } = this.state;\n if (e.shiftKey && selectedRanges.length > 0) {\n const lastRange = selectedRanges[selectedRanges.length - 1];\n this.selectRange([\n Math.min(newFocus, lastRange[0]),\n Math.max(newFocus, lastRange[1]),\n ]);\n } else {\n this.deselectAll();\n if (newFocus !== null) {\n this.selectItem(newFocus);\n } else {\n this.listContainer.current?.focus();\n }\n }\n\n this.scrollIntoView(newFocus);\n }\n }\n\n handleScroll({\n scrollUpdateWasRequested,\n scrollOffset,\n }: ListOnScrollProps): void {\n this.setState(state => {\n if (scrollUpdateWasRequested) {\n // The scroll was caused by scrollTo() or scrollToItem()\n // Don't re-calc isStuckToBottom\n return { scrollOffset } as ItemListState;\n }\n\n const { isStickyBottom } = this.props;\n const { height } = state;\n\n const isStuckToBottom =\n isStickyBottom && this.isListAtBottom({ scrollOffset, height });\n return { isStuckToBottom, scrollOffset } as ItemListState;\n });\n }\n\n resetMouseState(): void {\n this.setState({ mouseDownIndex: null, isDragging: false });\n }\n\n scrollToBottom(): void {\n const { itemCount } = this.props;\n if (this.list.current) {\n this.list.current.scrollToItem(itemCount);\n }\n }\n\n scrollIntoView(itemIndex: number): void {\n if (this.list.current) {\n this.list.current.scrollToItem(itemIndex);\n }\n }\n\n /**\n * @param index The index to toggle selection for\n * @param isShiftDown True if the shift modifier key is down\n * @param isModifierDown True if the meta modifier key is down\n * @param isDeselectable True if item should be deselected if already selected\n */\n toggleSelect(\n index: number,\n isShiftDown: boolean,\n isModifierDown: boolean,\n isDeselectable = true\n ): void {\n const { isMultiSelect } = this.props;\n const { selectedRanges } = this.state;\n\n if (isMultiSelect && isShiftDown && selectedRanges.length > 0) {\n const lastRange = selectedRanges[selectedRanges.length - 1];\n this.selectRange([\n Math.min(lastRange[0], index),\n Math.max(index, lastRange[1]),\n ]);\n } else if (\n isMultiSelect &&\n selectedRanges.length === 1 &&\n selectedRanges[0][0] === index &&\n selectedRanges[0][1] === index\n ) {\n if (isDeselectable) {\n this.deselectItem(index);\n }\n } else if (isMultiSelect && isModifierDown) {\n if (this.getItemSelected(index, selectedRanges)) {\n if (isDeselectable) {\n this.deselectItem(index);\n }\n } else {\n this.selectItem(index);\n }\n } else {\n this.deselectAll();\n this.selectItem(index);\n }\n }\n\n deselectAll(): void {\n const { itemCount } = this.props;\n this.deselectRange([0, itemCount]);\n }\n\n deselectItem(index: number): void {\n this.deselectRange([index, index]);\n }\n\n deselectRange(range: Range): void {\n RangeUtils.validateRange(range);\n\n this.setState(({ selectedRanges }) => ({\n selectedRanges: RangeUtils.deselectRange(selectedRanges, range),\n }));\n }\n\n selectItem(index: number): void {\n const { disableSelect } = this.props;\n if (disableSelect) return;\n\n this.selectRange([index, index]);\n }\n\n selectRange(range: Range): void {\n RangeUtils.validateRange(range);\n\n this.setState(({ selectedRanges }) => ({\n selectedRanges: RangeUtils.selectRange(selectedRanges, range),\n }));\n }\n\n setSelectedRanges(selectedRanges: Range[]): void {\n this.setState({ selectedRanges });\n }\n\n sendViewportUpdate(): void {\n const { scrollOffset, height } = this.state;\n if (scrollOffset != null && height != null) {\n const { onViewportChange, rowHeight } = this.props;\n const topRow = Math.floor(scrollOffset / rowHeight);\n const bottomRow = topRow + Math.ceil(height / rowHeight);\n onViewportChange(topRow, bottomRow);\n }\n }\n\n isListAtBottom(\n {\n scrollOffset,\n height,\n }: Pick<ItemListState, 'scrollOffset' | 'height'> = this.state\n ): boolean {\n if (height == null || scrollOffset == null) {\n return false;\n }\n\n const { itemCount, rowHeight } = this.props;\n return scrollOffset + height >= itemCount * rowHeight;\n }\n\n renderInnerElement({\n index: itemIndex,\n style,\n }: {\n index: number;\n style: React.CSSProperties;\n }): React.ReactElement | null {\n const { items, offset, renderItem, disableSelect } = this.props;\n const { focusIndex, selectedRanges } = this.state;\n if (itemIndex < offset || itemIndex >= offset + items.length) {\n return null;\n }\n\n const item = items[itemIndex - offset];\n return this.getCachedItem(\n itemIndex,\n itemIndex,\n item,\n itemIndex === focusIndex && !disableSelect,\n this.getItemSelected(itemIndex, selectedRanges),\n renderItem,\n style,\n disableSelect\n );\n }\n\n render(): JSX.Element {\n const {\n items,\n itemCount,\n overscanCount,\n renderItem,\n rowHeight,\n 'data-testid': dataTestId,\n } = this.props;\n const { selectedRanges } = this.state;\n return (\n <AutoSizer className=\"item-list-auto-sizer\" onResize={this.handleResize}>\n {({ width, height }) => (\n <List\n className=\"item-list-scroll-pane\"\n height={height}\n width={width}\n itemCount={itemCount}\n itemSize={rowHeight}\n // This prop isn't actually used by us, it is passed to the render function by react-window\n // Used here to force a re-render of the List component.\n // Otherwise it doesn't know to call the render again when selection or renderItem changes\n itemData={this.getItemData(items, selectedRanges, renderItem)}\n onScroll={this.handleScroll}\n onItemsRendered={this.handleItemsRendered}\n ref={this.list}\n outerElementType={this.getOuterElement(this.handleKeyDown)}\n outerRef={this.listContainer}\n innerElementType={this.getInnerElement()}\n overscanCount={overscanCount}\n data-testid={dataTestId}\n >\n {this.renderInnerElement}\n </List>\n )}\n </AutoSizer>\n );\n }\n}\n\nexport default ItemList;\n"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/ItemList.tsx"],"names":["React","PureComponent","memoize","FixedSizeList","List","AutoSizer","Log","RangeUtils","ItemListItem","ContextActionUtils","log","module","ItemList","renderItem","item","displayValue","value","constructor","props","index","selectedRanges","isSelected","max","CACHE_SIZE","itemIndex","key","isFocused","style","disableSelect","content","handleItemContextMenu","handleItemDoubleClick","handleItemMouseDown","handleItemFocus","handleItemBlur","handleItemMouseMove","handleItemMouseUp","onKeyDown","component","forwardRef","ref","displayName","items","bind","handleItemsRendered","handleWindowMouseUp","handleKeyDown","handleMouseLeave","handleScroll","handleResize","renderInnerElement","list","createRef","listContainer","isStickyBottom","state","focusIndex","mouseDownIndex","overscanStartIndex","height","isDragging","isStuckToBottom","scrollOffset","componentDidMount","isListAtBottom","scrollToBottom","componentDidUpdate","prevProps","prevState","propSelectedRanges","sendViewportUpdate","setSelectedRanges","onSelectionChange","onFocusChange","componentWillUnmount","window","removeEventListener","focus","current","getElement","focusSelector","elements","querySelectorAll","elementIndex","focusItem","setState","element","HTMLElement","scrollToItem","scrollIntoView","block","e","isModifierDown","isModifierKeyDown","toggleSelect","shiftKey","isDoubleClickSelect","onSelect","selectRange","target","indexOf","tagName","toLowerCase","button","length","selectItem","addEventListener","debug2","currentTarget","relatedTarget","contains","isDragSelect","isMultiSelect","getItemSelected","deselectAll","Math","min","isDeselectOnClick","isShiftDown","resetMouseState","itemCount","oldFocus","newFocus","stopPropagation","preventDefault","lastRange","scrollUpdateWasRequested","isDeselectable","deselectItem","deselectRange","range","validateRange","onViewportChange","rowHeight","topRow","floor","bottomRow","ceil","offset","getCachedItem","render","overscanCount","dataTestId","width","getItemData","getOuterElement","getInnerElement","DEFAULT_ROW_HEIGHT","DEFAULT_OVERSCAN","undefined"],"mappings":"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","sourcesContent":["import React, { PureComponent } from 'react';\nimport memoize from 'memoizee';\nimport {\n FixedSizeList as List,\n ListOnItemsRenderedProps,\n ListOnScrollProps,\n} from 'react-window';\nimport AutoSizer, { Size } from 'react-virtualized-auto-sizer';\nimport Log from '@deephaven/log';\nimport { RangeUtils, Range } from '@deephaven/utils';\nimport ItemListItem from './ItemListItem';\nimport { ContextActionUtils } from './context-actions';\nimport './ItemList.scss';\n\nconst log = Log.module('ItemList');\n\nexport interface DefaultListItem {\n value?: string;\n displayValue?: string;\n}\n\nexport type RenderItemProps<T> = {\n item: T;\n itemIndex: number;\n isFocused: boolean;\n isSelected: boolean;\n style: React.CSSProperties;\n};\n\nexport type RenderItemFn<T> = (props: RenderItemProps<T>) => React.ReactNode;\n\nexport type ItemDragEventHandler = (\n index: number,\n event: React.DragEvent<HTMLDivElement>\n) => void;\n\nexport type ItemListProps<T> = {\n // Total item count\n itemCount: number;\n rowHeight: number;\n // Offset of the top item in the items array\n offset: number;\n // Item object format expected by the default renderItem function\n // Can be anything as long as it's supported by the renderItem\n // Default renderItem will look for a `displayValue` property, fallback\n // to the `value` property, or stringify the object if neither are defined\n items: T[];\n // Whether clicking a selected item should deselect in the item list or not. Defaults to true\n isDeselectOnClick: boolean;\n // Whether selection requires a double click or not\n isDoubleClickSelect: boolean;\n // Whether to allow dragging to change the selection after clicking\n isDragSelect: boolean;\n // Whether to allow multiple selections in this item list\n isMultiSelect: boolean;\n // Set to true if you want the list to scroll when new items are added and it's already at the bottom\n isStickyBottom: boolean;\n // Fired when an item gets focused\n onFocusChange(index: number | null): void;\n\n // Fired when an item is clicked. With multiple selection, fired on double click.\n onSelect(index: number, event: React.SyntheticEvent): void;\n onSelectionChange(ranges: Range[]): void;\n onViewportChange(topRow: number, bottomRow: number): void;\n overscanCount: number;\n selectedRanges: Range[];\n disableSelect: boolean;\n renderItem: RenderItemFn<T>;\n focusSelector: string;\n 'data-testid'?: string;\n};\n\ntype ItemListState = {\n focusIndex: number | null;\n mouseDownIndex: number | null;\n selectedRanges: Range[];\n overscanStartIndex: number;\n height: number | null;\n isDragging: boolean;\n isStuckToBottom: boolean;\n scrollOffset: number | null;\n};\n\n/**\n * Show items in a long scrollable list.\n * Can be navigated via keyboard or mouse.\n */\nexport class ItemList<T> extends PureComponent<\n ItemListProps<T>,\n ItemListState\n> {\n static CACHE_SIZE = 1000;\n\n static DEFAULT_ROW_HEIGHT = 20;\n\n // By drawing an additional 10 items on each side, tab/keyboard navigation works better (as the next element exists)\n static DEFAULT_OVERSCAN = 10;\n\n static defaultProps = {\n offset: 0,\n items: [],\n rowHeight: ItemList.DEFAULT_ROW_HEIGHT,\n\n isDeselectOnClick: true,\n\n isDoubleClickSelect: false,\n\n isDragSelect: true,\n\n isMultiSelect: false,\n\n isStickyBottom: false,\n\n disableSelect: false,\n\n onFocusChange(): void {\n // no-op\n },\n onSelect(): void {\n // no-op\n },\n onSelectionChange(): void {\n // no-op\n },\n onViewportChange(): void {\n // no-op\n },\n\n overscanCount: ItemList.DEFAULT_OVERSCAN,\n\n renderItem: ItemList.renderItem,\n selectedRanges: [],\n\n focusSelector: '.item-list-item',\n\n 'data-testid': undefined,\n };\n\n static renderItem<P extends DefaultListItem>({\n item,\n }: RenderItemProps<P>): JSX.Element {\n return (\n <div className=\"item-list-item-content\">\n {item && (item.displayValue || item.value || `${item}`)}\n </div>\n );\n }\n\n constructor(props: ItemListProps<T>) {\n super(props);\n\n this.handleItemBlur = this.handleItemBlur.bind(this);\n this.handleItemContextMenu = this.handleItemContextMenu.bind(this);\n this.handleItemFocus = this.handleItemFocus.bind(this);\n this.handleItemDoubleClick = this.handleItemDoubleClick.bind(this);\n this.handleItemMouseDown = this.handleItemMouseDown.bind(this);\n this.handleItemMouseMove = this.handleItemMouseMove.bind(this);\n this.handleItemMouseUp = this.handleItemMouseUp.bind(this);\n this.handleItemsRendered = this.handleItemsRendered.bind(this);\n this.handleWindowMouseUp = this.handleWindowMouseUp.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleScroll = this.handleScroll.bind(this);\n this.handleResize = this.handleResize.bind(this);\n this.renderInnerElement = this.renderInnerElement.bind(this);\n\n this.list = React.createRef();\n this.listContainer = React.createRef();\n\n const { isStickyBottom, selectedRanges } = props;\n\n this.state = {\n focusIndex: null,\n mouseDownIndex: null,\n selectedRanges,\n overscanStartIndex: 0,\n height: null,\n isDragging: false,\n isStuckToBottom: isStickyBottom,\n scrollOffset: null,\n };\n }\n\n componentDidMount(): void {\n const { isStickyBottom } = this.props;\n if (isStickyBottom && !this.isListAtBottom()) {\n this.scrollToBottom();\n }\n }\n\n componentDidUpdate(\n prevProps: ItemListProps<T>,\n prevState: ItemListState\n ): void {\n const { selectedRanges: propSelectedRanges } = this.props;\n const {\n focusIndex,\n isStuckToBottom,\n scrollOffset,\n height,\n selectedRanges,\n } = this.state;\n if (isStuckToBottom && !this.isListAtBottom()) {\n this.scrollToBottom();\n }\n\n if (\n scrollOffset !== prevState.scrollOffset ||\n height !== prevState.height\n ) {\n this.sendViewportUpdate();\n }\n\n if (\n propSelectedRanges !== prevProps.selectedRanges &&\n propSelectedRanges !== selectedRanges\n ) {\n this.setSelectedRanges(propSelectedRanges);\n } else if (selectedRanges !== prevState.selectedRanges) {\n const { onSelectionChange } = this.props;\n onSelectionChange(selectedRanges);\n }\n\n if (focusIndex !== prevState.focusIndex) {\n const { onFocusChange } = this.props;\n onFocusChange(focusIndex);\n }\n }\n\n componentWillUnmount(): void {\n window.removeEventListener('mouseup', this.handleWindowMouseUp);\n }\n\n list: React.RefObject<List>;\n\n listContainer: React.RefObject<HTMLDivElement>;\n\n getItemSelected = memoize(\n (index: number, selectedRanges: Range[]) =>\n RangeUtils.isSelected(selectedRanges, index),\n { max: ItemList.CACHE_SIZE }\n );\n\n getCachedItem = memoize(\n (\n itemIndex: number,\n key: number,\n item: T,\n isFocused: boolean,\n isSelected: boolean,\n renderItem: RenderItemFn<T>,\n style: React.CSSProperties,\n disableSelect: boolean\n ) => {\n const content = renderItem({\n item,\n itemIndex,\n isFocused,\n isSelected,\n style,\n });\n\n return (\n <ItemListItem\n onContextMenu={this.handleItemContextMenu}\n onDoubleClick={this.handleItemDoubleClick}\n onMouseDown={this.handleItemMouseDown}\n onFocus={this.handleItemFocus}\n onBlur={this.handleItemBlur}\n disableSelect={disableSelect}\n onMouseMove={this.handleItemMouseMove}\n onMouseUp={this.handleItemMouseUp}\n isFocused={isFocused}\n isSelected={isSelected}\n itemIndex={itemIndex}\n style={style}\n key={key}\n >\n {content}\n </ItemListItem>\n );\n },\n { max: ItemList.CACHE_SIZE }\n );\n\n getOuterElement = memoize((onKeyDown: React.KeyboardEventHandler) => {\n const component = React.forwardRef<HTMLDivElement>((props, ref) => (\n // We need to add the tabIndex to make sure it is focusable, otherwise we can't get key events\n <div\n ref={ref}\n tabIndex={-1}\n onKeyDown={onKeyDown}\n role=\"presentation\"\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n />\n ));\n component.displayName = 'ItemListOuterElement';\n return component;\n });\n\n getInnerElement = memoize(() => {\n const component = React.forwardRef<HTMLDivElement>((props, ref) => (\n <div\n className=\"item-list-inner-element\"\n ref={ref}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n />\n ));\n component.displayName = 'ItemListInnerElement';\n return component;\n });\n\n getItemData = memoize(\n (items: T[], selectedRanges: Range[], renderItem: RenderItemFn<T>) => ({\n items,\n selectedRanges,\n renderItem,\n })\n );\n\n focus(): void {\n this.listContainer.current?.focus();\n }\n\n getElement(itemIndex: number): Element | null {\n if (this.listContainer.current == null) {\n return null;\n }\n\n const { focusSelector } = this.props;\n const { overscanStartIndex } = this.state;\n const elements = this.listContainer.current.querySelectorAll(focusSelector);\n const elementIndex = itemIndex - overscanStartIndex;\n return elements[elementIndex];\n }\n\n focusItem(itemIndex: number): void {\n const { disableSelect } = this.props;\n if (disableSelect) return;\n\n this.setState({ focusIndex: itemIndex });\n\n const element = this.getElement(itemIndex);\n if (element instanceof HTMLElement) {\n element.focus();\n }\n }\n\n scrollToItem(itemIndex: number): void {\n const element = this.getElement(itemIndex);\n if (element != null) {\n element.scrollIntoView({ block: 'center' });\n }\n }\n\n handleItemContextMenu(\n itemIndex: number,\n e: React.MouseEvent<HTMLDivElement>\n ): void {\n // Update the selection, but don't consume the mouse event - it will trigger the context menu\n const { selectedRanges } = this.state;\n const isSelected = RangeUtils.isSelected(selectedRanges, itemIndex);\n\n // When right-clicking, we want to maintain the current selection if the right click happened within the selection even if the modifier key isn't down\n const isModifierDown =\n isSelected || ContextActionUtils.isModifierKeyDown(e);\n this.toggleSelect(itemIndex, e.shiftKey, isModifierDown, false);\n }\n\n handleItemDoubleClick(itemIndex: number, e: React.MouseEvent): void {\n const { isDoubleClickSelect, onSelect } = this.props;\n\n if (isDoubleClickSelect) {\n this.setState(\n ({ selectedRanges }) => ({\n selectedRanges: RangeUtils.selectRange(selectedRanges, [\n itemIndex,\n itemIndex,\n ]),\n }),\n () => {\n onSelect(itemIndex, e);\n }\n );\n }\n }\n\n handleItemMouseDown(index: number, e: React.MouseEvent): void {\n const { selectedRanges } = this.state;\n\n if (\n e.target instanceof HTMLElement &&\n ['button', 'select', 'input', 'textarea'].indexOf(\n e.target.tagName.toLowerCase()\n ) !== -1\n ) {\n // allow these elements to do their own behaviours\n return;\n }\n\n if (e.button === 2 && selectedRanges.length === 0) {\n // allow right click to act as a selection if selection is empty\n this.focusItem(index);\n this.selectItem(index);\n return;\n }\n\n if (e.button != null && e.button !== 0) {\n return;\n }\n\n this.setState({ mouseDownIndex: index });\n\n window.addEventListener('mouseup', this.handleWindowMouseUp);\n\n // Leave selection until mouse up, to allow for dragging behaviour\n }\n\n handleItemBlur(itemIndex: number, e: React.FocusEvent): void {\n log.debug2('item blur', itemIndex, e.currentTarget, e.relatedTarget);\n if (\n !e.relatedTarget ||\n (this.listContainer.current &&\n e.relatedTarget instanceof HTMLElement &&\n !this.listContainer.current.contains(e.relatedTarget))\n ) {\n // Next focused element is outside of the ItemList\n this.setState({ focusIndex: null });\n }\n }\n\n handleItemFocus(itemIndex: number, e: React.FocusEvent): void {\n log.debug2('item focus', itemIndex, e.target);\n this.setState(state => {\n const { focusIndex } = state;\n if (focusIndex !== itemIndex) {\n return { focusIndex: itemIndex };\n }\n return null;\n });\n }\n\n handleItemMouseMove(itemIndex: number, e: React.MouseEvent): void {\n const { isDragSelect, isMultiSelect, disableSelect } = this.props;\n const { mouseDownIndex, selectedRanges } = this.state;\n\n if (mouseDownIndex == null || disableSelect) return;\n\n this.setState({ isDragging: true });\n\n if (isDragSelect || mouseDownIndex === itemIndex) {\n this.focusItem(itemIndex);\n\n if (isMultiSelect) {\n if (\n !isDragSelect &&\n !this.getItemSelected(itemIndex, selectedRanges) &&\n !ContextActionUtils.isModifierKeyDown(e)\n ) {\n // If there's already a selection and they select outside of that range while dragging without a modifier key, start a new selection with just the new item\n this.deselectAll();\n }\n this.selectRange([\n Math.min(mouseDownIndex, itemIndex),\n Math.max(mouseDownIndex, itemIndex),\n ]);\n } else {\n this.toggleSelect(\n itemIndex,\n e.shiftKey,\n ContextActionUtils.isModifierKeyDown(e),\n false\n );\n }\n }\n }\n\n handleItemMouseUp(index: number, e: React.MouseEvent): void {\n const { isDeselectOnClick, isDoubleClickSelect, onSelect } = this.props;\n const { mouseDownIndex, isDragging } = this.state;\n\n if (\n e.target instanceof HTMLElement &&\n ['button', 'select', 'input', 'textarea'].indexOf(\n e.target.tagName.toLowerCase()\n ) !== -1\n ) {\n return;\n }\n\n if (mouseDownIndex === index && !isDragging) {\n const isShiftDown = e.shiftKey;\n const isModifierDown = ContextActionUtils.isModifierKeyDown(e);\n this.focusItem(index);\n this.toggleSelect(index, isShiftDown, isModifierDown, isDeselectOnClick);\n\n if (!isDoubleClickSelect && !isShiftDown && !isModifierDown) {\n onSelect(index, e);\n }\n }\n\n this.resetMouseState();\n }\n\n handleItemsRendered({ overscanStartIndex }: ListOnItemsRenderedProps): void {\n this.setState({ overscanStartIndex });\n }\n\n handleResize({ height }: Size): void {\n this.setState({ height });\n }\n\n handleMouseLeave(): void {\n this.setState({ mouseDownIndex: null });\n }\n\n handleWindowMouseUp(): void {\n this.resetMouseState();\n window.removeEventListener('mouseup', this.handleWindowMouseUp);\n }\n\n handleKeyDown(e: React.KeyboardEvent): void {\n const { isMultiSelect, itemCount, onSelect } = this.props;\n const { focusIndex: oldFocus } = this.state;\n let newFocus = oldFocus;\n\n if (e.key === 'Enter' || e.key === ' ') {\n if (!isMultiSelect && newFocus != null) {\n this.setState({ selectedRanges: [[newFocus, newFocus]] }, () => {\n if (newFocus != null) {\n onSelect(newFocus, e);\n }\n });\n }\n return;\n }\n\n if (e.key === 'ArrowUp') {\n if (newFocus != null && newFocus >= 0) {\n newFocus = Math.max(0, newFocus - 1);\n } else {\n newFocus = itemCount - 1;\n }\n } else if (e.key === 'ArrowDown') {\n if (newFocus != null && newFocus >= 0) {\n newFocus = Math.min(newFocus + 1, itemCount - 1);\n } else {\n newFocus = 0;\n }\n } else {\n return;\n }\n\n if (oldFocus !== newFocus) {\n e.stopPropagation();\n e.preventDefault();\n\n this.focusItem(newFocus);\n\n const { selectedRanges } = this.state;\n if (e.shiftKey && selectedRanges.length > 0) {\n const lastRange = selectedRanges[selectedRanges.length - 1];\n this.selectRange([\n Math.min(newFocus, lastRange[0]),\n Math.max(newFocus, lastRange[1]),\n ]);\n } else {\n this.deselectAll();\n if (newFocus !== null) {\n this.selectItem(newFocus);\n } else {\n this.listContainer.current?.focus();\n }\n }\n\n this.scrollIntoView(newFocus);\n }\n }\n\n handleScroll({\n scrollUpdateWasRequested,\n scrollOffset,\n }: ListOnScrollProps): void {\n this.setState(state => {\n if (scrollUpdateWasRequested) {\n // The scroll was caused by scrollTo() or scrollToItem()\n // Don't re-calc isStuckToBottom\n return { scrollOffset } as ItemListState;\n }\n\n const { isStickyBottom } = this.props;\n const { height } = state;\n\n const isStuckToBottom =\n isStickyBottom && this.isListAtBottom({ scrollOffset, height });\n return { isStuckToBottom, scrollOffset } as ItemListState;\n });\n }\n\n resetMouseState(): void {\n this.setState({ mouseDownIndex: null, isDragging: false });\n }\n\n scrollToBottom(): void {\n const { itemCount } = this.props;\n if (this.list.current) {\n this.list.current.scrollToItem(itemCount);\n }\n }\n\n scrollIntoView(itemIndex: number): void {\n if (this.list.current) {\n this.list.current.scrollToItem(itemIndex);\n }\n }\n\n /**\n * @param index The index to toggle selection for\n * @param isShiftDown True if the shift modifier key is down\n * @param isModifierDown True if the meta modifier key is down\n * @param isDeselectable True if item should be deselected if already selected\n */\n toggleSelect(\n index: number,\n isShiftDown: boolean,\n isModifierDown: boolean,\n isDeselectable = true\n ): void {\n const { isMultiSelect } = this.props;\n const { selectedRanges } = this.state;\n\n if (isMultiSelect && isShiftDown && selectedRanges.length > 0) {\n const lastRange = selectedRanges[selectedRanges.length - 1];\n this.selectRange([\n Math.min(lastRange[0], index),\n Math.max(index, lastRange[1]),\n ]);\n } else if (\n isMultiSelect &&\n selectedRanges.length === 1 &&\n selectedRanges[0][0] === index &&\n selectedRanges[0][1] === index\n ) {\n if (isDeselectable) {\n this.deselectItem(index);\n }\n } else if (isMultiSelect && isModifierDown) {\n if (this.getItemSelected(index, selectedRanges)) {\n if (isDeselectable) {\n this.deselectItem(index);\n }\n } else {\n this.selectItem(index);\n }\n } else {\n this.deselectAll();\n this.selectItem(index);\n }\n }\n\n deselectAll(): void {\n const { itemCount } = this.props;\n this.deselectRange([0, itemCount]);\n }\n\n deselectItem(index: number): void {\n this.deselectRange([index, index]);\n }\n\n deselectRange(range: Range): void {\n RangeUtils.validateRange(range);\n\n this.setState(({ selectedRanges }) => ({\n selectedRanges: RangeUtils.deselectRange(selectedRanges, range),\n }));\n }\n\n selectItem(index: number): void {\n const { disableSelect } = this.props;\n if (disableSelect) return;\n\n this.selectRange([index, index]);\n }\n\n selectRange(range: Range): void {\n RangeUtils.validateRange(range);\n\n this.setState(({ selectedRanges }) => ({\n selectedRanges: RangeUtils.selectRange(selectedRanges, range),\n }));\n }\n\n setSelectedRanges(selectedRanges: Range[]): void {\n this.setState({ selectedRanges });\n }\n\n sendViewportUpdate(): void {\n const { scrollOffset, height } = this.state;\n if (scrollOffset != null && height != null) {\n const { onViewportChange, rowHeight } = this.props;\n const topRow = Math.floor(scrollOffset / rowHeight);\n const bottomRow = topRow + Math.ceil(height / rowHeight);\n onViewportChange(topRow, bottomRow);\n }\n }\n\n isListAtBottom(\n {\n scrollOffset,\n height,\n }: Pick<ItemListState, 'scrollOffset' | 'height'> = this.state\n ): boolean {\n if (height == null || scrollOffset == null) {\n return false;\n }\n\n const { itemCount, rowHeight } = this.props;\n return scrollOffset + height >= itemCount * rowHeight;\n }\n\n renderInnerElement({\n index: itemIndex,\n style,\n }: {\n index: number;\n style: React.CSSProperties;\n }): React.ReactElement | null {\n const { items, offset, renderItem, disableSelect } = this.props;\n const { focusIndex, selectedRanges } = this.state;\n if (itemIndex < offset || itemIndex >= offset + items.length) {\n return null;\n }\n\n const item = items[itemIndex - offset];\n return this.getCachedItem(\n itemIndex,\n itemIndex,\n item,\n itemIndex === focusIndex && !disableSelect,\n this.getItemSelected(itemIndex, selectedRanges),\n renderItem,\n style,\n disableSelect\n );\n }\n\n render(): JSX.Element {\n const {\n items,\n itemCount,\n overscanCount,\n renderItem,\n rowHeight,\n 'data-testid': dataTestId,\n } = this.props;\n const { selectedRanges } = this.state;\n return (\n <AutoSizer className=\"item-list-auto-sizer\" onResize={this.handleResize}>\n {({ width, height }) => (\n <List\n className=\"item-list-scroll-pane\"\n height={height}\n width={width}\n itemCount={itemCount}\n itemSize={rowHeight}\n // This prop isn't actually used by us, it is passed to the render function by react-window\n // Used here to force a re-render of the List component.\n // Otherwise it doesn't know to call the render again when selection or renderItem changes\n itemData={this.getItemData(items, selectedRanges, renderItem)}\n onScroll={this.handleScroll}\n onItemsRendered={this.handleItemsRendered}\n ref={this.list}\n outerElementType={this.getOuterElement(this.handleKeyDown)}\n outerRef={this.listContainer}\n innerElementType={this.getInnerElement()}\n overscanCount={overscanCount}\n data-testid={dataTestId}\n >\n {this.renderInnerElement}\n </List>\n )}\n </AutoSizer>\n );\n }\n}\n\nexport default ItemList;\n"],"file":"ItemList.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"ItemListItem.js","names":["React","Component","classNames","Log","log","module","ItemListItem","handleKeyDown","constructor","props","handleBlur","bind","handleFocus","handleClick","handleContextMenu","handleDragStart","handleDrag","handleDragOver","handleDragEnd","handleDrop","handleDoubleClick","handleMouseDown","handleMouseMove","handleMouseUp","itemRef","createRef","e","itemIndex","onBlur","onFocus","onClick","onContextMenu","onDragStart","onDrag","preventDefault","onDragOver","onDragEnd","onDrop","onDoubleClick","onMouseMove","onMouseDown","onMouseUp","render","isDraggable","isFocused","isSelected","style","children","dataTestId","active","disableSelect","undefined"],"sources":["../src/ItemListItem.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport classNames from 'classnames';\nimport './ItemListItem.scss';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('ItemListItem');\n\ninterface ItemListItemProps {\n isDraggable: boolean;\n isFocused: boolean;\n isSelected: boolean;\n itemIndex: number;\n disableSelect: boolean;\n onBlur(index: number, e: React.FocusEvent<HTMLDivElement>): void;\n onClick(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onContextMenu(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrag(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDoubleClick(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onFocus(index: number, e: React.FocusEvent<HTMLDivElement>): void;\n onMouseDown(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onMouseMove(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onMouseUp(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n style: React.CSSProperties;\n children: React.ReactNode;\n 'data-testid'?: string;\n}\n\nclass ItemListItem extends Component<ItemListItemProps, Record<string, never>> {\n static defaultProps = {\n children: null,\n isDraggable: false,\n isFocused: false,\n isSelected: false,\n itemIndex: 0,\n disableSelect: false,\n 'data-testid': undefined,\n\n onBlur(): void {\n // no-op\n },\n onClick(): void {\n // no-op\n },\n onContextMenu(): void {\n // no-op\n },\n onDragStart(): void {\n // no-op\n },\n onDrag(): void {\n // no-op\n },\n onDragOver(): void {\n // no-op\n },\n onDragEnd(): void {\n // no-op\n },\n onDrop(): void {\n // no-op\n },\n onDoubleClick(): void {\n // no-op\n },\n onFocus(): void {\n // no-op\n },\n onMouseDown(): void {\n // no-op\n },\n onMouseMove(): void {\n // no-op\n },\n onMouseUp(): void {\n // no-op\n },\n style: {},\n };\n\n static handleKeyDown(): boolean {\n log.log('ItemListItem.handleKeyDown false');\n return false;\n }\n\n constructor(props: ItemListItemProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleDragStart = this.handleDragStart.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDragOver = this.handleDragOver.bind(this);\n this.handleDragEnd = this.handleDragEnd.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n this.handleDoubleClick = this.handleDoubleClick.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n\n this.itemRef = React.createRef();\n }\n\n itemRef: React.RefObject<HTMLDivElement>;\n\n handleBlur(e: React.FocusEvent<HTMLDivElement>): void {\n const { itemIndex, onBlur } = this.props;\n onBlur(itemIndex, e);\n }\n\n handleFocus(e: React.FocusEvent<HTMLDivElement>): void {\n const { itemIndex, onFocus } = this.props;\n onFocus(itemIndex, e);\n }\n\n handleClick(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onClick } = this.props;\n onClick(itemIndex, e);\n }\n\n handleContextMenu(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onContextMenu } = this.props;\n onContextMenu(itemIndex, e);\n }\n\n handleDragStart(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDragStart } = this.props;\n onDragStart(itemIndex, e);\n }\n\n handleDrag(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDrag } = this.props;\n onDrag(itemIndex, e);\n }\n\n handleDragOver(e: React.DragEvent<HTMLDivElement>): void {\n // Have to call preventDefault otherwise onDrop won't get triggered\n e.preventDefault();\n const { itemIndex, onDragOver } = this.props;\n onDragOver(itemIndex, e);\n }\n\n handleDragEnd(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDragEnd } = this.props;\n onDragEnd(itemIndex, e);\n }\n\n handleDrop(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDrop } = this.props;\n onDrop(itemIndex, e);\n }\n\n handleDoubleClick(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onDoubleClick } = this.props;\n onDoubleClick(itemIndex, e);\n }\n\n handleMouseMove(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onMouseMove } = this.props;\n onMouseMove(itemIndex, e);\n }\n\n handleMouseDown(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onMouseDown } = this.props;\n onMouseDown(itemIndex, e);\n }\n\n handleMouseUp(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onMouseUp } = this.props;\n onMouseUp(itemIndex, e);\n }\n\n render(): JSX.Element {\n const {\n isDraggable,\n isFocused,\n isSelected,\n style,\n children,\n 'data-testid': dataTestId,\n } = this.props;\n return (\n <div\n className={classNames(\n 'item-list-item',\n { active: isSelected },\n { 'is-focused': isFocused },\n { 'is-draggable': isDraggable }\n )}\n onKeyDown={ItemListItem.handleKeyDown}\n onContextMenu={this.handleContextMenu}\n onClick={this.handleClick}\n onDrag={this.handleDrag}\n onDragStart={this.handleDragStart}\n onDragOver={this.handleDragOver}\n onDragEnd={this.handleDragEnd}\n onDrop={this.handleDrop}\n onDoubleClick={this.handleDoubleClick}\n onMouseDown={this.handleMouseDown}\n onMouseMove={this.handleMouseMove}\n onMouseUp={this.handleMouseUp}\n tabIndex={-1}\n ref={this.itemRef}\n role=\"presentation\"\n style={style}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n draggable={isDraggable}\n data-testid={dataTestId}\n >\n {children}\n </div>\n );\n }\n}\n\nexport default ItemListItem;\n"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/ItemListItem.tsx"],"names":["React","Component","classNames","Log","log","module","ItemListItem","handleKeyDown","constructor","props","handleBlur","bind","handleFocus","handleClick","handleContextMenu","handleDragStart","handleDrag","handleDragOver","handleDragEnd","handleDrop","handleDoubleClick","handleMouseDown","handleMouseMove","handleMouseUp","itemRef","createRef","e","itemIndex","onBlur","onFocus","onClick","onContextMenu","onDragStart","onDrag","preventDefault","onDragOver","onDragEnd","onDrop","onDoubleClick","onMouseMove","onMouseDown","onMouseUp","render","isDraggable","isFocused","isSelected","style","children","dataTestId","active","disableSelect","undefined"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport classNames from 'classnames';\nimport './ItemListItem.scss';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('ItemListItem');\n\ninterface ItemListItemProps {\n isDraggable: boolean;\n isFocused: boolean;\n isSelected: boolean;\n itemIndex: number;\n disableSelect: boolean;\n onBlur(index: number, e: React.FocusEvent<HTMLDivElement>): void;\n onClick(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onContextMenu(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrag(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDoubleClick(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onFocus(index: number, e: React.FocusEvent<HTMLDivElement>): void;\n onMouseDown(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onMouseMove(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onMouseUp(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n style: React.CSSProperties;\n children: React.ReactNode;\n 'data-testid'?: string;\n}\n\nclass ItemListItem extends Component<ItemListItemProps, Record<string, never>> {\n static defaultProps = {\n children: null,\n isDraggable: false,\n isFocused: false,\n isSelected: false,\n itemIndex: 0,\n disableSelect: false,\n 'data-testid': undefined,\n\n onBlur(): void {\n // no-op\n },\n onClick(): void {\n // no-op\n },\n onContextMenu(): void {\n // no-op\n },\n onDragStart(): void {\n // no-op\n },\n onDrag(): void {\n // no-op\n },\n onDragOver(): void {\n // no-op\n },\n onDragEnd(): void {\n // no-op\n },\n onDrop(): void {\n // no-op\n },\n onDoubleClick(): void {\n // no-op\n },\n onFocus(): void {\n // no-op\n },\n onMouseDown(): void {\n // no-op\n },\n onMouseMove(): void {\n // no-op\n },\n onMouseUp(): void {\n // no-op\n },\n style: {},\n };\n\n static handleKeyDown(): boolean {\n log.log('ItemListItem.handleKeyDown false');\n return false;\n }\n\n constructor(props: ItemListItemProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleDragStart = this.handleDragStart.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDragOver = this.handleDragOver.bind(this);\n this.handleDragEnd = this.handleDragEnd.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n this.handleDoubleClick = this.handleDoubleClick.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n\n this.itemRef = React.createRef();\n }\n\n itemRef: React.RefObject<HTMLDivElement>;\n\n handleBlur(e: React.FocusEvent<HTMLDivElement>): void {\n const { itemIndex, onBlur } = this.props;\n onBlur(itemIndex, e);\n }\n\n handleFocus(e: React.FocusEvent<HTMLDivElement>): void {\n const { itemIndex, onFocus } = this.props;\n onFocus(itemIndex, e);\n }\n\n handleClick(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onClick } = this.props;\n onClick(itemIndex, e);\n }\n\n handleContextMenu(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onContextMenu } = this.props;\n onContextMenu(itemIndex, e);\n }\n\n handleDragStart(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDragStart } = this.props;\n onDragStart(itemIndex, e);\n }\n\n handleDrag(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDrag } = this.props;\n onDrag(itemIndex, e);\n }\n\n handleDragOver(e: React.DragEvent<HTMLDivElement>): void {\n // Have to call preventDefault otherwise onDrop won't get triggered\n e.preventDefault();\n const { itemIndex, onDragOver } = this.props;\n onDragOver(itemIndex, e);\n }\n\n handleDragEnd(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDragEnd } = this.props;\n onDragEnd(itemIndex, e);\n }\n\n handleDrop(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDrop } = this.props;\n onDrop(itemIndex, e);\n }\n\n handleDoubleClick(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onDoubleClick } = this.props;\n onDoubleClick(itemIndex, e);\n }\n\n handleMouseMove(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onMouseMove } = this.props;\n onMouseMove(itemIndex, e);\n }\n\n handleMouseDown(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onMouseDown } = this.props;\n onMouseDown(itemIndex, e);\n }\n\n handleMouseUp(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onMouseUp } = this.props;\n onMouseUp(itemIndex, e);\n }\n\n render(): JSX.Element {\n const {\n isDraggable,\n isFocused,\n isSelected,\n style,\n children,\n 'data-testid': dataTestId,\n } = this.props;\n return (\n <div\n className={classNames(\n 'item-list-item',\n { active: isSelected },\n { 'is-focused': isFocused },\n { 'is-draggable': isDraggable }\n )}\n onKeyDown={ItemListItem.handleKeyDown}\n onContextMenu={this.handleContextMenu}\n onClick={this.handleClick}\n onDrag={this.handleDrag}\n onDragStart={this.handleDragStart}\n onDragOver={this.handleDragOver}\n onDragEnd={this.handleDragEnd}\n onDrop={this.handleDrop}\n onDoubleClick={this.handleDoubleClick}\n onMouseDown={this.handleMouseDown}\n onMouseMove={this.handleMouseMove}\n onMouseUp={this.handleMouseUp}\n tabIndex={-1}\n ref={this.itemRef}\n role=\"presentation\"\n style={style}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n draggable={isDraggable}\n data-testid={dataTestId}\n >\n {children}\n </div>\n );\n }\n}\n\nexport default ItemListItem;\n"],"file":"ItemListItem.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"LoadingOverlay.js","names":["React","CSSTransition","classNames","FontAwesomeIcon","vsWarning","ThemeExport","LoadingSpinner","LoadingOverlay","isLoaded","isLoading","errorMessage","dataTestId","transitionMs"],"sources":["../src/LoadingOverlay.tsx"],"sourcesContent":["import React from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsWarning } from '@deephaven/icons';\nimport ThemeExport from './ThemeExport';\nimport LoadingSpinner from './LoadingSpinner';\nimport './LoadingOverlay.scss';\n\ntype LoadingOverlayProps = {\n isLoaded: boolean;\n isLoading: boolean;\n errorMessage: string | null;\n 'data-testid'?: string;\n};\n\n/**\n * A loading overlay that handles displaying a loading spinner or an error message\n */\nconst LoadingOverlay = ({\n isLoaded = false,\n isLoading = true,\n errorMessage = null,\n 'data-testid': dataTestId,\n}: LoadingOverlayProps): JSX.Element => (\n <CSSTransition\n in={!!errorMessage || !isLoaded || isLoading}\n timeout={ThemeExport.transitionMs}\n classNames={isLoaded ? 'fade' : ''}\n mountOnEnter\n unmountOnExit\n >\n <div className=\"fill-parent-absolute\" data-testid={dataTestId}>\n <div\n className={classNames(\n 'iris-panel-message-overlay',\n 'fill-parent-absolute',\n { 'iris-panel-scrim-background': isLoaded }\n )}\n >\n <div className=\"message-content\">\n <div className=\"message-icon\">\n {isLoading && <LoadingSpinner />}\n {!isLoading && errorMessage && <FontAwesomeIcon icon={vsWarning} />}\n </div>\n <div className=\"message-text\">{errorMessage}</div>\n </div>\n </div>\n </div>\n </CSSTransition>\n);\n\nexport default LoadingOverlay;\n"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,aAAT,QAA8B,wBAA9B;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SAASC,SAAT,QAA0B,kBAA1B;OACOC,W;OACAC,c;;;AAUP;AACA;AACA;AACA,IAAMC,cAAc,GAAG;EAAA,IAAC;IACtBC,QAAQ,GAAG,KADW;IAEtBC,SAAS,GAAG,IAFU;IAGtBC,YAAY,GAAG,IAHO;IAItB,eAAeC;EAJO,CAAD;EAAA,oBAMrB,oBAAC,aAAD;IACE,EAAE,EAAE,CAAC,CAACD,YAAF,IAAkB,CAACF,QAAnB,IAA+BC,SADrC;IAEE,OAAO,EAAEJ,WAAW,CAACO,YAFvB;IAGE,UAAU,EAAEJ,QAAQ,GAAG,MAAH,GAAY,EAHlC;IAIE,YAAY,MAJd;IAKE,aAAa;EALf,gBAOE;IAAK,SAAS,EAAC,sBAAf;IAAsC,eAAaG;EAAnD,gBACE;IACE,SAAS,EAAET,UAAU,CACnB,4BADmB,EAEnB,sBAFmB,EAGnB;MAAE,+BAA+BM;IAAjC,CAHmB;EADvB,gBAOE;IAAK,SAAS,EAAC;EAAf,gBACE;IAAK,SAAS,EAAC;EAAf,GACGC,SAAS,iBAAI,oBAAC,cAAD,OADhB,EAEG,CAACA,SAAD,IAAcC,YAAd,iBAA8B,oBAAC,eAAD;IAAiB,IAAI,EAAEN;EAAvB,EAFjC,CADF,eAKE;IAAK,SAAS,EAAC;EAAf,GAA+BM,YAA/B,CALF,CAPF,CADF,CAPF,CANqB;AAAA,CAAvB;;AAiCA,eAAeH,cAAf"}
1
+ {"version":3,"sources":["../src/LoadingOverlay.tsx"],"names":["React","CSSTransition","classNames","FontAwesomeIcon","vsWarning","ThemeExport","LoadingSpinner","LoadingOverlay","isLoaded","isLoading","errorMessage","dataTestId","transitionMs"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,aAAT,QAA8B,wBAA9B;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SAASC,SAAT,QAA0B,kBAA1B;OACOC,W;OACAC,c;;;AAUP;AACA;AACA;AACA,IAAMC,cAAc,GAAG;AAAA,MAAC;AACtBC,IAAAA,QAAQ,GAAG,KADW;AAEtBC,IAAAA,SAAS,GAAG,IAFU;AAGtBC,IAAAA,YAAY,GAAG,IAHO;AAItB,mBAAeC;AAJO,GAAD;AAAA,sBAMrB,oBAAC,aAAD;AACE,IAAA,EAAE,EAAE,CAAC,CAACD,YAAF,IAAkB,CAACF,QAAnB,IAA+BC,SADrC;AAEE,IAAA,OAAO,EAAEJ,WAAW,CAACO,YAFvB;AAGE,IAAA,UAAU,EAAEJ,QAAQ,GAAG,MAAH,GAAY,EAHlC;AAIE,IAAA,YAAY,MAJd;AAKE,IAAA,aAAa;AALf,kBAOE;AAAK,IAAA,SAAS,EAAC,sBAAf;AAAsC,mBAAaG;AAAnD,kBACE;AACE,IAAA,SAAS,EAAET,UAAU,CACnB,4BADmB,EAEnB,sBAFmB,EAGnB;AAAE,qCAA+BM;AAAjC,KAHmB;AADvB,kBAOE;AAAK,IAAA,SAAS,EAAC;AAAf,kBACE;AAAK,IAAA,SAAS,EAAC;AAAf,KACGC,SAAS,iBAAI,oBAAC,cAAD,OADhB,EAEG,CAACA,SAAD,IAAcC,YAAd,iBAA8B,oBAAC,eAAD;AAAiB,IAAA,IAAI,EAAEN;AAAvB,IAFjC,CADF,eAKE;AAAK,IAAA,SAAS,EAAC;AAAf,KAA+BM,YAA/B,CALF,CAPF,CADF,CAPF,CANqB;AAAA,CAAvB;;AAiCA,eAAeH,cAAf","sourcesContent":["import React from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsWarning } from '@deephaven/icons';\nimport ThemeExport from './ThemeExport';\nimport LoadingSpinner from './LoadingSpinner';\nimport './LoadingOverlay.scss';\n\ntype LoadingOverlayProps = {\n isLoaded: boolean;\n isLoading: boolean;\n errorMessage: string | null;\n 'data-testid'?: string;\n};\n\n/**\n * A loading overlay that handles displaying a loading spinner or an error message\n */\nconst LoadingOverlay = ({\n isLoaded = false,\n isLoading = true,\n errorMessage = null,\n 'data-testid': dataTestId,\n}: LoadingOverlayProps): JSX.Element => (\n <CSSTransition\n in={!!errorMessage || !isLoaded || isLoading}\n timeout={ThemeExport.transitionMs}\n classNames={isLoaded ? 'fade' : ''}\n mountOnEnter\n unmountOnExit\n >\n <div className=\"fill-parent-absolute\" data-testid={dataTestId}>\n <div\n className={classNames(\n 'iris-panel-message-overlay',\n 'fill-parent-absolute',\n { 'iris-panel-scrim-background': isLoaded }\n )}\n >\n <div className=\"message-content\">\n <div className=\"message-icon\">\n {isLoading && <LoadingSpinner />}\n {!isLoading && errorMessage && <FontAwesomeIcon icon={vsWarning} />}\n </div>\n <div className=\"message-text\">{errorMessage}</div>\n </div>\n </div>\n </div>\n </CSSTransition>\n);\n\nexport default LoadingOverlay;\n"],"file":"LoadingOverlay.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"LoadingSpinner.js","names":["React","classNames","FontAwesomeIcon","vsCircleLargeOutline","vsLoading","LoadingSpinner","className","dataTestId"],"sources":["../src/LoadingSpinner.tsx"],"sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsCircleLargeOutline, vsLoading } from '@deephaven/icons';\nimport './LoadingSpinner.scss';\n\ntype LoadingSpinnerProps = {\n className?: string;\n 'data-testid'?: string;\n};\n\nconst LoadingSpinner = ({\n className = '',\n 'data-testid': dataTestId,\n}: LoadingSpinnerProps): JSX.Element => (\n <div\n className={classNames('loading-spinner fa-layers', className)}\n data-testid={dataTestId}\n >\n <FontAwesomeIcon icon={vsCircleLargeOutline} className=\"text-white-50\" />\n <FontAwesomeIcon icon={vsLoading} className=\"text-primary\" spin />\n </div>\n);\n\nexport default LoadingSpinner;\n"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SAASC,oBAAT,EAA+BC,SAA/B,QAAgD,kBAAhD;;;AAQA,IAAMC,cAAc,GAAG;EAAA,IAAC;IACtBC,SAAS,GAAG,EADU;IAEtB,eAAeC;EAFO,CAAD;EAAA,oBAIrB;IACE,SAAS,EAAEN,UAAU,CAAC,2BAAD,EAA8BK,SAA9B,CADvB;IAEE,eAAaC;EAFf,gBAIE,oBAAC,eAAD;IAAiB,IAAI,EAAEJ,oBAAvB;IAA6C,SAAS,EAAC;EAAvD,EAJF,eAKE,oBAAC,eAAD;IAAiB,IAAI,EAAEC,SAAvB;IAAkC,SAAS,EAAC,cAA5C;IAA2D,IAAI;EAA/D,EALF,CAJqB;AAAA,CAAvB;;AAaA,eAAeC,cAAf"}
1
+ {"version":3,"sources":["../src/LoadingSpinner.tsx"],"names":["React","classNames","FontAwesomeIcon","vsCircleLargeOutline","vsLoading","LoadingSpinner","className","dataTestId"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SAASC,oBAAT,EAA+BC,SAA/B,QAAgD,kBAAhD;;;AAQA,IAAMC,cAAc,GAAG;AAAA,MAAC;AACtBC,IAAAA,SAAS,GAAG,EADU;AAEtB,mBAAeC;AAFO,GAAD;AAAA,sBAIrB;AACE,IAAA,SAAS,EAAEN,UAAU,CAAC,2BAAD,EAA8BK,SAA9B,CADvB;AAEE,mBAAaC;AAFf,kBAIE,oBAAC,eAAD;AAAiB,IAAA,IAAI,EAAEJ,oBAAvB;AAA6C,IAAA,SAAS,EAAC;AAAvD,IAJF,eAKE,oBAAC,eAAD;AAAiB,IAAA,IAAI,EAAEC,SAAvB;AAAkC,IAAA,SAAS,EAAC,cAA5C;AAA2D,IAAA,IAAI;AAA/D,IALF,CAJqB;AAAA,CAAvB;;AAaA,eAAeC,cAAf","sourcesContent":["import React from 'react';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsCircleLargeOutline, vsLoading } from '@deephaven/icons';\nimport './LoadingSpinner.scss';\n\ntype LoadingSpinnerProps = {\n className?: string;\n 'data-testid'?: string;\n};\n\nconst LoadingSpinner = ({\n className = '',\n 'data-testid': dataTestId,\n}: LoadingSpinnerProps): JSX.Element => (\n <div\n className={classNames('loading-spinner fa-layers', className)}\n data-testid={dataTestId}\n >\n <FontAwesomeIcon icon={vsCircleLargeOutline} className=\"text-white-50\" />\n <FontAwesomeIcon icon={vsLoading} className=\"text-primary\" spin />\n </div>\n);\n\nexport default LoadingSpinner;\n"],"file":"LoadingSpinner.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"MaskedInput.d.ts","sourceRoot":"","sources":["../src/MaskedInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAIlD,OAAO,oBAAoB,CAAC;AAI5B,QAAA,MAAM,mBAAmB;;;;CAIf,CAAC;AAQX,wBAAgB,wCAAwC,CACtD,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,MAAM,CAMR;AAED,oBAAY,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,mBAAmB,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;CACnF,CAAC;AAEF,aAAK,gBAAgB,GAAG;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,2IAA2I;IAC3I,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,iDAAiD;IACjD,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oCAAoC;IACpC,QAAQ,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3C,qDAAqD;IACrD,mBAAmB,CAAC,CAClB,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC;IACV,6BAA6B,CAAC,CAC5B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAClC,MAAM,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAEjC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AAIH,QAAA,MAAM,WAAW,2FAiahB,CAAC;AAsBF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"MaskedInput.d.ts","sourceRoot":"","sources":["../src/MaskedInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAI/D,OAAO,oBAAoB,CAAC;AAI5B,QAAA,MAAM,mBAAmB;;;;CAIf,CAAC;AAQX,wBAAgB,wCAAwC,CACtD,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GACd,MAAM,CAMR;AAED,oBAAY,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,mBAAmB,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;CACnF,CAAC;AAEF,aAAK,gBAAgB,GAAG;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,2IAA2I;IAC3I,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,iDAAiD;IACjD,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oCAAoC;IACpC,QAAQ,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3C,qDAAqD;IACrD,mBAAmB,CAAC,CAClB,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC;IACV,6BAA6B,CAAC,CAC5B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,GACnB,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAClC,MAAM,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAEjC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AAIH,QAAA,MAAM,WAAW,2FAubhB,CAAC;AAsBF,eAAe,WAAW,CAAC"}
@@ -1,4 +1,10 @@
1
- import React, { useMemo, useEffect } from 'react';
1
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
+
3
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
+
5
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+
7
+ import React, { useMemo, useEffect, useCallback } from 'react';
2
8
  import classNames from 'classnames';
3
9
  import Log from '@deephaven/log';
4
10
  import { useForwardedRef } from '@deephaven/react-hooks';
@@ -62,7 +68,7 @@ var MaskedInput = /*#__PURE__*/React.forwardRef((props, ref) => {
62
68
  * @param cursorPosition The current position of the cursor
63
69
  */
64
70
 
65
- function getSegment(cursorPosition) {
71
+ var getSegment = useCallback(cursorPosition => {
66
72
  var selectionStart = cursorPosition;
67
73
  var selectionEnd = cursorPosition;
68
74
  var testValue = examples.length > 0 ? examples[0] : value;
@@ -89,7 +95,7 @@ var MaskedInput = /*#__PURE__*/React.forwardRef((props, ref) => {
89
95
  selectionEnd,
90
96
  selectionDirection
91
97
  };
92
- }
98
+ }, [examples, value]);
93
99
  /**
94
100
  * Replaces all blank spaces and everything after the current cursor position with the example value
95
101
  * @param checkValue The value to check/fill in
@@ -98,7 +104,6 @@ var MaskedInput = /*#__PURE__*/React.forwardRef((props, ref) => {
98
104
  * @returns The filled in value
99
105
  */
100
106
 
101
-
102
107
  function fillValue(checkValue, exampleValue) {
103
108
  var cursorPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : checkValue.length;
104
109
  var filledValue = '';
@@ -187,7 +192,7 @@ var MaskedInput = /*#__PURE__*/React.forwardRef((props, ref) => {
187
192
  }
188
193
  }
189
194
 
190
- function handleSelect(event) {
195
+ var handleSelect = useCallback(event => {
191
196
  var {
192
197
  selectionStart = 0,
193
198
  selectionEnd = 0,
@@ -205,6 +210,15 @@ var MaskedInput = /*#__PURE__*/React.forwardRef((props, ref) => {
205
210
  return;
206
211
  }
207
212
 
213
+ if (selection != null && selectionStart === value.length && selectionEnd === value.length && event.nativeEvent.type !== 'mouseup') {
214
+ // React triggers onSelect event with the cursor at the end of the input content
215
+ // when the component is rendered at a different location in the DOM,
216
+ // i.e. when start/end times switch places in the TimeSlider.
217
+ // Ignore this event and reset the selection to its previous state.
218
+ onSelect(_objectSpread({}, selection));
219
+ return;
220
+ }
221
+
208
222
  if (selectionStart === selectionEnd) {
209
223
  var newSelection = getSegment(selectionStart);
210
224
  log.debug('Selection segment from ', selectionStart, selectionEnd, '=>', newSelection);
@@ -216,9 +230,8 @@ var MaskedInput = /*#__PURE__*/React.forwardRef((props, ref) => {
216
230
  selectionDirection
217
231
  });
218
232
  }
219
- }
220
-
221
- function handleSelectCapture(event) {
233
+ }, [getSegment, onSelect, selection, value]);
234
+ var handleSelectCapture = useCallback(event => {
222
235
  if (!input.current) {
223
236
  return;
224
237
  }
@@ -230,7 +243,7 @@ var MaskedInput = /*#__PURE__*/React.forwardRef((props, ref) => {
230
243
  event.preventDefault();
231
244
  event.stopPropagation();
232
245
  }
233
- }
246
+ }, [input, selection, value]);
234
247
 
235
248
  function handleArrowKey(event) {
236
249
  event.preventDefault();
@@ -1 +1 @@
1
- {"version":3,"file":"MaskedInput.js","names":["React","useMemo","useEffect","classNames","Log","useForwardedRef","log","module","SELECTION_DIRECTION","FORWARD","BACKWARD","NONE","FIXED_WIDTH_SPACE","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","value","replaceIndex","newChar","substring","MaskedInput","forwardRef","props","ref","className","example","getNextSegmentValue","range","delta","segmentValue","getPreferredReplacementString","onChange","onSelect","pattern","selection","onFocus","onBlur","dataTestId","input","examples","Array","isArray","setSelectedSegment","debug","selectionStart","selectionEnd","selectionDirection","current","setSelectionRange","getSegment","cursorPosition","testValue","length","i","test","charAt","fillValue","checkValue","exampleValue","filledValue","concat","isValid","patternRegex","RegExp","nextSegment","position","currentSegment","nextPosition","previousSegment","previousPosition","nextSegmentValue","segment","newSegmentValue","newValue","handleSelect","event","target","error","debug2","newSelection","handleSelectCapture","preventDefault","stopPropagation","handleArrowKey","key","handleKeyDown","startsWith","replace","altKey","metaKey","ctrlKey","newChars","from","Set","toUpperCase","toLowerCase","maxReplaceIndex","newSelectionStart","nextSegmentSelection","undefined","defaultProps"],"sources":["../src/MaskedInput.tsx"],"sourcesContent":["import React, { useMemo, useEffect } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { useForwardedRef } from '@deephaven/react-hooks';\nimport './MaskedInput.scss';\n\nconst log = Log.module('MaskedInput');\n\nconst SELECTION_DIRECTION = {\n FORWARD: 'forward',\n BACKWARD: 'backward',\n NONE: 'none',\n} as const;\n\n/**\n * Special space character that's the same size as tabular numbers\n * https://www.fileformat.info/info/unicode/char/2007/index.htm\n */\nconst FIXED_WIDTH_SPACE = '\\u2007';\n\nexport function DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n value: string,\n replaceIndex: number,\n newChar: string\n): string {\n return (\n value.substring(0, replaceIndex) +\n newChar +\n value.substring(replaceIndex + 1)\n );\n}\n\nexport type SelectionSegment = {\n selectionStart: number;\n selectionEnd: number;\n selectionDirection?: typeof SELECTION_DIRECTION[keyof typeof SELECTION_DIRECTION];\n};\n\ntype MaskedInputProps = {\n /** An extra class name to add to the component */\n className?: string;\n /** The regex pattern this masked input must match */\n pattern: string;\n /** The current value to display */\n value: string;\n /** One or more examples of valid values. Used when deciding if next keystroke is valid (as rest of the current value may be incomplete) */\n example: string | string[];\n /** The current selection to use for the input */\n selection?: SelectionSegment;\n /** Called when the value changes. Note the value may still be incomplete. */\n onChange?(value: string): void;\n /** Called when selection changes */\n onSelect?(segment: SelectionSegment): void;\n /** Retrieve the next value for a provided segment */\n getNextSegmentValue?(\n segment: SelectionSegment,\n delta: number,\n segmentValue: string,\n value: string\n ): string;\n getPreferredReplacementString?(\n value: string,\n replaceIndex: number,\n replaceChar: string,\n selectionStart: number,\n selectionEnd: number\n ): string;\n onFocus?: React.FocusEventHandler;\n onBlur?: React.FocusEventHandler;\n\n 'data-testid'?: string;\n};\n\n/**\n * A masked input for entering data from a template.\n * Won't work by itself, must use within another component and handle updating the value/selection.\n */\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst MaskedInput = React.forwardRef<HTMLInputElement, MaskedInputProps>(\n (props: MaskedInputProps, ref) => {\n const {\n className,\n example,\n getNextSegmentValue = (range, delta, segmentValue) => segmentValue,\n getPreferredReplacementString = DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n onChange = () => false,\n onSelect = () => false,\n pattern,\n selection,\n value,\n onFocus = () => false,\n onBlur = () => false,\n 'data-testid': dataTestId,\n } = props;\n const input = useForwardedRef(ref);\n const examples = useMemo(\n () => (Array.isArray(example) ? example : [example]),\n [example]\n );\n\n useEffect(\n function setSelectedSegment() {\n if (selection != null) {\n log.debug('setting selection...', selection);\n const {\n selectionStart,\n selectionEnd,\n selectionDirection,\n } = selection;\n input.current?.setSelectionRange(\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n log.debug('selection set!');\n }\n },\n [selection, input]\n );\n\n /**\n * Returns the selection range for the segment at the given cursor position\n * @param cursorPosition The current position of the cursor\n */\n function getSegment(cursorPosition: number) {\n let selectionStart = cursorPosition;\n let selectionEnd = cursorPosition;\n const testValue = examples.length > 0 ? examples[0] : value;\n\n for (let i = selectionStart - 1; i >= 0; i -= 1) {\n if (!/[a-zA-Z0-9]/g.test(testValue.charAt(i))) {\n break;\n }\n\n selectionStart = i;\n }\n\n for (let i = selectionEnd; i < testValue.length; i += 1) {\n if (!/[a-zA-Z0-9]/g.test(testValue.charAt(i))) {\n break;\n }\n\n selectionEnd = i + 1;\n }\n\n const selectionDirection =\n selectionStart === selectionEnd\n ? SELECTION_DIRECTION.NONE\n : SELECTION_DIRECTION.BACKWARD;\n\n return {\n selectionStart,\n selectionEnd,\n selectionDirection,\n };\n }\n\n /**\n * Replaces all blank spaces and everything after the current cursor position with the example value\n * @param checkValue The value to check/fill in\n * @param exampleValue The example to fill in the value from\n * @param cursorPosition The cursor position\n * @returns The filled in value\n */\n function fillValue(\n checkValue: string,\n exampleValue: string,\n cursorPosition = checkValue.length\n ): string {\n let filledValue = '';\n for (let i = 0; i < cursorPosition; i += 1) {\n if (checkValue.charAt(i) !== FIXED_WIDTH_SPACE) {\n filledValue = filledValue.concat(checkValue[i]);\n } else {\n filledValue = filledValue.concat(exampleValue[i]);\n }\n }\n filledValue = filledValue.concat(exampleValue.substring(cursorPosition));\n\n return filledValue;\n }\n\n /**\n * Checks if a given `value` is valid up until the `cursorPosition`.\n * Uses the examples to build the rest of the string\n * @param checkValue The value to check validity of\n * @param cursorPosition The position of the cursor to check up to\n */\n function isValid(\n checkValue: string,\n cursorPosition = checkValue.length\n ): boolean {\n const patternRegex = new RegExp(pattern);\n if (patternRegex.test(checkValue)) {\n return true;\n }\n\n for (let i = 0; i < examples.length; i += 1) {\n const filledValue = fillValue(checkValue, examples[i], cursorPosition);\n if (patternRegex.test(filledValue)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns the next segment after the given position\n * @param position The cursor position to start at\n * @returns The new selection range\n */\n function nextSegment(position: number): SelectionSegment {\n const currentSegment = getSegment(position);\n const nextPosition = currentSegment.selectionEnd + 1;\n if (nextPosition >= value.length) {\n return currentSegment;\n }\n\n return getSegment(nextPosition);\n }\n\n /**\n * Returns the previous segment before the given position\n * @param position The cursor position to start at\n * @returns The new selection range\n */\n function previousSegment(position: number): SelectionSegment {\n const currentSegment = getSegment(position);\n const previousPosition = currentSegment.selectionStart - 1;\n if (previousPosition <= 0) {\n return currentSegment;\n }\n\n return getSegment(previousPosition);\n }\n\n function nextSegmentValue(position: number, delta: number): void {\n const segment = getSegment(position);\n const segmentValue = value.substring(\n segment.selectionStart,\n segment.selectionEnd\n );\n const newSegmentValue = getNextSegmentValue(\n segment,\n delta,\n segmentValue,\n value\n );\n const newValue =\n value.substring(0, segment.selectionStart) +\n newSegmentValue +\n value.substring(segment.selectionEnd);\n if (isValid(newValue, segment.selectionEnd)) {\n onChange(newValue);\n onSelect(segment);\n }\n }\n\n function handleSelect(event: React.UIEvent<HTMLInputElement>) {\n const {\n selectionStart = 0,\n selectionEnd = 0,\n selectionDirection = 'none',\n } = event.target as HTMLInputElement;\n\n if (\n selectionStart === null ||\n selectionEnd === null ||\n selectionDirection === null\n ) {\n log.error(\n 'Selection attempted on non-text input element',\n event.target\n );\n return;\n }\n\n log.debug2(\n 'handleSelect',\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n if (\n selection != null &&\n selectionStart === selection.selectionStart &&\n selectionEnd === selection.selectionEnd\n ) {\n return;\n }\n if (selectionStart === selectionEnd) {\n const newSelection = getSegment(selectionStart);\n log.debug(\n 'Selection segment from ',\n selectionStart,\n selectionEnd,\n '=>',\n newSelection\n );\n onSelect(newSelection);\n } else {\n onSelect({ selectionStart, selectionEnd, selectionDirection });\n }\n }\n\n function handleSelectCapture(event: React.UIEvent<HTMLInputElement>) {\n if (!input.current) {\n return;\n }\n log.debug('handleSelectCapture', event);\n const selectionStart = input.current.selectionStart || 0;\n if (\n selectionStart === value.length &&\n selection != null &&\n selectionStart !== selection.selectionStart\n ) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n function handleArrowKey(event: React.KeyboardEvent<HTMLInputElement>) {\n event.preventDefault();\n event.stopPropagation();\n\n if (!input.current) {\n return;\n }\n\n const { key } = event;\n const { selectionStart = 0, selectionEnd = 0 } = input.current;\n if (selectionStart === null || selectionEnd === null) {\n log.error(\n 'Selection arrow nvaigation attempted on non-text input element',\n event.target\n );\n return;\n }\n\n if (key === 'ArrowLeft') {\n onSelect(previousSegment(selectionStart));\n } else if (key === 'ArrowRight') {\n onSelect(nextSegment(selectionEnd));\n } else if (key === 'ArrowUp') {\n nextSegmentValue(selectionStart, -1);\n } else if (key === 'ArrowDown') {\n nextSegmentValue(selectionStart, 1);\n }\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (!input.current) {\n return;\n }\n log.debug('handleKeyDown', event);\n const { key } = event;\n const { selectionStart = 0, selectionEnd = 0 } = input.current;\n if (selectionStart === null || selectionEnd === null) {\n log.error(\n 'Selection key event on non-text input element',\n event.target\n );\n return;\n }\n\n if (key.startsWith('Arrow')) {\n handleArrowKey(event);\n return;\n }\n\n if (key === 'Delete' || key === 'Backspace') {\n event.preventDefault();\n event.stopPropagation();\n\n if (selectionStart !== selectionEnd) {\n // Replace all non-masked characters with blanks, set selection to start\n const newValue =\n value.substring(0, selectionStart) +\n value\n .substring(selectionStart, selectionEnd)\n .replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE) +\n value.substring(selectionEnd);\n log.debug(\n 'Range ',\n selectionStart,\n selectionEnd,\n 'deleted, setting value',\n newValue\n );\n\n onChange(newValue);\n onSelect({\n selectionStart,\n selectionEnd: selectionStart,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n } else if (selectionStart > 0) {\n for (let i = selectionStart - 1; i >= 0; i -= 1) {\n // Only replace non placeholder text\n const newValue =\n value.substring(0, i) +\n value\n .substring(i, selectionStart)\n .replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE) +\n value.substring(selectionStart);\n\n if (newValue !== value) {\n onChange(newValue);\n onSelect({\n selectionStart: i,\n selectionEnd: i,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n return;\n }\n }\n }\n\n return;\n }\n\n if (event.altKey || event.metaKey || event.ctrlKey || key.length > 1) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n // Get the different permutations of the character they entered, remove duplicates\n const newChars = Array.from(\n new Set([key, key.toUpperCase(), key.toLowerCase()])\n );\n for (let i = 0; i < newChars.length; i += 1) {\n const newChar = newChars[i];\n\n // If they're typing an alphanumeric character, be smart and allow it to jump ahead\n const maxReplaceIndex = /[a-zA-Z0-9]/g.test(newChar)\n ? value.length - 1\n : selectionStart;\n for (\n let replaceIndex = selectionStart;\n replaceIndex <= maxReplaceIndex;\n replaceIndex += 1\n ) {\n const newValue = getPreferredReplacementString(\n value,\n replaceIndex,\n newChar,\n selectionStart,\n selectionEnd\n );\n if (isValid(newValue, replaceIndex + 1)) {\n const currentSegment = getSegment(replaceIndex);\n const newSelectionStart = replaceIndex + 1;\n let newSelection: SelectionSegment = {\n selectionStart: newSelectionStart,\n selectionEnd: newSelectionStart,\n selectionDirection: SELECTION_DIRECTION.NONE,\n };\n if (newSelectionStart >= currentSegment.selectionEnd) {\n const nextSegmentSelection = nextSegment(replaceIndex);\n if (\n nextSegmentSelection.selectionStart !==\n currentSegment.selectionStart\n ) {\n newSelection = nextSegmentSelection;\n }\n }\n log.debug('handleKeyDown', key, '=>', newValue, newSelection);\n onChange(newValue);\n onSelect(newSelection);\n return;\n }\n }\n }\n }\n\n // Need to use \"text\" type so we can apply a pattern and make selection properly\n return (\n <input\n ref={input}\n className={classNames('form-control masked-input', className)}\n type=\"text\"\n pattern={pattern}\n value={value}\n onChange={() => undefined}\n onKeyDown={handleKeyDown}\n onSelect={handleSelect}\n onSelectCapture={handleSelectCapture}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nMaskedInput.defaultProps = {\n className: '',\n onChange(): void {\n // no-op\n },\n onSelect(): void {\n // no-op\n },\n getNextSegmentValue: (range, delta, segmentValue) => segmentValue,\n getPreferredReplacementString: DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n selection: undefined,\n onFocus(): void {\n // no-op\n },\n onBlur(): void {\n // no-op\n },\n 'data-testid': undefined,\n};\n\nexport default MaskedInput;\n"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/MaskedInput.tsx"],"names":["React","useMemo","useEffect","useCallback","classNames","Log","useForwardedRef","log","module","SELECTION_DIRECTION","FORWARD","BACKWARD","NONE","FIXED_WIDTH_SPACE","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","value","replaceIndex","newChar","substring","MaskedInput","forwardRef","props","ref","className","example","getNextSegmentValue","range","delta","segmentValue","getPreferredReplacementString","onChange","onSelect","pattern","selection","onFocus","onBlur","dataTestId","input","examples","Array","isArray","setSelectedSegment","debug","selectionStart","selectionEnd","selectionDirection","current","setSelectionRange","getSegment","cursorPosition","testValue","length","i","test","charAt","fillValue","checkValue","exampleValue","filledValue","concat","isValid","patternRegex","RegExp","nextSegment","position","currentSegment","nextPosition","previousSegment","previousPosition","nextSegmentValue","segment","newSegmentValue","newValue","handleSelect","event","target","error","debug2","nativeEvent","type","newSelection","handleSelectCapture","preventDefault","stopPropagation","handleArrowKey","key","handleKeyDown","startsWith","replace","altKey","metaKey","ctrlKey","newChars","from","Set","toUpperCase","toLowerCase","maxReplaceIndex","newSelectionStart","nextSegmentSelection","undefined","defaultProps"],"mappings":"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","sourcesContent":["import React, { useMemo, useEffect, useCallback } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { useForwardedRef } from '@deephaven/react-hooks';\nimport './MaskedInput.scss';\n\nconst log = Log.module('MaskedInput');\n\nconst SELECTION_DIRECTION = {\n FORWARD: 'forward',\n BACKWARD: 'backward',\n NONE: 'none',\n} as const;\n\n/**\n * Special space character that's the same size as tabular numbers\n * https://www.fileformat.info/info/unicode/char/2007/index.htm\n */\nconst FIXED_WIDTH_SPACE = '\\u2007';\n\nexport function DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n value: string,\n replaceIndex: number,\n newChar: string\n): string {\n return (\n value.substring(0, replaceIndex) +\n newChar +\n value.substring(replaceIndex + 1)\n );\n}\n\nexport type SelectionSegment = {\n selectionStart: number;\n selectionEnd: number;\n selectionDirection?: typeof SELECTION_DIRECTION[keyof typeof SELECTION_DIRECTION];\n};\n\ntype MaskedInputProps = {\n /** An extra class name to add to the component */\n className?: string;\n /** The regex pattern this masked input must match */\n pattern: string;\n /** The current value to display */\n value: string;\n /** One or more examples of valid values. Used when deciding if next keystroke is valid (as rest of the current value may be incomplete) */\n example: string | string[];\n /** The current selection to use for the input */\n selection?: SelectionSegment;\n /** Called when the value changes. Note the value may still be incomplete. */\n onChange?(value: string): void;\n /** Called when selection changes */\n onSelect?(segment: SelectionSegment): void;\n /** Retrieve the next value for a provided segment */\n getNextSegmentValue?(\n segment: SelectionSegment,\n delta: number,\n segmentValue: string,\n value: string\n ): string;\n getPreferredReplacementString?(\n value: string,\n replaceIndex: number,\n replaceChar: string,\n selectionStart: number,\n selectionEnd: number\n ): string;\n onFocus?: React.FocusEventHandler;\n onBlur?: React.FocusEventHandler;\n\n 'data-testid'?: string;\n};\n\n/**\n * A masked input for entering data from a template.\n * Won't work by itself, must use within another component and handle updating the value/selection.\n */\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst MaskedInput = React.forwardRef<HTMLInputElement, MaskedInputProps>(\n (props: MaskedInputProps, ref) => {\n const {\n className,\n example,\n getNextSegmentValue = (range, delta, segmentValue) => segmentValue,\n getPreferredReplacementString = DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n onChange = () => false,\n onSelect = () => false,\n pattern,\n selection,\n value,\n onFocus = () => false,\n onBlur = () => false,\n 'data-testid': dataTestId,\n } = props;\n const input = useForwardedRef(ref);\n const examples = useMemo(\n () => (Array.isArray(example) ? example : [example]),\n [example]\n );\n\n useEffect(\n function setSelectedSegment() {\n if (selection != null) {\n log.debug('setting selection...', selection);\n const {\n selectionStart,\n selectionEnd,\n selectionDirection,\n } = selection;\n input.current?.setSelectionRange(\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n log.debug('selection set!');\n }\n },\n [selection, input]\n );\n\n /**\n * Returns the selection range for the segment at the given cursor position\n * @param cursorPosition The current position of the cursor\n */\n const getSegment = useCallback(\n (cursorPosition: number) => {\n let selectionStart = cursorPosition;\n let selectionEnd = cursorPosition;\n const testValue = examples.length > 0 ? examples[0] : value;\n\n for (let i = selectionStart - 1; i >= 0; i -= 1) {\n if (!/[a-zA-Z0-9]/g.test(testValue.charAt(i))) {\n break;\n }\n\n selectionStart = i;\n }\n\n for (let i = selectionEnd; i < testValue.length; i += 1) {\n if (!/[a-zA-Z0-9]/g.test(testValue.charAt(i))) {\n break;\n }\n\n selectionEnd = i + 1;\n }\n\n const selectionDirection =\n selectionStart === selectionEnd\n ? SELECTION_DIRECTION.NONE\n : SELECTION_DIRECTION.BACKWARD;\n\n return {\n selectionStart,\n selectionEnd,\n selectionDirection,\n };\n },\n [examples, value]\n );\n\n /**\n * Replaces all blank spaces and everything after the current cursor position with the example value\n * @param checkValue The value to check/fill in\n * @param exampleValue The example to fill in the value from\n * @param cursorPosition The cursor position\n * @returns The filled in value\n */\n function fillValue(\n checkValue: string,\n exampleValue: string,\n cursorPosition = checkValue.length\n ): string {\n let filledValue = '';\n for (let i = 0; i < cursorPosition; i += 1) {\n if (checkValue.charAt(i) !== FIXED_WIDTH_SPACE) {\n filledValue = filledValue.concat(checkValue[i]);\n } else {\n filledValue = filledValue.concat(exampleValue[i]);\n }\n }\n filledValue = filledValue.concat(exampleValue.substring(cursorPosition));\n\n return filledValue;\n }\n\n /**\n * Checks if a given `value` is valid up until the `cursorPosition`.\n * Uses the examples to build the rest of the string\n * @param checkValue The value to check validity of\n * @param cursorPosition The position of the cursor to check up to\n */\n function isValid(\n checkValue: string,\n cursorPosition = checkValue.length\n ): boolean {\n const patternRegex = new RegExp(pattern);\n if (patternRegex.test(checkValue)) {\n return true;\n }\n\n for (let i = 0; i < examples.length; i += 1) {\n const filledValue = fillValue(checkValue, examples[i], cursorPosition);\n if (patternRegex.test(filledValue)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns the next segment after the given position\n * @param position The cursor position to start at\n * @returns The new selection range\n */\n function nextSegment(position: number): SelectionSegment {\n const currentSegment = getSegment(position);\n const nextPosition = currentSegment.selectionEnd + 1;\n if (nextPosition >= value.length) {\n return currentSegment;\n }\n\n return getSegment(nextPosition);\n }\n\n /**\n * Returns the previous segment before the given position\n * @param position The cursor position to start at\n * @returns The new selection range\n */\n function previousSegment(position: number): SelectionSegment {\n const currentSegment = getSegment(position);\n const previousPosition = currentSegment.selectionStart - 1;\n if (previousPosition <= 0) {\n return currentSegment;\n }\n\n return getSegment(previousPosition);\n }\n\n function nextSegmentValue(position: number, delta: number): void {\n const segment = getSegment(position);\n const segmentValue = value.substring(\n segment.selectionStart,\n segment.selectionEnd\n );\n const newSegmentValue = getNextSegmentValue(\n segment,\n delta,\n segmentValue,\n value\n );\n const newValue =\n value.substring(0, segment.selectionStart) +\n newSegmentValue +\n value.substring(segment.selectionEnd);\n if (isValid(newValue, segment.selectionEnd)) {\n onChange(newValue);\n onSelect(segment);\n }\n }\n\n const handleSelect = useCallback(\n (event: React.UIEvent<HTMLInputElement>) => {\n const {\n selectionStart = 0,\n selectionEnd = 0,\n selectionDirection = 'none',\n } = event.target as HTMLInputElement;\n\n if (\n selectionStart === null ||\n selectionEnd === null ||\n selectionDirection === null\n ) {\n log.error(\n 'Selection attempted on non-text input element',\n event.target\n );\n return;\n }\n\n log.debug2(\n 'handleSelect',\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n if (\n selection != null &&\n selectionStart === selection.selectionStart &&\n selectionEnd === selection.selectionEnd\n ) {\n return;\n }\n if (\n selection != null &&\n selectionStart === value.length &&\n selectionEnd === value.length &&\n event.nativeEvent.type !== 'mouseup'\n ) {\n // React triggers onSelect event with the cursor at the end of the input content\n // when the component is rendered at a different location in the DOM,\n // i.e. when start/end times switch places in the TimeSlider.\n // Ignore this event and reset the selection to its previous state.\n onSelect({ ...selection });\n return;\n }\n if (selectionStart === selectionEnd) {\n const newSelection = getSegment(selectionStart);\n log.debug(\n 'Selection segment from ',\n selectionStart,\n selectionEnd,\n '=>',\n newSelection\n );\n onSelect(newSelection);\n } else {\n onSelect({ selectionStart, selectionEnd, selectionDirection });\n }\n },\n [getSegment, onSelect, selection, value]\n );\n\n const handleSelectCapture = useCallback(\n (event: React.UIEvent<HTMLInputElement>) => {\n if (!input.current) {\n return;\n }\n log.debug('handleSelectCapture', event);\n const selectionStart = input.current.selectionStart || 0;\n if (\n selectionStart === value.length &&\n selection != null &&\n selectionStart !== selection.selectionStart\n ) {\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [input, selection, value]\n );\n\n function handleArrowKey(event: React.KeyboardEvent<HTMLInputElement>) {\n event.preventDefault();\n event.stopPropagation();\n\n if (!input.current) {\n return;\n }\n\n const { key } = event;\n const { selectionStart = 0, selectionEnd = 0 } = input.current;\n if (selectionStart === null || selectionEnd === null) {\n log.error(\n 'Selection arrow nvaigation attempted on non-text input element',\n event.target\n );\n return;\n }\n\n if (key === 'ArrowLeft') {\n onSelect(previousSegment(selectionStart));\n } else if (key === 'ArrowRight') {\n onSelect(nextSegment(selectionEnd));\n } else if (key === 'ArrowUp') {\n nextSegmentValue(selectionStart, -1);\n } else if (key === 'ArrowDown') {\n nextSegmentValue(selectionStart, 1);\n }\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (!input.current) {\n return;\n }\n log.debug('handleKeyDown', event);\n const { key } = event;\n const { selectionStart = 0, selectionEnd = 0 } = input.current;\n if (selectionStart === null || selectionEnd === null) {\n log.error(\n 'Selection key event on non-text input element',\n event.target\n );\n return;\n }\n\n if (key.startsWith('Arrow')) {\n handleArrowKey(event);\n return;\n }\n\n if (key === 'Delete' || key === 'Backspace') {\n event.preventDefault();\n event.stopPropagation();\n\n if (selectionStart !== selectionEnd) {\n // Replace all non-masked characters with blanks, set selection to start\n const newValue =\n value.substring(0, selectionStart) +\n value\n .substring(selectionStart, selectionEnd)\n .replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE) +\n value.substring(selectionEnd);\n log.debug(\n 'Range ',\n selectionStart,\n selectionEnd,\n 'deleted, setting value',\n newValue\n );\n\n onChange(newValue);\n onSelect({\n selectionStart,\n selectionEnd: selectionStart,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n } else if (selectionStart > 0) {\n for (let i = selectionStart - 1; i >= 0; i -= 1) {\n // Only replace non placeholder text\n const newValue =\n value.substring(0, i) +\n value\n .substring(i, selectionStart)\n .replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE) +\n value.substring(selectionStart);\n\n if (newValue !== value) {\n onChange(newValue);\n onSelect({\n selectionStart: i,\n selectionEnd: i,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n return;\n }\n }\n }\n\n return;\n }\n\n if (event.altKey || event.metaKey || event.ctrlKey || key.length > 1) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n // Get the different permutations of the character they entered, remove duplicates\n const newChars = Array.from(\n new Set([key, key.toUpperCase(), key.toLowerCase()])\n );\n for (let i = 0; i < newChars.length; i += 1) {\n const newChar = newChars[i];\n\n // If they're typing an alphanumeric character, be smart and allow it to jump ahead\n const maxReplaceIndex = /[a-zA-Z0-9]/g.test(newChar)\n ? value.length - 1\n : selectionStart;\n for (\n let replaceIndex = selectionStart;\n replaceIndex <= maxReplaceIndex;\n replaceIndex += 1\n ) {\n const newValue = getPreferredReplacementString(\n value,\n replaceIndex,\n newChar,\n selectionStart,\n selectionEnd\n );\n if (isValid(newValue, replaceIndex + 1)) {\n const currentSegment = getSegment(replaceIndex);\n const newSelectionStart = replaceIndex + 1;\n let newSelection: SelectionSegment = {\n selectionStart: newSelectionStart,\n selectionEnd: newSelectionStart,\n selectionDirection: SELECTION_DIRECTION.NONE,\n };\n if (newSelectionStart >= currentSegment.selectionEnd) {\n const nextSegmentSelection = nextSegment(replaceIndex);\n if (\n nextSegmentSelection.selectionStart !==\n currentSegment.selectionStart\n ) {\n newSelection = nextSegmentSelection;\n }\n }\n log.debug('handleKeyDown', key, '=>', newValue, newSelection);\n onChange(newValue);\n onSelect(newSelection);\n return;\n }\n }\n }\n }\n\n // Need to use \"text\" type so we can apply a pattern and make selection properly\n return (\n <input\n ref={input}\n className={classNames('form-control masked-input', className)}\n type=\"text\"\n pattern={pattern}\n value={value}\n onChange={() => undefined}\n onKeyDown={handleKeyDown}\n onSelect={handleSelect}\n onSelectCapture={handleSelectCapture}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nMaskedInput.defaultProps = {\n className: '',\n onChange(): void {\n // no-op\n },\n onSelect(): void {\n // no-op\n },\n getNextSegmentValue: (range, delta, segmentValue) => segmentValue,\n getPreferredReplacementString: DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n selection: undefined,\n onFocus(): void {\n // no-op\n },\n onBlur(): void {\n // no-op\n },\n 'data-testid': undefined,\n};\n\nexport default MaskedInput;\n"],"file":"MaskedInput.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"Option.js","names":["React","Option","children","value","dataTestId"],"sources":["../src/Option.tsx"],"sourcesContent":["import React from 'react';\n\nexport type OptionProps = {\n children: React.ReactNode;\n value: string;\n 'data-testid'?: string;\n};\n\nconst Option = ({\n children,\n value,\n 'data-testid': dataTestId,\n}: OptionProps): JSX.Element => (\n <option value={value} data-testid={dataTestId}>\n {children}\n </option>\n);\n\nexport default Option;\n"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;;AAQA,IAAMC,MAAM,GAAG;EAAA,IAAC;IACdC,QADc;IAEdC,KAFc;IAGd,eAAeC;EAHD,CAAD;EAAA,oBAKb;IAAQ,KAAK,EAAED,KAAf;IAAsB,eAAaC;EAAnC,GACGF,QADH,CALa;AAAA,CAAf;;AAUA,eAAeD,MAAf"}
1
+ {"version":3,"sources":["../src/Option.tsx"],"names":["React","Option","children","value","dataTestId"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;;AAQA,IAAMC,MAAM,GAAG;AAAA,MAAC;AACdC,IAAAA,QADc;AAEdC,IAAAA,KAFc;AAGd,mBAAeC;AAHD,GAAD;AAAA,sBAKb;AAAQ,IAAA,KAAK,EAAED,KAAf;AAAsB,mBAAaC;AAAnC,KACGF,QADH,CALa;AAAA,CAAf;;AAUA,eAAeD,MAAf","sourcesContent":["import React from 'react';\n\nexport type OptionProps = {\n children: React.ReactNode;\n value: string;\n 'data-testid'?: string;\n};\n\nconst Option = ({\n children,\n value,\n 'data-testid': dataTestId,\n}: OptionProps): JSX.Element => (\n <option value={value} data-testid={dataTestId}>\n {children}\n </option>\n);\n\nexport default Option;\n"],"file":"Option.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"RadioGroup.js","names":["React","useState","shortid","RadioGroup","props","children","disabled","name","propsName","onChange","value","dataTestId","Children","map","child","cloneElement","checked"],"sources":["../src/RadioGroup.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport shortid from 'shortid';\n\ntype RadioGroupProps = {\n /** The radio items to populate this radio. Should be of type RadioItem. */\n children?: React.ReactElement | React.ReactElement[];\n\n /** The name to use for the radio items. If not specified, a name is automatically generated */\n name?: string;\n\n /** Triggered when a radio button is changed */\n onChange: React.ChangeEventHandler<HTMLInputElement>;\n\n /** The currently selected value. Will automatically set the `checked` attribute of the RadioItem. */\n value?: string;\n\n disabled?: boolean;\n 'data-testid'?: string;\n};\n\n/**\n * A group of radio buttons. Use with RadioItems to populate, eg.\n * <RadioGroup>\n * <RadioItem .../>\n * <RadioItem .../>\n * </RadioGroup>\n */\nconst RadioGroup = (props: RadioGroupProps): JSX.Element => {\n const {\n children,\n disabled = false,\n name: propsName,\n onChange,\n value = '',\n 'data-testid': dataTestId,\n } = props;\n const [name] = useState(propsName || shortid());\n\n // Need to use \"text\" type so we can apply a pattern and make selection properly\n return (\n <>\n {React.Children.map(children, child =>\n child\n ? React.cloneElement(child, {\n name,\n onChange: child.props.onChange || onChange,\n checked: value === child.props.value,\n disabled: child.props.disabled || disabled,\n 'data-testid': dataTestId,\n })\n : null\n )}\n </>\n );\n};\n\nexport default RadioGroup;\n"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,QAAhB,QAAgC,OAAhC;AACA,OAAOC,OAAP,MAAoB,SAApB;;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,UAAU,GAAIC,KAAD,IAAyC;EAC1D,IAAM;IACJC,QADI;IAEJC,QAAQ,GAAG,KAFP;IAGJC,IAAI,EAAEC,SAHF;IAIJC,QAJI;IAKJC,KAAK,GAAG,EALJ;IAMJ,eAAeC;EANX,IAOFP,KAPJ;EAQA,IAAM,CAACG,IAAD,IAASN,QAAQ,CAACO,SAAS,IAAIN,OAAO,EAArB,CAAvB,CAT0D,CAW1D;;EACA,oBACE,0CACGF,KAAK,CAACY,QAAN,CAAeC,GAAf,CAAmBR,QAAnB,EAA6BS,KAAK,IACjCA,KAAK,gBACDd,KAAK,CAACe,YAAN,CAAmBD,KAAnB,EAA0B;IACxBP,IADwB;IAExBE,QAAQ,EAAEK,KAAK,CAACV,KAAN,CAAYK,QAAZ,IAAwBA,QAFV;IAGxBO,OAAO,EAAEN,KAAK,KAAKI,KAAK,CAACV,KAAN,CAAYM,KAHP;IAIxBJ,QAAQ,EAAEQ,KAAK,CAACV,KAAN,CAAYE,QAAZ,IAAwBA,QAJV;IAKxB,eAAeK;EALS,CAA1B,CADC,GAQD,IATL,CADH,CADF;AAeD,CA3BD;;AA6BA,eAAeR,UAAf"}
1
+ {"version":3,"sources":["../src/RadioGroup.tsx"],"names":["React","useState","shortid","RadioGroup","props","children","disabled","name","propsName","onChange","value","dataTestId","Children","map","child","cloneElement","checked"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,QAAhB,QAAgC,OAAhC;AACA,OAAOC,OAAP,MAAoB,SAApB;;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,UAAU,GAAIC,KAAD,IAAyC;AAC1D,MAAM;AACJC,IAAAA,QADI;AAEJC,IAAAA,QAAQ,GAAG,KAFP;AAGJC,IAAAA,IAAI,EAAEC,SAHF;AAIJC,IAAAA,QAJI;AAKJC,IAAAA,KAAK,GAAG,EALJ;AAMJ,mBAAeC;AANX,MAOFP,KAPJ;AAQA,MAAM,CAACG,IAAD,IAASN,QAAQ,CAACO,SAAS,IAAIN,OAAO,EAArB,CAAvB,CAT0D,CAW1D;;AACA,sBACE,0CACGF,KAAK,CAACY,QAAN,CAAeC,GAAf,CAAmBR,QAAnB,EAA6BS,KAAK,IACjCA,KAAK,gBACDd,KAAK,CAACe,YAAN,CAAmBD,KAAnB,EAA0B;AACxBP,IAAAA,IADwB;AAExBE,IAAAA,QAAQ,EAAEK,KAAK,CAACV,KAAN,CAAYK,QAAZ,IAAwBA,QAFV;AAGxBO,IAAAA,OAAO,EAAEN,KAAK,KAAKI,KAAK,CAACV,KAAN,CAAYM,KAHP;AAIxBJ,IAAAA,QAAQ,EAAEQ,KAAK,CAACV,KAAN,CAAYE,QAAZ,IAAwBA,QAJV;AAKxB,mBAAeK;AALS,GAA1B,CADC,GAQD,IATL,CADH,CADF;AAeD,CA3BD;;AA6BA,eAAeR,UAAf","sourcesContent":["import React, { useState } from 'react';\nimport shortid from 'shortid';\n\ntype RadioGroupProps = {\n /** The radio items to populate this radio. Should be of type RadioItem. */\n children?: React.ReactElement | React.ReactElement[];\n\n /** The name to use for the radio items. If not specified, a name is automatically generated */\n name?: string;\n\n /** Triggered when a radio button is changed */\n onChange: React.ChangeEventHandler<HTMLInputElement>;\n\n /** The currently selected value. Will automatically set the `checked` attribute of the RadioItem. */\n value?: string;\n\n disabled?: boolean;\n 'data-testid'?: string;\n};\n\n/**\n * A group of radio buttons. Use with RadioItems to populate, eg.\n * <RadioGroup>\n * <RadioItem .../>\n * <RadioItem .../>\n * </RadioGroup>\n */\nconst RadioGroup = (props: RadioGroupProps): JSX.Element => {\n const {\n children,\n disabled = false,\n name: propsName,\n onChange,\n value = '',\n 'data-testid': dataTestId,\n } = props;\n const [name] = useState(propsName || shortid());\n\n // Need to use \"text\" type so we can apply a pattern and make selection properly\n return (\n <>\n {React.Children.map(children, child =>\n child\n ? React.cloneElement(child, {\n name,\n onChange: child.props.onChange || onChange,\n checked: value === child.props.value,\n disabled: child.props.disabled || disabled,\n 'data-testid': dataTestId,\n })\n : null\n )}\n </>\n );\n};\n\nexport default RadioGroup;\n"],"file":"RadioGroup.js"}
@@ -1 +1 @@
1
- {"version":3,"file":"RadioItem.js","names":["React","useState","classNames","shortid","RadioItem","forwardRef","props","ref","checked","children","className","disabled","inputClassName","isInvalid","labelClassName","name","onChange","value","dataTestId","id","displayName","defaultProps","undefined"],"sources":["../src/RadioItem.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport classNames from 'classnames';\nimport shortid from 'shortid';\n\ntype RadioItemProps = {\n /** Whether this value is currently checked or not */\n checked?: boolean;\n\n /** The node/text to put in the label of this radio item */\n children: React.ReactNode;\n\n /** An extra class name to add to the outer div component */\n className?: string;\n\n /** An extra class for disabling the radio button component */\n disabled?: boolean;\n\n /** An extra class name for the input component */\n inputClassName?: string;\n\n /** The value is invalid, style to show it's invalid */\n isInvalid?: boolean;\n\n /** An extra class name for the label component */\n labelClassName?: string;\n\n /** The name for this RadioItem. Should be specified by the parent Radio component */\n name?: string;\n\n /** Triggered when the input is checked/unchecked. Provided by the parent Radio component. */\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n\n /** The value to associate with this radio item */\n value: string;\n\n /** An id used for test */\n 'data-testid'?: string;\n};\n\n/**\n * A RadioItem to be used within the Radio component.\n */\nconst RadioItem = React.forwardRef<HTMLInputElement, RadioItemProps>(\n (props: RadioItemProps, ref) => {\n const {\n checked,\n children,\n className = '',\n disabled = false,\n inputClassName = '',\n isInvalid = false,\n labelClassName = '',\n name,\n onChange,\n value,\n 'data-testid': dataTestId,\n } = props;\n\n const [id] = useState(shortid());\n\n return (\n <div className={classNames('custom-control custom-radio', className)}>\n <input\n type=\"radio\"\n id={id}\n data-testid={dataTestId}\n name={name}\n ref={ref}\n className={classNames('custom-control-input', inputClassName, {\n 'is-invalid': isInvalid,\n })}\n checked={checked}\n disabled={disabled}\n value={value}\n onChange={onChange}\n />\n <label\n className={classNames('custom-control-label', labelClassName)}\n htmlFor={id}\n >\n {children}\n </label>\n </div>\n );\n }\n);\n\nRadioItem.displayName = 'RadioItem';\n\nRadioItem.defaultProps = {\n checked: undefined,\n className: '',\n disabled: false,\n inputClassName: '',\n isInvalid: false,\n labelClassName: '',\n name: undefined,\n onChange: undefined,\n 'data-testid': undefined,\n};\n\nexport default RadioItem;\n"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,QAAhB,QAAgC,OAAhC;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,OAAOC,OAAP,MAAoB,SAApB;;AAqCA;AACA;AACA;AACA,IAAMC,SAAS,gBAAGJ,KAAK,CAACK,UAAN,CAChB,CAACC,KAAD,EAAwBC,GAAxB,KAAgC;EAC9B,IAAM;IACJC,OADI;IAEJC,QAFI;IAGJC,SAAS,GAAG,EAHR;IAIJC,QAAQ,GAAG,KAJP;IAKJC,cAAc,GAAG,EALb;IAMJC,SAAS,GAAG,KANR;IAOJC,cAAc,GAAG,EAPb;IAQJC,IARI;IASJC,QATI;IAUJC,KAVI;IAWJ,eAAeC;EAXX,IAYFZ,KAZJ;EAcA,IAAM,CAACa,EAAD,IAAOlB,QAAQ,CAACE,OAAO,EAAR,CAArB;EAEA,oBACE;IAAK,SAAS,EAAED,UAAU,CAAC,6BAAD,EAAgCQ,SAAhC;EAA1B,gBACE;IACE,IAAI,EAAC,OADP;IAEE,EAAE,EAAES,EAFN;IAGE,eAAaD,UAHf;IAIE,IAAI,EAAEH,IAJR;IAKE,GAAG,EAAER,GALP;IAME,SAAS,EAAEL,UAAU,CAAC,sBAAD,EAAyBU,cAAzB,EAAyC;MAC5D,cAAcC;IAD8C,CAAzC,CANvB;IASE,OAAO,EAAEL,OATX;IAUE,QAAQ,EAAEG,QAVZ;IAWE,KAAK,EAAEM,KAXT;IAYE,QAAQ,EAAED;EAZZ,EADF,eAeE;IACE,SAAS,EAAEd,UAAU,CAAC,sBAAD,EAAyBY,cAAzB,CADvB;IAEE,OAAO,EAAEK;EAFX,GAIGV,QAJH,CAfF,CADF;AAwBD,CA1Ce,CAAlB;AA6CAL,SAAS,CAACgB,WAAV,GAAwB,WAAxB;AAEAhB,SAAS,CAACiB,YAAV,GAAyB;EACvBb,OAAO,EAAEc,SADc;EAEvBZ,SAAS,EAAE,EAFY;EAGvBC,QAAQ,EAAE,KAHa;EAIvBC,cAAc,EAAE,EAJO;EAKvBC,SAAS,EAAE,KALY;EAMvBC,cAAc,EAAE,EANO;EAOvBC,IAAI,EAAEO,SAPiB;EAQvBN,QAAQ,EAAEM,SARa;EASvB,eAAeA;AATQ,CAAzB;AAYA,eAAelB,SAAf"}
1
+ {"version":3,"sources":["../src/RadioItem.tsx"],"names":["React","useState","classNames","shortid","RadioItem","forwardRef","props","ref","checked","children","className","disabled","inputClassName","isInvalid","labelClassName","name","onChange","value","dataTestId","id","displayName","defaultProps","undefined"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,QAAhB,QAAgC,OAAhC;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,OAAOC,OAAP,MAAoB,SAApB;;AAqCA;AACA;AACA;AACA,IAAMC,SAAS,gBAAGJ,KAAK,CAACK,UAAN,CAChB,CAACC,KAAD,EAAwBC,GAAxB,KAAgC;AAC9B,MAAM;AACJC,IAAAA,OADI;AAEJC,IAAAA,QAFI;AAGJC,IAAAA,SAAS,GAAG,EAHR;AAIJC,IAAAA,QAAQ,GAAG,KAJP;AAKJC,IAAAA,cAAc,GAAG,EALb;AAMJC,IAAAA,SAAS,GAAG,KANR;AAOJC,IAAAA,cAAc,GAAG,EAPb;AAQJC,IAAAA,IARI;AASJC,IAAAA,QATI;AAUJC,IAAAA,KAVI;AAWJ,mBAAeC;AAXX,MAYFZ,KAZJ;AAcA,MAAM,CAACa,EAAD,IAAOlB,QAAQ,CAACE,OAAO,EAAR,CAArB;AAEA,sBACE;AAAK,IAAA,SAAS,EAAED,UAAU,CAAC,6BAAD,EAAgCQ,SAAhC;AAA1B,kBACE;AACE,IAAA,IAAI,EAAC,OADP;AAEE,IAAA,EAAE,EAAES,EAFN;AAGE,mBAAaD,UAHf;AAIE,IAAA,IAAI,EAAEH,IAJR;AAKE,IAAA,GAAG,EAAER,GALP;AAME,IAAA,SAAS,EAAEL,UAAU,CAAC,sBAAD,EAAyBU,cAAzB,EAAyC;AAC5D,oBAAcC;AAD8C,KAAzC,CANvB;AASE,IAAA,OAAO,EAAEL,OATX;AAUE,IAAA,QAAQ,EAAEG,QAVZ;AAWE,IAAA,KAAK,EAAEM,KAXT;AAYE,IAAA,QAAQ,EAAED;AAZZ,IADF,eAeE;AACE,IAAA,SAAS,EAAEd,UAAU,CAAC,sBAAD,EAAyBY,cAAzB,CADvB;AAEE,IAAA,OAAO,EAAEK;AAFX,KAIGV,QAJH,CAfF,CADF;AAwBD,CA1Ce,CAAlB;AA6CAL,SAAS,CAACgB,WAAV,GAAwB,WAAxB;AAEAhB,SAAS,CAACiB,YAAV,GAAyB;AACvBb,EAAAA,OAAO,EAAEc,SADc;AAEvBZ,EAAAA,SAAS,EAAE,EAFY;AAGvBC,EAAAA,QAAQ,EAAE,KAHa;AAIvBC,EAAAA,cAAc,EAAE,EAJO;AAKvBC,EAAAA,SAAS,EAAE,KALY;AAMvBC,EAAAA,cAAc,EAAE,EANO;AAOvBC,EAAAA,IAAI,EAAEO,SAPiB;AAQvBN,EAAAA,QAAQ,EAAEM,SARa;AASvB,iBAAeA;AATQ,CAAzB;AAYA,eAAelB,SAAf","sourcesContent":["import React, { useState } from 'react';\nimport classNames from 'classnames';\nimport shortid from 'shortid';\n\ntype RadioItemProps = {\n /** Whether this value is currently checked or not */\n checked?: boolean;\n\n /** The node/text to put in the label of this radio item */\n children: React.ReactNode;\n\n /** An extra class name to add to the outer div component */\n className?: string;\n\n /** An extra class for disabling the radio button component */\n disabled?: boolean;\n\n /** An extra class name for the input component */\n inputClassName?: string;\n\n /** The value is invalid, style to show it's invalid */\n isInvalid?: boolean;\n\n /** An extra class name for the label component */\n labelClassName?: string;\n\n /** The name for this RadioItem. Should be specified by the parent Radio component */\n name?: string;\n\n /** Triggered when the input is checked/unchecked. Provided by the parent Radio component. */\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\n\n /** The value to associate with this radio item */\n value: string;\n\n /** An id used for test */\n 'data-testid'?: string;\n};\n\n/**\n * A RadioItem to be used within the Radio component.\n */\nconst RadioItem = React.forwardRef<HTMLInputElement, RadioItemProps>(\n (props: RadioItemProps, ref) => {\n const {\n checked,\n children,\n className = '',\n disabled = false,\n inputClassName = '',\n isInvalid = false,\n labelClassName = '',\n name,\n onChange,\n value,\n 'data-testid': dataTestId,\n } = props;\n\n const [id] = useState(shortid());\n\n return (\n <div className={classNames('custom-control custom-radio', className)}>\n <input\n type=\"radio\"\n id={id}\n data-testid={dataTestId}\n name={name}\n ref={ref}\n className={classNames('custom-control-input', inputClassName, {\n 'is-invalid': isInvalid,\n })}\n checked={checked}\n disabled={disabled}\n value={value}\n onChange={onChange}\n />\n <label\n className={classNames('custom-control-label', labelClassName)}\n htmlFor={id}\n >\n {children}\n </label>\n </div>\n );\n }\n);\n\nRadioItem.displayName = 'RadioItem';\n\nRadioItem.defaultProps = {\n checked: undefined,\n className: '',\n disabled: false,\n inputClassName: '',\n isInvalid: false,\n labelClassName: '',\n name: undefined,\n onChange: undefined,\n 'data-testid': undefined,\n};\n\nexport default RadioItem;\n"],"file":"RadioItem.js"}