@deephaven/components 0.94.0 → 0.95.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 (211) hide show
  1. package/dist/AutoCompleteInput.d.ts +1 -1
  2. package/dist/AutoCompleteInput.d.ts.map +1 -1
  3. package/dist/AutoCompleteInput.js.map +1 -1
  4. package/dist/Button.d.ts +1 -1
  5. package/dist/Button.d.ts.map +1 -1
  6. package/dist/Button.js.map +1 -1
  7. package/dist/CardFlip.d.ts.map +1 -1
  8. package/dist/CardFlip.js.map +1 -1
  9. package/dist/ComponentUtils.d.ts +2 -1
  10. package/dist/ComponentUtils.d.ts.map +1 -1
  11. package/dist/ComponentUtils.js.map +1 -1
  12. package/dist/CopyButton.d.ts +1 -1
  13. package/dist/CopyButton.d.ts.map +1 -1
  14. package/dist/CopyButton.js.map +1 -1
  15. package/dist/CustomTimeSelect.d.ts +3 -3
  16. package/dist/CustomTimeSelect.d.ts.map +1 -1
  17. package/dist/CustomTimeSelect.js.map +1 -1
  18. package/dist/DateInput.js.map +1 -1
  19. package/dist/DateInputUtils.d.ts +1 -1
  20. package/dist/DateInputUtils.d.ts.map +1 -1
  21. package/dist/DateInputUtils.js.map +1 -1
  22. package/dist/DateTimeInput.d.ts +1 -1
  23. package/dist/DateTimeInput.d.ts.map +1 -1
  24. package/dist/DateTimeInput.js.map +1 -1
  25. package/dist/DraggableItemList.d.ts +3 -3
  26. package/dist/DraggableItemList.d.ts.map +1 -1
  27. package/dist/DraggableItemList.js.map +1 -1
  28. package/dist/EditableItemList.js.map +1 -1
  29. package/dist/ErrorBoundary.d.ts +1 -1
  30. package/dist/ErrorBoundary.d.ts.map +1 -1
  31. package/dist/ErrorBoundary.js.map +1 -1
  32. package/dist/HierarchicalCheckboxMenu.d.ts +1 -1
  33. package/dist/HierarchicalCheckboxMenu.d.ts.map +1 -1
  34. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  35. package/dist/ItemList.d.ts +3 -3
  36. package/dist/ItemList.d.ts.map +1 -1
  37. package/dist/ItemList.js.map +1 -1
  38. package/dist/MaskedInput.d.ts +1 -1
  39. package/dist/MaskedInput.d.ts.map +1 -1
  40. package/dist/MaskedInput.js.map +1 -1
  41. package/dist/Option.d.ts +1 -1
  42. package/dist/Option.d.ts.map +1 -1
  43. package/dist/Option.js.map +1 -1
  44. package/dist/SearchableCombobox.d.ts +2 -2
  45. package/dist/SearchableCombobox.d.ts.map +1 -1
  46. package/dist/SearchableCombobox.js.map +1 -1
  47. package/dist/TextWithTooltip.d.ts +1 -1
  48. package/dist/TextWithTooltip.d.ts.map +1 -1
  49. package/dist/TextWithTooltip.js.map +1 -1
  50. package/dist/TimeInput.d.ts +1 -1
  51. package/dist/TimeInput.d.ts.map +1 -1
  52. package/dist/TimeInput.js.map +1 -1
  53. package/dist/TimeSlider.d.ts.map +1 -1
  54. package/dist/TimeSlider.js.map +1 -1
  55. package/dist/XComponent.d.ts +1 -1
  56. package/dist/XComponent.d.ts.map +1 -1
  57. package/dist/XComponent.js.map +1 -1
  58. package/dist/actions/ConfirmActionButton.d.ts +1 -1
  59. package/dist/actions/ConfirmActionButton.d.ts.map +1 -1
  60. package/dist/actions/ConfirmActionButton.js.map +1 -1
  61. package/dist/actions/IconActionButton.d.ts +1 -1
  62. package/dist/actions/IconActionButton.d.ts.map +1 -1
  63. package/dist/actions/IconActionButton.js.map +1 -1
  64. package/dist/context-actions/ContextActionUtils.d.ts +3 -3
  65. package/dist/context-actions/ContextActionUtils.d.ts.map +1 -1
  66. package/dist/context-actions/ContextActionUtils.js.map +1 -1
  67. package/dist/context-actions/ContextActions.d.ts +1 -1
  68. package/dist/context-actions/ContextActions.d.ts.map +1 -1
  69. package/dist/context-actions/ContextActions.js.map +1 -1
  70. package/dist/context-actions/ContextMenu.d.ts +2 -2
  71. package/dist/context-actions/ContextMenu.d.ts.map +1 -1
  72. package/dist/context-actions/ContextMenu.js.map +1 -1
  73. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  74. package/dist/context-actions/ContextMenuRoot.d.ts +1 -1
  75. package/dist/context-actions/ContextMenuRoot.d.ts.map +1 -1
  76. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  77. package/dist/dialogs/ActionButtonDialogTrigger.d.ts +1 -1
  78. package/dist/dialogs/ActionButtonDialogTrigger.d.ts.map +1 -1
  79. package/dist/dialogs/ActionButtonDialogTrigger.js.map +1 -1
  80. package/dist/dialogs/ConfirmationDialog.d.ts +1 -1
  81. package/dist/dialogs/ConfirmationDialog.d.ts.map +1 -1
  82. package/dist/dialogs/ConfirmationDialog.js.map +1 -1
  83. package/dist/menu-actions/DropdownMenu.d.ts +3 -3
  84. package/dist/menu-actions/DropdownMenu.d.ts.map +1 -1
  85. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  86. package/dist/menu-actions/Menu.d.ts +1 -1
  87. package/dist/menu-actions/Menu.d.ts.map +1 -1
  88. package/dist/menu-actions/Menu.js.map +1 -1
  89. package/dist/modal/InfoModal.d.ts +1 -1
  90. package/dist/modal/InfoModal.d.ts.map +1 -1
  91. package/dist/modal/InfoModal.js.map +1 -1
  92. package/dist/modal/Modal.d.ts +1 -1
  93. package/dist/modal/Modal.d.ts.map +1 -1
  94. package/dist/modal/Modal.js.map +1 -1
  95. package/dist/modal/ModalBody.d.ts +1 -1
  96. package/dist/modal/ModalBody.d.ts.map +1 -1
  97. package/dist/modal/ModalBody.js.map +1 -1
  98. package/dist/modal/ModalFooter.d.ts +1 -1
  99. package/dist/modal/ModalFooter.d.ts.map +1 -1
  100. package/dist/modal/ModalFooter.js.map +1 -1
  101. package/dist/modal/ModalHeader.d.ts +1 -1
  102. package/dist/modal/ModalHeader.d.ts.map +1 -1
  103. package/dist/modal/ModalHeader.js.map +1 -1
  104. package/dist/navigation/Menu.d.ts +1 -1
  105. package/dist/navigation/Menu.d.ts.map +1 -1
  106. package/dist/navigation/Menu.js.map +1 -1
  107. package/dist/navigation/MenuItem.d.ts +1 -1
  108. package/dist/navigation/MenuItem.d.ts.map +1 -1
  109. package/dist/navigation/MenuItem.js.map +1 -1
  110. package/dist/navigation/NavTab.d.ts +1 -1
  111. package/dist/navigation/NavTab.d.ts.map +1 -1
  112. package/dist/navigation/NavTab.js.map +1 -1
  113. package/dist/navigation/NavTabList.d.ts +2 -2
  114. package/dist/navigation/NavTabList.d.ts.map +1 -1
  115. package/dist/navigation/NavTabList.js.map +1 -1
  116. package/dist/popper/Popper.d.ts +1 -1
  117. package/dist/popper/Popper.d.ts.map +1 -1
  118. package/dist/popper/Popper.js.map +1 -1
  119. package/dist/popper/Tooltip.d.ts +1 -1
  120. package/dist/popper/Tooltip.d.ts.map +1 -1
  121. package/dist/popper/Tooltip.js.map +1 -1
  122. package/dist/shortcuts/Shortcut.d.ts +2 -2
  123. package/dist/shortcuts/Shortcut.d.ts.map +1 -1
  124. package/dist/shortcuts/Shortcut.js.map +1 -1
  125. package/dist/shortcuts/ShortcutRegistry.d.ts +2 -2
  126. package/dist/shortcuts/ShortcutRegistry.d.ts.map +1 -1
  127. package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
  128. package/dist/spectrum/ActionGroup.d.ts +3 -3
  129. package/dist/spectrum/ActionGroup.d.ts.map +1 -1
  130. package/dist/spectrum/ActionGroup.js.map +1 -1
  131. package/dist/spectrum/ActionMenu.d.ts +3 -3
  132. package/dist/spectrum/ActionMenu.d.ts.map +1 -1
  133. package/dist/spectrum/ActionMenu.js.map +1 -1
  134. package/dist/spectrum/ItemContent.d.ts +2 -2
  135. package/dist/spectrum/ItemContent.d.ts.map +1 -1
  136. package/dist/spectrum/ItemContent.js.map +1 -1
  137. package/dist/spectrum/ItemTooltip.d.ts +2 -2
  138. package/dist/spectrum/ItemTooltip.d.ts.map +1 -1
  139. package/dist/spectrum/ItemTooltip.js.map +1 -1
  140. package/dist/spectrum/ListActionGroup.d.ts +2 -2
  141. package/dist/spectrum/ListActionGroup.d.ts.map +1 -1
  142. package/dist/spectrum/ListActionGroup.js.map +1 -1
  143. package/dist/spectrum/ListActionMenu.d.ts +2 -2
  144. package/dist/spectrum/ListActionMenu.d.ts.map +1 -1
  145. package/dist/spectrum/ListActionMenu.js.map +1 -1
  146. package/dist/spectrum/View.js.map +1 -1
  147. package/dist/spectrum/comboBox/ComboBox.d.ts +2 -2
  148. package/dist/spectrum/comboBox/ComboBox.d.ts.map +1 -1
  149. package/dist/spectrum/comboBox/ComboBox.js.map +1 -1
  150. package/dist/spectrum/comboBox/ComboBoxNormalized.d.ts +2 -2
  151. package/dist/spectrum/comboBox/ComboBoxNormalized.d.ts.map +1 -1
  152. package/dist/spectrum/comboBox/ComboBoxNormalized.js.map +1 -1
  153. package/dist/spectrum/dateAndTime.d.ts +1 -1
  154. package/dist/spectrum/dateAndTime.d.ts.map +1 -1
  155. package/dist/spectrum/dateAndTime.js.map +1 -1
  156. package/dist/spectrum/listView/ListView.d.ts +3 -3
  157. package/dist/spectrum/listView/ListView.d.ts.map +1 -1
  158. package/dist/spectrum/listView/ListView.js.map +1 -1
  159. package/dist/spectrum/listView/ListViewNormalized.d.ts +1 -1
  160. package/dist/spectrum/listView/ListViewNormalized.d.ts.map +1 -1
  161. package/dist/spectrum/listView/ListViewNormalized.js.map +1 -1
  162. package/dist/spectrum/listView/ListViewWrapper.d.ts +1 -1
  163. package/dist/spectrum/listView/ListViewWrapper.d.ts.map +1 -1
  164. package/dist/spectrum/listView/ListViewWrapper.js.map +1 -1
  165. package/dist/spectrum/picker/Picker.d.ts +1 -1
  166. package/dist/spectrum/picker/Picker.d.ts.map +1 -1
  167. package/dist/spectrum/picker/Picker.js.map +1 -1
  168. package/dist/spectrum/picker/usePickerNormalizedProps.d.ts +3 -3
  169. package/dist/spectrum/picker/usePickerNormalizedProps.d.ts.map +1 -1
  170. package/dist/spectrum/picker/usePickerNormalizedProps.js.map +1 -1
  171. package/dist/spectrum/picker/usePickerProps.d.ts +2 -2
  172. package/dist/spectrum/picker/usePickerProps.d.ts.map +1 -1
  173. package/dist/spectrum/picker/usePickerProps.js.map +1 -1
  174. package/dist/spectrum/utils/itemUtils.d.ts +4 -4
  175. package/dist/spectrum/utils/itemUtils.d.ts.map +1 -1
  176. package/dist/spectrum/utils/itemUtils.js.map +1 -1
  177. package/dist/spectrum/utils/itemWrapperUtils.d.ts +2 -2
  178. package/dist/spectrum/utils/itemWrapperUtils.d.ts.map +1 -1
  179. package/dist/spectrum/utils/itemWrapperUtils.js.map +1 -1
  180. package/dist/spectrum/utils/useOnChangeTrackUncontrolled.d.ts +1 -1
  181. package/dist/spectrum/utils/useOnChangeTrackUncontrolled.d.ts.map +1 -1
  182. package/dist/spectrum/utils/useOnChangeTrackUncontrolled.js.map +1 -1
  183. package/dist/spectrum/utils/useRenderNormalizedItem.d.ts +4 -4
  184. package/dist/spectrum/utils/useRenderNormalizedItem.d.ts.map +1 -1
  185. package/dist/spectrum/utils/useRenderNormalizedItem.js.map +1 -1
  186. package/dist/spectrum/utils/useStaticItemInitialScrollPosition.d.ts +1 -1
  187. package/dist/spectrum/utils/useStaticItemInitialScrollPosition.d.ts.map +1 -1
  188. package/dist/spectrum/utils/useStaticItemInitialScrollPosition.js.map +1 -1
  189. package/dist/spectrum/utils/useStringifiedMultiSelection.d.ts +2 -2
  190. package/dist/spectrum/utils/useStringifiedMultiSelection.d.ts.map +1 -1
  191. package/dist/spectrum/utils/useStringifiedMultiSelection.js.map +1 -1
  192. package/dist/spectrum/utils/useStringifiedSelection.d.ts +2 -2
  193. package/dist/spectrum/utils/useStringifiedSelection.d.ts.map +1 -1
  194. package/dist/spectrum/utils/useStringifiedSelection.js.map +1 -1
  195. package/dist/theme/SpectrumThemeProvider.d.ts +1 -1
  196. package/dist/theme/SpectrumThemeProvider.d.ts.map +1 -1
  197. package/dist/theme/SpectrumThemeProvider.js.map +1 -1
  198. package/dist/theme/ThemePicker.js.map +1 -1
  199. package/dist/theme/ThemeProvider.d.ts +2 -2
  200. package/dist/theme/ThemeProvider.d.ts.map +1 -1
  201. package/dist/theme/ThemeProvider.js.map +1 -1
  202. package/dist/theme/ThemeUtils.d.ts +1 -1
  203. package/dist/theme/ThemeUtils.d.ts.map +1 -1
  204. package/dist/theme/ThemeUtils.js.map +1 -1
  205. package/dist/theme/colorUtils.d.ts +1 -1
  206. package/dist/theme/colorUtils.d.ts.map +1 -1
  207. package/dist/theme/colorUtils.js.map +1 -1
  208. package/dist/theme/useTheme.d.ts +1 -1
  209. package/dist/theme/useTheme.d.ts.map +1 -1
  210. package/dist/theme/useTheme.js.map +1 -1
  211. package/package.json +8 -8
