@deephaven/components 0.50.1-beta.5 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/AutoCompleteInput.js.map +1 -1
  2. package/dist/AutoResizeTextarea.js.map +1 -1
  3. package/dist/BasicModal.js.map +1 -1
  4. package/dist/BulkActionBar.js.map +1 -1
  5. package/dist/Button.js.map +1 -1
  6. package/dist/ButtonGroup.js.map +1 -1
  7. package/dist/ButtonOld.js.map +1 -1
  8. package/dist/CardFlip.js.map +1 -1
  9. package/dist/Checkbox.js.map +1 -1
  10. package/dist/Collapse.js.map +1 -1
  11. package/dist/ComboBox.js.map +1 -1
  12. package/dist/CopyButton.js.map +1 -1
  13. package/dist/CustomTimeSelect.js.map +1 -1
  14. package/dist/DateInput.js.map +1 -1
  15. package/dist/DateInputUtils.js.map +1 -1
  16. package/dist/DateTimeInput.js.map +1 -1
  17. package/dist/DateTimeInputUtils.js.map +1 -1
  18. package/dist/DebouncedSearchInput.js.map +1 -1
  19. package/dist/DragUtils.js.map +1 -1
  20. package/dist/DraggableItemList.js.map +1 -1
  21. package/dist/EditableItemList.js.map +1 -1
  22. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  23. package/dist/ItemList.js.map +1 -1
  24. package/dist/ItemListItem.js.map +1 -1
  25. package/dist/LoadingOverlay.js.map +1 -1
  26. package/dist/LoadingSpinner.js.map +1 -1
  27. package/dist/MaskedInput.js.map +1 -1
  28. package/dist/MaskedInputUtils.js.map +1 -1
  29. package/dist/Option.js.map +1 -1
  30. package/dist/RadioGroup.js.map +1 -1
  31. package/dist/RadioItem.js.map +1 -1
  32. package/dist/RandomAreaPlotAnimation.js.map +1 -1
  33. package/dist/SearchInput.js.map +1 -1
  34. package/dist/SearchableCombobox.js.map +1 -1
  35. package/dist/Select.js.map +1 -1
  36. package/dist/SelectValueList.js.map +1 -1
  37. package/dist/SocketedButton.js.map +1 -1
  38. package/dist/SpectrumUtils.d.ts.map +1 -1
  39. package/dist/SpectrumUtils.js +3 -4
  40. package/dist/SpectrumUtils.js.map +1 -1
  41. package/dist/TableViewEmptyState.js.map +1 -1
  42. package/dist/TextWithTooltip.js.map +1 -1
  43. package/dist/ThemeExport.js.map +1 -1
  44. package/dist/TimeInput.js.map +1 -1
  45. package/dist/TimeSlider.js.map +1 -1
  46. package/dist/ToastNotification.js.map +1 -1
  47. package/dist/UISwitch.js.map +1 -1
  48. package/dist/ValidateLabelInput.js.map +1 -1
  49. package/dist/actions/ConfirmActionButton.js.map +1 -1
  50. package/dist/actions/IconActionButton.js.map +1 -1
  51. package/dist/context-actions/ContextActionUtils.js +2 -0
  52. package/dist/context-actions/ContextActionUtils.js.map +1 -1
  53. package/dist/context-actions/ContextActions.js.map +1 -1
  54. package/dist/context-actions/ContextMenu.js.map +1 -1
  55. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  56. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  57. package/dist/context-actions/GlobalContextAction.js.map +1 -1
  58. package/dist/context-actions/GlobalContextActions.js.map +1 -1
  59. package/dist/declaration.d.js.map +1 -1
  60. package/dist/dialogs/ActionButtonDialogTrigger.js.map +1 -1
  61. package/dist/dialogs/ConfirmationDialog.js.map +1 -1
  62. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  63. package/dist/menu-actions/Menu.js.map +1 -1
  64. package/dist/modal/DebouncedModal.js.map +1 -1
  65. package/dist/modal/InfoModal.js.map +1 -1
  66. package/dist/modal/Modal.js.map +1 -1
  67. package/dist/modal/ModalBody.js.map +1 -1
  68. package/dist/modal/ModalFooter.js.map +1 -1
  69. package/dist/modal/ModalHeader.js.map +1 -1
  70. package/dist/navigation/Menu.js.map +1 -1
  71. package/dist/navigation/MenuItem.js.map +1 -1
  72. package/dist/navigation/Page.js.map +1 -1
  73. package/dist/navigation/Stack.js.map +1 -1
  74. package/dist/popper/Popper.js +3 -0
  75. package/dist/popper/Popper.js.map +1 -1
  76. package/dist/popper/Tooltip.js +3 -0
  77. package/dist/popper/Tooltip.js.map +1 -1
  78. package/dist/shortcuts/Shortcut.js.map +1 -1
  79. package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
  80. package/dist/theme/SpectrumThemeProvider.d.ts +17 -0
  81. package/dist/theme/SpectrumThemeProvider.d.ts.map +1 -0
  82. package/dist/theme/SpectrumThemeProvider.js +31 -0
  83. package/dist/theme/SpectrumThemeProvider.js.map +1 -0
  84. package/dist/theme/ThemeProvider.d.ts.map +1 -1
  85. package/dist/theme/ThemeProvider.js +26 -12
  86. package/dist/theme/ThemeProvider.js.map +1 -1
  87. package/dist/theme/ThemeUtils.js.map +1 -1
  88. package/dist/theme/theme-dark/index.d.ts +24 -0
  89. package/dist/theme/theme-dark/index.d.ts.map +1 -1
  90. package/dist/theme/theme-dark/index.js +26 -1
  91. package/dist/theme/theme-dark/index.js.map +1 -1
  92. package/dist/theme/theme-dark/theme-dark-components.css +8 -0
  93. package/dist/theme/theme-dark/theme-dark-components.css.map +1 -0
  94. package/dist/theme/theme-dark/theme-dark-semantic.css +51 -4
  95. package/dist/theme/theme-dark/theme-dark-semantic.css.map +1 -1
  96. package/dist/theme/theme-spectrum/index.d.ts +16 -0
  97. package/dist/theme/theme-spectrum/index.d.ts.map +1 -0
  98. package/dist/theme/theme-spectrum/index.js +22 -0
  99. package/dist/theme/theme-spectrum/index.js.map +1 -0
  100. package/dist/theme/theme-spectrum/theme-spectrum-alias.module.css +192 -0
  101. package/dist/theme/theme-spectrum/theme-spectrum-alias.module.css.map +1 -0
  102. package/dist/theme/theme-spectrum/theme-spectrum-overrides.module.css +7 -0
  103. package/dist/theme/theme-spectrum/theme-spectrum-overrides.module.css.map +1 -0
  104. package/dist/theme/theme-spectrum/theme-spectrum-palette.module.css +211 -0
  105. package/dist/theme/theme-spectrum/theme-spectrum-palette.module.css.map +1 -0
  106. package/dist/theme/useTheme.js.map +1 -1
  107. package/package.json +7 -7
  108. package/dist/SpectrumThemeDark.module.css +0 -9
  109. package/dist/SpectrumThemeDark.module.css.map +0 -1
  110. package/dist/SpectrumThemeLight.module.css +0 -9
  111. package/dist/SpectrumThemeLight.module.css.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"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, itemIndex, isFocused, isSelected, style }: 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: readonly T[],\n offset: number,\n renderItem: DraggableRenderItemFn<T>\n ): DraggableChildrenFn =>\n // eslint-disable-next-line react/no-unstable-nested-components, react/display-name, react/function-component-definition\n (provided, snapshot, rubric) => {\n // eslint-disable-next-line react/no-this-in-sfc\n const { selectedCount } = this.state;\n const { draggableProps, dragHandleProps, innerRef } = provided;\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 {...draggableProps}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...dragHandleProps}\n ref={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","jsx","_jsx","jsxs","_jsxs","DraggableItemList","renderHandle","children","icon","renderBadge","_ref","text","length","className","renderTextItem","_ref2","badgeText","renderItem","_ref3","_ref4","_item$displayValue","item","isClone","selectedCount","displayValue","value","concat","undefined","getDraggableId","draggablePrefix","itemIndex","getDraggableIndex","draggableId","num","split","pop","parseInt","constructor","props","_defineProperty","isFocused","isSelected","isDragDisabled","style","index","provided","_objectSpread","role","ref","innerRef","tabIndex","draggableProps","dragHandleProps","max","CACHE_SIZE","_ref5","getCachedDraggableItem","draggingItemClassName","items","offset","snapshot","rubric","state","source","handleSelectionChange","bind","itemList","createRef","selectItem","_this$itemList$curren","current","focusItem","_this$itemList$curren2","scrollToItem","_this$itemList$curren3","selectedRanges","setState","count","onSelectionChange","render","droppableId","isDoubleClickSelect","isDropDisabled","isMultiSelect","isStickyBottom","itemCount","onFocusChange","onSelect","onViewportChange","rowHeight","dataTestId","mode","renderClone","getCachedRenderClone","draggingFromThisWith","isDraggingOver","draggingOverWith","droppableProps","focusSelector","isDragSelect","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, itemIndex, isFocused, isSelected, style }: 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: readonly T[],\n offset: number,\n renderItem: DraggableRenderItemFn<T>\n ): DraggableChildrenFn =>\n // eslint-disable-next-line react/no-unstable-nested-components, react/display-name, react/function-component-definition\n (provided, snapshot, rubric) => {\n // eslint-disable-next-line react/no-this-in-sfc\n const { selectedCount } = this.state;\n const { draggableProps, dragHandleProps, innerRef } = provided;\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 {...draggableProps}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...dragHandleProps}\n ref={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":"EditableItemList.js","names":["React","useCallback","useMemo","useState","classNames","clamp","vsAdd","vsTrash","RangeUtils","Button","ItemList","EditableItemList","props","isInvalid","items","onAdd","undefined","onDelete","validate","inputError","setInputError","selectedRanges","setSelectedRanges","value","setValue","handleSelectionChange","ranges","handleDelete","getItemsInRanges","handleAdd","validationError","handleInputChange","event","inputValue","target","handleInputFocus","handleInputKeyDown","key","containerHeight","length","DEFAULT_ROW_HEIGHT","height","map","item","index","isSelected"],"sources":["../src/EditableItemList.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n KeyboardEvent,\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport clamp from 'lodash.clamp';\nimport { vsAdd, vsTrash } from '@deephaven/icons';\nimport { Range, RangeUtils } from '@deephaven/utils';\nimport Button from './Button';\nimport ItemList from './ItemList';\n\nexport interface EditableItemListProps {\n isInvalid?: boolean;\n items: string[];\n onDelete: (items: string[]) => void;\n onAdd: (item: string) => void;\n validate?: (item: string) => Error | null;\n}\n\n// Display a list of items with an input for adding new items, and Add/Delete buttons\nfunction EditableItemList(props: EditableItemListProps): React.ReactElement {\n const {\n isInvalid = false,\n items,\n onAdd = () => undefined,\n onDelete = () => undefined,\n validate = () => null,\n } = props;\n const [inputError, setInputError] = useState<Error | null>(null);\n const [selectedRanges, setSelectedRanges] = useState<Range[]>([]);\n const [value, setValue] = useState('');\n\n const handleSelectionChange = useCallback((ranges: Range[]) => {\n setSelectedRanges(ranges);\n }, []);\n\n const handleDelete = useCallback(() => {\n onDelete(RangeUtils.getItemsInRanges(items, selectedRanges));\n setSelectedRanges([]);\n }, [items, selectedRanges, onDelete]);\n\n const handleAdd = useCallback(() => {\n if (value === '') {\n return;\n }\n const validationError = validate(value);\n if (validationError == null) {\n onAdd(value);\n setValue('');\n } else {\n setInputError(validationError);\n }\n }, [value, onAdd, validate]);\n\n const handleInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const { value: inputValue } = event.target;\n setValue(inputValue);\n setInputError(inputValue === '' ? null : validate(inputValue));\n },\n [validate]\n );\n\n const handleInputFocus = useCallback(() => {\n setSelectedRanges([]);\n }, []);\n\n const handleInputKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n handleAdd();\n }\n },\n [handleAdd]\n );\n\n const containerHeight = useMemo(\n (): number => 14 + clamp(items.length, 1, 6) * ItemList.DEFAULT_ROW_HEIGHT,\n [items.length]\n );\n\n return (\n <div\n className={classNames('editable-item-list-container', {\n 'is-invalid': isInvalid,\n })}\n >\n <div style={{ height: containerHeight }}>\n <ItemList\n itemCount={items.length}\n items={items.map((item, index) => ({\n value: item,\n isSelected: RangeUtils.isSelected(selectedRanges, index),\n }))}\n offset={0}\n selectedRanges={selectedRanges}\n onSelectionChange={handleSelectionChange}\n isMultiSelect\n />\n </div>\n <div className=\"d-flex flex-row pt-2\">\n <div className=\"d-flex flex-grow-1\">\n <input\n className={classNames('form-control', {\n 'is-invalid': inputError != null,\n })}\n placeholder=\"Enter value\"\n type=\"text\"\n value={value}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onKeyDown={handleInputKeyDown}\n />\n </div>\n <div className=\"d-flex align-items-start mt-1 ml-2\">\n <Button\n kind=\"ghost\"\n onClick={handleAdd}\n disabled={inputError != null || value === ''}\n icon={vsAdd}\n tooltip=\"Add new item\"\n data-testid=\"add-item-button\"\n />\n <Button\n kind=\"ghost\"\n onClick={handleDelete}\n disabled={selectedRanges.length === 0}\n icon={vsTrash}\n tooltip=\"Delete selected items\"\n data-testid=\"delete-item-button\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport default EditableItemList;\n"],"mappings":"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"}
