@deephaven/components 0.19.2-beta.0 → 0.19.2-beta.5

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 (74) hide show
  1. package/dist/AutoCompleteInput.d.ts.map +1 -1
  2. package/dist/AutoCompleteInput.js +7 -11
  3. package/dist/AutoCompleteInput.js.map +1 -1
  4. package/dist/BasicModal.d.ts.map +1 -1
  5. package/dist/BasicModal.js +5 -7
  6. package/dist/BasicModal.js.map +1 -1
  7. package/dist/Button.d.ts +9 -3
  8. package/dist/Button.d.ts.map +1 -1
  9. package/dist/Button.js +18 -10
  10. package/dist/Button.js.map +1 -1
  11. package/dist/CardFlip.js +1 -1
  12. package/dist/CardFlip.js.map +1 -1
  13. package/dist/Collapse.js +2 -2
  14. package/dist/Collapse.js.map +1 -1
  15. package/dist/ComboBox.d.ts.map +1 -1
  16. package/dist/ComboBox.js +11 -15
  17. package/dist/ComboBox.js.map +1 -1
  18. package/dist/CustomTimeSelect.js +2 -2
  19. package/dist/CustomTimeSelect.js.map +1 -1
  20. package/dist/DraggableItemList.d.ts +1 -1
  21. package/dist/DraggableItemList.d.ts.map +1 -1
  22. package/dist/DraggableItemList.js +10 -7
  23. package/dist/DraggableItemList.js.map +1 -1
  24. package/dist/HierarchicalCheckboxMenu.d.ts.map +1 -1
  25. package/dist/HierarchicalCheckboxMenu.js +9 -6
  26. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  27. package/dist/ItemList.js +19 -17
  28. package/dist/ItemList.js.map +1 -1
  29. package/dist/LoadingOverlay.js +1 -1
  30. package/dist/LoadingOverlay.js.map +1 -1
  31. package/dist/MaskedInput.js +3 -1
  32. package/dist/MaskedInput.js.map +1 -1
  33. package/dist/RadioGroup.js +12 -8
  34. package/dist/RadioGroup.js.map +1 -1
  35. package/dist/SocketedButton.d.ts.map +1 -1
  36. package/dist/SocketedButton.js +1 -1
  37. package/dist/SocketedButton.js.map +1 -1
  38. package/dist/TimeSlider.d.ts.map +1 -1
  39. package/dist/TimeSlider.js +2 -2
  40. package/dist/TimeSlider.js.map +1 -1
  41. package/dist/ValidateLabelInput.d.ts.map +1 -1
  42. package/dist/ValidateLabelInput.js +2 -2
  43. package/dist/ValidateLabelInput.js.map +1 -1
  44. package/dist/context-actions/ContextActionUtils.d.ts +3 -3
  45. package/dist/context-actions/ContextActionUtils.js +14 -8
  46. package/dist/context-actions/ContextActionUtils.js.map +1 -1
  47. package/dist/context-actions/ContextActions.d.ts.map +1 -1
  48. package/dist/context-actions/ContextActions.js +9 -16
  49. package/dist/context-actions/ContextActions.js.map +1 -1
  50. package/dist/context-actions/ContextMenu.d.ts.map +1 -1
  51. package/dist/context-actions/ContextMenu.js +11 -13
  52. package/dist/context-actions/ContextMenu.js.map +1 -1
  53. package/dist/context-actions/ContextMenuItem.d.ts.map +1 -1
  54. package/dist/context-actions/ContextMenuItem.js +8 -6
  55. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  56. package/dist/context-actions/GlobalContextAction.d.ts.map +1 -1
  57. package/dist/context-actions/GlobalContextAction.js +7 -12
  58. package/dist/context-actions/GlobalContextAction.js.map +1 -1
  59. package/dist/context-actions/GlobalContextActions.js +1 -1
  60. package/dist/context-actions/GlobalContextActions.js.map +1 -1
  61. package/dist/menu-actions/DropdownMenu.js +1 -1
  62. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  63. package/dist/menu-actions/Menu.d.ts.map +1 -1
  64. package/dist/menu-actions/Menu.js +3 -3
  65. package/dist/menu-actions/Menu.js.map +1 -1
  66. package/dist/navigation/MenuItem.js +2 -2
  67. package/dist/navigation/MenuItem.js.map +1 -1
  68. package/dist/navigation/Stack.d.ts.map +1 -1
  69. package/dist/navigation/Stack.js +2 -2
  70. package/dist/navigation/Stack.js.map +1 -1
  71. package/dist/popper/Tooltip.js +1 -1
  72. package/dist/popper/Tooltip.js.map +1 -1
  73. package/package.json +8 -8
  74. package/scss/BaseStyleSheet.scss +5 -0