@@ -1 +1 @@
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":";;;;;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,SAAAC,GAAA,IAAAC,IAAA;AAG3B,IAAMC,GAAG,GAAGN,GAAG,CAACO,MAAM,CAAC,UAAU,CAAC;AAClC,IAAMC,cAAc,GAAG,CAAC;AAuExB;AACA;AACA;AACA;AACA,OAAO,MAAMC,QAAQ,SAAYd,aAAa,CAG5C;EAKA;;EA2CA,OAAOe,UAAUA,CAAAC,IAAA,EAEmB;IAAA,IAAAC,KAAA,EAAAC,kBAAA;IAAA,IAFS;MAC3CC;IACkB,CAAC,GAAAH,IAAA;IACnB,oBACEN,IAAA;MAAKU,SAAS,EAAC,wBAAwB;MAAAC,QAAA,EACpCF,IAAI,IAAI,IAAI,MAAAF,KAAA,IAAAC,kBAAA,GAAKC,IAAI,CAACG,YAAY,cAAAJ,kBAAA,cAAAA,kBAAA,GAAIC,IAAI,CAACI,KAAK,cAAAN,KAAA,cAAAA,KAAA,MAAAO,MAAA,CAAOL,IAAI;IAAG,CAC5D,CAAC;EAEV;EAEAM,WAAWA,CAACC,MAAuB,EAAE;IACnC,KAAK,CAACA,MAAK,CAAC;IAACC,eAAA;IAAAA,eAAA;IAAAA,eAAA,0BAmFG1B,OAAO,CACvB,CAAC2B,KAAa,EAAEC,cAAgC,KAC9CvB,UAAU,CAACwB,UAAU,CAACD,cAAc,EAAED,KAAK,CAAC,EAC9C;MAAEG,GAAG,EAAEjB,QAAQ,CAACkB;IAAW,CAC7B,CAAC;IAAAL,eAAA,wBAEe1B,OAAO,CACrB,CACEgC,SAAiB,EACjBC,GAAW,EACXf,IAAO,EACPgB,SAAkB,EAClBL,UAAmB,EACnBf,UAA2B,EAC3BqB,KAA0B,EAC1BC,aAAsB,KACnB;MACH,IAAMC,OAAO,GAAGvB,UAAU,CAAC;QACzBI,IAAI;QACJc,SAAS;QACTE,SAAS;QACTL,UAAU;QACVM;MACF,CAAC,CAAC;MAEF,oBACE1B,IAAA,CAACH,YAAY;QACXgC,aAAa,EAAE,IAAI,CAACC,qBAAsB;QAC1CC,aAAa,EAAE,IAAI,CAACC,qBAAsB;QAC1CC,WAAW,EAAE,IAAI,CAACC,mBAAoB;QACtCC,OAAO,EAAE,IAAI,CAACC,eAAgB;QAC9BC,MAAM,EAAE,IAAI,CAACC,cAAe;QAC5BX,aAAa,EAAEA,aAAc;QAC7BY,WAAW,EAAE,IAAI,CAACC,mBAAoB;QACtCC,SAAS,EAAE,IAAI,CAACC,iBAAkB;QAClCjB,SAAS,EAAEA,SAAU;QACrBL,UAAU,EAAEA,UAAW;QACvBG,SAAS,EAAEA,SAAU;QACrBG,KAAK,EAAEA,KAAM;QAAAf,QAAA,EAGZiB;MAAO,GAFHJ,GAGO,CAAC;IAEnB,CAAC,EACD;MAAEH,GAAG,EAAEjB,QAAQ,CAACkB;IAAW,CAC7B,CAAC;IAAAL,eAAA,0BAEiB1B,OAAO,CAAEoD,SAAqC,IAAK;MACnE,IAAMC,SAAS,gBAAGvD,KAAK,CAACwD,UAAU,CAAiB,CAAC7B,KAAK,EAAE8B,GAAG;MAAA;MAC5D;MACA9C,IAAA,QAAA+C,aAAA;QACED,GAAG,EAAEA,GAAI;QACTE,QAAQ,EAAE,CAAC,CAAE;QACbL,SAAS,EAAEA,SAAU;QACrBM,IAAI,EAAC;QACL;MAAA,GACIjC,KAAK,CACV,CACF,CAAC;MACF4B,SAAS,CAACM,WAAW,GAAG,sBAAsB;MAC9C,OAAON,SAAS;IAClB,CAAC,CAAC;IAAA3B,eAAA,0BAEgB1B,OAAO,CAAC,MAAM;MAC9B,IAAMqD,SAAS,gBAAGvD,KAAK,CAACwD,UAAU,CAAiB,CAAC7B,KAAK,EAAE8B,GAAG,kBAC5D9C,IAAA,QAAA+C,aAAA;QACErC,SAAS,EAAC,yBAAyB;QACnCoC,GAAG,EAAEA;QACL;MAAA,GACI9B,KAAK,CACV,CACF,CAAC;MACF4B,SAAS,CAACM,WAAW,GAAG,sBAAsB;MAC9C,OAAON,SAAS;IAClB,CAAC,CAAC;IAAA3B,eAAA,sBAEY1B,OAAO,CACnB,CACE4D,KAAmB,EACnBhC,cAAgC,EAChCd,UAA2B,MACvB;MACJ8C,KAAK;MACLhC,cAAc;MACdd;IACF,CAAC,CACH,CAAC;IAxKC,IAAI,CAACiC,cAAc,GAAG,IAAI,CAACA,cAAc,CAACc,IAAI,CAAC,IAAI,CAAC;IACpD,IAAI,CAACtB,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACsB,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAChB,eAAe,GAAG,IAAI,CAACA,eAAe,CAACgB,IAAI,CAAC,IAAI,CAAC;IACtD,IAAI,CAACpB,qBAAqB,GAAG,IAAI,CAACA,qBAAqB,CAACoB,IAAI,CAAC,IAAI,CAAC;IAClE,IAAI,CAAClB,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACkB,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACZ,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACY,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACV,iBAAiB,GAAG,IAAI,CAACA,iBAAiB,CAACU,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,gBAAGvE,KAAK,CAACwE,SAAS,CAAC,CAAC;IAC7B,IAAI,CAACC,aAAa,gBAAGzE,KAAK,CAACwE,SAAS,CAAC,CAAC;IAEtC,IAAM;MAAEE,cAAc;MAAE5C,cAAc,EAAdA;IAAe,CAAC,GAAGH,MAAK;IAEhD,IAAI,CAACgD,KAAK,GAAG;MACXC,UAAU,EAAE,IAAI;MAChBC,cAAc,EAAE,IAAI;MACpB/C,cAAc,EAAdA,eAAc;MACdgD,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,kBAAkBA,CAChBC,SAA2B,EAC3BC,SAAwB,EAClB;IACN,IAAM;MAAEzD,cAAc,EAAE0D,kBAAkB;MAAEC;IAAU,CAAC,GAAG,IAAI,CAAC9D,KAAK;IACpE,IAAM;MACJiD,UAAU;MACVK,eAAe;MACfC,YAAY;MACZH,MAAM;MACNjD;IACF,CAAC,GAAG,IAAI,CAAC6C,KAAK;IACd,IAAIM,eAAe,IAAI,CAAC,IAAI,CAACS,cAAc,CAAC,CAAC,IAAID,SAAS,GAAG,CAAC,EAAE;MAC9D,IAAI,CAACE,cAAc,CAAC,CAAC;IACvB;IAEA,IACET,YAAY,KAAKK,SAAS,CAACL,YAAY,IACvCH,MAAM,KAAKQ,SAAS,CAACR,MAAM,EAC3B;MACA,IAAI,CAACa,kBAAkB,CAAC,CAAC;IAC3B;IAEA,IACEJ,kBAAkB,KAAKF,SAAS,CAACxD,cAAc,IAC/C0D,kBAAkB,KAAK1D,cAAc,EACrC;MACA,IAAI,CAAC+D,iBAAiB,CAACL,kBAAkB,CAAC;IAC5C,CAAC,MAAM,IAAI1D,cAAc,KAAKyD,SAAS,CAACzD,cAAc,EAAE;MACtD,IAAM;QAAEgE;MAAkB,CAAC,GAAG,IAAI,CAACnE,KAAK;MACxCmE,iBAAiB,CAAChE,cAAc,CAAC;IACnC;IAEA,IAAI8C,UAAU,KAAKW,SAAS,CAACX,UAAU,EAAE;MACvC,IAAM;QAAEmB;MAAc,CAAC,GAAG,IAAI,CAACpE,KAAK;MACpCoE,aAAa,CAACnB,UAAU,CAAC;IAC3B;EACF;EAEAoB,oBAAoBA,CAAA,EAAS;IAC3BC,MAAM,CAACC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACjC,mBAAmB,CAAC;EACjE;EA+FAkC,KAAKA,CAAA,EAAS;IAAA,IAAAC,qBAAA;IACZ,CAAAA,qBAAA,OAAI,CAAC3B,aAAa,CAAC4B,OAAO,cAAAD,qBAAA,uBAA1BA,qBAAA,CAA4BD,KAAK,CAAC,CAAC;EACrC;EAEAG,qBAAqBA,CAAA,EAAS;IAC5B,IAAM;MAAEpB;IAAa,CAAC,GAAG,IAAI,CAACP,KAAK;IACnC,IAAIO,YAAY,IAAI,IAAI,EAAE;MAAA,IAAAqB,sBAAA;MACxB;MACA;MACA,CAAAA,sBAAA,OAAI,CAAC9B,aAAa,CAAC4B,OAAO,cAAAE,sBAAA,uBAA1BA,sBAAA,CAA4BC,QAAQ,CAAC,CAAC,EAAEtB,YAAY,CAAC;IACvD;EACF;EAEAuB,UAAUA,CAACvE,SAAiB,EAAkB;IAC5C,IAAI,IAAI,CAACuC,aAAa,CAAC4B,OAAO,IAAI,IAAI,EAAE;MACtC,OAAO,IAAI;IACb;IAEA,IAAM;MAAEK;IAAc,CAAC,GAAG,IAAI,CAAC/E,KAAK;IACpC,IAAM;MAAEmD;IAAmB,CAAC,GAAG,IAAI,CAACH,KAAK;IACzC,IAAMgC,QAAQ,GAAG,IAAI,CAAClC,aAAa,CAAC4B,OAAO,CAACO,gBAAgB,CAACF,aAAa,CAAC;IAC3E,IAAMG,YAAY,GAAG3E,SAAS,GAAG4C,kBAAkB;IACnD,OAAO6B,QAAQ,CAACE,YAAY,CAAC;EAC/B;EAEAC,SAASA,CAAC5E,SAAiB,EAAQ;IACjC,IAAM;MAAEI;IAAc,CAAC,GAAG,IAAI,CAACX,KAAK;IACpC,IAAIW,aAAa,EAAE;IAEnB,IAAI,CAACyE,QAAQ,CAAC;MAAEnC,UAAU,EAAE1C;IAAU,CAAC,CAAC;IAExC,IAAM8E,OAAO,GAAG,IAAI,CAACP,UAAU,CAACvE,SAAS,CAAC;IAC1C,IAAI8E,OAAO,YAAYC,WAAW,EAAE;MAClCD,OAAO,CAACb,KAAK,CAAC,CAAC;IACjB;EACF;EAEAe,YAAYA,CAAChF,SAAiB,EAAQ;IACpC,IAAM8E,OAAO,GAAG,IAAI,CAACP,UAAU,CAACvE,SAAS,CAAC;IAC1C,IAAI8E,OAAO,IAAI,IAAI,EAAE;MACnBA,OAAO,CAACG,cAAc,CAAC;QAAEC,KAAK,EAAE;MAAS,CAAC,CAAC;IAC7C;EACF;EAEA3E,qBAAqBA,CACnBP,SAAiB,EACjBmF,CAAmC,EAC7B;IACN,IAAI,CAACN,QAAQ,CAAC;MAAEnC,UAAU,EAAE1C;IAAU,CAAC,CAAC;;IAExC;IACA,IAAM;MAAEJ;IAAe,CAAC,GAAG,IAAI,CAAC6C,KAAK;IACrC,IAAM5C,UAAU,GAAGxB,UAAU,CAACwB,UAAU,CAACD,cAAc,EAAEI,SAAS,CAAC;;IAEnE;IACA,IAAMoF,cAAc,GAClBvF,UAAU,IAAItB,kBAAkB,CAAC8G,iBAAiB,CAACF,CAAC,CAAC;IACvD,IAAI,CAACG,YAAY,CAACtF,SAAS,EAAEmF,CAAC,CAACI,QAAQ,EAAEH,cAAc,EAAE,KAAK,CAAC;EACjE;EAEA3E,qBAAqBA,CAACT,SAAiB,EAAEmF,CAAmB,EAAQ;IAClE,IAAM;MAAEK,mBAAmB;MAAEC;IAAS,CAAC,GAAG,IAAI,CAAChG,KAAK;IAEpD,IAAI+F,mBAAmB,EAAE;MACvB,IAAI,CAACX,QAAQ,CACXa,KAAA;QAAA,IAAC;UAAE9F;QAAe,CAAC,GAAA8F,KAAA;QAAA,OAAM;UACvB9F,cAAc,EAAEvB,UAAU,CAACsH,WAAW,CAAC/F,cAAc,EAAE,CACrDI,SAAS,EACTA,SAAS,CACV;QACH,CAAC;MAAA,CAAC,EACF,MAAM;QACJyF,QAAQ,CAACzF,SAAS,EAAEmF,CAAC,CAAC;MACxB,CACF,CAAC;IACH;EACF;EAEAxE,mBAAmBA,CAAChB,KAAa,EAAEwF,CAAmB,EAAQ;IAC5D,IAAM;MAAEvF;IAAe,CAAC,GAAG,IAAI,CAAC6C,KAAK;IAErC,IACE0C,CAAC,CAACS,MAAM,YAAYb,WAAW,IAC/B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAACc,OAAO,CAC/CV,CAAC,CAACS,MAAM,CAACE,OAAO,CAACC,WAAW,CAAC,CAC/B,CAAC,KAAK,CAAC,CAAC,EACR;MACA;MACA;IACF;IAEA,IAAIZ,CAAC,CAACa,MAAM,KAAK,CAAC,IAAIpG,cAAc,CAACqG,MAAM,KAAK,CAAC,EAAE;MACjD;MACA,IAAI,CAACrB,SAAS,CAACjF,KAAK,CAAC;MACrB,IAAI,CAACuG,UAAU,CAACvG,KAAK,CAAC;MACtB;IACF;IAEA,IAAIwF,CAAC,CAACa,MAAM,IAAI,IAAI,IAAIb,CAAC,CAACa,MAAM,KAAK,CAAC,EAAE;MACtC;IACF;IAEA,IAAI,CAACnB,QAAQ,CAAC;MACZlC,cAAc,EAAEhD,KAAK;MACrBsD,MAAM,EAAEkC,CAAC,CAACgB,OAAO;MACjBjD,MAAM,EAAEiC,CAAC,CAACiB;IACZ,CAAC,CAAC;IAEFrC,MAAM,CAACsC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAACtE,mBAAmB,CAAC;;IAE5D;EACF;;EAEAhB,cAAcA,CAACf,SAAiB,EAAEmF,CAAmB,EAAQ;IAC3DzG,GAAG,CAAC4H,MAAM,CAAC,WAAW,EAAEtG,SAAS,EAAEmF,CAAC,CAACoB,aAAa,EAAEpB,CAAC,CAACqB,aAAa,CAAC;IACpE,IACE,CAACrB,CAAC,CAACqB,aAAa,IACf,IAAI,CAACjE,aAAa,CAAC4B,OAAO,IACzBgB,CAAC,CAACqB,aAAa,YAAYzB,WAAW,IACtC,CAAC,IAAI,CAACxC,aAAa,CAAC4B,OAAO,CAACsC,QAAQ,CAACtB,CAAC,CAACqB,aAAa,CAAE,EACxD;MACA;MACA,IAAI,CAAC3B,QAAQ,CAAC;QAAEnC,UAAU,EAAE;MAAK,CAAC,CAAC;IACrC;EACF;EAEA7B,eAAeA,CAACb,SAAiB,EAAEmF,CAAmB,EAAQ;IAC5DzG,GAAG,CAAC4H,MAAM,CAAC,YAAY,EAAEtG,SAAS,EAAEmF,CAAC,CAACS,MAAM,CAAC;IAC7C,IAAI,CAACf,QAAQ,CAACpC,KAAK,IAAI;MACrB,IAAM;QAAEC;MAAW,CAAC,GAAGD,KAAK;MAC5B,IAAIC,UAAU,KAAK1C,SAAS,EAAE;QAC5B,OAAO;UAAE0C,UAAU,EAAE1C;QAAU,CAAC;MAClC;MACA,OAAO,IAAI;IACb,CAAC,CAAC;EACJ;EAEAiB,mBAAmBA,CAACjB,SAAiB,EAAEmF,CAAmB,EAAQ;IAChE,IAAM;MAAEuB,YAAY;MAAEC,aAAa;MAAEvG;IAAc,CAAC,GAAG,IAAI,CAACX,KAAK;IACjE,IAAM;MAAEkD,cAAc;MAAE/C,cAAc;MAAEqD,MAAM;MAAEC;IAAO,CAAC,GAAG,IAAI,CAACT,KAAK;IAErE,IAAIE,cAAc,IAAI,IAAI,IAAIvC,aAAa,EAAE;IAE7C,IAAMwG,UAAU,GAAGC,IAAI,CAACC,GAAG,CAAC3B,CAAC,CAACgB,OAAO,IAAIlD,MAAM,aAANA,MAAM,cAANA,MAAM,GAAI,CAAC,CAAC,CAAC;IACtD,IAAM8D,UAAU,GAAGF,IAAI,CAACC,GAAG,CAAC3B,CAAC,CAACiB,OAAO,IAAIlD,MAAM,aAANA,MAAM,cAANA,MAAM,GAAI,CAAC,CAAC,CAAC;IACtD,IAAI0D,UAAU,GAAGhI,cAAc,IAAImI,UAAU,GAAGnI,cAAc,EAAE;MAC9D,IAAI,CAACiG,QAAQ,CAAC;QAAE/B,UAAU,EAAE;MAAK,CAAC,CAAC;IACrC;IACA,IAAI4D,YAAY,IAAI/D,cAAc,KAAK3C,SAAS,EAAE;MAChD,IAAI,CAAC4E,SAAS,CAAC5E,SAAS,CAAC;MAEzB,IAAI2G,aAAa,EAAE;QACjB,IACE,CAACD,YAAY,IACb,CAAC,IAAI,CAACM,eAAe,CAAChH,SAAS,EAAEJ,cAAc,CAAC,IAChD,CAACrB,kBAAkB,CAAC8G,iBAAiB,CAACF,CAAC,CAAC,EACxC;UACA;UACA,IAAI,CAAC8B,WAAW,CAAC,CAAC;QACpB;QACA,IAAI,CAACtB,WAAW,CAAC,CACfkB,IAAI,CAACK,GAAG,CAACvE,cAAc,EAAE3C,SAAS,CAAC,EACnC6G,IAAI,CAAC/G,GAAG,CAAC6C,cAAc,EAAE3C,SAAS,CAAC,CACpC,CAAC;MACJ,CAAC,MAAM;QACL,IAAI,CAACsF,YAAY,CACftF,SAAS,EACTmF,CAAC,CAACI,QAAQ,EACVhH,kBAAkB,CAAC8G,iBAAiB,CAACF,CAAC,CAAC,EACvC,KACF,CAAC;MACH;IACF;EACF;EAEAhE,iBAAiBA,CAACxB,KAAa,EAAEwF,CAAmB,EAAQ;IAC1D,IAAM;MAAEgC,iBAAiB;MAAE3B,mBAAmB;MAAEC;IAAS,CAAC,GAAG,IAAI,CAAChG,KAAK;IACvE,IAAM;MAAEkD,cAAc;MAAEG;IAAW,CAAC,GAAG,IAAI,CAACL,KAAK;IAEjD,IACE0C,CAAC,CAACS,MAAM,YAAYb,WAAW,IAC/B,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAACc,OAAO,CAC/CV,CAAC,CAACS,MAAM,CAACE,OAAO,CAACC,WAAW,CAAC,CAC/B,CAAC,KAAK,CAAC,CAAC,EACR;MACA;IACF;IAEA,IAAIpD,cAAc,KAAKhD,KAAK,IAAI,CAACmD,UAAU,EAAE;MAC3C,IAAMsE,WAAW,GAAGjC,CAAC,CAACI,QAAQ;MAC9B,IAAMH,cAAc,GAAG7G,kBAAkB,CAAC8G,iBAAiB,CAACF,CAAC,CAAC;MAC9D,IAAI,CAACP,SAAS,CAACjF,KAAK,CAAC;MACrB,IAAI,CAAC2F,YAAY,CAAC3F,KAAK,EAAEyH,WAAW,EAAEhC,cAAc,EAAE+B,iBAAiB,CAAC;MAExE,IAAI,CAAC3B,mBAAmB,IAAI,CAAC4B,WAAW,IAAI,CAAChC,cAAc,EAAE;QAC3DK,QAAQ,CAAC9F,KAAK,EAAEwF,CAAC,CAAC;MACpB;IACF;IAEA,IAAI,CAACkC,eAAe,CAAC,CAAC;EACxB;EAEAvF,mBAAmBA,CAAAwF,KAAA,EAAyD;IAAA,IAAxD;MAAE1E;IAA6C,CAAC,GAAA0E,KAAA;IAClE,IAAI,CAACzC,QAAQ,CAAC;MAAEjC;IAAmB,CAAC,CAAC;EACvC;EAEAT,YAAYA,CAAAoF,KAAA,EAAyB;IAAA,IAAxB;MAAE1E;IAAa,CAAC,GAAA0E,KAAA;IAC3B,IAAI,CAAC1C,QAAQ,CAAC;MAAEhC;IAAO,CAAC,CAAC;EAC3B;EAEAZ,gBAAgBA,CAAA,EAAS;IACvB,IAAI,CAAC4C,QAAQ,CAAC;MAAElC,cAAc,EAAE;IAAK,CAAC,CAAC;EACzC;EAEAZ,mBAAmBA,CAAA,EAAS;IAC1B,IAAI,CAACsF,eAAe,CAAC,CAAC;IACtBtD,MAAM,CAACC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACjC,mBAAmB,CAAC;EACjE;EAEAC,aAAaA,CAACmD,CAAsB,EAAQ;IAC1C,IAAM;MAAEwB,aAAa;MAAEpD,SAAS;MAAEkC;IAAS,CAAC,GAAG,IAAI,CAAChG,KAAK;IACzD,IAAM;MAAEiD,UAAU,EAAE8E;IAAS,CAAC,GAAG,IAAI,CAAC/E,KAAK;IAC3C,IAAIgF,QAAQ,GAAGD,QAAQ;IAEvB,IAAIrC,CAAC,CAAClF,GAAG,KAAK,OAAO,IAAIkF,CAAC,CAAClF,GAAG,KAAK,GAAG,EAAE;MACtC,IAAI,CAAC0G,aAAa,IAAIc,QAAQ,IAAI,IAAI,EAAE;QACtC,IAAI,CAAC5C,QAAQ,CAAC;UAAEjF,cAAc,EAAE,CAAC,CAAC6H,QAAQ,EAAEA,QAAQ,CAAC;QAAE,CAAC,EAAE,MAAM;UAC9D,IAAIA,QAAQ,IAAI,IAAI,EAAE;YACpBhC,QAAQ,CAACgC,QAAQ,EAAEtC,CAAC,CAAC;UACvB;QACF,CAAC,CAAC;MACJ;MACA;IACF;IAEA,IAAIA,CAAC,CAAClF,GAAG,KAAK,SAAS,EAAE;MACvB,IAAIwH,QAAQ,IAAI,IAAI,IAAIA,QAAQ,IAAI,CAAC,EAAE;QACrCA,QAAQ,GAAGZ,IAAI,CAAC/G,GAAG,CAAC,CAAC,EAAE2H,QAAQ,GAAG,CAAC,CAAC;MACtC,CAAC,MAAM;QACLA,QAAQ,GAAGlE,SAAS,GAAG,CAAC;MAC1B;IACF,CAAC,MAAM,IAAI4B,CAAC,CAAClF,GAAG,KAAK,WAAW,EAAE;MAChC,IAAIwH,QAAQ,IAAI,IAAI,IAAIA,QAAQ,IAAI,CAAC,EAAE;QACrCA,QAAQ,GAAGZ,IAAI,CAACK,GAAG,CAACO,QAAQ,GAAG,CAAC,EAAElE,SAAS,GAAG,CAAC,CAAC;MAClD,CAAC,MAAM;QACLkE,QAAQ,GAAG,CAAC;MACd;IACF,CAAC,MAAM;MACL;IACF;IAEA,IAAID,QAAQ,KAAKC,QAAQ,EAAE;MACzBtC,CAAC,CAACuC,eAAe,CAAC,CAAC;MACnBvC,CAAC,CAACwC,cAAc,CAAC,CAAC;MAElB,IAAI,CAAC/C,SAAS,CAAC6C,QAAQ,CAAC;MAExB,IAAM;QAAE7H;MAAe,CAAC,GAAG,IAAI,CAAC6C,KAAK;MACrC,IAAI0C,CAAC,CAACI,QAAQ,IAAI3F,cAAc,CAACqG,MAAM,GAAG,CAAC,EAAE;QAC3C,IAAM2B,SAAS,GAAGhI,cAAc,CAACA,cAAc,CAACqG,MAAM,GAAG,CAAC,CAAC;QAC3D,IAAI,CAACN,WAAW,CAAC,CACfkB,IAAI,CAACK,GAAG,CAACO,QAAQ,EAAEG,SAAS,CAAC,CAAC,CAAC,CAAC,EAChCf,IAAI,CAAC/G,GAAG,CAAC2H,QAAQ,EAAEG,SAAS,CAAC,CAAC,CAAC,CAAC,CACjC,CAAC;MACJ,CAAC,MAAM;QACL,IAAI,CAACX,WAAW,CAAC,CAAC;QAClB,IAAIQ,QAAQ,KAAK,IAAI,EAAE;UACrB,IAAI,CAACvB,UAAU,CAACuB,QAAQ,CAAC;QAC3B,CAAC,MAAM;UAAA,IAAAI,sBAAA;UACL,CAAAA,sBAAA,OAAI,CAACtF,aAAa,CAAC4B,OAAO,cAAA0D,sBAAA,uBAA1BA,sBAAA,CAA4B5D,KAAK,CAAC,CAAC;QACrC;MACF;MAEA,IAAI,CAACgB,cAAc,CAACwC,QAAQ,CAAC;IAC/B;EACF;EAEAvF,YAAYA,CAAA4F,KAAA,EAGgB;IAAA,IAHf;MACXC,wBAAwB;MACxB/E;IACiB,CAAC,GAAA8E,KAAA;IAClB,IAAI,CAACjD,QAAQ,CAACpC,KAAK,IAAI;MACrB,IAAIsF,wBAAwB,EAAE;QAC5B;QACA;QACA,OAAO;UAAE/E;QAAa,CAAC;MACzB;MAEA,IAAM;QAAER;MAAe,CAAC,GAAG,IAAI,CAAC/C,KAAK;MACrC,IAAM;QAAEoD;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;EAEAqE,eAAeA,CAAA,EAAS;IACtB,IAAI,CAACxC,QAAQ,CAAC;MAAElC,cAAc,EAAE,IAAI;MAAEG,UAAU,EAAE;IAAM,CAAC,CAAC;EAC5D;EAEAW,cAAcA,CAAA,EAAS;IACrB,IAAM;MAAEF;IAAU,CAAC,GAAG,IAAI,CAAC9D,KAAK;IAChC,IAAI,IAAI,CAAC4C,IAAI,CAAC8B,OAAO,EAAE;MACrB,IAAI,CAAC9B,IAAI,CAAC8B,OAAO,CAACa,YAAY,CAACzB,SAAS,CAAC;IAC3C;EACF;EAEA0B,cAAcA,CAACjF,SAAiB,EAAQ;IACtC,IAAI,IAAI,CAACqC,IAAI,CAAC8B,OAAO,EAAE;MACrB,IAAI,CAAC9B,IAAI,CAAC8B,OAAO,CAACa,YAAY,CAAChF,SAAS,CAAC;IAC3C;EACF;;EAEA;AACF;AACA;AACA;AACA;AACA;EACEsF,YAAYA,CACV3F,KAAa,EACbyH,WAAoB,EACpBhC,cAAuB,EAEjB;IAAA,IADN4C,cAAc,GAAAC,SAAA,CAAAhC,MAAA,QAAAgC,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAG,IAAI;IAErB,IAAM;MAAEtB;IAAc,CAAC,GAAG,IAAI,CAAClH,KAAK;IACpC,IAAM;MAAEG;IAAe,CAAC,GAAG,IAAI,CAAC6C,KAAK;IAErC,IAAIkE,aAAa,IAAIS,WAAW,IAAIxH,cAAc,CAACqG,MAAM,GAAG,CAAC,EAAE;MAC7D,IAAM2B,SAAS,GAAGhI,cAAc,CAACA,cAAc,CAACqG,MAAM,GAAG,CAAC,CAAC;MAC3D,IAAI,CAACN,WAAW,CAAC,CACfkB,IAAI,CAACK,GAAG,CAACU,SAAS,CAAC,CAAC,CAAC,EAAEjI,KAAK,CAAC,EAC7BkH,IAAI,CAAC/G,GAAG,CAACH,KAAK,EAAEiI,SAAS,CAAC,CAAC,CAAC,CAAC,CAC9B,CAAC;IACJ,CAAC,MAAM,IACLjB,aAAa,IACb/G,cAAc,CAACqG,MAAM,KAAK,CAAC,IAC3BrG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAKD,KAAK,IAC9BC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAKD,KAAK,EAC9B;MACA,IAAIqI,cAAc,EAAE;QAClB,IAAI,CAACG,YAAY,CAACxI,KAAK,CAAC;MAC1B;IACF,CAAC,MAAM,IAAIgH,aAAa,IAAIvB,cAAc,EAAE;MAC1C,IAAI,IAAI,CAAC4B,eAAe,CAACrH,KAAK,EAAEC,cAAc,CAAC,EAAE;QAC/C,IAAIoI,cAAc,EAAE;UAClB,IAAI,CAACG,YAAY,CAACxI,KAAK,CAAC;QAC1B;MACF,CAAC,MAAM;QACL,IAAI,CAACuG,UAAU,CAACvG,KAAK,CAAC;MACxB;IACF,CAAC,MAAM;MACL,IAAI,CAACsH,WAAW,CAAC,CAAC;MAClB,IAAI,CAACf,UAAU,CAACvG,KAAK,CAAC;IACxB;EACF;EAEAsH,WAAWA,CAAA,EAAS;IAClB,IAAM;MAAE1D;IAAU,CAAC,GAAG,IAAI,CAAC9D,KAAK;IAChC,IAAI,CAAC2I,aAAa,CAAC,CAAC,CAAC,EAAE7E,SAAS,CAAC,CAAC;EACpC;EAEA4E,YAAYA,CAACxI,KAAa,EAAQ;IAChC,IAAI,CAACyI,aAAa,CAAC,CAACzI,KAAK,EAAEA,KAAK,CAAC,CAAC;EACpC;EAEAyI,aAAaA,CAACC,KAAY,EAAQ;IAChChK,UAAU,CAACiK,aAAa,CAACD,KAAK,CAAC;IAE/B,IAAI,CAACxD,QAAQ,CAAC0D,KAAA;MAAA,IAAC;QAAE3I;MAAe,CAAC,GAAA2I,KAAA;MAAA,OAAM;QACrC3I,cAAc,EAAEvB,UAAU,CAAC+J,aAAa,CAACxI,cAAc,EAAEyI,KAAK;MAChE,CAAC;IAAA,CAAC,CAAC;EACL;EAEAnC,UAAUA,CAACvG,KAAa,EAAQ;IAC9B,IAAM;MAAES;IAAc,CAAC,GAAG,IAAI,CAACX,KAAK;IACpC,IAAIW,aAAa,EAAE;IAEnB,IAAI,CAACuF,WAAW,CAAC,CAAChG,KAAK,EAAEA,KAAK,CAAC,CAAC;EAClC;EAEAgG,WAAWA,CAAC0C,KAAY,EAAQ;IAC9BhK,UAAU,CAACiK,aAAa,CAACD,KAAK,CAAC;IAE/B,IAAI,CAACxD,QAAQ,CAAC2D,KAAA;MAAA,IAAC;QAAE5I;MAAe,CAAC,GAAA4I,KAAA;MAAA,OAAM;QACrC5I,cAAc,EAAEvB,UAAU,CAACsH,WAAW,CAAC/F,cAAc,EAAEyI,KAAK;MAC9D,CAAC;IAAA,CAAC,CAAC;EACL;EAEA1E,iBAAiBA,CAAC/D,cAAgC,EAAQ;IACxD,IAAI,CAACiF,QAAQ,CAAC;MAAEjF;IAAe,CAAC,CAAC;EACnC;EAEA8D,kBAAkBA,CAAA,EAAS;IACzB,IAAM;MAAEV,YAAY;MAAEH;IAAO,CAAC,GAAG,IAAI,CAACJ,KAAK;IAC3C,IAAIO,YAAY,IAAI,IAAI,IAAIH,MAAM,IAAI,IAAI,EAAE;MAC1C,IAAM;QAAE4F,gBAAgB;QAAEC;MAAU,CAAC,GAAG,IAAI,CAACjJ,KAAK;MAClD,IAAMkJ,OAAM,GAAG9B,IAAI,CAAC+B,KAAK,CAAC5F,YAAY,GAAG0F,SAAS,CAAC;MACnD,IAAMG,UAAS,GAAGF,OAAM,GAAG9B,IAAI,CAACiC,IAAI,CAACjG,MAAM,GAAG6F,SAAS,CAAC;MACxDD,gBAAgB,CAACE,OAAM,EAAEE,UAAS,CAAC;IACrC;EACF;EAEArF,cAAcA,CAAA,EAKH;IAAA,IAJT;MACER,YAAY;MACZH;IAC8C,CAAC,GAAAoF,SAAA,CAAAhC,MAAA,QAAAgC,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAG,IAAI,CAACxF,KAAK;IAE9D,IAAII,MAAM,IAAI,IAAI,IAAIG,YAAY,IAAI,IAAI,EAAE;MAC1C,OAAO,KAAK;IACd;IAEA,IAAM;MAAEO,SAAS;MAAEmF;IAAU,CAAC,GAAG,IAAI,CAACjJ,KAAK;IAC3C,OAAOuD,YAAY,GAAGH,MAAM,IAAIU,SAAS,GAAGmF,SAAS;EACvD;EAEAtG,kBAAkBA,CAAA2G,KAAA,EAMY;IAAA,IANX;MACjBpJ,KAAK,EAAEK,SAAS;MAChBG;IAIF,CAAC,GAAA4I,KAAA;IACC,IAAM;MAAEnH,KAAK;MAAEoH,MAAM;MAAElK,UAAU;MAAEsB;IAAc,CAAC,GAAG,IAAI,CAACX,KAAK;IAC/D,IAAM;MAAEiD,UAAU;MAAE9C;IAAe,CAAC,GAAG,IAAI,CAAC6C,KAAK;IACjD,IAAIzC,SAAS,GAAGgJ,MAAM,IAAIhJ,SAAS,IAAIgJ,MAAM,GAAGpH,KAAK,CAACqE,MAAM,EAAE;MAC5D,OAAO,IAAI;IACb;IAEA,IAAM/G,IAAI,GAAG0C,KAAK,CAAC5B,SAAS,GAAGgJ,MAAM,CAAC;IACtC,OAAO,IAAI,CAACC,aAAa,CACvBjJ,SAAS,EACTA,SAAS,EACTd,IAAI,EACJc,SAAS,KAAK0C,UAAU,IAAI,CAACtC,aAAa,EAC1C,IAAI,CAAC4G,eAAe,CAAChH,SAAS,EAAEJ,cAAc,CAAC,EAC/Cd,UAAU,EACVqB,KAAK,EACLC,aACF,CAAC;EACH;EAEA8I,MAAMA,CAAA,EAAgB;IACpB,IAAM;MACJtH,KAAK;MACL2B,SAAS;MACT4F,aAAa;MACbrK,UAAU;MACV4J,SAAS;MACT,aAAa,EAAEU;IACjB,CAAC,GAAG,IAAI,CAAC3J,KAAK;IACd,IAAM;MAAEG,cAAc;MAAEmD;IAAgB,CAAC,GAAG,IAAI,CAACN,KAAK;IACtD,oBACEhE,IAAA,CAACN,SAAS;MAACgB,SAAS,EAAC,sBAAsB;MAACkK,QAAQ,EAAE,IAAI,CAAClH,YAAa;MAAA/C,QAAA,EACrEkK,MAAA;QAAA,IAAC;UAAEC,KAAK;UAAE1G;QAAO,CAAC,GAAAyG,MAAA;QAAA,oBACjB7K,IAAA,CAACP,IAAI;UACHiB,SAAS,EAAC,uBAAuB;UACjC0D,MAAM,EAAEA,MAAO;UACf0G,KAAK,EAAEA,KAAM;UACbC,mBAAmB,EAAEzG,eAAe,GAAGQ,SAAS,GAAGmF,SAAS,GAAG,CAAE;UACjEnF,SAAS,EAAEA,SAAU;UACrBkG,QAAQ,EAAEf;UACV;UACA;UACA;UAAA;UACAgB,QAAQ,EAAE,IAAI,CAACC,WAAW,CAAC/H,KAAK,EAAEhC,cAAc,EAAEd,UAAU,CAAE;UAC9D8K,QAAQ,EAAE,IAAI,CAAC1H,YAAa;UAC5B2H,eAAe,EAAE,IAAI,CAAC/H,mBAAoB;UAC1CP,GAAG,EAAE,IAAI,CAACc,IAAK;UACfyH,gBAAgB,EAAE,IAAI,CAACC,eAAe,CAAC,IAAI,CAAC/H,aAAa,CAAE;UAC3DgI,QAAQ,EAAE,IAAI,CAACzH,aAAc;UAC7B0H,gBAAgB,EAAE,IAAI,CAACC,eAAe,CAAC,CAAE;UACzCf,aAAa,EAAEA,aAAc;UAC7B,eAAaC,UAAW;UAAAhK,QAAA,EAEvB,IAAI,CAACgD;QAAkB,CACpB,CAAC;MAAA;IACR,CACQ,CAAC;EAEhB;AACF;AAAC1C,eAAA,CA7sBYb,QAAQ,gBAIC,IAAI;AAAAa,eAAA,CAJbb,QAAQ,wBAMS,EAAE;AAAAa,eAAA,CANnBb,QAAQ,sBASO,EAAE;AAAAa,eAAA,CATjBb,QAAQ,kBAWG;EACpBmK,MAAM,EAAE,CAAC;EACTpH,KAAK,EAAE,EAAE;EACT8G,SAAS,EAAE7J,QAAQ,CAACsL,kBAAkB;EAEtChD,iBAAiB,EAAE,IAAI;EAEvB3B,mBAAmB,EAAE,KAAK;EAE1BkB,YAAY,EAAE,IAAI;EAElBC,aAAa,EAAE,KAAK;EAEpBnE,cAAc,EAAE,KAAK;EAErBpC,aAAa,EAAE,KAAK;EAEpByD,aAAaA,CAAA,EAAS;IACpB;EAAA,CACD;EACD4B,QAAQA,CAAA,EAAS;IACf;EAAA,CACD;EACD7B,iBAAiBA,CAAA,EAAS;IACxB;EAAA,CACD;EACD6E,gBAAgBA,CAAA,EAAS;IACvB;EAAA,CACD;EAEDU,aAAa,EAAEtK,QAAQ,CAACuL,gBAAgB;EAExCtL,UAAU,EAAED,QAAQ,CAACC,UAAU;EAC/Bc,cAAc,EAAE,EAAE;EAElB4E,aAAa,EAAE,iBAAiB;EAEhC,aAAa,EAAE0D;AACjB,CAAC;AA8pBH,eAAerJ,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 type ListOnItemsRenderedProps,\n type ListOnScrollProps,\n} from 'react-window';\nimport AutoSizer, { type Size } from 'react-virtualized-auto-sizer';\nimport Log from '@deephaven/log';\nimport { RangeUtils, type 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,4 +1,4 @@
1
- import React, { KeyboardEvent } from 'react';
1
+ import React, { type KeyboardEvent } from 'react';
2
2
  import './MaskedInput.scss';
3
3
  declare const SELECTION_DIRECTION: {
4
4
  readonly FORWARD: "forward";
@@ -1 +1 @@
1
- {"version":3,"file":"MaskedInput.d.ts","sourceRoot":"","sources":["../src/MaskedInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAmC,aAAa,EAAE,MAAM,OAAO,CAAC;AAS9E,OAAO,oBAAoB,CAAC;AAI5B,QAAA,MAAM,mBAAmB;;;;CAIf,CAAC;AAQX,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;CACrF,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,2IAA2I;IAC3I,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,iDAAiD;IACjD,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,oCAAoC;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,mCAAmC;IACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC5D,qDAAqD;IACrD,mBAAmB,CAAC,EAAE,CACpB,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,KACV,MAAM,CAAC;IACZ,6BAA6B,CAAC,EAAE,CAC9B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,KACjB,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAClC,MAAM,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAEjC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AAIH,QAAA,MAAM,WAAW,2FA2dhB,CAAC;AAuBF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"MaskedInput.d.ts","sourceRoot":"","sources":["../src/MaskedInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAIZ,KAAK,aAAa,EACnB,MAAM,OAAO,CAAC;AASf,OAAO,oBAAoB,CAAC;AAI5B,QAAA,MAAM,mBAAmB;;;;CAIf,CAAC;AAQX,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;CACrF,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,2IAA2I;IAC3I,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,iDAAiD;IACjD,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,oCAAoC;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,mCAAmC;IACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC5D,qDAAqD;IACrD,mBAAmB,CAAC,EAAE,CACpB,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,KACV,MAAM,CAAC;IACZ,6BAA6B,CAAC,EAAE,CAC9B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,MAAM,KACjB,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAClC,MAAM,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC;IAEjC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AAIH,QAAA,MAAM,WAAW,2FA2dhB,CAAC;AAuBF,eAAe,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"MaskedInput.js","names":["React","useMemo","useEffect","useCallback","classNames","Log","useForwardedRef","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","fillToLength","trimTrailingMask","jsx","_jsx","log","module","SELECTION_DIRECTION","FORWARD","BACKWARD","NONE","FIXED_WIDTH_SPACE","MaskedInput","forwardRef","props","ref","className","example","getNextSegmentValue","range","delta","segmentValue","getPreferredReplacementString","onChange","onSelect","onSubmit","pattern","placeholder","selection","value","onFocus","onBlur","dataTestId","input","examples","Array","isArray","emptyMask","replace","setSelectedSegment","_input$current","debug","selectionStart","selectionEnd","selectionDirection","current","setSelectionRange","getSegment","cursorPosition","testValue","length","i","test","charAt","fillValue","checkValue","exampleValue","arguments","undefined","filledValue","concat","substring","isValid","patternRegex","RegExp","nextSegment","position","currentSegment","nextPosition","previousSegment","previousPosition","nextSegmentValue","segment","newSegmentValue","newValue","handleSelect","event","target","error","debug2","nativeEvent","type","_objectSpread","newSelection","handleSelectCapture","_input$current$select","preventDefault","stopPropagation","handleArrowKey","key","handleKeyDown","startsWith","trimmedValue","altKey","metaKey","ctrlKey","newChars","from","Set","toUpperCase","toLowerCase","newChar","maxReplaceIndex","replaceIndex","newSelectionStart","nextSegmentSelection","onKeyDown","onSelectCapture","defaultProps"],"sources":["../src/MaskedInput.tsx"],"sourcesContent":["import React, { useMemo, useEffect, useCallback, KeyboardEvent } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { useForwardedRef } from '@deephaven/react-hooks';\nimport {\n DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n fillToLength,\n trimTrailingMask,\n} from './MaskedInputUtils';\nimport './MaskedInput.scss';\n\nconst log = Log.module('MaskedInput');\n\nconst SELECTION_DIRECTION = {\n FORWARD: 'forward',\n BACKWARD: 'backward',\n NONE: 'none',\n} as const;\n\n/**\n * Special space character that's the same size as tabular numbers\n * https://www.fileformat.info/info/unicode/char/2007/index.htm\n */\nconst FIXED_WIDTH_SPACE = '\\u2007';\n\nexport type SelectionSegment = {\n selectionStart: number;\n selectionEnd: number;\n selectionDirection?: (typeof SELECTION_DIRECTION)[keyof typeof SELECTION_DIRECTION];\n};\n\ntype MaskedInputProps = {\n /** An extra class name to add to the component */\n className?: string;\n /** The regex pattern this masked input must match */\n pattern: string;\n /** Input placeholder */\n placeholder?: string;\n /** The current value to display */\n value: string;\n /** One or more examples of valid values. Used when deciding if next keystroke is valid (as rest of the current value may be incomplete) */\n example: string | string[];\n /** The current selection to use for the input */\n selection?: SelectionSegment;\n /** Called when the value changes. Note the value may still be incomplete. */\n onChange?: (value: string) => void;\n /** Called when selection changes */\n onSelect?: (segment: SelectionSegment) => void;\n /** Called when enter is pressed */\n onSubmit?: (event: KeyboardEvent<HTMLInputElement>) => void;\n /** Retrieve the next value for a provided segment */\n getNextSegmentValue?: (\n segment: SelectionSegment,\n delta: number,\n segmentValue: string,\n value: string\n ) => string;\n getPreferredReplacementString?: (\n value: string,\n replaceIndex: number,\n replaceChar: string,\n selectionStart: number,\n selectionEnd: number\n ) => string;\n onFocus?: React.FocusEventHandler;\n onBlur?: React.FocusEventHandler;\n\n 'data-testid'?: string;\n};\n\n/**\n * A masked input for entering data from a template.\n * Won't work by itself, must use within another component and handle updating the value/selection.\n */\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst MaskedInput = React.forwardRef<HTMLInputElement, MaskedInputProps>(\n (props: MaskedInputProps, ref) => {\n const {\n className,\n example,\n getNextSegmentValue = (range, delta, segmentValue) => segmentValue,\n getPreferredReplacementString = DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n onChange = () => false,\n onSelect = () => false,\n onSubmit,\n pattern,\n placeholder,\n selection,\n value,\n onFocus = () => false,\n onBlur = () => false,\n 'data-testid': dataTestId,\n } = props;\n const input = useForwardedRef(ref);\n const examples = useMemo(\n () => (Array.isArray(example) ? example : [example]),\n [example]\n );\n const emptyMask = useMemo(\n () => examples[0].replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE),\n [examples]\n );\n\n useEffect(\n function setSelectedSegment() {\n if (selection != null) {\n log.debug('setting selection...', selection);\n const { selectionStart, selectionEnd, selectionDirection } =\n selection;\n input.current?.setSelectionRange(\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n log.debug('selection set!');\n }\n },\n [selection, input]\n );\n\n /**\n * Returns the selection range for the segment at the given cursor position\n * @param cursorPosition The current position of the cursor\n */\n const getSegment = useCallback(\n (cursorPosition: number) => {\n let selectionStart = cursorPosition;\n let selectionEnd = cursorPosition;\n const testValue = examples.length > 0 ? examples[0] : value;\n\n for (let i = selectionStart - 1; i >= 0; i -= 1) {\n if (!/[a-zA-Z0-9]/g.test(testValue.charAt(i))) {\n break;\n }\n\n selectionStart = i;\n }\n\n for (let i = selectionEnd; i < testValue.length; i += 1) {\n if (!/[a-zA-Z0-9]/g.test(testValue.charAt(i))) {\n break;\n }\n\n selectionEnd = i + 1;\n }\n\n const selectionDirection =\n selectionStart === selectionEnd\n ? SELECTION_DIRECTION.NONE\n : SELECTION_DIRECTION.BACKWARD;\n\n return {\n selectionStart,\n selectionEnd,\n selectionDirection,\n };\n },\n [examples, value]\n );\n\n /**\n * Replaces all blank spaces and everything after the current cursor position with the example value\n * @param checkValue The value to check/fill in\n * @param exampleValue The example to fill in the value from\n * @param cursorPosition The cursor position\n * @returns The filled in value\n */\n function fillValue(\n checkValue: string,\n exampleValue: string,\n cursorPosition = checkValue.length\n ): string {\n let filledValue = '';\n for (let i = 0; i < cursorPosition; i += 1) {\n if (checkValue.charAt(i) !== FIXED_WIDTH_SPACE) {\n filledValue = filledValue.concat(checkValue[i]);\n } else {\n filledValue = filledValue.concat(exampleValue[i]);\n }\n }\n filledValue = filledValue.concat(exampleValue.substring(cursorPosition));\n\n return filledValue;\n }\n\n /**\n * Checks if a given `value` is valid up until the `cursorPosition`.\n * Uses the examples to build the rest of the string\n * @param checkValue The value to check validity of\n * @param cursorPosition The position of the cursor to check up to\n */\n function isValid(\n checkValue: string,\n cursorPosition = checkValue.length\n ): boolean {\n const patternRegex = new RegExp(`^${pattern}$`);\n if (patternRegex.test(checkValue)) {\n return true;\n }\n\n for (let i = 0; i < examples.length; i += 1) {\n const filledValue = fillValue(checkValue, examples[i], cursorPosition);\n if (patternRegex.test(filledValue)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns the next segment after the given position\n * @param position The cursor position to start at\n * @returns The new selection range\n */\n function nextSegment(position: number): SelectionSegment {\n const currentSegment = getSegment(position);\n const nextPosition = currentSegment.selectionEnd + 1;\n if (nextPosition >= value.length) {\n return currentSegment;\n }\n\n return getSegment(nextPosition);\n }\n\n /**\n * Returns the previous segment before the given position\n * @param position The cursor position to start at\n * @returns The new selection range\n */\n function previousSegment(position: number): SelectionSegment {\n const currentSegment = getSegment(position);\n const previousPosition = currentSegment.selectionStart - 1;\n if (previousPosition <= 0) {\n return currentSegment;\n }\n\n return getSegment(previousPosition);\n }\n\n function nextSegmentValue(position: number, delta: number): void {\n const segment = getSegment(position);\n const segmentValue = value.substring(\n segment.selectionStart,\n segment.selectionEnd\n );\n const newSegmentValue = getNextSegmentValue(\n segment,\n delta,\n segmentValue,\n value\n );\n const newValue =\n value.substring(0, segment.selectionStart) +\n newSegmentValue +\n value.substring(segment.selectionEnd);\n if (isValid(newValue, segment.selectionEnd)) {\n onChange(newValue);\n onSelect(segment);\n }\n }\n\n const handleSelect = useCallback(\n (event: React.UIEvent<HTMLInputElement>) => {\n const {\n selectionStart = 0,\n selectionEnd = 0,\n selectionDirection = 'none',\n } = event.target as HTMLInputElement;\n\n if (\n selectionStart === null ||\n selectionEnd === null ||\n selectionDirection === null\n ) {\n log.error(\n 'Selection attempted on non-text input element',\n event.target\n );\n return;\n }\n\n log.debug2(\n 'handleSelect',\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n if (\n selection != null &&\n selectionStart === selection.selectionStart &&\n selectionEnd === selection.selectionEnd\n ) {\n return;\n }\n if (\n selection != null &&\n selectionStart === value.length &&\n selectionEnd === value.length &&\n event.nativeEvent.type !== 'mouseup'\n ) {\n // React triggers onSelect event with the cursor at the end of the input content\n // when the component is rendered at a different location in the DOM,\n // i.e. when start/end times switch places in the TimeSlider.\n // Ignore this event and reset the selection to its previous state.\n onSelect({ ...selection });\n return;\n }\n if (selectionStart === selectionEnd) {\n const newSelection = getSegment(selectionStart);\n log.debug(\n 'Selection segment from ',\n selectionStart,\n selectionEnd,\n '=>',\n newSelection\n );\n onSelect(newSelection);\n } else {\n onSelect({ selectionStart, selectionEnd, selectionDirection });\n }\n },\n [getSegment, onSelect, selection, value]\n );\n\n const handleSelectCapture = useCallback(\n (event: React.UIEvent<HTMLInputElement>) => {\n if (!input.current) {\n return;\n }\n log.debug('handleSelectCapture', event);\n const selectionStart = input.current.selectionStart ?? 0;\n if (\n selectionStart === value.length &&\n selection != null &&\n selectionStart !== selection.selectionStart\n ) {\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [input, selection, value]\n );\n\n function handleArrowKey(\n event: React.KeyboardEvent<HTMLInputElement>\n ): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (!input.current) {\n return;\n }\n\n const { key } = event;\n const { selectionStart = 0, selectionEnd = 0 } = input.current;\n if (selectionStart === null || selectionEnd === null) {\n log.error(\n 'Selection arrow nvaigation attempted on non-text input element',\n event.target\n );\n return;\n }\n\n if (key === 'ArrowLeft') {\n onSelect(previousSegment(selectionStart));\n } else if (key === 'ArrowRight') {\n onSelect(nextSegment(selectionEnd));\n } else if (key === 'ArrowUp') {\n nextSegmentValue(selectionStart, -1);\n } else if (key === 'ArrowDown') {\n nextSegmentValue(selectionStart, 1);\n }\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {\n if (!input.current) {\n return;\n }\n log.debug('handleKeyDown', event);\n const { key } = event;\n const { selectionStart = 0, selectionEnd = 0 } = input.current;\n if (selectionStart === null || selectionEnd === null) {\n log.error(\n 'Selection key event on non-text input element',\n event.target\n );\n return;\n }\n if (key === 'Enter') {\n onSubmit?.(event);\n return;\n }\n if (key.startsWith('Arrow')) {\n handleArrowKey(event);\n return;\n }\n\n if (key === 'Delete' || key === 'Backspace') {\n event.preventDefault();\n event.stopPropagation();\n\n // Deleting at the end of the value\n if (selectionEnd >= trimTrailingMask(value, emptyMask).length) {\n const newValue = value.substring(\n 0,\n // Delete whole selection or just the char before the cursor\n selectionStart === selectionEnd\n ? selectionStart - 1\n : selectionStart\n );\n const trimmedValue = trimTrailingMask(newValue, emptyMask);\n if (trimmedValue !== value) {\n onChange(trimmedValue);\n onSelect({\n selectionStart: trimmedValue.length,\n selectionEnd: trimmedValue.length,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n }\n return;\n }\n\n if (selectionStart !== selectionEnd) {\n // Replace all non-masked characters with blanks, set selection to start\n const newValue =\n value.substring(0, selectionStart) +\n value\n .substring(selectionStart, selectionEnd)\n .replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE) +\n value.substring(selectionEnd);\n log.debug(\n 'Range ',\n selectionStart,\n selectionEnd,\n 'deleted, setting value',\n newValue\n );\n\n onChange(newValue);\n onSelect({\n selectionStart,\n selectionEnd: selectionStart,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n } else if (selectionStart > 0) {\n for (let i = selectionStart - 1; i >= 0; i -= 1) {\n // Only replace non placeholder text\n const newValue =\n value.substring(0, i) +\n value\n .substring(i, selectionStart)\n .replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE) +\n value.substring(selectionStart);\n\n if (newValue !== value) {\n onChange(newValue);\n onSelect({\n selectionStart: i,\n selectionEnd: i,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n return;\n }\n }\n }\n\n return;\n }\n\n if (event.altKey || event.metaKey || event.ctrlKey || key.length > 1) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n // Get the different permutations of the character they entered, remove duplicates\n const newChars = Array.from(\n new Set([key, key.toUpperCase(), key.toLowerCase()])\n );\n for (let i = 0; i < newChars.length; i += 1) {\n const newChar = newChars[i];\n\n // If they're typing an alphanumeric character, be smart and allow it to jump ahead\n const maxReplaceIndex = /[a-zA-Z0-9]/g.test(newChar)\n ? examples[0].length - 1\n : selectionStart;\n for (\n let replaceIndex = selectionStart;\n replaceIndex <= maxReplaceIndex;\n replaceIndex += 1\n ) {\n // Fill with the example chars if necessary\n const filledValue = fillToLength(\n value,\n examples[0],\n replaceIndex + 1\n );\n const newValue = getPreferredReplacementString(\n filledValue,\n replaceIndex,\n newChar,\n selectionStart,\n selectionEnd\n );\n if (isValid(newValue, replaceIndex + 1)) {\n const currentSegment = getSegment(replaceIndex);\n const newSelectionStart = replaceIndex + 1;\n let newSelection: SelectionSegment = {\n selectionStart: newSelectionStart,\n selectionEnd: newSelectionStart,\n selectionDirection: SELECTION_DIRECTION.NONE,\n };\n if (newSelectionStart >= currentSegment.selectionEnd) {\n const nextSegmentSelection = nextSegment(replaceIndex);\n if (\n nextSegmentSelection.selectionStart !==\n currentSegment.selectionStart\n ) {\n newSelection = nextSegmentSelection;\n }\n }\n log.debug('handleKeyDown', key, '=>', newValue, newSelection);\n onChange(newValue);\n onSelect(newSelection);\n return;\n }\n }\n }\n }\n\n // Need to use \"text\" type so we can apply a pattern and make selection properly\n return (\n <input\n ref={input}\n className={classNames('form-control masked-input', className)}\n type=\"text\"\n pattern={pattern}\n placeholder={placeholder}\n value={value}\n onChange={() => undefined}\n onKeyDown={handleKeyDown}\n onSelect={handleSelect}\n onSelectCapture={handleSelectCapture}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nMaskedInput.defaultProps = {\n className: '',\n placeholder: undefined,\n onChange(): void {\n // no-op\n },\n onSelect(): void {\n // no-op\n },\n getNextSegmentValue: (range, delta, segmentValue) => segmentValue,\n getPreferredReplacementString: DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n selection: undefined,\n onFocus(): void {\n // no-op\n },\n onBlur(): void {\n // no-op\n },\n 'data-testid': undefined,\n};\n\nexport default MaskedInput;\n"],"mappings":";;;;;AAAA,OAAOA,KAAK,IAAIC,OAAO,EAAEC,SAAS,EAAEC,WAAW,QAAuB,OAAO;AAC7E,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,GAAG,MAAM,gBAAgB;AAChC,SAASC,eAAe,QAAQ,wBAAwB;AAAC,SAEvDC,wCAAwC,EACxCC,YAAY,EACZC,gBAAgB;AAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAIlB,IAAMC,GAAG,GAAGP,GAAG,CAACQ,MAAM,CAAC,aAAa,CAAC;AAErC,IAAMC,mBAAmB,GAAG;EAC1BC,OAAO,EAAE,SAAS;EAClBC,QAAQ,EAAE,UAAU;EACpBC,IAAI,EAAE;AACR,CAAU;;AAEV;AACA;AACA;AACA;AACA,IAAMC,iBAAiB,GAAG,QAAQ;AA+ClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAMC,WAAW,gBAAGnB,KAAK,CAACoB,UAAU,CAClC,CAACC,KAAuB,EAAEC,GAAG,KAAK;EAChC,IAAM;IACJC,SAAS;IACTC,OAAO;IACPC,mBAAmB,GAAGA,CAACC,KAAK,EAAEC,KAAK,EAAEC,YAAY,KAAKA,YAAY;IAClEC,6BAA6B,GAAGtB,wCAAwC;IACxEuB,QAAQ,GAAGA,CAAA,KAAM,KAAK;IACtBC,QAAQ,GAAGA,CAAA,KAAM,KAAK;IACtBC,QAAQ;IACRC,OAAO;IACPC,WAAW;IACXC,SAAS;IACTC,KAAK;IACLC,OAAO,GAAGA,CAAA,KAAM,KAAK;IACrBC,MAAM,GAAGA,CAAA,KAAM,KAAK;IACpB,aAAa,EAAEC;EACjB,CAAC,GAAGlB,KAAK;EACT,IAAMmB,KAAK,GAAGlC,eAAe,CAACgB,GAAG,CAAC;EAClC,IAAMmB,QAAQ,GAAGxC,OAAO,CACtB,MAAOyC,KAAK,CAACC,OAAO,CAACnB,OAAO,CAAC,GAAGA,OAAO,GAAG,CAACA,OAAO,CAAE,EACpD,CAACA,OAAO,CACV,CAAC;EACD,IAAMoB,SAAS,GAAG3C,OAAO,CACvB,MAAMwC,QAAQ,CAAC,CAAC,CAAC,CAACI,OAAO,CAAC,cAAc,EAAE3B,iBAAiB,CAAC,EAC5D,CAACuB,QAAQ,CACX,CAAC;EAEDvC,SAAS,CACP,SAAS4C,kBAAkBA,CAAA,EAAG;IAC5B,IAAIX,SAAS,IAAI,IAAI,EAAE;MAAA,IAAAY,cAAA;MACrBnC,GAAG,CAACoC,KAAK,CAAC,sBAAsB,EAAEb,SAAS,CAAC;MAC5C,IAAM;QAAEc,cAAc,EAAdA,eAAc;QAAEC,YAAY,EAAZA,aAAY;QAAEC;MAAmB,CAAC,GACxDhB,SAAS;MACX,CAAAY,cAAA,GAAAP,KAAK,CAACY,OAAO,cAAAL,cAAA,uBAAbA,cAAA,CAAeM,iBAAiB,CAC9BJ,eAAc,EACdC,aAAY,EACZC,kBACF,CAAC;MACDvC,GAAG,CAACoC,KAAK,CAAC,gBAAgB,CAAC;IAC7B;EACF,CAAC,EACD,CAACb,SAAS,EAAEK,KAAK,CACnB,CAAC;;EAED;AACJ;AACA;AACA;EACI,IAAMc,UAAU,GAAGnD,WAAW,CAC3BoD,cAAsB,IAAK;IAC1B,IAAIN,cAAc,GAAGM,cAAc;IACnC,IAAIL,YAAY,GAAGK,cAAc;IACjC,IAAMC,SAAS,GAAGf,QAAQ,CAACgB,MAAM,GAAG,CAAC,GAAGhB,QAAQ,CAAC,CAAC,CAAC,GAAGL,KAAK;IAE3D,KAAK,IAAIsB,CAAC,GAAGT,cAAc,GAAG,CAAC,EAAES,CAAC,IAAI,CAAC,EAAEA,CAAC,IAAI,CAAC,EAAE;MAC/C,IAAI,CAAC,cAAc,CAACC,IAAI,CAACH,SAAS,CAACI,MAAM,CAACF,CAAC,CAAC,CAAC,EAAE;QAC7C;MACF;MAEAT,cAAc,GAAGS,CAAC;IACpB;IAEA,KAAK,IAAIA,EAAC,GAAGR,YAAY,EAAEQ,EAAC,GAAGF,SAAS,CAACC,MAAM,EAAEC,EAAC,IAAI,CAAC,EAAE;MACvD,IAAI,CAAC,cAAc,CAACC,IAAI,CAACH,SAAS,CAACI,MAAM,CAACF,EAAC,CAAC,CAAC,EAAE;QAC7C;MACF;MAEAR,YAAY,GAAGQ,EAAC,GAAG,CAAC;IACtB;IAEA,IAAMP,kBAAkB,GACtBF,cAAc,KAAKC,YAAY,GAC3BpC,mBAAmB,CAACG,IAAI,GACxBH,mBAAmB,CAACE,QAAQ;IAElC,OAAO;MACLiC,cAAc;MACdC,YAAY;MACZC;IACF,CAAC;EACH,CAAC,EACD,CAACV,QAAQ,EAAEL,KAAK,CAClB,CAAC;;EAED;AACJ;AACA;AACA;AACA;AACA;AACA;EACI,SAASyB,SAASA,CAChBC,UAAkB,EAClBC,YAAoB,EAEZ;IAAA,IADRR,cAAc,GAAAS,SAAA,CAAAP,MAAA,QAAAO,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAGF,UAAU,CAACL,MAAM;IAElC,IAAIS,WAAW,GAAG,EAAE;IACpB,KAAK,IAAIR,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGH,cAAc,EAAEG,CAAC,IAAI,CAAC,EAAE;MAC1C,IAAII,UAAU,CAACF,MAAM,CAACF,CAAC,CAAC,KAAKxC,iBAAiB,EAAE;QAC9CgD,WAAW,GAAGA,WAAW,CAACC,MAAM,CAACL,UAAU,CAACJ,CAAC,CAAC,CAAC;MACjD,CAAC,MAAM;QACLQ,WAAW,GAAGA,WAAW,CAACC,MAAM,CAACJ,YAAY,CAACL,CAAC,CAAC,CAAC;MACnD;IACF;IACAQ,WAAW,GAAGA,WAAW,CAACC,MAAM,CAACJ,YAAY,CAACK,SAAS,CAACb,cAAc,CAAC,CAAC;IAExE,OAAOW,WAAW;EACpB;;EAEA;AACJ;AACA;AACA;AACA;AACA;EACI,SAASG,OAAOA,CACdP,UAAkB,EAET;IAAA,IADTP,cAAc,GAAAS,SAAA,CAAAP,MAAA,QAAAO,SAAA,QAAAC,SAAA,GAAAD,SAAA,MAAGF,UAAU,CAACL,MAAM;IAElC,IAAMa,YAAY,GAAG,IAAIC,MAAM,KAAAJ,MAAA,CAAKlC,OAAO,MAAG,CAAC;IAC/C,IAAIqC,YAAY,CAACX,IAAI,CAACG,UAAU,CAAC,EAAE;MACjC,OAAO,IAAI;IACb;IAEA,KAAK,IAAIJ,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGjB,QAAQ,CAACgB,MAAM,EAAEC,CAAC,IAAI,CAAC,EAAE;MAC3C,IAAMQ,WAAW,GAAGL,SAAS,CAACC,UAAU,EAAErB,QAAQ,CAACiB,CAAC,CAAC,EAAEH,cAAc,CAAC;MACtE,IAAIe,YAAY,CAACX,IAAI,CAACO,WAAW,CAAC,EAAE;QAClC,OAAO,IAAI;MACb;IACF;IACA,OAAO,KAAK;EACd;;EAEA;AACJ;AACA;AACA;AACA;EACI,SAASM,WAAWA,CAACC,QAAgB,EAAoB;IACvD,IAAMC,cAAc,GAAGpB,UAAU,CAACmB,QAAQ,CAAC;IAC3C,IAAME,YAAY,GAAGD,cAAc,CAACxB,YAAY,GAAG,CAAC;IACpD,IAAIyB,YAAY,IAAIvC,KAAK,CAACqB,MAAM,EAAE;MAChC,OAAOiB,cAAc;IACvB;IAEA,OAAOpB,UAAU,CAACqB,YAAY,CAAC;EACjC;;EAEA;AACJ;AACA;AACA;AACA;EACI,SAASC,eAAeA,CAACH,QAAgB,EAAoB;IAC3D,IAAMC,cAAc,GAAGpB,UAAU,CAACmB,QAAQ,CAAC;IAC3C,IAAMI,gBAAgB,GAAGH,cAAc,CAACzB,cAAc,GAAG,CAAC;IAC1D,IAAI4B,gBAAgB,IAAI,CAAC,EAAE;MACzB,OAAOH,cAAc;IACvB;IAEA,OAAOpB,UAAU,CAACuB,gBAAgB,CAAC;EACrC;EAEA,SAASC,gBAAgBA,CAACL,QAAgB,EAAE9C,KAAa,EAAQ;IAC/D,IAAMoD,OAAO,GAAGzB,UAAU,CAACmB,QAAQ,CAAC;IACpC,IAAM7C,YAAY,GAAGQ,KAAK,CAACgC,SAAS,CAClCW,OAAO,CAAC9B,cAAc,EACtB8B,OAAO,CAAC7B,YACV,CAAC;IACD,IAAM8B,eAAe,GAAGvD,mBAAmB,CACzCsD,OAAO,EACPpD,KAAK,EACLC,YAAY,EACZQ,KACF,CAAC;IACD,IAAM6C,QAAQ,GACZ7C,KAAK,CAACgC,SAAS,CAAC,CAAC,EAAEW,OAAO,CAAC9B,cAAc,CAAC,GAC1C+B,eAAe,GACf5C,KAAK,CAACgC,SAAS,CAACW,OAAO,CAAC7B,YAAY,CAAC;IACvC,IAAImB,OAAO,CAACY,QAAQ,EAAEF,OAAO,CAAC7B,YAAY,CAAC,EAAE;MAC3CpB,QAAQ,CAACmD,QAAQ,CAAC;MAClBlD,QAAQ,CAACgD,OAAO,CAAC;IACnB;EACF;EAEA,IAAMG,YAAY,GAAG/E,WAAW,CAC7BgF,KAAsC,IAAK;IAC1C,IAAM;MACJlC,cAAc,GAAG,CAAC;MAClBC,YAAY,GAAG,CAAC;MAChBC,kBAAkB,GAAG;IACvB,CAAC,GAAGgC,KAAK,CAACC,MAA0B;IAEpC,IACEnC,cAAc,KAAK,IAAI,IACvBC,YAAY,KAAK,IAAI,IACrBC,kBAAkB,KAAK,IAAI,EAC3B;MACAvC,GAAG,CAACyE,KAAK,CACP,+CAA+C,EAC/CF,KAAK,CAACC,MACR,CAAC;MACD;IACF;IAEAxE,GAAG,CAAC0E,MAAM,CACR,cAAc,EACdrC,cAAc,EACdC,YAAY,EACZC,kBACF,CAAC;IACD,IACEhB,SAAS,IAAI,IAAI,IACjBc,cAAc,KAAKd,SAAS,CAACc,cAAc,IAC3CC,YAAY,KAAKf,SAAS,CAACe,YAAY,EACvC;MACA;IACF;IACA,IACEf,SAAS,IAAI,IAAI,IACjBc,cAAc,KAAKb,KAAK,CAACqB,MAAM,IAC/BP,YAAY,KAAKd,KAAK,CAACqB,MAAM,IAC7B0B,KAAK,CAACI,WAAW,CAACC,IAAI,KAAK,SAAS,EACpC;MACA;MACA;MACA;MACA;MACAzD,QAAQ,CAAA0D,aAAA,KAAMtD,SAAS,CAAE,CAAC;MAC1B;IACF;IACA,IAAIc,cAAc,KAAKC,YAAY,EAAE;MACnC,IAAMwC,YAAY,GAAGpC,UAAU,CAACL,cAAc,CAAC;MAC/CrC,GAAG,CAACoC,KAAK,CACP,yBAAyB,EACzBC,cAAc,EACdC,YAAY,EACZ,IAAI,EACJwC,YACF,CAAC;MACD3D,QAAQ,CAAC2D,YAAY,CAAC;IACxB,CAAC,MAAM;MACL3D,QAAQ,CAAC;QAAEkB,cAAc;QAAEC,YAAY;QAAEC;MAAmB,CAAC,CAAC;IAChE;EACF,CAAC,EACD,CAACG,UAAU,EAAEvB,QAAQ,EAAEI,SAAS,EAAEC,KAAK,CACzC,CAAC;EAED,IAAMuD,mBAAmB,GAAGxF,WAAW,CACpCgF,KAAsC,IAAK;IAAA,IAAAS,qBAAA;IAC1C,IAAI,CAACpD,KAAK,CAACY,OAAO,EAAE;MAClB;IACF;IACAxC,GAAG,CAACoC,KAAK,CAAC,qBAAqB,EAAEmC,KAAK,CAAC;IACvC,IAAMlC,cAAc,IAAA2C,qBAAA,GAAGpD,KAAK,CAACY,OAAO,CAACH,cAAc,cAAA2C,qBAAA,cAAAA,qBAAA,GAAI,CAAC;IACxD,IACE3C,cAAc,KAAKb,KAAK,CAACqB,MAAM,IAC/BtB,SAAS,IAAI,IAAI,IACjBc,cAAc,KAAKd,SAAS,CAACc,cAAc,EAC3C;MACAkC,KAAK,CAACU,cAAc,CAAC,CAAC;MACtBV,KAAK,CAACW,eAAe,CAAC,CAAC;IACzB;EACF,CAAC,EACD,CAACtD,KAAK,EAAEL,SAAS,EAAEC,KAAK,CAC1B,CAAC;EAED,SAAS2D,cAAcA,CACrBZ,KAA4C,EACtC;IACNA,KAAK,CAACU,cAAc,CAAC,CAAC;IACtBV,KAAK,CAACW,eAAe,CAAC,CAAC;IAEvB,IAAI,CAACtD,KAAK,CAACY,OAAO,EAAE;MAClB;IACF;IAEA,IAAM;MAAE4C;IAAI,CAAC,GAAGb,KAAK;IACrB,IAAM;MAAElC,cAAc,GAAG,CAAC;MAAEC,YAAY,GAAG;IAAE,CAAC,GAAGV,KAAK,CAACY,OAAO;IAC9D,IAAIH,cAAc,KAAK,IAAI,IAAIC,YAAY,KAAK,IAAI,EAAE;MACpDtC,GAAG,CAACyE,KAAK,CACP,gEAAgE,EAChEF,KAAK,CAACC,MACR,CAAC;MACD;IACF;IAEA,IAAIY,GAAG,KAAK,WAAW,EAAE;MACvBjE,QAAQ,CAAC6C,eAAe,CAAC3B,cAAc,CAAC,CAAC;IAC3C,CAAC,MAAM,IAAI+C,GAAG,KAAK,YAAY,EAAE;MAC/BjE,QAAQ,CAACyC,WAAW,CAACtB,YAAY,CAAC,CAAC;IACrC,CAAC,MAAM,IAAI8C,GAAG,KAAK,SAAS,EAAE;MAC5BlB,gBAAgB,CAAC7B,cAAc,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC,MAAM,IAAI+C,GAAG,KAAK,WAAW,EAAE;MAC9BlB,gBAAgB,CAAC7B,cAAc,EAAE,CAAC,CAAC;IACrC;EACF;EAEA,SAASgD,aAAaA,CAACd,KAA4C,EAAQ;IACzE,IAAI,CAAC3C,KAAK,CAACY,OAAO,EAAE;MAClB;IACF;IACAxC,GAAG,CAACoC,KAAK,CAAC,eAAe,EAAEmC,KAAK,CAAC;IACjC,IAAM;MAAEa;IAAI,CAAC,GAAGb,KAAK;IACrB,IAAM;MAAElC,cAAc,GAAG,CAAC;MAAEC,YAAY,GAAG;IAAE,CAAC,GAAGV,KAAK,CAACY,OAAO;IAC9D,IAAIH,cAAc,KAAK,IAAI,IAAIC,YAAY,KAAK,IAAI,EAAE;MACpDtC,GAAG,CAACyE,KAAK,CACP,+CAA+C,EAC/CF,KAAK,CAACC,MACR,CAAC;MACD;IACF;IACA,IAAIY,GAAG,KAAK,OAAO,EAAE;MACnBhE,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAGmD,KAAK,CAAC;MACjB;IACF;IACA,IAAIa,GAAG,CAACE,UAAU,CAAC,OAAO,CAAC,EAAE;MAC3BH,cAAc,CAACZ,KAAK,CAAC;MACrB;IACF;IAEA,IAAIa,GAAG,KAAK,QAAQ,IAAIA,GAAG,KAAK,WAAW,EAAE;MAC3Cb,KAAK,CAACU,cAAc,CAAC,CAAC;MACtBV,KAAK,CAACW,eAAe,CAAC,CAAC;;MAEvB;MACA,IAAI5C,YAAY,IAAIzC,gBAAgB,CAAC2B,KAAK,EAAEQ,SAAS,CAAC,CAACa,MAAM,EAAE;QAC7D,IAAMwB,QAAQ,GAAG7C,KAAK,CAACgC,SAAS,CAC9B,CAAC;QACD;QACAnB,cAAc,KAAKC,YAAY,GAC3BD,cAAc,GAAG,CAAC,GAClBA,cACN,CAAC;QACD,IAAMkD,YAAY,GAAG1F,gBAAgB,CAACwE,QAAQ,EAAErC,SAAS,CAAC;QAC1D,IAAIuD,YAAY,KAAK/D,KAAK,EAAE;UAC1BN,QAAQ,CAACqE,YAAY,CAAC;UACtBpE,QAAQ,CAAC;YACPkB,cAAc,EAAEkD,YAAY,CAAC1C,MAAM;YACnCP,YAAY,EAAEiD,YAAY,CAAC1C,MAAM;YACjCN,kBAAkB,EAAErC,mBAAmB,CAACG;UAC1C,CAAC,CAAC;QACJ;QACA;MACF;MAEA,IAAIgC,cAAc,KAAKC,YAAY,EAAE;QACnC;QACA,IAAM+B,SAAQ,GACZ7C,KAAK,CAACgC,SAAS,CAAC,CAAC,EAAEnB,cAAc,CAAC,GAClCb,KAAK,CACFgC,SAAS,CAACnB,cAAc,EAAEC,YAAY,CAAC,CACvCL,OAAO,CAAC,cAAc,EAAE3B,iBAAiB,CAAC,GAC7CkB,KAAK,CAACgC,SAAS,CAAClB,YAAY,CAAC;QAC/BtC,GAAG,CAACoC,KAAK,CACP,QAAQ,EACRC,cAAc,EACdC,YAAY,EACZ,wBAAwB,EACxB+B,SACF,CAAC;QAEDnD,QAAQ,CAACmD,SAAQ,CAAC;QAClBlD,QAAQ,CAAC;UACPkB,cAAc;UACdC,YAAY,EAAED,cAAc;UAC5BE,kBAAkB,EAAErC,mBAAmB,CAACG;QAC1C,CAAC,CAAC;MACJ,CAAC,MAAM,IAAIgC,cAAc,GAAG,CAAC,EAAE;QAC7B,KAAK,IAAIS,CAAC,GAAGT,cAAc,GAAG,CAAC,EAAES,CAAC,IAAI,CAAC,EAAEA,CAAC,IAAI,CAAC,EAAE;UAC/C;UACA,IAAMuB,UAAQ,GACZ7C,KAAK,CAACgC,SAAS,CAAC,CAAC,EAAEV,CAAC,CAAC,GACrBtB,KAAK,CACFgC,SAAS,CAACV,CAAC,EAAET,cAAc,CAAC,CAC5BJ,OAAO,CAAC,cAAc,EAAE3B,iBAAiB,CAAC,GAC7CkB,KAAK,CAACgC,SAAS,CAACnB,cAAc,CAAC;UAEjC,IAAIgC,UAAQ,KAAK7C,KAAK,EAAE;YACtBN,QAAQ,CAACmD,UAAQ,CAAC;YAClBlD,QAAQ,CAAC;cACPkB,cAAc,EAAES,CAAC;cACjBR,YAAY,EAAEQ,CAAC;cACfP,kBAAkB,EAAErC,mBAAmB,CAACG;YAC1C,CAAC,CAAC;YACF;UACF;QACF;MACF;MAEA;IACF;IAEA,IAAIkE,KAAK,CAACiB,MAAM,IAAIjB,KAAK,CAACkB,OAAO,IAAIlB,KAAK,CAACmB,OAAO,IAAIN,GAAG,CAACvC,MAAM,GAAG,CAAC,EAAE;MACpE;IACF;IAEA0B,KAAK,CAACU,cAAc,CAAC,CAAC;IACtBV,KAAK,CAACW,eAAe,CAAC,CAAC;;IAEvB;IACA,IAAMS,QAAQ,GAAG7D,KAAK,CAAC8D,IAAI,CACzB,IAAIC,GAAG,CAAC,CAACT,GAAG,EAAEA,GAAG,CAACU,WAAW,CAAC,CAAC,EAAEV,GAAG,CAACW,WAAW,CAAC,CAAC,CAAC,CACrD,CAAC;IACD,KAAK,IAAIjD,GAAC,GAAG,CAAC,EAAEA,GAAC,GAAG6C,QAAQ,CAAC9C,MAAM,EAAEC,GAAC,IAAI,CAAC,EAAE;MAC3C,IAAMkD,OAAO,GAAGL,QAAQ,CAAC7C,GAAC,CAAC;;MAE3B;MACA,IAAMmD,eAAe,GAAG,cAAc,CAAClD,IAAI,CAACiD,OAAO,CAAC,GAChDnE,QAAQ,CAAC,CAAC,CAAC,CAACgB,MAAM,GAAG,CAAC,GACtBR,cAAc;MAClB,KACE,IAAI6D,aAAY,GAAG7D,cAAc,EACjC6D,aAAY,IAAID,eAAe,EAC/BC,aAAY,IAAI,CAAC,EACjB;QACA;QACA,IAAM5C,WAAW,GAAG1D,YAAY,CAC9B4B,KAAK,EACLK,QAAQ,CAAC,CAAC,CAAC,EACXqE,aAAY,GAAG,CACjB,CAAC;QACD,IAAM7B,UAAQ,GAAGpD,6BAA6B,CAC5CqC,WAAW,EACX4C,aAAY,EACZF,OAAO,EACP3D,cAAc,EACdC,YACF,CAAC;QACD,IAAImB,OAAO,CAACY,UAAQ,EAAE6B,aAAY,GAAG,CAAC,CAAC,EAAE;UACvC,IAAMpC,cAAc,GAAGpB,UAAU,CAACwD,aAAY,CAAC;UAC/C,IAAMC,iBAAiB,GAAGD,aAAY,GAAG,CAAC;UAC1C,IAAIpB,YAA8B,GAAG;YACnCzC,cAAc,EAAE8D,iBAAiB;YACjC7D,YAAY,EAAE6D,iBAAiB;YAC/B5D,kBAAkB,EAAErC,mBAAmB,CAACG;UAC1C,CAAC;UACD,IAAI8F,iBAAiB,IAAIrC,cAAc,CAACxB,YAAY,EAAE;YACpD,IAAM8D,oBAAoB,GAAGxC,WAAW,CAACsC,aAAY,CAAC;YACtD,IACEE,oBAAoB,CAAC/D,cAAc,KACnCyB,cAAc,CAACzB,cAAc,EAC7B;cACAyC,YAAY,GAAGsB,oBAAoB;YACrC;UACF;UACApG,GAAG,CAACoC,KAAK,CAAC,eAAe,EAAEgD,GAAG,EAAE,IAAI,EAAEf,UAAQ,EAAES,YAAY,CAAC;UAC7D5D,QAAQ,CAACmD,UAAQ,CAAC;UAClBlD,QAAQ,CAAC2D,YAAY,CAAC;UACtB;QACF;MACF;IACF;EACF;;EAEA;EACA,oBACE/E,IAAA;IACEW,GAAG,EAAEkB,KAAM;IACXjB,SAAS,EAAEnB,UAAU,CAAC,2BAA2B,EAAEmB,SAAS,CAAE;IAC9DiE,IAAI,EAAC,MAAM;IACXvD,OAAO,EAAEA,OAAQ;IACjBC,WAAW,EAAEA,WAAY;IACzBE,KAAK,EAAEA,KAAM;IACbN,QAAQ,EAAEA,CAAA,KAAMmC,SAAU;IAC1BgD,SAAS,EAAEhB,aAAc;IACzBlE,QAAQ,EAAEmD,YAAa;IACvBgC,eAAe,EAAEvB,mBAAoB;IACrCtD,OAAO,EAAEA,OAAQ;IACjBC,MAAM,EAAEA,MAAO;IACf,eAAaC;EAAW,CACzB,CAAC;AAEN,CACF,CAAC;AAEDpB,WAAW,CAACgG,YAAY,GAAG;EACzB5F,SAAS,EAAE,EAAE;EACbW,WAAW,EAAE+B,SAAS;EACtBnC,QAAQA,CAAA,EAAS;IACf;EAAA,CACD;EACDC,QAAQA,CAAA,EAAS;IACf;EAAA,CACD;EACDN,mBAAmB,EAAEA,CAACC,KAAK,EAAEC,KAAK,EAAEC,YAAY,KAAKA,YAAY;EACjEC,6BAA6B,EAAEtB,wCAAwC;EACvE4B,SAAS,EAAE8B,SAAS;EACpB5B,OAAOA,CAAA,EAAS;IACd;EAAA,CACD;EACDC,MAAMA,CAAA,EAAS;IACb;EAAA,CACD;EACD,aAAa,EAAE2B;AACjB,CAAC;AAED,eAAe9C,WAAW"}
1
+ {"version":3,"file":"MaskedInput.js","names":["React","useMemo","useEffect","useCallback","classNames","Log","useForwardedRef","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","fillToLength","trimTrailingMask","jsx","_jsx","log","module","SELECTION_DIRECTION","FORWARD","BACKWARD","NONE","FIXED_WIDTH_SPACE","MaskedInput","forwardRef","props","ref","className","example","getNextSegmentValue","range","delta","segmentValue","getPreferredReplacementString","onChange","onSelect","onSubmit","pattern","placeholder","selection","value","onFocus","onBlur","dataTestId","input","examples","Array","isArray","emptyMask","replace","setSelectedSegment","_input$current","debug","selectionStart","selectionEnd","selectionDirection","current","setSelectionRange","getSegment","cursorPosition","testValue","length","i","test","charAt","fillValue","checkValue","exampleValue","arguments","undefined","filledValue","concat","substring","isValid","patternRegex","RegExp","nextSegment","position","currentSegment","nextPosition","previousSegment","previousPosition","nextSegmentValue","segment","newSegmentValue","newValue","handleSelect","event","target","error","debug2","nativeEvent","type","_objectSpread","newSelection","handleSelectCapture","_input$current$select","preventDefault","stopPropagation","handleArrowKey","key","handleKeyDown","startsWith","trimmedValue","altKey","metaKey","ctrlKey","newChars","from","Set","toUpperCase","toLowerCase","newChar","maxReplaceIndex","replaceIndex","newSelectionStart","nextSegmentSelection","onKeyDown","onSelectCapture","defaultProps"],"sources":["../src/MaskedInput.tsx"],"sourcesContent":["import React, {\n useMemo,\n useEffect,\n useCallback,\n type KeyboardEvent,\n} from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport { useForwardedRef } from '@deephaven/react-hooks';\nimport {\n DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n fillToLength,\n trimTrailingMask,\n} from './MaskedInputUtils';\nimport './MaskedInput.scss';\n\nconst log = Log.module('MaskedInput');\n\nconst SELECTION_DIRECTION = {\n FORWARD: 'forward',\n BACKWARD: 'backward',\n NONE: 'none',\n} as const;\n\n/**\n * Special space character that's the same size as tabular numbers\n * https://www.fileformat.info/info/unicode/char/2007/index.htm\n */\nconst FIXED_WIDTH_SPACE = '\\u2007';\n\nexport type SelectionSegment = {\n selectionStart: number;\n selectionEnd: number;\n selectionDirection?: (typeof SELECTION_DIRECTION)[keyof typeof SELECTION_DIRECTION];\n};\n\ntype MaskedInputProps = {\n /** An extra class name to add to the component */\n className?: string;\n /** The regex pattern this masked input must match */\n pattern: string;\n /** Input placeholder */\n placeholder?: string;\n /** The current value to display */\n value: string;\n /** One or more examples of valid values. Used when deciding if next keystroke is valid (as rest of the current value may be incomplete) */\n example: string | string[];\n /** The current selection to use for the input */\n selection?: SelectionSegment;\n /** Called when the value changes. Note the value may still be incomplete. */\n onChange?: (value: string) => void;\n /** Called when selection changes */\n onSelect?: (segment: SelectionSegment) => void;\n /** Called when enter is pressed */\n onSubmit?: (event: KeyboardEvent<HTMLInputElement>) => void;\n /** Retrieve the next value for a provided segment */\n getNextSegmentValue?: (\n segment: SelectionSegment,\n delta: number,\n segmentValue: string,\n value: string\n ) => string;\n getPreferredReplacementString?: (\n value: string,\n replaceIndex: number,\n replaceChar: string,\n selectionStart: number,\n selectionEnd: number\n ) => string;\n onFocus?: React.FocusEventHandler;\n onBlur?: React.FocusEventHandler;\n\n 'data-testid'?: string;\n};\n\n/**\n * A masked input for entering data from a template.\n * Won't work by itself, must use within another component and handle updating the value/selection.\n */\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst MaskedInput = React.forwardRef<HTMLInputElement, MaskedInputProps>(\n (props: MaskedInputProps, ref) => {\n const {\n className,\n example,\n getNextSegmentValue = (range, delta, segmentValue) => segmentValue,\n getPreferredReplacementString = DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n onChange = () => false,\n onSelect = () => false,\n onSubmit,\n pattern,\n placeholder,\n selection,\n value,\n onFocus = () => false,\n onBlur = () => false,\n 'data-testid': dataTestId,\n } = props;\n const input = useForwardedRef(ref);\n const examples = useMemo(\n () => (Array.isArray(example) ? example : [example]),\n [example]\n );\n const emptyMask = useMemo(\n () => examples[0].replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE),\n [examples]\n );\n\n useEffect(\n function setSelectedSegment() {\n if (selection != null) {\n log.debug('setting selection...', selection);\n const { selectionStart, selectionEnd, selectionDirection } =\n selection;\n input.current?.setSelectionRange(\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n log.debug('selection set!');\n }\n },\n [selection, input]\n );\n\n /**\n * Returns the selection range for the segment at the given cursor position\n * @param cursorPosition The current position of the cursor\n */\n const getSegment = useCallback(\n (cursorPosition: number) => {\n let selectionStart = cursorPosition;\n let selectionEnd = cursorPosition;\n const testValue = examples.length > 0 ? examples[0] : value;\n\n for (let i = selectionStart - 1; i >= 0; i -= 1) {\n if (!/[a-zA-Z0-9]/g.test(testValue.charAt(i))) {\n break;\n }\n\n selectionStart = i;\n }\n\n for (let i = selectionEnd; i < testValue.length; i += 1) {\n if (!/[a-zA-Z0-9]/g.test(testValue.charAt(i))) {\n break;\n }\n\n selectionEnd = i + 1;\n }\n\n const selectionDirection =\n selectionStart === selectionEnd\n ? SELECTION_DIRECTION.NONE\n : SELECTION_DIRECTION.BACKWARD;\n\n return {\n selectionStart,\n selectionEnd,\n selectionDirection,\n };\n },\n [examples, value]\n );\n\n /**\n * Replaces all blank spaces and everything after the current cursor position with the example value\n * @param checkValue The value to check/fill in\n * @param exampleValue The example to fill in the value from\n * @param cursorPosition The cursor position\n * @returns The filled in value\n */\n function fillValue(\n checkValue: string,\n exampleValue: string,\n cursorPosition = checkValue.length\n ): string {\n let filledValue = '';\n for (let i = 0; i < cursorPosition; i += 1) {\n if (checkValue.charAt(i) !== FIXED_WIDTH_SPACE) {\n filledValue = filledValue.concat(checkValue[i]);\n } else {\n filledValue = filledValue.concat(exampleValue[i]);\n }\n }\n filledValue = filledValue.concat(exampleValue.substring(cursorPosition));\n\n return filledValue;\n }\n\n /**\n * Checks if a given `value` is valid up until the `cursorPosition`.\n * Uses the examples to build the rest of the string\n * @param checkValue The value to check validity of\n * @param cursorPosition The position of the cursor to check up to\n */\n function isValid(\n checkValue: string,\n cursorPosition = checkValue.length\n ): boolean {\n const patternRegex = new RegExp(`^${pattern}$`);\n if (patternRegex.test(checkValue)) {\n return true;\n }\n\n for (let i = 0; i < examples.length; i += 1) {\n const filledValue = fillValue(checkValue, examples[i], cursorPosition);\n if (patternRegex.test(filledValue)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Returns the next segment after the given position\n * @param position The cursor position to start at\n * @returns The new selection range\n */\n function nextSegment(position: number): SelectionSegment {\n const currentSegment = getSegment(position);\n const nextPosition = currentSegment.selectionEnd + 1;\n if (nextPosition >= value.length) {\n return currentSegment;\n }\n\n return getSegment(nextPosition);\n }\n\n /**\n * Returns the previous segment before the given position\n * @param position The cursor position to start at\n * @returns The new selection range\n */\n function previousSegment(position: number): SelectionSegment {\n const currentSegment = getSegment(position);\n const previousPosition = currentSegment.selectionStart - 1;\n if (previousPosition <= 0) {\n return currentSegment;\n }\n\n return getSegment(previousPosition);\n }\n\n function nextSegmentValue(position: number, delta: number): void {\n const segment = getSegment(position);\n const segmentValue = value.substring(\n segment.selectionStart,\n segment.selectionEnd\n );\n const newSegmentValue = getNextSegmentValue(\n segment,\n delta,\n segmentValue,\n value\n );\n const newValue =\n value.substring(0, segment.selectionStart) +\n newSegmentValue +\n value.substring(segment.selectionEnd);\n if (isValid(newValue, segment.selectionEnd)) {\n onChange(newValue);\n onSelect(segment);\n }\n }\n\n const handleSelect = useCallback(\n (event: React.UIEvent<HTMLInputElement>) => {\n const {\n selectionStart = 0,\n selectionEnd = 0,\n selectionDirection = 'none',\n } = event.target as HTMLInputElement;\n\n if (\n selectionStart === null ||\n selectionEnd === null ||\n selectionDirection === null\n ) {\n log.error(\n 'Selection attempted on non-text input element',\n event.target\n );\n return;\n }\n\n log.debug2(\n 'handleSelect',\n selectionStart,\n selectionEnd,\n selectionDirection\n );\n if (\n selection != null &&\n selectionStart === selection.selectionStart &&\n selectionEnd === selection.selectionEnd\n ) {\n return;\n }\n if (\n selection != null &&\n selectionStart === value.length &&\n selectionEnd === value.length &&\n event.nativeEvent.type !== 'mouseup'\n ) {\n // React triggers onSelect event with the cursor at the end of the input content\n // when the component is rendered at a different location in the DOM,\n // i.e. when start/end times switch places in the TimeSlider.\n // Ignore this event and reset the selection to its previous state.\n onSelect({ ...selection });\n return;\n }\n if (selectionStart === selectionEnd) {\n const newSelection = getSegment(selectionStart);\n log.debug(\n 'Selection segment from ',\n selectionStart,\n selectionEnd,\n '=>',\n newSelection\n );\n onSelect(newSelection);\n } else {\n onSelect({ selectionStart, selectionEnd, selectionDirection });\n }\n },\n [getSegment, onSelect, selection, value]\n );\n\n const handleSelectCapture = useCallback(\n (event: React.UIEvent<HTMLInputElement>) => {\n if (!input.current) {\n return;\n }\n log.debug('handleSelectCapture', event);\n const selectionStart = input.current.selectionStart ?? 0;\n if (\n selectionStart === value.length &&\n selection != null &&\n selectionStart !== selection.selectionStart\n ) {\n event.preventDefault();\n event.stopPropagation();\n }\n },\n [input, selection, value]\n );\n\n function handleArrowKey(\n event: React.KeyboardEvent<HTMLInputElement>\n ): void {\n event.preventDefault();\n event.stopPropagation();\n\n if (!input.current) {\n return;\n }\n\n const { key } = event;\n const { selectionStart = 0, selectionEnd = 0 } = input.current;\n if (selectionStart === null || selectionEnd === null) {\n log.error(\n 'Selection arrow nvaigation attempted on non-text input element',\n event.target\n );\n return;\n }\n\n if (key === 'ArrowLeft') {\n onSelect(previousSegment(selectionStart));\n } else if (key === 'ArrowRight') {\n onSelect(nextSegment(selectionEnd));\n } else if (key === 'ArrowUp') {\n nextSegmentValue(selectionStart, -1);\n } else if (key === 'ArrowDown') {\n nextSegmentValue(selectionStart, 1);\n }\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {\n if (!input.current) {\n return;\n }\n log.debug('handleKeyDown', event);\n const { key } = event;\n const { selectionStart = 0, selectionEnd = 0 } = input.current;\n if (selectionStart === null || selectionEnd === null) {\n log.error(\n 'Selection key event on non-text input element',\n event.target\n );\n return;\n }\n if (key === 'Enter') {\n onSubmit?.(event);\n return;\n }\n if (key.startsWith('Arrow')) {\n handleArrowKey(event);\n return;\n }\n\n if (key === 'Delete' || key === 'Backspace') {\n event.preventDefault();\n event.stopPropagation();\n\n // Deleting at the end of the value\n if (selectionEnd >= trimTrailingMask(value, emptyMask).length) {\n const newValue = value.substring(\n 0,\n // Delete whole selection or just the char before the cursor\n selectionStart === selectionEnd\n ? selectionStart - 1\n : selectionStart\n );\n const trimmedValue = trimTrailingMask(newValue, emptyMask);\n if (trimmedValue !== value) {\n onChange(trimmedValue);\n onSelect({\n selectionStart: trimmedValue.length,\n selectionEnd: trimmedValue.length,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n }\n return;\n }\n\n if (selectionStart !== selectionEnd) {\n // Replace all non-masked characters with blanks, set selection to start\n const newValue =\n value.substring(0, selectionStart) +\n value\n .substring(selectionStart, selectionEnd)\n .replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE) +\n value.substring(selectionEnd);\n log.debug(\n 'Range ',\n selectionStart,\n selectionEnd,\n 'deleted, setting value',\n newValue\n );\n\n onChange(newValue);\n onSelect({\n selectionStart,\n selectionEnd: selectionStart,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n } else if (selectionStart > 0) {\n for (let i = selectionStart - 1; i >= 0; i -= 1) {\n // Only replace non placeholder text\n const newValue =\n value.substring(0, i) +\n value\n .substring(i, selectionStart)\n .replace(/[a-zA-Z0-9]/g, FIXED_WIDTH_SPACE) +\n value.substring(selectionStart);\n\n if (newValue !== value) {\n onChange(newValue);\n onSelect({\n selectionStart: i,\n selectionEnd: i,\n selectionDirection: SELECTION_DIRECTION.NONE,\n });\n return;\n }\n }\n }\n\n return;\n }\n\n if (event.altKey || event.metaKey || event.ctrlKey || key.length > 1) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n // Get the different permutations of the character they entered, remove duplicates\n const newChars = Array.from(\n new Set([key, key.toUpperCase(), key.toLowerCase()])\n );\n for (let i = 0; i < newChars.length; i += 1) {\n const newChar = newChars[i];\n\n // If they're typing an alphanumeric character, be smart and allow it to jump ahead\n const maxReplaceIndex = /[a-zA-Z0-9]/g.test(newChar)\n ? examples[0].length - 1\n : selectionStart;\n for (\n let replaceIndex = selectionStart;\n replaceIndex <= maxReplaceIndex;\n replaceIndex += 1\n ) {\n // Fill with the example chars if necessary\n const filledValue = fillToLength(\n value,\n examples[0],\n replaceIndex + 1\n );\n const newValue = getPreferredReplacementString(\n filledValue,\n replaceIndex,\n newChar,\n selectionStart,\n selectionEnd\n );\n if (isValid(newValue, replaceIndex + 1)) {\n const currentSegment = getSegment(replaceIndex);\n const newSelectionStart = replaceIndex + 1;\n let newSelection: SelectionSegment = {\n selectionStart: newSelectionStart,\n selectionEnd: newSelectionStart,\n selectionDirection: SELECTION_DIRECTION.NONE,\n };\n if (newSelectionStart >= currentSegment.selectionEnd) {\n const nextSegmentSelection = nextSegment(replaceIndex);\n if (\n nextSegmentSelection.selectionStart !==\n currentSegment.selectionStart\n ) {\n newSelection = nextSegmentSelection;\n }\n }\n log.debug('handleKeyDown', key, '=>', newValue, newSelection);\n onChange(newValue);\n onSelect(newSelection);\n return;\n }\n }\n }\n }\n\n // Need to use \"text\" type so we can apply a pattern and make selection properly\n return (\n <input\n ref={input}\n className={classNames('form-control masked-input', className)}\n type=\"text\"\n pattern={pattern}\n placeholder={placeholder}\n value={value}\n onChange={() => undefined}\n onKeyDown={handleKeyDown}\n onSelect={handleSelect}\n onSelectCapture={handleSelectCapture}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nMaskedInput.defaultProps = {\n className: '',\n placeholder: undefined,\n onChange(): void {\n // no-op\n },\n onSelect(): void {\n // no-op\n },\n getNextSegmentValue: (range, delta, segmentValue) => segmentValue,\n getPreferredReplacementString: DEFAULT_GET_PREFERRED_REPLACEMENT_STRING,\n selection: undefined,\n onFocus(): void {\n // no-op\n },\n onBlur(): void {\n // no-op\n },\n 'data-testid': undefined,\n};\n\nexport default MaskedInput;\n"],"mappings":"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"}
package/dist/Option.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import React, { OptionHTMLAttributes } from 'react';
1
+ import React, { type OptionHTMLAttributes } from 'react';
2
2
  export type OptionProps = OptionHTMLAttributes<HTMLOptionElement> & {
3
3
  children: React.ReactNode;
4
4
  'data-testid'?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Option.d.ts","sourceRoot":"","sources":["../src/Option.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAEpD,MAAM,MAAM,WAAW,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAClE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,iBAAS,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,OAAO,CAGhE;AAED,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Option.d.ts","sourceRoot":"","sources":["../src/Option.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAEzD,MAAM,MAAM,WAAW,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IAClE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,iBAAS,MAAM,CAAC,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,OAAO,CAGhE;AAED,eAAe,MAAM,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Option.js","names":["React","jsx","_jsx","Option","_ref","children","props","_objectWithoutProperties","_excluded","_objectSpread"],"sources":["../src/Option.tsx"],"sourcesContent":["import React, { OptionHTMLAttributes } from 'react';\n\nexport type OptionProps = OptionHTMLAttributes<HTMLOptionElement> & {\n children: React.ReactNode;\n 'data-testid'?: string;\n};\n\nfunction Option({ children, ...props }: OptionProps): JSX.Element {\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <option {...props}>{children}</option>;\n}\n\nexport default Option;\n"],"mappings":";;;;;;;;AAAA,OAAOA,KAAK,MAAgC,OAAO;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAOpD,SAASC,MAAMA,CAAAC,IAAA,EAAmD;EAAA,IAAlD;MAAEC;IAAgC,CAAC,GAAAD,IAAA;IAApBE,KAAK,GAAAC,wBAAA,CAAAH,IAAA,EAAAI,SAAA;EAClC;EACA,oBAAON,IAAA,WAAAO,aAAA,CAAAA,aAAA,KAAYH,KAAK;IAAAD,QAAA,EAAGA;EAAQ,EAAS,CAAC;AAC/C;AAEA,eAAeF,MAAM"}
1
+ {"version":3,"file":"Option.js","names":["React","jsx","_jsx","Option","_ref","children","props","_objectWithoutProperties","_excluded","_objectSpread"],"sources":["../src/Option.tsx"],"sourcesContent":["import React, { type OptionHTMLAttributes } from 'react';\n\nexport type OptionProps = OptionHTMLAttributes<HTMLOptionElement> & {\n children: React.ReactNode;\n 'data-testid'?: string;\n};\n\nfunction Option({ children, ...props }: OptionProps): JSX.Element {\n // eslint-disable-next-line react/jsx-props-no-spreading\n return <option {...props}>{children}</option>;\n}\n\nexport default Option;\n"],"mappings":";;;;;;;;AAAA,OAAOA,KAAK,MAAqC,OAAO;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAOzD,SAASC,MAAMA,CAAAC,IAAA,EAAmD;EAAA,IAAlD;MAAEC;IAAgC,CAAC,GAAAD,IAAA;IAApBE,KAAK,GAAAC,wBAAA,CAAAH,IAAA,EAAAI,SAAA;EAClC;EACA,oBAAON,IAAA,WAAAO,aAAA,CAAAA,aAAA,KAAYH,KAAK;IAAAD,QAAA,EAAGA;EAAQ,EAAS,CAAC;AAC/C;AAEA,eAAeF,MAAM"}
@@ -1,6 +1,6 @@
1
- import { Key } from 'react';
1
+ import { type Key } from 'react';
2
2
  import type { DOMRefValue } from '@react-types/shared';
3
- import { SpectrumComboBoxProps } from './spectrum';
3
+ import { type SpectrumComboBoxProps } from './spectrum';
4
4
  export interface SearchableComboboxProps<TItem, TKey extends Key> extends Omit<SpectrumComboBoxProps<TItem>, 'children' | 'menuTrigger' | 'onSelectionChange'> {
5
5
  getItemDisplayText: (item: TItem | null | undefined) => string | null;
6
6
  getKey: (item: TItem | null | undefined) => TKey | null;
@@ -1 +1 @@
1
- {"version":3,"file":"SearchableCombobox.d.ts","sourceRoot":"","sources":["../src/SearchableCombobox.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAe,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAA0B,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAG3E,MAAM,WAAW,uBAAuB,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAC9D,SAAQ,IAAI,CACV,qBAAqB,CAAC,KAAK,CAAC,EAC5B,UAAU,GAAG,aAAa,GAAG,mBAAmB,CACjD;IACD,kBAAkB,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,GAAG,IAAI,CAAC;IACtE,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC;IACxD,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,iBAAiB,EAAE,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;CAC/C;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,EAAE,EAC1D,SAAS,EACT,kBAAkB,EAClB,MAAM,EACN,GAAG,KAAK,EACT,EAAE,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CA4BpD;AAED,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"SearchableCombobox.d.ts","sourceRoot":"","sources":["../src/SearchableCombobox.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,GAAG,EAAe,MAAM,OAAO,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAA0B,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGhF,MAAM,WAAW,uBAAuB,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,CAC9D,SAAQ,IAAI,CACV,qBAAqB,CAAC,KAAK,CAAC,EAC5B,UAAU,GAAG,aAAa,GAAG,mBAAmB,CACjD;IACD,kBAAkB,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,GAAG,IAAI,CAAC;IACtE,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,GAAG,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC;IACxD,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACxC,iBAAiB,EAAE,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;CAC/C;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,IAAI,SAAS,GAAG,EAAE,EAC1D,SAAS,EACT,kBAAkB,EAClB,MAAM,EACN,GAAG,KAAK,EACT,EAAE,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CA4BpD;AAED,eAAe,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SearchableCombobox.js","names":["useCallback","SpectrumComboBox","Item","TextWithTooltip","jsx","_jsx","SearchableCombobox","_ref","scrollRef","getItemDisplayText","getKey","props","_objectWithoutProperties","_excluded","renderItem","item","key","displayText","textValue","String","children","text","_objectSpread","ref","menuTrigger","onSelectionChange"],"sources":["../src/SearchableCombobox.tsx"],"sourcesContent":["/* eslint-disable react/jsx-props-no-spreading */\nimport { Key, useCallback } from 'react';\nimport type { DOMRefValue, FocusableRef } from '@react-types/shared';\nimport { SpectrumComboBox, Item, SpectrumComboBoxProps } from './spectrum';\nimport TextWithTooltip from './TextWithTooltip';\n\nexport interface SearchableComboboxProps<TItem, TKey extends Key>\n extends Omit<\n SpectrumComboBoxProps<TItem>,\n 'children' | 'menuTrigger' | 'onSelectionChange'\n > {\n getItemDisplayText: (item: TItem | null | undefined) => string | null;\n getKey: (item: TItem | null | undefined) => TKey | null;\n scrollRef: React.RefObject<DOMRefValue>;\n onSelectionChange: (key: TKey | null) => void;\n}\n\nexport function SearchableCombobox<TItem, TKey extends Key>({\n scrollRef,\n getItemDisplayText,\n getKey,\n ...props\n}: SearchableComboboxProps<TItem, TKey>): JSX.Element {\n const renderItem = useCallback(\n item => {\n const key = getKey(item);\n const displayText = getItemDisplayText(item);\n\n return (\n <Item key={key} textValue={displayText ?? String(key)}>\n <TextWithTooltip text={displayText} />\n </Item>\n );\n },\n [getItemDisplayText, getKey]\n );\n\n return (\n <SpectrumComboBox\n {...props}\n // The `ref`prop type defined by React Spectrum is incorrect here\n ref={scrollRef as unknown as FocusableRef<HTMLElement>}\n menuTrigger=\"focus\"\n // Type assertion is necessary since <ComboBox> types don't recognize the\n // generic key arg\n onSelectionChange={props.onSelectionChange as (key: Key | null) => void}\n >\n {renderItem}\n </SpectrumComboBox>\n );\n}\n\nexport default SearchableCombobox;\n"],"mappings":";;;;;;;;AAAA;AACA,SAAcA,WAAW,QAAQ,OAAO;AAAC,SAEhCC,gBAAgB,EAAEC,IAAI;AAAA,OACxBC,eAAe;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAatB,OAAO,SAASC,kBAAkBA,CAAAC,IAAA,EAKoB;EAAA,IALM;MAC1DC,SAAS;MACTC,kBAAkB;MAClBC;IAEoC,CAAC,GAAAH,IAAA;IADlCI,KAAK,GAAAC,wBAAA,CAAAL,IAAA,EAAAM,SAAA;EAER,IAAMC,UAAU,GAAGd,WAAW,CAC5Be,IAAI,IAAI;IACN,IAAMC,GAAG,GAAGN,MAAM,CAACK,IAAI,CAAC;IACxB,IAAME,WAAW,GAAGR,kBAAkB,CAACM,IAAI,CAAC;IAE5C,oBACEV,IAAA,CAACH,IAAI;MAAWgB,SAAS,EAAED,WAAW,aAAXA,WAAW,cAAXA,WAAW,GAAIE,MAAM,CAACH,GAAG,CAAE;MAAAI,QAAA,eACpDf,IAAA,CAACF,eAAe;QAACkB,IAAI,EAAEJ;MAAY,CAAE;IAAC,GAD7BD,GAEL,CAAC;EAEX,CAAC,EACD,CAACP,kBAAkB,EAAEC,MAAM,CAC7B,CAAC;EAED,oBACEL,IAAA,CAACJ,gBAAgB,EAAAqB,aAAA,CAAAA,aAAA,KACXX,KAAK;IACT;IACAY,GAAG,EAAEf,SAAkD;IACvDgB,WAAW,EAAC;IACZ;IACA;IAAA;IACAC,iBAAiB,EAAEd,KAAK,CAACc,iBAA+C;IAAAL,QAAA,EAEvEN;EAAU,EACK,CAAC;AAEvB;AAEA,eAAeR,kBAAkB"}
1
+ {"version":3,"file":"SearchableCombobox.js","names":["useCallback","SpectrumComboBox","Item","TextWithTooltip","jsx","_jsx","SearchableCombobox","_ref","scrollRef","getItemDisplayText","getKey","props","_objectWithoutProperties","_excluded","renderItem","item","key","displayText","textValue","String","children","text","_objectSpread","ref","menuTrigger","onSelectionChange"],"sources":["../src/SearchableCombobox.tsx"],"sourcesContent":["/* eslint-disable react/jsx-props-no-spreading */\nimport { type Key, useCallback } from 'react';\nimport type { DOMRefValue, FocusableRef } from '@react-types/shared';\nimport { SpectrumComboBox, Item, type SpectrumComboBoxProps } from './spectrum';\nimport TextWithTooltip from './TextWithTooltip';\n\nexport interface SearchableComboboxProps<TItem, TKey extends Key>\n extends Omit<\n SpectrumComboBoxProps<TItem>,\n 'children' | 'menuTrigger' | 'onSelectionChange'\n > {\n getItemDisplayText: (item: TItem | null | undefined) => string | null;\n getKey: (item: TItem | null | undefined) => TKey | null;\n scrollRef: React.RefObject<DOMRefValue>;\n onSelectionChange: (key: TKey | null) => void;\n}\n\nexport function SearchableCombobox<TItem, TKey extends Key>({\n scrollRef,\n getItemDisplayText,\n getKey,\n ...props\n}: SearchableComboboxProps<TItem, TKey>): JSX.Element {\n const renderItem = useCallback(\n item => {\n const key = getKey(item);\n const displayText = getItemDisplayText(item);\n\n return (\n <Item key={key} textValue={displayText ?? String(key)}>\n <TextWithTooltip text={displayText} />\n </Item>\n );\n },\n [getItemDisplayText, getKey]\n );\n\n return (\n <SpectrumComboBox\n {...props}\n // The `ref`prop type defined by React Spectrum is incorrect here\n ref={scrollRef as unknown as FocusableRef<HTMLElement>}\n menuTrigger=\"focus\"\n // Type assertion is necessary since <ComboBox> types don't recognize the\n // generic key arg\n onSelectionChange={props.onSelectionChange as (key: Key | null) => void}\n >\n {renderItem}\n </SpectrumComboBox>\n );\n}\n\nexport default SearchableCombobox;\n"],"mappings":";;;;;;;;AAAA;AACA,SAAmBA,WAAW,QAAQ,OAAO;AAAC,SAErCC,gBAAgB,EAAEC,IAAI;AAAA,OACxBC,eAAe;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAatB,OAAO,SAASC,kBAAkBA,CAAAC,IAAA,EAKoB;EAAA,IALM;MAC1DC,SAAS;MACTC,kBAAkB;MAClBC;IAEoC,CAAC,GAAAH,IAAA;IADlCI,KAAK,GAAAC,wBAAA,CAAAL,IAAA,EAAAM,SAAA;EAER,IAAMC,UAAU,GAAGd,WAAW,CAC5Be,IAAI,IAAI;IACN,IAAMC,GAAG,GAAGN,MAAM,CAACK,IAAI,CAAC;IACxB,IAAME,WAAW,GAAGR,kBAAkB,CAACM,IAAI,CAAC;IAE5C,oBACEV,IAAA,CAACH,IAAI;MAAWgB,SAAS,EAAED,WAAW,aAAXA,WAAW,cAAXA,WAAW,GAAIE,MAAM,CAACH,GAAG,CAAE;MAAAI,QAAA,eACpDf,IAAA,CAACF,eAAe;QAACkB,IAAI,EAAEJ;MAAY,CAAE;IAAC,GAD7BD,GAEL,CAAC;EAEX,CAAC,EACD,CAACP,kBAAkB,EAAEC,MAAM,CAC7B,CAAC;EAED,oBACEL,IAAA,CAACJ,gBAAgB,EAAAqB,aAAA,CAAAA,aAAA,KACXX,KAAK;IACT;IACAY,GAAG,EAAEf,SAAkD;IACvDgB,WAAW,EAAC;IACZ;IACA;IAAA;IACAC,iBAAiB,EAAEd,KAAK,CAACc,iBAA+C;IAAAL,QAAA,EAEvEN;EAAU,EACK,CAAC;AAEvB;AAEA,eAAeR,kBAAkB"}
@@ -1,4 +1,4 @@
1
- import { PopperOptions } from './popper';
1
+ import { type PopperOptions } from './popper';
2
2
  export interface TextWithTooltipProps {
3
3
  text?: string | null;
4
4
  placement?: PopperOptions['placement'];
@@ -1 +1 @@
1
- {"version":3,"file":"TextWithTooltip.d.ts","sourceRoot":"","sources":["../src/TextWithTooltip.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAW,MAAM,UAAU,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;CACxC;AAED,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,SAAuB,GACxB,EAAE,oBAAoB,GAAG,GAAG,CAAC,OAAO,CAgBpC;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"TextWithTooltip.d.ts","sourceRoot":"","sources":["../src/TextWithTooltip.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAW,MAAM,UAAU,CAAC;AAEvD,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;CACxC;AAED,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,SAAuB,GACxB,EAAE,oBAAoB,GAAG,GAAG,CAAC,OAAO,CAgBpC;AAED,eAAe,eAAe,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TextWithTooltip.js","names":["useMemo","Text","stylesCommon","Tooltip","Fragment","_Fragment","jsx","_jsx","jsxs","_jsxs","TextWithTooltip","_ref","text","placement","options","children","UNSAFE_className","spectrumEllipsis"],"sources":["../src/TextWithTooltip.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Text } from './spectrum';\nimport stylesCommon from './SpectrumComponent.module.scss';\nimport { PopperOptions, Tooltip } from './popper';\n\nexport interface TextWithTooltipProps {\n text?: string | null;\n placement?: PopperOptions['placement'];\n}\n\nexport function TextWithTooltip({\n text,\n placement = 'top-start',\n}: TextWithTooltipProps): JSX.Element {\n const options = useMemo(() => ({ placement }), [placement]);\n\n return (\n <>\n <Text UNSAFE_className={stylesCommon.spectrumEllipsis}>\n {text ?? (\n /* &nbsp; so that height doesn't collapse when empty */\n <>&nbsp;</>\n )}\n </Text>\n {text == null || text === '' ? null : (\n <Tooltip options={options}>{text}</Tooltip>\n )}\n </>\n );\n}\n\nexport default TextWithTooltip;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAAC,SACvBC,IAAI;AAAA,OACNC,YAAY;AAAA,SACKC,OAAO;AAAA,SAAAC,QAAA,IAAAC,SAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAO/B,OAAO,SAASC,eAAeA,CAAAC,IAAA,EAGO;EAAA,IAHN;IAC9BC,IAAI;IACJC,SAAS,GAAG;EACQ,CAAC,GAAAF,IAAA;EACrB,IAAMG,OAAO,GAAGd,OAAO,CAAC,OAAO;IAAEa;EAAU,CAAC,CAAC,EAAE,CAACA,SAAS,CAAC,CAAC;EAE3D,oBACEJ,KAAA,CAAAJ,SAAA;IAAAU,QAAA,gBACER,IAAA,CAACN,IAAI;MAACe,gBAAgB,EAAEd,YAAY,CAACe,gBAAiB;MAAAF,QAAA,EACnDH,IAAI,aAAJA,IAAI,cAAJA,IAAI;MAAA;MACH;MACAL,IAAA,CAAAF,SAAA;QAAAU,QAAA,EAAE;MAAM,CAAE;IAAC,CAET,CAAC,EACNH,IAAI,IAAI,IAAI,IAAIA,IAAI,KAAK,EAAE,GAAG,IAAI,gBACjCL,IAAA,CAACJ,OAAO;MAACW,OAAO,EAAEA,OAAQ;MAAAC,QAAA,EAAEH;IAAI,CAAU,CAC3C;EAAA,CACD,CAAC;AAEP;AAEA,eAAeF,eAAe"}
1
+ {"version":3,"file":"TextWithTooltip.js","names":["useMemo","Text","stylesCommon","Tooltip","Fragment","_Fragment","jsx","_jsx","jsxs","_jsxs","TextWithTooltip","_ref","text","placement","options","children","UNSAFE_className","spectrumEllipsis"],"sources":["../src/TextWithTooltip.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Text } from './spectrum';\nimport stylesCommon from './SpectrumComponent.module.scss';\nimport { type PopperOptions, Tooltip } from './popper';\n\nexport interface TextWithTooltipProps {\n text?: string | null;\n placement?: PopperOptions['placement'];\n}\n\nexport function TextWithTooltip({\n text,\n placement = 'top-start',\n}: TextWithTooltipProps): JSX.Element {\n const options = useMemo(() => ({ placement }), [placement]);\n\n return (\n <>\n <Text UNSAFE_className={stylesCommon.spectrumEllipsis}>\n {text ?? (\n /* &nbsp; so that height doesn't collapse when empty */\n <>&nbsp;</>\n )}\n </Text>\n {text == null || text === '' ? null : (\n <Tooltip options={options}>{text}</Tooltip>\n )}\n </>\n );\n}\n\nexport default TextWithTooltip;\n"],"mappings":"AAAA,SAASA,OAAO,QAAQ,OAAO;AAAC,SACvBC,IAAI;AAAA,OACNC,YAAY;AAAA,SACUC,OAAO;AAAA,SAAAC,QAAA,IAAAC,SAAA;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAAA,SAAAC,IAAA,IAAAC,KAAA;AAOpC,OAAO,SAASC,eAAeA,CAAAC,IAAA,EAGO;EAAA,IAHN;IAC9BC,IAAI;IACJC,SAAS,GAAG;EACQ,CAAC,GAAAF,IAAA;EACrB,IAAMG,OAAO,GAAGd,OAAO,CAAC,OAAO;IAAEa;EAAU,CAAC,CAAC,EAAE,CAACA,SAAS,CAAC,CAAC;EAE3D,oBACEJ,KAAA,CAAAJ,SAAA;IAAAU,QAAA,gBACER,IAAA,CAACN,IAAI;MAACe,gBAAgB,EAAEd,YAAY,CAACe,gBAAiB;MAAAF,QAAA,EACnDH,IAAI,aAAJA,IAAI,cAAJA,IAAI;MAAA;MACH;MACAL,IAAA,CAAAF,SAAA;QAAAU,QAAA,EAAE;MAAM,CAAE;IAAC,CAET,CAAC,EACNH,IAAI,IAAI,IAAI,IAAIA,IAAI,KAAK,EAAE,GAAG,IAAI,gBACjCL,IAAA,CAACJ,OAAO;MAACW,OAAO,EAAEA,OAAQ;MAAAC,QAAA,EAAEH;IAAI,CAAU,CAC3C;EAAA,CACD,CAAC;AAEP;AAEA,eAAeF,eAAe"}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { SelectionSegment } from './MaskedInput';
2
+ import { type SelectionSegment } from './MaskedInput';
3
3
  export type { SelectionSegment } from './MaskedInput';
4
4
  type TimeInputProps = {
5
5
  allowValueWrapping?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../src/TimeInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAGf,OAAoB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOtD,KAAK,cAAc,GAAG;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,YAAY,EAAE,CAAC,YAAY,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACxD,CAAC;AAeF,QAAA,MAAM,SAAS,yFAqId,CAAC;AAaF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"TimeInput.d.ts","sourceRoot":"","sources":["../src/TimeInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAGf,OAAoB,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGnE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAOtD,KAAK,cAAc,GAAG;IACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,YAAY,EAAE,CAAC,YAAY,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACxD,CAAC;AAeF,QAAA,MAAM,SAAS,yFAqId,CAAC;AAaF,eAAe,SAAS,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TimeInput.js","names":["React","useCallback","useEffect","useImperativeHandle","useRef","useState","Log","TimeUtils","MaskedInput","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","jsx","_jsx","log","module","TIME_PATTERN","EXAMPLES","fixIncompleteValue","value","concat","substring","replace","length","TimeInput","forwardRef","props","ref","allowValueWrapping","className","onChange","propsValue","onFocus","onBlur","onSelect","dataTestId","setValue","formatTime","parsedValueRef","selection","setSelection","inputRef","focus","_inputRef$current","current","newSelection","_inputRef$current2","setFormattedTime","getNextSegmentValue","range","delta","segmentValue","maxValue","selectionStart","newSegmentValue","parseInt","Number","isNaN","Math","min","max","padStart","getPreferredReplacementString","replaceValue","replaceIndex","newChar","selectionEnd","handleChange","newValue","debug","parseTime","handleBlur","fixedValue","handleSelect","example","pattern","defaultProps","undefined"],"sources":["../src/TimeInput.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport Log from '@deephaven/log';\nimport { TimeUtils } from '@deephaven/utils';\nimport MaskedInput, { SelectionSegment } from './MaskedInput';\nimport { DEFAULT_GET_PREFERRED_REPLACEMENT_STRING } from './MaskedInputUtils';\n\nexport type { SelectionSegment } from './MaskedInput';\n\nconst log = Log.module('TimeInput');\n\nconst TIME_PATTERN = '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]';\nconst EXAMPLES = ['00:00:00', '12:34:56', '23:59:59'];\n\ntype TimeInputProps = {\n allowValueWrapping?: boolean;\n className?: string;\n onChange?: (timeInSec: number) => void;\n onSelect?: (selection: SelectionSegment) => void;\n value?: number;\n onFocus?: () => void;\n onBlur?: () => void;\n 'data-testid'?: string;\n};\n\nexport type TimeInputElement = {\n focus: () => void;\n setSelection: (newSelection: SelectionSegment) => void;\n};\n\nfunction fixIncompleteValue(value: string): string {\n // If value is not a complete HH:mm:ss time, fill missing parts with 0\n if (value != null) {\n return `${value\n .substring(0, 8)\n .replace(/\\u2007/g, '0')}${`00:00:00`.substring(value.length)}`;\n }\n return value;\n}\n\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst TimeInput = React.forwardRef<TimeInputElement, TimeInputProps>(\n (props: TimeInputProps, ref) => {\n const {\n allowValueWrapping = true,\n className = '',\n onChange = () => false,\n value: propsValue = 0,\n onFocus = () => false,\n onBlur = () => false,\n onSelect = () => false,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(TimeUtils.formatTime(propsValue));\n const parsedValueRef = useRef<number>(propsValue);\n const [selection, setSelection] = useState<SelectionSegment>();\n const inputRef = useRef<HTMLInputElement>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n inputRef.current?.focus();\n },\n setSelection: newSelection => {\n inputRef.current?.focus();\n setSelection(newSelection);\n },\n }),\n []\n );\n\n useEffect(\n function setFormattedTime() {\n // Ignore value prop update if it matches the displayed value\n // to preserve the displayed value while typing\n if (parsedValueRef.current !== propsValue) {\n setValue(TimeUtils.formatTime(propsValue));\n parsedValueRef.current = propsValue;\n }\n },\n [parsedValueRef, propsValue]\n );\n\n function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n ): string {\n // Delta is backward because negative Y is up\n const maxValue = range.selectionStart === 0 ? 24 : 60;\n let newSegmentValue = parseInt(segmentValue, 10) - delta;\n if (Number.isNaN(newSegmentValue)) {\n newSegmentValue = 0;\n } else if (allowValueWrapping) {\n // Add max value and re-mod so we don't get negative values after mod\n newSegmentValue = ((newSegmentValue % maxValue) + maxValue) % maxValue;\n } else {\n newSegmentValue = Math.min(Math.max(0, newSegmentValue), maxValue - 1);\n }\n return `${newSegmentValue}`.padStart(2, '0');\n }\n\n function getPreferredReplacementString(\n replaceValue: string,\n replaceIndex: number,\n newChar: string,\n selectionStart: number,\n selectionEnd: number\n ): string {\n if (\n selectionStart === 0 &&\n selectionEnd === 2 &&\n replaceIndex === 1 &&\n parseInt(newChar, 10) > 1\n ) {\n // DH-10082 Special case for when typing `3` when it's already 12\n return `0${newChar}${replaceValue.substring(2)}`;\n }\n return DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n replaceValue,\n replaceIndex,\n newChar\n );\n }\n\n const handleChange = useCallback(\n (newValue: string): void => {\n log.debug('handleChange', newValue);\n setValue(newValue);\n parsedValueRef.current = TimeUtils.parseTime(\n fixIncompleteValue(newValue)\n );\n onChange(parsedValueRef.current);\n },\n [onChange]\n );\n\n const handleBlur = useCallback((): void => {\n const fixedValue = fixIncompleteValue(value);\n // Update the value displayed in the input\n // onChange with the fixed value already triggered in handleChange\n if (fixedValue !== value) {\n setValue(fixedValue);\n }\n onBlur();\n }, [value, onBlur]);\n\n const handleSelect = useCallback(\n (newSelection: SelectionSegment) => {\n setSelection(newSelection);\n onSelect(newSelection);\n },\n [onSelect]\n );\n\n return (\n <MaskedInput\n ref={inputRef}\n className={className}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n getPreferredReplacementString={getPreferredReplacementString}\n onChange={handleChange}\n onSelect={handleSelect}\n pattern={TIME_PATTERN}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={handleBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nTimeInput.defaultProps = {\n allowValueWrapping: true,\n className: '',\n onChange: () => false,\n onSelect: () => false,\n value: 0,\n onFocus: () => false,\n onBlur: () => false,\n 'data-testid': undefined,\n};\n\nexport default TimeInput;\n"],"mappings":"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"}
1
+ {"version":3,"file":"TimeInput.js","names":["React","useCallback","useEffect","useImperativeHandle","useRef","useState","Log","TimeUtils","MaskedInput","DEFAULT_GET_PREFERRED_REPLACEMENT_STRING","jsx","_jsx","log","module","TIME_PATTERN","EXAMPLES","fixIncompleteValue","value","concat","substring","replace","length","TimeInput","forwardRef","props","ref","allowValueWrapping","className","onChange","propsValue","onFocus","onBlur","onSelect","dataTestId","setValue","formatTime","parsedValueRef","selection","setSelection","inputRef","focus","_inputRef$current","current","newSelection","_inputRef$current2","setFormattedTime","getNextSegmentValue","range","delta","segmentValue","maxValue","selectionStart","newSegmentValue","parseInt","Number","isNaN","Math","min","max","padStart","getPreferredReplacementString","replaceValue","replaceIndex","newChar","selectionEnd","handleChange","newValue","debug","parseTime","handleBlur","fixedValue","handleSelect","example","pattern","defaultProps","undefined"],"sources":["../src/TimeInput.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport Log from '@deephaven/log';\nimport { TimeUtils } from '@deephaven/utils';\nimport MaskedInput, { type SelectionSegment } from './MaskedInput';\nimport { DEFAULT_GET_PREFERRED_REPLACEMENT_STRING } from './MaskedInputUtils';\n\nexport type { SelectionSegment } from './MaskedInput';\n\nconst log = Log.module('TimeInput');\n\nconst TIME_PATTERN = '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]';\nconst EXAMPLES = ['00:00:00', '12:34:56', '23:59:59'];\n\ntype TimeInputProps = {\n allowValueWrapping?: boolean;\n className?: string;\n onChange?: (timeInSec: number) => void;\n onSelect?: (selection: SelectionSegment) => void;\n value?: number;\n onFocus?: () => void;\n onBlur?: () => void;\n 'data-testid'?: string;\n};\n\nexport type TimeInputElement = {\n focus: () => void;\n setSelection: (newSelection: SelectionSegment) => void;\n};\n\nfunction fixIncompleteValue(value: string): string {\n // If value is not a complete HH:mm:ss time, fill missing parts with 0\n if (value != null) {\n return `${value\n .substring(0, 8)\n .replace(/\\u2007/g, '0')}${`00:00:00`.substring(value.length)}`;\n }\n return value;\n}\n\n// Forward ref causes a false positive for display-name in eslint:\n// https://github.com/yannickcr/eslint-plugin-react/issues/2269\n// eslint-disable-next-line react/display-name\nconst TimeInput = React.forwardRef<TimeInputElement, TimeInputProps>(\n (props: TimeInputProps, ref) => {\n const {\n allowValueWrapping = true,\n className = '',\n onChange = () => false,\n value: propsValue = 0,\n onFocus = () => false,\n onBlur = () => false,\n onSelect = () => false,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(TimeUtils.formatTime(propsValue));\n const parsedValueRef = useRef<number>(propsValue);\n const [selection, setSelection] = useState<SelectionSegment>();\n const inputRef = useRef<HTMLInputElement>(null);\n\n useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n inputRef.current?.focus();\n },\n setSelection: newSelection => {\n inputRef.current?.focus();\n setSelection(newSelection);\n },\n }),\n []\n );\n\n useEffect(\n function setFormattedTime() {\n // Ignore value prop update if it matches the displayed value\n // to preserve the displayed value while typing\n if (parsedValueRef.current !== propsValue) {\n setValue(TimeUtils.formatTime(propsValue));\n parsedValueRef.current = propsValue;\n }\n },\n [parsedValueRef, propsValue]\n );\n\n function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n ): string {\n // Delta is backward because negative Y is up\n const maxValue = range.selectionStart === 0 ? 24 : 60;\n let newSegmentValue = parseInt(segmentValue, 10) - delta;\n if (Number.isNaN(newSegmentValue)) {\n newSegmentValue = 0;\n } else if (allowValueWrapping) {\n // Add max value and re-mod so we don't get negative values after mod\n newSegmentValue = ((newSegmentValue % maxValue) + maxValue) % maxValue;\n } else {\n newSegmentValue = Math.min(Math.max(0, newSegmentValue), maxValue - 1);\n }\n return `${newSegmentValue}`.padStart(2, '0');\n }\n\n function getPreferredReplacementString(\n replaceValue: string,\n replaceIndex: number,\n newChar: string,\n selectionStart: number,\n selectionEnd: number\n ): string {\n if (\n selectionStart === 0 &&\n selectionEnd === 2 &&\n replaceIndex === 1 &&\n parseInt(newChar, 10) > 1\n ) {\n // DH-10082 Special case for when typing `3` when it's already 12\n return `0${newChar}${replaceValue.substring(2)}`;\n }\n return DEFAULT_GET_PREFERRED_REPLACEMENT_STRING(\n replaceValue,\n replaceIndex,\n newChar\n );\n }\n\n const handleChange = useCallback(\n (newValue: string): void => {\n log.debug('handleChange', newValue);\n setValue(newValue);\n parsedValueRef.current = TimeUtils.parseTime(\n fixIncompleteValue(newValue)\n );\n onChange(parsedValueRef.current);\n },\n [onChange]\n );\n\n const handleBlur = useCallback((): void => {\n const fixedValue = fixIncompleteValue(value);\n // Update the value displayed in the input\n // onChange with the fixed value already triggered in handleChange\n if (fixedValue !== value) {\n setValue(fixedValue);\n }\n onBlur();\n }, [value, onBlur]);\n\n const handleSelect = useCallback(\n (newSelection: SelectionSegment) => {\n setSelection(newSelection);\n onSelect(newSelection);\n },\n [onSelect]\n );\n\n return (\n <MaskedInput\n ref={inputRef}\n className={className}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n getPreferredReplacementString={getPreferredReplacementString}\n onChange={handleChange}\n onSelect={handleSelect}\n pattern={TIME_PATTERN}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={handleBlur}\n data-testid={dataTestId}\n />\n );\n }\n);\n\nTimeInput.defaultProps = {\n allowValueWrapping: true,\n className: '',\n onChange: () => false,\n onSelect: () => false,\n value: 0,\n onFocus: () => false,\n onBlur: () => false,\n 'data-testid': undefined,\n};\n\nexport default TimeInput;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TimeSlider.d.ts","sourceRoot":"","sources":["../src/TimeSlider.tsx"],"names":[],"mappings":"AAaA,OAAO,mBAAmB,CAAC;AAO3B,KAAK,eAAe,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAClE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,iBAAS,UAAU,CAAC,EAClB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,WAAW,EACpB,QAAQ,EACR,eAAuB,EACvB,aAAqB,EACrB,aAAa,EAAE,UAAU,GAC1B,EAAE,eAAe,GAAG,GAAG,CAAC,OAAO,CAuF/B;AAwSD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"TimeSlider.d.ts","sourceRoot":"","sources":["../src/TimeSlider.tsx"],"names":[],"mappings":"AAgBA,OAAO,mBAAmB,CAAC;AAO3B,KAAK,eAAe,GAAG;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAClE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,iBAAS,UAAU,CAAC,EAClB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,WAAW,EACpB,QAAQ,EACR,eAAuB,EACvB,aAAqB,EACrB,aAAa,EAAE,UAAU,GAC1B,EAAE,eAAe,GAAG,GAAG,CAAC,OAAO,CAuF/B;AAwSD,eAAe,UAAU,CAAC"}