@deephaven/components 1.22.1 → 1.22.2-alpha-pivot-builder.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.
- package/dist/AutoCompleteInput.js +41 -79
- package/dist/AutoCompleteInput.js.map +1 -1
- package/dist/AutoResizeTextarea.js +29 -13
- package/dist/AutoResizeTextarea.js.map +1 -1
- package/dist/BasicModal.js +17 -15
- package/dist/BasicModal.js.map +1 -1
- package/dist/BulkActionBar.js +3 -5
- package/dist/BulkActionBar.js.map +1 -1
- package/dist/Button.js +24 -25
- package/dist/Button.js.map +1 -1
- package/dist/CardFlip.js +4 -6
- package/dist/CardFlip.js.map +1 -1
- package/dist/Checkbox.js +22 -13
- package/dist/Checkbox.js.map +1 -1
- package/dist/Collapse.js +6 -9
- package/dist/Collapse.js.map +1 -1
- package/dist/CopyButton.js +14 -6
- package/dist/CopyButton.js.map +1 -1
- package/dist/CustomTimeSelect.js +49 -88
- package/dist/CustomTimeSelect.js.map +1 -1
- package/dist/DateInput.js +25 -10
- package/dist/DateInput.js.map +1 -1
- package/dist/DateInputUtils.js +1 -3
- package/dist/DateInputUtils.js.map +1 -1
- package/dist/DateTimeInput.js +28 -12
- package/dist/DateTimeInput.js.map +1 -1
- package/dist/DebouncedSearchInput.js +10 -19
- package/dist/DebouncedSearchInput.js.map +1 -1
- package/dist/DragUtils.js +15 -6
- package/dist/DragUtils.js.map +1 -1
- package/dist/DraggableItemList.js +42 -57
- package/dist/DraggableItemList.js.map +1 -1
- package/dist/EditableItemList.js +28 -13
- package/dist/EditableItemList.js.map +1 -1
- package/dist/ErrorBoundary.js +6 -11
- package/dist/ErrorBoundary.js.map +1 -1
- package/dist/ErrorView.js +20 -8
- package/dist/ErrorView.js.map +1 -1
- package/dist/HierarchicalCheckboxMenu.js +30 -28
- package/dist/HierarchicalCheckboxMenu.js.map +1 -1
- package/dist/ItemList.js +96 -168
- package/dist/ItemList.js.map +1 -1
- package/dist/ItemListItem.js +46 -60
- package/dist/ItemListItem.js.map +1 -1
- package/dist/LoadingOverlay.js +13 -9
- package/dist/LoadingOverlay.js.map +1 -1
- package/dist/LoadingSpinner.js +3 -4
- package/dist/LoadingSpinner.js.map +1 -1
- package/dist/MaskedInput.js +44 -41
- package/dist/MaskedInput.js.map +1 -1
- package/dist/MaskedInputUtils.js +1 -3
- package/dist/MaskedInputUtils.js.map +1 -1
- package/dist/Option.js +1 -3
- package/dist/Option.js.map +1 -1
- package/dist/RadioGroup.js +17 -9
- package/dist/RadioGroup.js.map +1 -1
- package/dist/RadioItem.js +25 -14
- package/dist/RadioItem.js.map +1 -1
- package/dist/RandomAreaPlotAnimation.js +17 -13
- package/dist/RandomAreaPlotAnimation.js.map +1 -1
- package/dist/SearchInput.js +13 -14
- package/dist/SearchInput.js.map +1 -1
- package/dist/SearchableCombobox.js +3 -5
- package/dist/SearchableCombobox.js.map +1 -1
- package/dist/Select.js +5 -7
- package/dist/Select.js.map +1 -1
- package/dist/SelectValueList.js +21 -30
- package/dist/SelectValueList.js.map +1 -1
- package/dist/SocketedButton.js +18 -17
- package/dist/SocketedButton.js.map +1 -1
- package/dist/SplitButtonGroup.js +4 -6
- package/dist/SplitButtonGroup.js.map +1 -1
- package/dist/TableViewEmptyState.js +14 -6
- package/dist/TableViewEmptyState.js.map +1 -1
- package/dist/TextWithTooltip.js +3 -4
- package/dist/TextWithTooltip.js.map +1 -1
- package/dist/TimeInput.js +29 -12
- package/dist/TimeInput.js.map +1 -1
- package/dist/TimeSlider.js +46 -38
- package/dist/TimeSlider.js.map +1 -1
- package/dist/ToastNotification.js +9 -10
- package/dist/ToastNotification.js.map +1 -1
- package/dist/UISwitch.js +8 -9
- package/dist/UISwitch.js.map +1 -1
- package/dist/actions/ConfirmActionButton.js +7 -9
- package/dist/actions/ConfirmActionButton.js.map +1 -1
- package/dist/actions/IconActionButton.js +3 -5
- package/dist/actions/IconActionButton.js.map +1 -1
- package/dist/context-actions/ContextActionUtils.js +1 -3
- package/dist/context-actions/ContextActionUtils.js.map +1 -1
- package/dist/context-actions/ContextActions.js +8 -18
- package/dist/context-actions/ContextActions.js.map +1 -1
- package/dist/context-actions/ContextMenu.js +53 -89
- package/dist/context-actions/ContextMenu.js.map +1 -1
- package/dist/context-actions/ContextMenuItem.js +11 -11
- package/dist/context-actions/ContextMenuItem.js.map +1 -1
- package/dist/context-actions/ContextMenuRoot.js +6 -11
- package/dist/context-actions/ContextMenuRoot.js.map +1 -1
- package/dist/context-actions/GlobalContextAction.js +2 -6
- package/dist/context-actions/GlobalContextAction.js.map +1 -1
- package/dist/context-actions/GlobalContextActions.js +4 -7
- package/dist/context-actions/GlobalContextActions.js.map +1 -1
- package/dist/dialogs/ActionButtonDialogTrigger.js +7 -9
- package/dist/dialogs/ActionButtonDialogTrigger.js.map +1 -1
- package/dist/dialogs/ConfirmationDialog.js +8 -11
- package/dist/dialogs/ConfirmationDialog.js.map +1 -1
- package/dist/menu-actions/DropdownMenu.js +12 -22
- package/dist/menu-actions/DropdownMenu.js.map +1 -1
- package/dist/menu-actions/Menu.js +19 -45
- package/dist/menu-actions/Menu.js.map +1 -1
- package/dist/modal/DebouncedModal.js +8 -9
- package/dist/modal/DebouncedModal.js.map +1 -1
- package/dist/modal/InfoModal.js +6 -7
- package/dist/modal/InfoModal.js.map +1 -1
- package/dist/modal/Modal.js +27 -15
- package/dist/modal/Modal.js.map +1 -1
- package/dist/modal/ModalBody.js +4 -6
- package/dist/modal/ModalBody.js.map +1 -1
- package/dist/modal/ModalFooter.js +3 -5
- package/dist/modal/ModalFooter.js.map +1 -1
- package/dist/modal/ModalHeader.js +7 -8
- package/dist/modal/ModalHeader.js.map +1 -1
- package/dist/navigation/DashboardList.js +17 -6
- package/dist/navigation/DashboardList.js.map +1 -1
- package/dist/navigation/Menu.js +4 -5
- package/dist/navigation/Menu.js.map +1 -1
- package/dist/navigation/MenuItem.js +7 -10
- package/dist/navigation/MenuItem.js.map +1 -1
- package/dist/navigation/NavTab.js +14 -17
- package/dist/navigation/NavTab.js.map +1 -1
- package/dist/navigation/NavTabList.js +39 -33
- package/dist/navigation/NavTabList.js.map +1 -1
- package/dist/navigation/Page.js +5 -7
- package/dist/navigation/Page.js.map +1 -1
- package/dist/navigation/Stack.js +20 -7
- package/dist/navigation/Stack.js.map +1 -1
- package/dist/popper/Popper.js +30 -57
- package/dist/popper/Popper.js.map +1 -1
- package/dist/popper/Tooltip.js +24 -54
- package/dist/popper/Tooltip.js.map +1 -1
- package/dist/shortcuts/Shortcut.js +10 -15
- package/dist/shortcuts/Shortcut.js.map +1 -1
- package/dist/shortcuts/ShortcutRegistry.js +1 -3
- package/dist/shortcuts/ShortcutRegistry.js.map +1 -1
- package/dist/spectrum/ActionGroup.js +7 -9
- package/dist/spectrum/ActionGroup.js.map +1 -1
- package/dist/spectrum/ActionMenu.js +3 -5
- package/dist/spectrum/ActionMenu.js.map +1 -1
- package/dist/spectrum/CheckboxGroup.js +1 -3
- package/dist/spectrum/CheckboxGroup.js.map +1 -1
- package/dist/spectrum/Heading.js +2 -4
- package/dist/spectrum/Heading.js.map +1 -1
- package/dist/spectrum/ItemContent.js +16 -10
- package/dist/spectrum/ItemContent.js.map +1 -1
- package/dist/spectrum/ItemTooltip.js +2 -4
- package/dist/spectrum/ItemTooltip.js.map +1 -1
- package/dist/spectrum/TabPanels.js +3 -4
- package/dist/spectrum/TabPanels.js.map +1 -1
- package/dist/spectrum/Text.js +2 -4
- package/dist/spectrum/Text.js.map +1 -1
- package/dist/spectrum/View.js +11 -14
- package/dist/spectrum/View.js.map +1 -1
- package/dist/spectrum/comboBox/ComboBox.js +5 -9
- package/dist/spectrum/comboBox/ComboBox.js.map +1 -1
- package/dist/spectrum/comboBox/ComboBoxNormalized.js +3 -7
- package/dist/spectrum/comboBox/ComboBoxNormalized.js.map +1 -1
- package/dist/spectrum/listView/ListView.js +11 -11
- package/dist/spectrum/listView/ListView.js.map +1 -1
- package/dist/spectrum/listView/ListViewNormalized.js +22 -24
- package/dist/spectrum/listView/ListViewNormalized.js.map +1 -1
- package/dist/spectrum/listView/ListViewWrapper.js +11 -15
- package/dist/spectrum/listView/ListViewWrapper.js.map +1 -1
- package/dist/spectrum/multiSelect/MultiSelect.js +113 -100
- package/dist/spectrum/multiSelect/MultiSelect.js.map +1 -1
- package/dist/spectrum/multiSelect/MultiSelectListBox.js +9 -11
- package/dist/spectrum/multiSelect/MultiSelectListBox.js.map +1 -1
- package/dist/spectrum/multiSelect/MultiSelectNormalized.js +3 -7
- package/dist/spectrum/multiSelect/MultiSelectNormalized.js.map +1 -1
- package/dist/spectrum/multiSelect/MultiSelectTag.js +5 -7
- package/dist/spectrum/multiSelect/MultiSelectTag.js.map +1 -1
- package/dist/spectrum/multiSelect/useMultiSelectFilter.js +20 -14
- package/dist/spectrum/multiSelect/useMultiSelectFilter.js.map +1 -1
- package/dist/spectrum/multiSelect/useMultiSelectKeyboard.js +27 -20
- package/dist/spectrum/multiSelect/useMultiSelectKeyboard.js.map +1 -1
- package/dist/spectrum/multiSelect/useMultiSelectLoadingSpinner.js +14 -7
- package/dist/spectrum/multiSelect/useMultiSelectLoadingSpinner.js.map +1 -1
- package/dist/spectrum/multiSelect/useMultiSelectNormalizedProps.js +20 -22
- package/dist/spectrum/multiSelect/useMultiSelectNormalizedProps.js.map +1 -1
- package/dist/spectrum/multiSelect/useMultiSelectScrollListener.js +13 -6
- package/dist/spectrum/multiSelect/useMultiSelectScrollListener.js.map +1 -1
- package/dist/spectrum/multiSelect/useMultiSelectState.js +16 -9
- package/dist/spectrum/multiSelect/useMultiSelectState.js.map +1 -1
- package/dist/spectrum/picker/Picker.js +5 -9
- package/dist/spectrum/picker/Picker.js.map +1 -1
- package/dist/spectrum/picker/PickerNormalized.js +2 -6
- package/dist/spectrum/picker/PickerNormalized.js.map +1 -1
- package/dist/spectrum/picker/usePickerItemScale.js +2 -3
- package/dist/spectrum/picker/usePickerItemScale.js.map +1 -1
- package/dist/spectrum/picker/usePickerNormalizedProps.js +31 -33
- package/dist/spectrum/picker/usePickerNormalizedProps.js.map +1 -1
- package/dist/spectrum/picker/usePickerProps.js +26 -29
- package/dist/spectrum/picker/usePickerProps.js.map +1 -1
- package/dist/spectrum/picker/usePickerScrollOnOpen.js +6 -9
- package/dist/spectrum/picker/usePickerScrollOnOpen.js.map +1 -1
- package/dist/spectrum/utils/itemUtils.js +4 -6
- package/dist/spectrum/utils/itemUtils.js.map +1 -1
- package/dist/spectrum/utils/propsUtils.js +35 -37
- package/dist/spectrum/utils/propsUtils.js.map +1 -1
- package/dist/spectrum/utils/themeUtils.js +5 -7
- package/dist/spectrum/utils/themeUtils.js.map +1 -1
- package/dist/spectrum/utils/useOnChangeTrackUncontrolled.js +13 -6
- package/dist/spectrum/utils/useOnChangeTrackUncontrolled.js.map +1 -1
- package/dist/spectrum/utils/useRenderNormalizedItem.js +5 -7
- package/dist/spectrum/utils/useRenderNormalizedItem.js.map +1 -1
- package/dist/spectrum/utils/useStaticItemInitialScrollPosition.js +4 -6
- package/dist/spectrum/utils/useStaticItemInitialScrollPosition.js.map +1 -1
- package/dist/spectrum/utils/useStringifiedMultiSelection.js +5 -7
- package/dist/spectrum/utils/useStringifiedMultiSelection.js.map +1 -1
- package/dist/spectrum/utils/useStringifiedSelection.js +5 -7
- package/dist/spectrum/utils/useStringifiedSelection.js.map +1 -1
- package/dist/theme/FontBootstrap.js +13 -5
- package/dist/theme/FontBootstrap.js.map +1 -1
- package/dist/theme/FontsLoaded.js +1 -3
- package/dist/theme/FontsLoaded.js.map +1 -1
- package/dist/theme/Logo.js +2 -4
- package/dist/theme/Logo.js.map +1 -1
- package/dist/theme/SpectrumThemeProvider.js +17 -9
- package/dist/theme/SpectrumThemeProvider.js.map +1 -1
- package/dist/theme/ThemePicker.js +4 -5
- package/dist/theme/ThemePicker.js.map +1 -1
- package/dist/theme/ThemeProvider.js +20 -8
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/ThemeUtils.js +35 -19
- package/dist/theme/ThemeUtils.js.map +1 -1
- package/dist/theme/useExternalTheme.js +16 -7
- package/dist/theme/useExternalTheme.js.map +1 -1
- package/dist/transitions/FadeTransition.js +5 -6
- package/dist/transitions/FadeTransition.js.map +1 -1
- package/dist/transitions/SlideTransition.js +6 -7
- package/dist/transitions/SlideTransition.js.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomTimeSelect.js","names":["React","Component","FontAwesomeIcon","vsCheck","TimeUtils","classNames","TimeInput","DropdownMenu","jsx","_jsx","jsxs","_jsxs","CUSTOM_OPTION","MENU_NAVIGATION_DIRECTION","CustomTimeSelect","constructor","props","_defineProperty","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","_this$button$current","updateInputValue","onChange","handleResize","event","_this$button$current2","key","updateFromCustom","stopPropagation","preventDefault","shiftKey","handleMenuNavigation","UP","DOWN","direction","menuOptionsLength","newKeyboardOptionIndex","focusInput","focusOption","scrollOptionIntoView","optionIndex","Number","currentTarget","timeToValue","update","updateAndClose","_this$button$current3","target","_this$menuContainer$c","activeOption","querySelector","HTMLElement","valueIndex","map","indexOf","_this$input$current","index","_this$menuContainer$c2","children","item","openMenu","updateKeyboardIndex","focusButton","arguments","undefined","_this$button$current4","_this$menuContainer$c3","offsetTop","DROP_DOWN_MENU_HEIGHT","scrollTop","renderMenuElement","className","ref","role","onKeyDown","onClick","style","renderOptions","icon","customText","matchFound","optionArray","concat","push","type","onFocus","onBlur","render","disabled","invalid","dataTestId","popperOptions","_objectSpread","placement","modifiers","preventOverflow","enabled","isShown","actions","menuElement","popperClassName","onMenuOpened","onMenuClosed","menuStyle","maxWidth","Math","round","time"],"sources":["../src/CustomTimeSelect.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport { type PopperOptions } from 'popper.js';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsCheck, type IconDefinition } from '@deephaven/icons';\nimport { TimeUtils } from '@deephaven/utils';\nimport classNames from 'classnames';\nimport TimeInput, { type TimeInputElement } from './TimeInput';\nimport DropdownMenu from './menu-actions/DropdownMenu';\nimport './CustomTimeSelect.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 'data-testid'?: string;\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 'data-testid': undefined,\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<TimeInputElement>;\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 != null) {\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 != null) {\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, 'data-testid': dataTestId } = 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 data-testid={dataTestId}\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 className=\"cs-caret\" />\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"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"CustomTimeSelect.js","names":["React","Component","FontAwesomeIcon","vsCheck","TimeUtils","classNames","TimeInput","DropdownMenu","jsx","_jsx","jsxs","_jsxs","CUSTOM_OPTION","MENU_NAVIGATION_DIRECTION","CustomTimeSelect","constructor","props","_defineProperty","value","valueToTime","toggleMenu","bind","handleMenuKeyDown","closeMenu","handleOptionClick","handleOptionFocus","handleMenuOpened","handleMenuExited","handleCustomInput","csContainer","createRef","menuContainer","button","input","state","keyboardOptionIndex","menuIsOpen","inputWidth","customTime","inputFocused","getSelectedText","_this$props","options","placeholder","i","length","option","title","formatTime","setInputWidth","current","setState","getBoundingClientRect","width","focus","_this$button$current","updateInputValue","onChange","handleResize","event","_this$button$current2","_this$state","key","updateFromCustom","stopPropagation","preventDefault","shiftKey","handleMenuNavigation","UP","DOWN","direction","_this$state2","menuOptionsLength","newKeyboardOptionIndex","focusInput","focusOption","scrollOptionIntoView","optionIndex","Number","currentTarget","_this$props2","timeToValue","update","updateAndClose","_this$button$current3","target","_this$menuContainer$c","_this$props3","activeOption","querySelector","HTMLElement","valueIndex","map","indexOf","_this$input$current","index","_this$menuContainer$c2","children","item","openMenu","updateKeyboardIndex","focusButton","arguments","undefined","_this$button$current4","_this$props4","_this$menuContainer$c3","offsetTop","DROP_DOWN_MENU_HEIGHT","scrollTop","renderMenuElement","className","ref","role","onKeyDown","onClick","style","renderOptions","_this$props5","icon","customText","_this$state3","matchFound","optionArray","concat","push","type","onFocus","onBlur","render","_this$props6","disabled","invalid","dataTestId","popperOptions","_objectSpread","placement","modifiers","preventOverflow","enabled","isShown","actions","menuElement","popperClassName","onMenuOpened","onMenuClosed","menuStyle","maxWidth","Math","round","time"],"sources":["../src/CustomTimeSelect.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport { type PopperOptions } from 'popper.js';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { vsCheck, type IconDefinition } from '@deephaven/icons';\nimport { TimeUtils } from '@deephaven/utils';\nimport classNames from 'classnames';\nimport TimeInput, { type TimeInputElement } from './TimeInput';\nimport DropdownMenu from './menu-actions/DropdownMenu';\nimport './CustomTimeSelect.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 'data-testid'?: string;\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 'data-testid': undefined,\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<TimeInputElement>;\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 != null) {\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 != null) {\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, 'data-testid': dataTestId } = 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 data-testid={dataTestId}\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 className=\"cs-caret\" />\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"],"mappings":"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","ignoreList":[]}
|
package/dist/DateInput.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
2
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
4
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
5
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
1
7
|
import React, { useCallback, useState } from 'react';
|
|
2
8
|
import classNames from 'classnames';
|
|
3
9
|
import Log from '@deephaven/log';
|
|
@@ -9,16 +15,25 @@ var DATE_PATTERN = '[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])';
|
|
|
9
15
|
var EXAMPLES = ['2000-01-01', '2022-12-31'];
|
|
10
16
|
var DATE_FORMAT = 'YYYY-MM-DD';
|
|
11
17
|
var DateInput = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
12
|
-
var
|
|
13
|
-
className = '',
|
|
14
|
-
onChange =
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
var _props$className = props.className,
|
|
19
|
+
className = _props$className === void 0 ? '' : _props$className,
|
|
20
|
+
_props$onChange = props.onChange,
|
|
21
|
+
onChange = _props$onChange === void 0 ? () => undefined : _props$onChange,
|
|
22
|
+
_props$defaultValue = props.defaultValue,
|
|
23
|
+
defaultValue = _props$defaultValue === void 0 ? '' : _props$defaultValue,
|
|
24
|
+
_props$onFocus = props.onFocus,
|
|
25
|
+
onFocus = _props$onFocus === void 0 ? () => undefined : _props$onFocus,
|
|
26
|
+
_props$onBlur = props.onBlur,
|
|
27
|
+
onBlur = _props$onBlur === void 0 ? () => undefined : _props$onBlur,
|
|
28
|
+
dataTestId = props['data-testid'];
|
|
29
|
+
var _useState = useState(defaultValue),
|
|
30
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
31
|
+
value = _useState2[0],
|
|
32
|
+
setValue = _useState2[1];
|
|
33
|
+
var _useState3 = useState(),
|
|
34
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
35
|
+
selection = _useState4[0],
|
|
36
|
+
setSelection = _useState4[1];
|
|
22
37
|
var handleChange = useCallback(newValue => {
|
|
23
38
|
log.debug('handleChange', newValue);
|
|
24
39
|
setValue(newValue);
|
package/dist/DateInput.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateInput.js","names":["React","useCallback","useState","classNames","Log","MaskedInput","getNextSegmentValue","jsx","_jsx","log","module","DATE_PATTERN","EXAMPLES","DATE_FORMAT","DateInput","forwardRef","props","ref","className","onChange","undefined","defaultValue","onFocus","onBlur","dataTestId","value","setValue","selection","setSelection","handleChange","newValue","debug","children","example","onSelect","pattern","placeholder","displayName"],"sources":["../src/DateInput.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport MaskedInput, { type SelectionSegment } from './MaskedInput';\nimport { getNextSegmentValue } from './DateInputUtils';\n\nconst log = Log.module('DateInput');\n\nconst DATE_PATTERN = '[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])';\nconst EXAMPLES = ['2000-01-01', '2022-12-31'];\nconst DATE_FORMAT = 'YYYY-MM-DD';\n\ntype DateInputProps = {\n className?: string;\n onChange?: (date: string) => void;\n defaultValue?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n 'data-testid'?: string;\n};\n\nconst DateInput = React.forwardRef<HTMLInputElement, DateInputProps>(\n (props: DateInputProps, ref) => {\n const {\n className = '',\n onChange = () => undefined,\n defaultValue = '',\n onFocus = () => undefined,\n onBlur = () => undefined,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(defaultValue);\n const [selection, setSelection] = useState<SelectionSegment>();\n\n const handleChange = useCallback(\n (newValue: string): void => {\n log.debug('handleChange', newValue);\n setValue(newValue);\n onChange(newValue);\n },\n [onChange]\n );\n\n return (\n <div className=\"d-flex flex-row align-items-center\">\n <MaskedInput\n ref={ref}\n className={classNames(className)}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n onChange={handleChange}\n onSelect={setSelection}\n pattern={DATE_PATTERN}\n placeholder={DATE_FORMAT}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n </div>\n );\n }\n);\nDateInput.displayName = 'DateInput';\n\nexport default DateInput;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,WAAW;AAAA,SACTC,mBAAmB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAE5B,IAAMC,GAAG,GAAGL,GAAG,CAACM,MAAM,CAAC,WAAW,CAAC;AAEnC,IAAMC,YAAY,GAAG,yDAAyD;AAC9E,IAAMC,QAAQ,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC;AAC7C,IAAMC,WAAW,GAAG,YAAY;AAWhC,IAAMC,SAAS,gBAAGd,KAAK,CAACe,UAAU,CAChC,CAACC,KAAqB,EAAEC,GAAG,KAAK;EAC9B,
|
|
1
|
+
{"version":3,"file":"DateInput.js","names":["React","useCallback","useState","classNames","Log","MaskedInput","getNextSegmentValue","jsx","_jsx","log","module","DATE_PATTERN","EXAMPLES","DATE_FORMAT","DateInput","forwardRef","props","ref","_props$className","className","_props$onChange","onChange","undefined","_props$defaultValue","defaultValue","_props$onFocus","onFocus","_props$onBlur","onBlur","dataTestId","_useState","_useState2","_slicedToArray","value","setValue","_useState3","_useState4","selection","setSelection","handleChange","newValue","debug","children","example","onSelect","pattern","placeholder","displayName"],"sources":["../src/DateInput.tsx"],"sourcesContent":["import React, { useCallback, useState } from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport MaskedInput, { type SelectionSegment } from './MaskedInput';\nimport { getNextSegmentValue } from './DateInputUtils';\n\nconst log = Log.module('DateInput');\n\nconst DATE_PATTERN = '[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])';\nconst EXAMPLES = ['2000-01-01', '2022-12-31'];\nconst DATE_FORMAT = 'YYYY-MM-DD';\n\ntype DateInputProps = {\n className?: string;\n onChange?: (date: string) => void;\n defaultValue?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n 'data-testid'?: string;\n};\n\nconst DateInput = React.forwardRef<HTMLInputElement, DateInputProps>(\n (props: DateInputProps, ref) => {\n const {\n className = '',\n onChange = () => undefined,\n defaultValue = '',\n onFocus = () => undefined,\n onBlur = () => undefined,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(defaultValue);\n const [selection, setSelection] = useState<SelectionSegment>();\n\n const handleChange = useCallback(\n (newValue: string): void => {\n log.debug('handleChange', newValue);\n setValue(newValue);\n onChange(newValue);\n },\n [onChange]\n );\n\n return (\n <div className=\"d-flex flex-row align-items-center\">\n <MaskedInput\n ref={ref}\n className={classNames(className)}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n onChange={handleChange}\n onSelect={setSelection}\n pattern={DATE_PATTERN}\n placeholder={DATE_FORMAT}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={onBlur}\n data-testid={dataTestId}\n />\n </div>\n );\n }\n);\nDateInput.displayName = 'DateInput';\n\nexport default DateInput;\n"],"mappings":";;;;;;AAAA,OAAOA,KAAK,IAAIC,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AACpD,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,WAAW;AAAA,SACTC,mBAAmB;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAE5B,IAAMC,GAAG,GAAGL,GAAG,CAACM,MAAM,CAAC,WAAW,CAAC;AAEnC,IAAMC,YAAY,GAAG,yDAAyD;AAC9E,IAAMC,QAAQ,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC;AAC7C,IAAMC,WAAW,GAAG,YAAY;AAWhC,IAAMC,SAAS,gBAAGd,KAAK,CAACe,UAAU,CAChC,CAACC,KAAqB,EAAEC,GAAG,KAAK;EAC9B,IAAAC,gBAAA,GAOIF,KAAK,CANPG,SAAS;IAATA,SAAS,GAAAD,gBAAA,cAAG,EAAE,GAAAA,gBAAA;IAAAE,eAAA,GAMZJ,KAAK,CALPK,QAAQ;IAARA,QAAQ,GAAAD,eAAA,cAAG,MAAME,SAAS,GAAAF,eAAA;IAAAG,mBAAA,GAKxBP,KAAK,CAJPQ,YAAY;IAAZA,YAAY,GAAAD,mBAAA,cAAG,EAAE,GAAAA,mBAAA;IAAAE,cAAA,GAIfT,KAAK,CAHPU,OAAO;IAAPA,OAAO,GAAAD,cAAA,cAAG,MAAMH,SAAS,GAAAG,cAAA;IAAAE,aAAA,GAGvBX,KAAK,CAFPY,MAAM;IAANA,MAAM,GAAAD,aAAA,cAAG,MAAML,SAAS,GAAAK,aAAA;IACTE,UAAU,GACvBb,KAAK,CADP,aAAa;EAEf,IAAAc,SAAA,GAA0B5B,QAAQ,CAACsB,YAAY,CAAC;IAAAO,UAAA,GAAAC,cAAA,CAAAF,SAAA;IAAzCG,KAAK,GAAAF,UAAA;IAAEG,QAAQ,GAAAH,UAAA;EACtB,IAAAI,UAAA,GAAkCjC,QAAQ,CAAmB,CAAC;IAAAkC,UAAA,GAAAJ,cAAA,CAAAG,UAAA;IAAvDE,SAAS,GAAAD,UAAA;IAAEE,YAAY,GAAAF,UAAA;EAE9B,IAAMG,YAAY,GAAGtC,WAAW,CAC7BuC,QAAgB,IAAW;IAC1B/B,GAAG,CAACgC,KAAK,CAAC,cAAc,EAAED,QAAQ,CAAC;IACnCN,QAAQ,CAACM,QAAQ,CAAC;IAClBnB,QAAQ,CAACmB,QAAQ,CAAC;EACpB,CAAC,EACD,CAACnB,QAAQ,CACX,CAAC;EAED,oBACEb,IAAA;IAAKW,SAAS,EAAC,oCAAoC;IAAAuB,QAAA,eACjDlC,IAAA,CAACH,WAAW;MACVY,GAAG,EAAEA,GAAI;MACTE,SAAS,EAAEhB,UAAU,CAACgB,SAAS,CAAE;MACjCwB,OAAO,EAAE/B,QAAS;MAClBN,mBAAmB,EAAEA,mBAAoB;MACzCe,QAAQ,EAAEkB,YAAa;MACvBK,QAAQ,EAAEN,YAAa;MACvBO,OAAO,EAAElC,YAAa;MACtBmC,WAAW,EAAEjC,WAAY;MACzBwB,SAAS,EAAEA,SAAU;MACrBJ,KAAK,EAAEA,KAAM;MACbP,OAAO,EAAEA,OAAQ;MACjBE,MAAM,EAAEA,MAAO;MACf,eAAaC;IAAW,CACzB;EAAC,CACC,CAAC;AAEV,CACF,CAAC;AACDf,SAAS,CAACiC,WAAW,GAAG,WAAW;AAEnC,eAAejC,SAAS","ignoreList":[]}
|
package/dist/DateInputUtils.js
CHANGED
|
@@ -4,9 +4,7 @@ export function getNextNumberSegmentValue(delta, segmentValue, lowerBound, upper
|
|
|
4
4
|
return "".concat(newSegmentValue).padStart(length, '0');
|
|
5
5
|
}
|
|
6
6
|
export function getNextSegmentValue(range, delta, segmentValue) {
|
|
7
|
-
var
|
|
8
|
-
selectionStart
|
|
9
|
-
} = range;
|
|
7
|
+
var selectionStart = range.selectionStart;
|
|
10
8
|
if (selectionStart === 0) {
|
|
11
9
|
return getNextNumberSegmentValue(delta, segmentValue, 1900, 2099, 4);
|
|
12
10
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateInputUtils.js","names":["getNextNumberSegmentValue","delta","segmentValue","lowerBound","upperBound","length","modValue","newSegmentValue","parseInt","concat","padStart","getNextSegmentValue","range","selectionStart"],"sources":["../src/DateInputUtils.ts"],"sourcesContent":["import { type SelectionSegment } from './MaskedInput';\n\nexport function getNextNumberSegmentValue(\n delta: number,\n segmentValue: string,\n lowerBound: number,\n upperBound: number,\n length: number\n): string {\n const modValue = upperBound - lowerBound + 1;\n const newSegmentValue =\n ((((parseInt(segmentValue, 10) - delta - lowerBound) % modValue) +\n modValue) %\n modValue) +\n lowerBound;\n return `${newSegmentValue}`.padStart(length, '0');\n}\n\nexport function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n): string {\n const { selectionStart } = range;\n if (selectionStart === 0) {\n return getNextNumberSegmentValue(delta, segmentValue, 1900, 2099, 4);\n }\n if (selectionStart === 5) {\n return getNextNumberSegmentValue(delta, segmentValue, 1, 12, 2);\n }\n if (selectionStart === 8) {\n return getNextNumberSegmentValue(delta, segmentValue, 1, 31, 2);\n }\n if (selectionStart === 11) {\n // Hours input\n return getNextNumberSegmentValue(delta, segmentValue, 0, 23, 2);\n }\n if (selectionStart === 17 || selectionStart === 14) {\n // Minutes/seconds input\n return getNextNumberSegmentValue(delta, segmentValue, 0, 59, 2);\n }\n if (selectionStart === 20 || selectionStart === 24 || selectionStart === 28) {\n // Milli, micro, and nanosecond input\n return getNextNumberSegmentValue(delta, segmentValue, 0, 999, 3);\n }\n\n return segmentValue;\n}\n"],"mappings":"AAEA,OAAO,SAASA,yBAAyBA,CACvCC,KAAa,EACbC,YAAoB,EACpBC,UAAkB,EAClBC,UAAkB,EAClBC,MAAc,EACN;EACR,IAAMC,QAAQ,GAAGF,UAAU,GAAGD,UAAU,GAAG,CAAC;EAC5C,IAAMI,eAAe,GAClB,CAAE,CAACC,QAAQ,CAACN,YAAY,EAAE,EAAE,CAAC,GAAGD,KAAK,GAAGE,UAAU,IAAIG,QAAQ,GAC7DA,QAAQ,IACRA,QAAQ,GACVH,UAAU;EACZ,OAAO,GAAAM,MAAA,CAAGF,eAAe,EAAGG,QAAQ,CAACL,MAAM,EAAE,GAAG,CAAC;AACnD;AAEA,OAAO,SAASM,mBAAmBA,CACjCC,KAAuB,EACvBX,KAAa,EACbC,YAAoB,EACZ;EACR,
|
|
1
|
+
{"version":3,"file":"DateInputUtils.js","names":["getNextNumberSegmentValue","delta","segmentValue","lowerBound","upperBound","length","modValue","newSegmentValue","parseInt","concat","padStart","getNextSegmentValue","range","selectionStart"],"sources":["../src/DateInputUtils.ts"],"sourcesContent":["import { type SelectionSegment } from './MaskedInput';\n\nexport function getNextNumberSegmentValue(\n delta: number,\n segmentValue: string,\n lowerBound: number,\n upperBound: number,\n length: number\n): string {\n const modValue = upperBound - lowerBound + 1;\n const newSegmentValue =\n ((((parseInt(segmentValue, 10) - delta - lowerBound) % modValue) +\n modValue) %\n modValue) +\n lowerBound;\n return `${newSegmentValue}`.padStart(length, '0');\n}\n\nexport function getNextSegmentValue(\n range: SelectionSegment,\n delta: number,\n segmentValue: string\n): string {\n const { selectionStart } = range;\n if (selectionStart === 0) {\n return getNextNumberSegmentValue(delta, segmentValue, 1900, 2099, 4);\n }\n if (selectionStart === 5) {\n return getNextNumberSegmentValue(delta, segmentValue, 1, 12, 2);\n }\n if (selectionStart === 8) {\n return getNextNumberSegmentValue(delta, segmentValue, 1, 31, 2);\n }\n if (selectionStart === 11) {\n // Hours input\n return getNextNumberSegmentValue(delta, segmentValue, 0, 23, 2);\n }\n if (selectionStart === 17 || selectionStart === 14) {\n // Minutes/seconds input\n return getNextNumberSegmentValue(delta, segmentValue, 0, 59, 2);\n }\n if (selectionStart === 20 || selectionStart === 24 || selectionStart === 28) {\n // Milli, micro, and nanosecond input\n return getNextNumberSegmentValue(delta, segmentValue, 0, 999, 3);\n }\n\n return segmentValue;\n}\n"],"mappings":"AAEA,OAAO,SAASA,yBAAyBA,CACvCC,KAAa,EACbC,YAAoB,EACpBC,UAAkB,EAClBC,UAAkB,EAClBC,MAAc,EACN;EACR,IAAMC,QAAQ,GAAGF,UAAU,GAAGD,UAAU,GAAG,CAAC;EAC5C,IAAMI,eAAe,GAClB,CAAE,CAACC,QAAQ,CAACN,YAAY,EAAE,EAAE,CAAC,GAAGD,KAAK,GAAGE,UAAU,IAAIG,QAAQ,GAC7DA,QAAQ,IACRA,QAAQ,GACVH,UAAU;EACZ,OAAO,GAAAM,MAAA,CAAGF,eAAe,EAAGG,QAAQ,CAACL,MAAM,EAAE,GAAG,CAAC;AACnD;AAEA,OAAO,SAASM,mBAAmBA,CACjCC,KAAuB,EACvBX,KAAa,EACbC,YAAoB,EACZ;EACR,IAAQW,cAAc,GAAKD,KAAK,CAAxBC,cAAc;EACtB,IAAIA,cAAc,KAAK,CAAC,EAAE;IACxB,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;EACtE;EACA,IAAIW,cAAc,KAAK,CAAC,EAAE;IACxB,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EACjE;EACA,IAAIW,cAAc,KAAK,CAAC,EAAE;IACxB,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EACjE;EACA,IAAIW,cAAc,KAAK,EAAE,EAAE;IACzB;IACA,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EACjE;EACA,IAAIW,cAAc,KAAK,EAAE,IAAIA,cAAc,KAAK,EAAE,EAAE;IAClD;IACA,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EACjE;EACA,IAAIW,cAAc,KAAK,EAAE,IAAIA,cAAc,KAAK,EAAE,IAAIA,cAAc,KAAK,EAAE,EAAE;IAC3E;IACA,OAAOb,yBAAyB,CAACC,KAAK,EAAEC,YAAY,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;EAClE;EAEA,OAAOA,YAAY;AACrB","ignoreList":[]}
|
package/dist/DateTimeInput.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
2
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
4
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
5
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
1
7
|
import React, { useCallback, useEffect, useState } from 'react';
|
|
2
8
|
import classNames from 'classnames';
|
|
3
9
|
import Log from '@deephaven/log';
|
|
@@ -27,17 +33,26 @@ function removeSeparators(value) {
|
|
|
27
33
|
}
|
|
28
34
|
var EXAMPLES = [addSeparators(DEFAULT_VALUE_STRING)];
|
|
29
35
|
export var DateTimeInput = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
30
|
-
var
|
|
31
|
-
className = '',
|
|
32
|
-
onChange =
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
var _props$className = props.className,
|
|
37
|
+
className = _props$className === void 0 ? '' : _props$className,
|
|
38
|
+
_props$onChange = props.onChange,
|
|
39
|
+
onChange = _props$onChange === void 0 ? () => undefined : _props$onChange,
|
|
40
|
+
_props$defaultValue = props.defaultValue,
|
|
41
|
+
defaultValue = _props$defaultValue === void 0 ? '' : _props$defaultValue,
|
|
42
|
+
_props$onFocus = props.onFocus,
|
|
43
|
+
onFocus = _props$onFocus === void 0 ? () => undefined : _props$onFocus,
|
|
44
|
+
_props$onBlur = props.onBlur,
|
|
45
|
+
onBlur = _props$onBlur === void 0 ? () => undefined : _props$onBlur,
|
|
46
|
+
onSubmit = props.onSubmit,
|
|
47
|
+
dataTestId = props['data-testid'];
|
|
48
|
+
var _useState = useState(defaultValue.length > 0 ? addSeparators(defaultValue) : ''),
|
|
49
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
50
|
+
value = _useState2[0],
|
|
51
|
+
setValue = _useState2[1];
|
|
52
|
+
var _useState3 = useState(),
|
|
53
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
54
|
+
selection = _useState4[0],
|
|
55
|
+
setSelection = _useState4[1];
|
|
41
56
|
|
|
42
57
|
/**
|
|
43
58
|
* Normalize text by:
|
|
@@ -56,7 +71,8 @@ export var DateTimeInput = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
56
71
|
// Pattern: YYYY-MM-DD HH:MM:SS[.SSSSSSSSS] followed by optional timezone
|
|
57
72
|
var dateTimeMatch = normalized.match(/^(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}(?:\.\d+)?)/);
|
|
58
73
|
if (dateTimeMatch) {
|
|
59
|
-
|
|
74
|
+
var _dateTimeMatch = _slicedToArray(dateTimeMatch, 2);
|
|
75
|
+
normalized = _dateTimeMatch[1];
|
|
60
76
|
}
|
|
61
77
|
|
|
62
78
|
// Add zero-width space separators to match the expected pattern
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateTimeInput.js","names":["React","useCallback","useEffect","useState","classNames","Log","MaskedInput","getNextSegmentValue","addSeparators","jsx","_jsx","log","module","DATE_PATTERN","TIME_PATTERN","FULL_DATE_PATTERN","concat","DATE_VALUE_STRING","DEFAULT_VALUE_STRING","FULL_DATE_FORMAT","fixIncompleteValue","value","length","substring","replace","removeSeparators","EXAMPLES","DateTimeInput","forwardRef","props","ref","className","onChange","undefined","defaultValue","onFocus","onBlur","onSubmit","dataTestId","setValue","selection","setSelection","normalizeText","text","normalized","dateTimeMatch","match","handleChange","newValue","debug","handleBlur","prevValue","fixedValue","children","example","normalizePastedText","onSelect","pattern","placeholder","displayName"],"sources":["../src/DateTimeInput.tsx"],"sourcesContent":["import React, {\n type KeyboardEvent,\n useCallback,\n useEffect,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport MaskedInput, { type SelectionSegment } from './MaskedInput';\nimport { getNextSegmentValue } from './DateInputUtils';\nimport { addSeparators } from './DateTimeInputUtils';\n\nconst log = Log.module('DateTimeInput');\n\n// This could be more restrictive and restrict days to the number of days in the month...\n// But then gotta take leap year into account and everything.\nconst DATE_PATTERN = '[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])';\n// Put zero width spaces in the nanosecond part of the date to allow jumping between segments\nconst TIME_PATTERN =\n '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\\\\.[0-9]{3}\\u200B[0-9]{3}\\u200B[0-9]{3}';\nconst FULL_DATE_PATTERN = `${DATE_PATTERN} ${TIME_PATTERN}`;\nconst DATE_VALUE_STRING = '2022-01-01';\nconst DEFAULT_VALUE_STRING = `${DATE_VALUE_STRING} 00:00:00.000000000`;\nconst FULL_DATE_FORMAT = 'YYYY-MM-DD HH:MM:SS.SSSSSSSSS';\n\nexport type DateTimeInputProps = {\n className?: string;\n onChange?: (value: string) => void;\n defaultValue?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n onSubmit?: (event: KeyboardEvent<HTMLInputElement>) => void;\n 'data-testid'?: string;\n};\n\nfunction fixIncompleteValue(value: string): string {\n if (value != null && value.length >= DATE_VALUE_STRING.length) {\n return `${value.substring(0, DATE_VALUE_STRING.length)}${value\n .substring(DATE_VALUE_STRING.length)\n .replace(/\\u2007/g, '0')}${DEFAULT_VALUE_STRING.substring(value.length)}`;\n }\n return value;\n}\n\nfunction removeSeparators(value: string): string {\n return value.replace(/\\u200B/g, '');\n}\n\nconst EXAMPLES = [addSeparators(DEFAULT_VALUE_STRING)];\n\nexport const DateTimeInput = React.forwardRef<\n HTMLInputElement,\n DateTimeInputProps\n>((props, ref) => {\n const {\n className = '',\n onChange = () => undefined,\n defaultValue = '',\n onFocus = () => undefined,\n onBlur = () => undefined,\n onSubmit,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(\n defaultValue.length > 0 ? addSeparators(defaultValue) : ''\n );\n const [selection, setSelection] = useState<SelectionSegment>();\n\n /**\n * Normalize text by:\n * - Replacing 'T' with space to support ISO 8601 format\n * - Removing timezone information (e.g., \"EDT\", \"+05:00\", \"Z\")\n * - Adding zero-width space separators in the nanosecond part\n * @param text The text\n * @returns The normalized text\n */\n const normalizeText = useCallback((text: string): string => {\n // Replace first 'T' separator with space for ISO 8601 format (without global flag to preserve 'T' in timezone like EDT)\n let normalized = text.replace(/T/, ' ');\n\n // Remove timezone information\n // Match datetime up to optional fractional seconds, then strip everything else\n // Pattern: YYYY-MM-DD HH:MM:SS[.SSSSSSSSS] followed by optional timezone\n const dateTimeMatch = normalized.match(\n /^(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?)/\n );\n\n if (dateTimeMatch) {\n [, normalized] = dateTimeMatch;\n }\n\n // Add zero-width space separators to match the expected pattern\n return addSeparators(normalized);\n }, []);\n\n // Sync internal state with defaultValue prop when it changes\n // Apply normalization to handle raw unformatted values (e.g., with timezone info)\n useEffect(() => {\n if (defaultValue.length > 0) {\n const normalized = normalizeText(defaultValue);\n setValue(normalized);\n // Notify parent with the normalized value (without separators)\n onChange(fixIncompleteValue(removeSeparators(normalized)));\n } else {\n setValue('');\n onChange('');\n }\n }, [defaultValue, normalizeText, onChange]);\n\n const handleChange = useCallback(\n (newValue: string): void => {\n log.debug('handleChange', newValue);\n setValue(newValue);\n onChange(fixIncompleteValue(removeSeparators(newValue)));\n },\n [onChange]\n );\n\n const handleBlur = useCallback((): void => {\n const prevValue = removeSeparators(value);\n const fixedValue = fixIncompleteValue(prevValue);\n // Update the value displayed in the input\n // onChange with the fixed value already triggered in handleChange\n if (fixedValue !== prevValue) {\n setValue(addSeparators(fixedValue));\n }\n onBlur();\n }, [value, onBlur]);\n\n return (\n <div className=\"d-flex flex-row align-items-center\">\n <MaskedInput\n ref={ref}\n className={classNames(className)}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n normalizePastedText={normalizeText}\n onChange={handleChange}\n onSelect={setSelection}\n onSubmit={onSubmit}\n pattern={FULL_DATE_PATTERN}\n placeholder={FULL_DATE_FORMAT}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={handleBlur}\n data-testid={dataTestId}\n />\n </div>\n );\n});\n\nDateTimeInput.displayName = 'DateTimeInput';\n\nexport default DateTimeInput;\n"],"mappings":"AAAA,OAAOA,KAAK,IAEVC,WAAW,EACXC,SAAS,EACTC,QAAQ,QACH,OAAO;AACd,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,WAAW;AAAA,SACTC,mBAAmB;AAAA,SACnBC,aAAa;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAEtB,IAAMC,GAAG,GAAGN,GAAG,CAACO,MAAM,CAAC,eAAe,CAAC;;AAEvC;AACA;AACA,IAAMC,YAAY,GAAG,yDAAyD;AAC9E;AACA,IAAMC,YAAY,GAChB,iFAAiF;AACnF,IAAMC,iBAAiB,MAAAC,MAAA,CAAMH,YAAY,OAAAG,MAAA,CAAIF,YAAY,CAAE;AAC3D,IAAMG,iBAAiB,GAAG,YAAY;AACtC,IAAMC,oBAAoB,MAAAF,MAAA,CAAMC,iBAAiB,wBAAqB;AACtE,IAAME,gBAAgB,GAAG,+BAA+B;AAYxD,SAASC,kBAAkBA,CAACC,KAAa,EAAU;EACjD,IAAIA,KAAK,IAAI,IAAI,IAAIA,KAAK,CAACC,MAAM,IAAIL,iBAAiB,CAACK,MAAM,EAAE;IAC7D,UAAAN,MAAA,CAAUK,KAAK,CAACE,SAAS,CAAC,CAAC,EAAEN,iBAAiB,CAACK,MAAM,CAAC,EAAAN,MAAA,CAAGK,KAAK,CAC3DE,SAAS,CAACN,iBAAiB,CAACK,MAAM,CAAC,CACnCE,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,EAAAR,MAAA,CAAGE,oBAAoB,CAACK,SAAS,CAACF,KAAK,CAACC,MAAM,CAAC;EAC3E;EACA,OAAOD,KAAK;AACd;AAEA,SAASI,gBAAgBA,CAACJ,KAAa,EAAU;EAC/C,OAAOA,KAAK,CAACG,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;AACrC;AAEA,IAAME,QAAQ,GAAG,CAAClB,aAAa,CAACU,oBAAoB,CAAC,CAAC;AAEtD,OAAO,IAAMS,aAAa,gBAAG3B,KAAK,CAAC4B,UAAU,CAG3C,CAACC,KAAK,EAAEC,GAAG,KAAK;EAChB,IAAM;IACJC,SAAS,GAAG,EAAE;IACdC,QAAQ,GAAGA,CAAA,KAAMC,SAAS;IAC1BC,YAAY,GAAG,EAAE;IACjBC,OAAO,GAAGA,CAAA,KAAMF,SAAS;IACzBG,MAAM,GAAGA,CAAA,KAAMH,SAAS;IACxBI,QAAQ;IACR,aAAa,EAAEC;EACjB,CAAC,GAAGT,KAAK;EACT,IAAM,CAACR,KAAK,EAAEkB,QAAQ,CAAC,GAAGpC,QAAQ,CAChC+B,YAAY,CAACZ,MAAM,GAAG,CAAC,GAAGd,aAAa,CAAC0B,YAAY,CAAC,GAAG,EAC1D,CAAC;EACD,IAAM,CAACM,SAAS,EAAEC,YAAY,CAAC,GAAGtC,QAAQ,CAAmB,CAAC;;EAE9D;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,IAAMuC,aAAa,GAAGzC,WAAW,CAAE0C,IAAY,IAAa;IAC1D;IACA,IAAIC,UAAU,GAAGD,IAAI,CAACnB,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;;IAEvC;IACA;IACA;IACA,IAAMqB,aAAa,GAAGD,UAAU,CAACE,KAAK,CACpC,oDACF,CAAC;IAED,IAAID,aAAa,EAAE;MACjB,GAAGD,UAAU,CAAC,GAAGC,aAAa;IAChC;;IAEA;IACA,OAAOrC,aAAa,CAACoC,UAAU,CAAC;EAClC,CAAC,EAAE,EAAE,CAAC;;EAEN;EACA;EACA1C,SAAS,CAAC,MAAM;IACd,IAAIgC,YAAY,CAACZ,MAAM,GAAG,CAAC,EAAE;MAC3B,IAAMsB,UAAU,GAAGF,aAAa,CAACR,YAAY,CAAC;MAC9CK,QAAQ,CAACK,UAAU,CAAC;MACpB;MACAZ,QAAQ,CAACZ,kBAAkB,CAACK,gBAAgB,CAACmB,UAAU,CAAC,CAAC,CAAC;IAC5D,CAAC,MAAM;MACLL,QAAQ,CAAC,EAAE,CAAC;MACZP,QAAQ,CAAC,EAAE,CAAC;IACd;EACF,CAAC,EAAE,CAACE,YAAY,EAAEQ,aAAa,EAAEV,QAAQ,CAAC,CAAC;EAE3C,IAAMe,YAAY,GAAG9C,WAAW,CAC7B+C,QAAgB,IAAW;IAC1BrC,GAAG,CAACsC,KAAK,CAAC,cAAc,EAAED,QAAQ,CAAC;IACnCT,QAAQ,CAACS,QAAQ,CAAC;IAClBhB,QAAQ,CAACZ,kBAAkB,CAACK,gBAAgB,CAACuB,QAAQ,CAAC,CAAC,CAAC;EAC1D,CAAC,EACD,CAAChB,QAAQ,CACX,CAAC;EAED,IAAMkB,UAAU,GAAGjD,WAAW,CAAC,MAAY;IACzC,IAAMkD,SAAS,GAAG1B,gBAAgB,CAACJ,KAAK,CAAC;IACzC,IAAM+B,UAAU,GAAGhC,kBAAkB,CAAC+B,SAAS,CAAC;IAChD;IACA;IACA,IAAIC,UAAU,KAAKD,SAAS,EAAE;MAC5BZ,QAAQ,CAAC/B,aAAa,CAAC4C,UAAU,CAAC,CAAC;IACrC;IACAhB,MAAM,CAAC,CAAC;EACV,CAAC,EAAE,CAACf,KAAK,EAAEe,MAAM,CAAC,CAAC;EAEnB,oBACE1B,IAAA;IAAKqB,SAAS,EAAC,oCAAoC;IAAAsB,QAAA,eACjD3C,IAAA,CAACJ,WAAW;MACVwB,GAAG,EAAEA,GAAI;MACTC,SAAS,EAAE3B,UAAU,CAAC2B,SAAS,CAAE;MACjCuB,OAAO,EAAE5B,QAAS;MAClBnB,mBAAmB,EAAEA,mBAAoB;MACzCgD,mBAAmB,EAAEb,aAAc;MACnCV,QAAQ,EAAEe,YAAa;MACvBS,QAAQ,EAAEf,YAAa;MACvBJ,QAAQ,EAAEA,QAAS;MACnBoB,OAAO,EAAE1C,iBAAkB;MAC3B2C,WAAW,EAAEvC,gBAAiB;MAC9BqB,SAAS,EAAEA,SAAU;MACrBnB,KAAK,EAAEA,KAAM;MACbc,OAAO,EAAEA,OAAQ;MACjBC,MAAM,EAAEc,UAAW;MACnB,eAAaZ;IAAW,CACzB;EAAC,CACC,CAAC;AAEV,CAAC,CAAC;AAEFX,aAAa,CAACgC,WAAW,GAAG,eAAe;AAE3C,eAAehC,aAAa","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DateTimeInput.js","names":["React","useCallback","useEffect","useState","classNames","Log","MaskedInput","getNextSegmentValue","addSeparators","jsx","_jsx","log","module","DATE_PATTERN","TIME_PATTERN","FULL_DATE_PATTERN","concat","DATE_VALUE_STRING","DEFAULT_VALUE_STRING","FULL_DATE_FORMAT","fixIncompleteValue","value","length","substring","replace","removeSeparators","EXAMPLES","DateTimeInput","forwardRef","props","ref","_props$className","className","_props$onChange","onChange","undefined","_props$defaultValue","defaultValue","_props$onFocus","onFocus","_props$onBlur","onBlur","onSubmit","dataTestId","_useState","_useState2","_slicedToArray","setValue","_useState3","_useState4","selection","setSelection","normalizeText","text","normalized","dateTimeMatch","match","_dateTimeMatch","handleChange","newValue","debug","handleBlur","prevValue","fixedValue","children","example","normalizePastedText","onSelect","pattern","placeholder","displayName"],"sources":["../src/DateTimeInput.tsx"],"sourcesContent":["import React, {\n type KeyboardEvent,\n useCallback,\n useEffect,\n useState,\n} from 'react';\nimport classNames from 'classnames';\nimport Log from '@deephaven/log';\nimport MaskedInput, { type SelectionSegment } from './MaskedInput';\nimport { getNextSegmentValue } from './DateInputUtils';\nimport { addSeparators } from './DateTimeInputUtils';\n\nconst log = Log.module('DateTimeInput');\n\n// This could be more restrictive and restrict days to the number of days in the month...\n// But then gotta take leap year into account and everything.\nconst DATE_PATTERN = '[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])';\n// Put zero width spaces in the nanosecond part of the date to allow jumping between segments\nconst TIME_PATTERN =\n '([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]\\\\.[0-9]{3}\\u200B[0-9]{3}\\u200B[0-9]{3}';\nconst FULL_DATE_PATTERN = `${DATE_PATTERN} ${TIME_PATTERN}`;\nconst DATE_VALUE_STRING = '2022-01-01';\nconst DEFAULT_VALUE_STRING = `${DATE_VALUE_STRING} 00:00:00.000000000`;\nconst FULL_DATE_FORMAT = 'YYYY-MM-DD HH:MM:SS.SSSSSSSSS';\n\nexport type DateTimeInputProps = {\n className?: string;\n onChange?: (value: string) => void;\n defaultValue?: string;\n onFocus?: () => void;\n onBlur?: () => void;\n onSubmit?: (event: KeyboardEvent<HTMLInputElement>) => void;\n 'data-testid'?: string;\n};\n\nfunction fixIncompleteValue(value: string): string {\n if (value != null && value.length >= DATE_VALUE_STRING.length) {\n return `${value.substring(0, DATE_VALUE_STRING.length)}${value\n .substring(DATE_VALUE_STRING.length)\n .replace(/\\u2007/g, '0')}${DEFAULT_VALUE_STRING.substring(value.length)}`;\n }\n return value;\n}\n\nfunction removeSeparators(value: string): string {\n return value.replace(/\\u200B/g, '');\n}\n\nconst EXAMPLES = [addSeparators(DEFAULT_VALUE_STRING)];\n\nexport const DateTimeInput = React.forwardRef<\n HTMLInputElement,\n DateTimeInputProps\n>((props, ref) => {\n const {\n className = '',\n onChange = () => undefined,\n defaultValue = '',\n onFocus = () => undefined,\n onBlur = () => undefined,\n onSubmit,\n 'data-testid': dataTestId,\n } = props;\n const [value, setValue] = useState(\n defaultValue.length > 0 ? addSeparators(defaultValue) : ''\n );\n const [selection, setSelection] = useState<SelectionSegment>();\n\n /**\n * Normalize text by:\n * - Replacing 'T' with space to support ISO 8601 format\n * - Removing timezone information (e.g., \"EDT\", \"+05:00\", \"Z\")\n * - Adding zero-width space separators in the nanosecond part\n * @param text The text\n * @returns The normalized text\n */\n const normalizeText = useCallback((text: string): string => {\n // Replace first 'T' separator with space for ISO 8601 format (without global flag to preserve 'T' in timezone like EDT)\n let normalized = text.replace(/T/, ' ');\n\n // Remove timezone information\n // Match datetime up to optional fractional seconds, then strip everything else\n // Pattern: YYYY-MM-DD HH:MM:SS[.SSSSSSSSS] followed by optional timezone\n const dateTimeMatch = normalized.match(\n /^(\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?)/\n );\n\n if (dateTimeMatch) {\n [, normalized] = dateTimeMatch;\n }\n\n // Add zero-width space separators to match the expected pattern\n return addSeparators(normalized);\n }, []);\n\n // Sync internal state with defaultValue prop when it changes\n // Apply normalization to handle raw unformatted values (e.g., with timezone info)\n useEffect(() => {\n if (defaultValue.length > 0) {\n const normalized = normalizeText(defaultValue);\n setValue(normalized);\n // Notify parent with the normalized value (without separators)\n onChange(fixIncompleteValue(removeSeparators(normalized)));\n } else {\n setValue('');\n onChange('');\n }\n }, [defaultValue, normalizeText, onChange]);\n\n const handleChange = useCallback(\n (newValue: string): void => {\n log.debug('handleChange', newValue);\n setValue(newValue);\n onChange(fixIncompleteValue(removeSeparators(newValue)));\n },\n [onChange]\n );\n\n const handleBlur = useCallback((): void => {\n const prevValue = removeSeparators(value);\n const fixedValue = fixIncompleteValue(prevValue);\n // Update the value displayed in the input\n // onChange with the fixed value already triggered in handleChange\n if (fixedValue !== prevValue) {\n setValue(addSeparators(fixedValue));\n }\n onBlur();\n }, [value, onBlur]);\n\n return (\n <div className=\"d-flex flex-row align-items-center\">\n <MaskedInput\n ref={ref}\n className={classNames(className)}\n example={EXAMPLES}\n getNextSegmentValue={getNextSegmentValue}\n normalizePastedText={normalizeText}\n onChange={handleChange}\n onSelect={setSelection}\n onSubmit={onSubmit}\n pattern={FULL_DATE_PATTERN}\n placeholder={FULL_DATE_FORMAT}\n selection={selection}\n value={value}\n onFocus={onFocus}\n onBlur={handleBlur}\n data-testid={dataTestId}\n />\n </div>\n );\n});\n\nDateTimeInput.displayName = 'DateTimeInput';\n\nexport default DateTimeInput;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,9 +17,7 @@ class DebouncedSearchInput extends PureComponent {
|
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
19
|
componentDidUpdate(prevProps) {
|
|
20
|
-
var
|
|
21
|
-
value
|
|
22
|
-
} = this.props;
|
|
20
|
+
var value = this.props.value;
|
|
23
21
|
if (prevProps.value !== value) {
|
|
24
22
|
// eslint-disable-next-line react/no-did-update-set-state
|
|
25
23
|
this.setState({
|
|
@@ -37,25 +35,18 @@ class DebouncedSearchInput extends PureComponent {
|
|
|
37
35
|
}, this.sendUpdate);
|
|
38
36
|
}
|
|
39
37
|
sendUpdate() {
|
|
40
|
-
var
|
|
41
|
-
|
|
42
|
-
} = this.props;
|
|
43
|
-
var {
|
|
44
|
-
value
|
|
45
|
-
} = this.state;
|
|
38
|
+
var onChange = this.props.onChange;
|
|
39
|
+
var value = this.state.value;
|
|
46
40
|
onChange(value);
|
|
47
41
|
}
|
|
48
42
|
render() {
|
|
49
|
-
var
|
|
50
|
-
placeholder,
|
|
51
|
-
className,
|
|
52
|
-
matchCount,
|
|
53
|
-
id,
|
|
54
|
-
'data-testid'
|
|
55
|
-
|
|
56
|
-
var {
|
|
57
|
-
value
|
|
58
|
-
} = this.state;
|
|
43
|
+
var _this$props = this.props,
|
|
44
|
+
placeholder = _this$props.placeholder,
|
|
45
|
+
className = _this$props.className,
|
|
46
|
+
matchCount = _this$props.matchCount,
|
|
47
|
+
id = _this$props.id,
|
|
48
|
+
dataTestId = _this$props['data-testid'];
|
|
49
|
+
var value = this.state.value;
|
|
59
50
|
return /*#__PURE__*/_jsx(SearchInput, {
|
|
60
51
|
value: value,
|
|
61
52
|
placeholder: placeholder,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DebouncedSearchInput.js","names":["React","PureComponent","debounce","SearchInput","jsx","_jsx","DebouncedSearchInput","constructor","props","_defineProperty","searchInput","createRef","handleChange","bind","sendUpdate","debounceMs","state","value","componentDidUpdate","prevProps","setState","focus","_this$searchInput$cur","current","event","target","onChange","render","placeholder","className","matchCount","id","dataTestId","ref","undefined"],"sources":["../src/DebouncedSearchInput.tsx"],"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 'data-testid'?: 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 'data-testid': undefined,\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 {\n placeholder,\n className,\n matchCount,\n id,\n 'data-testid': dataTestId,\n } = 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 data-testid={dataTestId}\n />\n );\n }\n}\n\nexport default DebouncedSearchInput;\n"],"mappings":";;;AAAA,OAAOA,KAAK,IAAIC,aAAa,QAAQ,OAAO;AAC5C,OAAOC,QAAQ,MAAM,iBAAiB;AAAC,OAChCC,WAAW;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAiBlB,MAAMC,oBAAoB,SAASL,aAAa,CAG9C;EAUAM,WAAWA,CAACC,KAAgC,EAAE;IAC5C,KAAK,CAACA,KAAK,CAAC;IAACC,eAAA;IACb,IAAI,CAACC,WAAW,gBAAGV,KAAK,CAACW,SAAS,CAAC,CAAC;IACpC,IAAI,CAACC,YAAY,GAAG,IAAI,CAACA,YAAY,CAACC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACC,UAAU,GAAGZ,QAAQ,CAAC,IAAI,CAACY,UAAU,CAACD,IAAI,CAAC,IAAI,CAAC,EAAEL,KAAK,CAACO,UAAU,CAAC;IAExE,IAAI,CAACC,KAAK,GAAG;MACXC,KAAK,EAAET,KAAK,CAACS;IACf,CAAC;EACH;EAEAC,kBAAkBA,CAACC,SAAoC,EAAQ;IAC7D,
|
|
1
|
+
{"version":3,"file":"DebouncedSearchInput.js","names":["React","PureComponent","debounce","SearchInput","jsx","_jsx","DebouncedSearchInput","constructor","props","_defineProperty","searchInput","createRef","handleChange","bind","sendUpdate","debounceMs","state","value","componentDidUpdate","prevProps","setState","focus","_this$searchInput$cur","current","event","target","onChange","render","_this$props","placeholder","className","matchCount","id","dataTestId","ref","undefined"],"sources":["../src/DebouncedSearchInput.tsx"],"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 'data-testid'?: 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 'data-testid': undefined,\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 {\n placeholder,\n className,\n matchCount,\n id,\n 'data-testid': dataTestId,\n } = 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 data-testid={dataTestId}\n />\n );\n }\n}\n\nexport default DebouncedSearchInput;\n"],"mappings":";;;AAAA,OAAOA,KAAK,IAAIC,aAAa,QAAQ,OAAO;AAC5C,OAAOC,QAAQ,MAAM,iBAAiB;AAAC,OAChCC,WAAW;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAiBlB,MAAMC,oBAAoB,SAASL,aAAa,CAG9C;EAUAM,WAAWA,CAACC,KAAgC,EAAE;IAC5C,KAAK,CAACA,KAAK,CAAC;IAACC,eAAA;IACb,IAAI,CAACC,WAAW,gBAAGV,KAAK,CAACW,SAAS,CAAC,CAAC;IACpC,IAAI,CAACC,YAAY,GAAG,IAAI,CAACA,YAAY,CAACC,IAAI,CAAC,IAAI,CAAC;IAChD,IAAI,CAACC,UAAU,GAAGZ,QAAQ,CAAC,IAAI,CAACY,UAAU,CAACD,IAAI,CAAC,IAAI,CAAC,EAAEL,KAAK,CAACO,UAAU,CAAC;IAExE,IAAI,CAACC,KAAK,GAAG;MACXC,KAAK,EAAET,KAAK,CAACS;IACf,CAAC;EACH;EAEAC,kBAAkBA,CAACC,SAAoC,EAAQ;IAC7D,IAAQF,KAAK,GAAK,IAAI,CAACT,KAAK,CAApBS,KAAK;IACb,IAAIE,SAAS,CAACF,KAAK,KAAKA,KAAK,EAAE;MAC7B;MACA,IAAI,CAACG,QAAQ,CAAC;QAAEH;MAAM,CAAC,CAAC;IAC1B;EACF;EAIAI,KAAKA,CAAA,EAAS;IAAA,IAAAC,qBAAA;IACZ,CAAAA,qBAAA,OAAI,CAACZ,WAAW,CAACa,OAAO,cAAAD,qBAAA,eAAxBA,qBAAA,CAA0BD,KAAK,CAAC,CAAC;EACnC;EAEAT,YAAYA,CAACY,KAA0C,EAAQ;IAC7D,IAAI,CAACJ,QAAQ,CAAC;MAAEH,KAAK,EAAEO,KAAK,CAACC,MAAM,CAACR;IAAM,CAAC,EAAE,IAAI,CAACH,UAAU,CAAC;EAC/D;EAEAA,UAAUA,CAAA,EAAS;IACjB,IAAQY,QAAQ,GAAK,IAAI,CAAClB,KAAK,CAAvBkB,QAAQ;IAChB,IAAQT,KAAK,GAAK,IAAI,CAACD,KAAK,CAApBC,KAAK;IACbS,QAAQ,CAACT,KAAK,CAAC;EACjB;EAEAU,MAAMA,CAAA,EAAgB;IACpB,IAAAC,WAAA,GAMI,IAAI,CAACpB,KAAK;MALZqB,WAAW,GAAAD,WAAA,CAAXC,WAAW;MACXC,SAAS,GAAAF,WAAA,CAATE,SAAS;MACTC,UAAU,GAAAH,WAAA,CAAVG,UAAU;MACVC,EAAE,GAAAJ,WAAA,CAAFI,EAAE;MACaC,UAAU,GAAAL,WAAA,CAAzB,aAAa;IAEf,IAAQX,KAAK,GAAK,IAAI,CAACD,KAAK,CAApBC,KAAK;IACb,oBACEZ,IAAA,CAACF,WAAW;MACVc,KAAK,EAAEA,KAAM;MACbY,WAAW,EAAEA,WAAY;MACzBH,QAAQ,EAAE,IAAI,CAACd,YAAa;MAC5BkB,SAAS,EAAEA,SAAU;MACrBC,UAAU,EAAEA,UAAW;MACvBG,GAAG,EAAE,IAAI,CAACxB,WAAY;MACtBsB,EAAE,EAAEA,EAAG;MACP,eAAaC;IAAW,CACzB,CAAC;EAEN;AACF;AAACxB,eAAA,CAtEKH,oBAAoB,kBAIF;EACpBuB,WAAW,EAAE,QAAQ;EACrBC,SAAS,EAAE,EAAE;EACbC,UAAU,EAAE,IAAI;EAChBhB,UAAU,EAAE,GAAG;EACfiB,EAAE,EAAE,EAAE;EACN,aAAa,EAAEG;AACjB,CAAC;AA6DH,eAAe7B,oBAAoB","ignoreList":[]}
|
package/dist/DragUtils.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
2
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
4
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
5
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
1
7
|
import flatten from 'lodash.flatten';
|
|
2
8
|
class DragUtils {
|
|
3
9
|
/**
|
|
@@ -30,11 +36,12 @@ class DragUtils {
|
|
|
30
36
|
index
|
|
31
37
|
})).sort((a, b) => b.range[0] - a.range[0]);
|
|
32
38
|
for (var i = 0; i < sortedRanges.length; i += 1) {
|
|
33
|
-
var
|
|
34
|
-
range,
|
|
35
|
-
index
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
var _sortedRanges$i = sortedRanges[i],
|
|
40
|
+
range = _sortedRanges$i.range,
|
|
41
|
+
index = _sortedRanges$i.index;
|
|
42
|
+
var _range = _slicedToArray(range, 2),
|
|
43
|
+
start = _range[0],
|
|
44
|
+
end = _range[1];
|
|
38
45
|
items[index] = list.splice(start, end - start + 1);
|
|
39
46
|
}
|
|
40
47
|
return flatten(items);
|
|
@@ -49,7 +56,9 @@ class DragUtils {
|
|
|
49
56
|
static adjustDestinationIndex(destinationIndex, ranges) {
|
|
50
57
|
var adjustedIndex = destinationIndex;
|
|
51
58
|
for (var i = 0; i < ranges.length; i += 1) {
|
|
52
|
-
var
|
|
59
|
+
var _ranges$i = _slicedToArray(ranges[i], 2),
|
|
60
|
+
start = _ranges$i[0],
|
|
61
|
+
end = _ranges$i[1];
|
|
53
62
|
if (start > destinationIndex) {
|
|
54
63
|
break;
|
|
55
64
|
}
|
package/dist/DragUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DragUtils.js","names":["flatten","DragUtils","reorder","sourceList","selectedRanges","destinationList","destinationIndex","insertIndex","adjustDestinationIndex","draggedItems","removeItems","splice","list","ranges","items","sortedRanges","map","range","index","sort","a","b","i","length","start","end","adjustedIndex","Math","min","startDragging","document","documentElement","classList","add","stopDragging","remove"],"sources":["../src/DragUtils.ts"],"sourcesContent":["import flatten from 'lodash.flatten';\n\ntype Range = [number, number];\n\nclass DragUtils {\n /**\n * Re-orders the provided item lists in place based on the selectedRanges and destinationIndex provided\n * @param sourceList Array of the source items\n * @param selectedRanges Array of the selected ranges in the source list\n * @param destinationList Destination items. If dragging within the same list, set it to sourceItems\n * @param destinationIndex The index items are being dropped in the destinationList, adjusted for the removed items\n * @returns The items that were dragged\n */\n static reorder<T>(\n sourceList: T[],\n selectedRanges: readonly Range[],\n destinationList: T[],\n destinationIndex: number\n ): T[] {\n const insertIndex =\n sourceList === destinationList\n ? DragUtils.adjustDestinationIndex(destinationIndex, selectedRanges)\n : destinationIndex;\n const draggedItems = DragUtils.removeItems(sourceList, selectedRanges);\n destinationList.splice(insertIndex, 0, ...draggedItems);\n return draggedItems;\n }\n\n /**\n * Removes the provided ranges from the list in place\n * @param list Array of items to remove the ranges.\n * @param ranges Array of the ranges to remove.\n * @returns The removed items, in the order of the ranges removed.\n */\n static removeItems<T>(list: T[], ranges: readonly Range[]): T[] {\n const items = [];\n\n // Sort them in reverse, so we don't screw up the range indexes\n const sortedRanges = ranges\n .map((range, index) => ({ range, index }))\n .sort((a, b) => b.range[0] - a.range[0]);\n for (let i = 0; i < sortedRanges.length; i += 1) {\n const { range, index } = sortedRanges[i];\n const [start, end] = range;\n items[index] = list.splice(start, end - start + 1);\n }\n\n return flatten(items);\n }\n\n /**\n * Adjusts the destination index for when dropping into the same list you're dragging from.\n * @param destinationIndex The original destination index\n * @param ranges The ranges that are moving\n * @returns Index where item should be inserted after all ranges are removed\n */\n static adjustDestinationIndex(\n destinationIndex: number,\n ranges: readonly Range[]\n ): number {\n let adjustedIndex = destinationIndex;\n for (let i = 0; i < ranges.length; i += 1) {\n const [start, end] = ranges[i];\n if (start > destinationIndex) {\n break;\n }\n\n adjustedIndex -= Math.min(end, destinationIndex - 1) - start + 1;\n }\n return adjustedIndex;\n }\n\n static startDragging(): void {\n document.documentElement.classList.add('drag-pointer-events-none');\n }\n\n static stopDragging(): void {\n document.documentElement.classList.remove('drag-pointer-events-none');\n }\n}\n\nexport default DragUtils;\n"],"mappings":"AAAA,OAAOA,OAAO,MAAM,gBAAgB;AAIpC,MAAMC,SAAS,CAAC;EACd;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOC,OAAOA,CACZC,UAAe,EACfC,cAAgC,EAChCC,eAAoB,EACpBC,gBAAwB,EACnB;IACL,IAAMC,WAAW,GACfJ,UAAU,KAAKE,eAAe,GAC1BJ,SAAS,CAACO,sBAAsB,CAACF,gBAAgB,EAAEF,cAAc,CAAC,GAClEE,gBAAgB;IACtB,IAAMG,YAAY,GAAGR,SAAS,CAACS,WAAW,CAACP,UAAU,EAAEC,cAAc,CAAC;IACtEC,eAAe,CAACM,MAAM,CAACJ,WAAW,EAAE,CAAC,EAAE,GAAGE,YAAY,CAAC;IACvD,OAAOA,YAAY;EACrB;;EAEA;AACF;AACA;AACA;AACA;AACA;EACE,OAAOC,WAAWA,CAAIE,IAAS,EAAEC,MAAwB,EAAO;IAC9D,IAAMC,KAAK,GAAG,EAAE;;IAEhB;IACA,IAAMC,YAAY,GAAGF,MAAM,CACxBG,GAAG,CAAC,CAACC,KAAK,EAAEC,KAAK,MAAM;MAAED,KAAK;MAAEC;IAAM,CAAC,CAAC,CAAC,CACzCC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAACJ,KAAK,CAAC,CAAC,CAAC,GAAGG,CAAC,CAACH,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1C,KAAK,IAAIK,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGP,YAAY,CAACQ,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;MAC/C,
|
|
1
|
+
{"version":3,"file":"DragUtils.js","names":["flatten","DragUtils","reorder","sourceList","selectedRanges","destinationList","destinationIndex","insertIndex","adjustDestinationIndex","draggedItems","removeItems","splice","list","ranges","items","sortedRanges","map","range","index","sort","a","b","i","length","_sortedRanges$i","_range","_slicedToArray","start","end","adjustedIndex","_ranges$i","Math","min","startDragging","document","documentElement","classList","add","stopDragging","remove"],"sources":["../src/DragUtils.ts"],"sourcesContent":["import flatten from 'lodash.flatten';\n\ntype Range = [number, number];\n\nclass DragUtils {\n /**\n * Re-orders the provided item lists in place based on the selectedRanges and destinationIndex provided\n * @param sourceList Array of the source items\n * @param selectedRanges Array of the selected ranges in the source list\n * @param destinationList Destination items. If dragging within the same list, set it to sourceItems\n * @param destinationIndex The index items are being dropped in the destinationList, adjusted for the removed items\n * @returns The items that were dragged\n */\n static reorder<T>(\n sourceList: T[],\n selectedRanges: readonly Range[],\n destinationList: T[],\n destinationIndex: number\n ): T[] {\n const insertIndex =\n sourceList === destinationList\n ? DragUtils.adjustDestinationIndex(destinationIndex, selectedRanges)\n : destinationIndex;\n const draggedItems = DragUtils.removeItems(sourceList, selectedRanges);\n destinationList.splice(insertIndex, 0, ...draggedItems);\n return draggedItems;\n }\n\n /**\n * Removes the provided ranges from the list in place\n * @param list Array of items to remove the ranges.\n * @param ranges Array of the ranges to remove.\n * @returns The removed items, in the order of the ranges removed.\n */\n static removeItems<T>(list: T[], ranges: readonly Range[]): T[] {\n const items = [];\n\n // Sort them in reverse, so we don't screw up the range indexes\n const sortedRanges = ranges\n .map((range, index) => ({ range, index }))\n .sort((a, b) => b.range[0] - a.range[0]);\n for (let i = 0; i < sortedRanges.length; i += 1) {\n const { range, index } = sortedRanges[i];\n const [start, end] = range;\n items[index] = list.splice(start, end - start + 1);\n }\n\n return flatten(items);\n }\n\n /**\n * Adjusts the destination index for when dropping into the same list you're dragging from.\n * @param destinationIndex The original destination index\n * @param ranges The ranges that are moving\n * @returns Index where item should be inserted after all ranges are removed\n */\n static adjustDestinationIndex(\n destinationIndex: number,\n ranges: readonly Range[]\n ): number {\n let adjustedIndex = destinationIndex;\n for (let i = 0; i < ranges.length; i += 1) {\n const [start, end] = ranges[i];\n if (start > destinationIndex) {\n break;\n }\n\n adjustedIndex -= Math.min(end, destinationIndex - 1) - start + 1;\n }\n return adjustedIndex;\n }\n\n static startDragging(): void {\n document.documentElement.classList.add('drag-pointer-events-none');\n }\n\n static stopDragging(): void {\n document.documentElement.classList.remove('drag-pointer-events-none');\n }\n}\n\nexport default DragUtils;\n"],"mappings":";;;;;;AAAA,OAAOA,OAAO,MAAM,gBAAgB;AAIpC,MAAMC,SAAS,CAAC;EACd;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOC,OAAOA,CACZC,UAAe,EACfC,cAAgC,EAChCC,eAAoB,EACpBC,gBAAwB,EACnB;IACL,IAAMC,WAAW,GACfJ,UAAU,KAAKE,eAAe,GAC1BJ,SAAS,CAACO,sBAAsB,CAACF,gBAAgB,EAAEF,cAAc,CAAC,GAClEE,gBAAgB;IACtB,IAAMG,YAAY,GAAGR,SAAS,CAACS,WAAW,CAACP,UAAU,EAAEC,cAAc,CAAC;IACtEC,eAAe,CAACM,MAAM,CAACJ,WAAW,EAAE,CAAC,EAAE,GAAGE,YAAY,CAAC;IACvD,OAAOA,YAAY;EACrB;;EAEA;AACF;AACA;AACA;AACA;AACA;EACE,OAAOC,WAAWA,CAAIE,IAAS,EAAEC,MAAwB,EAAO;IAC9D,IAAMC,KAAK,GAAG,EAAE;;IAEhB;IACA,IAAMC,YAAY,GAAGF,MAAM,CACxBG,GAAG,CAAC,CAACC,KAAK,EAAEC,KAAK,MAAM;MAAED,KAAK;MAAEC;IAAM,CAAC,CAAC,CAAC,CACzCC,IAAI,CAAC,CAACC,CAAC,EAAEC,CAAC,KAAKA,CAAC,CAACJ,KAAK,CAAC,CAAC,CAAC,GAAGG,CAAC,CAACH,KAAK,CAAC,CAAC,CAAC,CAAC;IAC1C,KAAK,IAAIK,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGP,YAAY,CAACQ,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;MAC/C,IAAAE,eAAA,GAAyBT,YAAY,CAACO,CAAC,CAAC;QAAhCL,KAAK,GAAAO,eAAA,CAALP,KAAK;QAAEC,KAAK,GAAAM,eAAA,CAALN,KAAK;MACpB,IAAAO,MAAA,GAAAC,cAAA,CAAqBT,KAAK;QAAnBU,KAAK,GAAAF,MAAA;QAAEG,GAAG,GAAAH,MAAA;MACjBX,KAAK,CAACI,KAAK,CAAC,GAAGN,IAAI,CAACD,MAAM,CAACgB,KAAK,EAAEC,GAAG,GAAGD,KAAK,GAAG,CAAC,CAAC;IACpD;IAEA,OAAO3B,OAAO,CAACc,KAAK,CAAC;EACvB;;EAEA;AACF;AACA;AACA;AACA;AACA;EACE,OAAON,sBAAsBA,CAC3BF,gBAAwB,EACxBO,MAAwB,EAChB;IACR,IAAIgB,aAAa,GAAGvB,gBAAgB;IACpC,KAAK,IAAIgB,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGT,MAAM,CAACU,MAAM,EAAED,CAAC,IAAI,CAAC,EAAE;MACzC,IAAAQ,SAAA,GAAAJ,cAAA,CAAqBb,MAAM,CAACS,CAAC,CAAC;QAAvBK,KAAK,GAAAG,SAAA;QAAEF,GAAG,GAAAE,SAAA;MACjB,IAAIH,KAAK,GAAGrB,gBAAgB,EAAE;QAC5B;MACF;MAEAuB,aAAa,IAAIE,IAAI,CAACC,GAAG,CAACJ,GAAG,EAAEtB,gBAAgB,GAAG,CAAC,CAAC,GAAGqB,KAAK,GAAG,CAAC;IAClE;IACA,OAAOE,aAAa;EACtB;EAEA,OAAOI,aAAaA,CAAA,EAAS;IAC3BC,QAAQ,CAACC,eAAe,CAACC,SAAS,CAACC,GAAG,CAAC,0BAA0B,CAAC;EACpE;EAEA,OAAOC,YAAYA,CAAA,EAAS;IAC1BJ,QAAQ,CAACC,eAAe,CAACC,SAAS,CAACG,MAAM,CAAC,0BAA0B,CAAC;EACvE;AACF;AAEA,eAAetC,SAAS","ignoreList":[]}
|