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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/AutoCompleteInput.js +410 -448
  2. package/dist/AutoCompleteInput.js.map +1 -1
  3. package/dist/AutoResizeTextarea.js +17 -46
  4. package/dist/AutoResizeTextarea.js.map +1 -1
  5. package/dist/BasicModal.js +18 -19
  6. package/dist/BasicModal.js.map +1 -1
  7. package/dist/Button.js +30 -21
  8. package/dist/Button.js.map +1 -1
  9. package/dist/ButtonGroup.js +6 -4
  10. package/dist/ButtonGroup.js.map +1 -1
  11. package/dist/ButtonOld.js +10 -8
  12. package/dist/ButtonOld.js.map +1 -1
  13. package/dist/CardFlip.js +10 -8
  14. package/dist/CardFlip.js.map +1 -1
  15. package/dist/Checkbox.js +18 -31
  16. package/dist/Checkbox.js.map +1 -1
  17. package/dist/Collapse.js +65 -105
  18. package/dist/Collapse.js.map +1 -1
  19. package/dist/ComboBox.js +432 -460
  20. package/dist/ComboBox.js.map +1 -1
  21. package/dist/CustomTimeSelect.js +485 -517
  22. package/dist/CustomTimeSelect.js.map +1 -1
  23. package/dist/DebouncedSearchInput.js +61 -91
  24. package/dist/DebouncedSearchInput.js.map +1 -1
  25. package/dist/DeephavenSpinner.js +6 -6
  26. package/dist/DeephavenSpinner.js.map +1 -1
  27. package/dist/DragUtils.js +65 -113
  28. package/dist/DragUtils.js.map +1 -1
  29. package/dist/DraggableItemList.d.ts +1 -0
  30. package/dist/DraggableItemList.d.ts.map +1 -1
  31. package/dist/DraggableItemList.js +219 -257
  32. package/dist/DraggableItemList.js.map +1 -1
  33. package/dist/HierarchicalCheckboxMenu.js +160 -227
  34. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  35. package/dist/ItemList.d.ts +4 -2
  36. package/dist/ItemList.d.ts.map +1 -1
  37. package/dist/ItemList.js +595 -598
  38. package/dist/ItemList.js.map +1 -1
  39. package/dist/ItemListItem.js +194 -215
  40. package/dist/ItemListItem.js.map +1 -1
  41. package/dist/LoadingOverlay.js +9 -10
  42. package/dist/LoadingOverlay.js.map +1 -1
  43. package/dist/LoadingSpinner.js +4 -3
  44. package/dist/LoadingSpinner.js.map +1 -1
  45. package/dist/MaskedInput.js +59 -70
  46. package/dist/MaskedInput.js.map +1 -1
  47. package/dist/Option.js +5 -3
  48. package/dist/Option.js.map +1 -1
  49. package/dist/RadioGroup.js +16 -34
  50. package/dist/RadioGroup.js.map +1 -1
  51. package/dist/RadioItem.js +14 -33
  52. package/dist/RadioItem.js.map +1 -1
  53. package/dist/SearchInput.js +42 -75
  54. package/dist/SearchInput.js.map +1 -1
  55. package/dist/Select.js +10 -8
  56. package/dist/Select.js.map +1 -1
  57. package/dist/SelectValueList.js +97 -134
  58. package/dist/SelectValueList.js.map +1 -1
  59. package/dist/SocketedButton.js +13 -11
  60. package/dist/SocketedButton.js.map +1 -1
  61. package/dist/ThemeExport.js.map +1 -1
  62. package/dist/TimeInput.js +16 -53
  63. package/dist/TimeInput.js.map +1 -1
  64. package/dist/TimeSlider.js +62 -88
  65. package/dist/TimeSlider.js.map +1 -1
  66. package/dist/ToastNotification.js +14 -13
  67. package/dist/ToastNotification.js.map +1 -1
  68. package/dist/UISwitch.js +9 -8
  69. package/dist/UISwitch.js.map +1 -1
  70. package/dist/context-actions/ContextActionUtils.js +173 -231
  71. package/dist/context-actions/ContextActionUtils.js.map +1 -1
  72. package/dist/context-actions/ContextActions.js +135 -177
  73. package/dist/context-actions/ContextActions.js.map +1 -1
  74. package/dist/context-actions/ContextMenu.js +509 -543
  75. package/dist/context-actions/ContextMenu.js.map +1 -1
  76. package/dist/context-actions/ContextMenuItem.js +32 -22
  77. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  78. package/dist/context-actions/ContextMenuRoot.js +112 -152
  79. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  80. package/dist/context-actions/GlobalContextAction.js +49 -84
  81. package/dist/context-actions/GlobalContextAction.js.map +1 -1
  82. package/dist/context-actions/GlobalContextActions.js +25 -57
  83. package/dist/context-actions/GlobalContextActions.js.map +1 -1
  84. package/dist/context-actions/index.js +4 -4
  85. package/dist/context-actions/index.js.map +1 -1
  86. package/dist/index.js +39 -39
  87. package/dist/index.js.map +1 -1
  88. package/dist/menu-actions/DropdownMenu.js +126 -159
  89. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  90. package/dist/menu-actions/Menu.js +215 -245
  91. package/dist/menu-actions/Menu.js.map +1 -1
  92. package/dist/menu-actions/index.js +1 -1
  93. package/dist/menu-actions/index.js.map +1 -1
  94. package/dist/navigation/Menu.js +14 -18
  95. package/dist/navigation/Menu.js.map +1 -1
  96. package/dist/navigation/MenuItem.js +15 -14
  97. package/dist/navigation/MenuItem.js.map +1 -1
  98. package/dist/navigation/Page.js +7 -5
  99. package/dist/navigation/Page.js.map +1 -1
  100. package/dist/navigation/Stack.js +14 -39
  101. package/dist/navigation/Stack.js.map +1 -1
  102. package/dist/navigation/index.js +4 -4
  103. package/dist/navigation/index.js.map +1 -1
  104. package/dist/popper/Popper.js +209 -235
  105. package/dist/popper/Popper.js.map +1 -1
  106. package/dist/popper/Tooltip.js +227 -257
  107. package/dist/popper/Tooltip.js.map +1 -1
  108. package/dist/popper/index.js +2 -2
  109. package/dist/popper/index.js.map +1 -1
  110. package/dist/shortcuts/GlobalShortcuts.js +2 -2
  111. package/dist/shortcuts/GlobalShortcuts.js.map +1 -1
  112. package/dist/shortcuts/Shortcut.js +263 -291
  113. package/dist/shortcuts/Shortcut.js.map +1 -1
  114. package/dist/shortcuts/ShortcutRegistry.js +48 -71
  115. package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
  116. package/dist/shortcuts/index.js +4 -4
  117. package/dist/shortcuts/index.js.map +1 -1
  118. package/dist/tsconfig.tsbuildinfo +1 -1
  119. package/package.json +30 -54
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ItemList.tsx"],"names":["React","PureComponent","memoize","FixedSizeList","List","AutoSizer","Log","RangeUtils","ItemListItem","ContextActionUtils","log","module","ItemList","props","index","selectedRanges","isSelected","max","CACHE_SIZE","itemIndex","key","item","isFocused","renderItem","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","isListAtBottom","scrollToBottom","prevProps","prevState","propSelectedRanges","sendViewportUpdate","setSelectedRanges","onSelectionChange","onFocusChange","window","removeEventListener","current","focus","focusSelector","elements","querySelectorAll","elementIndex","setState","element","getElement","HTMLElement","scrollIntoView","block","e","isModifierDown","isModifierKeyDown","toggleSelect","shiftKey","isDoubleClickSelect","onSelect","selectRange","target","indexOf","tagName","toLowerCase","button","length","focusItem","selectItem","addEventListener","debug2","currentTarget","relatedTarget","contains","isDragSelect","isMultiSelect","getItemSelected","deselectAll","Math","min","isShiftDown","resetMouseState","itemCount","oldFocus","newFocus","stopPropagation","preventDefault","lastRange","scrollUpdateWasRequested","scrollToItem","isDeselectable","deselectItem","deselectRange","range","validateRange","onViewportChange","rowHeight","topRow","floor","bottomRow","ceil","offset","getCachedItem","overscanCount","width","getItemData","getOuterElement","getInnerElement","displayValue","value","DEFAULT_ROW_HEIGHT","DEFAULT_OVERSCAN"],"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 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): 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};\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 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\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): 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);\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 );\n }\n }\n }\n\n handleItemMouseUp(index: number, e: React.MouseEvent): void {\n const { 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);\n\n if (!isDoubleClickSelect && !isShiftDown && !isModifierDown) {\n onSelect(index);\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);\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 } = 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 >\n {this.renderInnerElement}\n </List>\n )}\n </AutoSizer>\n );\n }\n}\n\nexport default ItemList;\n"],"file":"ItemList.js"}
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","width","getItemData","getOuterElement","getInnerElement","DEFAULT_ROW_HEIGHT","DEFAULT_OVERSCAN"],"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};\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\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 } = 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 >\n {this.renderInnerElement}\n </List>\n )}\n </AutoSizer>\n );\n }\n}\n\nexport default ItemList;\n"],"file":"ItemList.js"}