1
+ {"version":3,"file":"EditableItemList.js","names":["React","useCallback","useMemo","useState","classNames","clamp","vsAdd","vsTrash","RangeUtils","Button","ItemList","jsx","_jsx","jsxs","_jsxs","EditableItemList","props","isInvalid","items","onAdd","undefined","onDelete","validate","inputError","setInputError","selectedRanges","setSelectedRanges","value","setValue","handleSelectionChange","ranges","handleDelete","getItemsInRanges","handleAdd","validationError","handleInputChange","event","inputValue","target","handleInputFocus","handleInputKeyDown","key","containerHeight","length","DEFAULT_ROW_HEIGHT","className","children","style","height","itemCount","map","item","index","isSelected","offset","onSelectionChange","isMultiSelect","placeholder","type","onChange","onFocus","onKeyDown","kind","onClick","disabled","icon","tooltip"],"sources":["../src/EditableItemList.tsx"],"sourcesContent":["import React, {\n ChangeEvent,\n KeyboardEvent,\n useCallback,\n useMemo,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport clamp from 'lodash.clamp';\nimport { vsAdd, vsTrash } from '@deephaven/icons';\nimport { Range, RangeUtils } from '@deephaven/utils';\nimport Button from './Button';\nimport ItemList from './ItemList';\n\nexport interface EditableItemListProps {\n isInvalid?: boolean;\n items: string[];\n onDelete: (items: string[]) => void;\n onAdd: (item: string) => void;\n validate?: (item: string) => Error | null;\n}\n\n// Display a list of items with an input for adding new items, and Add/Delete buttons\nfunction EditableItemList(props: EditableItemListProps): React.ReactElement {\n const {\n isInvalid = false,\n items,\n onAdd = () => undefined,\n onDelete = () => undefined,\n validate = () => null,\n } = props;\n const [inputError, setInputError] = useState<Error | null>(null);\n const [selectedRanges, setSelectedRanges] = useState<Range[]>([]);\n const [value, setValue] = useState('');\n\n const handleSelectionChange = useCallback((ranges: Range[]) => {\n setSelectedRanges(ranges);\n }, []);\n\n const handleDelete = useCallback(() => {\n onDelete(RangeUtils.getItemsInRanges(items, selectedRanges));\n setSelectedRanges([]);\n }, [items, selectedRanges, onDelete]);\n\n const handleAdd = useCallback(() => {\n if (value === '') {\n return;\n }\n const validationError = validate(value);\n if (validationError == null) {\n onAdd(value);\n setValue('');\n } else {\n setInputError(validationError);\n }\n }, [value, onAdd, validate]);\n\n const handleInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const { value: inputValue } = event.target;\n setValue(inputValue);\n setInputError(inputValue === '' ? null : validate(inputValue));\n },\n [validate]\n );\n\n const handleInputFocus = useCallback(() => {\n setSelectedRanges([]);\n }, []);\n\n const handleInputKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (event.key === 'Enter') {\n handleAdd();\n }\n },\n [handleAdd]\n );\n\n const containerHeight = useMemo(\n (): number => 14 + clamp(items.length, 1, 6) * ItemList.DEFAULT_ROW_HEIGHT,\n [items.length]\n );\n\n return (\n <div\n className={classNames('editable-item-list-container', {\n 'is-invalid': isInvalid,\n })}\n >\n <div style={{ height: containerHeight }}>\n <ItemList\n itemCount={items.length}\n items={items.map((item, index) => ({\n value: item,\n isSelected: RangeUtils.isSelected(selectedRanges, index),\n }))}\n offset={0}\n selectedRanges={selectedRanges}\n onSelectionChange={handleSelectionChange}\n isMultiSelect\n />\n </div>\n <div className=\"d-flex flex-row pt-2\">\n <div className=\"d-flex flex-grow-1\">\n <input\n className={classNames('form-control', {\n 'is-invalid': inputError != null,\n })}\n placeholder=\"Enter value\"\n type=\"text\"\n value={value}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onKeyDown={handleInputKeyDown}\n />\n </div>\n <div className=\"d-flex align-items-start mt-1 ml-2\">\n <Button\n kind=\"ghost\"\n onClick={handleAdd}\n disabled={inputError != null || value === ''}\n icon={vsAdd}\n tooltip=\"Add new item\"\n data-testid=\"add-item-button\"\n />\n <Button\n kind=\"ghost\"\n onClick={handleDelete}\n disabled={selectedRanges.length === 0}\n icon={vsTrash}\n tooltip=\"Delete selected items\"\n data-testid=\"delete-item-button\"\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport default EditableItemList;\n"],"mappings":"AAAA,OAAOA,KAAK,IAGVC,WAAW,EACXC,OAAO,EACPC,QAAQ,QACH,OAAO;AACd,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,MAAM,cAAc;AAChC,SAASC,KAAK,EAAEC,OAAO,QAAQ,kBAAkB;AACjD,SAAgBC,UAAU,QAAQ,kBAAkB;AAAC,OAC9CC,MAAM;AAAA,OACNC,QAAQ;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAUf;AACA,SAASC,gBAAgBA,CAACC,KAA4B,EAAsB;EAC1E,IAAM;IACJC,SAAS,GAAG,KAAK;IACjBC,KAAK;IACLC,KAAK,GAAGA,CAAA,KAAMC,SAAS;IACvBC,QAAQ,GAAGA,CAAA,KAAMD,SAAS;IAC1BE,QAAQ,GAAGA,CAAA,KAAM;EACnB,CAAC,GAAGN,KAAK;EACT,IAAM,CAACO,UAAU,EAAEC,aAAa,CAAC,GAAGrB,QAAQ,CAAe,IAAI,CAAC;EAChE,IAAM,CAACsB,cAAc,EAAEC,iBAAiB,CAAC,GAAGvB,QAAQ,CAAU,EAAE,CAAC;EACjE,IAAM,CAACwB,KAAK,EAAEC,QAAQ,CAAC,GAAGzB,QAAQ,CAAC,EAAE,CAAC;EAEtC,IAAM0B,qBAAqB,GAAG5B,WAAW,CAAE6B,MAAe,IAAK;IAC7DJ,iBAAiB,CAACI,MAAM,CAAC;EAC3B,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMC,YAAY,GAAG9B,WAAW,CAAC,MAAM;IACrCoB,QAAQ,CAACb,UAAU,CAACwB,gBAAgB,CAACd,KAAK,EAAEO,cAAc,CAAC,CAAC;IAC5DC,iBAAiB,CAAC,EAAE,CAAC;EACvB,CAAC,EAAE,CAACR,KAAK,EAAEO,cAAc,EAAEJ,QAAQ,CAAC,CAAC;EAErC,IAAMY,SAAS,GAAGhC,WAAW,CAAC,MAAM;IAClC,IAAI0B,KAAK,KAAK,EAAE,EAAE;MAChB;IACF;IACA,IAAMO,eAAe,GAAGZ,QAAQ,CAACK,KAAK,CAAC;IACvC,IAAIO,eAAe,IAAI,IAAI,EAAE;MAC3Bf,KAAK,CAACQ,KAAK,CAAC;MACZC,QAAQ,CAAC,EAAE,CAAC;IACd,CAAC,MAAM;MACLJ,aAAa,CAACU,eAAe,CAAC;IAChC;EACF,CAAC,EAAE,CAACP,KAAK,EAAER,KAAK,EAAEG,QAAQ,CAAC,CAAC;EAE5B,IAAMa,iBAAiB,GAAGlC,WAAW,CAClCmC,KAAoC,IAAK;IACxC,IAAM;MAAET,KAAK,EAAEU;IAAW,CAAC,GAAGD,KAAK,CAACE,MAAM;IAC1CV,QAAQ,CAACS,UAAU,CAAC;IACpBb,aAAa,CAACa,UAAU,KAAK,EAAE,GAAG,IAAI,GAAGf,QAAQ,CAACe,UAAU,CAAC,CAAC;EAChE,CAAC,EACD,CAACf,QAAQ,CACX,CAAC;EAED,IAAMiB,gBAAgB,GAAGtC,WAAW,CAAC,MAAM;IACzCyB,iBAAiB,CAAC,EAAE,CAAC;EACvB,CAAC,EAAE,EAAE,CAAC;EAEN,IAAMc,kBAAkB,GAAGvC,WAAW,CACnCmC,KAAoB,IAAK;IACxB,IAAIA,KAAK,CAACK,GAAG,KAAK,OAAO,EAAE;MACzBR,SAAS,CAAC,CAAC;IACb;EACF,CAAC,EACD,CAACA,SAAS,CACZ,CAAC;EAED,IAAMS,eAAe,GAAGxC,OAAO,CAC7B,MAAc,EAAE,GAAGG,KAAK,CAACa,KAAK,CAACyB,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,GAAGjC,QAAQ,CAACkC,kBAAkB,EAC1E,CAAC1B,KAAK,CAACyB,MAAM,CACf,CAAC;EAED,oBACE7B,KAAA;IACE+B,SAAS,EAAEzC,UAAU,CAAC,8BAA8B,EAAE;MACpD,YAAY,EAAEa;IAChB,CAAC,CAAE;IAAA6B,QAAA,gBAEHlC,IAAA;MAAKmC,KAAK,EAAE;QAAEC,MAAM,EAAEN;MAAgB,CAAE;MAAAI,QAAA,eACtClC,IAAA,CAACF,QAAQ;QACPuC,SAAS,EAAE/B,KAAK,CAACyB,MAAO;QACxBzB,KAAK,EAAEA,KAAK,CAACgC,GAAG,CAAC,CAACC,IAAI,EAAEC,KAAK,MAAM;UACjCzB,KAAK,EAAEwB,IAAI;UACXE,UAAU,EAAE7C,UAAU,CAAC6C,UAAU,CAAC5B,cAAc,EAAE2B,KAAK;QACzD,CAAC,CAAC,CAAE;QACJE,MAAM,EAAE,CAAE;QACV7B,cAAc,EAAEA,cAAe;QAC/B8B,iBAAiB,EAAE1B,qBAAsB;QACzC2B,aAAa;MAAA,CACd;IAAC,CACC,CAAC,eACN1C,KAAA;MAAK+B,SAAS,EAAC,sBAAsB;MAAAC,QAAA,gBACnClC,IAAA;QAAKiC,SAAS,EAAC,oBAAoB;QAAAC,QAAA,eACjClC,IAAA;UACEiC,SAAS,EAAEzC,UAAU,CAAC,cAAc,EAAE;YACpC,YAAY,EAAEmB,UAAU,IAAI;UAC9B,CAAC,CAAE;UACHkC,WAAW,EAAC,aAAa;UACzBC,IAAI,EAAC,MAAM;UACX/B,KAAK,EAAEA,KAAM;UACbgC,QAAQ,EAAExB,iBAAkB;UAC5ByB,OAAO,EAAErB,gBAAiB;UAC1BsB,SAAS,EAAErB;QAAmB,CAC/B;MAAC,CACC,CAAC,eACN1B,KAAA;QAAK+B,SAAS,EAAC,oCAAoC;QAAAC,QAAA,gBACjDlC,IAAA,CAACH,MAAM;UACLqD,IAAI,EAAC,OAAO;UACZC,OAAO,EAAE9B,SAAU;UACnB+B,QAAQ,EAAEzC,UAAU,IAAI,IAAI,IAAII,KAAK,KAAK,EAAG;UAC7CsC,IAAI,EAAE3D,KAAM;UACZ4D,OAAO,EAAC,cAAc;UACtB,eAAY;QAAiB,CAC9B,CAAC,eACFtD,IAAA,CAACH,MAAM;UACLqD,IAAI,EAAC,OAAO;UACZC,OAAO,EAAEhC,YAAa;UACtBiC,QAAQ,EAAEvC,cAAc,CAACkB,MAAM,KAAK,CAAE;UACtCsB,IAAI,EAAE1D,OAAQ;UACd2D,OAAO,EAAC,uBAAuB;UAC/B,eAAY;QAAoB,CACjC,CAAC;MAAA,CACC,CAAC;IAAA,CACH,CAAC;EAAA,CACH,CAAC;AAEV;AAEA,eAAenD,gBAAgB"}
@@ -1 +1 @@
1
- {"version":3,"file":"HierarchicalCheckboxMenu.js","names":["React","Component","FontAwesomeIcon","dhSort","classNames","Checkbox","Popper","Button","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';\nimport Button from './Button';\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 kind=\"ghost\"\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 kind=\"ghost\"\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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"}
1
+ {"version":3,"file":"HierarchicalCheckboxMenu.js","names":["React","Component","FontAwesomeIcon","dhSort","classNames","Checkbox","Popper","Button","jsx","_jsx","jsxs","_jsxs","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","className","entries","_ref","checked","onChange","_ref2","kind","onClick","concat","render","menuText","icon","id","type","options","placement","isShown","onExited","closeOnBlur","interactive","_defineProperty"],"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';\nimport Button from './Button';\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 kind=\"ghost\"\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 kind=\"ghost\"\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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ItemList.js","names":["React","PureComponent","memoize","FixedSizeList","List","AutoSizer","Log","RangeUtils","ItemListItem","ContextActionUtils","log","module","MIN_DRAG_DELTA","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","mouseX","mouseY","componentDidUpdate","prevProps","prevState","propSelectedRanges","itemCount","isListAtBottom","scrollToBottom","sendViewportUpdate","setSelectedRanges","onSelectionChange","onFocusChange","componentWillUnmount","window","removeEventListener","focus","current","restoreScrollPosition","scrollTo","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","clientX","clientY","addEventListener","debug2","currentTarget","relatedTarget","contains","isDragSelect","isMultiSelect","mouseMoveX","Math","abs","mouseMoveY","getItemSelected","deselectAll","min","isDeselectOnClick","isShiftDown","resetMouseState","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":["/* eslint-disable react/no-unstable-nested-components */\nimport 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');\nconst MIN_DRAG_DELTA = 5;\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: readonly 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: readonly Range[]): void;\n onViewportChange(topRow: number, bottomRow: number): void;\n overscanCount: number;\n selectedRanges: readonly 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: readonly Range[];\n overscanStartIndex: number;\n height: number | null;\n isDragging: boolean;\n isStuckToBottom: boolean;\n scrollOffset: number | null;\n mouseX: number | null;\n mouseY: 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 mouseX: null,\n mouseY: null,\n };\n }\n\n componentDidUpdate(\n prevProps: ItemListProps<T>,\n prevState: ItemListState\n ): void {\n const { selectedRanges: propSelectedRanges, itemCount } = this.props;\n const {\n focusIndex,\n isStuckToBottom,\n scrollOffset,\n height,\n selectedRanges,\n } = this.state;\n if (isStuckToBottom && !this.isListAtBottom() && itemCount > 0) {\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: readonly 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 (\n items: readonly T[],\n selectedRanges: readonly Range[],\n renderItem: RenderItemFn<T>\n ) => ({\n items,\n selectedRanges,\n renderItem,\n })\n );\n\n focus(): void {\n this.listContainer.current?.focus();\n }\n\n restoreScrollPosition(): void {\n const { scrollOffset } = this.state;\n if (scrollOffset != null) {\n // manually restore the scroll containers offset\n // virtual list doesn't restore scrolloffset in a re-render if it's the same\n this.listContainer.current?.scrollTo(0, scrollOffset);\n }\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 this.setState({ focusIndex: itemIndex });\n\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({\n mouseDownIndex: index,\n mouseX: e.clientX,\n mouseY: e.clientY,\n });\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, mouseX, mouseY } = this.state;\n\n if (mouseDownIndex == null || disableSelect) return;\n\n const mouseMoveX = Math.abs(e.clientX - (mouseX ?? 0));\n const mouseMoveY = Math.abs(e.clientY - (mouseY ?? 0));\n if (mouseMoveX > MIN_DRAG_DELTA && mouseMoveY > MIN_DRAG_DELTA) {\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: readonly 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, isStuckToBottom } = 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 initialScrollOffset={isStuckToBottom ? itemCount * rowHeight : 0}\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":";;;;;AAAA;AACA,OAAOA,KAAK,IAAIC,aAAa,QAAQ,OAAO;AAC5C,OAAOC,OAAO,MAAM,UAAU;AAC9B,SACEC,aAAa,IAAIC,IAAI,QAGhB,cAAc;AACrB,OAAOC,SAAS,MAAgB,8BAA8B;AAC9D,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,UAAU,QAAe,kBAAkB;AAAC,OAC9CC,YAAY;AAAA,SACVC,kBAAkB;AAAA;AAAA;AAG3B,IAAMC,GAAG,GAAGJ,GAAG,CAACK,MAAM,CAAC,UAAU,CAAC;AAClC,IAAMC,cAAc,GAAG,CAAC;AAuExB;AACA;AACA;AACA;AACA,OAAO,MAAMC,QAAQ,SAAYZ,aAAa,CAG5C;EAKA;;EA2CA,OAAOa,UAAU,OAEmB;IAAA;IAAA,IAFS;MAC3CC;IACkB,CAAC;IACnB,oBACE;MAAK,SAAS,EAAC,wBAAwB;MAAA,UACpCA,IAAI,IAAI,IAAI,oCAAKA,IAAI,CAACC,YAAY,mEAAID,IAAI,CAACE,KAAK,mDAAOF,IAAI;IAAG,EAC3D;EAEV;EAEAG,WAAW,CAACC,MAAuB,EAAE;IACnC,KAAK,CAACA,MAAK,CAAC;IAAC;IAAA;IAAA,yCAmFGjB,OAAO,CACvB,CAACkB,KAAa,EAAEC,cAAgC,KAC9Cd,UAAU,CAACe,UAAU,CAACD,cAAc,EAAED,KAAK,CAAC,EAC9C;MAAEG,GAAG,EAAEV,QAAQ,CAACW;IAAW,CAAC,CAC7B;IAAA,uCAEetB,OAAO,CACrB,CACEuB,SAAiB,EACjBC,GAAW,EACXX,IAAO,EACPY,SAAkB,EAClBL,UAAmB,EACnBR,UAA2B,EAC3Bc,KAA0B,EAC1BC,aAAsB,KACnB;MACH,IAAMC,OAAO,GAAGhB,UAAU,CAAC;QACzBC,IAAI;QACJU,SAAS;QACTE,SAAS;QACTL,UAAU;QACVM;MACF,CAAC,CAAC;MAEF,oBACE,KAAC,YAAY;QACX,aAAa,EAAE,IAAI,CAACG,qBAAsB;QAC1C,aAAa,EAAE,IAAI,CAACC,qBAAsB;QAC1C,WAAW,EAAE,IAAI,CAACC,mBAAoB;QACtC,OAAO,EAAE,IAAI,CAACC,eAAgB;QAC9B,MAAM,EAAE,IAAI,CAACC,cAAe;QAC5B,aAAa,EAAEN,aAAc;QAC7B,WAAW,EAAE,IAAI,CAACO,mBAAoB;QACtC,SAAS,EAAE,IAAI,CAACC,iBAAkB;QAClC,SAAS,EAAEV,SAAU;QACrB,UAAU,EAAEL,UAAW;QACvB,SAAS,EAAEG,SAAU;QACrB,KAAK,EAAEG,KAAM;QAAA,UAGZE;MAAO,GAFHJ,GAAG,CAGK;IAEnB,CAAC,EACD;MAAEH,GAAG,EAAEV,QAAQ,CAACW;IAAW,CAAC,CAC7B;IAAA,yCAEiBtB,OAAO,CAAEoC,SAAqC,IAAK;MACnE,IAAMC,SAAS,gBAAGvC,KAAK,CAACwC,UAAU,CAAiB,CAACrB,KAAK,EAAEsB,GAAG;MAAA;MAC5D;MACA;QACE,GAAG,EAAEA,GAAI;QACT,QAAQ,EAAE,CAAC,CAAE;QACb,SAAS,EAAEH,SAAU;QACrB,IAAI,EAAC;QACL;MAAA,GACInB,KAAK,EAEZ,CAAC;MACFoB,SAAS,CAACG,WAAW,GAAG,sBAAsB;MAC9C,OAAOH,SAAS;IAClB,CAAC,CAAC;IAAA,yCAEgBrC,OAAO,CAAC,MAAM;MAC9B,IAAMqC,SAAS,gBAAGvC,KAAK,CAACwC,UAAU,CAAiB,CAACrB,KAAK,EAAEsB,GAAG,kBAC5D;QACE,SAAS,EAAC,yBAAyB;QACnC,GAAG,EAAEA;QACL;MAAA,GACItB,KAAK,EAEZ,CAAC;MACFoB,SAAS,CAACG,WAAW,GAAG,sBAAsB;MAC9C,OAAOH,SAAS;IAClB,CAAC,CAAC;IAAA,qCAEYrC,OAAO,CACnB,CACEyC,KAAmB,EACnBtB,cAAgC,EAChCP,UAA2B,MACvB;MACJ6B,KAAK;MACLtB,cAAc;MACdP;IACF,CAAC,CAAC,CACH;IAxKC,IAAI,CAACqB,cAAc,GAAG,IAAI,CAACA,cAAc,CAACS,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACb,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACa,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACV,eAAe,GAAG,IAAI,CAACA,eAAe,CAACU,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACZ,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACY,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAACX,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACW,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACR,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACQ,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACP,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACO,IAAI,CAAC,IAAI,CAAC;IAC1D,IAAI,CAACC,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACD,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACE,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACF,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACG,aAAa,GAAG,IAAI,CAACA,aAAa,CAACH,IAAI,CAAC,IAAI,CAAC;IAClD,IAAI,CAACI,gBAAgB,GAAG,IAAI,CAACA,gBAAgB,CAACJ,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACK,YAAY,GAAG,IAAI,CAACA,YAAY,CAACL,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACM,YAAY,GAAG,IAAI,CAACA,YAAY,CAACN,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACO,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACP,IAAI,CAAC,IAAI,CAAC;IAE5D,IAAI,CAACQ,IAAI,gBAAGpD,KAAK,CAACqD,SAAS,EAAE;IAC7B,IAAI,CAACC,aAAa,gBAAGtD,KAAK,CAACqD,SAAS,EAAE;IAEtC,IAAM;MAAEE,cAAc;MAAElC,cAAc,EAAdA;IAAe,CAAC,GAAGF,MAAK;IAEhD,IAAI,CAACqC,KAAK,GAAG;MACXC,UAAU,EAAE,IAAI;MAChBC,cAAc,EAAE,IAAI;MACpBrC,cAAc,EAAdA,eAAc;MACdsC,kBAAkB,EAAE,CAAC;MACrBC,MAAM,EAAE,IAAI;MACZC,UAAU,EAAE,KAAK;MACjBC,eAAe,EAAEP,cAAc;MAC/BQ,YAAY,EAAE,IAAI;MAClBC,MAAM,EAAE,IAAI;MACZC,MAAM,EAAE;IACV,CAAC;EACH;EAEAC,kBAAkB,CAChBC,SAA2B,EAC3BC,SAAwB,EAClB;IACN,IAAM;MAAE/C,cAAc,EAAEgD,kBAAkB;MAAEC;IAAU,CAAC,GAAG,IAAI,CAACnD,KAAK;IACpE,IAAM;MACJsC,UAAU;MACVK,eAAe;MACfC,YAAY;MACZH,MAAM;MACNvC;IACF,CAAC,GAAG,IAAI,CAACmC,KAAK;IACd,IAAIM,eAAe,IAAI,CAAC,IAAI,CAACS,cAAc,EAAE,IAAID,SAAS,GAAG,CAAC,EAAE;MAC9D,IAAI,CAACE,cAAc,EAAE;IACvB;IAEA,IACET,YAAY,KAAKK,SAAS,CAACL,YAAY,IACvCH,MAAM,KAAKQ,SAAS,CAACR,MAAM,EAC3B;MACA,IAAI,CAACa,kBAAkB,EAAE;IAC3B;IAEA,IACEJ,kBAAkB,KAAKF,SAAS,CAAC9C,cAAc,IAC/CgD,kBAAkB,KAAKhD,cAAc,EACrC;MACA,IAAI,CAACqD,iBAAiB,CAACL,kBAAkB,CAAC;IAC5C,CAAC,MAAM,IAAIhD,cAAc,KAAK+C,SAAS,CAAC/C,cAAc,EAAE;MACtD,IAAM;QAAEsD,iBAAiB,EAAjBA;MAAkB,CAAC,GAAG,IAAI,CAACxD,KAAK;MACxCwD,kBAAiB,CAACtD,cAAc,CAAC;IACnC;IAEA,IAAIoC,UAAU,KAAKW,SAAS,CAACX,UAAU,EAAE;MACvC,IAAM;QAAEmB,aAAa,EAAbA;MAAc,CAAC,GAAG,IAAI,CAACzD,KAAK;MACpCyD,cAAa,CAACnB,UAAU,CAAC;IAC3B;EACF;EAEAoB,oBAAoB,GAAS;IAC3BC,MAAM,CAACC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACjC,mBAAmB,CAAC;EACjE;EA+FAkC,KAAK,GAAS;IAAA;IACZ,6BAAI,CAAC1B,aAAa,CAAC2B,OAAO,0DAA1B,sBAA4BD,KAAK,EAAE;EACrC;EAEAE,qBAAqB,GAAS;IAC5B,IAAM;MAAEnB;IAAa,CAAC,GAAG,IAAI,CAACP,KAAK;IACnC,IAAIO,YAAY,IAAI,IAAI,EAAE;MAAA;MACxB;MACA;MACA,8BAAI,CAACT,aAAa,CAAC2B,OAAO,2DAA1B,uBAA4BE,QAAQ,CAAC,CAAC,EAAEpB,YAAY,CAAC;IACvD;EACF;EAEAqB,UAAU,CAAC3D,SAAiB,EAAkB;IAC5C,IAAI,IAAI,CAAC6B,aAAa,CAAC2B,OAAO,IAAI,IAAI,EAAE;MACtC,OAAO,IAAI;IACb;IAEA,IAAM;MAAEI;IAAc,CAAC,GAAG,IAAI,CAAClE,KAAK;IACpC,IAAM;MAAEwC;IAAmB,CAAC,GAAG,IAAI,CAACH,KAAK;IACzC,IAAM8B,QAAQ,GAAG,IAAI,CAAChC,aAAa,CAAC2B,OAAO,CAACM,gBAAgB,CAACF,aAAa,CAAC;IAC3E,IAAMG,YAAY,GAAG/D,SAAS,GAAGkC,kBAAkB;IACnD,OAAO2B,QAAQ,CAACE,YAAY,CAAC;EAC/B;EAEAC,SAAS,CAAChE,SAAiB,EAAQ;IACjC,IAAM;MAAEI;IAAc,CAAC,GAAG,IAAI,CAACV,KAAK;IACpC,IAAIU,aAAa,EAAE;IAEnB,IAAI,CAAC6D,QAAQ,CAAC;MAAEjC,UAAU,EAAEhC;IAAU,CAAC,CAAC;IAExC,IAAMkE,OAAO,GAAG,IAAI,CAACP,UAAU,CAAC3D,SAAS,CAAC;IAC1C,IAAIkE,OAAO,YAAYC,WAAW,EAAE;MAClCD,OAAO,CAACX,KAAK,EAAE;IACjB;EACF;EAEAa,YAAY,CAACpE,SAAiB,EAAQ;IACpC,IAAMkE,OAAO,GAAG,IAAI,CAACP,UAAU,CAAC3D,SAAS,CAAC;IAC1C,IAAIkE,OAAO,IAAI,IAAI,EAAE;MACnBA,OAAO,CAACG,cAAc,CAAC;QAAEC,KAAK,EAAE;MAAS,CAAC,CAAC;IAC7C;EACF;EAEAhE,qBAAqB,CACnBN,SAAiB,EACjBuE,CAAmC,EAC7B;IACN,IAAI,CAACN,QAAQ,CAAC;MAAEjC,UAAU,EAAEhC;IAAU,CAAC,CAAC;;IAExC;IACA,IAAM;MAAEJ;IAAe,CAAC,GAAG,IAAI,CAACmC,KAAK;IACrC,IAAMlC,UAAU,GAAGf,UAAU,CAACe,UAAU,CAACD,cAAc,EAAEI,SAAS,CAAC;;IAEnE;IACA,IAAMwE,cAAc,GAClB3E,UAAU,IAAIb,kBAAkB,CAACyF,iBAAiB,CAACF,CAAC,CAAC;IACvD,IAAI,CAACG,YAAY,CAAC1E,SAAS,EAAEuE,CAAC,CAACI,QAAQ,EAAEH,cAAc,EAAE,KAAK,CAAC;EACjE;EAEAjE,qBAAqB,CAACP,SAAiB,EAAEuE,CAAmB,EAAQ;IAClE,IAAM;MAAEK,mBAAmB;MAAEC;IAAS,CAAC,GAAG,IAAI,CAACnF,KAAK;IAEpD,IAAIkF,mBAAmB,EAAE;MACvB,IAAI,CAACX,QAAQ,CACX;QAAA,IAAC;UAAErE;QAAe,CAAC;QAAA,OAAM;UACvBA,cAAc,EAAEd,UAAU,CAACgG,WAAW,CAAClF,cAAc,EAAE,CACrDI,SAAS,EACTA,SAAS,CACV;QACH,CAAC;MAAA,CAAC,EACF,MAAM;QACJ6E,QAAQ,CAAC7E,SAAS,EAAEuE,CAAC,CAAC;MACxB,CAAC,CACF;IACH;EACF;EAEA/D,mBAAmB,CAACb,KAAa,EAAE4E,CAAmB,EAAQ;IAC5D,IAAM;MAAE3E;IAAe,CAAC,GAAG,IAAI,CAACmC,KAAK;IAErC,IACEwC,CAAC,CAACQ,MAAM,YAAYZ,WAAW,IAC/B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAACa,OAAO,CAC/CT,CAAC,CAACQ,MAAM,CAACE,OAAO,CAACC,WAAW,EAAE,CAC/B,KAAK,CAAC,CAAC,EACR;MACA;MACA;IACF;IAEA,IAAIX,CAAC,CAACY,MAAM,KAAK,CAAC,IAAIvF,cAAc,CAACwF,MAAM,KAAK,CAAC,EAAE;MACjD;MACA,IAAI,CAACpB,SAAS,CAACrE,KAAK,CAAC;MACrB,IAAI,CAAC0F,UAAU,CAAC1F,KAAK,CAAC;MACtB;IACF;IAEA,IAAI4E,CAAC,CAACY,MAAM,IAAI,IAAI,IAAIZ,CAAC,CAACY,MAAM,KAAK,CAAC,EAAE;MACtC;IACF;IAEA,IAAI,CAAClB,QAAQ,CAAC;MACZhC,cAAc,EAAEtC,KAAK;MACrB4C,MAAM,EAAEgC,CAAC,CAACe,OAAO;MACjB9C,MAAM,EAAE+B,CAAC,CAACgB;IACZ,CAAC,CAAC;IAEFlC,MAAM,CAACmC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACnE,mBAAmB,CAAC;;IAE5D;EACF;;EAEAX,cAAc,CAACV,SAAiB,EAAEuE,CAAmB,EAAQ;IAC3DtF,GAAG,CAACwG,MAAM,CAAC,WAAW,EAAEzF,SAAS,EAAEuE,CAAC,CAACmB,aAAa,EAAEnB,CAAC,CAACoB,aAAa,CAAC;IACpE,IACE,CAACpB,CAAC,CAACoB,aAAa,IACf,IAAI,CAAC9D,aAAa,CAAC2B,OAAO,IACzBe,CAAC,CAACoB,aAAa,YAAYxB,WAAW,IACtC,CAAC,IAAI,CAACtC,aAAa,CAAC2B,OAAO,CAACoC,QAAQ,CAACrB,CAAC,CAACoB,aAAa,CAAE,EACxD;MACA;MACA,IAAI,CAAC1B,QAAQ,CAAC;QAAEjC,UAAU,EAAE;MAAK,CAAC,CAAC;IACrC;EACF;EAEAvB,eAAe,CAACT,SAAiB,EAAEuE,CAAmB,EAAQ;IAC5DtF,GAAG,CAACwG,MAAM,CAAC,YAAY,EAAEzF,SAAS,EAAEuE,CAAC,CAACQ,MAAM,CAAC;IAC7C,IAAI,CAACd,QAAQ,CAAClC,KAAK,IAAI;MACrB,IAAM;QAAEC;MAAW,CAAC,GAAGD,KAAK;MAC5B,IAAIC,UAAU,KAAKhC,SAAS,EAAE;QAC5B,OAAO;UAAEgC,UAAU,EAAEhC;QAAU,CAAC;MAClC;MACA,OAAO,IAAI;IACb,CAAC,CAAC;EACJ;EAEAW,mBAAmB,CAACX,SAAiB,EAAEuE,CAAmB,EAAQ;IAChE,IAAM;MAAEsB,YAAY;MAAEC,aAAa;MAAE1F;IAAc,CAAC,GAAG,IAAI,CAACV,KAAK;IACjE,IAAM;MAAEuC,cAAc;MAAErC,cAAc;MAAE2C,MAAM;MAAEC;IAAO,CAAC,GAAG,IAAI,CAACT,KAAK;IAErE,IAAIE,cAAc,IAAI,IAAI,IAAI7B,aAAa,EAAE;IAE7C,IAAM2F,UAAU,GAAGC,IAAI,CAACC,GAAG,CAAC1B,CAAC,CAACe,OAAO,IAAI/C,MAAM,aAANA,MAAM,cAANA,MAAM,GAAI,CAAC,CAAC,CAAC;IACtD,IAAM2D,UAAU,GAAGF,IAAI,CAACC,GAAG,CAAC1B,CAAC,CAACgB,OAAO,IAAI/C,MAAM,aAANA,MAAM,cAANA,MAAM,GAAI,CAAC,CAAC,CAAC;IACtD,IAAIuD,UAAU,GAAG5G,cAAc,IAAI+G,UAAU,GAAG/G,cAAc,EAAE;MAC9D,IAAI,CAAC8E,QAAQ,CAAC;QAAE7B,UAAU,EAAE;MAAK,CAAC,CAAC;IACrC;IACA,IAAIyD,YAAY,IAAI5D,cAAc,KAAKjC,SAAS,EAAE;MAChD,IAAI,CAACgE,SAAS,CAAChE,SAAS,CAAC;MAEzB,IAAI8F,aAAa,EAAE;QACjB,IACE,CAACD,YAAY,IACb,CAAC,IAAI,CAACM,eAAe,CAACnG,SAAS,EAAEJ,cAAc,CAAC,IAChD,CAACZ,kBAAkB,CAACyF,iBAAiB,CAACF,CAAC,CAAC,EACxC;UACA;UACA,IAAI,CAAC6B,WAAW,EAAE;QACpB;QACA,IAAI,CAACtB,WAAW,CAAC,CACfkB,IAAI,CAACK,GAAG,CAACpE,cAAc,EAAEjC,SAAS,CAAC,EACnCgG,IAAI,CAAClG,GAAG,CAACmC,cAAc,EAAEjC,SAAS,CAAC,CACpC,CAAC;MACJ,CAAC,MAAM;QACL,IAAI,CAAC0E,YAAY,CACf1E,SAAS,EACTuE,CAAC,CAACI,QAAQ,EACV3F,kBAAkB,CAACyF,iBAAiB,CAACF,CAAC,CAAC,EACvC,KAAK,CACN;MACH;IACF;EACF;EAEA3D,iBAAiB,CAACjB,KAAa,EAAE4E,CAAmB,EAAQ;IAC1D,IAAM;MAAE+B,iBAAiB;MAAE1B,mBAAmB;MAAEC;IAAS,CAAC,GAAG,IAAI,CAACnF,KAAK;IACvE,IAAM;MAAEuC,cAAc;MAAEG;IAAW,CAAC,GAAG,IAAI,CAACL,KAAK;IAEjD,IACEwC,CAAC,CAACQ,MAAM,YAAYZ,WAAW,IAC/B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAACa,OAAO,CAC/CT,CAAC,CAACQ,MAAM,CAACE,OAAO,CAACC,WAAW,EAAE,CAC/B,KAAK,CAAC,CAAC,EACR;MACA;IACF;IAEA,IAAIjD,cAAc,KAAKtC,KAAK,IAAI,CAACyC,UAAU,EAAE;MAC3C,IAAMmE,WAAW,GAAGhC,CAAC,CAACI,QAAQ;MAC9B,IAAMH,cAAc,GAAGxF,kBAAkB,CAACyF,iBAAiB,CAACF,CAAC,CAAC;MAC9D,IAAI,CAACP,SAAS,CAACrE,KAAK,CAAC;MACrB,IAAI,CAAC+E,YAAY,CAAC/E,KAAK,EAAE4G,WAAW,EAAE/B,cAAc,EAAE8B,iBAAiB,CAAC;MAExE,IAAI,CAAC1B,mBAAmB,IAAI,CAAC2B,WAAW,IAAI,CAAC/B,cAAc,EAAE;QAC3DK,QAAQ,CAAClF,KAAK,EAAE4E,CAAC,CAAC;MACpB;IACF;IAEA,IAAI,CAACiC,eAAe,EAAE;EACxB;EAEApF,mBAAmB,QAAyD;IAAA,IAAxD;MAAEc;IAA6C,CAAC;IAClE,IAAI,CAAC+B,QAAQ,CAAC;MAAE/B;IAAmB,CAAC,CAAC;EACvC;EAEAT,YAAY,QAAyB;IAAA,IAAxB;MAAEU;IAAa,CAAC;IAC3B,IAAI,CAAC8B,QAAQ,CAAC;MAAE9B;IAAO,CAAC,CAAC;EAC3B;EAEAZ,gBAAgB,GAAS;IACvB,IAAI,CAAC0C,QAAQ,CAAC;MAAEhC,cAAc,EAAE;IAAK,CAAC,CAAC;EACzC;EAEAZ,mBAAmB,GAAS;IAC1B,IAAI,CAACmF,eAAe,EAAE;IACtBnD,MAAM,CAACC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACjC,mBAAmB,CAAC;EACjE;EAEAC,aAAa,CAACiD,CAAsB,EAAQ;IAC1C,IAAM;MAAEuB,aAAa;MAAEjD,SAAS;MAAEgC;IAAS,CAAC,GAAG,IAAI,CAACnF,KAAK;IACzD,IAAM;MAAEsC,UAAU,EAAEyE;IAAS,CAAC,GAAG,IAAI,CAAC1E,KAAK;IAC3C,IAAI2E,QAAQ,GAAGD,QAAQ;IAEvB,IAAIlC,CAAC,CAACtE,GAAG,KAAK,OAAO,IAAIsE,CAAC,CAACtE,GAAG,KAAK,GAAG,EAAE;MACtC,IAAI,CAAC6F,aAAa,IAAIY,QAAQ,IAAI,IAAI,EAAE;QACtC,IAAI,CAACzC,QAAQ,CAAC;UAAErE,cAAc,EAAE,CAAC,CAAC8G,QAAQ,EAAEA,QAAQ,CAAC;QAAE,CAAC,EAAE,MAAM;UAC9D,IAAIA,QAAQ,IAAI,IAAI,EAAE;YACpB7B,QAAQ,CAAC6B,QAAQ,EAAEnC,CAAC,CAAC;UACvB;QACF,CAAC,CAAC;MACJ;MACA;IACF;IAEA,IAAIA,CAAC,CAACtE,GAAG,KAAK,SAAS,EAAE;MACvB,IAAIyG,QAAQ,IAAI,IAAI,IAAIA,QAAQ,IAAI,CAAC,EAAE;QACrCA,QAAQ,GAAGV,IAAI,CAAClG,GAAG,CAAC,CAAC,EAAE4G,QAAQ,GAAG,CAAC,CAAC;MACtC,CAAC,MAAM;QACLA,QAAQ,GAAG7D,SAAS,GAAG,CAAC;MAC1B;IACF,CAAC,MAAM,IAAI0B,CAAC,CAACtE,GAAG,KAAK,WAAW,EAAE;MAChC,IAAIyG,QAAQ,IAAI,IAAI,IAAIA,QAAQ,IAAI,CAAC,EAAE;QACrCA,QAAQ,GAAGV,IAAI,CAACK,GAAG,CAACK,QAAQ,GAAG,CAAC,EAAE7D,SAAS,GAAG,CAAC,CAAC;MAClD,CAAC,MAAM;QACL6D,QAAQ,GAAG,CAAC;MACd;IACF,CAAC,MAAM;MACL;IACF;IAEA,IAAID,QAAQ,KAAKC,QAAQ,EAAE;MACzBnC,CAAC,CAACoC,eAAe,EAAE;MACnBpC,CAAC,CAACqC,cAAc,EAAE;MAElB,IAAI,CAAC5C,SAAS,CAAC0C,QAAQ,CAAC;MAExB,IAAM;QAAE9G;MAAe,CAAC,GAAG,IAAI,CAACmC,KAAK;MACrC,IAAIwC,CAAC,CAACI,QAAQ,IAAI/E,cAAc,CAACwF,MAAM,GAAG,CAAC,EAAE;QAC3C,IAAMyB,SAAS,GAAGjH,cAAc,CAACA,cAAc,CAACwF,MAAM,GAAG,CAAC,CAAC;QAC3D,IAAI,CAACN,WAAW,CAAC,CACfkB,IAAI,CAACK,GAAG,CAACK,QAAQ,EAAEG,SAAS,CAAC,CAAC,CAAC,CAAC,EAChCb,IAAI,CAAClG,GAAG,CAAC4G,QAAQ,EAAEG,SAAS,CAAC,CAAC,CAAC,CAAC,CACjC,CAAC;MACJ,CAAC,MAAM;QACL,IAAI,CAACT,WAAW,EAAE;QAClB,IAAIM,QAAQ,KAAK,IAAI,EAAE;UACrB,IAAI,CAACrB,UAAU,CAACqB,QAAQ,CAAC;QAC3B,CAAC,MAAM;UAAA;UACL,8BAAI,CAAC7E,aAAa,CAAC2B,OAAO,2DAA1B,uBAA4BD,KAAK,EAAE;QACrC;MACF;MAEA,IAAI,CAACc,cAAc,CAACqC,QAAQ,CAAC;IAC/B;EACF;EAEAlF,YAAY,QAGgB;IAAA,IAHf;MACXsF,wBAAwB;MACxBxE;IACiB,CAAC;IAClB,IAAI,CAAC2B,QAAQ,CAAClC,KAAK,IAAI;MACrB,IAAI+E,wBAAwB,EAAE;QAC5B;QACA;QACA,OAAO;UAAExE;QAAa,CAAC;MACzB;MAEA,IAAM;QAAER;MAAe,CAAC,GAAG,IAAI,CAACpC,KAAK;MACrC,IAAM;QAAEyC;MAAO,CAAC,GAAGJ,KAAK;MAExB,IAAMM,eAAe,GACnBP,cAAc,IAAI,IAAI,CAACgB,cAAc,CAAC;QAAER,YAAY;QAAEH;MAAO,CAAC,CAAC;MACjE,OAAO;QAAEE,eAAe;QAAEC;MAAa,CAAC;IAC1C,CAAC,CAAC;EACJ;EAEAkE,eAAe,GAAS;IACtB,IAAI,CAACvC,QAAQ,CAAC;MAAEhC,cAAc,EAAE,IAAI;MAAEG,UAAU,EAAE;IAAM,CAAC,CAAC;EAC5D;EAEAW,cAAc,GAAS;IACrB,IAAM;MAAEF;IAAU,CAAC,GAAG,IAAI,CAACnD,KAAK;IAChC,IAAI,IAAI,CAACiC,IAAI,CAAC6B,OAAO,EAAE;MACrB,IAAI,CAAC7B,IAAI,CAAC6B,OAAO,CAACY,YAAY,CAACvB,SAAS,CAAC;IAC3C;EACF;EAEAwB,cAAc,CAACrE,SAAiB,EAAQ;IACtC,IAAI,IAAI,CAAC2B,IAAI,CAAC6B,OAAO,EAAE;MACrB,IAAI,CAAC7B,IAAI,CAAC6B,OAAO,CAACY,YAAY,CAACpE,SAAS,CAAC;IAC3C;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;EACE0E,YAAY,CACV/E,KAAa,EACb4G,WAAoB,EACpB/B,cAAuB,EAEjB;IAAA,IADNuC,cAAc,uEAAG,IAAI;IAErB,IAAM;MAAEjB;IAAc,CAAC,GAAG,IAAI,CAACpG,KAAK;IACpC,IAAM;MAAEE;IAAe,CAAC,GAAG,IAAI,CAACmC,KAAK;IAErC,IAAI+D,aAAa,IAAIS,WAAW,IAAI3G,cAAc,CAACwF,MAAM,GAAG,CAAC,EAAE;MAC7D,IAAMyB,SAAS,GAAGjH,cAAc,CAACA,cAAc,CAACwF,MAAM,GAAG,CAAC,CAAC;MAC3D,IAAI,CAACN,WAAW,CAAC,CACfkB,IAAI,CAACK,GAAG,CAACQ,SAAS,CAAC,CAAC,CAAC,EAAElH,KAAK,CAAC,EAC7BqG,IAAI,CAAClG,GAAG,CAACH,KAAK,EAAEkH,SAAS,CAAC,CAAC,CAAC,CAAC,CAC9B,CAAC;IACJ,CAAC,MAAM,IACLf,aAAa,IACblG,cAAc,CAACwF,MAAM,KAAK,CAAC,IAC3BxF,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAKD,KAAK,IAC9BC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAKD,KAAK,EAC9B;MACA,IAAIoH,cAAc,EAAE;QAClB,IAAI,CAACC,YAAY,CAACrH,KAAK,CAAC;MAC1B;IACF,CAAC,MAAM,IAAImG,aAAa,IAAItB,cAAc,EAAE;MAC1C,IAAI,IAAI,CAAC2B,eAAe,CAACxG,KAAK,EAAEC,cAAc,CAAC,EAAE;QAC/C,IAAImH,cAAc,EAAE;UAClB,IAAI,CAACC,YAAY,CAACrH,KAAK,CAAC;QAC1B;MACF,CAAC,MAAM;QACL,IAAI,CAAC0F,UAAU,CAAC1F,KAAK,CAAC;MACxB;IACF,CAAC,MAAM;MACL,IAAI,CAACyG,WAAW,EAAE;MAClB,IAAI,CAACf,UAAU,CAAC1F,KAAK,CAAC;IACxB;EACF;EAEAyG,WAAW,GAAS;IAClB,IAAM;MAAEvD;IAAU,CAAC,GAAG,IAAI,CAACnD,KAAK;IAChC,IAAI,CAACuH,aAAa,CAAC,CAAC,CAAC,EAAEpE,SAAS,CAAC,CAAC;EACpC;EAEAmE,YAAY,CAACrH,KAAa,EAAQ;IAChC,IAAI,CAACsH,aAAa,CAAC,CAACtH,KAAK,EAAEA,KAAK,CAAC,CAAC;EACpC;EAEAsH,aAAa,CAACC,KAAY,EAAQ;IAChCpI,UAAU,CAACqI,aAAa,CAACD,KAAK,CAAC;IAE/B,IAAI,CAACjD,QAAQ,CAAC;MAAA,IAAC;QAAErE;MAAe,CAAC;MAAA,OAAM;QACrCA,cAAc,EAAEd,UAAU,CAACmI,aAAa,CAACrH,cAAc,EAAEsH,KAAK;MAChE,CAAC;IAAA,CAAC,CAAC;EACL;EAEA7B,UAAU,CAAC1F,KAAa,EAAQ;IAC9B,IAAM;MAAES;IAAc,CAAC,GAAG,IAAI,CAACV,KAAK;IACpC,IAAIU,aAAa,EAAE;IAEnB,IAAI,CAAC0E,WAAW,CAAC,CAACnF,KAAK,EAAEA,KAAK,CAAC,CAAC;EAClC;EAEAmF,WAAW,CAACoC,KAAY,EAAQ;IAC9BpI,UAAU,CAACqI,aAAa,CAACD,KAAK,CAAC;IAE/B,IAAI,CAACjD,QAAQ,CAAC;MAAA,IAAC;QAAErE;MAAe,CAAC;MAAA,OAAM;QACrCA,cAAc,EAAEd,UAAU,CAACgG,WAAW,CAAClF,cAAc,EAAEsH,KAAK;MAC9D,CAAC;IAAA,CAAC,CAAC;EACL;EAEAjE,iBAAiB,CAACrD,cAAgC,EAAQ;IACxD,IAAI,CAACqE,QAAQ,CAAC;MAAErE;IAAe,CAAC,CAAC;EACnC;EAEAoD,kBAAkB,GAAS;IACzB,IAAM;MAAEV,YAAY;MAAEH;IAAO,CAAC,GAAG,IAAI,CAACJ,KAAK;IAC3C,IAAIO,YAAY,IAAI,IAAI,IAAIH,MAAM,IAAI,IAAI,EAAE;MAC1C,IAAM;QAAEiF,gBAAgB,EAAhBA,iBAAgB;QAAEC;MAAU,CAAC,GAAG,IAAI,CAAC3H,KAAK;MAClD,IAAM4H,OAAM,GAAGtB,IAAI,CAACuB,KAAK,CAACjF,YAAY,GAAG+E,SAAS,CAAC;MACnD,IAAMG,UAAS,GAAGF,OAAM,GAAGtB,IAAI,CAACyB,IAAI,CAACtF,MAAM,GAAGkF,SAAS,CAAC;MACxDD,iBAAgB,CAACE,OAAM,EAAEE,UAAS,CAAC;IACrC;EACF;EAEA1E,cAAc,GAKH;IAAA,IAJT;MACER,YAAY;MACZH;IAC8C,CAAC,uEAAG,IAAI,CAACJ,KAAK;IAE9D,IAAII,MAAM,IAAI,IAAI,IAAIG,YAAY,IAAI,IAAI,EAAE;MAC1C,OAAO,KAAK;IACd;IAEA,IAAM;MAAEO,SAAS;MAAEwE;IAAU,CAAC,GAAG,IAAI,CAAC3H,KAAK;IAC3C,OAAO4C,YAAY,GAAGH,MAAM,IAAIU,SAAS,GAAGwE,SAAS;EACvD;EAEA3F,kBAAkB,QAMY;IAAA,IANX;MACjB/B,KAAK,EAAEK,SAAS;MAChBG;IAIF,CAAC;IACC,IAAM;MAAEe,KAAK;MAAEwG,MAAM;MAAErI,UAAU;MAAEe;IAAc,CAAC,GAAG,IAAI,CAACV,KAAK;IAC/D,IAAM;MAAEsC,UAAU;MAAEpC;IAAe,CAAC,GAAG,IAAI,CAACmC,KAAK;IACjD,IAAI/B,SAAS,GAAG0H,MAAM,IAAI1H,SAAS,IAAI0H,MAAM,GAAGxG,KAAK,CAACkE,MAAM,EAAE;MAC5D,OAAO,IAAI;IACb;IAEA,IAAM9F,IAAI,GAAG4B,KAAK,CAAClB,SAAS,GAAG0H,MAAM,CAAC;IACtC,OAAO,IAAI,CAACC,aAAa,CACvB3H,SAAS,EACTA,SAAS,EACTV,IAAI,EACJU,SAAS,KAAKgC,UAAU,IAAI,CAAC5B,aAAa,EAC1C,IAAI,CAAC+F,eAAe,CAACnG,SAAS,EAAEJ,cAAc,CAAC,EAC/CP,UAAU,EACVc,KAAK,EACLC,aAAa,CACd;EACH;EAEAwH,MAAM,GAAgB;IACpB,IAAM;MACJ1G,KAAK;MACL2B,SAAS;MACTgF,aAAa;MACbxI,UAAU;MACVgI,SAAS;MACT,aAAa,EAAES;IACjB,CAAC,GAAG,IAAI,CAACpI,KAAK;IACd,IAAM;MAAEE,cAAc;MAAEyC;IAAgB,CAAC,GAAG,IAAI,CAACN,KAAK;IACtD,oBACE,KAAC,SAAS;MAAC,SAAS,EAAC,sBAAsB;MAAC,QAAQ,EAAE,IAAI,CAACN,YAAa;MAAA,UACrE;QAAA,IAAC;UAAEsG,KAAK;UAAE5F;QAAO,CAAC;QAAA,oBACjB,KAAC,IAAI;UACH,SAAS,EAAC,uBAAuB;UACjC,MAAM,EAAEA,MAAO;UACf,KAAK,EAAE4F,KAAM;UACb,mBAAmB,EAAE1F,eAAe,GAAGQ,SAAS,GAAGwE,SAAS,GAAG,CAAE;UACjE,SAAS,EAAExE,SAAU;UACrB,QAAQ,EAAEwE;UACV;UACA;UACA;UAAA;UACA,QAAQ,EAAE,IAAI,CAACW,WAAW,CAAC9G,KAAK,EAAEtB,cAAc,EAAEP,UAAU,CAAE;UAC9D,QAAQ,EAAE,IAAI,CAACmC,YAAa;UAC5B,eAAe,EAAE,IAAI,CAACJ,mBAAoB;UAC1C,GAAG,EAAE,IAAI,CAACO,IAAK;UACf,gBAAgB,EAAE,IAAI,CAACsG,eAAe,CAAC,IAAI,CAAC3G,aAAa,CAAE;UAC3D,QAAQ,EAAE,IAAI,CAACO,aAAc;UAC7B,gBAAgB,EAAE,IAAI,CAACqG,eAAe,EAAG;UACzC,aAAa,EAAEL,aAAc;UAC7B,eAAaC,UAAW;UAAA,UAEvB,IAAI,CAACpG;QAAkB,EACnB;MAAA;IACR,EACS;EAEhB;AACF;AAAC,gBA7sBYtC,QAAQ,gBAIC,IAAI;AAAA,gBAJbA,QAAQ,wBAMS,EAAE;AAAA,gBANnBA,QAAQ,sBASO,EAAE;AAAA,gBATjBA,QAAQ,kBAWG;EACpBsI,MAAM,EAAE,CAAC;EACTxG,KAAK,EAAE,EAAE;EACTmG,SAAS,EAAEjI,QAAQ,CAAC+I,kBAAkB;EAEtC7B,iBAAiB,EAAE,IAAI;EAEvB1B,mBAAmB,EAAE,KAAK;EAE1BiB,YAAY,EAAE,IAAI;EAElBC,aAAa,EAAE,KAAK;EAEpBhE,cAAc,EAAE,KAAK;EAErB1B,aAAa,EAAE,KAAK;EAEpB+C,aAAa,GAAS;IACpB;EAAA,CACD;EACD0B,QAAQ,GAAS;IACf;EAAA,CACD;EACD3B,iBAAiB,GAAS;IACxB;EAAA,CACD;EACDkE,gBAAgB,GAAS;IACvB;EAAA,CACD;EAEDS,aAAa,EAAEzI,QAAQ,CAACgJ,gBAAgB;EAExC/I,UAAU,EAAED,QAAQ,CAACC,UAAU;EAC/BO,cAAc,EAAE,EAAE;EAElBgE,aAAa,EAAE,iBAAiB;EAEhC,aAAa,EAAEyE;AACjB,CAAC;AA8pBH,eAAejJ,QAAQ"}
1
+ {"version":3,"file":"ItemList.js","names":["React","PureComponent","memoize","FixedSizeList","List","AutoSizer","Log","RangeUtils","ItemListItem","ContextActionUtils","jsx","_jsx","log","module","MIN_DRAG_DELTA","ItemList","renderItem","_ref","_ref2","_item$displayValue","item","className","children","displayValue","value","concat","constructor","props","_defineProperty","index","selectedRanges","isSelected","max","CACHE_SIZE","itemIndex","key","isFocused","style","disableSelect","content","onContextMenu","handleItemContextMenu","onDoubleClick","handleItemDoubleClick","onMouseDown","handleItemMouseDown","onFocus","handleItemFocus","onBlur","handleItemBlur","onMouseMove","handleItemMouseMove","onMouseUp","handleItemMouseUp","onKeyDown","component","forwardRef","ref","_objectSpread","tabIndex","role","displayName","items","bind","handleItemsRendered","handleWindowMouseUp","handleKeyDown","handleMouseLeave","handleScroll","handleResize","renderInnerElement","list","createRef","listContainer","isStickyBottom","state","focusIndex","mouseDownIndex","overscanStartIndex","height","isDragging","isStuckToBottom","scrollOffset","mouseX","mouseY","componentDidUpdate","prevProps","prevState","propSelectedRanges","itemCount","isListAtBottom","scrollToBottom","sendViewportUpdate","setSelectedRanges","onSelectionChange","onFocusChange","componentWillUnmount","window","removeEventListener","focus","_this$listContainer$c","current","restoreScrollPosition","_this$listContainer$c2","scrollTo","getElement","focusSelector","elements","querySelectorAll","elementIndex","focusItem","setState","element","HTMLElement","scrollToItem","scrollIntoView","block","e","isModifierDown","isModifierKeyDown","toggleSelect","shiftKey","isDoubleClickSelect","onSelect","_ref3","selectRange","target","indexOf","tagName","toLowerCase","button","length","selectItem","clientX","clientY","addEventListener","debug2","currentTarget","relatedTarget","contains","isDragSelect","isMultiSelect","mouseMoveX","Math","abs","mouseMoveY","getItemSelected","deselectAll","min","isDeselectOnClick","isShiftDown","resetMouseState","_ref4","_ref5","oldFocus","newFocus","stopPropagation","preventDefault","lastRange","_this$listContainer$c3","_ref6","scrollUpdateWasRequested","isDeselectable","arguments","undefined","deselectItem","deselectRange","range","validateRange","_ref7","_ref8","onViewportChange","rowHeight","topRow","floor","bottomRow","ceil","_ref9","offset","getCachedItem","render","overscanCount","dataTestId","onResize","_ref10","width","initialScrollOffset","itemSize","itemData","getItemData","onScroll","onItemsRendered","outerElementType","getOuterElement","outerRef","innerElementType","getInnerElement","DEFAULT_ROW_HEIGHT","DEFAULT_OVERSCAN"],"sources":["../src/ItemList.tsx"],"sourcesContent":["/* eslint-disable react/no-unstable-nested-components */\nimport 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');\nconst MIN_DRAG_DELTA = 5;\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: readonly 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: readonly Range[]): void;\n onViewportChange(topRow: number, bottomRow: number): void;\n overscanCount: number;\n selectedRanges: readonly 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: readonly Range[];\n overscanStartIndex: number;\n height: number | null;\n isDragging: boolean;\n isStuckToBottom: boolean;\n scrollOffset: number | null;\n mouseX: number | null;\n mouseY: 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 mouseX: null,\n mouseY: null,\n };\n }\n\n componentDidUpdate(\n prevProps: ItemListProps<T>,\n prevState: ItemListState\n ): void {\n const { selectedRanges: propSelectedRanges, itemCount } = this.props;\n const {\n focusIndex,\n isStuckToBottom,\n scrollOffset,\n height,\n selectedRanges,\n } = this.state;\n if (isStuckToBottom && !this.isListAtBottom() && itemCount > 0) {\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: readonly 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 (\n items: readonly T[],\n selectedRanges: readonly Range[],\n renderItem: RenderItemFn<T>\n ) => ({\n items,\n selectedRanges,\n renderItem,\n })\n );\n\n focus(): void {\n this.listContainer.current?.focus();\n }\n\n restoreScrollPosition(): void {\n const { scrollOffset } = this.state;\n if (scrollOffset != null) {\n // manually restore the scroll containers offset\n // virtual list doesn't restore scrolloffset in a re-render if it's the same\n this.listContainer.current?.scrollTo(0, scrollOffset);\n }\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 this.setState({ focusIndex: itemIndex });\n\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({\n mouseDownIndex: index,\n mouseX: e.clientX,\n mouseY: e.clientY,\n });\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, mouseX, mouseY } = this.state;\n\n if (mouseDownIndex == null || disableSelect) return;\n\n const mouseMoveX = Math.abs(e.clientX - (mouseX ?? 0));\n const mouseMoveY = Math.abs(e.clientY - (mouseY ?? 0));\n if (mouseMoveX > MIN_DRAG_DELTA && mouseMoveY > MIN_DRAG_DELTA) {\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: readonly 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, isStuckToBottom } = 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 initialScrollOffset={isStuckToBottom ? itemCount * rowHeight : 0}\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 +1 @@
1
- {"version":3,"file":"ItemListItem.js","names":["React","Component","classNames","Log","log","module","ItemListItem","handleKeyDown","constructor","props","handleBlur","bind","handleFocus","handleClick","handleContextMenu","handleDragStart","handleDrag","handleDragOver","handleDragEnd","handleDrop","handleDoubleClick","handleMouseDown","handleMouseMove","handleMouseUp","itemRef","createRef","e","itemIndex","onBlur","onFocus","onClick","onContextMenu","onDragStart","onDrag","preventDefault","onDragOver","onDragEnd","onDrop","onDoubleClick","onMouseMove","onMouseDown","onMouseUp","render","isDraggable","isFocused","isSelected","style","children","dataTestId","active","undefined"],"sources":["../src/ItemListItem.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport classNames from 'classnames';\nimport './ItemListItem.scss';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('ItemListItem');\n\ninterface ItemListItemProps {\n isDraggable: boolean;\n isFocused: boolean;\n isSelected: boolean;\n itemIndex: number;\n // eslint-disable-next-line react/no-unused-prop-types\n disableSelect: boolean;\n onBlur(index: number, e: React.FocusEvent<HTMLDivElement>): void;\n onClick(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onContextMenu(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrag(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDoubleClick(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onFocus(index: number, e: React.FocusEvent<HTMLDivElement>): void;\n onMouseDown(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onMouseMove(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onMouseUp(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n style: React.CSSProperties;\n children: React.ReactNode;\n 'data-testid'?: string;\n}\n\nclass ItemListItem extends Component<ItemListItemProps, Record<string, never>> {\n static defaultProps = {\n children: null,\n isDraggable: false,\n isFocused: false,\n isSelected: false,\n itemIndex: 0,\n 'data-testid': undefined,\n\n onBlur(): void {\n // no-op\n },\n onClick(): void {\n // no-op\n },\n onContextMenu(): void {\n // no-op\n },\n onDragStart(): void {\n // no-op\n },\n onDrag(): void {\n // no-op\n },\n onDragOver(): void {\n // no-op\n },\n onDragEnd(): void {\n // no-op\n },\n onDrop(): void {\n // no-op\n },\n onDoubleClick(): void {\n // no-op\n },\n onFocus(): void {\n // no-op\n },\n onMouseDown(): void {\n // no-op\n },\n onMouseMove(): void {\n // no-op\n },\n onMouseUp(): void {\n // no-op\n },\n style: {},\n };\n\n static handleKeyDown(): boolean {\n log.log('ItemListItem.handleKeyDown false');\n return false;\n }\n\n constructor(props: ItemListItemProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleDragStart = this.handleDragStart.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDragOver = this.handleDragOver.bind(this);\n this.handleDragEnd = this.handleDragEnd.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n this.handleDoubleClick = this.handleDoubleClick.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n\n this.itemRef = React.createRef();\n }\n\n itemRef: React.RefObject<HTMLDivElement>;\n\n handleBlur(e: React.FocusEvent<HTMLDivElement>): void {\n const { itemIndex, onBlur } = this.props;\n onBlur(itemIndex, e);\n }\n\n handleFocus(e: React.FocusEvent<HTMLDivElement>): void {\n const { itemIndex, onFocus } = this.props;\n onFocus(itemIndex, e);\n }\n\n handleClick(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onClick } = this.props;\n onClick(itemIndex, e);\n }\n\n handleContextMenu(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onContextMenu } = this.props;\n onContextMenu(itemIndex, e);\n }\n\n handleDragStart(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDragStart } = this.props;\n onDragStart(itemIndex, e);\n }\n\n handleDrag(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDrag } = this.props;\n onDrag(itemIndex, e);\n }\n\n handleDragOver(e: React.DragEvent<HTMLDivElement>): void {\n // Have to call preventDefault otherwise onDrop won't get triggered\n e.preventDefault();\n const { itemIndex, onDragOver } = this.props;\n onDragOver(itemIndex, e);\n }\n\n handleDragEnd(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDragEnd } = this.props;\n onDragEnd(itemIndex, e);\n }\n\n handleDrop(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDrop } = this.props;\n onDrop(itemIndex, e);\n }\n\n handleDoubleClick(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onDoubleClick } = this.props;\n onDoubleClick(itemIndex, e);\n }\n\n handleMouseMove(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onMouseMove } = this.props;\n onMouseMove(itemIndex, e);\n }\n\n handleMouseDown(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onMouseDown } = this.props;\n onMouseDown(itemIndex, e);\n }\n\n handleMouseUp(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onMouseUp } = this.props;\n onMouseUp(itemIndex, e);\n }\n\n render(): JSX.Element {\n const {\n isDraggable,\n isFocused,\n isSelected,\n style,\n children,\n 'data-testid': dataTestId,\n } = this.props;\n return (\n <div\n className={classNames(\n 'item-list-item',\n { active: isSelected },\n { 'is-focused': isFocused },\n { 'is-draggable': isDraggable }\n )}\n onKeyDown={ItemListItem.handleKeyDown}\n onContextMenuCapture={this.handleContextMenu}\n onClick={this.handleClick}\n onDrag={this.handleDrag}\n onDragStart={this.handleDragStart}\n onDragOver={this.handleDragOver}\n onDragEnd={this.handleDragEnd}\n onDrop={this.handleDrop}\n onDoubleClick={this.handleDoubleClick}\n onMouseDown={this.handleMouseDown}\n onMouseMove={this.handleMouseMove}\n onMouseUp={this.handleMouseUp}\n tabIndex={-1}\n ref={this.itemRef}\n role=\"listitem\"\n style={style}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n draggable={isDraggable}\n data-testid={dataTestId}\n >\n {children}\n </div>\n );\n }\n}\n\nexport default ItemListItem;\n"],"mappings":"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"}
1
+ {"version":3,"file":"ItemListItem.js","names":["React","Component","classNames","Log","jsx","_jsx","log","module","ItemListItem","handleKeyDown","constructor","props","_defineProperty","handleBlur","bind","handleFocus","handleClick","handleContextMenu","handleDragStart","handleDrag","handleDragOver","handleDragEnd","handleDrop","handleDoubleClick","handleMouseDown","handleMouseMove","handleMouseUp","itemRef","createRef","e","itemIndex","onBlur","onFocus","onClick","onContextMenu","onDragStart","onDrag","preventDefault","onDragOver","onDragEnd","onDrop","onDoubleClick","onMouseMove","onMouseDown","onMouseUp","render","isDraggable","isFocused","isSelected","style","children","dataTestId","className","active","onKeyDown","onContextMenuCapture","tabIndex","ref","role","draggable","undefined"],"sources":["../src/ItemListItem.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport classNames from 'classnames';\nimport './ItemListItem.scss';\nimport Log from '@deephaven/log';\n\nconst log = Log.module('ItemListItem');\n\ninterface ItemListItemProps {\n isDraggable: boolean;\n isFocused: boolean;\n isSelected: boolean;\n itemIndex: number;\n // eslint-disable-next-line react/no-unused-prop-types\n disableSelect: boolean;\n onBlur(index: number, e: React.FocusEvent<HTMLDivElement>): void;\n onClick(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onContextMenu(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onDragStart(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrag(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragOver(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDragEnd(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDrop(index: number, e: React.DragEvent<HTMLDivElement>): void;\n onDoubleClick(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onFocus(index: number, e: React.FocusEvent<HTMLDivElement>): void;\n onMouseDown(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onMouseMove(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n onMouseUp(index: number, e: React.MouseEvent<HTMLDivElement>): void;\n style: React.CSSProperties;\n children: React.ReactNode;\n 'data-testid'?: string;\n}\n\nclass ItemListItem extends Component<ItemListItemProps, Record<string, never>> {\n static defaultProps = {\n children: null,\n isDraggable: false,\n isFocused: false,\n isSelected: false,\n itemIndex: 0,\n 'data-testid': undefined,\n\n onBlur(): void {\n // no-op\n },\n onClick(): void {\n // no-op\n },\n onContextMenu(): void {\n // no-op\n },\n onDragStart(): void {\n // no-op\n },\n onDrag(): void {\n // no-op\n },\n onDragOver(): void {\n // no-op\n },\n onDragEnd(): void {\n // no-op\n },\n onDrop(): void {\n // no-op\n },\n onDoubleClick(): void {\n // no-op\n },\n onFocus(): void {\n // no-op\n },\n onMouseDown(): void {\n // no-op\n },\n onMouseMove(): void {\n // no-op\n },\n onMouseUp(): void {\n // no-op\n },\n style: {},\n };\n\n static handleKeyDown(): boolean {\n log.log('ItemListItem.handleKeyDown false');\n return false;\n }\n\n constructor(props: ItemListItemProps) {\n super(props);\n\n this.handleBlur = this.handleBlur.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.handleContextMenu = this.handleContextMenu.bind(this);\n this.handleDragStart = this.handleDragStart.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDragOver = this.handleDragOver.bind(this);\n this.handleDragEnd = this.handleDragEnd.bind(this);\n this.handleDrop = this.handleDrop.bind(this);\n this.handleDoubleClick = this.handleDoubleClick.bind(this);\n this.handleMouseDown = this.handleMouseDown.bind(this);\n this.handleMouseMove = this.handleMouseMove.bind(this);\n this.handleMouseUp = this.handleMouseUp.bind(this);\n\n this.itemRef = React.createRef();\n }\n\n itemRef: React.RefObject<HTMLDivElement>;\n\n handleBlur(e: React.FocusEvent<HTMLDivElement>): void {\n const { itemIndex, onBlur } = this.props;\n onBlur(itemIndex, e);\n }\n\n handleFocus(e: React.FocusEvent<HTMLDivElement>): void {\n const { itemIndex, onFocus } = this.props;\n onFocus(itemIndex, e);\n }\n\n handleClick(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onClick } = this.props;\n onClick(itemIndex, e);\n }\n\n handleContextMenu(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onContextMenu } = this.props;\n onContextMenu(itemIndex, e);\n }\n\n handleDragStart(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDragStart } = this.props;\n onDragStart(itemIndex, e);\n }\n\n handleDrag(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDrag } = this.props;\n onDrag(itemIndex, e);\n }\n\n handleDragOver(e: React.DragEvent<HTMLDivElement>): void {\n // Have to call preventDefault otherwise onDrop won't get triggered\n e.preventDefault();\n const { itemIndex, onDragOver } = this.props;\n onDragOver(itemIndex, e);\n }\n\n handleDragEnd(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDragEnd } = this.props;\n onDragEnd(itemIndex, e);\n }\n\n handleDrop(e: React.DragEvent<HTMLDivElement>): void {\n const { itemIndex, onDrop } = this.props;\n onDrop(itemIndex, e);\n }\n\n handleDoubleClick(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onDoubleClick } = this.props;\n onDoubleClick(itemIndex, e);\n }\n\n handleMouseMove(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onMouseMove } = this.props;\n onMouseMove(itemIndex, e);\n }\n\n handleMouseDown(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onMouseDown } = this.props;\n onMouseDown(itemIndex, e);\n }\n\n handleMouseUp(e: React.MouseEvent<HTMLDivElement>): void {\n const { itemIndex, onMouseUp } = this.props;\n onMouseUp(itemIndex, e);\n }\n\n render(): JSX.Element {\n const {\n isDraggable,\n isFocused,\n isSelected,\n style,\n children,\n 'data-testid': dataTestId,\n } = this.props;\n return (\n <div\n className={classNames(\n 'item-list-item',\n { active: isSelected },\n { 'is-focused': isFocused },\n { 'is-draggable': isDraggable }\n )}\n onKeyDown={ItemListItem.handleKeyDown}\n onContextMenuCapture={this.handleContextMenu}\n onClick={this.handleClick}\n onDrag={this.handleDrag}\n onDragStart={this.handleDragStart}\n onDragOver={this.handleDragOver}\n onDragEnd={this.handleDragEnd}\n onDrop={this.handleDrop}\n onDoubleClick={this.handleDoubleClick}\n onMouseDown={this.handleMouseDown}\n onMouseMove={this.handleMouseMove}\n onMouseUp={this.handleMouseUp}\n tabIndex={-1}\n ref={this.itemRef}\n role=\"listitem\"\n style={style}\n onFocus={this.handleFocus}\n onBlur={this.handleBlur}\n draggable={isDraggable}\n data-testid={dataTestId}\n >\n {children}\n </div>\n );\n }\n}\n\nexport default ItemListItem;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LoadingOverlay.js","names":["React","CSSTransition","classNames","FontAwesomeIcon","vsWarning","ThemeExport","LoadingSpinner","LoadingOverlay","isLoaded","isLoading","errorMessage","dataTestId","messageTestId","undefined","spinnerTestId","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 */\nfunction LoadingOverlay({\n isLoaded = false,\n isLoading = true,\n errorMessage = null,\n 'data-testid': dataTestId,\n}: LoadingOverlayProps): JSX.Element {\n const messageTestId =\n dataTestId != null ? `${dataTestId}-message` : undefined;\n const spinnerTestId =\n dataTestId != null ? `${dataTestId}-spinner` : undefined;\n\n return (\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 && (\n <LoadingSpinner\n className=\"loading-spinner-large\"\n data-testid={spinnerTestId}\n />\n )}\n {!isLoading && errorMessage != null && (\n <FontAwesomeIcon icon={vsWarning} />\n )}\n </div>\n {errorMessage != null && (\n <div className=\"message-text\" data-testid={messageTestId}>\n {errorMessage}\n </div>\n )}\n </div>\n </div>\n </div>\n </CSSTransition>\n );\n}\n\nexport default LoadingOverlay;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,aAAa,QAAQ,wBAAwB;AACtD,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,kBAAkB;AAAC,OACtCC,WAAW;AAAA,OACXC,cAAc;AAAA;AAAA;AAAA;AAUrB;AACA;AACA;AACA,SAASC,cAAc,OAKc;EAAA,IALb;IACtBC,QAAQ,GAAG,KAAK;IAChBC,SAAS,GAAG,IAAI;IAChBC,YAAY,GAAG,IAAI;IACnB,aAAa,EAAEC;EACI,CAAC;EACpB,IAAMC,aAAa,GACjBD,UAAU,IAAI,IAAI,aAAMA,UAAU,gBAAaE,SAAS;EAC1D,IAAMC,aAAa,GACjBH,UAAU,IAAI,IAAI,aAAMA,UAAU,gBAAaE,SAAS;EAE1D,oBACE,KAAC,aAAa;IACZ,EAAE,EAAEE,OAAO,CAACL,YAAY,CAAC,IAAI,CAACF,QAAQ,IAAIC,SAAU;IACpD,OAAO,EAAEJ,WAAW,CAACW,YAAa;IAClC,UAAU,EAAER,QAAQ,GAAG,MAAM,GAAG,EAAG;IACnC,YAAY;IACZ,aAAa;IAAA,uBAEb;MAAK,SAAS,EAAC,sBAAsB;MAAC,eAAaG,UAAW;MAAA,uBAC5D;QACE,SAAS,EAAET,UAAU,CACnB,4BAA4B,EAC5B,sBAAsB,EACtB;UAAE,6BAA6B,EAAEM;QAAS,CAAC,CAC3C;QAAA,uBAEF;UAAK,SAAS,EAAC,iBAAiB;UAAA,wBAC9B;YAAK,SAAS,EAAC,cAAc;YAAA,WAC1BC,SAAS,iBACR,KAAC,cAAc;cACb,SAAS,EAAC,uBAAuB;cACjC,eAAaK;YAAc,EAE9B,EACA,CAACL,SAAS,IAAIC,YAAY,IAAI,IAAI,iBACjC,KAAC,eAAe;cAAC,IAAI,EAAEN;YAAU,EAClC;UAAA,EACG,EACLM,YAAY,IAAI,IAAI,iBACnB;YAAK,SAAS,EAAC,cAAc;YAAC,eAAaE,aAAc;YAAA,UACtDF;UAAY,EAEhB;QAAA;MACG;IACF;EACF,EACQ;AAEpB;AAEA,eAAeH,cAAc"}
1
+ {"version":3,"file":"LoadingOverlay.js","names":["React","CSSTransition","classNames","FontAwesomeIcon","vsWarning","ThemeExport","LoadingSpinner","jsx","_jsx","jsxs","_jsxs","LoadingOverlay","_ref","isLoaded","isLoading","errorMessage","dataTestId","messageTestId","concat","undefined","spinnerTestId","in","Boolean","timeout","transitionMs","mountOnEnter","unmountOnExit","children","className","icon"],"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 */\nfunction LoadingOverlay({\n isLoaded = false,\n isLoading = true,\n errorMessage = null,\n 'data-testid': dataTestId,\n}: LoadingOverlayProps): JSX.Element {\n const messageTestId =\n dataTestId != null ? `${dataTestId}-message` : undefined;\n const spinnerTestId =\n dataTestId != null ? `${dataTestId}-spinner` : undefined;\n\n return (\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 && (\n <LoadingSpinner\n className=\"loading-spinner-large\"\n data-testid={spinnerTestId}\n />\n )}\n {!isLoading && errorMessage != null && (\n <FontAwesomeIcon icon={vsWarning} />\n )}\n </div>\n {errorMessage != null && (\n <div className=\"message-text\" data-testid={messageTestId}>\n {errorMessage}\n </div>\n )}\n </div>\n </div>\n </div>\n </CSSTransition>\n );\n}\n\nexport default LoadingOverlay;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,aAAa,QAAQ,wBAAwB;AACtD,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,kBAAkB;AAAC,OACtCC,WAAW;AAAA,OACXC,cAAc;AAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAUrB;AACA;AACA;AACA,SAASC,cAAcA,CAAAC,IAAA,EAKc;EAAA,IALb;IACtBC,QAAQ,GAAG,KAAK;IAChBC,SAAS,GAAG,IAAI;IAChBC,YAAY,GAAG,IAAI;IACnB,aAAa,EAAEC;EACI,CAAC,GAAAJ,IAAA;EACpB,IAAMK,aAAa,GACjBD,UAAU,IAAI,IAAI,MAAAE,MAAA,CAAMF,UAAU,gBAAaG,SAAS;EAC1D,IAAMC,aAAa,GACjBJ,UAAU,IAAI,IAAI,MAAAE,MAAA,CAAMF,UAAU,gBAAaG,SAAS;EAE1D,oBACEX,IAAA,CAACP,aAAa;IACZoB,EAAE,EAAEC,OAAO,CAACP,YAAY,CAAC,IAAI,CAACF,QAAQ,IAAIC,SAAU;IACpDS,OAAO,EAAElB,WAAW,CAACmB,YAAa;IAClCtB,UAAU,EAAEW,QAAQ,GAAG,MAAM,GAAG,EAAG;IACnCY,YAAY;IACZC,aAAa;IAAAC,QAAA,eAEbnB,IAAA;MAAKoB,SAAS,EAAC,sBAAsB;MAAC,eAAaZ,UAAW;MAAAW,QAAA,eAC5DnB,IAAA;QACEoB,SAAS,EAAE1B,UAAU,CACnB,4BAA4B,EAC5B,sBAAsB,EACtB;UAAE,6BAA6B,EAAEW;QAAS,CAC5C,CAAE;QAAAc,QAAA,eAEFjB,KAAA;UAAKkB,SAAS,EAAC,iBAAiB;UAAAD,QAAA,gBAC9BjB,KAAA;YAAKkB,SAAS,EAAC,cAAc;YAAAD,QAAA,GAC1Bb,SAAS,iBACRN,IAAA,CAACF,cAAc;cACbsB,SAAS,EAAC,uBAAuB;cACjC,eAAaR;YAAc,CAC5B,CACF,EACA,CAACN,SAAS,IAAIC,YAAY,IAAI,IAAI,iBACjCP,IAAA,CAACL,eAAe;cAAC0B,IAAI,EAAEzB;YAAU,CAAE,CACpC;UAAA,CACE,CAAC,EACLW,YAAY,IAAI,IAAI,iBACnBP,IAAA;YAAKoB,SAAS,EAAC,cAAc;YAAC,eAAaX,aAAc;YAAAU,QAAA,EACtDZ;UAAY,CACV,CACN;QAAA,CACE;MAAC,CACH;IAAC,CACH;EAAC,CACO,CAAC;AAEpB;AAEA,eAAeJ,cAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"LoadingSpinner.js","names":["useLayoutEffect","classNames","DOMUtils","LoadingSpinner","className","dataTestId","syncAnimationStartTime"],"sources":["../src/LoadingSpinner.tsx"],"sourcesContent":["import { useLayoutEffect } from 'react';\nimport classNames from 'classnames';\nimport { DOMUtils } from '@deephaven/utils';\nimport './LoadingSpinner.scss';\n\ntype LoadingSpinnerProps = {\n className?: string;\n 'data-testid'?: string;\n};\n\nfunction LoadingSpinner({\n className = '',\n 'data-testid': dataTestId,\n}: LoadingSpinnerProps): JSX.Element {\n useLayoutEffect(() => {\n // Ensure all of our loading spinner animations are synchronized based\n // on same start time.\n DOMUtils.syncAnimationStartTime('loading-spinner-rotate', 0);\n }, []);\n\n return (\n <div\n className={classNames('loading-spinner', className)}\n aria-label=\"Loading...\"\n aria-valuemin={0}\n aria-valuemax={100}\n data-testid={dataTestId}\n role=\"progressbar\"\n />\n );\n}\n\nexport default LoadingSpinner;\n"],"mappings":"AAAA,SAASA,eAAe,QAAQ,OAAO;AACvC,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,QAAQ,QAAQ,kBAAkB;AAAC;AAAA;AAQ5C,SAASC,cAAc,OAGc;EAAA,IAHb;IACtBC,SAAS,GAAG,EAAE;IACd,aAAa,EAAEC;EACI,CAAC;EACpBL,eAAe,CAAC,MAAM;IACpB;IACA;IACAE,QAAQ,CAACI,sBAAsB,CAAC,wBAAwB,EAAE,CAAC,CAAC;EAC9D,CAAC,EAAE,EAAE,CAAC;EAEN,oBACE;IACE,SAAS,EAAEL,UAAU,CAAC,iBAAiB,EAAEG,SAAS,CAAE;IACpD,cAAW,YAAY;IACvB,iBAAe,CAAE;IACjB,iBAAe,GAAI;IACnB,eAAaC,UAAW;IACxB,IAAI,EAAC;EAAa,EAClB;AAEN;AAEA,eAAeF,cAAc"}
1
+ {"version":3,"file":"LoadingSpinner.js","names":["useLayoutEffect","classNames","DOMUtils","jsx","_jsx","LoadingSpinner","_ref","className","dataTestId","syncAnimationStartTime","role"],"sources":["../src/LoadingSpinner.tsx"],"sourcesContent":["import { useLayoutEffect } from 'react';\nimport classNames from 'classnames';\nimport { DOMUtils } from '@deephaven/utils';\nimport './LoadingSpinner.scss';\n\ntype LoadingSpinnerProps = {\n className?: string;\n 'data-testid'?: string;\n};\n\nfunction LoadingSpinner({\n className = '',\n 'data-testid': dataTestId,\n}: LoadingSpinnerProps): JSX.Element {\n useLayoutEffect(() => {\n // Ensure all of our loading spinner animations are synchronized based\n // on same start time.\n DOMUtils.syncAnimationStartTime('loading-spinner-rotate', 0);\n }, []);\n\n return (\n <div\n className={classNames('loading-spinner', className)}\n aria-label=\"Loading...\"\n aria-valuemin={0}\n aria-valuemax={100}\n data-testid={dataTestId}\n role=\"progressbar\"\n />\n );\n}\n\nexport default LoadingSpinner;\n"],"mappings":"AAAA,SAASA,eAAe,QAAQ,OAAO;AACvC,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,QAAQ,QAAQ,kBAAkB;AAAC;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAQ5C,SAASC,cAAcA,CAAAC,IAAA,EAGc;EAAA,IAHb;IACtBC,SAAS,GAAG,EAAE;IACd,aAAa,EAAEC;EACI,CAAC,GAAAF,IAAA;EACpBN,eAAe,CAAC,MAAM;IACpB;IACA;IACAE,QAAQ,CAACO,sBAAsB,CAAC,wBAAwB,EAAE,CAAC,CAAC;EAC9D,CAAC,EAAE,EAAE,CAAC;EAEN,oBACEL,IAAA;IACEG,SAAS,EAAEN,UAAU,CAAC,iBAAiB,EAAEM,SAAS,CAAE;IACpD,cAAW,YAAY;IACvB,iBAAe,CAAE;IACjB,iBAAe,GAAI;IACnB,eAAaC,UAAW;IACxBE,IAAI,EAAC;EAAa,CACnB,CAAC;AAEN;AAEA,eAAeL,cAAc"}