@@ -1 +1 @@
1
- {"version":3,"file":"DraggableItemList.js","names":["React","PureComponent","classNames","memoize","Draggable","Droppable","FontAwesomeIcon","vsGripper","RangeUtils","ItemList","Tooltip","DraggableItemList","renderHandle","renderBadge","text","renderTextItem","badgeText","className","renderItem","item","isClone","selectedCount","displayValue","value","getDraggableId","draggablePrefix","itemIndex","getDraggableIndex","draggableId","parseInt","split","pop","constructor","props","isFocused","isSelected","isDragDisabled","style","provided","innerRef","draggableProps","dragHandleProps","max","CACHE_SIZE","getCachedDraggableItem","draggingItemClassName","items","offset","snapshot","rubric","state","index","source","handleSelectionChange","bind","itemList","createRef","selectItem","current","focusItem","scrollToItem","selectedRanges","setState","count","onSelectionChange","render","droppableId","isDoubleClickSelect","isDropDisabled","isMultiSelect","isStickyBottom","itemCount","onFocusChange","onSelect","onViewportChange","rowHeight","dataTestId","getCachedRenderClone","draggingFromThisWith","isDraggingOver","draggingOverWith","droppableProps","getCachedRenderDraggableItem","DEFAULT_ROW_HEIGHT","isDeselectOnClick","disableSelect","undefined"],"sources":["../src/DraggableItemList.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport memoize from 'memoizee';\nimport { Draggable, Droppable, DraggableChildrenFn } from 'react-beautiful-dnd';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsGripper } from '@deephaven/icons';\nimport { RangeUtils, Range } from '@deephaven/utils';\nimport ItemList, {\n RenderItemProps,\n DefaultListItem,\n ItemListProps,\n} from './ItemList';\nimport { Tooltip } from './popper';\nimport './DraggableItemList.scss';\n\nexport type DraggableRenderItemProps<T> = RenderItemProps<T> & {\n isClone?: boolean;\n selectedCount?: number;\n};\n\ntype DraggableRenderItemFn<T> = (\n props: DraggableRenderItemProps<T>\n) => React.ReactNode;\n\ntype DraggableItemListProps<T> = Omit<\n ItemListProps<T>,\n 'overscanCount' | 'focusSelector' | 'isDragSelect'\n> & {\n className: string;\n draggingItemClassName: string;\n isDropDisabled: boolean;\n // Whether to allow dragging items from this list\n isDragDisabled: boolean;\n\n renderItem: DraggableRenderItemFn<T>;\n style: React.CSSProperties;\n\n // The prefix to add to all draggable item IDs\n draggablePrefix: string;\n // The ID to give the droppable list\n droppableId: string;\n\n 'data-testid'?: string;\n};\n\ntype DraggableItemListState = {\n selectedCount: number;\n};\n\n/**\n * Show a draggable item list. It _must_ be used within a `DragDropContext`.\n * This implementation uses react-beautiful-dnd for handling dragging and dropping of items.\n * We use ItemList to handle selection for multi drag and drop (not built in to react-beautiful-dnd).\n * One caveat with the use of react-beautiful-dnd is that it doesn't allow a drag to be initiated while\n * using a modifier key: https://github.com/atlassian/react-beautiful-dnd/issues/1678\n */\nclass DraggableItemList<T> extends PureComponent<\n DraggableItemListProps<T>,\n DraggableItemListState\n> {\n static DEFAULT_ROW_HEIGHT = 30;\n\n static defaultProps = {\n className: '',\n draggingItemClassName: '',\n offset: 0,\n items: [],\n rowHeight: DraggableItemList.DEFAULT_ROW_HEIGHT,\n isDeselectOnClick: true,\n isDoubleClickSelect: true,\n isDropDisabled: false,\n isDragDisabled: false,\n isMultiSelect: false,\n isStickyBottom: false,\n disableSelect: false,\n style: null,\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 renderItem: DraggableItemList.renderItem,\n selectedRanges: [],\n draggablePrefix: 'draggable-item',\n droppableId: 'droppable-item-list',\n 'data-testid': undefined,\n };\n\n static renderHandle(): JSX.Element {\n return (\n <div>\n <Tooltip>Drag to re-order</Tooltip>\n <FontAwesomeIcon icon={vsGripper} />\n </div>\n );\n }\n\n static renderBadge({ text }: { text?: string }): React.ReactNode {\n return text ? <span className=\"number-badge\">{text}</span> : null;\n }\n\n static renderTextItem({\n text,\n badgeText = '',\n className = '',\n }: {\n text: string;\n badgeText?: string;\n className: string;\n }): JSX.Element {\n return (\n <div\n className={classNames(\n 'item-list-item-content',\n 'draggable-item-list-item-content',\n className\n )}\n >\n <span className=\"title\">{text}</span>\n {DraggableItemList.renderBadge({ text: badgeText })}\n {DraggableItemList.renderHandle()}\n </div>\n );\n }\n\n static renderItem<P extends DefaultListItem>({\n item,\n isClone,\n selectedCount,\n }: DraggableRenderItemProps<P>): JSX.Element {\n const text = item && (item.displayValue || item.value || `${item}`);\n const badgeText = isClone ? `${selectedCount}` : '';\n const className = isClone ? 'item-list-item-clone' : '';\n return DraggableItemList.renderTextItem({ text, badgeText, className });\n }\n\n static getDraggableId(draggablePrefix: string, itemIndex: number): string {\n return `${draggablePrefix}/${itemIndex}`;\n }\n\n static getDraggableIndex(draggableId: string): number {\n return parseInt(draggableId.split('/').pop() || '', 10);\n }\n\n constructor(props: DraggableItemListProps<T>) {\n super(props);\n\n this.handleSelectionChange = this.handleSelectionChange.bind(this);\n\n this.itemList = React.createRef();\n\n this.state = {\n selectedCount: 0,\n };\n }\n\n itemList: React.RefObject<ItemList<T>>;\n\n selectItem(itemIndex: number): void {\n this.itemList.current?.selectItem(itemIndex);\n }\n\n focusItem(itemIndex: number): void {\n this.itemList.current?.focusItem(itemIndex);\n }\n\n scrollToItem(itemIndex: number): void {\n this.itemList.current?.scrollToItem(itemIndex);\n }\n\n getCachedDraggableItem = memoize(\n (\n draggablePrefix: string,\n renderItem: DraggableRenderItemFn<T>,\n item: T,\n itemIndex: number,\n isFocused: boolean,\n isSelected: boolean,\n isDragDisabled: boolean,\n style: React.CSSProperties\n ) => (\n <Draggable\n key={itemIndex}\n draggableId={DraggableItemList.getDraggableId(\n draggablePrefix,\n itemIndex\n )}\n index={itemIndex}\n isDragDisabled={isDragDisabled}\n >\n {provided => (\n <div\n role=\"menuitem\"\n className=\"draggable-item-list-item\"\n ref={provided.innerRef}\n tabIndex={-1}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n >\n {renderItem({\n item,\n itemIndex,\n isFocused,\n isSelected,\n style,\n isClone: false,\n })}\n </div>\n )}\n </Draggable>\n ),\n { max: ItemList.CACHE_SIZE }\n );\n\n handleSelectionChange(selectedRanges: Range[]): void {\n this.setState({ selectedCount: RangeUtils.count(selectedRanges) });\n\n const { onSelectionChange } = this.props;\n onSelectionChange(selectedRanges);\n }\n\n getCachedRenderDraggableItem = memoize(\n (\n draggablePrefix: string,\n isDragDisabled: boolean,\n renderItem: DraggableRenderItemFn<T>\n ) => ({\n item,\n itemIndex,\n isFocused,\n isSelected,\n style,\n }: RenderItemProps<T>) =>\n this.getCachedDraggableItem(\n draggablePrefix,\n renderItem,\n item,\n itemIndex,\n isFocused,\n isSelected,\n isDragDisabled,\n style\n ),\n { max: 1 }\n );\n\n getCachedRenderClone = memoize(\n (\n draggingItemClassName: string,\n items: T[],\n offset: number,\n renderItem: DraggableRenderItemFn<T>\n ): DraggableChildrenFn => (provided, snapshot, rubric) => {\n const { selectedCount } = this.state;\n const { index: itemIndex } = rubric.source;\n const item = items[itemIndex - offset];\n return (\n <div\n className={classNames(\n 'draggable-item-list-dragging-item-container',\n draggingItemClassName\n )}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n ref={provided.innerRef}\n >\n <div\n className={classNames(\n 'draggable-item-list-dragging-item',\n { 'two-dragged': selectedCount === 2 },\n { 'multiple-dragged': selectedCount > 2 }\n )}\n >\n {renderItem({\n item,\n itemIndex,\n isFocused: false,\n isSelected: true,\n style: {},\n isClone: true,\n selectedCount,\n })}\n </div>\n </div>\n );\n },\n { max: 1 }\n );\n\n render(): JSX.Element {\n const {\n className,\n draggablePrefix,\n draggingItemClassName,\n droppableId,\n isDoubleClickSelect,\n isDragDisabled,\n isDropDisabled,\n isMultiSelect,\n isStickyBottom,\n itemCount,\n items,\n offset,\n onFocusChange,\n onSelect,\n onViewportChange,\n renderItem,\n rowHeight,\n selectedRanges,\n style,\n 'data-testid': dataTestId,\n } = this.props;\n return (\n <Droppable\n isDropDisabled={isDropDisabled}\n droppableId={droppableId}\n mode=\"virtual\"\n renderClone={this.getCachedRenderClone(\n draggingItemClassName,\n items,\n offset,\n renderItem\n )}\n data-testid={dataTestId}\n >\n {(provided, snapshot) => (\n <div\n role=\"menu\"\n className={classNames('draggable-item-list', className, {\n 'is-drop-disabled': isDropDisabled,\n 'is-drag-disabled': isDragDisabled,\n 'is-dragging-from-this': snapshot.draggingFromThisWith,\n 'is-dragging-over': snapshot.isDraggingOver,\n 'is-dropping': snapshot.draggingOverWith,\n })}\n style={style}\n ref={provided.innerRef}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.droppableProps}\n >\n <ItemList\n focusSelector=\".draggable-item-list-item\"\n isDoubleClickSelect={isDoubleClickSelect}\n isDragSelect={false}\n isMultiSelect={isMultiSelect}\n isStickyBottom={isStickyBottom}\n itemCount={itemCount}\n items={items}\n onFocusChange={onFocusChange}\n onSelect={onSelect}\n onSelectionChange={this.handleSelectionChange}\n onViewportChange={onViewportChange}\n offset={offset}\n ref={this.itemList}\n renderItem={this.getCachedRenderDraggableItem(\n draggablePrefix,\n isDragDisabled,\n renderItem\n )}\n rowHeight={rowHeight}\n selectedRanges={selectedRanges}\n />\n </div>\n )}\n </Droppable>\n );\n }\n}\n\nexport default DraggableItemList;\n"],"mappings":"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"}
1
+ {"version":3,"file":"DraggableItemList.js","names":["React","PureComponent","classNames","memoize","Draggable","Droppable","FontAwesomeIcon","vsGripper","RangeUtils","ItemList","Tooltip","DraggableItemList","renderHandle","renderBadge","text","length","renderTextItem","badgeText","className","renderItem","item","isClone","selectedCount","displayValue","value","undefined","getDraggableId","draggablePrefix","itemIndex","getDraggableIndex","draggableId","num","split","pop","parseInt","constructor","props","isFocused","isSelected","isDragDisabled","style","provided","innerRef","draggableProps","dragHandleProps","max","CACHE_SIZE","getCachedDraggableItem","draggingItemClassName","items","offset","snapshot","rubric","state","index","source","handleSelectionChange","bind","itemList","createRef","selectItem","current","focusItem","scrollToItem","selectedRanges","setState","count","onSelectionChange","render","droppableId","isDoubleClickSelect","isDropDisabled","isMultiSelect","isStickyBottom","itemCount","onFocusChange","onSelect","onViewportChange","rowHeight","dataTestId","getCachedRenderClone","draggingFromThisWith","isDraggingOver","draggingOverWith","droppableProps","getCachedRenderDraggableItem","DEFAULT_ROW_HEIGHT","isDeselectOnClick","disableSelect"],"sources":["../src/DraggableItemList.tsx"],"sourcesContent":["import React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport memoize from 'memoizee';\nimport { Draggable, Droppable, DraggableChildrenFn } from 'react-beautiful-dnd';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsGripper } from '@deephaven/icons';\nimport { RangeUtils, Range } from '@deephaven/utils';\nimport ItemList, {\n RenderItemProps,\n DefaultListItem,\n ItemListProps,\n} from './ItemList';\nimport { Tooltip } from './popper';\nimport './DraggableItemList.scss';\n\nexport type DraggableRenderItemProps<T> = RenderItemProps<T> & {\n isClone?: boolean;\n selectedCount?: number;\n};\n\ntype DraggableRenderItemFn<T> = (\n props: DraggableRenderItemProps<T>\n) => React.ReactNode;\n\ntype DraggableItemListProps<T> = Omit<\n ItemListProps<T>,\n 'overscanCount' | 'focusSelector' | 'isDragSelect'\n> & {\n className: string;\n draggingItemClassName: string;\n isDropDisabled: boolean;\n // Whether to allow dragging items from this list\n isDragDisabled: boolean;\n\n renderItem: DraggableRenderItemFn<T>;\n style: React.CSSProperties;\n\n // The prefix to add to all draggable item IDs\n draggablePrefix: string;\n // The ID to give the droppable list\n droppableId: string;\n\n 'data-testid'?: string;\n};\n\ntype DraggableItemListState = {\n selectedCount: number;\n};\n\n/**\n * Show a draggable item list. It _must_ be used within a `DragDropContext`.\n * This implementation uses react-beautiful-dnd for handling dragging and dropping of items.\n * We use ItemList to handle selection for multi drag and drop (not built in to react-beautiful-dnd).\n * One caveat with the use of react-beautiful-dnd is that it doesn't allow a drag to be initiated while\n * using a modifier key: https://github.com/atlassian/react-beautiful-dnd/issues/1678\n */\nclass DraggableItemList<T> extends PureComponent<\n DraggableItemListProps<T>,\n DraggableItemListState\n> {\n static DEFAULT_ROW_HEIGHT = 30;\n\n static defaultProps = {\n className: '',\n draggingItemClassName: '',\n offset: 0,\n items: [],\n rowHeight: DraggableItemList.DEFAULT_ROW_HEIGHT,\n isDeselectOnClick: true,\n isDoubleClickSelect: true,\n isDropDisabled: false,\n isDragDisabled: false,\n isMultiSelect: false,\n isStickyBottom: false,\n disableSelect: false,\n style: null,\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 renderItem: DraggableItemList.renderItem,\n selectedRanges: [],\n draggablePrefix: 'draggable-item',\n droppableId: 'droppable-item-list',\n 'data-testid': undefined,\n };\n\n static renderHandle(): JSX.Element {\n return (\n <div>\n <Tooltip>Drag to re-order</Tooltip>\n <FontAwesomeIcon icon={vsGripper} />\n </div>\n );\n }\n\n static renderBadge({ text }: { text?: string }): React.ReactNode {\n return text != null && text.length > 0 ? (\n <span className=\"number-badge\">{text}</span>\n ) : null;\n }\n\n static renderTextItem({\n text,\n badgeText = '',\n className = '',\n }: {\n text?: string;\n badgeText?: string;\n className: string;\n }): JSX.Element {\n return (\n <div\n className={classNames(\n 'item-list-item-content',\n 'draggable-item-list-item-content',\n className\n )}\n >\n <span className=\"title\">{text}</span>\n {DraggableItemList.renderBadge({ text: badgeText })}\n {DraggableItemList.renderHandle()}\n </div>\n );\n }\n\n static renderItem<P extends DefaultListItem>({\n item,\n isClone,\n selectedCount,\n }: DraggableRenderItemProps<P>): JSX.Element {\n const text =\n item != null ? item.displayValue ?? item.value ?? `${item}` : '';\n const badgeText =\n isClone !== undefined && isClone ? `${selectedCount}` : '';\n const className =\n isClone !== undefined && isClone ? 'item-list-item-clone' : '';\n return DraggableItemList.renderTextItem({ text, badgeText, className });\n }\n\n static getDraggableId(draggablePrefix: string, itemIndex: number): string {\n return `${draggablePrefix}/${itemIndex}`;\n }\n\n static getDraggableIndex(draggableId: string): number {\n const num = draggableId.split('/').pop();\n return parseInt(num !== undefined ? num : '', 10);\n }\n\n constructor(props: DraggableItemListProps<T>) {\n super(props);\n\n this.handleSelectionChange = this.handleSelectionChange.bind(this);\n\n this.itemList = React.createRef();\n\n this.state = {\n selectedCount: 0,\n };\n }\n\n itemList: React.RefObject<ItemList<T>>;\n\n selectItem(itemIndex: number): void {\n this.itemList.current?.selectItem(itemIndex);\n }\n\n focusItem(itemIndex: number): void {\n this.itemList.current?.focusItem(itemIndex);\n }\n\n scrollToItem(itemIndex: number): void {\n this.itemList.current?.scrollToItem(itemIndex);\n }\n\n getCachedDraggableItem = memoize(\n (\n draggablePrefix: string,\n renderItem: DraggableRenderItemFn<T>,\n item: T,\n itemIndex: number,\n isFocused: boolean,\n isSelected: boolean,\n isDragDisabled: boolean,\n style: React.CSSProperties\n ) => (\n <Draggable\n key={itemIndex}\n draggableId={DraggableItemList.getDraggableId(\n draggablePrefix,\n itemIndex\n )}\n index={itemIndex}\n isDragDisabled={isDragDisabled}\n >\n {provided => (\n <div\n role=\"menuitem\"\n className=\"draggable-item-list-item\"\n ref={provided.innerRef}\n tabIndex={-1}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n >\n {renderItem({\n item,\n itemIndex,\n isFocused,\n isSelected,\n style,\n isClone: false,\n })}\n </div>\n )}\n </Draggable>\n ),\n { max: ItemList.CACHE_SIZE }\n );\n\n handleSelectionChange(selectedRanges: Range[]): void {\n this.setState({ selectedCount: RangeUtils.count(selectedRanges) });\n\n const { onSelectionChange } = this.props;\n onSelectionChange(selectedRanges);\n }\n\n getCachedRenderDraggableItem = memoize(\n (\n draggablePrefix: string,\n isDragDisabled: boolean,\n renderItem: DraggableRenderItemFn<T>\n ) => ({\n item,\n itemIndex,\n isFocused,\n isSelected,\n style,\n }: RenderItemProps<T>) =>\n this.getCachedDraggableItem(\n draggablePrefix,\n renderItem,\n item,\n itemIndex,\n isFocused,\n isSelected,\n isDragDisabled,\n style\n ),\n { max: 1 }\n );\n\n getCachedRenderClone = memoize(\n (\n draggingItemClassName: string,\n items: T[],\n offset: number,\n renderItem: DraggableRenderItemFn<T>\n ): DraggableChildrenFn => (provided, snapshot, rubric) => {\n const { selectedCount } = this.state;\n const { index: itemIndex } = rubric.source;\n const item = items[itemIndex - offset];\n return (\n <div\n className={classNames(\n 'draggable-item-list-dragging-item-container',\n draggingItemClassName\n )}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.draggableProps}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.dragHandleProps}\n ref={provided.innerRef}\n >\n <div\n className={classNames(\n 'draggable-item-list-dragging-item',\n { 'two-dragged': selectedCount === 2 },\n { 'multiple-dragged': selectedCount > 2 }\n )}\n >\n {renderItem({\n item,\n itemIndex,\n isFocused: false,\n isSelected: true,\n style: {},\n isClone: true,\n selectedCount,\n })}\n </div>\n </div>\n );\n },\n { max: 1 }\n );\n\n render(): JSX.Element {\n const {\n className,\n draggablePrefix,\n draggingItemClassName,\n droppableId,\n isDoubleClickSelect,\n isDragDisabled,\n isDropDisabled,\n isMultiSelect,\n isStickyBottom,\n itemCount,\n items,\n offset,\n onFocusChange,\n onSelect,\n onViewportChange,\n renderItem,\n rowHeight,\n selectedRanges,\n style,\n 'data-testid': dataTestId,\n } = this.props;\n return (\n <Droppable\n isDropDisabled={isDropDisabled}\n droppableId={droppableId}\n mode=\"virtual\"\n renderClone={this.getCachedRenderClone(\n draggingItemClassName,\n items,\n offset,\n renderItem\n )}\n data-testid={dataTestId}\n >\n {(provided, snapshot) => (\n <div\n role=\"menu\"\n className={classNames('draggable-item-list', className, {\n 'is-drop-disabled': isDropDisabled,\n 'is-drag-disabled': isDragDisabled,\n 'is-dragging-from-this': snapshot.draggingFromThisWith,\n 'is-dragging-over': snapshot.isDraggingOver,\n 'is-dropping': snapshot.draggingOverWith,\n })}\n style={style}\n ref={provided.innerRef}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...provided.droppableProps}\n >\n <ItemList\n focusSelector=\".draggable-item-list-item\"\n isDoubleClickSelect={isDoubleClickSelect}\n isDragSelect={false}\n isMultiSelect={isMultiSelect}\n isStickyBottom={isStickyBottom}\n itemCount={itemCount}\n items={items}\n onFocusChange={onFocusChange}\n onSelect={onSelect}\n onSelectionChange={this.handleSelectionChange}\n onViewportChange={onViewportChange}\n offset={offset}\n ref={this.itemList}\n renderItem={this.getCachedRenderDraggableItem(\n draggablePrefix,\n isDragDisabled,\n renderItem\n )}\n rowHeight={rowHeight}\n selectedRanges={selectedRanges}\n />\n </div>\n )}\n </Droppable>\n );\n }\n}\n\nexport default DraggableItemList;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"HierarchicalCheckboxMenu.d.ts","sourceRoot":"","sources":["../src/HierarchicalCheckboxMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAU,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAI1D,OAAO,iCAAiC,CAAC;AAEzC,oBAAY,4BAA4B,GAAG,GAAG,CAC5C,MAAM,EACN,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAC/B,CAAC;AAEF,aAAK,6BAA6B,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,4BAA4B,CAAC;IACvC,gBAAgB,CAAC,GAAG,EAAE,4BAA4B,GAAG,IAAI,CAAC;IAC1D,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,aAAK,6BAA6B,GAAG;IACnC,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,cAAM,wBAAyB,SAAQ,SAAS,CAC9C,6BAA6B,EAC7B,6BAA6B,CAC9B;IACC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,6BAA6B,CAAC,CAKzD;IAEF,MAAM,CAAC,gBAAgB,CACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,4BAA4B,GACrC,OAAO,GAAG,IAAI;gBAkBL,KAAK,EAAE,6BAA6B;IAahD,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAS5D,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAwCpD,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAkBlC,SAAS,IAAI,IAAI;IAIjB,KAAK,IAAI,IAAI;IAIb,iBAAiB,IAAI,KAAK,CAAC,SAAS;IAkDpC,MAAM,IAAI,GAAG,CAAC,OAAO;CAqCtB;AAED,eAAe,wBAAwB,CAAC"}
1
+ {"version":3,"file":"HierarchicalCheckboxMenu.d.ts","sourceRoot":"","sources":["../src/HierarchicalCheckboxMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzC,OAAO,EAAU,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAI1D,OAAO,iCAAiC,CAAC;AAEzC,oBAAY,4BAA4B,GAAG,GAAG,CAC5C,MAAM,EACN,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAC/B,CAAC;AAEF,aAAK,6BAA6B,GAAG;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,4BAA4B,CAAC;IACvC,gBAAgB,CAAC,GAAG,EAAE,4BAA4B,GAAG,IAAI,CAAC;IAC1D,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,aAAK,6BAA6B,GAAG;IACnC,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,cAAM,wBAAyB,SAAQ,SAAS,CAC9C,6BAA6B,EAC7B,6BAA6B,CAC9B;IACC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,6BAA6B,CAAC,CAKzD;IAEF,MAAM,CAAC,gBAAgB,CACrB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,4BAA4B,GACrC,OAAO,GAAG,IAAI;gBAkBL,KAAK,EAAE,6BAA6B;IAahD,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAS5D,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IA6CpD,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAkBlC,SAAS,IAAI,IAAI;IAIjB,KAAK,IAAI,IAAI;IAIb,iBAAiB,IAAI,KAAK,CAAC,SAAS;IAwDpC,MAAM,IAAI,GAAG,CAAC,OAAO;CAqCtB;AAED,eAAe,wBAAwB,CAAC"}
@@ -95,22 +95,25 @@ class HierarchicalCheckboxMenu extends Component {
95
95
  var newChildren = new Map(children);
96
96
 
97
97
  if (child != null) {
98
- newChildren.set(child, !children.get(child));
98
+ newChildren.set(child, children.get(child) === undefined);
99
99
  } else {
100
- var newChildValue = !HierarchicalCheckboxMenu.isParentSelected(parent, map);
100
+ var parentSelected = HierarchicalCheckboxMenu.isParentSelected(parent, map);
101
+ var newChildValue = parentSelected == null || !parentSelected;
101
102
  children.forEach((_, key) => newChildren.set(key, newChildValue));
102
103
  }
103
104
 
104
105
  map.set(parent, newChildren);
105
106
  } else {
106
- map.set(parent, !children);
107
+ map.set(parent, children == null || !children);
107
108
  } // The parent was clicked so all children must be toggled
108
109
 
109
110
 
110
111
  var currentChildren = map.get(parent);
111
112
 
112
113
  if (child === undefined && currentChildren !== undefined && typeof currentChildren !== 'boolean') {
113
- if (HierarchicalCheckboxMenu.isParentSelected(parent, valueMap)) {
114
+ var _parentSelected = HierarchicalCheckboxMenu.isParentSelected(parent, valueMap);
115
+
116
+ if (_parentSelected != null && _parentSelected) {
114
117
  currentChildren.forEach((_, key) => currentChildren.set(key, false));
115
118
  } else {
116
119
  // for parent selection of false or null (indeterminate), select everything
@@ -176,12 +179,12 @@ class HierarchicalCheckboxMenu extends Component {
176
179
  type: "button",
177
180
  className: "btn btn-link",
178
181
  onClick: this.selectAll,
179
- "data-testid": dataTestId ? "".concat(dataTestId, "-btn-select-all") : undefined
182
+ "data-testid": dataTestId !== undefined ? "".concat(dataTestId, "-btn-select-all") : undefined
180
183
  }, "Select All"), /*#__PURE__*/React.createElement("button", {
181
184
  type: "button",
182
185
  className: "btn btn-link",
183
186
  onClick: this.clear,
184
- "data-testid": dataTestId ? "".concat(dataTestId, "-btn-clear") : undefined
187
+ "data-testid": dataTestId !== undefined ? "".concat(dataTestId, "-btn-clear") : undefined
185
188
  }, "Clear"));
186
189
  }
187
190
 
@@ -1 +1 @@
1
- {"version":3,"file":"HierarchicalCheckboxMenu.js","names":["React","Component","FontAwesomeIcon","dhSort","classNames","Checkbox","Popper","HierarchicalCheckboxMenu","isParentSelected","parent","valueMap","children","get","undefined","includesTrue","Array","from","values","includes","includesFalse","constructor","props","toggleMenu","bind","toggleValueFor","selectAll","clear","state","menuIsOpen","event","stopPropagation","preventDefault","setState","child","onUpdateValueMap","map","Map","newChildren","set","newChildValue","forEach","_","key","currentChildren","setAllValues","value","copy","renderMenuElement","dataTestId","entries","render","menuText","className","icon","id","placement"],"sources":["../src/HierarchicalCheckboxMenu.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { dhSort, IconDefinition } from '@deephaven/icons';\nimport classNames from 'classnames';\nimport Checkbox from './Checkbox';\nimport Popper from './popper/Popper';\nimport './HierarchicalCheckboxMenu.scss';\n\nexport type HierarchicalCheckboxValueMap = Map<\n string,\n boolean | Map<string, boolean>\n>;\n\ntype HierarchicalCheckboxMenuProps = {\n className: string;\n menuText: string;\n valueMap: HierarchicalCheckboxValueMap;\n onUpdateValueMap(map: HierarchicalCheckboxValueMap): void;\n icon: IconDefinition | null;\n id: string;\n 'data-testid'?: string;\n};\n\ntype HierarchicalCheckboxMenuState = {\n menuIsOpen: boolean;\n};\n\n/**\n * A pull down menu that displays a hierarchy of checkboxes.\n *\n * Currently supports only two levels of check boxes. The input should be a Map\n * where the keys are the parent names. The values can a boolean if the parent\n * has no children or another Map where keys are child names and values are booleans.\n *\n * Here is an example:\n * const INITIAL_TYPE_MAP = new Map([\n * ['Queries', new Map([['Live', true], ['Batch', true]])],\n * [\n * 'DBA Queries',\n * new Map([\n * ['Data Merge', true],\n * ['Data Validation', true],\n * ['Imports', true],\n * ['Data Services', true],\n * ]),\n * ],\n * ['Helper Queries', true],\n * ]);\n *\n * When a checkbox is changed, this component will make a deep copy of the Map\n * with the appropriate booleans changed. It will then call onUpdateValueMap\n * with the new Map.\n */\nclass HierarchicalCheckboxMenu extends Component<\n HierarchicalCheckboxMenuProps,\n HierarchicalCheckboxMenuState\n> {\n static defaultProps: Partial<HierarchicalCheckboxMenuProps> = {\n className: '',\n icon: null,\n id: '',\n 'data-testid': undefined,\n };\n\n static isParentSelected(\n parent: string,\n valueMap: HierarchicalCheckboxValueMap\n ): boolean | null {\n const children = valueMap.get(parent);\n if (children === undefined) {\n return false;\n }\n if (typeof children === 'boolean') {\n // This parent has no children\n return children;\n }\n const includesTrue = Array.from(children.values()).includes(true);\n const includesFalse = Array.from(children.values()).includes(false);\n if (includesTrue && includesFalse) {\n // Indeterminate\n return null;\n }\n return includesTrue;\n }\n\n constructor(props: HierarchicalCheckboxMenuProps) {\n super(props);\n\n this.toggleMenu = this.toggleMenu.bind(this);\n this.toggleValueFor = this.toggleValueFor.bind(this);\n this.selectAll = this.selectAll.bind(this);\n this.clear = this.clear.bind(this);\n\n this.state = {\n menuIsOpen: false,\n };\n }\n\n toggleMenu(event: React.MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n event.preventDefault();\n this.setState(state => {\n const { menuIsOpen } = state;\n return { menuIsOpen: !menuIsOpen };\n });\n }\n\n toggleValueFor(parent: string, child?: string): void {\n const { valueMap, onUpdateValueMap } = this.props;\n\n // Make a deep copy of the Map and toggle the boolean for parent / child\n const map = new Map(valueMap);\n const children = map.get(parent);\n if (children instanceof Map) {\n const newChildren = new Map(children);\n if (child != null) {\n newChildren.set(child, !children.get(child));\n } else {\n const newChildValue = !HierarchicalCheckboxMenu.isParentSelected(\n parent,\n map\n );\n children.forEach((_, key) => newChildren.set(key, newChildValue));\n }\n map.set(parent, newChildren);\n } else {\n map.set(parent, !children);\n }\n\n // The parent was clicked so all children must be toggled\n const currentChildren = map.get(parent);\n if (\n child === undefined &&\n currentChildren !== undefined &&\n typeof currentChildren !== 'boolean'\n ) {\n if (HierarchicalCheckboxMenu.isParentSelected(parent, valueMap)) {\n currentChildren.forEach((_, key) => currentChildren.set(key, false));\n } else {\n // for parent selection of false or null (indeterminate), select everything\n currentChildren.forEach((_, key) => currentChildren.set(key, true));\n }\n }\n\n onUpdateValueMap(map);\n }\n\n setAllValues(value: boolean): void {\n const { valueMap, onUpdateValueMap } = this.props;\n\n // Make a deep copy of the Map and set everything\n const copy = new Map();\n valueMap.forEach((child, parent) => {\n if (typeof child === 'boolean') {\n copy.set(parent, value);\n } else {\n const children = new Map();\n child.forEach((_, key) => children.set(key, value));\n copy.set(parent, children);\n }\n });\n\n onUpdateValueMap(copy);\n }\n\n selectAll(): void {\n this.setAllValues(true);\n }\n\n clear(): void {\n this.setAllValues(false);\n }\n\n renderMenuElement(): React.ReactNode {\n const { valueMap, 'data-testid': dataTestId } = this.props;\n return (\n <div className=\"hcm-menu-container\">\n {Array.from(valueMap.entries()).map(([parent, children]) => (\n <div key={parent}>\n <Checkbox\n className=\"hcm-parent\"\n checked={HierarchicalCheckboxMenu.isParentSelected(\n parent,\n valueMap\n )}\n onChange={() => this.toggleValueFor(parent)}\n >\n {parent}\n </Checkbox>\n {children !== undefined &&\n typeof children !== 'boolean' &&\n Array.from(children.entries()).map(([child, value]) => (\n <Checkbox\n className=\"hcm-child\"\n key={child}\n checked={value}\n onChange={() => this.toggleValueFor(parent, child)}\n >\n {child}\n </Checkbox>\n ))}\n </div>\n ))}\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.selectAll}\n data-testid={dataTestId ? `${dataTestId}-btn-select-all` : undefined}\n >\n Select All\n </button>\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.clear}\n data-testid={dataTestId ? `${dataTestId}-btn-clear` : undefined}\n >\n Clear\n </button>\n </div>\n );\n }\n\n render(): JSX.Element {\n const {\n menuText,\n className,\n icon,\n id,\n 'data-testid': dataTestId,\n } = this.props;\n const { menuIsOpen } = this.state;\n\n return (\n <button\n type=\"button\"\n className={classNames('btn hcm-btn', className)}\n onClick={this.toggleMenu}\n id={id}\n data-testid={dataTestId}\n >\n <span>\n {icon && <FontAwesomeIcon icon={icon} className=\"hcm-icon mr-1\" />}\n {menuText}\n </span>\n <FontAwesomeIcon icon={dhSort} className=\"hcm-icon ml-1\" />\n <Popper\n options={{ placement: 'bottom' }}\n isShown={menuIsOpen}\n onExited={() => {\n this.setState({ menuIsOpen: false });\n }}\n closeOnBlur\n interactive\n >\n {this.renderMenuElement()}\n </Popper>\n </button>\n );\n }\n}\n\nexport default HierarchicalCheckboxMenu;\n"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,SAAhB,QAAiC,OAAjC;AACA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SAASC,MAAT,QAAuC,kBAAvC;AACA,OAAOC,UAAP,MAAuB,YAAvB;OACOC,Q;OACAC,M;;;AAsBP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,wBAAN,SAAuCN,SAAvC,CAGE;EAQuB,OAAhBO,gBAAgB,CACrBC,MADqB,EAErBC,QAFqB,EAGL;IAChB,IAAMC,QAAQ,GAAGD,QAAQ,CAACE,GAAT,CAAaH,MAAb,CAAjB;;IACA,IAAIE,QAAQ,KAAKE,SAAjB,EAA4B;MAC1B,OAAO,KAAP;IACD;;IACD,IAAI,OAAOF,QAAP,KAAoB,SAAxB,EAAmC;MACjC;MACA,OAAOA,QAAP;IACD;;IACD,IAAMG,YAAY,GAAGC,KAAK,CAACC,IAAN,CAAWL,QAAQ,CAACM,MAAT,EAAX,EAA8BC,QAA9B,CAAuC,IAAvC,CAArB;IACA,IAAMC,aAAa,GAAGJ,KAAK,CAACC,IAAN,CAAWL,QAAQ,CAACM,MAAT,EAAX,EAA8BC,QAA9B,CAAuC,KAAvC,CAAtB;;IACA,IAAIJ,YAAY,IAAIK,aAApB,EAAmC;MACjC;MACA,OAAO,IAAP;IACD;;IACD,OAAOL,YAAP;EACD;;EAEDM,WAAW,CAACC,KAAD,EAAuC;IAChD,MAAMA,KAAN;IAEA,KAAKC,UAAL,GAAkB,KAAKA,UAAL,CAAgBC,IAAhB,CAAqB,IAArB,CAAlB;IACA,KAAKC,cAAL,GAAsB,KAAKA,cAAL,CAAoBD,IAApB,CAAyB,IAAzB,CAAtB;IACA,KAAKE,SAAL,GAAiB,KAAKA,SAAL,CAAeF,IAAf,CAAoB,IAApB,CAAjB;IACA,KAAKG,KAAL,GAAa,KAAKA,KAAL,CAAWH,IAAX,CAAgB,IAAhB,CAAb;IAEA,KAAKI,KAAL,GAAa;MACXC,UAAU,EAAE;IADD,CAAb;EAGD;;EAEDN,UAAU,CAACO,KAAD,EAAmD;IAC3DA,KAAK,CAACC,eAAN;IACAD,KAAK,CAACE,cAAN;IACA,KAAKC,QAAL,CAAcL,KAAK,IAAI;MACrB,IAAM;QAAEC;MAAF,IAAiBD,KAAvB;MACA,OAAO;QAAEC,UAAU,EAAE,CAACA;MAAf,CAAP;IACD,CAHD;EAID;;EAEDJ,cAAc,CAACf,MAAD,EAAiBwB,KAAjB,EAAuC;IACnD,IAAM;MAAEvB,QAAF;MAAYwB;IAAZ,IAAiC,KAAKb,KAA5C,CADmD,CAGnD;;IACA,IAAMc,GAAG,GAAG,IAAIC,GAAJ,CAAQ1B,QAAR,CAAZ;IACA,IAAMC,QAAQ,GAAGwB,GAAG,CAACvB,GAAJ,CAAQH,MAAR,CAAjB;;IACA,IAAIE,QAAQ,YAAYyB,GAAxB,EAA6B;MAC3B,IAAMC,WAAW,GAAG,IAAID,GAAJ,CAAQzB,QAAR,CAApB;;MACA,IAAIsB,KAAK,IAAI,IAAb,EAAmB;QACjBI,WAAW,CAACC,GAAZ,CAAgBL,KAAhB,EAAuB,CAACtB,QAAQ,CAACC,GAAT,CAAaqB,KAAb,CAAxB;MACD,CAFD,MAEO;QACL,IAAMM,aAAa,GAAG,CAAChC,wBAAwB,CAACC,gBAAzB,CACrBC,MADqB,EAErB0B,GAFqB,CAAvB;QAIAxB,QAAQ,CAAC6B,OAAT,CAAiB,CAACC,CAAD,EAAIC,GAAJ,KAAYL,WAAW,CAACC,GAAZ,CAAgBI,GAAhB,EAAqBH,aAArB,CAA7B;MACD;;MACDJ,GAAG,CAACG,GAAJ,CAAQ7B,MAAR,EAAgB4B,WAAhB;IACD,CAZD,MAYO;MACLF,GAAG,CAACG,GAAJ,CAAQ7B,MAAR,EAAgB,CAACE,QAAjB;IACD,CApBkD,CAsBnD;;;IACA,IAAMgC,eAAe,GAAGR,GAAG,CAACvB,GAAJ,CAAQH,MAAR,CAAxB;;IACA,IACEwB,KAAK,KAAKpB,SAAV,IACA8B,eAAe,KAAK9B,SADpB,IAEA,OAAO8B,eAAP,KAA2B,SAH7B,EAIE;MACA,IAAIpC,wBAAwB,CAACC,gBAAzB,CAA0CC,MAA1C,EAAkDC,QAAlD,CAAJ,EAAiE;QAC/DiC,eAAe,CAACH,OAAhB,CAAwB,CAACC,CAAD,EAAIC,GAAJ,KAAYC,eAAe,CAACL,GAAhB,CAAoBI,GAApB,EAAyB,KAAzB,CAApC;MACD,CAFD,MAEO;QACL;QACAC,eAAe,CAACH,OAAhB,CAAwB,CAACC,CAAD,EAAIC,GAAJ,KAAYC,eAAe,CAACL,GAAhB,CAAoBI,GAApB,EAAyB,IAAzB,CAApC;MACD;IACF;;IAEDR,gBAAgB,CAACC,GAAD,CAAhB;EACD;;EAEDS,YAAY,CAACC,KAAD,EAAuB;IACjC,IAAM;MAAEnC,QAAF;MAAYwB;IAAZ,IAAiC,KAAKb,KAA5C,CADiC,CAGjC;;IACA,IAAMyB,IAAI,GAAG,IAAIV,GAAJ,EAAb;IACA1B,QAAQ,CAAC8B,OAAT,CAAiB,CAACP,KAAD,EAAQxB,MAAR,KAAmB;MAClC,IAAI,OAAOwB,KAAP,KAAiB,SAArB,EAAgC;QAC9Ba,IAAI,CAACR,GAAL,CAAS7B,MAAT,EAAiBoC,KAAjB;MACD,CAFD,MAEO;QACL,IAAMlC,QAAQ,GAAG,IAAIyB,GAAJ,EAAjB;QACAH,KAAK,CAACO,OAAN,CAAc,CAACC,CAAD,EAAIC,GAAJ,KAAY/B,QAAQ,CAAC2B,GAAT,CAAaI,GAAb,EAAkBG,KAAlB,CAA1B;QACAC,IAAI,CAACR,GAAL,CAAS7B,MAAT,EAAiBE,QAAjB;MACD;IACF,CARD;IAUAuB,gBAAgB,CAACY,IAAD,CAAhB;EACD;;EAEDrB,SAAS,GAAS;IAChB,KAAKmB,YAAL,CAAkB,IAAlB;EACD;;EAEDlB,KAAK,GAAS;IACZ,KAAKkB,YAAL,CAAkB,KAAlB;EACD;;EAEDG,iBAAiB,GAAoB;IACnC,IAAM;MAAErC,QAAF;MAAY,eAAesC;IAA3B,IAA0C,KAAK3B,KAArD;IACA,oBACE;MAAK,SAAS,EAAC;IAAf,GACGN,KAAK,CAACC,IAAN,CAAWN,QAAQ,CAACuC,OAAT,EAAX,EAA+Bd,GAA/B,CAAmC;MAAA,IAAC,CAAC1B,MAAD,EAASE,QAAT,CAAD;MAAA,oBAClC;QAAK,GAAG,EAAEF;MAAV,gBACE,oBAAC,QAAD;QACE,SAAS,EAAC,YADZ;QAEE,OAAO,EAAEF,wBAAwB,CAACC,gBAAzB,CACPC,MADO,EAEPC,QAFO,CAFX;QAME,QAAQ,EAAE,MAAM,KAAKc,cAAL,CAAoBf,MAApB;MANlB,GAQGA,MARH,CADF,EAWGE,QAAQ,KAAKE,SAAb,IACC,OAAOF,QAAP,KAAoB,SADrB,IAECI,KAAK,CAACC,IAAN,CAAWL,QAAQ,CAACsC,OAAT,EAAX,EAA+Bd,GAA/B,CAAmC;QAAA,IAAC,CAACF,KAAD,EAAQY,KAAR,CAAD;QAAA,oBACjC,oBAAC,QAAD;UACE,SAAS,EAAC,WADZ;UAEE,GAAG,EAAEZ,KAFP;UAGE,OAAO,EAAEY,KAHX;UAIE,QAAQ,EAAE,MAAM,KAAKrB,cAAL,CAAoBf,MAApB,EAA4BwB,KAA5B;QAJlB,GAMGA,KANH,CADiC;MAAA,CAAnC,CAbJ,CADkC;IAAA,CAAnC,CADH,eA2BE;MACE,IAAI,EAAC,QADP;MAEE,SAAS,EAAC,cAFZ;MAGE,OAAO,EAAE,KAAKR,SAHhB;MAIE,eAAauB,UAAU,aAAMA,UAAN,uBAAoCnC;IAJ7D,gBA3BF,eAmCE;MACE,IAAI,EAAC,QADP;MAEE,SAAS,EAAC,cAFZ;MAGE,OAAO,EAAE,KAAKa,KAHhB;MAIE,eAAasB,UAAU,aAAMA,UAAN,kBAA+BnC;IAJxD,WAnCF,CADF;EA8CD;;EAEDqC,MAAM,GAAgB;IACpB,IAAM;MACJC,QADI;MAEJC,SAFI;MAGJC,IAHI;MAIJC,EAJI;MAKJ,eAAeN;IALX,IAMF,KAAK3B,KANT;IAOA,IAAM;MAAEO;IAAF,IAAiB,KAAKD,KAA5B;IAEA,oBACE;MACE,IAAI,EAAC,QADP;MAEE,SAAS,EAAEvB,UAAU,CAAC,aAAD,EAAgBgD,SAAhB,CAFvB;MAGE,OAAO,EAAE,KAAK9B,UAHhB;MAIE,EAAE,EAAEgC,EAJN;MAKE,eAAaN;IALf,gBAOE,kCACGK,IAAI,iBAAI,oBAAC,eAAD;MAAiB,IAAI,EAAEA,IAAvB;MAA6B,SAAS,EAAC;IAAvC,EADX,EAEGF,QAFH,CAPF,eAWE,oBAAC,eAAD;MAAiB,IAAI,EAAEhD,MAAvB;MAA+B,SAAS,EAAC;IAAzC,EAXF,eAYE,oBAAC,MAAD;MACE,OAAO,EAAE;QAAEoD,SAAS,EAAE;MAAb,CADX;MAEE,OAAO,EAAE3B,UAFX;MAGE,QAAQ,EAAE,MAAM;QACd,KAAKI,QAAL,CAAc;UAAEJ,UAAU,EAAE;QAAd,CAAd;MACD,CALH;MAME,WAAW,MANb;MAOE,WAAW;IAPb,GASG,KAAKmB,iBAAL,EATH,CAZF,CADF;EA0BD;;AA3MD;;gBAHIxC,wB,kBAI0D;EAC5D6C,SAAS,EAAE,EADiD;EAE5DC,IAAI,EAAE,IAFsD;EAG5DC,EAAE,EAAE,EAHwD;EAI5D,eAAezC;AAJ6C,C;;AA6MhE,eAAeN,wBAAf"}
1
+ {"version":3,"file":"HierarchicalCheckboxMenu.js","names":["React","Component","FontAwesomeIcon","dhSort","classNames","Checkbox","Popper","HierarchicalCheckboxMenu","isParentSelected","parent","valueMap","children","get","undefined","includesTrue","Array","from","values","includes","includesFalse","constructor","props","toggleMenu","bind","toggleValueFor","selectAll","clear","state","menuIsOpen","event","stopPropagation","preventDefault","setState","child","onUpdateValueMap","map","Map","newChildren","set","parentSelected","newChildValue","forEach","_","key","currentChildren","setAllValues","value","copy","renderMenuElement","dataTestId","entries","render","menuText","className","icon","id","placement"],"sources":["../src/HierarchicalCheckboxMenu.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { dhSort, IconDefinition } from '@deephaven/icons';\nimport classNames from 'classnames';\nimport Checkbox from './Checkbox';\nimport Popper from './popper/Popper';\nimport './HierarchicalCheckboxMenu.scss';\n\nexport type HierarchicalCheckboxValueMap = Map<\n string,\n boolean | Map<string, boolean>\n>;\n\ntype HierarchicalCheckboxMenuProps = {\n className: string;\n menuText: string;\n valueMap: HierarchicalCheckboxValueMap;\n onUpdateValueMap(map: HierarchicalCheckboxValueMap): void;\n icon: IconDefinition | null;\n id: string;\n 'data-testid'?: string;\n};\n\ntype HierarchicalCheckboxMenuState = {\n menuIsOpen: boolean;\n};\n\n/**\n * A pull down menu that displays a hierarchy of checkboxes.\n *\n * Currently supports only two levels of check boxes. The input should be a Map\n * where the keys are the parent names. The values can a boolean if the parent\n * has no children or another Map where keys are child names and values are booleans.\n *\n * Here is an example:\n * const INITIAL_TYPE_MAP = new Map([\n * ['Queries', new Map([['Live', true], ['Batch', true]])],\n * [\n * 'DBA Queries',\n * new Map([\n * ['Data Merge', true],\n * ['Data Validation', true],\n * ['Imports', true],\n * ['Data Services', true],\n * ]),\n * ],\n * ['Helper Queries', true],\n * ]);\n *\n * When a checkbox is changed, this component will make a deep copy of the Map\n * with the appropriate booleans changed. It will then call onUpdateValueMap\n * with the new Map.\n */\nclass HierarchicalCheckboxMenu extends Component<\n HierarchicalCheckboxMenuProps,\n HierarchicalCheckboxMenuState\n> {\n static defaultProps: Partial<HierarchicalCheckboxMenuProps> = {\n className: '',\n icon: null,\n id: '',\n 'data-testid': undefined,\n };\n\n static isParentSelected(\n parent: string,\n valueMap: HierarchicalCheckboxValueMap\n ): boolean | null {\n const children = valueMap.get(parent);\n if (children === undefined) {\n return false;\n }\n if (typeof children === 'boolean') {\n // This parent has no children\n return children;\n }\n const includesTrue = Array.from(children.values()).includes(true);\n const includesFalse = Array.from(children.values()).includes(false);\n if (includesTrue && includesFalse) {\n // Indeterminate\n return null;\n }\n return includesTrue;\n }\n\n constructor(props: HierarchicalCheckboxMenuProps) {\n super(props);\n\n this.toggleMenu = this.toggleMenu.bind(this);\n this.toggleValueFor = this.toggleValueFor.bind(this);\n this.selectAll = this.selectAll.bind(this);\n this.clear = this.clear.bind(this);\n\n this.state = {\n menuIsOpen: false,\n };\n }\n\n toggleMenu(event: React.MouseEvent<HTMLButtonElement>): void {\n event.stopPropagation();\n event.preventDefault();\n this.setState(state => {\n const { menuIsOpen } = state;\n return { menuIsOpen: !menuIsOpen };\n });\n }\n\n toggleValueFor(parent: string, child?: string): void {\n const { valueMap, onUpdateValueMap } = this.props;\n\n // Make a deep copy of the Map and toggle the boolean for parent / child\n const map = new Map(valueMap);\n const children = map.get(parent);\n if (children instanceof Map) {\n const newChildren = new Map(children);\n if (child != null) {\n newChildren.set(child, children.get(child) === undefined);\n } else {\n const parentSelected = HierarchicalCheckboxMenu.isParentSelected(\n parent,\n map\n );\n const newChildValue = parentSelected == null || !parentSelected;\n children.forEach((_, key) => newChildren.set(key, newChildValue));\n }\n map.set(parent, newChildren);\n } else {\n map.set(parent, children == null || !children);\n }\n\n // The parent was clicked so all children must be toggled\n const currentChildren = map.get(parent);\n if (\n child === undefined &&\n currentChildren !== undefined &&\n typeof currentChildren !== 'boolean'\n ) {\n const parentSelected = HierarchicalCheckboxMenu.isParentSelected(\n parent,\n valueMap\n );\n if (parentSelected != null && parentSelected) {\n currentChildren.forEach((_, key) => currentChildren.set(key, false));\n } else {\n // for parent selection of false or null (indeterminate), select everything\n currentChildren.forEach((_, key) => currentChildren.set(key, true));\n }\n }\n\n onUpdateValueMap(map);\n }\n\n setAllValues(value: boolean): void {\n const { valueMap, onUpdateValueMap } = this.props;\n\n // Make a deep copy of the Map and set everything\n const copy = new Map();\n valueMap.forEach((child, parent) => {\n if (typeof child === 'boolean') {\n copy.set(parent, value);\n } else {\n const children = new Map();\n child.forEach((_, key) => children.set(key, value));\n copy.set(parent, children);\n }\n });\n\n onUpdateValueMap(copy);\n }\n\n selectAll(): void {\n this.setAllValues(true);\n }\n\n clear(): void {\n this.setAllValues(false);\n }\n\n renderMenuElement(): React.ReactNode {\n const { valueMap, 'data-testid': dataTestId } = this.props;\n return (\n <div className=\"hcm-menu-container\">\n {Array.from(valueMap.entries()).map(([parent, children]) => (\n <div key={parent}>\n <Checkbox\n className=\"hcm-parent\"\n checked={HierarchicalCheckboxMenu.isParentSelected(\n parent,\n valueMap\n )}\n onChange={() => this.toggleValueFor(parent)}\n >\n {parent}\n </Checkbox>\n {children !== undefined &&\n typeof children !== 'boolean' &&\n Array.from(children.entries()).map(([child, value]) => (\n <Checkbox\n className=\"hcm-child\"\n key={child}\n checked={value}\n onChange={() => this.toggleValueFor(parent, child)}\n >\n {child}\n </Checkbox>\n ))}\n </div>\n ))}\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.selectAll}\n data-testid={\n dataTestId !== undefined\n ? `${dataTestId}-btn-select-all`\n : undefined\n }\n >\n Select All\n </button>\n <button\n type=\"button\"\n className=\"btn btn-link\"\n onClick={this.clear}\n data-testid={\n dataTestId !== undefined ? `${dataTestId}-btn-clear` : undefined\n }\n >\n Clear\n </button>\n </div>\n );\n }\n\n render(): JSX.Element {\n const {\n menuText,\n className,\n icon,\n id,\n 'data-testid': dataTestId,\n } = this.props;\n const { menuIsOpen } = this.state;\n\n return (\n <button\n type=\"button\"\n className={classNames('btn hcm-btn', className)}\n onClick={this.toggleMenu}\n id={id}\n data-testid={dataTestId}\n >\n <span>\n {icon && <FontAwesomeIcon icon={icon} className=\"hcm-icon mr-1\" />}\n {menuText}\n </span>\n <FontAwesomeIcon icon={dhSort} className=\"hcm-icon ml-1\" />\n <Popper\n options={{ placement: 'bottom' }}\n isShown={menuIsOpen}\n onExited={() => {\n this.setState({ menuIsOpen: false });\n }}\n closeOnBlur\n interactive\n >\n {this.renderMenuElement()}\n </Popper>\n </button>\n );\n }\n}\n\nexport default HierarchicalCheckboxMenu;\n"],"mappings":"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"}
package/dist/ItemList.js CHANGED
@@ -20,12 +20,14 @@ var log = Log.module('ItemList');
20
20
  export class ItemList extends PureComponent {
21
21
  // By drawing an additional 10 items on each side, tab/keyboard navigation works better (as the next element exists)
22
22
  static renderItem(_ref) {
23
+ var _ref2, _item$displayValue;
24
+
23
25
  var {
24
26
  item
25
27
  } = _ref;
26
28
  return /*#__PURE__*/React.createElement("div", {
27
29
  className: "item-list-item-content"
28
- }, item && (item.displayValue || item.value || "".concat(item)));
30
+ }, item != null && ((_ref2 = (_item$displayValue = item.displayValue) !== null && _item$displayValue !== void 0 ? _item$displayValue : item.value) !== null && _ref2 !== void 0 ? _ref2 : "".concat(item)));
29
31
  }
30
32
 
31
33
  constructor(_props) {
@@ -247,10 +249,10 @@ export class ItemList extends PureComponent {
247
249
  } = this.props;
248
250
 
249
251
  if (isDoubleClickSelect) {
250
- this.setState(_ref2 => {
252
+ this.setState(_ref3 => {
251
253
  var {
252
254
  selectedRanges
253
- } = _ref2;
255
+ } = _ref3;
254
256
  return {
255
257
  selectedRanges: RangeUtils.selectRange(selectedRanges, [itemIndex, itemIndex])
256
258
  };
@@ -375,19 +377,19 @@ export class ItemList extends PureComponent {
375
377
  this.resetMouseState();
376
378
  }
377
379
 
378
- handleItemsRendered(_ref3) {
380
+ handleItemsRendered(_ref4) {
379
381
  var {
380
382
  overscanStartIndex
381
- } = _ref3;
383
+ } = _ref4;
382
384
  this.setState({
383
385
  overscanStartIndex
384
386
  });
385
387
  }
386
388
 
387
- handleResize(_ref4) {
389
+ handleResize(_ref5) {
388
390
  var {
389
391
  height
390
- } = _ref4;
392
+ } = _ref5;
391
393
  this.setState({
392
394
  height
393
395
  });
@@ -472,11 +474,11 @@ export class ItemList extends PureComponent {
472
474
  }
473
475
  }
474
476
 
475
- handleScroll(_ref5) {
477
+ handleScroll(_ref6) {
476
478
  var {
477
479
  scrollUpdateWasRequested,
478
480
  scrollOffset
479
- } = _ref5;
481
+ } = _ref6;
480
482
  this.setState(state => {
481
483
  if (scrollUpdateWasRequested) {
482
484
  // The scroll was caused by scrollTo() or scrollToItem()
@@ -576,10 +578,10 @@ export class ItemList extends PureComponent {
576
578
 
577
579
  deselectRange(range) {
578
580
  RangeUtils.validateRange(range);
579
- this.setState(_ref6 => {
581
+ this.setState(_ref7 => {
580
582
  var {
581
583
  selectedRanges
582
- } = _ref6;
584
+ } = _ref7;
583
585
  return {
584
586
  selectedRanges: RangeUtils.deselectRange(selectedRanges, range)
585
587
  };
@@ -596,10 +598,10 @@ export class ItemList extends PureComponent {
596
598
 
597
599
  selectRange(range) {
598
600
  RangeUtils.validateRange(range);
599
- this.setState(_ref7 => {
601
+ this.setState(_ref8 => {
600
602
  var {
601
603
  selectedRanges
602
- } = _ref7;
604
+ } = _ref8;
603
605
  return {
604
606
  selectedRanges: RangeUtils.selectRange(selectedRanges, range)
605
607
  };
@@ -649,11 +651,11 @@ export class ItemList extends PureComponent {
649
651
  return scrollOffset + height >= itemCount * rowHeight;
650
652
  }
651
653
 
652
- renderInnerElement(_ref8) {
654
+ renderInnerElement(_ref9) {
653
655
  var {
654
656
  index: itemIndex,
655
657
  style
656
- } = _ref8;
658
+ } = _ref9;
657
659
  var {
658
660
  items,
659
661
  offset,
@@ -688,11 +690,11 @@ export class ItemList extends PureComponent {
688
690
  return /*#__PURE__*/React.createElement(AutoSizer, {
689
691
  className: "item-list-auto-sizer",
690
692
  onResize: this.handleResize
691
- }, _ref9 => {
693
+ }, _ref10 => {
692
694
  var {
693
695
  width,
694
696
  height
695
- } = _ref9;
697
+ } = _ref10;
696
698
  return /*#__PURE__*/React.createElement(List, {
697
699
  className: "item-list-scroll-pane",
698
700
  height: height,
@@ -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,"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 != null && (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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"}
@@ -18,7 +18,7 @@ var LoadingOverlay = _ref => {
18
18
  'data-testid': dataTestId
19
19
  } = _ref;
20
20
  return /*#__PURE__*/React.createElement(CSSTransition, {
21
- in: !!errorMessage || !isLoaded || isLoading,
21
+ in: Boolean(errorMessage) || !isLoaded || isLoading,
22
22
  timeout: ThemeExport.transitionMs,
23
23
  classNames: isLoaded ? 'fade' : '',
24
24
  mountOnEnter: true,
@@ -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,"file":"LoadingOverlay.js","names":["React","CSSTransition","classNames","FontAwesomeIcon","vsWarning","ThemeExport","LoadingSpinner","LoadingOverlay","isLoaded","isLoading","errorMessage","dataTestId","Boolean","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={Boolean(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,EAAEC,OAAO,CAACF,YAAD,CAAP,IAAyB,CAACF,QAA1B,IAAsCC,SAD5C;IAEE,OAAO,EAAEJ,WAAW,CAACQ,YAFvB;IAGE,UAAU,EAAEL,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"}
@@ -267,12 +267,14 @@ var MaskedInput = /*#__PURE__*/React.forwardRef((props, ref) => {
267
267
  }
268
268
  }, [getSegment, onSelect, selection, value]);
269
269
  var handleSelectCapture = useCallback(event => {
270
+ var _input$current$select;
271
+
270
272
  if (!input.current) {
271
273
  return;
272
274
  }
273
275
 
274
276
  log.debug('handleSelectCapture', event);
275
- var selectionStart = input.current.selectionStart || 0;
277
+ var selectionStart = (_input$current$select = input.current.selectionStart) !== null && _input$current$select !== void 0 ? _input$current$select : 0;
276
278
 
277
279
  if (selectionStart === value.length && selection != null && selectionStart !== selection.selectionStart) {
278
280
  event.preventDefault();