@mezzanine-ui/react 0.15.3 → 1.0.0-alpha.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/Accordion/Accordion.js +1 -2
- package/Accordion/AccordionControlContext.js +1 -0
- package/Accordion/AccordionDetails.js +2 -2
- package/Accordion/AccordionSummary.d.ts +1 -1
- package/Accordion/AccordionSummary.js +11 -12
- package/Accordion/index.d.ts +6 -3
- package/Alert/Alert.js +1 -2
- package/Alert/index.d.ts +3 -2
- package/AlertBanner/AlertBanner.d.ts +93 -0
- package/AlertBanner/AlertBanner.js +154 -0
- package/AlertBanner/index.d.ts +2 -0
- package/AlertBanner/index.js +1 -0
- package/Anchor/Anchor.js +2 -3
- package/Anchor/index.d.ts +2 -1
- package/AppBar/AppBar.js +1 -2
- package/AppBar/AppBarBrand.js +1 -2
- package/AppBar/AppBarMain.js +1 -2
- package/AppBar/AppBarSupport.js +1 -2
- package/AppBar/index.d.ts +8 -4
- package/{Overlay/Overlay.d.ts → Backdrop/Backdrop.d.ts} +12 -16
- package/Backdrop/Backdrop.js +40 -0
- package/Backdrop/index.d.ts +2 -0
- package/Backdrop/index.js +1 -0
- package/Badge/Badge.d.ts +20 -14
- package/Badge/Badge.js +15 -18
- package/Badge/BadgeContainer.d.ts +1 -1
- package/Badge/BadgeContainer.js +2 -3
- package/Badge/index.d.ts +3 -2
- package/Badge/typings.d.ts +48 -0
- package/Breadcrumb/Breadcrumb.d.ts +6 -0
- package/Breadcrumb/Breadcrumb.js +25 -0
- package/Breadcrumb/BreadcrumbItem.d.ts +4 -0
- package/Breadcrumb/BreadcrumbItem.js +45 -0
- package/Breadcrumb/index.d.ts +2 -0
- package/Breadcrumb/index.js +1 -0
- package/Breadcrumb/typings.d.ts +70 -0
- package/Button/Button.js +24 -19
- package/Button/ButtonGroup.d.ts +6 -28
- package/Button/ButtonGroup.js +8 -18
- package/Button/index.d.ts +6 -12
- package/Button/index.js +2 -3
- package/Button/typings.d.ts +11 -26
- package/Calendar/Calendar.d.ts +31 -2
- package/Calendar/Calendar.js +75 -21
- package/Calendar/CalendarCell.d.ts +4 -0
- package/Calendar/CalendarCell.js +3 -3
- package/Calendar/CalendarConfigProviderDayjs.d.ts +21 -0
- package/Calendar/CalendarConfigProviderDayjs.js +15 -0
- package/Calendar/CalendarConfigProviderLuxon.d.ts +21 -0
- package/Calendar/CalendarConfigProviderLuxon.js +15 -0
- package/Calendar/CalendarConfigProviderMoment.d.ts +21 -0
- package/Calendar/CalendarConfigProviderMoment.js +15 -0
- package/Calendar/CalendarContext.d.ts +14 -7
- package/Calendar/CalendarContext.js +8 -13
- package/Calendar/CalendarControls.d.ts +16 -0
- package/Calendar/CalendarControls.js +3 -7
- package/Calendar/CalendarDayOfWeek.js +4 -3
- package/Calendar/CalendarDays.d.ts +9 -1
- package/Calendar/CalendarDays.js +63 -38
- package/Calendar/CalendarFooterActions.d.ts +13 -0
- package/Calendar/CalendarFooterActions.js +14 -0
- package/Calendar/CalendarFooterControl.d.ts +16 -0
- package/Calendar/CalendarFooterControl.js +14 -0
- package/Calendar/CalendarHalfYears.d.ts +39 -0
- package/Calendar/CalendarHalfYears.js +62 -0
- package/Calendar/CalendarMonths.js +17 -5
- package/Calendar/CalendarQuarters.d.ts +37 -0
- package/Calendar/CalendarQuarters.js +64 -0
- package/Calendar/CalendarQuickSelect.d.ts +21 -0
- package/Calendar/CalendarQuickSelect.js +15 -0
- package/Calendar/CalendarWeeks.d.ts +1 -1
- package/Calendar/CalendarWeeks.js +89 -44
- package/Calendar/CalendarYears.js +14 -4
- package/Calendar/RangeCalendar.d.ts +59 -0
- package/Calendar/RangeCalendar.js +232 -0
- package/Calendar/index.d.ts +33 -10
- package/Calendar/index.js +7 -0
- package/Calendar/useCalendarControlModifiers.d.ts +4 -4
- package/Calendar/useCalendarControlModifiers.js +40 -8
- package/Calendar/useCalendarControls.d.ts +2 -0
- package/Calendar/useCalendarControls.js +19 -2
- package/Calendar/useCalendarModeStack.js +1 -0
- package/Calendar/useRangeCalendarControls.d.ts +18 -0
- package/Calendar/useRangeCalendarControls.js +115 -0
- package/Card/Card.js +1 -2
- package/Card/CardActions.js +2 -3
- package/Card/index.d.ts +4 -2
- package/Checkbox/CheckAll.d.ts +16 -6
- package/Checkbox/CheckAll.js +41 -28
- package/Checkbox/Checkbox.d.ts +100 -22
- package/Checkbox/Checkbox.js +74 -18
- package/Checkbox/CheckboxGroup.d.ts +100 -18
- package/Checkbox/CheckboxGroup.js +169 -25
- package/Checkbox/CheckboxGroupContext.d.ts +0 -2
- package/Checkbox/CheckboxGroupContext.js +1 -0
- package/Checkbox/index.d.ts +16 -4
- package/Checkbox/index.js +6 -2
- package/Checkbox/typings.d.ts +37 -0
- package/ClearActions/ClearActions.d.ts +41 -0
- package/ClearActions/ClearActions.js +23 -0
- package/ClearActions/index.d.ts +3 -0
- package/ClearActions/index.js +5 -0
- package/ConfirmActions/ConfirmActions.d.ts +2 -1
- package/ConfirmActions/ConfirmActions.js +1 -2
- package/ConfirmActions/index.d.ts +2 -1
- package/DatePicker/DatePicker.d.ts +12 -1
- package/DatePicker/DatePicker.js +42 -11
- package/DatePicker/DatePickerCalendar.d.ts +3 -6
- package/DatePicker/DatePickerCalendar.js +38 -39
- package/DatePicker/index.d.ts +4 -2
- package/DateRangePicker/DateRangePicker.d.ts +18 -2
- package/DateRangePicker/DateRangePicker.js +144 -102
- package/DateRangePicker/DateRangePickerCalendar.d.ts +13 -9
- package/DateRangePicker/DateRangePickerCalendar.js +8 -96
- package/DateRangePicker/index.d.ts +6 -3
- package/DateRangePicker/useDateRangeCalendarControls.js +11 -6
- package/DateRangePicker/useDateRangePickerValue.d.ts +38 -15
- package/DateRangePicker/useDateRangePickerValue.js +142 -63
- package/DateTimePicker/DateTimePicker.d.ts +31 -10
- package/DateTimePicker/DateTimePicker.js +180 -96
- package/DateTimePicker/index.d.ts +2 -2
- package/DateTimePicker/index.js +0 -1
- package/Drawer/Drawer.js +3 -4
- package/Drawer/index.d.ts +2 -1
- package/Dropdown/Dropdown.js +13 -24
- package/Dropdown/index.d.ts +2 -1
- package/Empty/Empty.d.ts +1 -16
- package/Empty/Empty.js +37 -9
- package/Empty/icons/EmptyMainInitialDataIcon.d.ts +4 -0
- package/Empty/icons/EmptyMainInitialDataIcon.js +9 -0
- package/Empty/icons/EmptyMainResultIcon.d.ts +4 -0
- package/Empty/icons/EmptyMainResultIcon.js +9 -0
- package/Empty/icons/EmptyMainSystemIcon.d.ts +4 -0
- package/Empty/icons/EmptyMainSystemIcon.js +9 -0
- package/Empty/index.d.ts +2 -1
- package/Empty/typings.d.ts +52 -0
- package/Form/FormControlContext.js +1 -0
- package/Form/FormField.js +1 -2
- package/Form/FormHintText.d.ts +18 -0
- package/Form/FormHintText.js +17 -0
- package/Form/FormLabel.js +2 -2
- package/Form/index.d.ts +9 -5
- package/Form/index.js +1 -1
- package/Form/useAutoCompleteValueControl.js +2 -0
- package/Form/useCheckboxControlValue.js +0 -1
- package/Form/useInputWithClearControlValue.d.ts +1 -1
- package/Form/useInputWithTagsModeValue.d.ts +1 -1
- package/Form/useSelectValueControl.js +2 -0
- package/Icon/Icon.js +1 -2
- package/InlineMessage/InlineMessage.d.ts +33 -0
- package/InlineMessage/InlineMessage.js +42 -0
- package/InlineMessage/InlineMessageGroup.d.ts +24 -0
- package/InlineMessage/InlineMessageGroup.js +21 -0
- package/InlineMessage/index.d.ts +4 -0
- package/InlineMessage/index.js +2 -0
- package/Input/ActionButton/ActionButton.d.ts +26 -0
- package/Input/ActionButton/ActionButton.js +14 -0
- package/Input/ActionButton/index.d.ts +2 -0
- package/Input/ActionButton/index.js +1 -0
- package/Input/Input.d.ts +147 -42
- package/Input/Input.js +196 -31
- package/Input/PasswordStrengthIndicator/PasswordStrengthIndicator.d.ts +31 -0
- package/Input/PasswordStrengthIndicator/PasswordStrengthIndicator.js +18 -0
- package/Input/PasswordStrengthIndicator/index.d.ts +2 -0
- package/Input/PasswordStrengthIndicator/index.js +1 -0
- package/Input/SelectButton/SelectButton.d.ts +20 -0
- package/Input/SelectButton/SelectButton.js +21 -0
- package/Input/SelectButton/index.d.ts +2 -0
- package/Input/SelectButton/index.js +1 -0
- package/Input/SpinnerButton/SpinnerButton.d.ts +19 -0
- package/Input/SpinnerButton/SpinnerButton.js +14 -0
- package/Input/SpinnerButton/index.d.ts +2 -0
- package/Input/SpinnerButton/index.js +1 -0
- package/Input/index.d.ts +3 -2
- package/Menu/Menu.js +2 -2
- package/Menu/MenuDivider.js +1 -2
- package/Menu/MenuItem.js +1 -2
- package/Menu/MenuItemGroup.js +1 -2
- package/Menu/index.d.ts +8 -4
- package/Message/Message.d.ts +6 -4
- package/Message/Message.js +87 -11
- package/Message/MessageTimerController.d.ts +14 -0
- package/Message/MessageTimerController.js +27 -0
- package/Message/index.d.ts +3 -2
- package/Modal/Modal.js +3 -4
- package/Modal/ModalActions.js +2 -2
- package/Modal/ModalBody.js +1 -2
- package/Modal/ModalControl.js +1 -0
- package/Modal/ModalFooter.js +1 -2
- package/Modal/ModalHeader.js +3 -3
- package/Modal/index.d.ts +10 -5
- package/Modal/useModalContainer.d.ts +1 -1
- package/Modal/useModalContainer.js +2 -4
- package/Navigation/Navigation.js +38 -36
- package/Navigation/NavigationContext.js +1 -0
- package/Navigation/NavigationItem.js +2 -2
- package/Navigation/NavigationSubMenu.js +17 -28
- package/Navigation/index.d.ts +8 -4
- package/Notification/Notification.js +1 -3
- package/Notification/index.d.ts +3 -2
- package/Notifier/NotifierManager.d.ts +16 -3
- package/Notifier/NotifierManager.js +60 -18
- package/Notifier/createNotifier.d.ts +9 -0
- package/Notifier/createNotifier.js +3 -2
- package/Notifier/typings.d.ts +3 -1
- package/OverflowTooltip/OverflowCounterTag.d.ts +12 -0
- package/OverflowTooltip/OverflowCounterTag.js +48 -0
- package/OverflowTooltip/OverflowTooltip.d.ts +34 -0
- package/OverflowTooltip/OverflowTooltip.js +53 -0
- package/OverflowTooltip/index.d.ts +2 -0
- package/OverflowTooltip/index.js +2 -0
- package/PageFooter/PageFooter.d.ts +73 -8
- package/PageFooter/PageFooter.js +35 -5
- package/PageFooter/index.d.ts +2 -1
- package/PageHeader/PageHeader.d.ts +36 -0
- package/PageHeader/PageHeader.js +65 -0
- package/PageHeader/index.d.ts +2 -0
- package/PageHeader/index.js +1 -0
- package/PageToolbar/PageToolbar.d.ts +67 -0
- package/PageToolbar/PageToolbar.js +114 -0
- package/PageToolbar/index.d.ts +2 -0
- package/PageToolbar/index.js +1 -0
- package/Pagination/Pagination.d.ts +23 -29
- package/Pagination/Pagination.js +4 -6
- package/Pagination/PaginationItem.d.ts +1 -1
- package/Pagination/PaginationItem.js +7 -5
- package/Pagination/PaginationJumper.d.ts +7 -9
- package/Pagination/PaginationJumper.js +4 -7
- package/Pagination/PaginationPageSize.d.ts +8 -11
- package/Pagination/PaginationPageSize.js +6 -6
- package/Pagination/index.d.ts +8 -4
- package/Pagination/usePagination.d.ts +3 -1
- package/Pagination/usePagination.js +30 -21
- package/Picker/FormattedInput.d.ts +17 -0
- package/Picker/FormattedInput.js +74 -0
- package/Picker/MaskFormat.d.ts +39 -0
- package/Picker/MaskFormat.js +94 -0
- package/Picker/PickerTrigger.d.ts +14 -4
- package/Picker/PickerTrigger.js +18 -4
- package/Picker/PickerTriggerWithSeparator.d.ts +124 -0
- package/Picker/PickerTriggerWithSeparator.js +80 -0
- package/Picker/RangePickerTrigger.d.ts +57 -6
- package/Picker/RangePickerTrigger.js +66 -9
- package/Picker/formatUtils.d.ts +34 -0
- package/Picker/formatUtils.js +124 -0
- package/Picker/index.d.ts +17 -6
- package/Picker/index.js +4 -1
- package/Picker/useDateInputFormatter.d.ts +52 -0
- package/Picker/useDateInputFormatter.js +382 -0
- package/Picker/usePickerDocumentEventClose.d.ts +3 -3
- package/Picker/usePickerValue.d.ts +2 -3
- package/Picker/usePickerValue.js +8 -13
- package/Picker/useTabKeyClose.d.ts +1 -1
- package/Popconfirm/Popconfirm.js +3 -4
- package/Popconfirm/index.d.ts +2 -1
- package/Popover/Popover.js +5 -10
- package/Popover/index.d.ts +2 -1
- package/Popper/Popper.d.ts +15 -10
- package/Popper/Popper.js +89 -19
- package/Popper/index.d.ts +2 -1
- package/Portal/Portal.d.ts +13 -5
- package/Portal/Portal.js +26 -12
- package/Portal/index.d.ts +4 -1
- package/Portal/index.js +1 -0
- package/Portal/portalRegistry.d.ts +17 -0
- package/Portal/portalRegistry.js +92 -0
- package/Progress/Progress.d.ts +23 -30
- package/Progress/Progress.js +72 -23
- package/Progress/index.d.ts +3 -2
- package/Provider/ConfigProvider.d.ts +2 -1
- package/Provider/ConfigProvider.js +1 -0
- package/Provider/context.js +1 -0
- package/Radio/Radio.d.ts +1 -1
- package/Radio/Radio.js +3 -3
- package/Radio/RadioGroup.d.ts +1 -1
- package/Radio/RadioGroup.js +2 -3
- package/Radio/RadioGroupContext.js +1 -0
- package/Radio/index.d.ts +4 -2
- package/ResultState/ResultState.d.ts +52 -0
- package/ResultState/ResultState.js +24 -0
- package/ResultState/index.d.ts +2 -0
- package/ResultState/index.js +1 -0
- package/Select/AutoComplete.d.ts +3 -3
- package/Select/AutoComplete.js +6 -13
- package/Select/Option.js +2 -2
- package/Select/Select.d.ts +1 -1
- package/Select/Select.js +3 -3
- package/Select/SelectControlContext.js +1 -0
- package/Select/SelectTrigger.d.ts +1 -87
- package/Select/SelectTrigger.js +27 -23
- package/Select/SelectTriggerTags.d.ts +1 -1
- package/Select/SelectTriggerTags.js +48 -20
- package/Select/TreeSelect.d.ts +1 -1
- package/Select/TreeSelect.js +3 -3
- package/Select/index.d.ts +14 -7
- package/Select/typings.d.ts +99 -0
- package/Select/useSelectTriggerTags.d.ts +15 -8
- package/Select/useSelectTriggerTags.js +79 -43
- package/Selection/Selection.d.ts +98 -0
- package/Selection/Selection.js +46 -0
- package/Selection/index.d.ts +12 -0
- package/Selection/index.js +5 -0
- package/Skeleton/Skeleton.d.ts +10 -3
- package/Skeleton/Skeleton.js +13 -6
- package/Skeleton/index.d.ts +2 -1
- package/Slider/Slider.d.ts +44 -7
- package/Slider/Slider.js +18 -15
- package/Slider/index.d.ts +5 -3
- package/Slider/useSlider.d.ts +1 -1
- package/Slider/useSlider.js +1 -1
- package/Spin/Spin.d.ts +39 -0
- package/{Loading/Loading.js → Spin/Spin.js} +9 -10
- package/Spin/index.d.ts +2 -0
- package/Spin/index.js +1 -0
- package/Stepper/Step.d.ts +1 -35
- package/Stepper/Step.js +44 -10
- package/Stepper/Stepper.d.ts +1 -14
- package/Stepper/Stepper.js +50 -17
- package/Stepper/index.d.ts +5 -2
- package/Stepper/index.js +1 -0
- package/Stepper/typings.d.ts +77 -0
- package/Stepper/useStepDistance.d.ts +10 -0
- package/Stepper/useStepDistance.js +81 -0
- package/Stepper/useStepper.d.ts +21 -0
- package/Stepper/useStepper.js +26 -0
- package/Table/Table.d.ts +1 -1
- package/Table/Table.js +3 -4
- package/Table/TableBody.js +3 -2
- package/Table/TableBodyRow.js +1 -0
- package/Table/TableCell.js +1 -2
- package/Table/TableContext.js +1 -0
- package/Table/TableExpandedTable.js +1 -0
- package/Table/TableHeader.js +1 -0
- package/Table/draggable/useTableDraggable.d.ts +1 -1
- package/Table/editable/TableEditRenderWrapper.js +1 -0
- package/Table/expandable/TableExpandable.js +1 -1
- package/Table/index.d.ts +7 -4
- package/Table/pagination/TablePagination.d.ts +1 -1
- package/Table/pagination/TablePagination.js +1 -0
- package/Table/pagination/useTablePagination.d.ts +1 -1
- package/Table/pagination/useTablePagination.js +1 -0
- package/Table/refresh/TableRefresh.js +4 -3
- package/Table/rowSelection/TableRowSelection.js +3 -2
- package/Table/sorting/TableSortingIcon.js +2 -1
- package/Table/sorting/useTableSorting.js +1 -0
- package/Table/useTableFetchMore.js +1 -1
- package/Table/useTableScroll.d.ts +44 -14
- package/Table/useTableScroll.js +10 -8
- package/Tabs/Tab.js +1 -2
- package/Tabs/TabPane.js +2 -2
- package/Tabs/Tabs.js +10 -6
- package/Tabs/index.d.ts +6 -3
- package/Tabs/useTabsOverflow.d.ts +1 -1
- package/Tabs/useTabsOverflow.js +4 -3
- package/Tag/Tag.d.ts +2 -25
- package/Tag/Tag.js +24 -15
- package/Tag/TagGroup.d.ts +12 -0
- package/Tag/TagGroup.js +41 -0
- package/Tag/index.d.ts +2 -1
- package/Tag/typings.d.ts +78 -0
- package/TextField/TextField.d.ts +78 -20
- package/TextField/TextField.js +59 -24
- package/TextField/index.d.ts +2 -1
- package/Textarea/Textarea.d.ts +19 -51
- package/Textarea/Textarea.js +14 -21
- package/Textarea/index.d.ts +2 -2
- package/TimePanel/TimePanel.d.ts +1 -22
- package/TimePanel/TimePanel.js +32 -28
- package/TimePanel/TimePanelAction.d.ts +2 -8
- package/TimePanel/TimePanelAction.js +3 -4
- package/TimePanel/TimePanelColumn.d.ts +0 -13
- package/TimePanel/TimePanelColumn.js +10 -13
- package/TimePanel/index.d.ts +6 -3
- package/TimePicker/TimePicker.d.ts +10 -1
- package/TimePicker/TimePicker.js +87 -37
- package/TimePicker/TimePickerPanel.d.ts +1 -2
- package/TimePicker/TimePickerPanel.js +3 -4
- package/TimePicker/index.d.ts +4 -2
- package/Toggle/Toggle.d.ts +46 -0
- package/Toggle/Toggle.js +29 -0
- package/Toggle/index.d.ts +3 -0
- package/Toggle/index.js +1 -0
- package/Tooltip/Tooltip.d.ts +14 -3
- package/Tooltip/Tooltip.js +53 -18
- package/Tooltip/index.d.ts +2 -1
- package/Tooltip/useDelayMouseEnterLeave.d.ts +1 -2
- package/Tooltip/useDelayMouseEnterLeave.js +10 -13
- package/Transition/Collapse.d.ts +2 -0
- package/Transition/Collapse.js +7 -12
- package/Transition/Fade.js +5 -6
- package/Transition/Rotate.d.ts +42 -0
- package/Transition/Rotate.js +30 -0
- package/Transition/Scale.d.ts +13 -0
- package/Transition/{Grow.js → Scale.js} +19 -17
- package/Transition/Slide.d.ts +7 -0
- package/Transition/{Zoom.js → Slide.js} +14 -13
- package/Transition/SlideFade.d.ts +3 -0
- package/Transition/SlideFade.js +6 -6
- package/Transition/Transition.d.ts +3 -3
- package/Transition/Translate.d.ts +14 -0
- package/Transition/Translate.js +94 -0
- package/Transition/index.d.ts +16 -6
- package/Transition/index.js +4 -2
- package/Transition/useAutoTransitionDuration.d.ts +1 -1
- package/Transition/useAutoTransitionDuration.js +3 -3
- package/Transition/useSetNodeTransition.js +0 -2
- package/Tree/Tree.js +1 -2
- package/Tree/TreeNode.js +8 -8
- package/Tree/TreeNodeList.js +1 -2
- package/Tree/index.d.ts +10 -5
- package/Tree/typings.d.ts +2 -2
- package/Typography/Typography.d.ts +6 -9
- package/Typography/Typography.js +7 -9
- package/Typography/index.d.ts +4 -7
- package/Upload/Upload.d.ts +175 -0
- package/Upload/Upload.js +279 -0
- package/Upload/UploadItem.d.ts +82 -0
- package/Upload/UploadItem.js +118 -0
- package/Upload/UploadPictureCard.d.ts +110 -0
- package/Upload/UploadPictureCard.js +101 -0
- package/Upload/Uploader.d.ts +161 -0
- package/Upload/Uploader.js +120 -0
- package/Upload/index.d.ts +8 -6
- package/Upload/index.js +4 -5
- package/Upload/upload-utils.d.ts +41 -0
- package/Upload/upload-utils.js +65 -0
- package/_internal/InputCheck/InputCheck.js +1 -2
- package/_internal/InputCheck/InputCheckGroup.js +1 -2
- package/_internal/InputCheck/index.d.ts +4 -2
- package/_internal/InputTriggerPopper/InputTriggerPopper.js +16 -27
- package/_internal/InputTriggerPopper/index.d.ts +2 -1
- package/_internal/SlideFadeOverlay/SlideFadeOverlay.d.ts +2 -2
- package/_internal/SlideFadeOverlay/SlideFadeOverlay.js +5 -29
- package/_internal/SlideFadeOverlay/index.d.ts +2 -1
- package/_internal/SlideFadeOverlay/useTopStack.js +1 -0
- package/dayjs.d.ts +21 -0
- package/dayjs.js +2 -0
- package/hooks/useClickAway.d.ts +1 -1
- package/hooks/useComposeRefs.js +1 -1
- package/hooks/useLastCallback.js +3 -1
- package/hooks/useScrollLock.d.ts +28 -0
- package/hooks/useScrollLock.js +134 -0
- package/index.d.ts +126 -58
- package/index.js +103 -90
- package/luxon.d.ts +21 -0
- package/luxon.js +2 -0
- package/moment.d.ts +21 -0
- package/moment.js +2 -0
- package/package.json +16 -20
- package/utils/composeRefs.js +0 -1
- package/utils/get-css-variable-value.d.ts +1 -0
- package/utils/get-css-variable-value.js +9 -0
- package/utils/jsx-types.d.ts +1 -1
- package/Button/IconButton.d.ts +0 -21
- package/Button/IconButton.js +0 -13
- package/DateTimePicker/DateTimePickerPanel.d.ts +0 -28
- package/DateTimePicker/DateTimePickerPanel.js +0 -50
- package/Form/FormMessage.d.ts +0 -7
- package/Form/FormMessage.js +0 -19
- package/Form/useInputWithTagsModeValue.js +0 -86
- package/Loading/Loading.d.ts +0 -33
- package/Loading/index.d.ts +0 -1
- package/Loading/index.js +0 -1
- package/Overlay/Overlay.js +0 -32
- package/Overlay/index.d.ts +0 -1
- package/Overlay/index.js +0 -1
- package/Picker/useRangePickerValue.d.ts +0 -23
- package/Picker/useRangePickerValue.js +0 -99
- package/Switch/Switch.d.ts +0 -43
- package/Switch/Switch.js +0 -29
- package/Switch/index.d.ts +0 -2
- package/Switch/index.js +0 -1
- package/Transition/Grow.d.ts +0 -12
- package/Transition/Zoom.d.ts +0 -7
- package/Upload/UploadButton.d.ts +0 -9
- package/Upload/UploadButton.js +0 -24
- package/Upload/UploadInput.d.ts +0 -20
- package/Upload/UploadInput.js +0 -24
- package/Upload/UploadPicture.d.ts +0 -49
- package/Upload/UploadPicture.js +0 -52
- package/Upload/UploadPictureBlock.d.ts +0 -20
- package/Upload/UploadPictureBlock.js +0 -82
- package/Upload/UploadPictureWall.d.ts +0 -81
- package/Upload/UploadPictureWall.js +0 -169
- package/Upload/UploadPictureWallItem.d.ts +0 -15
- package/Upload/UploadPictureWallItem.js +0 -18
- package/Upload/UploadResult.d.ts +0 -35
- package/Upload/UploadResult.js +0 -30
- package/utils/scroll-lock.d.ts +0 -2
- package/utils/scroll-lock.js +0 -24
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Format key characters that can appear in patterns
|
|
3
|
+
*/
|
|
4
|
+
const FORMAT_KEY_CHARS = new Set([
|
|
5
|
+
'Y',
|
|
6
|
+
'g',
|
|
7
|
+
'G',
|
|
8
|
+
'W',
|
|
9
|
+
'w', // Locale week (not ISO week)
|
|
10
|
+
'M',
|
|
11
|
+
'D',
|
|
12
|
+
'H', // Hour (0-23)
|
|
13
|
+
'n', // Half-year number (1-2)
|
|
14
|
+
'm',
|
|
15
|
+
's',
|
|
16
|
+
'S',
|
|
17
|
+
'Q',
|
|
18
|
+
]);
|
|
19
|
+
/**
|
|
20
|
+
* Parse format string into segments with their actual value positions
|
|
21
|
+
* Handles bracket literals and consecutive format keys
|
|
22
|
+
*/
|
|
23
|
+
function parseFormatSegments(format) {
|
|
24
|
+
const segments = [];
|
|
25
|
+
let valuePos = 0;
|
|
26
|
+
let i = 0;
|
|
27
|
+
while (i < format.length) {
|
|
28
|
+
const char = format[i];
|
|
29
|
+
// Handle escaped literals [...]
|
|
30
|
+
if (char === '[') {
|
|
31
|
+
const closeIndex = format.indexOf(']', i);
|
|
32
|
+
if (closeIndex !== -1) {
|
|
33
|
+
for (let j = i + 1; j < closeIndex; j++) {
|
|
34
|
+
segments.push({
|
|
35
|
+
type: 'literal',
|
|
36
|
+
text: format[j],
|
|
37
|
+
start: valuePos,
|
|
38
|
+
end: valuePos + 1,
|
|
39
|
+
});
|
|
40
|
+
valuePos++;
|
|
41
|
+
}
|
|
42
|
+
i = closeIndex + 1;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Handle format keys (consecutive same characters)
|
|
47
|
+
if (FORMAT_KEY_CHARS.has(char)) {
|
|
48
|
+
const keyStart = i;
|
|
49
|
+
while (i + 1 < format.length && format[i + 1] === char) {
|
|
50
|
+
i++;
|
|
51
|
+
}
|
|
52
|
+
const keyLength = i - keyStart + 1;
|
|
53
|
+
segments.push({
|
|
54
|
+
type: 'mask',
|
|
55
|
+
text: char.repeat(keyLength),
|
|
56
|
+
start: valuePos,
|
|
57
|
+
end: valuePos + keyLength,
|
|
58
|
+
});
|
|
59
|
+
valuePos += keyLength;
|
|
60
|
+
i++;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
// Handle separators
|
|
64
|
+
segments.push({
|
|
65
|
+
type: 'separator',
|
|
66
|
+
text: char,
|
|
67
|
+
start: valuePos,
|
|
68
|
+
end: valuePos + 1,
|
|
69
|
+
});
|
|
70
|
+
valuePos++;
|
|
71
|
+
i++;
|
|
72
|
+
}
|
|
73
|
+
return segments;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check if a mask segment is fully filled with digits
|
|
77
|
+
*/
|
|
78
|
+
function isMaskSegmentFilled(value, segment) {
|
|
79
|
+
if (segment.type !== 'mask')
|
|
80
|
+
return true;
|
|
81
|
+
for (let i = segment.start; i < segment.end; i++) {
|
|
82
|
+
if (!/\d/.test(value[i])) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Find the last mask segment before a given position
|
|
90
|
+
*/
|
|
91
|
+
function findPreviousMaskSegment(segments, currentPos) {
|
|
92
|
+
let lastMask = null;
|
|
93
|
+
for (const segment of segments) {
|
|
94
|
+
if (segment.start >= currentPos)
|
|
95
|
+
break;
|
|
96
|
+
if (segment.type === 'mask') {
|
|
97
|
+
lastMask = segment;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return lastMask;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Strip brackets from format string to get template without brackets
|
|
104
|
+
*/
|
|
105
|
+
function getTemplateWithoutBrackets(format) {
|
|
106
|
+
let template = '';
|
|
107
|
+
let i = 0;
|
|
108
|
+
while (i < format.length) {
|
|
109
|
+
const char = format[i];
|
|
110
|
+
if (char === '[') {
|
|
111
|
+
const closeIndex = format.indexOf(']', i);
|
|
112
|
+
if (closeIndex !== -1) {
|
|
113
|
+
template += format.slice(i + 1, closeIndex);
|
|
114
|
+
i = closeIndex + 1;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
template += char;
|
|
119
|
+
i++;
|
|
120
|
+
}
|
|
121
|
+
return template;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export { FORMAT_KEY_CHARS, findPreviousMaskSegment, getTemplateWithoutBrackets, isMaskSegmentFilled, parseFormatSegments };
|
package/Picker/index.d.ts
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
export { useTabKeyClose } from './useTabKeyClose';
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
7
|
-
export {
|
|
2
|
+
export { usePickerDocumentEventClose } from './usePickerDocumentEventClose';
|
|
3
|
+
export type { UsePickerDocumentEventCloseProps } from './usePickerDocumentEventClose';
|
|
4
|
+
export { usePickerInputValue } from './usePickerInputValue';
|
|
5
|
+
export type { UsePickerInputValueProps } from './usePickerInputValue';
|
|
6
|
+
export { usePickerValue } from './usePickerValue';
|
|
7
|
+
export type { UsePickerValueProps } from './usePickerValue';
|
|
8
|
+
export type { PickerTriggerProps } from './PickerTrigger';
|
|
9
|
+
export { default as PickerTrigger } from './PickerTrigger';
|
|
10
|
+
export { default as PickerTriggerWithSeparator } from './PickerTriggerWithSeparator';
|
|
11
|
+
export type { PickerTriggerWithSeparatorProps } from './PickerTriggerWithSeparator';
|
|
12
|
+
export { default as RangePickerTrigger } from './RangePickerTrigger';
|
|
13
|
+
export type { RangePickerTriggerProps } from './RangePickerTrigger';
|
|
14
|
+
export { default as FormattedInput } from './FormattedInput';
|
|
15
|
+
export type { FormattedInputProps } from './FormattedInput';
|
|
16
|
+
export { useDateInputFormatter } from './useDateInputFormatter';
|
|
17
|
+
export type { UseDateInputFormatterProps } from './useDateInputFormatter';
|
|
18
|
+
export { default as MaskFormat } from './MaskFormat';
|
package/Picker/index.js
CHANGED
|
@@ -2,6 +2,9 @@ export { useTabKeyClose } from './useTabKeyClose.js';
|
|
|
2
2
|
export { usePickerDocumentEventClose } from './usePickerDocumentEventClose.js';
|
|
3
3
|
export { usePickerInputValue } from './usePickerInputValue.js';
|
|
4
4
|
export { usePickerValue } from './usePickerValue.js';
|
|
5
|
-
export { useRangePickerValue } from './useRangePickerValue.js';
|
|
6
5
|
export { default as PickerTrigger } from './PickerTrigger.js';
|
|
6
|
+
export { default as PickerTriggerWithSeparator } from './PickerTriggerWithSeparator.js';
|
|
7
7
|
export { default as RangePickerTrigger } from './RangePickerTrigger.js';
|
|
8
|
+
export { default as FormattedInput } from './FormattedInput.js';
|
|
9
|
+
export { useDateInputFormatter } from './useDateInputFormatter.js';
|
|
10
|
+
export { default as MaskFormat } from './MaskFormat.js';
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ClipboardEventHandler, FocusEventHandler, KeyboardEvent } from 'react';
|
|
2
|
+
export interface UseDateInputFormatterProps {
|
|
3
|
+
/**
|
|
4
|
+
* error messages for different validation scenarios
|
|
5
|
+
* @default { enabled: true, invalidInput: 'Input value is not valid.', invalidPaste: 'Pasted content is not valid.' }
|
|
6
|
+
*/
|
|
7
|
+
errorMessages?: {
|
|
8
|
+
enabled?: boolean;
|
|
9
|
+
invalidInput?: string;
|
|
10
|
+
invalidPaste?: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Format pattern (e.g., "YYYY-MM-DD", "HH:mm:ss")
|
|
14
|
+
*/
|
|
15
|
+
format: string;
|
|
16
|
+
/**
|
|
17
|
+
* Current value
|
|
18
|
+
*/
|
|
19
|
+
value?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Change handler receiving formatted value and raw digits
|
|
22
|
+
*/
|
|
23
|
+
onChange?: (formattedValue: string, rawDigits: string) => void;
|
|
24
|
+
/**
|
|
25
|
+
* Input ref for controlling selection
|
|
26
|
+
*/
|
|
27
|
+
inputRef?: React.RefObject<HTMLInputElement | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Focus event handler
|
|
30
|
+
*/
|
|
31
|
+
onFocus?: FocusEventHandler<HTMLInputElement>;
|
|
32
|
+
/**
|
|
33
|
+
* Blur event handler
|
|
34
|
+
*/
|
|
35
|
+
onBlur?: FocusEventHandler<HTMLInputElement>;
|
|
36
|
+
/**
|
|
37
|
+
* Custom validation function. Return true if valid, false to clear the value.
|
|
38
|
+
* Called after format validation passes.
|
|
39
|
+
*/
|
|
40
|
+
validate?: (isoDate: string) => boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Hook for formatting date/time input with mask format
|
|
44
|
+
*/
|
|
45
|
+
export declare function useDateInputFormatter(props: UseDateInputFormatterProps): {
|
|
46
|
+
value: string;
|
|
47
|
+
focused: boolean;
|
|
48
|
+
handleKeyDown: (e: KeyboardEvent<HTMLInputElement>) => void;
|
|
49
|
+
handleFocus: FocusEventHandler<HTMLInputElement>;
|
|
50
|
+
handleBlur: FocusEventHandler<HTMLInputElement>;
|
|
51
|
+
handlePaste: ClipboardEventHandler<HTMLInputElement>;
|
|
52
|
+
};
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { useRef, useState, useCallback, useEffect } from 'react';
|
|
2
|
+
import MaskFormat, { getMaskRange } from './MaskFormat.js';
|
|
3
|
+
import { getTemplateWithoutBrackets } from './formatUtils.js';
|
|
4
|
+
import { useCalendarContext } from '../Calendar/CalendarContext.js';
|
|
5
|
+
import Message from '../Message/Message.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Hook for formatting date/time input with mask format
|
|
9
|
+
*/
|
|
10
|
+
function useDateInputFormatter(props) {
|
|
11
|
+
const { errorMessages = {
|
|
12
|
+
enabled: true,
|
|
13
|
+
invalidInput: 'Input value is not valid.',
|
|
14
|
+
invalidPaste: 'Pasted content is not valid.',
|
|
15
|
+
}, format, value: externalValue = '', onChange, inputRef, onFocus: onFocusProp, onBlur: onBlurProp, validate, } = props;
|
|
16
|
+
const { parseFormattedValue, isValid, locale, formatToString } = useCalendarContext();
|
|
17
|
+
const maskFormat = useRef(new MaskFormat(format)).current;
|
|
18
|
+
const [internalValue, setInternalValue] = useState(externalValue || getTemplateWithoutBrackets(format));
|
|
19
|
+
// Track focus state
|
|
20
|
+
const [focused, setFocused] = useState(false);
|
|
21
|
+
/**
|
|
22
|
+
* Check if value is completely filled and valid
|
|
23
|
+
*/
|
|
24
|
+
const isValueComplete = useCallback((val) => {
|
|
25
|
+
return maskFormat.match(val);
|
|
26
|
+
}, [maskFormat]);
|
|
27
|
+
// Sync external value - only update internal when external explicitly changes
|
|
28
|
+
const prevExternalValue = useRef(externalValue);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
// Only sync when external value actually changes (not caused by our own onChange)
|
|
31
|
+
if (externalValue !== prevExternalValue.current) {
|
|
32
|
+
prevExternalValue.current = externalValue;
|
|
33
|
+
if (externalValue) {
|
|
34
|
+
setInternalValue(externalValue);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// External cleared - reset to template
|
|
38
|
+
setInternalValue(getTemplateWithoutBrackets(format));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}, [externalValue, format]);
|
|
42
|
+
/**
|
|
43
|
+
* Trigger value change
|
|
44
|
+
*/
|
|
45
|
+
const triggerChange = useCallback((newValue, cursorPosition) => {
|
|
46
|
+
setInternalValue(newValue);
|
|
47
|
+
// Only trigger onChange if value is complete and valid
|
|
48
|
+
if (onChange && isValueComplete(newValue)) {
|
|
49
|
+
// Try to parse and validate the formatted value
|
|
50
|
+
const isoDate = parseFormattedValue(newValue, format, locale);
|
|
51
|
+
// Validate format and custom validation (e.g., time step)
|
|
52
|
+
if (isoDate && (!validate || validate(isoDate))) {
|
|
53
|
+
const rawDigits = newValue.replace(/[^0-9]/g, '');
|
|
54
|
+
onChange(isoDate, rawDigits);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
if (errorMessages.enabled) {
|
|
58
|
+
Message.error(errorMessages.invalidInput);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Restore cursor position after React re-renders
|
|
63
|
+
if (cursorPosition !== undefined && (inputRef === null || inputRef === void 0 ? void 0 : inputRef.current)) {
|
|
64
|
+
requestAnimationFrame(() => {
|
|
65
|
+
var _a;
|
|
66
|
+
(_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.setSelectionRange(cursorPosition, cursorPosition);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}, [
|
|
70
|
+
errorMessages,
|
|
71
|
+
onChange,
|
|
72
|
+
inputRef,
|
|
73
|
+
isValueComplete,
|
|
74
|
+
parseFormattedValue,
|
|
75
|
+
format,
|
|
76
|
+
validate,
|
|
77
|
+
locale,
|
|
78
|
+
]);
|
|
79
|
+
/**
|
|
80
|
+
* Handle focus event
|
|
81
|
+
*/
|
|
82
|
+
const handleFocus = useCallback((e) => {
|
|
83
|
+
setFocused(true);
|
|
84
|
+
onFocusProp === null || onFocusProp === void 0 ? void 0 : onFocusProp(e);
|
|
85
|
+
// If value doesn't match format, fill with format template
|
|
86
|
+
if (!maskFormat.match(internalValue)) {
|
|
87
|
+
triggerChange(getTemplateWithoutBrackets(format));
|
|
88
|
+
}
|
|
89
|
+
}, [format, internalValue, maskFormat, triggerChange, onFocusProp]);
|
|
90
|
+
/**
|
|
91
|
+
* Handle blur event - clear incomplete values
|
|
92
|
+
*/
|
|
93
|
+
const handleBlur = useCallback((e) => {
|
|
94
|
+
setFocused(false);
|
|
95
|
+
onBlurProp === null || onBlurProp === void 0 ? void 0 : onBlurProp(e);
|
|
96
|
+
// If value is incomplete, clear it and notify parent
|
|
97
|
+
if (!isValueComplete(internalValue)) {
|
|
98
|
+
const templateValue = getTemplateWithoutBrackets(format);
|
|
99
|
+
setInternalValue(templateValue);
|
|
100
|
+
// Notify parent that value is cleared
|
|
101
|
+
if (onChange) {
|
|
102
|
+
onChange('', '');
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// Value is complete, validate it
|
|
107
|
+
const isoDate = parseFormattedValue(internalValue, format, locale);
|
|
108
|
+
if (!isoDate) {
|
|
109
|
+
// Invalid date/time format, clear it
|
|
110
|
+
const templateValue = getTemplateWithoutBrackets(format);
|
|
111
|
+
setInternalValue(templateValue);
|
|
112
|
+
if (onChange) {
|
|
113
|
+
onChange('', '');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
else if (validate && !validate(isoDate)) {
|
|
117
|
+
// Custom validation failed (e.g., time step validation), clear it
|
|
118
|
+
const templateValue = getTemplateWithoutBrackets(format);
|
|
119
|
+
setInternalValue(templateValue);
|
|
120
|
+
if (onChange) {
|
|
121
|
+
onChange('', '');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}, [
|
|
126
|
+
format,
|
|
127
|
+
internalValue,
|
|
128
|
+
isValueComplete,
|
|
129
|
+
onChange,
|
|
130
|
+
onBlurProp,
|
|
131
|
+
parseFormattedValue,
|
|
132
|
+
validate,
|
|
133
|
+
locale,
|
|
134
|
+
]);
|
|
135
|
+
/**
|
|
136
|
+
* Handle key down for mask input
|
|
137
|
+
*/
|
|
138
|
+
const handleKeyDown = useCallback((e) => {
|
|
139
|
+
const { key } = e;
|
|
140
|
+
const templateValue = getTemplateWithoutBrackets(format);
|
|
141
|
+
if (key === 'Tab') {
|
|
142
|
+
e.stopPropagation();
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// Backspace
|
|
146
|
+
if (key === 'Backspace') {
|
|
147
|
+
e.preventDefault();
|
|
148
|
+
const cursorPos = e.target.selectionStart || 0;
|
|
149
|
+
if (cursorPos === 0)
|
|
150
|
+
return;
|
|
151
|
+
// Check if cursor is on a separator
|
|
152
|
+
let isSeparatorPos = true;
|
|
153
|
+
for (const cell of maskFormat.maskCells) {
|
|
154
|
+
if (cursorPos > cell.start && cursorPos <= cell.end) {
|
|
155
|
+
isSeparatorPos = false;
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (isSeparatorPos) {
|
|
160
|
+
// On separator, move cursor to previous editable position
|
|
161
|
+
let prevPos = cursorPos - 1;
|
|
162
|
+
while (prevPos >= 0) {
|
|
163
|
+
let found = false;
|
|
164
|
+
for (const cell of maskFormat.maskCells) {
|
|
165
|
+
if (prevPos >= cell.start && prevPos < cell.end) {
|
|
166
|
+
// Check if this position has a digit
|
|
167
|
+
if (/\d/.test(internalValue[prevPos])) {
|
|
168
|
+
found = true;
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (found)
|
|
174
|
+
break;
|
|
175
|
+
prevPos--;
|
|
176
|
+
}
|
|
177
|
+
if (prevPos < 0)
|
|
178
|
+
return;
|
|
179
|
+
// Clear that position
|
|
180
|
+
const newValue = internalValue.split('');
|
|
181
|
+
newValue[prevPos] = templateValue[prevPos];
|
|
182
|
+
triggerChange(newValue.join(''), prevPos);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
// Find which cell the cursor is in
|
|
186
|
+
let targetCellIndex = -1;
|
|
187
|
+
let posInCell = -1;
|
|
188
|
+
for (let i = 0; i < maskFormat.maskCells.length; i++) {
|
|
189
|
+
const cell = maskFormat.maskCells[i];
|
|
190
|
+
if (cursorPos > cell.start && cursorPos <= cell.end) {
|
|
191
|
+
targetCellIndex = i;
|
|
192
|
+
posInCell = cursorPos - cell.start;
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (targetCellIndex === -1)
|
|
197
|
+
return;
|
|
198
|
+
const targetCell = maskFormat.maskCells[targetCellIndex];
|
|
199
|
+
const clearPos = targetCell.start + posInCell - 1;
|
|
200
|
+
// Check if clearing the first position of current cell
|
|
201
|
+
if (posInCell === 1) {
|
|
202
|
+
// Check if entire cell is empty (all format chars)
|
|
203
|
+
let cellIsEmpty = true;
|
|
204
|
+
for (let i = targetCell.start; i < targetCell.end; i++) {
|
|
205
|
+
if (/\d/.test(internalValue[i])) {
|
|
206
|
+
cellIsEmpty = false;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (cellIsEmpty && targetCellIndex > 0) {
|
|
211
|
+
// Jump to previous cell's last position
|
|
212
|
+
const prevCell = maskFormat.maskCells[targetCellIndex - 1];
|
|
213
|
+
let lastDigitPos = prevCell.end - 1;
|
|
214
|
+
// Find last digit in previous cell
|
|
215
|
+
while (lastDigitPos >= prevCell.start) {
|
|
216
|
+
if (/\d/.test(internalValue[lastDigitPos])) {
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
lastDigitPos--;
|
|
220
|
+
}
|
|
221
|
+
if (lastDigitPos >= prevCell.start) {
|
|
222
|
+
const newValue = internalValue.split('');
|
|
223
|
+
newValue[lastDigitPos] = templateValue[lastDigitPos];
|
|
224
|
+
triggerChange(newValue.join(''), lastDigitPos);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Normal clear
|
|
230
|
+
const newValue = internalValue.split('');
|
|
231
|
+
newValue[clearPos] = templateValue[clearPos];
|
|
232
|
+
triggerChange(newValue.join(''), clearPos);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
// Number input
|
|
236
|
+
if (/^\d$/.test(key)) {
|
|
237
|
+
e.preventDefault();
|
|
238
|
+
const cursorPos = e.target.selectionStart || 0;
|
|
239
|
+
// Check if cursor is on a separator
|
|
240
|
+
let isSeparatorPos = true;
|
|
241
|
+
let nextEditablePos = cursorPos;
|
|
242
|
+
for (const cell of maskFormat.maskCells) {
|
|
243
|
+
if (cursorPos >= cell.start && cursorPos < cell.end) {
|
|
244
|
+
isSeparatorPos = false;
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (isSeparatorPos) {
|
|
249
|
+
// Find next editable position
|
|
250
|
+
for (const cell of maskFormat.maskCells) {
|
|
251
|
+
if (cell.start >= cursorPos) {
|
|
252
|
+
nextEditablePos = cell.start;
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Find which cell the cursor is in
|
|
258
|
+
let targetCellIndex = -1;
|
|
259
|
+
for (let i = 0; i < maskFormat.maskCells.length; i++) {
|
|
260
|
+
const cell = maskFormat.maskCells[i];
|
|
261
|
+
if (nextEditablePos >= cell.start && nextEditablePos < cell.end) {
|
|
262
|
+
targetCellIndex = i;
|
|
263
|
+
break;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (targetCellIndex === -1) {
|
|
267
|
+
// Not in a valid cell, block input
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
const targetCell = maskFormat.maskCells[targetCellIndex];
|
|
271
|
+
const [minVal, maxVal] = getMaskRange(targetCell.mask || '');
|
|
272
|
+
// Get current cell value
|
|
273
|
+
const currentCellValue = internalValue.slice(targetCell.start, targetCell.end);
|
|
274
|
+
// Build the new cell value with the input at cursor position
|
|
275
|
+
const newCellValue = currentCellValue.split('');
|
|
276
|
+
const posInCell = nextEditablePos - targetCell.start;
|
|
277
|
+
newCellValue[posInCell] = key;
|
|
278
|
+
// Validate the new cell value
|
|
279
|
+
const newCellStr = newCellValue.join('');
|
|
280
|
+
// Check if all positions are filled
|
|
281
|
+
if (!/^\d+$/.test(newCellStr)) {
|
|
282
|
+
// Not all filled, allow input
|
|
283
|
+
const newValue = internalValue.split('');
|
|
284
|
+
newValue[nextEditablePos] = key;
|
|
285
|
+
// Check if we need to jump to next cell
|
|
286
|
+
let nextPos = nextEditablePos + 1;
|
|
287
|
+
if (nextPos >= targetCell.end &&
|
|
288
|
+
targetCellIndex < maskFormat.maskCells.length - 1) {
|
|
289
|
+
// Jump to next cell
|
|
290
|
+
nextPos = maskFormat.maskCells[targetCellIndex + 1].start;
|
|
291
|
+
}
|
|
292
|
+
triggerChange(newValue.join(''), nextPos);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
// All filled, validate range
|
|
296
|
+
const cellNum = parseInt(newCellStr, 10);
|
|
297
|
+
if (cellNum < minVal || cellNum > maxVal) {
|
|
298
|
+
// Invalid, block input
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
// Valid, update
|
|
302
|
+
const newValue = internalValue.split('');
|
|
303
|
+
newValue[nextEditablePos] = key;
|
|
304
|
+
// Jump to next cell after filling current cell
|
|
305
|
+
let nextPos = nextEditablePos + 1;
|
|
306
|
+
if (nextPos >= targetCell.end &&
|
|
307
|
+
targetCellIndex < maskFormat.maskCells.length - 1) {
|
|
308
|
+
// Jump to next cell
|
|
309
|
+
nextPos = maskFormat.maskCells[targetCellIndex + 1].start;
|
|
310
|
+
}
|
|
311
|
+
triggerChange(newValue.join(''), nextPos);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
// Block other keys (separators, letters, etc.)
|
|
315
|
+
if (key.length === 1 && !/[\dBackspace]/.test(key)) {
|
|
316
|
+
if (!(e.ctrlKey || e.metaKey || e.altKey)) {
|
|
317
|
+
e.preventDefault();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}, [format, internalValue, maskFormat, triggerChange]);
|
|
321
|
+
const handlePaste = useCallback((e) => {
|
|
322
|
+
e.preventDefault();
|
|
323
|
+
const pasteData = e.clipboardData.getData('Text');
|
|
324
|
+
if (isValid(pasteData)) {
|
|
325
|
+
// If pasted data is a valid ISO date, format it accordingly
|
|
326
|
+
const parsedDate = formatToString(locale, pasteData, format);
|
|
327
|
+
if (parsedDate) {
|
|
328
|
+
triggerChange(parsedDate);
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const newValueArray = internalValue.split('');
|
|
333
|
+
let pasteIndex = 0;
|
|
334
|
+
for (const cell of maskFormat.maskCells) {
|
|
335
|
+
for (let i = cell.start; i < cell.end; i++) {
|
|
336
|
+
if (pasteIndex >= pasteData.length) {
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
const char = pasteData[pasteIndex];
|
|
340
|
+
if (/\d/.test(char)) {
|
|
341
|
+
newValueArray[i] = char;
|
|
342
|
+
pasteIndex++;
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
// Skip non-digit characters in paste data
|
|
346
|
+
pasteIndex++;
|
|
347
|
+
i--; // Stay on the same position
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
if (pasteIndex >= pasteData.length) {
|
|
351
|
+
break;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
const newValue = newValueArray.join('');
|
|
355
|
+
if (newValue === getTemplateWithoutBrackets(format)) {
|
|
356
|
+
// No valid input from paste
|
|
357
|
+
if (errorMessages.enabled) {
|
|
358
|
+
Message.error(errorMessages.invalidPaste);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
triggerChange(newValue);
|
|
362
|
+
}, [
|
|
363
|
+
errorMessages,
|
|
364
|
+
internalValue,
|
|
365
|
+
maskFormat,
|
|
366
|
+
triggerChange,
|
|
367
|
+
isValid,
|
|
368
|
+
format,
|
|
369
|
+
formatToString,
|
|
370
|
+
locale,
|
|
371
|
+
]);
|
|
372
|
+
return {
|
|
373
|
+
value: internalValue,
|
|
374
|
+
focused,
|
|
375
|
+
handleKeyDown,
|
|
376
|
+
handleFocus,
|
|
377
|
+
handleBlur,
|
|
378
|
+
handlePaste,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export { useDateInputFormatter };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { RefObject } from 'react';
|
|
2
2
|
export interface UsePickerDocumentEventCloseProps {
|
|
3
|
-
anchorRef: RefObject<HTMLElement>;
|
|
4
|
-
lastElementRefInFlow: RefObject<HTMLElement>;
|
|
3
|
+
anchorRef: RefObject<HTMLElement | null>;
|
|
4
|
+
lastElementRefInFlow: RefObject<HTMLElement | null>;
|
|
5
5
|
onClose: VoidFunction;
|
|
6
6
|
onChangeClose: VoidFunction;
|
|
7
7
|
open?: boolean;
|
|
8
|
-
popperRef: RefObject<HTMLElement>;
|
|
8
|
+
popperRef: RefObject<HTMLElement | null>;
|
|
9
9
|
}
|
|
10
10
|
export declare function usePickerDocumentEventClose({ anchorRef, lastElementRefInFlow, onClose, onChangeClose, open, popperRef, }: UsePickerDocumentEventCloseProps): void;
|
|
@@ -3,14 +3,13 @@ import { FocusEventHandler, KeyboardEventHandler, RefObject } from 'react';
|
|
|
3
3
|
export type UsePickerValueProps = {
|
|
4
4
|
defaultValue?: DateType;
|
|
5
5
|
format: string;
|
|
6
|
-
|
|
7
|
-
inputRef: RefObject<HTMLInputElement>;
|
|
6
|
+
inputRef: RefObject<HTMLInputElement | null>;
|
|
8
7
|
value?: DateType;
|
|
9
8
|
};
|
|
10
9
|
/**
|
|
11
10
|
* This hook keep tracks of an internal value.
|
|
12
11
|
*/
|
|
13
|
-
export declare function usePickerValue({ defaultValue, format,
|
|
12
|
+
export declare function usePickerValue({ defaultValue, format, inputRef, value: valueProp, }: UsePickerValueProps): {
|
|
14
13
|
inputValue: string;
|
|
15
14
|
onBlur: FocusEventHandler<HTMLInputElement>;
|
|
16
15
|
onChange: (val?: DateType) => void;
|
package/Picker/usePickerValue.js
CHANGED
|
@@ -5,33 +5,28 @@ import { usePickerInputValue } from './usePickerInputValue.js';
|
|
|
5
5
|
/**
|
|
6
6
|
* This hook keep tracks of an internal value.
|
|
7
7
|
*/
|
|
8
|
-
function usePickerValue({ defaultValue, format,
|
|
9
|
-
const { formatToString,
|
|
8
|
+
function usePickerValue({ defaultValue, format, inputRef, value: valueProp, }) {
|
|
9
|
+
const { formatToString, locale } = useCalendarContext();
|
|
10
10
|
const inputDefaultValue = defaultValue
|
|
11
|
-
? formatToString(
|
|
11
|
+
? formatToString(locale, defaultValue, format)
|
|
12
12
|
: '';
|
|
13
13
|
const [value, setValue] = useState(valueProp);
|
|
14
14
|
const onChange = (val) => {
|
|
15
15
|
setValue(val);
|
|
16
16
|
};
|
|
17
17
|
const onInputChange = (val) => {
|
|
18
|
-
|
|
19
|
-
onChange(valDateType);
|
|
18
|
+
onChange(val);
|
|
20
19
|
};
|
|
21
20
|
const { inputChangeHandler, inputValue, onChange: setInputValue, } = usePickerInputValue({
|
|
22
21
|
defaultValue: inputDefaultValue,
|
|
23
22
|
onChange: onInputChange,
|
|
24
23
|
});
|
|
25
24
|
useEffect(() => {
|
|
26
|
-
|
|
27
|
-
? formatToString(valueLocale, valueProp, format)
|
|
28
|
-
: '';
|
|
29
|
-
setInputValue(valString);
|
|
25
|
+
setInputValue(valueProp || '');
|
|
30
26
|
onChange(valueProp);
|
|
31
|
-
}, [valueProp]);
|
|
27
|
+
}, [valueProp, format, formatToString, setInputValue, locale]);
|
|
32
28
|
const onSyncInputAndStateChange = (val) => {
|
|
33
|
-
|
|
34
|
-
setInputValue(valueString);
|
|
29
|
+
setInputValue(val || '');
|
|
35
30
|
setValue(val);
|
|
36
31
|
};
|
|
37
32
|
const guardValidDateTypeOnEvents = () => {
|
|
@@ -50,7 +45,7 @@ function usePickerValue({ defaultValue, format, formats, inputRef, value: valueP
|
|
|
50
45
|
guardValidDateTypeOnEvents();
|
|
51
46
|
};
|
|
52
47
|
return {
|
|
53
|
-
inputValue,
|
|
48
|
+
inputValue: inputValue ? formatToString(locale, inputValue, format) : '',
|
|
54
49
|
onBlur,
|
|
55
50
|
onChange: onSyncInputAndStateChange,
|
|
56
51
|
onInputChange: inputChangeHandler,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { DependencyList, RefObject } from 'react';
|
|
2
|
-
export declare function useTabKeyClose(onClose: VoidFunction, lastElementRefInFlow: RefObject<HTMLElement>, deps?: DependencyList): void;
|
|
2
|
+
export declare function useTabKeyClose(onClose: VoidFunction, lastElementRefInFlow: RefObject<HTMLElement | null>, deps?: DependencyList): void;
|