@deephaven/components 0.8.2-beta.1 → 0.9.1-beta.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 (42) hide show
  1. package/dist/AutoCompleteInput.js +8 -0
  2. package/dist/AutoCompleteInput.js.map +1 -1
  3. package/dist/ComboBox.js +12 -0
  4. package/dist/ComboBox.js.map +1 -1
  5. package/dist/CustomTimeSelect.js +9 -0
  6. package/dist/CustomTimeSelect.js.map +1 -1
  7. package/dist/DebouncedSearchInput.js +3 -0
  8. package/dist/DebouncedSearchInput.js.map +1 -1
  9. package/dist/DraggableItemList.js +2 -0
  10. package/dist/DraggableItemList.js.map +1 -1
  11. package/dist/ItemList.js +4 -0
  12. package/dist/ItemList.js.map +1 -1
  13. package/dist/ItemListItem.js +3 -0
  14. package/dist/ItemListItem.js.map +1 -1
  15. package/dist/SearchInput.js +3 -0
  16. package/dist/SearchInput.js.map +1 -1
  17. package/dist/SelectValueList.js +6 -0
  18. package/dist/SelectValueList.js.map +1 -1
  19. package/dist/context-actions/ContextActions.js +3 -0
  20. package/dist/context-actions/ContextActions.js.map +1 -1
  21. package/dist/context-actions/ContextMenu.js +13 -0
  22. package/dist/context-actions/ContextMenu.js.map +1 -1
  23. package/dist/context-actions/ContextMenuRoot.js +7 -0
  24. package/dist/context-actions/ContextMenuRoot.js.map +1 -1
  25. package/dist/menu-actions/DropdownMenu.js +9 -0
  26. package/dist/menu-actions/DropdownMenu.js.map +1 -1
  27. package/dist/menu-actions/Menu.js +7 -0
  28. package/dist/menu-actions/Menu.js.map +1 -1
  29. package/dist/popper/Popper.js +9 -0
  30. package/dist/popper/Popper.js.map +1 -1
  31. package/dist/popper/Tooltip.js +9 -0
  32. package/dist/popper/Tooltip.js.map +1 -1
  33. package/dist/shortcuts/Shortcut.d.ts +6 -1
  34. package/dist/shortcuts/Shortcut.d.ts.map +1 -1
  35. package/dist/shortcuts/Shortcut.js +49 -4
  36. package/dist/shortcuts/Shortcut.js.map +1 -1
  37. package/dist/shortcuts/ShortcutRegistry.d.ts +17 -9
  38. package/dist/shortcuts/ShortcutRegistry.d.ts.map +1 -1
  39. package/dist/shortcuts/ShortcutRegistry.js +48 -21
  40. package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
  41. package/package.json +9 -8
  42. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -41,6 +41,14 @@ class AutoCompleteInput extends Component {
41
41
  constructor(props) {
42
42
  super(props);
43
43
 
44
+ _defineProperty(this, "popper", void 0);
45
+
46
+ _defineProperty(this, "cbContainer", void 0);
47
+
48
+ _defineProperty(this, "menuContainer", void 0);
49
+
50
+ _defineProperty(this, "input", void 0);
51
+
44
52
  _defineProperty(this, "getCachedFilteredOptions", memoize((options, input) => options.filter( // supports partial match
45
53
  option => option.title.toLowerCase().indexOf(input.toLowerCase()) >= 0)));
46
54
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/AutoCompleteInput.tsx"],"names":["React","Component","PropTypes","memoize","classNames","debounce","Popper","DEBOUNCE_DELAY","MENU_NAVIGATION_DIRECTION","AutoCompleteInput","constructor","props","options","input","filter","option","title","toLowerCase","indexOf","popperOptions","placement","modifiers","preventOverflow","enabled","state","filteredOptions","keyboardOptionIndex","menuIsOpen","inputWidth","invalid","handleMenuKeyDown","bind","handleMenuBlur","handleInputChange","handleInputKeyDown","handleInputBlur","handelInputFocus","handleInputClick","updateInputValue","handleOptionClick","handleMenuOpened","handleMenuExited","popper","createRef","cbContainer","menuContainer","setInputWidth","current","setState","getBoundingClientRect","width","getValueAndValidate","value","isValid","result","length","processFilterChange","fireOnChange","onChange","getCachedFilteredOptions","perfectMatch","closeMenu","scheduleUpdate","resetValue","handleResize","event","key","stopPropagation","preventDefault","focus","navigateMenu","UP","DOWN","shiftKey","direction","newKeyboardOptionIndex","scrollOptionIntoView","onEnter","openMenu","target","relatedTarget","Element","element","contains","window","requestAnimationFrame","show","focusInput","hide","index","children","item","scrollIntoView","behavior","block","renderMenuElement","renderOptions","noMatchText","map","renderOption","render","inputPlaceholder","disabled","className","defaultTitle","spellCheck","arrayOf","shape","string","isRequired","func","bool"],"mappings":"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","sourcesContent":["/**\n * An Input component that pops and filters auto complete options as you type.\n *\n * props:\n * @param options :[{\n * title: 'option title for display',\n * value: 'option value' //option value\n * }]\n * @param popperOptions options for the Popper\n * @param onChange called when the value is changed from the pulldown\n * @param inputPlaceholder place holder for the input box\n * @param disabled disable both input & drop down\n * @param className an optional class name applied to the input element\n * @param defaultTitle the default title to display\n * @param spellCheck flag to disable spell checking, defaults to true\n * @param onEnter called when the Enter key is typed in the input element\n *\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport memoize from 'memoizee';\nimport classNames from 'classnames';\nimport debounce from 'lodash.debounce';\nimport { PopperOptions } from 'popper.js';\nimport { Popper } from './popper';\n\nimport './AutoCompleteInput.scss';\n\nconst DEBOUNCE_DELAY = 100;\n\nenum MENU_NAVIGATION_DIRECTION {\n UP = 'UP',\n DOWN = 'DOWN',\n}\n\ninterface AutoCompleteOption {\n title: string;\n value: string;\n}\n\ninterface AutoCompleteInputProps {\n options: AutoCompleteOption[];\n popperOptions: PopperOptions;\n onChange(value: string, isValid: boolean): void;\n inputPlaceholder: string;\n disabled: boolean;\n className: string;\n defaultTitle: string;\n spellCheck: boolean;\n onEnter(): void;\n noMatchText: string;\n}\n\ninterface AutoCompleteInputState {\n title: string;\n filteredOptions: AutoCompleteOption[];\n keyboardOptionIndex: number;\n menuIsOpen: boolean;\n inputWidth: number;\n invalid: boolean;\n popperOptions: PopperOptions;\n}\n\nclass AutoCompleteInput extends Component<\n AutoCompleteInputProps,\n AutoCompleteInputState\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 onChange: PropTypes.func,\n inputPlaceholder: PropTypes.string,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n defaultTitle: PropTypes.string,\n spellCheck: PropTypes.bool,\n onEnter: PropTypes.func,\n noMatchText: PropTypes.string,\n };\n\n static defaultProps = {\n onChange(): void {\n // no-op\n },\n inputPlaceholder: '',\n disabled: false,\n className: '',\n defaultTitle: '',\n popperOptions: null,\n spellCheck: true,\n onEnter(): void {\n // no-op\n },\n noMatchText: 'No matching items found',\n };\n\n static MENU_NAVIGATION_DIRECTION = MENU_NAVIGATION_DIRECTION;\n\n constructor(props: AutoCompleteInputProps) {\n super(props);\n\n let { popperOptions } = this.props;\n popperOptions = {\n placement: 'bottom-end',\n modifiers: {\n preventOverflow: { enabled: false },\n },\n ...popperOptions,\n };\n\n this.state = {\n title: '',\n filteredOptions: [],\n keyboardOptionIndex: 0,\n menuIsOpen: false,\n inputWidth: 100,\n invalid: false,\n popperOptions,\n };\n\n this.handleMenuKeyDown = this.handleMenuKeyDown.bind(this);\n this.handleMenuBlur = this.handleMenuBlur.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.handelInputFocus = this.handelInputFocus.bind(this);\n this.handleInputClick = this.handleInputClick.bind(this);\n\n this.updateInputValue = debounce(this.updateInputValue, DEBOUNCE_DELAY);\n\n this.handleOptionClick = this.handleOptionClick.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.menuContainer = React.createRef();\n this.input = React.createRef();\n }\n\n popper: React.RefObject<Popper>;\n\n cbContainer: React.RefObject<HTMLDivElement>;\n\n menuContainer: React.RefObject<HTMLDivElement>;\n\n input: React.RefObject<HTMLInputElement>;\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: AutoCompleteOption[], input: string) =>\n options.filter(\n // supports partial match\n option => option.title.toLowerCase().indexOf(input.toLowerCase()) >= 0\n )\n );\n\n // validation needs to be an exact case-sensitve match on value\n getValueAndValidate(title: string): { value: string; isValid: boolean } {\n if (!title) {\n this.setState({ invalid: false });\n return { value: title, isValid: false };\n }\n\n // validate\n const { options } = this.props;\n const result = options.filter(\n option => option.title.toLowerCase() === title.toLowerCase()\n );\n if (result.length < 1) {\n this.setState({ invalid: true });\n return { value: title, isValid: false };\n }\n\n this.setState({ invalid: false });\n return { value: result[0].value, isValid: true };\n }\n\n // validate typed entries emit change event using value\n updateInputValue(title: string): void {\n const { menuIsOpen } = this.state;\n const { value, isValid } = this.getValueAndValidate(title);\n if (menuIsOpen) this.processFilterChange(title);\n this.fireOnChange(value, isValid);\n }\n\n fireOnChange(value: string, isValid = true): void {\n const { onChange } = this.props;\n onChange(value, isValid);\n }\n\n processFilterChange(filter: string): void {\n const { options } = this.props;\n const { menuIsOpen } = this.state;\n const filteredOptions = filter\n ? this.getCachedFilteredOptions(options, filter)\n : options;\n const perfectMatch =\n filteredOptions.length === 1 && filteredOptions[0].title === filter;\n this.setState({\n filteredOptions,\n keyboardOptionIndex: 0,\n });\n if (perfectMatch && menuIsOpen) {\n this.closeMenu();\n return;\n }\n this.popper.current?.scheduleUpdate(); // filtered options list can change size, may need to be repositioned\n }\n\n resetValue(): void {\n this.setState({ title: '' });\n this.fireOnChange('');\n }\n\n handleResize(): void {\n this.setInputWidth();\n }\n\n handleMenuKeyDown(event: React.KeyboardEvent): void {\n const { filteredOptions, keyboardOptionIndex } = this.state;\n const option = filteredOptions[keyboardOptionIndex];\n\n switch (event.key) {\n case 'Enter':\n case 'ArrowRight':\n event.stopPropagation();\n event.preventDefault();\n if (option) {\n this.setState({ title: option.title, invalid: false });\n this.fireOnChange(option.value);\n }\n this.closeMenu();\n this.input.current?.focus();\n break;\n case 'ArrowUp':\n event.stopPropagation();\n event.preventDefault();\n this.navigateMenu(AutoCompleteInput.MENU_NAVIGATION_DIRECTION.UP);\n break;\n case 'ArrowDown':\n event.stopPropagation();\n event.preventDefault();\n this.navigateMenu(AutoCompleteInput.MENU_NAVIGATION_DIRECTION.DOWN);\n break;\n case 'Tab':\n event.stopPropagation();\n event.preventDefault();\n if (event.shiftKey) {\n this.navigateMenu(AutoCompleteInput.MENU_NAVIGATION_DIRECTION.UP);\n break;\n }\n this.navigateMenu(AutoCompleteInput.MENU_NAVIGATION_DIRECTION.DOWN);\n break;\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n this.closeMenu();\n break;\n default:\n break;\n }\n }\n\n navigateMenu(direction: MENU_NAVIGATION_DIRECTION): void {\n const { filteredOptions, keyboardOptionIndex } = this.state;\n let newKeyboardOptionIndex = keyboardOptionIndex;\n if (direction === AutoCompleteInput.MENU_NAVIGATION_DIRECTION.UP) {\n if (keyboardOptionIndex > 0) {\n newKeyboardOptionIndex =\n (newKeyboardOptionIndex - 1) % filteredOptions.length;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n } else if (keyboardOptionIndex === 0) {\n newKeyboardOptionIndex = filteredOptions.length - 1;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n }\n } else if (direction === AutoCompleteInput.MENU_NAVIGATION_DIRECTION.DOWN) {\n if (keyboardOptionIndex < filteredOptions.length) {\n newKeyboardOptionIndex =\n (newKeyboardOptionIndex + 1) % filteredOptions.length;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n }\n }\n this.scrollOptionIntoView(newKeyboardOptionIndex);\n }\n\n handleInputKeyDown(event: React.KeyboardEvent): void {\n const { onEnter } = this.props;\n const { menuIsOpen } = this.state;\n\n if (menuIsOpen) {\n this.handleMenuKeyDown(event);\n } else if (event.key === 'Enter') {\n onEnter();\n } else if (event.key === 'Escape') {\n this.resetValue();\n event.preventDefault();\n event.stopPropagation();\n } else if (\n !(\n event.key === 'ArrowRight' ||\n event.key === 'ArrowLeft' ||\n event.key === 'Tab' ||\n event.key === 'Shift'\n )\n ) {\n this.openMenu();\n }\n }\n\n handleInputChange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({ title: event.target.value });\n this.updateInputValue(event.target.value);\n }\n\n handleOptionClick(option: AutoCompleteOption): void {\n this.setState({ title: option.title, invalid: false });\n this.fireOnChange(option.value);\n this.closeMenu();\n this.input.current?.focus();\n }\n\n handelInputFocus(): void {\n const { menuIsOpen } = this.state;\n if (!menuIsOpen) {\n this.openMenu();\n }\n }\n\n handleInputClick(): void {\n const { menuIsOpen } = this.state;\n if (!menuIsOpen) {\n this.openMenu();\n }\n }\n\n handleInputBlur(event: React.FocusEvent<HTMLInputElement>): void {\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 handleMenuBlur(event: React.FocusEvent<HTMLDivElement>): void {\n // if blur event is caused by focusing on the input or focus on options don't close menu\n if (\n event.relatedTarget === this.input.current ||\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.input.current?.focus();\n }\n\n handleMenuExited(): void {\n const { menuIsOpen } = this.state;\n if (menuIsOpen) {\n this.setState({ menuIsOpen: false, keyboardOptionIndex: 0 });\n }\n }\n\n openMenu(): void {\n const { title } = this.state;\n this.processFilterChange(title);\n this.setInputWidth();\n this.setState({ menuIsOpen: true });\n\n // https://github.com/reactjs/react-transition-group/issues/382\n window.requestAnimationFrame(() => {\n this.popper.current?.show();\n });\n }\n\n closeMenu(focusInput = true): void {\n this.setState({ menuIsOpen: false, keyboardOptionIndex: 0 });\n if (focusInput) {\n this.input.current?.focus();\n }\n this.popper.current?.hide();\n }\n\n scrollOptionIntoView(index: number): void {\n if (this.menuContainer.current) {\n this.menuContainer.current.children.item(index)?.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }\n }\n\n renderMenuElement(): JSX.Element {\n const { inputWidth } = this.state;\n return (\n <div\n className={classNames('aci-options')}\n ref={this.menuContainer}\n role=\"presentation\"\n onKeyDown={this.handleMenuKeyDown}\n style={{ width: inputWidth }}\n onBlur={this.handleMenuBlur}\n >\n {this.renderOptions()}\n </div>\n );\n }\n\n renderOptions(): React.ReactNode {\n const { noMatchText } = this.props;\n const { title, filteredOptions } = this.state;\n\n if (title && filteredOptions.length === 0) {\n return <div className=\"no-match\">{noMatchText}</div>;\n }\n\n return filteredOptions.map((option, index) =>\n this.renderOption(option, index)\n );\n }\n\n renderOption(option: AutoCompleteOption, index: number): JSX.Element {\n const { keyboardOptionIndex } = this.state;\n const key = `option-${index}-${option.value}`;\n return (\n <button\n key={key}\n type=\"button\"\n className={classNames('aci-option-btn', {\n 'keyboard-active': keyboardOptionIndex === index,\n })}\n onClick={() => this.handleOptionClick(option)}\n onFocus={() => this.setState({ keyboardOptionIndex: index })}\n >\n {option.title}\n </button>\n );\n }\n\n render(): JSX.Element {\n const {\n options,\n inputPlaceholder,\n disabled,\n className,\n defaultTitle,\n spellCheck,\n } = this.props;\n const { title, menuIsOpen, popperOptions, invalid } = this.state;\n\n return (\n <div className=\"aci-container\" ref={this.cbContainer}>\n <input\n value={title || defaultTitle}\n className={classNames('form-control', className, 'aci-input', {\n 'is-invalid': invalid && !menuIsOpen,\n })}\n ref={this.input}\n onChange={this.handleInputChange}\n placeholder={inputPlaceholder || options[0].title}\n disabled={disabled}\n onFocus={this.handelInputFocus}\n onClick={this.handleInputClick}\n onBlur={this.handleInputBlur}\n onKeyDown={this.handleInputKeyDown}\n spellCheck={spellCheck}\n />\n <Popper\n ref={this.popper}\n options={popperOptions}\n className={classNames('aci-options-popper interactive')}\n onEntered={this.handleMenuOpened}\n onExited={this.handleMenuExited}\n >\n {this.renderMenuElement()}\n </Popper>\n </div>\n );\n }\n}\n\nexport default AutoCompleteInput;\n"],"file":"AutoCompleteInput.js"}
1
+ {"version":3,"sources":["../src/AutoCompleteInput.tsx"],"names":["React","Component","PropTypes","memoize","classNames","debounce","Popper","DEBOUNCE_DELAY","MENU_NAVIGATION_DIRECTION","AutoCompleteInput","constructor","props","options","input","filter","option","title","toLowerCase","indexOf","popperOptions","placement","modifiers","preventOverflow","enabled","state","filteredOptions","keyboardOptionIndex","menuIsOpen","inputWidth","invalid","handleMenuKeyDown","bind","handleMenuBlur","handleInputChange","handleInputKeyDown","handleInputBlur","handelInputFocus","handleInputClick","updateInputValue","handleOptionClick","handleMenuOpened","handleMenuExited","popper","createRef","cbContainer","menuContainer","setInputWidth","current","setState","getBoundingClientRect","width","getValueAndValidate","value","isValid","result","length","processFilterChange","fireOnChange","onChange","getCachedFilteredOptions","perfectMatch","closeMenu","scheduleUpdate","resetValue","handleResize","event","key","stopPropagation","preventDefault","focus","navigateMenu","UP","DOWN","shiftKey","direction","newKeyboardOptionIndex","scrollOptionIntoView","onEnter","openMenu","target","relatedTarget","Element","element","contains","window","requestAnimationFrame","show","focusInput","hide","index","children","item","scrollIntoView","behavior","block","renderMenuElement","renderOptions","noMatchText","map","renderOption","render","inputPlaceholder","disabled","className","defaultTitle","spellCheck","arrayOf","shape","string","isRequired","func","bool"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAOA,KAAP,IAAgBC,SAAhB,QAAiC,OAAjC;AACA,OAAOC,SAAP,MAAsB,YAAtB;AACA,OAAOC,OAAP,MAAoB,UAApB;AACA,OAAOC,UAAP,MAAuB,YAAvB;AACA,OAAOC,QAAP,MAAqB,iBAArB;SAESC,M;;AAIT,IAAMC,cAAc,GAAG,GAAvB;IAEKC,yB;;WAAAA,yB;AAAAA,EAAAA,yB;AAAAA,EAAAA,yB;GAAAA,yB,KAAAA,yB;;AAiCL,MAAMC,iBAAN,SAAgCR,SAAhC,CAGE;AAqCAS,EAAAA,WAAW,CAACC,KAAD,EAAgC;AACzC,UAAMA,KAAN;;AADyC;;AAAA;;AAAA;;AAAA;;AAAA,sDA4DhBR,OAAO,CAChC,CAACS,OAAD,EAAgCC,KAAhC,KACED,OAAO,CAACE,MAAR,EACE;AACAC,IAAAA,MAAM,IAAIA,MAAM,CAACC,KAAP,CAAaC,WAAb,GAA2BC,OAA3B,CAAmCL,KAAK,CAACI,WAAN,EAAnC,KAA2D,CAFvE,CAF8B,CA5DS;;AAGzC,QAAI;AAAEE,MAAAA;AAAF,QAAoB,KAAKR,KAA7B;AACAQ,IAAAA,aAAa;AACXC,MAAAA,SAAS,EAAE,YADA;AAEXC,MAAAA,SAAS,EAAE;AACTC,QAAAA,eAAe,EAAE;AAAEC,UAAAA,OAAO,EAAE;AAAX;AADR;AAFA,OAKRJ,aALQ,CAAb;AAQA,SAAKK,KAAL,GAAa;AACXR,MAAAA,KAAK,EAAE,EADI;AAEXS,MAAAA,eAAe,EAAE,EAFN;AAGXC,MAAAA,mBAAmB,EAAE,CAHV;AAIXC,MAAAA,UAAU,EAAE,KAJD;AAKXC,MAAAA,UAAU,EAAE,GALD;AAMXC,MAAAA,OAAO,EAAE,KANE;AAOXV,MAAAA;AAPW,KAAb;AAUA,SAAKW,iBAAL,GAAyB,KAAKA,iBAAL,CAAuBC,IAAvB,CAA4B,IAA5B,CAAzB;AACA,SAAKC,cAAL,GAAsB,KAAKA,cAAL,CAAoBD,IAApB,CAAyB,IAAzB,CAAtB;AAEA,SAAKE,iBAAL,GAAyB,KAAKA,iBAAL,CAAuBF,IAAvB,CAA4B,IAA5B,CAAzB;AACA,SAAKG,kBAAL,GAA0B,KAAKA,kBAAL,CAAwBH,IAAxB,CAA6B,IAA7B,CAA1B;AACA,SAAKI,eAAL,GAAuB,KAAKA,eAAL,CAAqBJ,IAArB,CAA0B,IAA1B,CAAvB;AACA,SAAKK,gBAAL,GAAwB,KAAKA,gBAAL,CAAsBL,IAAtB,CAA2B,IAA3B,CAAxB;AACA,SAAKM,gBAAL,GAAwB,KAAKA,gBAAL,CAAsBN,IAAtB,CAA2B,IAA3B,CAAxB;AAEA,SAAKO,gBAAL,GAAwBjC,QAAQ,CAAC,KAAKiC,gBAAN,EAAwB/B,cAAxB,CAAhC;AAEA,SAAKgC,iBAAL,GAAyB,KAAKA,iBAAL,CAAuBR,IAAvB,CAA4B,IAA5B,CAAzB;AAEA,SAAKS,gBAAL,GAAwB,KAAKA,gBAAL,CAAsBT,IAAtB,CAA2B,IAA3B,CAAxB;AACA,SAAKU,gBAAL,GAAwB,KAAKA,gBAAL,CAAsBV,IAAtB,CAA2B,IAA3B,CAAxB;AAEA,SAAKW,MAAL,gBAAc1C,KAAK,CAAC2C,SAAN,EAAd;AACA,SAAKC,WAAL,gBAAmB5C,KAAK,CAAC2C,SAAN,EAAnB;AACA,SAAKE,aAAL,gBAAqB7C,KAAK,CAAC2C,SAAN,EAArB;AACA,SAAK9B,KAAL,gBAAab,KAAK,CAAC2C,SAAN,EAAb;AACD;;AAUDG,EAAAA,aAAa,GAAS;AACpB,QAAI,KAAKF,WAAL,CAAiBG,OAArB,EAA8B;AAC5B,WAAKC,QAAL,CAAc;AACZpB,QAAAA,UAAU,EAAE,KAAKgB,WAAL,CAAiBG,OAAjB,CAAyBE,qBAAzB,GAAiDC;AADjD,OAAd;AAGD;AACF;;AAUD;AACAC,EAAAA,mBAAmB,CAACnC,KAAD,EAAqD;AACtE,QAAI,CAACA,KAAL,EAAY;AACV,WAAKgC,QAAL,CAAc;AAAEnB,QAAAA,OAAO,EAAE;AAAX,OAAd;AACA,aAAO;AAAEuB,QAAAA,KAAK,EAAEpC,KAAT;AAAgBqC,QAAAA,OAAO,EAAE;AAAzB,OAAP;AACD,KAJqE,CAMtE;;;AACA,QAAM;AAAEzC,MAAAA;AAAF,QAAc,KAAKD,KAAzB;AACA,QAAM2C,MAAM,GAAG1C,OAAO,CAACE,MAAR,CACbC,MAAM,IAAIA,MAAM,CAACC,KAAP,CAAaC,WAAb,OAA+BD,KAAK,CAACC,WAAN,EAD5B,CAAf;;AAGA,QAAIqC,MAAM,CAACC,MAAP,GAAgB,CAApB,EAAuB;AACrB,WAAKP,QAAL,CAAc;AAAEnB,QAAAA,OAAO,EAAE;AAAX,OAAd;AACA,aAAO;AAAEuB,QAAAA,KAAK,EAAEpC,KAAT;AAAgBqC,QAAAA,OAAO,EAAE;AAAzB,OAAP;AACD;;AAED,SAAKL,QAAL,CAAc;AAAEnB,MAAAA,OAAO,EAAE;AAAX,KAAd;AACA,WAAO;AAAEuB,MAAAA,KAAK,EAAEE,MAAM,CAAC,CAAD,CAAN,CAAUF,KAAnB;AAA0BC,MAAAA,OAAO,EAAE;AAAnC,KAAP;AACD,GA5HD,CA8HA;;;AACAf,EAAAA,gBAAgB,CAACtB,KAAD,EAAsB;AACpC,QAAM;AAAEW,MAAAA;AAAF,QAAiB,KAAKH,KAA5B;AACA,QAAM;AAAE4B,MAAAA,KAAF;AAASC,MAAAA;AAAT,QAAqB,KAAKF,mBAAL,CAAyBnC,KAAzB,CAA3B;AACA,QAAIW,UAAJ,EAAgB,KAAK6B,mBAAL,CAAyBxC,KAAzB;AAChB,SAAKyC,YAAL,CAAkBL,KAAlB,EAAyBC,OAAzB;AACD;;AAEDI,EAAAA,YAAY,CAACL,KAAD,EAAsC;AAAA,QAAtBC,OAAsB,uEAAZ,IAAY;AAChD,QAAM;AAAEK,MAAAA;AAAF,QAAe,KAAK/C,KAA1B;AACA+C,IAAAA,QAAQ,CAACN,KAAD,EAAQC,OAAR,CAAR;AACD;;AAEDG,EAAAA,mBAAmB,CAAC1C,MAAD,EAAuB;AAAA;;AACxC,QAAM;AAAEF,MAAAA;AAAF,QAAc,KAAKD,KAAzB;AACA,QAAM;AAAEgB,MAAAA;AAAF,QAAiB,KAAKH,KAA5B;AACA,QAAMC,eAAe,GAAGX,MAAM,GAC1B,KAAK6C,wBAAL,CAA8B/C,OAA9B,EAAuCE,MAAvC,CAD0B,GAE1BF,OAFJ;AAGA,QAAMgD,YAAY,GAChBnC,eAAe,CAAC8B,MAAhB,KAA2B,CAA3B,IAAgC9B,eAAe,CAAC,CAAD,CAAf,CAAmBT,KAAnB,KAA6BF,MAD/D;AAEA,SAAKkC,QAAL,CAAc;AACZvB,MAAAA,eADY;AAEZC,MAAAA,mBAAmB,EAAE;AAFT,KAAd;;AAIA,QAAIkC,YAAY,IAAIjC,UAApB,EAAgC;AAC9B,WAAKkC,SAAL;AACA;AACD;;AACD,iCAAKnB,MAAL,CAAYK,OAAZ,8EAAqBe,cAArB,GAhBwC,CAgBD;AACxC;;AAEDC,EAAAA,UAAU,GAAS;AACjB,SAAKf,QAAL,CAAc;AAAEhC,MAAAA,KAAK,EAAE;AAAT,KAAd;AACA,SAAKyC,YAAL,CAAkB,EAAlB;AACD;;AAEDO,EAAAA,YAAY,GAAS;AACnB,SAAKlB,aAAL;AACD;;AAEDhB,EAAAA,iBAAiB,CAACmC,KAAD,EAAmC;AAAA;;AAClD,QAAM;AAAExC,MAAAA,eAAF;AAAmBC,MAAAA;AAAnB,QAA2C,KAAKF,KAAtD;AACA,QAAMT,MAAM,GAAGU,eAAe,CAACC,mBAAD,CAA9B;;AAEA,YAAQuC,KAAK,CAACC,GAAd;AACE,WAAK,OAAL;AACA,WAAK,YAAL;AACED,QAAAA,KAAK,CAACE,eAAN;AACAF,QAAAA,KAAK,CAACG,cAAN;;AACA,YAAIrD,MAAJ,EAAY;AACV,eAAKiC,QAAL,CAAc;AAAEhC,YAAAA,KAAK,EAAED,MAAM,CAACC,KAAhB;AAAuBa,YAAAA,OAAO,EAAE;AAAhC,WAAd;AACA,eAAK4B,YAAL,CAAkB1C,MAAM,CAACqC,KAAzB;AACD;;AACD,aAAKS,SAAL;AACA,oCAAKhD,KAAL,CAAWkC,OAAX,4EAAoBsB,KAApB;AACA;;AACF,WAAK,SAAL;AACEJ,QAAAA,KAAK,CAACE,eAAN;AACAF,QAAAA,KAAK,CAACG,cAAN;AACA,aAAKE,YAAL,CAAkB7D,iBAAiB,CAACD,yBAAlB,CAA4C+D,EAA9D;AACA;;AACF,WAAK,WAAL;AACEN,QAAAA,KAAK,CAACE,eAAN;AACAF,QAAAA,KAAK,CAACG,cAAN;AACA,aAAKE,YAAL,CAAkB7D,iBAAiB,CAACD,yBAAlB,CAA4CgE,IAA9D;AACA;;AACF,WAAK,KAAL;AACEP,QAAAA,KAAK,CAACE,eAAN;AACAF,QAAAA,KAAK,CAACG,cAAN;;AACA,YAAIH,KAAK,CAACQ,QAAV,EAAoB;AAClB,eAAKH,YAAL,CAAkB7D,iBAAiB,CAACD,yBAAlB,CAA4C+D,EAA9D;AACA;AACD;;AACD,aAAKD,YAAL,CAAkB7D,iBAAiB,CAACD,yBAAlB,CAA4CgE,IAA9D;AACA;;AACF,WAAK,QAAL;AACEP,QAAAA,KAAK,CAACG,cAAN;AACAH,QAAAA,KAAK,CAACE,eAAN;AACA,aAAKN,SAAL;AACA;;AACF;AACE;AArCJ;AAuCD;;AAEDS,EAAAA,YAAY,CAACI,SAAD,EAA6C;AACvD,QAAM;AAAEjD,MAAAA,eAAF;AAAmBC,MAAAA;AAAnB,QAA2C,KAAKF,KAAtD;AACA,QAAImD,sBAAsB,GAAGjD,mBAA7B;;AACA,QAAIgD,SAAS,KAAKjE,iBAAiB,CAACD,yBAAlB,CAA4C+D,EAA9D,EAAkE;AAChE,UAAI7C,mBAAmB,GAAG,CAA1B,EAA6B;AAC3BiD,QAAAA,sBAAsB,GACpB,CAACA,sBAAsB,GAAG,CAA1B,IAA+BlD,eAAe,CAAC8B,MADjD;AAEA,aAAKP,QAAL,CAAc;AACZtB,UAAAA,mBAAmB,EAAEiD;AADT,SAAd;AAGD,OAND,MAMO,IAAIjD,mBAAmB,KAAK,CAA5B,EAA+B;AACpCiD,QAAAA,sBAAsB,GAAGlD,eAAe,CAAC8B,MAAhB,GAAyB,CAAlD;AACA,aAAKP,QAAL,CAAc;AACZtB,UAAAA,mBAAmB,EAAEiD;AADT,SAAd;AAGD;AACF,KAbD,MAaO,IAAID,SAAS,KAAKjE,iBAAiB,CAACD,yBAAlB,CAA4CgE,IAA9D,EAAoE;AACzE,UAAI9C,mBAAmB,GAAGD,eAAe,CAAC8B,MAA1C,EAAkD;AAChDoB,QAAAA,sBAAsB,GACpB,CAACA,sBAAsB,GAAG,CAA1B,IAA+BlD,eAAe,CAAC8B,MADjD;AAEA,aAAKP,QAAL,CAAc;AACZtB,UAAAA,mBAAmB,EAAEiD;AADT,SAAd;AAGD;AACF;;AACD,SAAKC,oBAAL,CAA0BD,sBAA1B;AACD;;AAEDzC,EAAAA,kBAAkB,CAAC+B,KAAD,EAAmC;AACnD,QAAM;AAAEY,MAAAA;AAAF,QAAc,KAAKlE,KAAzB;AACA,QAAM;AAAEgB,MAAAA;AAAF,QAAiB,KAAKH,KAA5B;;AAEA,QAAIG,UAAJ,EAAgB;AACd,WAAKG,iBAAL,CAAuBmC,KAAvB;AACD,KAFD,MAEO,IAAIA,KAAK,CAACC,GAAN,KAAc,OAAlB,EAA2B;AAChCW,MAAAA,OAAO;AACR,KAFM,MAEA,IAAIZ,KAAK,CAACC,GAAN,KAAc,QAAlB,EAA4B;AACjC,WAAKH,UAAL;AACAE,MAAAA,KAAK,CAACG,cAAN;AACAH,MAAAA,KAAK,CAACE,eAAN;AACD,KAJM,MAIA,IACL,EACEF,KAAK,CAACC,GAAN,KAAc,YAAd,IACAD,KAAK,CAACC,GAAN,KAAc,WADd,IAEAD,KAAK,CAACC,GAAN,KAAc,KAFd,IAGAD,KAAK,CAACC,GAAN,KAAc,OAJhB,CADK,EAOL;AACA,WAAKY,QAAL;AACD;AACF;;AAED7C,EAAAA,iBAAiB,CAACgC,KAAD,EAAmD;AAClE,SAAKjB,QAAL,CAAc;AAAEhC,MAAAA,KAAK,EAAEiD,KAAK,CAACc,MAAN,CAAa3B;AAAtB,KAAd;AACA,SAAKd,gBAAL,CAAsB2B,KAAK,CAACc,MAAN,CAAa3B,KAAnC;AACD;;AAEDb,EAAAA,iBAAiB,CAACxB,MAAD,EAAmC;AAAA;;AAClD,SAAKiC,QAAL,CAAc;AAAEhC,MAAAA,KAAK,EAAED,MAAM,CAACC,KAAhB;AAAuBa,MAAAA,OAAO,EAAE;AAAhC,KAAd;AACA,SAAK4B,YAAL,CAAkB1C,MAAM,CAACqC,KAAzB;AACA,SAAKS,SAAL;AACA,iCAAKhD,KAAL,CAAWkC,OAAX,8EAAoBsB,KAApB;AACD;;AAEDjC,EAAAA,gBAAgB,GAAS;AACvB,QAAM;AAAET,MAAAA;AAAF,QAAiB,KAAKH,KAA5B;;AACA,QAAI,CAACG,UAAL,EAAiB;AACf,WAAKmD,QAAL;AACD;AACF;;AAEDzC,EAAAA,gBAAgB,GAAS;AACvB,QAAM;AAAEV,MAAAA;AAAF,QAAiB,KAAKH,KAA5B;;AACA,QAAI,CAACG,UAAL,EAAiB;AACf,WAAKmD,QAAL;AACD;AACF;;AAED3C,EAAAA,eAAe,CAAC8B,KAAD,EAAkD;AAAA;;AAC/D,QAAM;AAAEtC,MAAAA;AAAF,QAAiB,KAAKH,KAA5B;;AACA,QACEG,UAAU,IACVsC,KAAK,CAACe,aAAN,YAA+BC,OAD/B,6BAEA,KAAKvC,MAAL,CAAYK,OAFZ,kDAEA,sBAAqBmC,OAArB,CAA6BC,QAA7B,CAAsClB,KAAK,CAACe,aAA5C,CAHF,EAIE;AACA;AACD;;AACD,SAAKnB,SAAL,CAAe,KAAf;AACD;;AAED7B,EAAAA,cAAc,CAACiC,KAAD,EAAgD;AAAA;;AAC5D;AACA,QACEA,KAAK,CAACe,aAAN,KAAwB,KAAKnE,KAAL,CAAWkC,OAAnC,IACCkB,KAAK,CAACe,aAAN,YAA+BC,OAA/B,6BACC,KAAKvC,MAAL,CAAYK,OADb,kDACC,sBAAqBmC,OAArB,CAA6BC,QAA7B,CAAsClB,KAAK,CAACe,aAA5C,CAHJ,EAIE;AACA;AACD;;AACD,SAAKnB,SAAL,CAAe,KAAf;AACD;;AAEDrB,EAAAA,gBAAgB,GAAS;AAAA;;AACvB,iCAAK3B,KAAL,CAAWkC,OAAX,8EAAoBsB,KAApB;AACD;;AAED5B,EAAAA,gBAAgB,GAAS;AACvB,QAAM;AAAEd,MAAAA;AAAF,QAAiB,KAAKH,KAA5B;;AACA,QAAIG,UAAJ,EAAgB;AACd,WAAKqB,QAAL,CAAc;AAAErB,QAAAA,UAAU,EAAE,KAAd;AAAqBD,QAAAA,mBAAmB,EAAE;AAA1C,OAAd;AACD;AACF;;AAEDoD,EAAAA,QAAQ,GAAS;AACf,QAAM;AAAE9D,MAAAA;AAAF,QAAY,KAAKQ,KAAvB;AACA,SAAKgC,mBAAL,CAAyBxC,KAAzB;AACA,SAAK8B,aAAL;AACA,SAAKE,QAAL,CAAc;AAAErB,MAAAA,UAAU,EAAE;AAAd,KAAd,EAJe,CAMf;;AACAyD,IAAAA,MAAM,CAACC,qBAAP,CAA6B,MAAM;AAAA;;AACjC,oCAAK3C,MAAL,CAAYK,OAAZ,gFAAqBuC,IAArB;AACD,KAFD;AAGD;;AAEDzB,EAAAA,SAAS,GAA0B;AAAA;;AAAA,QAAzB0B,UAAyB,uEAAZ,IAAY;AACjC,SAAKvC,QAAL,CAAc;AAAErB,MAAAA,UAAU,EAAE,KAAd;AAAqBD,MAAAA,mBAAmB,EAAE;AAA1C,KAAd;;AACA,QAAI6D,UAAJ,EAAgB;AAAA;;AACd,mCAAK1E,KAAL,CAAWkC,OAAX,8EAAoBsB,KAApB;AACD;;AACD,kCAAK3B,MAAL,CAAYK,OAAZ,gFAAqByC,IAArB;AACD;;AAEDZ,EAAAA,oBAAoB,CAACa,KAAD,EAAsB;AACxC,QAAI,KAAK5C,aAAL,CAAmBE,OAAvB,EAAgC;AAAA;;AAC9B,oCAAKF,aAAL,CAAmBE,OAAnB,CAA2B2C,QAA3B,CAAoCC,IAApC,CAAyCF,KAAzC,iFAAiDG,cAAjD,CAAgE;AAC9DC,QAAAA,QAAQ,EAAE,QADoD;AAE9DC,QAAAA,KAAK,EAAE;AAFuD,OAAhE;AAID;AACF;;AAEDC,EAAAA,iBAAiB,GAAgB;AAC/B,QAAM;AAAEnE,MAAAA;AAAF,QAAiB,KAAKJ,KAA5B;AACA,wBACE;AACE,MAAA,SAAS,EAAEpB,UAAU,CAAC,aAAD,CADvB;AAEE,MAAA,GAAG,EAAE,KAAKyC,aAFZ;AAGE,MAAA,IAAI,EAAC,cAHP;AAIE,MAAA,SAAS,EAAE,KAAKf,iBAJlB;AAKE,MAAA,KAAK,EAAE;AAAEoB,QAAAA,KAAK,EAAEtB;AAAT,OALT;AAME,MAAA,MAAM,EAAE,KAAKI;AANf,OAQG,KAAKgE,aAAL,EARH,CADF;AAYD;;AAEDA,EAAAA,aAAa,GAAoB;AAC/B,QAAM;AAAEC,MAAAA;AAAF,QAAkB,KAAKtF,KAA7B;AACA,QAAM;AAAEK,MAAAA,KAAF;AAASS,MAAAA;AAAT,QAA6B,KAAKD,KAAxC;;AAEA,QAAIR,KAAK,IAAIS,eAAe,CAAC8B,MAAhB,KAA2B,CAAxC,EAA2C;AACzC,0BAAO;AAAK,QAAA,SAAS,EAAC;AAAf,SAA2B0C,WAA3B,CAAP;AACD;;AAED,WAAOxE,eAAe,CAACyE,GAAhB,CAAoB,CAACnF,MAAD,EAAS0E,KAAT,KACzB,KAAKU,YAAL,CAAkBpF,MAAlB,EAA0B0E,KAA1B,CADK,CAAP;AAGD;;AAEDU,EAAAA,YAAY,CAACpF,MAAD,EAA6B0E,KAA7B,EAAyD;AACnE,QAAM;AAAE/D,MAAAA;AAAF,QAA0B,KAAKF,KAArC;AACA,QAAM0C,GAAG,oBAAauB,KAAb,cAAsB1E,MAAM,CAACqC,KAA7B,CAAT;AACA,wBACE;AACE,MAAA,GAAG,EAAEc,GADP;AAEE,MAAA,IAAI,EAAC,QAFP;AAGE,MAAA,SAAS,EAAE9D,UAAU,CAAC,gBAAD,EAAmB;AACtC,2BAAmBsB,mBAAmB,KAAK+D;AADL,OAAnB,CAHvB;AAME,MAAA,OAAO,EAAE,MAAM,KAAKlD,iBAAL,CAAuBxB,MAAvB,CANjB;AAOE,MAAA,OAAO,EAAE,MAAM,KAAKiC,QAAL,CAAc;AAAEtB,QAAAA,mBAAmB,EAAE+D;AAAvB,OAAd;AAPjB,OASG1E,MAAM,CAACC,KATV,CADF;AAaD;;AAEDoF,EAAAA,MAAM,GAAgB;AACpB,QAAM;AACJxF,MAAAA,OADI;AAEJyF,MAAAA,gBAFI;AAGJC,MAAAA,QAHI;AAIJC,MAAAA,SAJI;AAKJC,MAAAA,YALI;AAMJC,MAAAA;AANI,QAOF,KAAK9F,KAPT;AAQA,QAAM;AAAEK,MAAAA,KAAF;AAASW,MAAAA,UAAT;AAAqBR,MAAAA,aAArB;AAAoCU,MAAAA;AAApC,QAAgD,KAAKL,KAA3D;AAEA,wBACE;AAAK,MAAA,SAAS,EAAC,eAAf;AAA+B,MAAA,GAAG,EAAE,KAAKoB;AAAzC,oBACE;AACE,MAAA,KAAK,EAAE5B,KAAK,IAAIwF,YADlB;AAEE,MAAA,SAAS,EAAEpG,UAAU,CAAC,cAAD,EAAiBmG,SAAjB,EAA4B,WAA5B,EAAyC;AAC5D,sBAAc1E,OAAO,IAAI,CAACF;AADkC,OAAzC,CAFvB;AAKE,MAAA,GAAG,EAAE,KAAKd,KALZ;AAME,MAAA,QAAQ,EAAE,KAAKoB,iBANjB;AAOE,MAAA,WAAW,EAAEoE,gBAAgB,IAAIzF,OAAO,CAAC,CAAD,CAAP,CAAWI,KAP9C;AAQE,MAAA,QAAQ,EAAEsF,QARZ;AASE,MAAA,OAAO,EAAE,KAAKlE,gBAThB;AAUE,MAAA,OAAO,EAAE,KAAKC,gBAVhB;AAWE,MAAA,MAAM,EAAE,KAAKF,eAXf;AAYE,MAAA,SAAS,EAAE,KAAKD,kBAZlB;AAaE,MAAA,UAAU,EAAEuE;AAbd,MADF,eAgBE,oBAAC,MAAD;AACE,MAAA,GAAG,EAAE,KAAK/D,MADZ;AAEE,MAAA,OAAO,EAAEvB,aAFX;AAGE,MAAA,SAAS,EAAEf,UAAU,CAAC,gCAAD,CAHvB;AAIE,MAAA,SAAS,EAAE,KAAKoC,gBAJlB;AAKE,MAAA,QAAQ,EAAE,KAAKC;AALjB,OAOG,KAAKsD,iBAAL,EAPH,CAhBF,CADF;AA4BD;;AAxbD;;gBAHItF,iB,eAIe;AACjBG,EAAAA,OAAO,EAAEV,SAAS,CAACwG,OAAV,CACPxG,SAAS,CAACyG,KAAV,CAAgB;AACd3F,IAAAA,KAAK,EAAEd,SAAS,CAAC0G,MAAV,CAAiBC,UADV;AAEdzD,IAAAA,KAAK,EAAElD,SAAS,CAAC0G,MAAV,CAAiBC;AAFV,GAAhB,CADO,EAKPA,UANe;AAOjB1F,EAAAA,aAAa,EAAEjB,SAAS,CAACyG,KAAV,CAAgB,EAAhB,CAPE;AAQjBjD,EAAAA,QAAQ,EAAExD,SAAS,CAAC4G,IARH;AASjBT,EAAAA,gBAAgB,EAAEnG,SAAS,CAAC0G,MATX;AAUjBN,EAAAA,QAAQ,EAAEpG,SAAS,CAAC6G,IAVH;AAWjBR,EAAAA,SAAS,EAAErG,SAAS,CAAC0G,MAXJ;AAYjBJ,EAAAA,YAAY,EAAEtG,SAAS,CAAC0G,MAZP;AAajBH,EAAAA,UAAU,EAAEvG,SAAS,CAAC6G,IAbL;AAcjBlC,EAAAA,OAAO,EAAE3E,SAAS,CAAC4G,IAdF;AAejBb,EAAAA,WAAW,EAAE/F,SAAS,CAAC0G;AAfN,C;;gBAJfnG,iB,kBAsBkB;AACpBiD,EAAAA,QAAQ,GAAS,CACf;AACD,GAHmB;;AAIpB2C,EAAAA,gBAAgB,EAAE,EAJE;AAKpBC,EAAAA,QAAQ,EAAE,KALU;AAMpBC,EAAAA,SAAS,EAAE,EANS;AAOpBC,EAAAA,YAAY,EAAE,EAPM;AAQpBrF,EAAAA,aAAa,EAAE,IARK;AASpBsF,EAAAA,UAAU,EAAE,IATQ;;AAUpB5B,EAAAA,OAAO,GAAS,CACd;AACD,GAZmB;;AAapBoB,EAAAA,WAAW,EAAE;AAbO,C;;gBAtBlBxF,iB,+BAsC+BD,yB;;AAwZrC,eAAeC,iBAAf","sourcesContent":["/**\n * An Input component that pops and filters auto complete options as you type.\n *\n * props:\n * @param options :[{\n * title: 'option title for display',\n * value: 'option value' //option value\n * }]\n * @param popperOptions options for the Popper\n * @param onChange called when the value is changed from the pulldown\n * @param inputPlaceholder place holder for the input box\n * @param disabled disable both input & drop down\n * @param className an optional class name applied to the input element\n * @param defaultTitle the default title to display\n * @param spellCheck flag to disable spell checking, defaults to true\n * @param onEnter called when the Enter key is typed in the input element\n *\n */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport memoize from 'memoizee';\nimport classNames from 'classnames';\nimport debounce from 'lodash.debounce';\nimport { PopperOptions } from 'popper.js';\nimport { Popper } from './popper';\n\nimport './AutoCompleteInput.scss';\n\nconst DEBOUNCE_DELAY = 100;\n\nenum MENU_NAVIGATION_DIRECTION {\n UP = 'UP',\n DOWN = 'DOWN',\n}\n\ninterface AutoCompleteOption {\n title: string;\n value: string;\n}\n\ninterface AutoCompleteInputProps {\n options: AutoCompleteOption[];\n popperOptions: PopperOptions;\n onChange(value: string, isValid: boolean): void;\n inputPlaceholder: string;\n disabled: boolean;\n className: string;\n defaultTitle: string;\n spellCheck: boolean;\n onEnter(): void;\n noMatchText: string;\n}\n\ninterface AutoCompleteInputState {\n title: string;\n filteredOptions: AutoCompleteOption[];\n keyboardOptionIndex: number;\n menuIsOpen: boolean;\n inputWidth: number;\n invalid: boolean;\n popperOptions: PopperOptions;\n}\n\nclass AutoCompleteInput extends Component<\n AutoCompleteInputProps,\n AutoCompleteInputState\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 onChange: PropTypes.func,\n inputPlaceholder: PropTypes.string,\n disabled: PropTypes.bool,\n className: PropTypes.string,\n defaultTitle: PropTypes.string,\n spellCheck: PropTypes.bool,\n onEnter: PropTypes.func,\n noMatchText: PropTypes.string,\n };\n\n static defaultProps = {\n onChange(): void {\n // no-op\n },\n inputPlaceholder: '',\n disabled: false,\n className: '',\n defaultTitle: '',\n popperOptions: null,\n spellCheck: true,\n onEnter(): void {\n // no-op\n },\n noMatchText: 'No matching items found',\n };\n\n static MENU_NAVIGATION_DIRECTION = MENU_NAVIGATION_DIRECTION;\n\n constructor(props: AutoCompleteInputProps) {\n super(props);\n\n let { popperOptions } = this.props;\n popperOptions = {\n placement: 'bottom-end',\n modifiers: {\n preventOverflow: { enabled: false },\n },\n ...popperOptions,\n };\n\n this.state = {\n title: '',\n filteredOptions: [],\n keyboardOptionIndex: 0,\n menuIsOpen: false,\n inputWidth: 100,\n invalid: false,\n popperOptions,\n };\n\n this.handleMenuKeyDown = this.handleMenuKeyDown.bind(this);\n this.handleMenuBlur = this.handleMenuBlur.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.handelInputFocus = this.handelInputFocus.bind(this);\n this.handleInputClick = this.handleInputClick.bind(this);\n\n this.updateInputValue = debounce(this.updateInputValue, DEBOUNCE_DELAY);\n\n this.handleOptionClick = this.handleOptionClick.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.menuContainer = React.createRef();\n this.input = React.createRef();\n }\n\n popper: React.RefObject<Popper>;\n\n cbContainer: React.RefObject<HTMLDivElement>;\n\n menuContainer: React.RefObject<HTMLDivElement>;\n\n input: React.RefObject<HTMLInputElement>;\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: AutoCompleteOption[], input: string) =>\n options.filter(\n // supports partial match\n option => option.title.toLowerCase().indexOf(input.toLowerCase()) >= 0\n )\n );\n\n // validation needs to be an exact case-sensitve match on value\n getValueAndValidate(title: string): { value: string; isValid: boolean } {\n if (!title) {\n this.setState({ invalid: false });\n return { value: title, isValid: false };\n }\n\n // validate\n const { options } = this.props;\n const result = options.filter(\n option => option.title.toLowerCase() === title.toLowerCase()\n );\n if (result.length < 1) {\n this.setState({ invalid: true });\n return { value: title, isValid: false };\n }\n\n this.setState({ invalid: false });\n return { value: result[0].value, isValid: true };\n }\n\n // validate typed entries emit change event using value\n updateInputValue(title: string): void {\n const { menuIsOpen } = this.state;\n const { value, isValid } = this.getValueAndValidate(title);\n if (menuIsOpen) this.processFilterChange(title);\n this.fireOnChange(value, isValid);\n }\n\n fireOnChange(value: string, isValid = true): void {\n const { onChange } = this.props;\n onChange(value, isValid);\n }\n\n processFilterChange(filter: string): void {\n const { options } = this.props;\n const { menuIsOpen } = this.state;\n const filteredOptions = filter\n ? this.getCachedFilteredOptions(options, filter)\n : options;\n const perfectMatch =\n filteredOptions.length === 1 && filteredOptions[0].title === filter;\n this.setState({\n filteredOptions,\n keyboardOptionIndex: 0,\n });\n if (perfectMatch && menuIsOpen) {\n this.closeMenu();\n return;\n }\n this.popper.current?.scheduleUpdate(); // filtered options list can change size, may need to be repositioned\n }\n\n resetValue(): void {\n this.setState({ title: '' });\n this.fireOnChange('');\n }\n\n handleResize(): void {\n this.setInputWidth();\n }\n\n handleMenuKeyDown(event: React.KeyboardEvent): void {\n const { filteredOptions, keyboardOptionIndex } = this.state;\n const option = filteredOptions[keyboardOptionIndex];\n\n switch (event.key) {\n case 'Enter':\n case 'ArrowRight':\n event.stopPropagation();\n event.preventDefault();\n if (option) {\n this.setState({ title: option.title, invalid: false });\n this.fireOnChange(option.value);\n }\n this.closeMenu();\n this.input.current?.focus();\n break;\n case 'ArrowUp':\n event.stopPropagation();\n event.preventDefault();\n this.navigateMenu(AutoCompleteInput.MENU_NAVIGATION_DIRECTION.UP);\n break;\n case 'ArrowDown':\n event.stopPropagation();\n event.preventDefault();\n this.navigateMenu(AutoCompleteInput.MENU_NAVIGATION_DIRECTION.DOWN);\n break;\n case 'Tab':\n event.stopPropagation();\n event.preventDefault();\n if (event.shiftKey) {\n this.navigateMenu(AutoCompleteInput.MENU_NAVIGATION_DIRECTION.UP);\n break;\n }\n this.navigateMenu(AutoCompleteInput.MENU_NAVIGATION_DIRECTION.DOWN);\n break;\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n this.closeMenu();\n break;\n default:\n break;\n }\n }\n\n navigateMenu(direction: MENU_NAVIGATION_DIRECTION): void {\n const { filteredOptions, keyboardOptionIndex } = this.state;\n let newKeyboardOptionIndex = keyboardOptionIndex;\n if (direction === AutoCompleteInput.MENU_NAVIGATION_DIRECTION.UP) {\n if (keyboardOptionIndex > 0) {\n newKeyboardOptionIndex =\n (newKeyboardOptionIndex - 1) % filteredOptions.length;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n } else if (keyboardOptionIndex === 0) {\n newKeyboardOptionIndex = filteredOptions.length - 1;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n }\n } else if (direction === AutoCompleteInput.MENU_NAVIGATION_DIRECTION.DOWN) {\n if (keyboardOptionIndex < filteredOptions.length) {\n newKeyboardOptionIndex =\n (newKeyboardOptionIndex + 1) % filteredOptions.length;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n }\n }\n this.scrollOptionIntoView(newKeyboardOptionIndex);\n }\n\n handleInputKeyDown(event: React.KeyboardEvent): void {\n const { onEnter } = this.props;\n const { menuIsOpen } = this.state;\n\n if (menuIsOpen) {\n this.handleMenuKeyDown(event);\n } else if (event.key === 'Enter') {\n onEnter();\n } else if (event.key === 'Escape') {\n this.resetValue();\n event.preventDefault();\n event.stopPropagation();\n } else if (\n !(\n event.key === 'ArrowRight' ||\n event.key === 'ArrowLeft' ||\n event.key === 'Tab' ||\n event.key === 'Shift'\n )\n ) {\n this.openMenu();\n }\n }\n\n handleInputChange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({ title: event.target.value });\n this.updateInputValue(event.target.value);\n }\n\n handleOptionClick(option: AutoCompleteOption): void {\n this.setState({ title: option.title, invalid: false });\n this.fireOnChange(option.value);\n this.closeMenu();\n this.input.current?.focus();\n }\n\n handelInputFocus(): void {\n const { menuIsOpen } = this.state;\n if (!menuIsOpen) {\n this.openMenu();\n }\n }\n\n handleInputClick(): void {\n const { menuIsOpen } = this.state;\n if (!menuIsOpen) {\n this.openMenu();\n }\n }\n\n handleInputBlur(event: React.FocusEvent<HTMLInputElement>): void {\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 handleMenuBlur(event: React.FocusEvent<HTMLDivElement>): void {\n // if blur event is caused by focusing on the input or focus on options don't close menu\n if (\n event.relatedTarget === this.input.current ||\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.input.current?.focus();\n }\n\n handleMenuExited(): void {\n const { menuIsOpen } = this.state;\n if (menuIsOpen) {\n this.setState({ menuIsOpen: false, keyboardOptionIndex: 0 });\n }\n }\n\n openMenu(): void {\n const { title } = this.state;\n this.processFilterChange(title);\n this.setInputWidth();\n this.setState({ menuIsOpen: true });\n\n // https://github.com/reactjs/react-transition-group/issues/382\n window.requestAnimationFrame(() => {\n this.popper.current?.show();\n });\n }\n\n closeMenu(focusInput = true): void {\n this.setState({ menuIsOpen: false, keyboardOptionIndex: 0 });\n if (focusInput) {\n this.input.current?.focus();\n }\n this.popper.current?.hide();\n }\n\n scrollOptionIntoView(index: number): void {\n if (this.menuContainer.current) {\n this.menuContainer.current.children.item(index)?.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n });\n }\n }\n\n renderMenuElement(): JSX.Element {\n const { inputWidth } = this.state;\n return (\n <div\n className={classNames('aci-options')}\n ref={this.menuContainer}\n role=\"presentation\"\n onKeyDown={this.handleMenuKeyDown}\n style={{ width: inputWidth }}\n onBlur={this.handleMenuBlur}\n >\n {this.renderOptions()}\n </div>\n );\n }\n\n renderOptions(): React.ReactNode {\n const { noMatchText } = this.props;\n const { title, filteredOptions } = this.state;\n\n if (title && filteredOptions.length === 0) {\n return <div className=\"no-match\">{noMatchText}</div>;\n }\n\n return filteredOptions.map((option, index) =>\n this.renderOption(option, index)\n );\n }\n\n renderOption(option: AutoCompleteOption, index: number): JSX.Element {\n const { keyboardOptionIndex } = this.state;\n const key = `option-${index}-${option.value}`;\n return (\n <button\n key={key}\n type=\"button\"\n className={classNames('aci-option-btn', {\n 'keyboard-active': keyboardOptionIndex === index,\n })}\n onClick={() => this.handleOptionClick(option)}\n onFocus={() => this.setState({ keyboardOptionIndex: index })}\n >\n {option.title}\n </button>\n );\n }\n\n render(): JSX.Element {\n const {\n options,\n inputPlaceholder,\n disabled,\n className,\n defaultTitle,\n spellCheck,\n } = this.props;\n const { title, menuIsOpen, popperOptions, invalid } = this.state;\n\n return (\n <div className=\"aci-container\" ref={this.cbContainer}>\n <input\n value={title || defaultTitle}\n className={classNames('form-control', className, 'aci-input', {\n 'is-invalid': invalid && !menuIsOpen,\n })}\n ref={this.input}\n onChange={this.handleInputChange}\n placeholder={inputPlaceholder || options[0].title}\n disabled={disabled}\n onFocus={this.handelInputFocus}\n onClick={this.handleInputClick}\n onBlur={this.handleInputBlur}\n onKeyDown={this.handleInputKeyDown}\n spellCheck={spellCheck}\n />\n <Popper\n ref={this.popper}\n options={popperOptions}\n className={classNames('aci-options-popper interactive')}\n onEntered={this.handleMenuOpened}\n onExited={this.handleMenuExited}\n >\n {this.renderMenuElement()}\n </Popper>\n </div>\n );\n }\n}\n\nexport default AutoCompleteInput;\n"],"file":"AutoCompleteInput.js"}
package/dist/ComboBox.js CHANGED
@@ -38,6 +38,18 @@ class ComboBox extends Component {
38
38
  constructor(props) {
39
39
  super(props);
40
40
 
41
+ _defineProperty(this, "popper", void 0);
42
+
43
+ _defineProperty(this, "cbContainer", void 0);
44
+
45
+ _defineProperty(this, "toggleButton", void 0);
46
+
47
+ _defineProperty(this, "menuContainer", void 0);
48
+
49
+ _defineProperty(this, "input", void 0);
50
+
51
+ _defineProperty(this, "searchInput", void 0);
52
+
41
53
  _defineProperty(this, "getCachedFilteredOptions", memoize((options, input) => options.filter(option => option.title.toLowerCase().indexOf(input.toLowerCase()) >= 0 || option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0)));
42
54
 
43
55
  this.state = {
@@ -1 +1 @@
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"}
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":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAOA,KAAP,IAAgBC,SAAhB,QAAiC,OAAjC;AACA,OAAOC,SAAP,MAAsB,YAAtB;AACA,SAASC,eAAT,QAAgC,gCAAhC;AACA,SAASC,cAAT,QAA+B,kBAA/B;AACA,OAAOC,OAAP,MAAoB,UAApB;AACA,OAAOC,UAAP,MAAuB,YAAvB;OAEOC,W;SACEC,M;;IA+BJC,yB;;WAAAA,yB;AAAAA,EAAAA,yB;AAAAA,EAAAA,yB;GAAAA,yB,KAAAA,yB;;AAKL,MAAMC,QAAN,SAAuBT,SAAvB,CAA+D;AA0C7DU,EAAAA,WAAW,CAACC,KAAD,EAAuB;AAChC,UAAMA,KAAN;;AADgC;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA,sDA8DPP,OAAO,CAChC,CAACQ,OAAD,EAA4BC,KAA5B,KACED,OAAO,CAACE,MAAR,CACEC,MAAM,IACJA,MAAM,CAACC,KAAP,CAAaC,WAAb,GAA2BC,OAA3B,CAAmCL,KAAK,CAACI,WAAN,EAAnC,KAA2D,CAA3D,IACAF,MAAM,CAACI,KAAP,CAAaF,WAAb,GAA2BC,OAA3B,CAAmCL,KAAK,CAACI,WAAN,EAAnC,KAA2D,CAH/D,CAF8B,CA9DA;;AAEhC,SAAKG,KAAL,GAAa;AACXD,MAAAA,KAAK,EAAE,EADI;AAEXL,MAAAA,MAAM,EAAE,EAFG;AAGXO,MAAAA,eAAe,EAAEV,KAAK,CAACC,OAHZ;AAIXU,MAAAA,mBAAmB,EAAE,CAAC,CAJX;AAKXC,MAAAA,UAAU,EAAE,KALD;AAMXC,MAAAA,UAAU,EAAE;AAND,KAAb;AASA,SAAKC,UAAL,GAAkB,KAAKA,UAAL,CAAgBC,IAAhB,CAAqB,IAArB,CAAlB;AACA,SAAKC,iBAAL,GAAyB,KAAKA,iBAAL,CAAuBD,IAAvB,CAA4B,IAA5B,CAAzB;AACA,SAAKE,cAAL,GAAsB,KAAKA,cAAL,CAAoBF,IAApB,CAAyB,IAAzB,CAAtB;AACA,SAAKG,SAAL,GAAiB,KAAKA,SAAL,CAAeH,IAAf,CAAoB,IAApB,CAAjB;AAEA,SAAKI,iBAAL,GAAyB,KAAKA,iBAAL,CAAuBJ,IAAvB,CAA4B,IAA5B,CAAzB;AACA,SAAKK,kBAAL,GAA0B,KAAKA,kBAAL,CAAwBL,IAAxB,CAA6B,IAA7B,CAA1B;AACA,SAAKM,eAAL,GAAuB,KAAKA,eAAL,CAAqBN,IAArB,CAA0B,IAA1B,CAAvB;AACA,SAAKO,kBAAL,GAA0B,KAAKA,kBAAL,CAAwBP,IAAxB,CAA6B,IAA7B,CAA1B;AAEA,SAAKQ,iBAAL,GAAyB,KAAKA,iBAAL,CAAuBR,IAAvB,CAA4B,IAA5B,CAAzB;AACA,SAAKS,iBAAL,GAAyB,KAAKA,iBAAL,CAAuBT,IAAvB,CAA4B,IAA5B,CAAzB;AAEA,SAAKU,gBAAL,GAAwB,KAAKA,gBAAL,CAAsBV,IAAtB,CAA2B,IAA3B,CAAxB;AACA,SAAKW,gBAAL,GAAwB,KAAKA,gBAAL,CAAsBX,IAAtB,CAA2B,IAA3B,CAAxB;AAEA,SAAKY,MAAL,gBAAcvC,KAAK,CAACwC,SAAN,EAAd;AACA,SAAKC,WAAL,gBAAmBzC,KAAK,CAACwC,SAAN,EAAnB;AACA,SAAKE,YAAL,gBAAoB1C,KAAK,CAACwC,SAAN,EAApB;AACA,SAAKG,aAAL,gBAAqB3C,KAAK,CAACwC,SAAN,EAArB;AACA,SAAK1B,KAAL,gBAAad,KAAK,CAACwC,SAAN,EAAb;AACA,SAAKI,WAAL,gBAAmB5C,KAAK,CAACwC,SAAN,EAAnB;AACD;;AAEDK,EAAAA,kBAAkB,GAAS;AACzB,QAAM;AAAErB,MAAAA,UAAF;AAAcD,MAAAA;AAAd,QAAsC,KAAKF,KAAjD;;AACA,QAAIG,UAAU,IAAID,mBAAmB,IAAI,CAAzC,EAA4C;AAC1C,WAAKuB,oBAAL;AACD;AACF;;AAcDC,EAAAA,aAAa,GAAS;AACpB,QAAI,KAAKN,WAAL,CAAiBO,OAArB,EAA8B;AAC5B,WAAKC,QAAL,CAAc;AACZxB,QAAAA,UAAU,EAAE,KAAKgB,WAAL,CAAiBO,OAAjB,CAAyBE,qBAAzB,GAAiDC;AADjD,OAAd;AAGD;AACF;;AAWDC,EAAAA,KAAK,GAAS;AAAA;;AACZ,gCAAKtC,KAAL,CAAWkC,OAAX,4EAAoBI,KAApB;AACD;;AAEDC,EAAAA,UAAU,GAAS;AACjB,SAAKJ,QAAL,CAAc;AAAE7B,MAAAA,KAAK,EAAE;AAAT,KAAd;AACD;;AAEDkC,EAAAA,gBAAgB,CAAClC,KAAD,EAAsB;AACpC,QAAM;AAAEmC,MAAAA;AAAF,QAAe,KAAK3C,KAA1B;AACA,SAAKqC,QAAL,CAAc;AAAE7B,MAAAA;AAAF,KAAd;AACAmC,IAAAA,QAAQ,CAACnC,KAAD,CAAR;AACD;;AAEDoC,EAAAA,YAAY,GAAS;AACnB,SAAKT,aAAL;AACD;;AAEDnB,EAAAA,iBAAiB,CAAC6B,KAAD,EAAmC;AAAA;;AAClD,QAAM;AAAE1C,MAAAA,MAAF;AAAUO,MAAAA,eAAV;AAA2BC,MAAAA;AAA3B,QAAmD,KAAKF,KAA9D;AACA,QAAM;AAAER,MAAAA;AAAF,QAAc,KAAKD,KAAzB;AACA,QAAM8C,WAAW,GAAG3C,MAAM,GAAGO,eAAH,GAAqBT,OAA/C;;AAEA,YAAQ4C,KAAK,CAACE,GAAd;AACE,WAAK,OAAL;AACE,YAAI,0BAAAD,WAAW,CAACnC,mBAAD,CAAX,gFAAkCH,KAAlC,KAA2C,IAA/C,EAAqD;AACnD,eAAKkC,gBAAL,CAAsBI,WAAW,CAACnC,mBAAD,CAAX,CAAiCH,KAAvD;AACD;;AACD,aAAKU,SAAL;AACA,qCAAKhB,KAAL,CAAWkC,OAAX,8EAAoBI,KAApB;AACAK,QAAAA,KAAK,CAACG,eAAN;AACAH,QAAAA,KAAK,CAACI,cAAN;AACA;;AACF,WAAK,SAAL;AACE,aAAKC,oBAAL,CAA0BpD,QAAQ,CAACD,yBAAT,CAAmCsD,EAA7D;AACAN,QAAAA,KAAK,CAACG,eAAN;AACAH,QAAAA,KAAK,CAACI,cAAN;AACA;;AACF,WAAK,WAAL;AACE,aAAKC,oBAAL,CAA0BpD,QAAQ,CAACD,yBAAT,CAAmCuD,IAA7D;AACAP,QAAAA,KAAK,CAACG,eAAN;AACAH,QAAAA,KAAK,CAACI,cAAN;AACA;;AACF,WAAK,QAAL;AACE,YAAI9C,MAAM,KAAK,EAAf,EAAmB;AACjB,eAAKkC,QAAL,CAAc;AAAElC,YAAAA,MAAM,EAAE;AAAV,WAAd;AACA0C,UAAAA,KAAK,CAACG,eAAN,GAFiB,CAEQ;AAC1B,SAHD,MAGO;AACL,eAAK9B,SAAL;AACD;;AACD;;AACF,WAAK,KAAL;AACE,YAAI,CAAC2B,KAAK,CAACQ,QAAP,IAAmB1C,mBAAmB,KAAKmC,WAAW,CAACQ,MAAZ,GAAqB,CAApE,EAAuE;AACrE,eAAKpC,SAAL;AACD;;AACD;;AACF;AACE;AAlCJ;AAoCD;;AAEDgC,EAAAA,oBAAoB,CAACK,SAAD,EAA6C;AAC/D,QAAM;AAAEpD,MAAAA,MAAF;AAAUO,MAAAA,eAAV;AAA2BC,MAAAA;AAA3B,QAAmD,KAAKF,KAA9D;AACA,QAAM;AAAER,MAAAA;AAAF,QAAc,KAAKD,KAAzB;AACA,QAAM8C,WAAW,GAAG3C,MAAM,GAAGO,eAAH,GAAqBT,OAA/C;AACA,QAAMuD,iBAAiB,GAAGV,WAAW,CAACQ,MAAtC;AACA,QAAIG,KAAK,GAAG,CAAZ;;AACA,YAAQF,SAAR;AACE,WAAKzD,QAAQ,CAACD,yBAAT,CAAmCsD,EAAxC;AACEM,QAAAA,KAAK,GAAG,CAAC,CAAT;AACA;;AACF,WAAK3D,QAAQ,CAACD,yBAAT,CAAmCuD,IAAxC;AACEK,QAAAA,KAAK,GAAG,CAAR;AACA;AANJ;;AASA,QAAIA,KAAK,KAAK,CAAd,EAAiB;AACf,WAAKpB,QAAL,CAAc;AACZ1B,QAAAA,mBAAmB,EACjB,CAACA,mBAAmB,GAAG8C,KAAtB,GAA8BD,iBAA/B,IAAoDA;AAF1C,OAAd;AAID;AACF;;AAEDpC,EAAAA,kBAAkB,CAACyB,KAAD,EAAmC;AACnD,QAAM;AAAEa,MAAAA;AAAF,QAAc,KAAK1D,KAAzB;AACA,QAAM;AAAEY,MAAAA;AAAF,QAAiB,KAAKH,KAA5B;;AACA,QAAIoC,KAAK,CAACE,GAAN,KAAc,WAAd,IAA6BF,KAAK,CAACE,GAAN,KAAc,SAA/C,EAA0D;AACxD,UAAI,CAACnC,UAAL,EAAiB;AACf,aAAK+C,QAAL;AACD;AACF,KAJD,MAIO,IAAId,KAAK,CAACE,GAAN,KAAc,OAAlB,EAA2B;AAChCW,MAAAA,OAAO;AACR;AACF;;AAEDvC,EAAAA,iBAAiB,CAAC0B,KAAD,EAAmD;AAClE,SAAKH,gBAAL,CAAsBG,KAAK,CAACe,MAAN,CAAapD,KAAnC;AACD;;AAEDe,EAAAA,iBAAiB,CAACsB,KAAD,EAAmD;AAAA;;AAClE,QAAMgB,WAAW,GAAGC,MAAM,CAACjB,KAAK,CAACkB,aAAN,CAAoBvD,KAArB,CAA1B;AACA,QAAM;AAAEL,MAAAA,MAAF;AAAUO,MAAAA;AAAV,QAA8B,KAAKD,KAAzC;AACA,QAAM;AAAER,MAAAA;AAAF,QAAc,KAAKD,KAAzB;AACA,QAAM8C,WAAW,GAAG3C,MAAM,GAAGO,eAAH,GAAqBT,OAA/C;AAEA,SAAKyC,gBAAL,CAAsBI,WAAW,CAACe,WAAD,CAAX,CAAyBrD,KAA/C;AACA,SAAKU,SAAL;AACA,iCAAKhB,KAAL,CAAWkC,OAAX,8EAAoBI,KAApB;AACD;;AAEDhB,EAAAA,iBAAiB,CAACqB,KAAD,EAAmD;AAClE,SAAKR,QAAL,CAAc;AAAE1B,MAAAA,mBAAmB,EAAEmD,MAAM,CAACjB,KAAK,CAACe,MAAN,CAAapD,KAAd;AAA7B,KAAd;AACD;;AAEDc,EAAAA,kBAAkB,CAACuB,KAAD,EAAmD;AAAA;;AACnE,QAAM;AAAE5C,MAAAA;AAAF,QAAc,KAAKD,KAAzB;AACA,QAAMG,MAAM,GAAG0C,KAAK,CAACe,MAAN,CAAapD,KAA5B;AACA,QAAME,eAAe,GAAG,KAAKsD,wBAAL,CAA8B/D,OAA9B,EAAuCE,MAAvC,CAAxB;AAEA,SAAKkC,QAAL,CAAc;AACZlC,MAAAA,MADY;AAEZO,MAAAA,eAFY;AAGZC,MAAAA,mBAAmB,EAAE;AAHT,KAAd;AAKA,iCAAKgB,MAAL,CAAYS,OAAZ,8EAAqB6B,cAArB;AACD;;AAEDhD,EAAAA,cAAc,CAAC4B,KAAD,EAAgC;AAAA;;AAC5C;AACA,QACGA,KAAK,CAACqB,aAAN,YAA+BC,OAA/B,6BACC,KAAKxC,MAAL,CAAYS,OADb,kDACC,sBAAqBgC,OAArB,CAA6BC,QAA7B,CAAsCxB,KAAK,CAACqB,aAA5C,CADF,IAEArB,KAAK,CAACqB,aAAN,KAAwB,KAAKpC,YAAL,CAAkBM,OAH5C,EAIE;AACA;AACD;;AACD,SAAKlB,SAAL,CAAe,KAAf;AACD;;AAEDG,EAAAA,eAAe,CAACwB,KAAD,EAAkD;AAAA;;AAC/D;AACA,QAAM;AAAEjC,MAAAA;AAAF,QAAiB,KAAKH,KAA5B;;AACA,QACEG,UAAU,IACViC,KAAK,CAACqB,aAAN,YAA+BC,OAD/B,6BAEA,KAAKxC,MAAL,CAAYS,OAFZ,kDAEA,sBAAqBgC,OAArB,CAA6BC,QAA7B,CAAsCxB,KAAK,CAACqB,aAA5C,CAHF,EAIE;AACA;AACD;;AACD,SAAKhD,SAAL,CAAe,KAAf;AACD;;AAEDO,EAAAA,gBAAgB,GAAS;AAAA;;AACvB,SAAKS,oBAAL;AACA,kCAAKF,WAAL,CAAiBI,OAAjB,gFAA0BI,KAA1B;AACD;;AAEDd,EAAAA,gBAAgB,GAAS;AACvB,QAAM;AAAEd,MAAAA;AAAF,QAAiB,KAAKH,KAA5B;;AACA,QAAIG,UAAJ,EAAgB;AAAA;;AACd,WAAKyB,QAAL,CAAc;AAAEzB,QAAAA,UAAU,EAAE;AAAd,OAAd;AACA,oCAAKe,MAAL,CAAYS,OAAZ,gFAAqBkC,IAArB;AACD;;AACD,SAAKjC,QAAL,CAAc;AAAElC,MAAAA,MAAM,EAAE;AAAV,KAAd;AACD;;AAEDW,EAAAA,UAAU,CAAC+B,KAAD,EAAmD;AAC3D,QAAM;AAAEjC,MAAAA;AAAF,QAAiB,KAAKH,KAA5B;;AACA,QAAIG,UAAJ,EAAgB;AACd,WAAKM,SAAL;AACD,KAFD,MAEO;AACL,WAAKyC,QAAL;AACD;;AACDd,IAAAA,KAAK,CAACG,eAAN;AACD;;AAEDW,EAAAA,QAAQ,GAAS;AACf,SAAKY,mBAAL;AACA,SAAKpC,aAAL;AACA,SAAKE,QAAL,CAAc;AAAEzB,MAAAA,UAAU,EAAE;AAAd,KAAd;AAEA4D,IAAAA,MAAM,CAACC,qBAAP,CAA6B,MAAM;AAAA;;AACjC,oCAAK9C,MAAL,CAAYS,OAAZ,gFAAqBsC,IAArB;AACD,KAFD;AAGD;;AAEDxD,EAAAA,SAAS,GAA0B;AAAA;;AAAA,QAAzByD,UAAyB,uEAAZ,IAAY;AACjC,SAAKtC,QAAL,CAAc;AAAEzB,MAAAA,UAAU,EAAE;AAAd,KAAd;;AACA,QAAI+D,UAAJ,EAAgB;AAAA;;AACd,mCAAKzE,KAAL,CAAWkC,OAAX,8EAAoBI,KAApB;AACD;;AACD,kCAAKb,MAAL,CAAYS,OAAZ,gFAAqBkC,IAArB;AACD;;AAEDC,EAAAA,mBAAmB,GAAS;AAC1B,QAAM;AAAE/D,MAAAA,KAAF;AAASL,MAAAA,MAAT;AAAiBO,MAAAA;AAAjB,QAAqC,KAAKD,KAAhD;AACA,QAAM;AAAER,MAAAA;AAAF,QAAc,KAAKD,KAAzB;AACA,QAAM8C,WAAW,GAAG3C,MAAM,GAAGO,eAAH,GAAqBT,OAA/C;AACA,QAAM2E,UAAU,GAAG9B,WAAW,CAAC+B,SAAZ,CAAsBzE,MAAM,IAAIA,MAAM,CAACI,KAAP,KAAiBA,KAAjD,CAAnB;AACA,SAAK6B,QAAL,CAAc;AAAE1B,MAAAA,mBAAmB,EAAEiE;AAAvB,KAAd;AACD;;AAED1C,EAAAA,oBAAoB,GAAS;AAAA;;AAC3B,QAAM4C,YAAY,4BAAG,KAAK/C,aAAL,CAAmBK,OAAtB,0DAAG,sBAA4B2C,aAA5B,CACnB,gCADmB,CAArB;;AAGA,QAAID,YAAY,YAAYE,WAA5B,EAAyC;AACvCF,MAAAA,YAAY,CAACG,cAAb,CAA4B;AAC1BC,QAAAA,KAAK,EAAE,SADmB;AAE1BC,QAAAA,MAAM,EAAE;AAFkB,OAA5B;AAID;AACF;;AAEDC,EAAAA,iBAAiB,GAAgB;AAC/B,QAAM;AAAEC,MAAAA;AAAF,QAAwB,KAAKrF,KAAnC;AACA,QAAM;AAAEG,MAAAA,MAAF;AAAUU,MAAAA;AAAV,QAAyB,KAAKJ,KAApC;AACA,wBACE;AACE,MAAA,SAAS,EAAC,mBADZ;AAEE,MAAA,GAAG,EAAE,KAAKsB,aAFZ;AAGE,MAAA,IAAI,EAAC,cAHP;AAIE,MAAA,SAAS,EAAE,KAAKf,iBAJlB;AAKE,MAAA,OAAO,EAAE6B,KAAK,IAAI;AAChBA,QAAAA,KAAK,CAACG,eAAN;AACD,OAPH;AAQE,MAAA,KAAK,EAAE;AAAET,QAAAA,KAAK,EAAE1B;AAAT,OART;AASE,MAAA,MAAM,EAAE,KAAKI;AATf,oBAWE;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE,oBAAC,WAAD;AACE,MAAA,KAAK,EAAEd,MADT;AAEE,MAAA,GAAG,EAAE,KAAK6B,WAFZ;AAGE,MAAA,QAAQ,EAAE,KAAKV,kBAHjB;AAIE,MAAA,SAAS,EAAC,iBAJZ;AAKE,MAAA,WAAW,EAAE+D;AALf,MADF,CAXF,eAoBE;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE;AAAK,MAAA,SAAS,EAAC;AAAf,OAA6B,KAAKC,aAAL,EAA7B,CADF,CApBF,CADF;AA0BD;;AAEDA,EAAAA,aAAa,GAAoB;AAC/B,QAAM;AAAErF,MAAAA;AAAF,QAAc,KAAKD,KAAzB;AACA,QAAM;AAAEW,MAAAA,mBAAF;AAAuBR,MAAAA,MAAvB;AAA+BO,MAAAA;AAA/B,QAAmD,KAAKD,KAA9D;AACA,QAAMqC,WAAW,GAAG3C,MAAM,GAAGO,eAAH,GAAqBT,OAA/C;AAEA,WAAO6C,WAAW,CAACyC,GAAZ,CAAgB,CAACnF,MAAD,EAASoF,KAAT,KAAmB;AACxC,UAAMzC,GAAG,oBAAayC,KAAb,cAAsBpF,MAAM,CAACI,KAA7B,CAAT;AACA,0BACE;AACE,QAAA,GAAG,EAAEuC,GADP;AAEE,QAAA,IAAI,EAAC,QAFP;AAGE,QAAA,KAAK,EAAEyC,KAHT;AAIE,QAAA,SAAS,EAAE9F,UAAU,CAAC,eAAD,EAAkB;AACrC,6BAAmBiB,mBAAmB,KAAK6E;AADN,SAAlB,CAJvB;AAOE,QAAA,OAAO,EAAE,KAAKjE,iBAPhB;AAQE,QAAA,OAAO,EAAE,KAAKC;AARhB,SAUGpB,MAAM,CAACC,KAVV,CADF;AAcD,KAhBM,CAAP;AAiBD;;AAEDoF,EAAAA,MAAM,GAAgB;AACpB,QAAM;AACJxF,MAAAA,OADI;AAEJyF,MAAAA,gBAFI;AAGJC,MAAAA,QAHI;AAIJC,MAAAA,SAJI;AAKJC,MAAAA,YALI;AAMJC,MAAAA;AANI,QAOF,KAAK9F,KAPT;AAQA,QAAM;AAAEQ,MAAAA;AAAF,QAAY,KAAKC,KAAvB;AACA,QAAI;AAAEsF,MAAAA;AAAF,QAAoB,KAAK/F,KAA7B;AACA+F,IAAAA,aAAa;AACXC,MAAAA,SAAS,EAAE,YADA;AAEXC,MAAAA,SAAS,EAAE;AACTC,QAAAA,eAAe,EAAE;AAAEC,UAAAA,OAAO,EAAE;AAAX;AADR;AAFA,OAKRJ,aALQ,CAAb;AAQA,wBACE;AAAK,MAAA,SAAS,EAAC,0BAAf;AAA0C,MAAA,GAAG,EAAE,KAAKlE;AAApD,oBACE;AACE,MAAA,KAAK,EAAErB,KAAK,IAAIqF,YADlB;AAEE,MAAA,SAAS,EAAEnG,UAAU,CAAC,cAAD,EAAiBkG,SAAjB,EAA4B,UAA5B,CAFvB;AAGE,MAAA,GAAG,EAAE,KAAK1F,KAHZ;AAIE,MAAA,QAAQ,EAAE,KAAKiB,iBAJjB;AAKE,MAAA,WAAW,EAAEuE,gBAAgB,IAAKzF,OAAO,CAAC,CAAD,CAAP,IAAcA,OAAO,CAAC,CAAD,CAAP,CAAWI,KAL7D;AAME,MAAA,QAAQ,EAAEsF,QANZ;AAOE,MAAA,MAAM,EAAE,KAAKtE,eAPf;AAQE,MAAA,SAAS,EAAE,KAAKD,kBARlB;AASE,MAAA,UAAU,EAAE0E;AATd,MADF,eAYE;AAAK,MAAA,SAAS,EAAC;AAAf,oBACE;AACE,MAAA,IAAI,EAAC,QADP;AAEE,MAAA,SAAS,EAAC,yBAFZ;AAGE,MAAA,GAAG,EAAE,KAAKhE,YAHZ;AAIE,MAAA,OAAO,EAAE,KAAKhB,UAJhB;AAKE,MAAA,SAAS,EAAE,KAAKM,kBALlB;AAME,MAAA,QAAQ,EAAEuE;AANZ,oBAQE,oBAAC,eAAD;AAAiB,MAAA,IAAI,EAAEnG;AAAvB,MARF,eASE,oBAAC,MAAD;AACE,MAAA,GAAG,EAAE,KAAKmC,MADZ;AAEE,MAAA,OAAO,EAAEoE,aAFX;AAGE,MAAA,SAAS,EAAErG,UAAU,CAAC,sBAAD,CAHvB;AAIE,MAAA,SAAS,EAAE,KAAK+B,gBAJlB;AAKE,MAAA,QAAQ,EAAE,KAAKC;AALjB,OAOG,KAAK0D,iBAAL,EAPH,CATF,CADF,CAZF,CADF;AAoCD;;AAtb4D;;gBAAzDtF,Q,+BAC+BD,yB;;gBAD/BC,Q,2BAG2B,G;;gBAH3BA,Q,eAKe;AACjBG,EAAAA,OAAO,EAAEX,SAAS,CAAC8G,OAAV,CACP9G,SAAS,CAAC+G,KAAV,CAAgB;AACdhG,IAAAA,KAAK,EAAEf,SAAS,CAACgH,MAAV,CAAiBC,UADV;AAEd/F,IAAAA,KAAK,EAAElB,SAAS,CAACgH,MAAV,CAAiBC;AAFV,GAAhB,CADO,EAKPA,UANe;AAOjBR,EAAAA,aAAa,EAAEzG,SAAS,CAAC+G,KAAV,CAAgB;AAC7BhG,IAAAA,KAAK,EAAEf,SAAS,CAACgH,MAAV,CAAiBC,UADK;AAE7B/F,IAAAA,KAAK,EAAElB,SAAS,CAACgH,MAAV,CAAiBC;AAFK,GAAhB,CAPE;AAWjB5D,EAAAA,QAAQ,EAAErD,SAAS,CAACkH,IAXH;AAYjBd,EAAAA,gBAAgB,EAAEpG,SAAS,CAACgH,MAZX;AAajBjB,EAAAA,iBAAiB,EAAE/F,SAAS,CAACgH,MAbZ;AAcjBX,EAAAA,QAAQ,EAAErG,SAAS,CAACmH,IAdH;AAejBb,EAAAA,SAAS,EAAEtG,SAAS,CAACgH,MAfJ;AAgBjBT,EAAAA,YAAY,EAAEvG,SAAS,CAACgH,MAhBP;AAiBjBR,EAAAA,UAAU,EAAExG,SAAS,CAACmH,IAjBL;AAkBjB/C,EAAAA,OAAO,EAAEpE,SAAS,CAACkH;AAlBF,C;;gBALf1G,Q,kBA0BkB;AACpB6C,EAAAA,QAAQ,GAAS,CACf;AACD,GAHmB;;AAIpB+C,EAAAA,gBAAgB,EAAE,EAJE;AAKpBL,EAAAA,iBAAiB,EAAE,QALC;AAMpBM,EAAAA,QAAQ,EAAE,KANU;AAOpBC,EAAAA,SAAS,EAAE,EAPS;AAQpBC,EAAAA,YAAY,EAAE,EARM;AASpBE,EAAAA,aAAa,EAAE,IATK;AAUpBD,EAAAA,UAAU,EAAE,IAVQ;;AAWpBpC,EAAAA,OAAO,GAAS,CACd;AACD;;AAbmB,C;;AA+ZxB,eAAe5D,QAAf","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"}
@@ -24,6 +24,15 @@ var MENU_NAVIGATION_DIRECTION;
24
24
  class CustomTimeSelect extends Component {
25
25
  constructor(props) {
26
26
  super(props);
27
+
28
+ _defineProperty(this, "csContainer", void 0);
29
+
30
+ _defineProperty(this, "menuContainer", void 0);
31
+
32
+ _defineProperty(this, "button", void 0);
33
+
34
+ _defineProperty(this, "input", void 0);
35
+
27
36
  var {
28
37
  value,
29
38
  valueToTime
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/CustomTimeSelect.tsx"],"names":["React","Component","FontAwesomeIcon","vsCheck","dhSort","TimeUtils","classNames","TimeInput","DropdownMenu","CUSTOM_OPTION","MENU_NAVIGATION_DIRECTION","CustomTimeSelect","constructor","props","value","valueToTime","toggleMenu","bind","handleMenuKeyDown","closeMenu","handleOptionClick","handleOptionFocus","handleMenuOpened","handleMenuExited","handleCustomInput","csContainer","createRef","menuContainer","button","input","state","keyboardOptionIndex","menuIsOpen","inputWidth","customTime","inputFocused","getSelectedText","options","placeholder","i","length","option","title","formatTime","setInputWidth","current","setState","getBoundingClientRect","width","focus","updateInputValue","onChange","handleResize","event","key","updateFromCustom","stopPropagation","preventDefault","shiftKey","handleMenuNavigation","UP","DOWN","direction","menuOptionsLength","newKeyboardOptionIndex","focusInput","focusOption","scrollOptionIntoView","optionIndex","Number","currentTarget","timeToValue","update","updateAndClose","target","activeOption","querySelector","HTMLElement","valueIndex","map","indexOf","index","children","item","openMenu","updateKeyboardIndex","focusButton","offsetTop","DROP_DOWN_MENU_HEIGHT","scrollTop","renderMenuElement","renderOptions","icon","customText","matchFound","optionArray","push","render","disabled","invalid","popperOptions","placement","modifiers","preventOverflow","enabled","menuElement","maxWidth","Math","round","time"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport { PopperOptions } from 'popper.js';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsCheck, dhSort, IconDefinition } from '@deephaven/icons';\nimport { TimeUtils } from '@deephaven/utils';\nimport classNames from 'classnames';\nimport TimeInput from './TimeInput';\nimport DropdownMenu from './menu-actions/DropdownMenu';\nimport './CustomTimeSelect.scss';\nimport './context-actions/ContextActions.scss';\n\nconst CUSTOM_OPTION = -1;\n\nenum MENU_NAVIGATION_DIRECTION {\n UP = 'UP',\n DOWN = 'DOWN',\n}\n\ntype CustomTimeSelectProps = {\n options: { title: string; value: number }[];\n popperOptions: PopperOptions;\n value: number | null;\n onChange(value: number): void;\n disabled: boolean;\n icon: IconDefinition;\n placeholder: string;\n customText: string;\n // Defaults to converting the value in milliseconds to time in seconds\n valueToTime(val: number | null): number;\n // Defaults to converting the time in seconds to value in milliseconds\n timeToValue(time: number): number;\n invalid: boolean;\n};\n\ntype TimeInSeconds = number;\n\ntype CustomTimeSelectState = {\n keyboardOptionIndex: number;\n menuIsOpen: boolean;\n inputWidth: number;\n customTime: TimeInSeconds;\n inputFocused: boolean;\n};\n\nclass CustomTimeSelect extends Component<\n CustomTimeSelectProps,\n CustomTimeSelectState\n> {\n static MENU_NAVIGATION_DIRECTION = MENU_NAVIGATION_DIRECTION;\n\n static DROP_DOWN_MENU_HEIGHT = 125;\n\n static defaultProps: Partial<CustomTimeSelectProps> = {\n onChange(): void {\n // no-op\n },\n value: null,\n disabled: false,\n popperOptions: {},\n icon: vsCheck,\n customText: 'Custom',\n placeholder: 'Select a time',\n valueToTime: value => (value === null ? 0 : Math.round(value / 1000)),\n timeToValue: time => time * 1000,\n invalid: false,\n };\n\n constructor(props: CustomTimeSelectProps) {\n super(props);\n\n const { value, valueToTime } = props;\n\n this.toggleMenu = this.toggleMenu.bind(this);\n this.handleMenuKeyDown = this.handleMenuKeyDown.bind(this);\n this.closeMenu = this.closeMenu.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 this.handleCustomInput = this.handleCustomInput.bind(this);\n\n this.csContainer = React.createRef();\n this.menuContainer = React.createRef();\n this.button = React.createRef();\n this.input = React.createRef();\n\n this.state = {\n keyboardOptionIndex: 0,\n menuIsOpen: false,\n inputWidth: 100,\n customTime: valueToTime(value),\n inputFocused: false,\n };\n }\n\n csContainer: React.RefObject<HTMLDivElement>;\n\n menuContainer: React.RefObject<HTMLDivElement>;\n\n button: React.RefObject<HTMLButtonElement>;\n\n input: React.RefObject<HTMLInputElement>;\n\n getSelectedText(): string {\n const { options, value, placeholder } = this.props;\n const { customTime } = this.state;\n\n if (value === null) {\n return placeholder;\n }\n\n for (let i = 0; i < options.length; i += 1) {\n const option = options[i];\n if (option.value === value) {\n return option.title;\n }\n }\n\n return TimeUtils.formatTime(customTime);\n }\n\n setInputWidth(): void {\n if (this.csContainer.current) {\n this.setState({\n inputWidth: this.csContainer.current.getBoundingClientRect().width,\n });\n }\n }\n\n focus(): void {\n this.button.current?.focus();\n }\n\n updateInputValue(value: number): void {\n const { onChange } = this.props;\n onChange(value);\n }\n\n handleResize(): void {\n this.setInputWidth();\n }\n\n handleMenuKeyDown(event: React.KeyboardEvent<HTMLDivElement>): void {\n const { keyboardOptionIndex, inputFocused } = this.state;\n const { options } = this.props;\n\n switch (event.key) {\n case 'Enter':\n case ' ': // Space Bar\n if (inputFocused) {\n this.updateFromCustom();\n } else {\n this.updateInputValue(options[keyboardOptionIndex].value);\n }\n this.closeMenu();\n this.button.current?.focus();\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'Tab':\n if (event.shiftKey) {\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.UP\n );\n } else {\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.DOWN\n );\n }\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'ArrowUp':\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.UP\n );\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.DOWN\n );\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'Escape':\n this.closeMenu();\n break;\n default:\n break;\n }\n }\n\n handleMenuNavigation(direction: MENU_NAVIGATION_DIRECTION): void {\n const { keyboardOptionIndex, inputFocused } = this.state;\n const { options } = this.props;\n const menuOptionsLength = options.length;\n let newKeyboardOptionIndex = keyboardOptionIndex;\n switch (direction) {\n case CustomTimeSelect.MENU_NAVIGATION_DIRECTION.UP:\n if (!inputFocused && keyboardOptionIndex === 0) {\n this.focusInput();\n break;\n } else if (inputFocused) {\n this.focusOption(keyboardOptionIndex);\n }\n\n if (keyboardOptionIndex > 0 && !inputFocused) {\n newKeyboardOptionIndex =\n (newKeyboardOptionIndex - 1) % menuOptionsLength;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n } else if (keyboardOptionIndex === 0) {\n newKeyboardOptionIndex = menuOptionsLength - 1;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n }\n this.scrollOptionIntoView(newKeyboardOptionIndex);\n break;\n case CustomTimeSelect.MENU_NAVIGATION_DIRECTION.DOWN:\n if (!inputFocused && keyboardOptionIndex === menuOptionsLength - 1) {\n this.focusInput();\n break;\n } else if (inputFocused) {\n this.focusOption(keyboardOptionIndex);\n }\n\n if (\n keyboardOptionIndex < menuOptionsLength &&\n !(inputFocused && keyboardOptionIndex === 0)\n ) {\n newKeyboardOptionIndex =\n (newKeyboardOptionIndex + 1) % menuOptionsLength;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n }\n this.scrollOptionIntoView(newKeyboardOptionIndex);\n break;\n default:\n break;\n }\n }\n\n handleOptionClick(event: React.MouseEvent<HTMLButtonElement>): void {\n const optionIndex = Number(event.currentTarget.value);\n const { options, timeToValue } = this.props;\n const { customTime } = this.state;\n\n if (optionIndex === CUSTOM_OPTION) {\n const update = timeToValue(customTime);\n this.updateAndClose(update);\n } else {\n this.updateAndClose(options[optionIndex].value);\n }\n }\n\n updateAndClose(update: number): void {\n this.updateInputValue(update);\n this.closeMenu();\n this.button.current?.focus();\n }\n\n handleOptionFocus(event: React.FocusEvent<HTMLButtonElement>): void {\n this.setState({ keyboardOptionIndex: Number(event.target.value) });\n }\n\n handleMenuOpened(): void {\n const { options, value } = this.props;\n const { keyboardOptionIndex } = this.state;\n this.scrollOptionIntoView(keyboardOptionIndex);\n const activeOption = this.menuContainer.current?.querySelector(\n '.cs-option-btn.keyboard-active'\n );\n if (activeOption instanceof HTMLElement) {\n activeOption.focus();\n }\n\n if (value === null) {\n return;\n }\n const valueIndex = options.map(option => option.value).indexOf(value);\n if (valueIndex < 0) {\n // The custom option should be selected\n this.focusInput();\n }\n }\n\n focusInput(): void {\n this.input.current?.focus();\n }\n\n focusOption(index: number): void {\n const options = this.menuContainer.current?.querySelector('.cs-options');\n if (options && options.children) {\n const option = options.children.item(index);\n if (option instanceof HTMLElement) {\n option.focus();\n }\n }\n }\n\n handleMenuExited(): void {\n const { menuIsOpen } = this.state;\n if (menuIsOpen) {\n this.setState({ menuIsOpen: false, keyboardOptionIndex: 0 });\n }\n }\n\n handleCustomInput(value: number): void {\n const { timeToValue } = this.props;\n\n const update = timeToValue(value);\n this.updateInputValue(update);\n this.setState({\n customTime: value,\n });\n }\n\n updateFromCustom(): void {\n const { timeToValue } = this.props;\n const { customTime } = this.state;\n\n const update = timeToValue(customTime);\n this.updateInputValue(update);\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\n closeMenu(focusButton = true): void {\n this.setState({ menuIsOpen: false });\n if (focusButton) {\n this.button.current?.focus();\n }\n }\n\n updateKeyboardIndex(): void {\n const { options, value } = this.props;\n if (value === null) {\n return;\n }\n const valueIndex = options.map(option => option.value).indexOf(value);\n if (valueIndex > 0) {\n this.setState({ keyboardOptionIndex: valueIndex });\n }\n }\n\n scrollOptionIntoView(index: number): void {\n const options = this.menuContainer.current?.querySelector('.cs-options');\n if (options && options.children) {\n const activeOption = options.children.item(index);\n if (\n activeOption instanceof HTMLElement &&\n activeOption.offsetTop > CustomTimeSelect.DROP_DOWN_MENU_HEIGHT\n ) {\n options.scrollTop =\n activeOption.offsetTop - CustomTimeSelect.DROP_DOWN_MENU_HEIGHT;\n } else if (\n (activeOption instanceof HTMLElement && activeOption.offsetTop < 0) ||\n index === 0\n ) {\n options.scrollTop = 0;\n }\n }\n }\n\n renderMenuElement(): JSX.Element {\n const { inputWidth } = this.state;\n return (\n <div\n className=\"cs-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 >\n <div className=\"cs-options-container\">\n <div className=\"cs-options\">{this.renderOptions()}</div>\n </div>\n </div>\n );\n }\n\n renderOptions(): React.ReactNode {\n const { options, value, icon, customText } = this.props;\n const { keyboardOptionIndex, customTime, inputFocused } = this.state;\n\n let matchFound = false;\n const optionArray: JSX.Element[] = [];\n for (let index = 0; index < options.length; index += 1) {\n const option = options[index];\n const key = `option-${index}-${option.value}`;\n matchFound = matchFound || option.value === value;\n optionArray.push(\n <button\n key={key}\n type=\"button\"\n value={index}\n className={classNames('cs-option-btn', {\n 'keyboard-active': keyboardOptionIndex === index && !inputFocused,\n })}\n onClick={this.handleOptionClick}\n onFocus={this.handleOptionFocus}\n >\n {option.value === value && (\n <FontAwesomeIcon icon={icon} className=\"mr-2\" />\n )}\n {option.value !== value && <span className=\"mr-4\" />}\n {option.title}\n </button>\n );\n }\n\n optionArray.push(<hr className=\"cs-divider\" key=\"option-divider\" />);\n\n optionArray.push(\n <button\n key=\"option-custom-label\"\n type=\"button\"\n value={CUSTOM_OPTION}\n className={classNames('cs-option-btn', {\n 'keyboard-active': inputFocused,\n })}\n onClick={this.handleOptionClick}\n onFocus={this.handleOptionFocus}\n >\n {!matchFound && value !== null ? (\n <FontAwesomeIcon icon={icon} className=\"mr-2\" />\n ) : (\n <span className=\"mr-4\" />\n )}\n {customText}\n </button>\n );\n\n optionArray.push(\n <div key=\"cs-custom-container\" className=\"cs-custom-container\">\n <span className=\"mr-2\" />\n <TimeInput\n key=\"option-input\"\n ref={this.input}\n onChange={this.handleCustomInput}\n value={customTime}\n onFocus={() => this.setState({ inputFocused: true })}\n onBlur={() => this.setState({ inputFocused: false })}\n />\n <span className=\"ml-2\" />\n </div>\n );\n\n optionArray.push(<hr key=\"option-end\" className=\"mb-2\" />);\n\n return optionArray;\n }\n\n render(): JSX.Element {\n const { disabled, invalid, value } = this.props;\n const { menuIsOpen } = 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\n className=\"input-group cs-container context-menu\"\n ref={this.csContainer}\n >\n <div\n className={classNames('input-group-append cs-dropdown', {\n 'cs-dropdown-invalid': invalid,\n })}\n >\n <button\n type=\"button\"\n className={classNames('btn cs-btn form-control', {\n 'cs-btn-invalid': invalid,\n })}\n ref={this.button}\n onClick={this.toggleMenu}\n disabled={disabled}\n >\n <span\n className={classNames({\n 'text-muted': value === null,\n })}\n >\n {this.getSelectedText()}\n </span>\n <span>\n <FontAwesomeIcon icon={dhSort} className=\"cs-caret\" />\n </span>\n <DropdownMenu\n isShown={menuIsOpen}\n actions={{ menuElement: this.renderMenuElement() }}\n popperOptions={popperOptions}\n popperClassName=\"CustomTimeSelect\"\n onMenuOpened={this.handleMenuOpened}\n onMenuClosed={this.handleMenuExited}\n menuStyle={{ maxWidth: '100rem' }}\n />\n </button>\n </div>\n </div>\n );\n }\n}\n\nexport default CustomTimeSelect;\n"],"file":"CustomTimeSelect.js"}
1
+ {"version":3,"sources":["../src/CustomTimeSelect.tsx"],"names":["React","Component","FontAwesomeIcon","vsCheck","dhSort","TimeUtils","classNames","TimeInput","DropdownMenu","CUSTOM_OPTION","MENU_NAVIGATION_DIRECTION","CustomTimeSelect","constructor","props","value","valueToTime","toggleMenu","bind","handleMenuKeyDown","closeMenu","handleOptionClick","handleOptionFocus","handleMenuOpened","handleMenuExited","handleCustomInput","csContainer","createRef","menuContainer","button","input","state","keyboardOptionIndex","menuIsOpen","inputWidth","customTime","inputFocused","getSelectedText","options","placeholder","i","length","option","title","formatTime","setInputWidth","current","setState","getBoundingClientRect","width","focus","updateInputValue","onChange","handleResize","event","key","updateFromCustom","stopPropagation","preventDefault","shiftKey","handleMenuNavigation","UP","DOWN","direction","menuOptionsLength","newKeyboardOptionIndex","focusInput","focusOption","scrollOptionIntoView","optionIndex","Number","currentTarget","timeToValue","update","updateAndClose","target","activeOption","querySelector","HTMLElement","valueIndex","map","indexOf","index","children","item","openMenu","updateKeyboardIndex","focusButton","offsetTop","DROP_DOWN_MENU_HEIGHT","scrollTop","renderMenuElement","renderOptions","icon","customText","matchFound","optionArray","push","render","disabled","invalid","popperOptions","placement","modifiers","preventOverflow","enabled","menuElement","maxWidth","Math","round","time"],"mappings":"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","sourcesContent":["import React, { Component } from 'react';\nimport { PopperOptions } from 'popper.js';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsCheck, dhSort, IconDefinition } from '@deephaven/icons';\nimport { TimeUtils } from '@deephaven/utils';\nimport classNames from 'classnames';\nimport TimeInput from './TimeInput';\nimport DropdownMenu from './menu-actions/DropdownMenu';\nimport './CustomTimeSelect.scss';\nimport './context-actions/ContextActions.scss';\n\nconst CUSTOM_OPTION = -1;\n\nenum MENU_NAVIGATION_DIRECTION {\n UP = 'UP',\n DOWN = 'DOWN',\n}\n\ntype CustomTimeSelectProps = {\n options: { title: string; value: number }[];\n popperOptions: PopperOptions;\n value: number | null;\n onChange(value: number): void;\n disabled: boolean;\n icon: IconDefinition;\n placeholder: string;\n customText: string;\n // Defaults to converting the value in milliseconds to time in seconds\n valueToTime(val: number | null): number;\n // Defaults to converting the time in seconds to value in milliseconds\n timeToValue(time: number): number;\n invalid: boolean;\n};\n\ntype TimeInSeconds = number;\n\ntype CustomTimeSelectState = {\n keyboardOptionIndex: number;\n menuIsOpen: boolean;\n inputWidth: number;\n customTime: TimeInSeconds;\n inputFocused: boolean;\n};\n\nclass CustomTimeSelect extends Component<\n CustomTimeSelectProps,\n CustomTimeSelectState\n> {\n static MENU_NAVIGATION_DIRECTION = MENU_NAVIGATION_DIRECTION;\n\n static DROP_DOWN_MENU_HEIGHT = 125;\n\n static defaultProps: Partial<CustomTimeSelectProps> = {\n onChange(): void {\n // no-op\n },\n value: null,\n disabled: false,\n popperOptions: {},\n icon: vsCheck,\n customText: 'Custom',\n placeholder: 'Select a time',\n valueToTime: value => (value === null ? 0 : Math.round(value / 1000)),\n timeToValue: time => time * 1000,\n invalid: false,\n };\n\n constructor(props: CustomTimeSelectProps) {\n super(props);\n\n const { value, valueToTime } = props;\n\n this.toggleMenu = this.toggleMenu.bind(this);\n this.handleMenuKeyDown = this.handleMenuKeyDown.bind(this);\n this.closeMenu = this.closeMenu.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 this.handleCustomInput = this.handleCustomInput.bind(this);\n\n this.csContainer = React.createRef();\n this.menuContainer = React.createRef();\n this.button = React.createRef();\n this.input = React.createRef();\n\n this.state = {\n keyboardOptionIndex: 0,\n menuIsOpen: false,\n inputWidth: 100,\n customTime: valueToTime(value),\n inputFocused: false,\n };\n }\n\n csContainer: React.RefObject<HTMLDivElement>;\n\n menuContainer: React.RefObject<HTMLDivElement>;\n\n button: React.RefObject<HTMLButtonElement>;\n\n input: React.RefObject<HTMLInputElement>;\n\n getSelectedText(): string {\n const { options, value, placeholder } = this.props;\n const { customTime } = this.state;\n\n if (value === null) {\n return placeholder;\n }\n\n for (let i = 0; i < options.length; i += 1) {\n const option = options[i];\n if (option.value === value) {\n return option.title;\n }\n }\n\n return TimeUtils.formatTime(customTime);\n }\n\n setInputWidth(): void {\n if (this.csContainer.current) {\n this.setState({\n inputWidth: this.csContainer.current.getBoundingClientRect().width,\n });\n }\n }\n\n focus(): void {\n this.button.current?.focus();\n }\n\n updateInputValue(value: number): void {\n const { onChange } = this.props;\n onChange(value);\n }\n\n handleResize(): void {\n this.setInputWidth();\n }\n\n handleMenuKeyDown(event: React.KeyboardEvent<HTMLDivElement>): void {\n const { keyboardOptionIndex, inputFocused } = this.state;\n const { options } = this.props;\n\n switch (event.key) {\n case 'Enter':\n case ' ': // Space Bar\n if (inputFocused) {\n this.updateFromCustom();\n } else {\n this.updateInputValue(options[keyboardOptionIndex].value);\n }\n this.closeMenu();\n this.button.current?.focus();\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'Tab':\n if (event.shiftKey) {\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.UP\n );\n } else {\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.DOWN\n );\n }\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'ArrowUp':\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.UP\n );\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'ArrowDown':\n this.handleMenuNavigation(\n CustomTimeSelect.MENU_NAVIGATION_DIRECTION.DOWN\n );\n event.stopPropagation();\n event.preventDefault();\n break;\n case 'Escape':\n this.closeMenu();\n break;\n default:\n break;\n }\n }\n\n handleMenuNavigation(direction: MENU_NAVIGATION_DIRECTION): void {\n const { keyboardOptionIndex, inputFocused } = this.state;\n const { options } = this.props;\n const menuOptionsLength = options.length;\n let newKeyboardOptionIndex = keyboardOptionIndex;\n switch (direction) {\n case CustomTimeSelect.MENU_NAVIGATION_DIRECTION.UP:\n if (!inputFocused && keyboardOptionIndex === 0) {\n this.focusInput();\n break;\n } else if (inputFocused) {\n this.focusOption(keyboardOptionIndex);\n }\n\n if (keyboardOptionIndex > 0 && !inputFocused) {\n newKeyboardOptionIndex =\n (newKeyboardOptionIndex - 1) % menuOptionsLength;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n } else if (keyboardOptionIndex === 0) {\n newKeyboardOptionIndex = menuOptionsLength - 1;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n }\n this.scrollOptionIntoView(newKeyboardOptionIndex);\n break;\n case CustomTimeSelect.MENU_NAVIGATION_DIRECTION.DOWN:\n if (!inputFocused && keyboardOptionIndex === menuOptionsLength - 1) {\n this.focusInput();\n break;\n } else if (inputFocused) {\n this.focusOption(keyboardOptionIndex);\n }\n\n if (\n keyboardOptionIndex < menuOptionsLength &&\n !(inputFocused && keyboardOptionIndex === 0)\n ) {\n newKeyboardOptionIndex =\n (newKeyboardOptionIndex + 1) % menuOptionsLength;\n this.setState({\n keyboardOptionIndex: newKeyboardOptionIndex,\n });\n }\n this.scrollOptionIntoView(newKeyboardOptionIndex);\n break;\n default:\n break;\n }\n }\n\n handleOptionClick(event: React.MouseEvent<HTMLButtonElement>): void {\n const optionIndex = Number(event.currentTarget.value);\n const { options, timeToValue } = this.props;\n const { customTime } = this.state;\n\n if (optionIndex === CUSTOM_OPTION) {\n const update = timeToValue(customTime);\n this.updateAndClose(update);\n } else {\n this.updateAndClose(options[optionIndex].value);\n }\n }\n\n updateAndClose(update: number): void {\n this.updateInputValue(update);\n this.closeMenu();\n this.button.current?.focus();\n }\n\n handleOptionFocus(event: React.FocusEvent<HTMLButtonElement>): void {\n this.setState({ keyboardOptionIndex: Number(event.target.value) });\n }\n\n handleMenuOpened(): void {\n const { options, value } = this.props;\n const { keyboardOptionIndex } = this.state;\n this.scrollOptionIntoView(keyboardOptionIndex);\n const activeOption = this.menuContainer.current?.querySelector(\n '.cs-option-btn.keyboard-active'\n );\n if (activeOption instanceof HTMLElement) {\n activeOption.focus();\n }\n\n if (value === null) {\n return;\n }\n const valueIndex = options.map(option => option.value).indexOf(value);\n if (valueIndex < 0) {\n // The custom option should be selected\n this.focusInput();\n }\n }\n\n focusInput(): void {\n this.input.current?.focus();\n }\n\n focusOption(index: number): void {\n const options = this.menuContainer.current?.querySelector('.cs-options');\n if (options && options.children) {\n const option = options.children.item(index);\n if (option instanceof HTMLElement) {\n option.focus();\n }\n }\n }\n\n handleMenuExited(): void {\n const { menuIsOpen } = this.state;\n if (menuIsOpen) {\n this.setState({ menuIsOpen: false, keyboardOptionIndex: 0 });\n }\n }\n\n handleCustomInput(value: number): void {\n const { timeToValue } = this.props;\n\n const update = timeToValue(value);\n this.updateInputValue(update);\n this.setState({\n customTime: value,\n });\n }\n\n updateFromCustom(): void {\n const { timeToValue } = this.props;\n const { customTime } = this.state;\n\n const update = timeToValue(customTime);\n this.updateInputValue(update);\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\n closeMenu(focusButton = true): void {\n this.setState({ menuIsOpen: false });\n if (focusButton) {\n this.button.current?.focus();\n }\n }\n\n updateKeyboardIndex(): void {\n const { options, value } = this.props;\n if (value === null) {\n return;\n }\n const valueIndex = options.map(option => option.value).indexOf(value);\n if (valueIndex > 0) {\n this.setState({ keyboardOptionIndex: valueIndex });\n }\n }\n\n scrollOptionIntoView(index: number): void {\n const options = this.menuContainer.current?.querySelector('.cs-options');\n if (options && options.children) {\n const activeOption = options.children.item(index);\n if (\n activeOption instanceof HTMLElement &&\n activeOption.offsetTop > CustomTimeSelect.DROP_DOWN_MENU_HEIGHT\n ) {\n options.scrollTop =\n activeOption.offsetTop - CustomTimeSelect.DROP_DOWN_MENU_HEIGHT;\n } else if (\n (activeOption instanceof HTMLElement && activeOption.offsetTop < 0) ||\n index === 0\n ) {\n options.scrollTop = 0;\n }\n }\n }\n\n renderMenuElement(): JSX.Element {\n const { inputWidth } = this.state;\n return (\n <div\n className=\"cs-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 >\n <div className=\"cs-options-container\">\n <div className=\"cs-options\">{this.renderOptions()}</div>\n </div>\n </div>\n );\n }\n\n renderOptions(): React.ReactNode {\n const { options, value, icon, customText } = this.props;\n const { keyboardOptionIndex, customTime, inputFocused } = this.state;\n\n let matchFound = false;\n const optionArray: JSX.Element[] = [];\n for (let index = 0; index < options.length; index += 1) {\n const option = options[index];\n const key = `option-${index}-${option.value}`;\n matchFound = matchFound || option.value === value;\n optionArray.push(\n <button\n key={key}\n type=\"button\"\n value={index}\n className={classNames('cs-option-btn', {\n 'keyboard-active': keyboardOptionIndex === index && !inputFocused,\n })}\n onClick={this.handleOptionClick}\n onFocus={this.handleOptionFocus}\n >\n {option.value === value && (\n <FontAwesomeIcon icon={icon} className=\"mr-2\" />\n )}\n {option.value !== value && <span className=\"mr-4\" />}\n {option.title}\n </button>\n );\n }\n\n optionArray.push(<hr className=\"cs-divider\" key=\"option-divider\" />);\n\n optionArray.push(\n <button\n key=\"option-custom-label\"\n type=\"button\"\n value={CUSTOM_OPTION}\n className={classNames('cs-option-btn', {\n 'keyboard-active': inputFocused,\n })}\n onClick={this.handleOptionClick}\n onFocus={this.handleOptionFocus}\n >\n {!matchFound && value !== null ? (\n <FontAwesomeIcon icon={icon} className=\"mr-2\" />\n ) : (\n <span className=\"mr-4\" />\n )}\n {customText}\n </button>\n );\n\n optionArray.push(\n <div key=\"cs-custom-container\" className=\"cs-custom-container\">\n <span className=\"mr-2\" />\n <TimeInput\n key=\"option-input\"\n ref={this.input}\n onChange={this.handleCustomInput}\n value={customTime}\n onFocus={() => this.setState({ inputFocused: true })}\n onBlur={() => this.setState({ inputFocused: false })}\n />\n <span className=\"ml-2\" />\n </div>\n );\n\n optionArray.push(<hr key=\"option-end\" className=\"mb-2\" />);\n\n return optionArray;\n }\n\n render(): JSX.Element {\n const { disabled, invalid, value } = this.props;\n const { menuIsOpen } = 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\n className=\"input-group cs-container context-menu\"\n ref={this.csContainer}\n >\n <div\n className={classNames('input-group-append cs-dropdown', {\n 'cs-dropdown-invalid': invalid,\n })}\n >\n <button\n type=\"button\"\n className={classNames('btn cs-btn form-control', {\n 'cs-btn-invalid': invalid,\n })}\n ref={this.button}\n onClick={this.toggleMenu}\n disabled={disabled}\n >\n <span\n className={classNames({\n 'text-muted': value === null,\n })}\n >\n {this.getSelectedText()}\n </span>\n <span>\n <FontAwesomeIcon icon={dhSort} className=\"cs-caret\" />\n </span>\n <DropdownMenu\n isShown={menuIsOpen}\n actions={{ menuElement: this.renderMenuElement() }}\n popperOptions={popperOptions}\n popperClassName=\"CustomTimeSelect\"\n onMenuOpened={this.handleMenuOpened}\n onMenuClosed={this.handleMenuExited}\n menuStyle={{ maxWidth: '100rem' }}\n />\n </button>\n </div>\n </div>\n );\n }\n}\n\nexport default CustomTimeSelect;\n"],"file":"CustomTimeSelect.js"}
@@ -7,6 +7,9 @@ import SearchInput from "./SearchInput.js";
7
7
  class DebouncedSearchInput extends PureComponent {
8
8
  constructor(props) {
9
9
  super(props);
10
+
11
+ _defineProperty(this, "searchInput", void 0);
12
+
10
13
  this.searchInput = /*#__PURE__*/React.createRef();
11
14
  this.handleChange = this.handleChange.bind(this);
12
15
  this.sendUpdate = debounce(this.sendUpdate.bind(this), props.debounceMs);
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/DebouncedSearchInput.tsx"],"names":["React","PureComponent","debounce","SearchInput","DebouncedSearchInput","constructor","props","searchInput","createRef","handleChange","bind","sendUpdate","debounceMs","state","value","componentDidUpdate","prevProps","setState","focus","current","event","target","onChange","render","placeholder","className","matchCount","id"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,aAAhB,QAAqC,OAArC;AACA,OAAOC,QAAP,MAAqB,iBAArB;OACOC,W;;AAgBP,MAAMC,oBAAN,SAAmCH,aAAnC,CAGE;AASAI,EAAAA,WAAW,CAACC,KAAD,EAAmC;AAC5C,UAAMA,KAAN;AACA,SAAKC,WAAL,gBAAmBP,KAAK,CAACQ,SAAN,EAAnB;AACA,SAAKC,YAAL,GAAoB,KAAKA,YAAL,CAAkBC,IAAlB,CAAuB,IAAvB,CAApB;AACA,SAAKC,UAAL,GAAkBT,QAAQ,CAAC,KAAKS,UAAL,CAAgBD,IAAhB,CAAqB,IAArB,CAAD,EAA6BJ,KAAK,CAACM,UAAnC,CAA1B;AAEA,SAAKC,KAAL,GAAa;AACXC,MAAAA,KAAK,EAAER,KAAK,CAACQ;AADF,KAAb;AAGD;;AAEDC,EAAAA,kBAAkB,CAACC,SAAD,EAA6C;AAC7D,QAAM;AAAEF,MAAAA;AAAF,QAAY,KAAKR,KAAvB;;AACA,QAAIU,SAAS,CAACF,KAAV,KAAoBA,KAAxB,EAA+B;AAC7B;AACA,WAAKG,QAAL,CAAc;AAAEH,QAAAA;AAAF,OAAd;AACD;AACF;;AAIDI,EAAAA,KAAK,GAAS;AAAA;;AACZ,kCAAKX,WAAL,CAAiBY,OAAjB,gFAA0BD,KAA1B;AACD;;AAEDT,EAAAA,YAAY,CAACW,KAAD,EAAmD;AAC7D,SAAKH,QAAL,CAAc;AAAEH,MAAAA,KAAK,EAAEM,KAAK,CAACC,MAAN,CAAaP;AAAtB,KAAd,EAA6C,KAAKH,UAAlD;AACD;;AAEDA,EAAAA,UAAU,GAAS;AACjB,QAAM;AAAEW,MAAAA;AAAF,QAAe,KAAKhB,KAA1B;AACA,QAAM;AAAEQ,MAAAA;AAAF,QAAY,KAAKD,KAAvB;AACAS,IAAAA,QAAQ,CAACR,KAAD,CAAR;AACD;;AAEDS,EAAAA,MAAM,GAAgB;AACpB,QAAM;AAAEC,MAAAA,WAAF;AAAeC,MAAAA,SAAf;AAA0BC,MAAAA,UAA1B;AAAsCC,MAAAA;AAAtC,QAA6C,KAAKrB,KAAxD;AACA,QAAM;AAAEQ,MAAAA;AAAF,QAAY,KAAKD,KAAvB;AACA,wBACE,oBAAC,WAAD;AACE,MAAA,KAAK,EAAEC,KADT;AAEE,MAAA,WAAW,EAAEU,WAFf;AAGE,MAAA,QAAQ,EAAE,KAAKf,YAHjB;AAIE,MAAA,SAAS,EAAEgB,SAJb;AAKE,MAAA,UAAU,EAAEC,UALd;AAME,MAAA,GAAG,EAAE,KAAKnB,WANZ;AAOE,MAAA,EAAE,EAAEoB;AAPN,MADF;AAWD;;AA1DD;;gBAHIvB,oB,kBAIkB;AACpBoB,EAAAA,WAAW,EAAE,QADO;AAEpBC,EAAAA,SAAS,EAAE,EAFS;AAGpBC,EAAAA,UAAU,EAAE,IAHQ;AAIpBd,EAAAA,UAAU,EAAE,GAJQ;AAKpBe,EAAAA,EAAE,EAAE;AALgB,C;;AA4DxB,eAAevB,oBAAf","sourcesContent":["import React, { PureComponent } from 'react';\nimport debounce from 'lodash.debounce';\nimport SearchInput from './SearchInput';\n\ninterface DebouncedSearchInputProps {\n value: string;\n placeholder: string;\n onChange(value: string): void;\n className: string;\n matchCount: number;\n debounceMs: number;\n id: string;\n}\n\ninterface DebouncedSearchInputState {\n value: string;\n}\n\nclass DebouncedSearchInput extends PureComponent<\n DebouncedSearchInputProps,\n DebouncedSearchInputState\n> {\n static defaultProps = {\n placeholder: 'Search',\n className: '',\n matchCount: null,\n debounceMs: 250,\n id: '',\n };\n\n constructor(props: DebouncedSearchInputProps) {\n super(props);\n this.searchInput = React.createRef();\n this.handleChange = this.handleChange.bind(this);\n this.sendUpdate = debounce(this.sendUpdate.bind(this), props.debounceMs);\n\n this.state = {\n value: props.value,\n };\n }\n\n componentDidUpdate(prevProps: DebouncedSearchInputProps): void {\n const { value } = this.props;\n if (prevProps.value !== value) {\n // eslint-disable-next-line react/no-did-update-set-state\n this.setState({ value });\n }\n }\n\n searchInput: React.RefObject<SearchInput>;\n\n focus(): void {\n this.searchInput.current?.focus();\n }\n\n handleChange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({ value: event.target.value }, this.sendUpdate);\n }\n\n sendUpdate(): void {\n const { onChange } = this.props;\n const { value } = this.state;\n onChange(value);\n }\n\n render(): JSX.Element {\n const { placeholder, className, matchCount, id } = this.props;\n const { value } = this.state;\n return (\n <SearchInput\n value={value}\n placeholder={placeholder}\n onChange={this.handleChange}\n className={className}\n matchCount={matchCount}\n ref={this.searchInput}\n id={id}\n />\n );\n }\n}\n\nexport default DebouncedSearchInput;\n"],"file":"DebouncedSearchInput.js"}
1
+ {"version":3,"sources":["../src/DebouncedSearchInput.tsx"],"names":["React","PureComponent","debounce","SearchInput","DebouncedSearchInput","constructor","props","searchInput","createRef","handleChange","bind","sendUpdate","debounceMs","state","value","componentDidUpdate","prevProps","setState","focus","current","event","target","onChange","render","placeholder","className","matchCount","id"],"mappings":";;AAAA,OAAOA,KAAP,IAAgBC,aAAhB,QAAqC,OAArC;AACA,OAAOC,QAAP,MAAqB,iBAArB;OACOC,W;;AAgBP,MAAMC,oBAAN,SAAmCH,aAAnC,CAGE;AASAI,EAAAA,WAAW,CAACC,KAAD,EAAmC;AAC5C,UAAMA,KAAN;;AAD4C;;AAE5C,SAAKC,WAAL,gBAAmBP,KAAK,CAACQ,SAAN,EAAnB;AACA,SAAKC,YAAL,GAAoB,KAAKA,YAAL,CAAkBC,IAAlB,CAAuB,IAAvB,CAApB;AACA,SAAKC,UAAL,GAAkBT,QAAQ,CAAC,KAAKS,UAAL,CAAgBD,IAAhB,CAAqB,IAArB,CAAD,EAA6BJ,KAAK,CAACM,UAAnC,CAA1B;AAEA,SAAKC,KAAL,GAAa;AACXC,MAAAA,KAAK,EAAER,KAAK,CAACQ;AADF,KAAb;AAGD;;AAEDC,EAAAA,kBAAkB,CAACC,SAAD,EAA6C;AAC7D,QAAM;AAAEF,MAAAA;AAAF,QAAY,KAAKR,KAAvB;;AACA,QAAIU,SAAS,CAACF,KAAV,KAAoBA,KAAxB,EAA+B;AAC7B;AACA,WAAKG,QAAL,CAAc;AAAEH,QAAAA;AAAF,OAAd;AACD;AACF;;AAIDI,EAAAA,KAAK,GAAS;AAAA;;AACZ,kCAAKX,WAAL,CAAiBY,OAAjB,gFAA0BD,KAA1B;AACD;;AAEDT,EAAAA,YAAY,CAACW,KAAD,EAAmD;AAC7D,SAAKH,QAAL,CAAc;AAAEH,MAAAA,KAAK,EAAEM,KAAK,CAACC,MAAN,CAAaP;AAAtB,KAAd,EAA6C,KAAKH,UAAlD;AACD;;AAEDA,EAAAA,UAAU,GAAS;AACjB,QAAM;AAAEW,MAAAA;AAAF,QAAe,KAAKhB,KAA1B;AACA,QAAM;AAAEQ,MAAAA;AAAF,QAAY,KAAKD,KAAvB;AACAS,IAAAA,QAAQ,CAACR,KAAD,CAAR;AACD;;AAEDS,EAAAA,MAAM,GAAgB;AACpB,QAAM;AAAEC,MAAAA,WAAF;AAAeC,MAAAA,SAAf;AAA0BC,MAAAA,UAA1B;AAAsCC,MAAAA;AAAtC,QAA6C,KAAKrB,KAAxD;AACA,QAAM;AAAEQ,MAAAA;AAAF,QAAY,KAAKD,KAAvB;AACA,wBACE,oBAAC,WAAD;AACE,MAAA,KAAK,EAAEC,KADT;AAEE,MAAA,WAAW,EAAEU,WAFf;AAGE,MAAA,QAAQ,EAAE,KAAKf,YAHjB;AAIE,MAAA,SAAS,EAAEgB,SAJb;AAKE,MAAA,UAAU,EAAEC,UALd;AAME,MAAA,GAAG,EAAE,KAAKnB,WANZ;AAOE,MAAA,EAAE,EAAEoB;AAPN,MADF;AAWD;;AA1DD;;gBAHIvB,oB,kBAIkB;AACpBoB,EAAAA,WAAW,EAAE,QADO;AAEpBC,EAAAA,SAAS,EAAE,EAFS;AAGpBC,EAAAA,UAAU,EAAE,IAHQ;AAIpBd,EAAAA,UAAU,EAAE,GAJQ;AAKpBe,EAAAA,EAAE,EAAE;AALgB,C;;AA4DxB,eAAevB,oBAAf","sourcesContent":["import React, { PureComponent } from 'react';\nimport debounce from 'lodash.debounce';\nimport SearchInput from './SearchInput';\n\ninterface DebouncedSearchInputProps {\n value: string;\n placeholder: string;\n onChange(value: string): void;\n className: string;\n matchCount: number;\n debounceMs: number;\n id: string;\n}\n\ninterface DebouncedSearchInputState {\n value: string;\n}\n\nclass DebouncedSearchInput extends PureComponent<\n DebouncedSearchInputProps,\n DebouncedSearchInputState\n> {\n static defaultProps = {\n placeholder: 'Search',\n className: '',\n matchCount: null,\n debounceMs: 250,\n id: '',\n };\n\n constructor(props: DebouncedSearchInputProps) {\n super(props);\n this.searchInput = React.createRef();\n this.handleChange = this.handleChange.bind(this);\n this.sendUpdate = debounce(this.sendUpdate.bind(this), props.debounceMs);\n\n this.state = {\n value: props.value,\n };\n }\n\n componentDidUpdate(prevProps: DebouncedSearchInputProps): void {\n const { value } = this.props;\n if (prevProps.value !== value) {\n // eslint-disable-next-line react/no-did-update-set-state\n this.setState({ value });\n }\n }\n\n searchInput: React.RefObject<SearchInput>;\n\n focus(): void {\n this.searchInput.current?.focus();\n }\n\n handleChange(event: React.ChangeEvent<HTMLInputElement>): void {\n this.setState({ value: event.target.value }, this.sendUpdate);\n }\n\n sendUpdate(): void {\n const { onChange } = this.props;\n const { value } = this.state;\n onChange(value);\n }\n\n render(): JSX.Element {\n const { placeholder, className, matchCount, id } = this.props;\n const { value } = this.state;\n return (\n <SearchInput\n value={value}\n placeholder={placeholder}\n onChange={this.handleChange}\n className={className}\n matchCount={matchCount}\n ref={this.searchInput}\n id={id}\n />\n );\n }\n}\n\nexport default DebouncedSearchInput;\n"],"file":"DebouncedSearchInput.js"}
@@ -78,6 +78,8 @@ class DraggableItemList extends PureComponent {
78
78
  constructor(props) {
79
79
  super(props);
80
80
 
81
+ _defineProperty(this, "itemList", void 0);
82
+
81
83
  _defineProperty(this, "getCachedDraggableItem", memoize((draggablePrefix, renderItem, item, itemIndex, isFocused, isSelected, isDragDisabled, style) => /*#__PURE__*/React.createElement(Draggable, {
82
84
  key: itemIndex,
83
85
  draggableId: DraggableItemList.getDraggableId(draggablePrefix, itemIndex),