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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/AutoCompleteInput.js +410 -448
  2. package/dist/AutoCompleteInput.js.map +1 -1
  3. package/dist/AutoResizeTextarea.js +17 -46
  4. package/dist/AutoResizeTextarea.js.map +1 -1
  5. package/dist/BasicModal.js +18 -19
  6. package/dist/BasicModal.js.map +1 -1
  7. package/dist/Button.js +30 -21
  8. package/dist/Button.js.map +1 -1
  9. package/dist/ButtonGroup.js +6 -4
  10. package/dist/ButtonGroup.js.map +1 -1
  11. package/dist/ButtonOld.js +10 -8
  12. package/dist/ButtonOld.js.map +1 -1
  13. package/dist/CardFlip.js +10 -8
  14. package/dist/CardFlip.js.map +1 -1
  15. package/dist/Checkbox.js +18 -31
  16. package/dist/Checkbox.js.map +1 -1
  17. package/dist/Collapse.js +65 -105
  18. package/dist/Collapse.js.map +1 -1
  19. package/dist/ComboBox.js +432 -460
  20. package/dist/ComboBox.js.map +1 -1
  21. package/dist/CustomTimeSelect.js +485 -517
  22. package/dist/CustomTimeSelect.js.map +1 -1
  23. package/dist/DebouncedSearchInput.js +61 -91
  24. package/dist/DebouncedSearchInput.js.map +1 -1
  25. package/dist/DeephavenSpinner.js +6 -6
  26. package/dist/DeephavenSpinner.js.map +1 -1
  27. package/dist/DragUtils.js +65 -113
  28. package/dist/DragUtils.js.map +1 -1
  29. package/dist/DraggableItemList.d.ts +1 -0
  30. package/dist/DraggableItemList.d.ts.map +1 -1
  31. package/dist/DraggableItemList.js +219 -257
  32. package/dist/DraggableItemList.js.map +1 -1
  33. package/dist/HierarchicalCheckboxMenu.js +160 -227
  34. package/dist/HierarchicalCheckboxMenu.js.map +1 -1
  35. package/dist/ItemList.d.ts +4 -2
  36. package/dist/ItemList.d.ts.map +1 -1
  37. package/dist/ItemList.js +595 -598
  38. package/dist/ItemList.js.map +1 -1
  39. package/dist/ItemListItem.js +194 -215
  40. package/dist/ItemListItem.js.map +1 -1
  41. package/dist/LoadingOverlay.js +9 -10
  42. package/dist/LoadingOverlay.js.map +1 -1
  43. package/dist/LoadingSpinner.js +4 -3
  44. package/dist/LoadingSpinner.js.map +1 -1
  45. package/dist/MaskedInput.js +59 -70
  46. package/dist/MaskedInput.js.map +1 -1
  47. package/dist/Option.js +5 -3
  48. package/dist/Option.js.map +1 -1
  49. package/dist/RadioGroup.js +16 -34
  50. package/dist/RadioGroup.js.map +1 -1
  51. package/dist/RadioItem.js +14 -33
  52. package/dist/RadioItem.js.map +1 -1
  53. package/dist/SearchInput.js +42 -75
  54. package/dist/SearchInput.js.map +1 -1
  55. package/dist/Select.js +10 -8
  56. package/dist/Select.js.map +1 -1
  57. package/dist/SelectValueList.js +97 -134
  58. package/dist/SelectValueList.js.map +1 -1
  59. package/dist/SocketedButton.js +13 -11
  60. package/dist/SocketedButton.js.map +1 -1
  61. package/dist/ThemeExport.js.map +1 -1
  62. package/dist/TimeInput.js +16 -53
  63. package/dist/TimeInput.js.map +1 -1
  64. package/dist/TimeSlider.js +62 -88
  65. package/dist/TimeSlider.js.map +1 -1
  66. package/dist/ToastNotification.js +14 -13
  67. package/dist/ToastNotification.js.map +1 -1
  68. package/dist/UISwitch.js +9 -8
  69. package/dist/UISwitch.js.map +1 -1
  70. package/dist/context-actions/ContextActionUtils.js +173 -231
  71. package/dist/context-actions/ContextActionUtils.js.map +1 -1
  72. package/dist/context-actions/ContextActions.js +135 -177
  73. package/dist/context-actions/ContextActions.js.map +1 -1
  74. package/dist/context-actions/ContextMenu.js +509 -543
  75. package/dist/context-actions/ContextMenu.js.map +1 -1
  76. package/dist/context-actions/ContextMenuItem.js +32 -22
  77. package/dist/context-actions/ContextMenuItem.js.map +1 -1
  78. package/dist/context-actions/ContextMenuRoot.js +112 -152
  79. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  80. package/dist/context-actions/GlobalContextAction.js +49 -84
  81. package/dist/context-actions/GlobalContextAction.js.map +1 -1
  82. package/dist/context-actions/GlobalContextActions.js +25 -57
  83. package/dist/context-actions/GlobalContextActions.js.map +1 -1
  84. package/dist/context-actions/index.js +4 -4
  85. package/dist/context-actions/index.js.map +1 -1
  86. package/dist/index.js +39 -39
  87. package/dist/index.js.map +1 -1
  88. package/dist/menu-actions/DropdownMenu.js +126 -159
  89. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  90. package/dist/menu-actions/Menu.js +215 -245
  91. package/dist/menu-actions/Menu.js.map +1 -1
  92. package/dist/menu-actions/index.js +1 -1
  93. package/dist/menu-actions/index.js.map +1 -1
  94. package/dist/navigation/Menu.js +14 -18
  95. package/dist/navigation/Menu.js.map +1 -1
  96. package/dist/navigation/MenuItem.js +15 -14
  97. package/dist/navigation/MenuItem.js.map +1 -1
  98. package/dist/navigation/Page.js +7 -5
  99. package/dist/navigation/Page.js.map +1 -1
  100. package/dist/navigation/Stack.js +14 -39
  101. package/dist/navigation/Stack.js.map +1 -1
  102. package/dist/navigation/index.js +4 -4
  103. package/dist/navigation/index.js.map +1 -1
  104. package/dist/popper/Popper.js +209 -235
  105. package/dist/popper/Popper.js.map +1 -1
  106. package/dist/popper/Tooltip.js +227 -257
  107. package/dist/popper/Tooltip.js.map +1 -1
  108. package/dist/popper/index.js +2 -2
  109. package/dist/popper/index.js.map +1 -1
  110. package/dist/shortcuts/GlobalShortcuts.js +2 -2
  111. package/dist/shortcuts/GlobalShortcuts.js.map +1 -1
  112. package/dist/shortcuts/Shortcut.js +263 -291
  113. package/dist/shortcuts/Shortcut.js.map +1 -1
  114. package/dist/shortcuts/ShortcutRegistry.js +48 -71
  115. package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
  116. package/dist/shortcuts/index.js +4 -4
  117. package/dist/shortcuts/index.js.map +1 -1
  118. package/dist/tsconfig.tsbuildinfo +1 -1
  119. package/package.json +30 -54
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ComboBox.tsx"],"names":["React","Component","PropTypes","FontAwesomeIcon","vsTriangleDown","memoize","classNames","SearchInput","Popper","MENU_NAVIGATION_DIRECTION","ComboBox","props","options","input","filter","option","title","toLowerCase","indexOf","value","state","filteredOptions","keyboardOptionIndex","menuIsOpen","inputWidth","toggleMenu","bind","handleMenuKeyDown","handleMenuBlur","closeMenu","handleInputChange","handleInputKeyDown","handleInputBlur","handleFilterChange","handleOptionClick","handleOptionFocus","handleMenuOpened","handleMenuExited","popper","createRef","cbContainer","toggleButton","menuContainer","searchInput","scrollOptionIntoView","current","setState","getBoundingClientRect","width","focus","onChange","setInputWidth","event","menuOptions","key","updateInputValue","stopPropagation","preventDefault","handleMenuNavigation","UP","DOWN","shiftKey","length","direction","menuOptionsLength","delta","onEnter","openMenu","target","optionIndex","Number","currentTarget","getCachedFilteredOptions","scheduleUpdate","relatedTarget","Element","element","contains","hide","updateKeyboardIndex","window","requestAnimationFrame","show","focusInput","valueIndex","findIndex","activeOption","querySelector","HTMLElement","scrollIntoView","block","inline","searchPlaceholder","renderOptions","map","index","inputPlaceholder","disabled","className","defaultValue","spellCheck","popperOptions","placement","modifiers","preventOverflow","enabled","renderMenuElement","arrayOf","shape","string","isRequired","func","bool"],"mappings":"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","sourcesContent":["/**\n * Combobox that combines a input box with a searchable dropdown menu\n *\n * props:\n * @param {array} options :[{\n * title: 'option title for display',\n * value: 'option value' //option value\n * }]\n * @param {string} inputPlaceholder place holder for the input box\n * @param {string} searchPlaceholder place holder for the search box in drop down search box\n * @param {boolean} disabled disable both input & drop down\n *\n *\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsTriangleDown } from '@deephaven/icons';\nimport memoize from 'memoizee';\nimport classNames from 'classnames';\nimport { PopperOptions } from 'popper.js';\nimport SearchInput from './SearchInput';\nimport { Popper } from './popper';\n\nimport './ComboBox.scss';\n\ninterface ComboBoxOption {\n title: string;\n value: string;\n}\n\ninterface ComboBoxProps {\n options: ComboBoxOption[];\n popperOptions: PopperOptions;\n onChange(value: string): void;\n inputPlaceholder: string;\n searchPlaceholder: string;\n disabled: boolean;\n className: string;\n defaultValue: string;\n spellCheck: boolean;\n onEnter(): void;\n}\n\ninterface ComboBoxState {\n value: string;\n filter: string;\n filteredOptions: ComboBoxOption[];\n keyboardOptionIndex: number;\n menuIsOpen: boolean;\n inputWidth: number;\n}\n\nenum MENU_NAVIGATION_DIRECTION {\n UP = 'UP',\n DOWN = 'DOWN',\n}\n\nclass ComboBox extends Component<ComboBoxProps, ComboBoxState> {\n static MENU_NAVIGATION_DIRECTION = MENU_NAVIGATION_DIRECTION;\n\n static DROP_DOWN_MENU_HEIGHT = 200;\n\n static propTypes = {\n options: PropTypes.arrayOf(\n PropTypes.shape({\n title: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n })\n ).isRequired,\n popperOptions: PropTypes.shape({\n title: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n }),\n onChange: PropTypes.func,\n inputPlaceholder: PropTypes.string,\n searchPlaceholder: PropTypes.string,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n defaultValue: PropTypes.string,\n spellCheck: PropTypes.bool,\n onEnter: PropTypes.func,\n };\n\n static defaultProps = {\n onChange(): void {\n // no-op\n },\n inputPlaceholder: '',\n searchPlaceholder: 'Search',\n disabled: false,\n className: '',\n defaultValue: '',\n popperOptions: null,\n spellCheck: true,\n onEnter(): void {\n // no-op\n },\n };\n\n constructor(props: ComboBoxProps) {\n super(props);\n this.state = {\n value: '',\n filter: '',\n filteredOptions: props.options,\n keyboardOptionIndex: -1,\n menuIsOpen: false,\n inputWidth: 100,\n };\n\n this.toggleMenu = this.toggleMenu.bind(this);\n this.handleMenuKeyDown = this.handleMenuKeyDown.bind(this);\n this.handleMenuBlur = this.handleMenuBlur.bind(this);\n this.closeMenu = this.closeMenu.bind(this);\n\n this.handleInputChange = this.handleInputChange.bind(this);\n this.handleInputKeyDown = this.handleInputKeyDown.bind(this);\n this.handleInputBlur = this.handleInputBlur.bind(this);\n this.handleFilterChange = this.handleFilterChange.bind(this);\n\n this.handleOptionClick = this.handleOptionClick.bind(this);\n this.handleOptionFocus = this.handleOptionFocus.bind(this);\n\n this.handleMenuOpened = this.handleMenuOpened.bind(this);\n this.handleMenuExited = this.handleMenuExited.bind(this);\n\n this.popper = React.createRef();\n this.cbContainer = React.createRef();\n this.toggleButton = React.createRef();\n this.menuContainer = React.createRef();\n this.input = React.createRef();\n this.searchInput = React.createRef();\n }\n\n componentDidUpdate(): void {\n const { menuIsOpen, keyboardOptionIndex } = this.state;\n if (menuIsOpen && keyboardOptionIndex >= 0) {\n this.scrollOptionIntoView();\n }\n }\n\n popper: React.RefObject<Popper>;\n\n cbContainer: React.RefObject<HTMLDivElement>;\n\n toggleButton: React.RefObject<HTMLButtonElement>;\n\n menuContainer: React.RefObject<HTMLDivElement>;\n\n input: React.RefObject<HTMLInputElement>;\n\n searchInput: React.RefObject<SearchInput>;\n\n setInputWidth(): void {\n if (this.cbContainer.current) {\n this.setState({\n inputWidth: this.cbContainer.current.getBoundingClientRect().width,\n });\n }\n }\n\n getCachedFilteredOptions = memoize(\n (options: ComboBoxOption[], input: string) =>\n options.filter(\n option =>\n option.title.toLowerCase().indexOf(input.toLowerCase()) >= 0 ||\n option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0\n )\n );\n\n focus(): void {\n this.input.current?.focus();\n }\n\n resetValue(): void {\n this.setState({ value: '' });\n }\n\n updateInputValue(value: string): void {\n const { onChange } = this.props;\n this.setState({ value });\n onChange(value);\n }\n\n handleResize(): void {\n this.setInputWidth();\n }\n\n handleMenuKeyDown(event: React.KeyboardEvent): void {\n const { filter, filteredOptions, keyboardOptionIndex } = this.state;\n const { options } = this.props;\n const menuOptions = filter ? filteredOptions : options;\n\n switch (event.key) {\n case 'Enter':\n if (menuOptions[keyboardOptionIndex]?.value != null) {\n this.updateInputValue(menuOptions[keyboardOptionIndex].value);\n }\n this.closeMenu();\n this.input.current?.focus();\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'ArrowUp':\n this.handleMenuNavigation(ComboBox.MENU_NAVIGATION_DIRECTION.UP);\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.handleMenuNavigation(ComboBox.MENU_NAVIGATION_DIRECTION.DOWN);\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'Escape':\n if (filter !== '') {\n this.setState({ filter: '' });\n event.stopPropagation(); // Don't trigger blur on input element\n } else {\n this.closeMenu();\n }\n break;\n case 'Tab':\n if (!event.shiftKey && keyboardOptionIndex === menuOptions.length - 1) {\n this.closeMenu();\n }\n break;\n default:\n break;\n }\n }\n\n handleMenuNavigation(direction: MENU_NAVIGATION_DIRECTION): void {\n const { filter, filteredOptions, keyboardOptionIndex } = this.state;\n const { options } = this.props;\n const menuOptions = filter ? filteredOptions : options;\n const menuOptionsLength = menuOptions.length;\n let delta = 0;\n switch (direction) {\n case ComboBox.MENU_NAVIGATION_DIRECTION.UP:\n delta = -1;\n break;\n case ComboBox.MENU_NAVIGATION_DIRECTION.DOWN:\n delta = 1;\n break;\n }\n\n if (delta !== 0) {\n this.setState({\n keyboardOptionIndex:\n (keyboardOptionIndex + delta + menuOptionsLength) % menuOptionsLength,\n });\n }\n }\n\n handleInputKeyDown(event: React.KeyboardEvent): void {\n const { onEnter } = this.props;\n const { menuIsOpen } = this.state;\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n if (!menuIsOpen) {\n this.openMenu();\n }\n } else if (event.key === 'Enter') {\n onEnter();\n }\n }\n\n handleInputChange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.updateInputValue(event.target.value);\n }\n\n handleOptionClick(event: React.MouseEvent<HTMLButtonElement>): void {\n const optionIndex = Number(event.currentTarget.value);\n const { filter, filteredOptions } = this.state;\n const { options } = this.props;\n const menuOptions = filter ? filteredOptions : options;\n\n this.updateInputValue(menuOptions[optionIndex].value);\n this.closeMenu();\n this.input.current?.focus();\n }\n\n handleOptionFocus(event: React.FocusEvent<HTMLButtonElement>): void {\n this.setState({ keyboardOptionIndex: Number(event.target.value) });\n }\n\n handleFilterChange(event: React.ChangeEvent<HTMLInputElement>): void {\n const { options } = this.props;\n const filter = event.target.value;\n const filteredOptions = this.getCachedFilteredOptions(options, filter);\n\n this.setState({\n filter,\n filteredOptions,\n keyboardOptionIndex: 0,\n });\n this.popper.current?.scheduleUpdate();\n }\n\n handleMenuBlur(event: React.FocusEvent): void {\n // close if menu blurs, unless its an internal option or the toggleButton which triggers close via click\n if (\n (event.relatedTarget instanceof Element &&\n this.popper.current?.element.contains(event.relatedTarget)) ||\n event.relatedTarget === this.toggleButton.current\n ) {\n return;\n }\n this.closeMenu(false);\n }\n\n handleInputBlur(event: React.FocusEvent<HTMLInputElement>): void {\n // if blur event is caused by focusing on search input or open menu by keyboard, don't close the menu\n const { menuIsOpen } = this.state;\n if (\n menuIsOpen &&\n event.relatedTarget instanceof Element &&\n this.popper.current?.element.contains(event.relatedTarget)\n ) {\n return;\n }\n this.closeMenu(false);\n }\n\n handleMenuOpened(): void {\n this.scrollOptionIntoView();\n this.searchInput.current?.focus();\n }\n\n handleMenuExited(): void {\n const { menuIsOpen } = this.state;\n if (menuIsOpen) {\n this.setState({ menuIsOpen: false });\n this.popper.current?.hide();\n }\n this.setState({ filter: '' });\n }\n\n toggleMenu(event: React.MouseEvent<HTMLButtonElement>): void {\n const { menuIsOpen } = this.state;\n if (menuIsOpen) {\n this.closeMenu();\n } else {\n this.openMenu();\n }\n event.stopPropagation();\n }\n\n openMenu(): void {\n this.updateKeyboardIndex();\n this.setInputWidth();\n this.setState({ menuIsOpen: true });\n\n window.requestAnimationFrame(() => {\n this.popper.current?.show();\n });\n }\n\n closeMenu(focusInput = true): void {\n this.setState({ menuIsOpen: false });\n if (focusInput) {\n this.input.current?.focus();\n }\n this.popper.current?.hide();\n }\n\n updateKeyboardIndex(): void {\n const { value, filter, filteredOptions } = this.state;\n const { options } = this.props;\n const menuOptions = filter ? filteredOptions : options;\n const valueIndex = menuOptions.findIndex(option => option.value === value);\n this.setState({ keyboardOptionIndex: valueIndex });\n }\n\n scrollOptionIntoView(): void {\n const activeOption = this.menuContainer.current?.querySelector(\n '.cb-option-btn.keyboard-active'\n );\n if (activeOption instanceof HTMLElement) {\n activeOption.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n }\n }\n\n renderMenuElement(): JSX.Element {\n const { searchPlaceholder } = this.props;\n const { filter, inputWidth } = this.state;\n return (\n <div\n className=\"cb-menu-container\"\n ref={this.menuContainer}\n role=\"presentation\"\n onKeyDown={this.handleMenuKeyDown}\n onClick={event => {\n event.stopPropagation();\n }}\n style={{ width: inputWidth }}\n onBlur={this.handleMenuBlur}\n >\n <div className=\"cb-search-input-container\">\n <SearchInput\n value={filter}\n ref={this.searchInput}\n onChange={this.handleFilterChange}\n className=\"cb-search-input\"\n placeholder={searchPlaceholder}\n />\n </div>\n <div className=\"cb-options-container\">\n <div className=\"cb-options\">{this.renderOptions()}</div>\n </div>\n </div>\n );\n }\n\n renderOptions(): React.ReactNode {\n const { options } = this.props;\n const { keyboardOptionIndex, filter, filteredOptions } = this.state;\n const menuOptions = filter ? filteredOptions : options;\n\n return menuOptions.map((option, index) => {\n const key = `option-${index}-${option.value}`;\n return (\n <button\n key={key}\n type=\"button\"\n value={index}\n className={classNames('cb-option-btn', {\n 'keyboard-active': keyboardOptionIndex === index,\n })}\n onClick={this.handleOptionClick}\n onFocus={this.handleOptionFocus}\n >\n {option.title}\n </button>\n );\n });\n }\n\n render(): JSX.Element {\n const {\n options,\n inputPlaceholder,\n disabled,\n className,\n defaultValue,\n spellCheck,\n } = this.props;\n const { value } = this.state;\n let { popperOptions } = this.props;\n popperOptions = {\n placement: 'bottom-end',\n modifiers: {\n preventOverflow: { enabled: false },\n },\n ...popperOptions,\n };\n\n return (\n <div className=\"input-group cb-container\" ref={this.cbContainer}>\n <input\n value={value || defaultValue}\n className={classNames('form-control', className, 'cb-input')}\n ref={this.input}\n onChange={this.handleInputChange}\n placeholder={inputPlaceholder || (options[0] && options[0].title)}\n disabled={disabled}\n onBlur={this.handleInputBlur}\n onKeyDown={this.handleInputKeyDown}\n spellCheck={spellCheck}\n />\n <div className=\"input-group-append cb-dropdown\">\n <button\n type=\"button\"\n className=\"btn cb-btn form-control\"\n ref={this.toggleButton}\n onClick={this.toggleMenu}\n onKeyDown={this.handleInputKeyDown}\n disabled={disabled}\n >\n <FontAwesomeIcon icon={vsTriangleDown} />\n <Popper\n ref={this.popper}\n options={popperOptions}\n className={classNames('combobox interactive')}\n onEntered={this.handleMenuOpened}\n onExited={this.handleMenuExited}\n >\n {this.renderMenuElement()}\n </Popper>\n </button>\n </div>\n </div>\n );\n }\n}\n\nexport default ComboBox;\n"],"file":"ComboBox.js"}
1
+ {"version":3,"sources":["../src/ComboBox.tsx"],"names":["React","Component","PropTypes","FontAwesomeIcon","vsTriangleDown","memoize","classNames","SearchInput","Popper","MENU_NAVIGATION_DIRECTION","ComboBox","constructor","props","options","input","filter","option","title","toLowerCase","indexOf","value","state","filteredOptions","keyboardOptionIndex","menuIsOpen","inputWidth","toggleMenu","bind","handleMenuKeyDown","handleMenuBlur","closeMenu","handleInputChange","handleInputKeyDown","handleInputBlur","handleFilterChange","handleOptionClick","handleOptionFocus","handleMenuOpened","handleMenuExited","popper","createRef","cbContainer","toggleButton","menuContainer","searchInput","componentDidUpdate","scrollOptionIntoView","setInputWidth","current","setState","getBoundingClientRect","width","focus","resetValue","updateInputValue","onChange","handleResize","event","menuOptions","key","stopPropagation","preventDefault","handleMenuNavigation","UP","DOWN","shiftKey","length","direction","menuOptionsLength","delta","onEnter","openMenu","target","optionIndex","Number","currentTarget","getCachedFilteredOptions","scheduleUpdate","relatedTarget","Element","element","contains","hide","updateKeyboardIndex","window","requestAnimationFrame","show","focusInput","valueIndex","findIndex","activeOption","querySelector","HTMLElement","scrollIntoView","block","inline","renderMenuElement","searchPlaceholder","renderOptions","map","index","render","inputPlaceholder","disabled","className","defaultValue","spellCheck","popperOptions","placement","modifiers","preventOverflow","enabled","arrayOf","shape","string","isRequired","func","bool"],"mappings":"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","sourcesContent":["/**\n * Combobox that combines a input box with a searchable dropdown menu\n *\n * props:\n * @param {array} options :[{\n * title: 'option title for display',\n * value: 'option value' //option value\n * }]\n * @param {string} inputPlaceholder place holder for the input box\n * @param {string} searchPlaceholder place holder for the search box in drop down search box\n * @param {boolean} disabled disable both input & drop down\n *\n *\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsTriangleDown } from '@deephaven/icons';\nimport memoize from 'memoizee';\nimport classNames from 'classnames';\nimport { PopperOptions } from 'popper.js';\nimport SearchInput from './SearchInput';\nimport { Popper } from './popper';\n\nimport './ComboBox.scss';\n\ninterface ComboBoxOption {\n title: string;\n value: string;\n}\n\ninterface ComboBoxProps {\n options: ComboBoxOption[];\n popperOptions: PopperOptions;\n onChange(value: string): void;\n inputPlaceholder: string;\n searchPlaceholder: string;\n disabled: boolean;\n className: string;\n defaultValue: string;\n spellCheck: boolean;\n onEnter(): void;\n}\n\ninterface ComboBoxState {\n value: string;\n filter: string;\n filteredOptions: ComboBoxOption[];\n keyboardOptionIndex: number;\n menuIsOpen: boolean;\n inputWidth: number;\n}\n\nenum MENU_NAVIGATION_DIRECTION {\n UP = 'UP',\n DOWN = 'DOWN',\n}\n\nclass ComboBox extends Component<ComboBoxProps, ComboBoxState> {\n static MENU_NAVIGATION_DIRECTION = MENU_NAVIGATION_DIRECTION;\n\n static DROP_DOWN_MENU_HEIGHT = 200;\n\n static propTypes = {\n options: PropTypes.arrayOf(\n PropTypes.shape({\n title: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n })\n ).isRequired,\n popperOptions: PropTypes.shape({\n title: PropTypes.string.isRequired,\n value: PropTypes.string.isRequired,\n }),\n onChange: PropTypes.func,\n inputPlaceholder: PropTypes.string,\n searchPlaceholder: PropTypes.string,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n defaultValue: PropTypes.string,\n spellCheck: PropTypes.bool,\n onEnter: PropTypes.func,\n };\n\n static defaultProps = {\n onChange(): void {\n // no-op\n },\n inputPlaceholder: '',\n searchPlaceholder: 'Search',\n disabled: false,\n className: '',\n defaultValue: '',\n popperOptions: null,\n spellCheck: true,\n onEnter(): void {\n // no-op\n },\n };\n\n constructor(props: ComboBoxProps) {\n super(props);\n this.state = {\n value: '',\n filter: '',\n filteredOptions: props.options,\n keyboardOptionIndex: -1,\n menuIsOpen: false,\n inputWidth: 100,\n };\n\n this.toggleMenu = this.toggleMenu.bind(this);\n this.handleMenuKeyDown = this.handleMenuKeyDown.bind(this);\n this.handleMenuBlur = this.handleMenuBlur.bind(this);\n this.closeMenu = this.closeMenu.bind(this);\n\n this.handleInputChange = this.handleInputChange.bind(this);\n this.handleInputKeyDown = this.handleInputKeyDown.bind(this);\n this.handleInputBlur = this.handleInputBlur.bind(this);\n this.handleFilterChange = this.handleFilterChange.bind(this);\n\n this.handleOptionClick = this.handleOptionClick.bind(this);\n this.handleOptionFocus = this.handleOptionFocus.bind(this);\n\n this.handleMenuOpened = this.handleMenuOpened.bind(this);\n this.handleMenuExited = this.handleMenuExited.bind(this);\n\n this.popper = React.createRef();\n this.cbContainer = React.createRef();\n this.toggleButton = React.createRef();\n this.menuContainer = React.createRef();\n this.input = React.createRef();\n this.searchInput = React.createRef();\n }\n\n componentDidUpdate(): void {\n const { menuIsOpen, keyboardOptionIndex } = this.state;\n if (menuIsOpen && keyboardOptionIndex >= 0) {\n this.scrollOptionIntoView();\n }\n }\n\n popper: React.RefObject<Popper>;\n\n cbContainer: React.RefObject<HTMLDivElement>;\n\n toggleButton: React.RefObject<HTMLButtonElement>;\n\n menuContainer: React.RefObject<HTMLDivElement>;\n\n input: React.RefObject<HTMLInputElement>;\n\n searchInput: React.RefObject<SearchInput>;\n\n setInputWidth(): void {\n if (this.cbContainer.current) {\n this.setState({\n inputWidth: this.cbContainer.current.getBoundingClientRect().width,\n });\n }\n }\n\n getCachedFilteredOptions = memoize(\n (options: ComboBoxOption[], input: string) =>\n options.filter(\n option =>\n option.title.toLowerCase().indexOf(input.toLowerCase()) >= 0 ||\n option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0\n )\n );\n\n focus(): void {\n this.input.current?.focus();\n }\n\n resetValue(): void {\n this.setState({ value: '' });\n }\n\n updateInputValue(value: string): void {\n const { onChange } = this.props;\n this.setState({ value });\n onChange(value);\n }\n\n handleResize(): void {\n this.setInputWidth();\n }\n\n handleMenuKeyDown(event: React.KeyboardEvent): void {\n const { filter, filteredOptions, keyboardOptionIndex } = this.state;\n const { options } = this.props;\n const menuOptions = filter ? filteredOptions : options;\n\n switch (event.key) {\n case 'Enter':\n if (menuOptions[keyboardOptionIndex]?.value != null) {\n this.updateInputValue(menuOptions[keyboardOptionIndex].value);\n }\n this.closeMenu();\n this.input.current?.focus();\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'ArrowUp':\n this.handleMenuNavigation(ComboBox.MENU_NAVIGATION_DIRECTION.UP);\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.handleMenuNavigation(ComboBox.MENU_NAVIGATION_DIRECTION.DOWN);\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'Escape':\n if (filter !== '') {\n this.setState({ filter: '' });\n event.stopPropagation(); // Don't trigger blur on input element\n } else {\n this.closeMenu();\n }\n break;\n case 'Tab':\n if (!event.shiftKey && keyboardOptionIndex === menuOptions.length - 1) {\n this.closeMenu();\n }\n break;\n default:\n break;\n }\n }\n\n handleMenuNavigation(direction: MENU_NAVIGATION_DIRECTION): void {\n const { filter, filteredOptions, keyboardOptionIndex } = this.state;\n const { options } = this.props;\n const menuOptions = filter ? filteredOptions : options;\n const menuOptionsLength = menuOptions.length;\n let delta = 0;\n switch (direction) {\n case ComboBox.MENU_NAVIGATION_DIRECTION.UP:\n delta = -1;\n break;\n case ComboBox.MENU_NAVIGATION_DIRECTION.DOWN:\n delta = 1;\n break;\n }\n\n if (delta !== 0) {\n this.setState({\n keyboardOptionIndex:\n (keyboardOptionIndex + delta + menuOptionsLength) % menuOptionsLength,\n });\n }\n }\n\n handleInputKeyDown(event: React.KeyboardEvent): void {\n const { onEnter } = this.props;\n const { menuIsOpen } = this.state;\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n if (!menuIsOpen) {\n this.openMenu();\n }\n } else if (event.key === 'Enter') {\n onEnter();\n }\n }\n\n handleInputChange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.updateInputValue(event.target.value);\n }\n\n handleOptionClick(event: React.MouseEvent<HTMLButtonElement>): void {\n const optionIndex = Number(event.currentTarget.value);\n const { filter, filteredOptions } = this.state;\n const { options } = this.props;\n const menuOptions = filter ? filteredOptions : options;\n\n this.updateInputValue(menuOptions[optionIndex].value);\n this.closeMenu();\n this.input.current?.focus();\n }\n\n handleOptionFocus(event: React.FocusEvent<HTMLButtonElement>): void {\n this.setState({ keyboardOptionIndex: Number(event.target.value) });\n }\n\n handleFilterChange(event: React.ChangeEvent<HTMLInputElement>): void {\n const { options } = this.props;\n const filter = event.target.value;\n const filteredOptions = this.getCachedFilteredOptions(options, filter);\n\n this.setState({\n filter,\n filteredOptions,\n keyboardOptionIndex: 0,\n });\n this.popper.current?.scheduleUpdate();\n }\n\n handleMenuBlur(event: React.FocusEvent): void {\n // close if menu blurs, unless its an internal option or the toggleButton which triggers close via click\n if (\n (event.relatedTarget instanceof Element &&\n this.popper.current?.element.contains(event.relatedTarget)) ||\n event.relatedTarget === this.toggleButton.current\n ) {\n return;\n }\n this.closeMenu(false);\n }\n\n handleInputBlur(event: React.FocusEvent<HTMLInputElement>): void {\n // if blur event is caused by focusing on search input or open menu by keyboard, don't close the menu\n const { menuIsOpen } = this.state;\n if (\n menuIsOpen &&\n event.relatedTarget instanceof Element &&\n this.popper.current?.element.contains(event.relatedTarget)\n ) {\n return;\n }\n this.closeMenu(false);\n }\n\n handleMenuOpened(): void {\n this.scrollOptionIntoView();\n this.searchInput.current?.focus();\n }\n\n handleMenuExited(): void {\n const { menuIsOpen } = this.state;\n if (menuIsOpen) {\n this.setState({ menuIsOpen: false });\n this.popper.current?.hide();\n }\n this.setState({ filter: '' });\n }\n\n toggleMenu(event: React.MouseEvent<HTMLButtonElement>): void {\n const { menuIsOpen } = this.state;\n if (menuIsOpen) {\n this.closeMenu();\n } else {\n this.openMenu();\n }\n event.stopPropagation();\n }\n\n openMenu(): void {\n this.updateKeyboardIndex();\n this.setInputWidth();\n this.setState({ menuIsOpen: true });\n\n window.requestAnimationFrame(() => {\n this.popper.current?.show();\n });\n }\n\n closeMenu(focusInput = true): void {\n this.setState({ menuIsOpen: false });\n if (focusInput) {\n this.input.current?.focus();\n }\n this.popper.current?.hide();\n }\n\n updateKeyboardIndex(): void {\n const { value, filter, filteredOptions } = this.state;\n const { options } = this.props;\n const menuOptions = filter ? filteredOptions : options;\n const valueIndex = menuOptions.findIndex(option => option.value === value);\n this.setState({ keyboardOptionIndex: valueIndex });\n }\n\n scrollOptionIntoView(): void {\n const activeOption = this.menuContainer.current?.querySelector(\n '.cb-option-btn.keyboard-active'\n );\n if (activeOption instanceof HTMLElement) {\n activeOption.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n });\n }\n }\n\n renderMenuElement(): JSX.Element {\n const { searchPlaceholder } = this.props;\n const { filter, inputWidth } = this.state;\n return (\n <div\n className=\"cb-menu-container\"\n ref={this.menuContainer}\n role=\"presentation\"\n onKeyDown={this.handleMenuKeyDown}\n onClick={event => {\n event.stopPropagation();\n }}\n style={{ width: inputWidth }}\n onBlur={this.handleMenuBlur}\n >\n <div className=\"cb-search-input-container\">\n <SearchInput\n value={filter}\n ref={this.searchInput}\n onChange={this.handleFilterChange}\n className=\"cb-search-input\"\n placeholder={searchPlaceholder}\n />\n </div>\n <div className=\"cb-options-container\">\n <div className=\"cb-options\">{this.renderOptions()}</div>\n </div>\n </div>\n );\n }\n\n renderOptions(): React.ReactNode {\n const { options } = this.props;\n const { keyboardOptionIndex, filter, filteredOptions } = this.state;\n const menuOptions = filter ? filteredOptions : options;\n\n return menuOptions.map((option, index) => {\n const key = `option-${index}-${option.value}`;\n return (\n <button\n key={key}\n type=\"button\"\n value={index}\n className={classNames('cb-option-btn', {\n 'keyboard-active': keyboardOptionIndex === index,\n })}\n onClick={this.handleOptionClick}\n onFocus={this.handleOptionFocus}\n >\n {option.title}\n </button>\n );\n });\n }\n\n render(): JSX.Element {\n const {\n options,\n inputPlaceholder,\n disabled,\n className,\n defaultValue,\n spellCheck,\n } = this.props;\n const { value } = this.state;\n let { popperOptions } = this.props;\n popperOptions = {\n placement: 'bottom-end',\n modifiers: {\n preventOverflow: { enabled: false },\n },\n ...popperOptions,\n };\n\n return (\n <div className=\"input-group cb-container\" ref={this.cbContainer}>\n <input\n value={value || defaultValue}\n className={classNames('form-control', className, 'cb-input')}\n ref={this.input}\n onChange={this.handleInputChange}\n placeholder={inputPlaceholder || (options[0] && options[0].title)}\n disabled={disabled}\n onBlur={this.handleInputBlur}\n onKeyDown={this.handleInputKeyDown}\n spellCheck={spellCheck}\n />\n <div className=\"input-group-append cb-dropdown\">\n <button\n type=\"button\"\n className=\"btn cb-btn form-control\"\n ref={this.toggleButton}\n onClick={this.toggleMenu}\n onKeyDown={this.handleInputKeyDown}\n disabled={disabled}\n >\n <FontAwesomeIcon icon={vsTriangleDown} />\n <Popper\n ref={this.popper}\n options={popperOptions}\n className={classNames('combobox interactive')}\n onEntered={this.handleMenuOpened}\n onExited={this.handleMenuExited}\n >\n {this.renderMenuElement()}\n </Popper>\n </button>\n </div>\n </div>\n );\n }\n}\n\nexport default ComboBox;\n"],"file":"ComboBox.js"}