@coreui/react-pro 5.24.1 → 5.26.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/README.md +1 -1
- package/dist/cjs/components/card/CCardImage.js.map +1 -1
- package/dist/cjs/components/carousel/CCarousel.js +44 -33
- package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
- package/dist/cjs/components/carousel/CCarouselItem.js +19 -28
- package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
- package/dist/cjs/components/chip/CChip.d.ts +12 -0
- package/dist/cjs/components/chip/CChip.js +16 -63
- package/dist/cjs/components/chip/CChip.js.map +1 -1
- package/dist/cjs/components/chip/const.d.ts +1 -0
- package/dist/cjs/components/chip/const.js +8 -0
- package/dist/cjs/components/chip/const.js.map +1 -0
- package/dist/cjs/components/chip-set/CChipSet.d.ts +73 -0
- package/dist/cjs/components/chip-set/CChipSet.js +66 -0
- package/dist/cjs/components/chip-set/CChipSet.js.map +1 -0
- package/dist/cjs/components/chip-set/index.d.ts +2 -0
- package/dist/cjs/components/chip-set/useChipSet.d.ts +48 -0
- package/dist/cjs/components/chip-set/useChipSet.js +163 -0
- package/dist/cjs/components/chip-set/useChipSet.js.map +1 -0
- package/dist/cjs/components/chip-set/utils.d.ts +7 -0
- package/dist/cjs/components/chip-set/utils.js +18 -0
- package/dist/cjs/components/chip-set/utils.js.map +1 -0
- package/dist/cjs/components/collapse/CCollapse.js +14 -6
- package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
- package/dist/cjs/components/conditional-portal/CConditionalPortal.js +3 -1
- package/dist/cjs/components/conditional-portal/CConditionalPortal.js.map +1 -1
- package/dist/cjs/components/date-picker/CDatePicker.d.ts +1 -1
- package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
- package/dist/cjs/components/date-range-picker/CDateRangePicker.js +2 -0
- package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdown.js +23 -30
- package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
- package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/cjs/components/form/CChipInput.d.ts +14 -2
- package/dist/cjs/components/form/CChipInput.js +77 -49
- package/dist/cjs/components/form/CChipInput.js.map +1 -1
- package/dist/cjs/components/form/CFormCheck.js.map +1 -1
- package/dist/cjs/components/form/CFormInput.js.map +1 -1
- package/dist/cjs/components/form/CFormSelect.js.map +1 -1
- package/dist/cjs/components/form/CFormTextarea.js.map +1 -1
- package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
- package/dist/cjs/components/grid/CContainer.js +3 -1
- package/dist/cjs/components/grid/CContainer.js.map +1 -1
- package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
- package/dist/cjs/components/index.d.ts +2 -0
- package/dist/cjs/components/link/CLink.js +4 -2
- package/dist/cjs/components/link/CLink.js.map +1 -1
- package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
- package/dist/cjs/components/modal/CModal.js +14 -2
- package/dist/cjs/components/modal/CModal.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelect.d.ts +73 -1
- package/dist/cjs/components/multi-select/CMultiSelect.js +157 -18
- package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectOptions.d.ts +3 -0
- package/dist/cjs/components/multi-select/CMultiSelectOptions.js +45 -2
- package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
- package/dist/cjs/components/multi-select/CMultiSelectSelection.d.ts +1 -0
- package/dist/cjs/components/multi-select/CMultiSelectSelection.js +4 -3
- package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
- package/dist/cjs/components/multi-select/types.d.ts +12 -0
- package/dist/cjs/components/multi-select/utils.js +1 -4
- package/dist/cjs/components/multi-select/utils.js.map +1 -1
- package/dist/cjs/components/nav/CNav.js.map +1 -1
- package/dist/cjs/components/nav/CNavGroup.d.ts +13 -6
- package/dist/cjs/components/nav/CNavGroup.js +86 -23
- package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
- package/dist/cjs/components/nav/CNavGroupContext.d.ts +25 -0
- package/dist/cjs/components/nav/CNavGroupContext.js +13 -0
- package/dist/cjs/components/nav/CNavGroupContext.js.map +1 -0
- package/dist/cjs/components/nav/CNavLink.d.ts +1 -5
- package/dist/cjs/components/nav/CNavLink.js +21 -8
- package/dist/cjs/components/nav/CNavLink.js.map +1 -1
- package/dist/cjs/components/one-time-password-input/COneTimePassword.js +3 -3
- package/dist/cjs/components/one-time-password-input/COneTimePassword.js.map +1 -1
- package/dist/cjs/components/popover/CPopover.js +69 -24
- package/dist/cjs/components/popover/CPopover.js.map +1 -1
- package/dist/cjs/components/progress/CProgress.js.map +1 -1
- package/dist/cjs/components/rating/CRating.d.ts +1 -1
- package/dist/cjs/components/rating/CRating.js.map +1 -1
- package/dist/cjs/components/search-button/CSearchButton.d.ts +32 -0
- package/dist/cjs/components/search-button/CSearchButton.js +77 -0
- package/dist/cjs/components/search-button/CSearchButton.js.map +1 -0
- package/dist/cjs/components/search-button/index.d.ts +2 -0
- package/dist/cjs/components/search-button/types.d.ts +10 -0
- package/dist/cjs/components/search-button/utils.d.ts +11 -0
- package/dist/cjs/components/search-button/utils.js +115 -0
- package/dist/cjs/components/search-button/utils.js.map +1 -0
- package/dist/cjs/components/sidebar/CSidebar.js +40 -23
- package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
- package/dist/cjs/components/sidebar/CSidebarNav.d.ts +12 -0
- package/dist/cjs/components/sidebar/CSidebarNav.js +12 -36
- package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
- package/dist/cjs/components/smart-table/CSmartTable.js +2 -2
- package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
- package/dist/cjs/components/smart-table/CSmartTableInterface.d.ts +2 -2
- package/dist/cjs/components/table/CTableDataCell.js.map +1 -1
- package/dist/cjs/components/table/types.d.ts +2 -1
- package/dist/cjs/components/table/utils.js +4 -4
- package/dist/cjs/components/table/utils.js.map +1 -1
- package/dist/cjs/components/tabs/CTabPanel.js +3 -1
- package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
- package/dist/cjs/components/time-picker/CTimePicker.d.ts +1 -1
- package/dist/cjs/components/time-picker/CTimePicker.js +1 -1
- package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
- package/dist/cjs/components/tooltip/CTooltip.js +69 -24
- package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
- package/dist/cjs/components/virtual-scroller/CVirtualScroller.js +11 -8
- package/dist/cjs/components/virtual-scroller/CVirtualScroller.js.map +1 -1
- package/dist/cjs/helpers/polymorphicComponent.d.ts +1 -2
- package/dist/cjs/hooks/useDebouncedCallback.d.ts +1 -1
- package/dist/cjs/hooks/useDebouncedCallback.js +1 -1
- package/dist/cjs/hooks/useDebouncedCallback.js.map +1 -1
- package/dist/cjs/hooks/useForkedRef.d.ts +1 -1
- package/dist/cjs/hooks/useForkedRef.js +6 -3
- package/dist/cjs/hooks/useForkedRef.js.map +1 -1
- package/dist/cjs/hooks/usePopper.js +8 -6
- package/dist/cjs/hooks/usePopper.js.map +1 -1
- package/dist/cjs/index.js +4 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +1 -1
- package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
- package/dist/cjs/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
- package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js +4 -4
- package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
- package/dist/cjs/utils/executeAfterTransition.js.map +1 -1
- package/dist/cjs/utils/index.d.ts +2 -1
- package/dist/cjs/utils/swipe.d.ts +26 -0
- package/dist/cjs/utils/swipe.js +94 -0
- package/dist/cjs/utils/swipe.js.map +1 -0
- package/dist/esm/components/card/CCardImage.js.map +1 -1
- package/dist/esm/components/carousel/CCarousel.js +44 -33
- package/dist/esm/components/carousel/CCarousel.js.map +1 -1
- package/dist/esm/components/carousel/CCarouselItem.js +19 -28
- package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
- package/dist/esm/components/chip/CChip.d.ts +12 -0
- package/dist/esm/components/chip/CChip.js +16 -63
- package/dist/esm/components/chip/CChip.js.map +1 -1
- package/dist/esm/components/chip/const.d.ts +1 -0
- package/dist/esm/components/chip/const.js +6 -0
- package/dist/esm/components/chip/const.js.map +1 -0
- package/dist/esm/components/chip-set/CChipSet.d.ts +73 -0
- package/dist/esm/components/chip-set/CChipSet.js +64 -0
- package/dist/esm/components/chip-set/CChipSet.js.map +1 -0
- package/dist/esm/components/chip-set/index.d.ts +2 -0
- package/dist/esm/components/chip-set/useChipSet.d.ts +48 -0
- package/dist/esm/components/chip-set/useChipSet.js +161 -0
- package/dist/esm/components/chip-set/useChipSet.js.map +1 -0
- package/dist/esm/components/chip-set/utils.d.ts +7 -0
- package/dist/esm/components/chip-set/utils.js +16 -0
- package/dist/esm/components/chip-set/utils.js.map +1 -0
- package/dist/esm/components/collapse/CCollapse.js +14 -6
- package/dist/esm/components/collapse/CCollapse.js.map +1 -1
- package/dist/esm/components/conditional-portal/CConditionalPortal.js +3 -1
- package/dist/esm/components/conditional-portal/CConditionalPortal.js.map +1 -1
- package/dist/esm/components/date-picker/CDatePicker.d.ts +1 -1
- package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
- package/dist/esm/components/date-range-picker/CDateRangePicker.js +2 -0
- package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdown.js +23 -30
- package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
- package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
- package/dist/esm/components/form/CChipInput.d.ts +14 -2
- package/dist/esm/components/form/CChipInput.js +78 -50
- package/dist/esm/components/form/CChipInput.js.map +1 -1
- package/dist/esm/components/form/CFormCheck.js.map +1 -1
- package/dist/esm/components/form/CFormInput.js.map +1 -1
- package/dist/esm/components/form/CFormSelect.js.map +1 -1
- package/dist/esm/components/form/CFormTextarea.js.map +1 -1
- package/dist/esm/components/form/CInputGroupText.js.map +1 -1
- package/dist/esm/components/grid/CContainer.js +3 -1
- package/dist/esm/components/grid/CContainer.js.map +1 -1
- package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
- package/dist/esm/components/index.d.ts +2 -0
- package/dist/esm/components/link/CLink.js +4 -2
- package/dist/esm/components/link/CLink.js.map +1 -1
- package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
- package/dist/esm/components/modal/CModal.js +14 -2
- package/dist/esm/components/modal/CModal.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelect.d.ts +73 -1
- package/dist/esm/components/multi-select/CMultiSelect.js +158 -19
- package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js +1 -1
- package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectOptions.d.ts +3 -0
- package/dist/esm/components/multi-select/CMultiSelectOptions.js +45 -2
- package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
- package/dist/esm/components/multi-select/CMultiSelectSelection.d.ts +1 -0
- package/dist/esm/components/multi-select/CMultiSelectSelection.js +4 -3
- package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
- package/dist/esm/components/multi-select/types.d.ts +12 -0
- package/dist/esm/components/multi-select/utils.js +1 -4
- package/dist/esm/components/multi-select/utils.js.map +1 -1
- package/dist/esm/components/nav/CNav.js.map +1 -1
- package/dist/esm/components/nav/CNavGroup.d.ts +13 -6
- package/dist/esm/components/nav/CNavGroup.js +87 -24
- package/dist/esm/components/nav/CNavGroup.js.map +1 -1
- package/dist/esm/components/nav/CNavGroupContext.d.ts +25 -0
- package/dist/esm/components/nav/CNavGroupContext.js +11 -0
- package/dist/esm/components/nav/CNavGroupContext.js.map +1 -0
- package/dist/esm/components/nav/CNavLink.d.ts +1 -5
- package/dist/esm/components/nav/CNavLink.js +21 -8
- package/dist/esm/components/nav/CNavLink.js.map +1 -1
- package/dist/esm/components/one-time-password-input/COneTimePassword.js +3 -3
- package/dist/esm/components/one-time-password-input/COneTimePassword.js.map +1 -1
- package/dist/esm/components/popover/CPopover.js +69 -24
- package/dist/esm/components/popover/CPopover.js.map +1 -1
- package/dist/esm/components/progress/CProgress.js.map +1 -1
- package/dist/esm/components/rating/CRating.d.ts +1 -1
- package/dist/esm/components/rating/CRating.js.map +1 -1
- package/dist/esm/components/search-button/CSearchButton.d.ts +32 -0
- package/dist/esm/components/search-button/CSearchButton.js +75 -0
- package/dist/esm/components/search-button/CSearchButton.js.map +1 -0
- package/dist/esm/components/search-button/index.d.ts +2 -0
- package/dist/esm/components/search-button/types.d.ts +10 -0
- package/dist/esm/components/search-button/utils.d.ts +11 -0
- package/dist/esm/components/search-button/utils.js +104 -0
- package/dist/esm/components/search-button/utils.js.map +1 -0
- package/dist/esm/components/sidebar/CSidebar.js +40 -23
- package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
- package/dist/esm/components/sidebar/CSidebarNav.d.ts +12 -0
- package/dist/esm/components/sidebar/CSidebarNav.js +13 -37
- package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
- package/dist/esm/components/smart-table/CSmartTable.js +2 -2
- package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
- package/dist/esm/components/smart-table/CSmartTableInterface.d.ts +2 -2
- package/dist/esm/components/table/CTableDataCell.js.map +1 -1
- package/dist/esm/components/table/types.d.ts +2 -1
- package/dist/esm/components/table/utils.js +4 -4
- package/dist/esm/components/table/utils.js.map +1 -1
- package/dist/esm/components/tabs/CTabPanel.js +3 -1
- package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
- package/dist/esm/components/time-picker/CTimePicker.d.ts +1 -1
- package/dist/esm/components/time-picker/CTimePicker.js +1 -1
- package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
- package/dist/esm/components/tooltip/CTooltip.js +69 -24
- package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
- package/dist/esm/components/virtual-scroller/CVirtualScroller.js +11 -8
- package/dist/esm/components/virtual-scroller/CVirtualScroller.js.map +1 -1
- package/dist/esm/helpers/polymorphicComponent.d.ts +1 -2
- package/dist/esm/hooks/useDebouncedCallback.d.ts +1 -1
- package/dist/esm/hooks/useDebouncedCallback.js +1 -1
- package/dist/esm/hooks/useDebouncedCallback.js.map +1 -1
- package/dist/esm/hooks/useForkedRef.d.ts +1 -1
- package/dist/esm/hooks/useForkedRef.js +6 -3
- package/dist/esm/hooks/useForkedRef.js.map +1 -1
- package/dist/esm/hooks/usePopper.js +9 -7
- package/dist/esm/hooks/usePopper.js.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +1 -1
- package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-bottom.js.map +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-arrow-top.js.map +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-filter-x.js.map +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js +1 -1
- package/dist/esm/node_modules/@coreui/icons/dist/esm/free/cil-swap-vertical.js.map +1 -1
- package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js +4 -4
- package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
- package/dist/esm/utils/executeAfterTransition.js.map +1 -1
- package/dist/esm/utils/index.d.ts +2 -1
- package/dist/esm/utils/swipe.d.ts +26 -0
- package/dist/esm/utils/swipe.js +90 -0
- package/dist/esm/utils/swipe.js.map +1 -0
- package/package.json +8 -6
- package/src/components/autocomplete/CAutocompleteOptions.tsx +1 -1
- package/src/components/autocomplete/__tests__/CAutocomplete.spec.tsx +18 -16
- package/src/components/autocomplete/__tests__/CAutocompleteOptions.spec.tsx +37 -28
- package/src/components/autocomplete/__tests__/__snapshots__/CAutocomplete.spec.tsx.snap +129 -0
- package/src/components/autocomplete/__tests__/__snapshots__/CAutocompleteOptions.spec.tsx.snap +36 -0
- package/src/components/calendar/__tests__/CCalendar.spec.tsx +40 -45
- package/src/components/calendar/__tests__/__snapshots__/CCalendar.spec.tsx.snap +99 -75
- package/src/components/calendar/__tests__/utils.spec.tsx +8 -18
- package/src/components/card/CCardImage.tsx +3 -2
- package/src/components/carousel/CCarousel.tsx +48 -51
- package/src/components/carousel/CCarouselContext.ts +1 -1
- package/src/components/carousel/CCarouselItem.tsx +25 -26
- package/src/components/carousel/__tests__/CCarousel.spec.tsx +47 -4
- package/src/components/carousel/__tests__/CCarouselItem.spec.tsx +37 -0
- package/src/components/chip/CChip.tsx +45 -78
- package/src/components/chip/__tests__/CChip.spec.tsx +26 -19
- package/src/components/chip/const.ts +3 -0
- package/src/components/chip-set/CChipSet.tsx +183 -0
- package/src/components/chip-set/__tests__/CChipSet.spec.tsx +215 -0
- package/src/components/chip-set/__tests__/__snapshots__/CChipSet.spec.tsx.snap +22 -0
- package/src/components/chip-set/index.ts +3 -0
- package/src/components/chip-set/useChipSet.ts +243 -0
- package/src/components/chip-set/utils.ts +19 -0
- package/src/components/collapse/CCollapse.tsx +18 -6
- package/src/components/conditional-portal/CConditionalPortal.tsx +4 -2
- package/src/components/date-picker/CDatePicker.tsx +12 -13
- package/src/components/date-picker/__tests__/CDatePicker.spec.tsx +1 -1
- package/src/components/date-picker/__tests__/__snapshots__/CDatePicker.spec.tsx.snap +12 -640
- package/src/components/date-range-picker/CDateRangePicker.tsx +2 -0
- package/src/components/date-range-picker/__tests__/CDateRangePicker.spec.tsx +1 -1
- package/src/components/date-range-picker/__tests__/__snapshots__/CDateRangePicker.spec.tsx.snap +21 -1259
- package/src/components/dropdown/CDropdown.tsx +29 -34
- package/src/components/dropdown/CDropdownToggle.tsx +1 -1
- package/src/components/dropdown/__tests__/CDropdown.spec.tsx +56 -1
- package/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.tsx.snap +2 -2
- package/src/components/dropdown/__tests__/__snapshots__/CDropdownMenu.spec.tsx.snap +1 -1
- package/src/components/focus-trap/__tests__/CFocusTrap.spec.tsx +1 -1
- package/src/components/form/CChipInput.tsx +105 -67
- package/src/components/form/CFormCheck.tsx +1 -2
- package/src/components/form/CFormInput.tsx +1 -2
- package/src/components/form/CFormSelect.tsx +1 -2
- package/src/components/form/CFormTextarea.tsx +1 -2
- package/src/components/form/CInputGroupText.tsx +3 -2
- package/src/components/form/__tests__/CChipInput.spec.tsx +67 -1
- package/src/components/form/__tests__/CFormInput.spec.tsx +17 -20
- package/src/components/form/__tests__/__snapshots__/CChipInput.spec.tsx.snap +7 -0
- package/src/components/form/__tests__/__snapshots__/CFormInput.spec.tsx.snap +12 -3
- package/src/components/grid/CContainer.tsx +3 -1
- package/src/components/header/CHeaderBrand.tsx +3 -2
- package/src/components/index.ts +2 -0
- package/src/components/link/CLink.tsx +7 -4
- package/src/components/list-group/CListGroupItem.tsx +3 -2
- package/src/components/loading-button/__tests__/CLoadingButton.spec.tsx +1 -1
- package/src/components/loading-button/__tests__/__snapshots__/CLoadingButton.spec.tsx.snap +4 -4
- package/src/components/modal/CModal.tsx +19 -2
- package/src/components/modal/__tests__/CModal.spec.tsx +43 -0
- package/src/components/multi-select/CMultiSelect.tsx +341 -46
- package/src/components/multi-select/CMultiSelectNativeSelect.tsx +1 -1
- package/src/components/multi-select/CMultiSelectOptions.tsx +74 -3
- package/src/components/multi-select/CMultiSelectSelection.tsx +5 -1
- package/src/components/multi-select/__tests__/CMultiSelect.spec.tsx +27 -69
- package/src/components/multi-select/__tests__/CMultiSelectNativeSelect.spec.tsx +4 -5
- package/src/components/multi-select/__tests__/CMultiSelectOptions.spec.tsx +4 -4
- package/src/components/multi-select/__tests__/CMultiSelectSelection.spec.tsx +7 -24
- package/src/components/multi-select/__tests__/__snapshots__/CMultiSelect.spec.tsx.snap +108 -61
- package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectNativeSelect.spec.tsx.snap +2 -4
- package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectOptions.spec.tsx.snap +7 -0
- package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectSelection.spec.tsx.snap +16 -9
- package/src/components/multi-select/types.ts +14 -0
- package/src/components/nav/CNav.tsx +3 -2
- package/src/components/nav/CNavGroup.tsx +196 -105
- package/src/components/nav/CNavGroupContext.ts +27 -0
- package/src/components/nav/CNavLink.tsx +26 -12
- package/src/components/nav/__tests__/CNavGroup.spec.tsx +207 -4
- package/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.tsx.snap +3 -1
- package/src/components/offcanvas/__tests__/COffcanvas.spec.tsx +1 -0
- package/src/components/one-time-password-input/COneTimePassword.tsx +10 -11
- package/src/components/picker/__tests__/CPicker.spec.tsx +1 -1
- package/src/components/picker/__tests__/__snapshots__/CPicker.spec.tsx.snap +2 -16
- package/src/components/popover/CPopover.tsx +71 -26
- package/src/components/popover/__tests__/CPopover.spec.tsx +85 -4
- package/src/components/progress/CProgress.tsx +1 -2
- package/src/components/rating/CRating.tsx +1 -0
- package/src/components/search-button/CSearchButton.tsx +195 -0
- package/src/components/search-button/__tests__/CSearchButton.spec.tsx +95 -0
- package/src/components/search-button/__tests__/__snapshots__/CSearchButton.spec.tsx.snap +87 -0
- package/src/components/search-button/index.ts +3 -0
- package/src/components/search-button/types.ts +10 -0
- package/src/components/search-button/utils.ts +140 -0
- package/src/components/sidebar/CSidebar.tsx +51 -26
- package/src/components/sidebar/CSidebarNav.tsx +39 -53
- package/src/components/sidebar/__tests__/CSidebar.spec.tsx +26 -0
- package/src/components/smart-table/CSmartTable.tsx +5 -4
- package/src/components/smart-table/CSmartTableInterface.tsx +2 -2
- package/src/components/smart-table/__tests__/CSmartTable.spec.tsx +3 -2
- package/src/components/smart-table/__tests__/__snapshots__/CSmartTable.spec.tsx.snap +7 -15
- package/src/components/stepper/__tests__/CStepper.spec.tsx +24 -21
- package/src/components/stepper/__tests__/__snapshots__/CStepper.spec.tsx.snap +295 -0
- package/src/components/table/CTableDataCell.tsx +2 -1
- package/src/components/table/types.ts +3 -1
- package/src/components/table/utils.ts +4 -4
- package/src/components/tabs/CTabPanel.tsx +3 -1
- package/src/components/tabs/CTabsContext.ts +1 -1
- package/src/components/tabs/__tests__/CTabContent.spec.tsx +1 -0
- package/src/components/tabs/__tests__/CTabPane.spec.tsx +1 -0
- package/src/components/time-picker/CTimePicker.tsx +6 -7
- package/src/components/time-picker/__tests__/CTimePicker.spec.tsx +10 -1
- package/src/components/time-picker/__tests__/__snapshots__/CTimePicker.spec.tsx.snap +599 -315
- package/src/components/tooltip/CTooltip.tsx +72 -27
- package/src/components/tooltip/__tests__/CTooltip.spec.tsx +102 -1
- package/src/components/virtual-scroller/CVirtualScroller.tsx +13 -14
- package/src/helpers/polymorphicComponent.ts +1 -1
- package/src/hooks/useColorModes.ts +2 -2
- package/src/hooks/useDebouncedCallback.ts +7 -4
- package/src/hooks/useForkedRef.ts +20 -15
- package/src/hooks/usePopper.ts +13 -9
- package/src/utils/__tests__/swipe.spec.ts +82 -0
- package/src/utils/executeAfterTransition.ts +1 -1
- package/src/utils/index.ts +2 -0
- package/src/utils/mergeClassNames.ts +1 -1
- package/src/utils/swipe.ts +114 -0
- package/dist/cjs/components/accordion/CAccordionCollapse.d.ts +0 -3
- package/dist/cjs/components/sidebar/CSidebarNavContext.d.ts +0 -5
- package/dist/cjs/components/sidebar/CSidebarNavContext.js +0 -8
- package/dist/cjs/components/sidebar/CSidebarNavContext.js.map +0 -1
- package/dist/esm/components/accordion/CAccordionCollapse.d.ts +0 -3
- package/dist/esm/components/sidebar/CSidebarNavContext.d.ts +0 -5
- package/dist/esm/components/sidebar/CSidebarNavContext.js +0 -6
- package/dist/esm/components/sidebar/CSidebarNavContext.js.map +0 -1
- package/src/components/accordion/CAccordionCollapse.tsx +0 -20
- package/src/components/accordion/__tests__/CAccordionCollapse.spec.tsx +0 -10
- package/src/components/accordion/__tests__/__snapshots__/CAccordionCollapse.spec.tsx.snap +0 -11
- package/src/components/button/__tests__/__snapshots__/CButtonClose.spec.tsx.snap +0 -26
- package/src/components/calendar/__tests__/CCalendar.accessibility.spec.tsx +0 -595
- package/src/components/calendar/__tests__/CCalendar.comprehensive.spec.tsx +0 -402
- package/src/components/calendar/__tests__/CCalendar.edge-cases.spec.tsx +0 -416
- package/src/components/calendar/__tests__/CCalendar.interactions.spec.tsx +0 -593
- package/src/components/header/CHeaderBrand.tsx~HEAD +0 -36
- package/src/components/sidebar/CSidebarNavContext.ts +0 -8
- /package/src/components/calendar/__tests__/{test-setup.ts → setup.ts} +0 -0
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
exports[`CNavGroup customize 1`] = `
|
|
4
4
|
<div>
|
|
5
5
|
<li
|
|
6
|
-
class="nav-group bazinga"
|
|
6
|
+
class="nav-group show bazinga"
|
|
7
7
|
>
|
|
8
8
|
<a
|
|
9
|
+
aria-expanded="true"
|
|
9
10
|
class="nav-link nav-group-toggle"
|
|
10
11
|
href="#"
|
|
11
12
|
>
|
|
@@ -25,6 +26,7 @@ exports[`loads and displays CNavGroup component 1`] = `
|
|
|
25
26
|
class="nav-group"
|
|
26
27
|
>
|
|
27
28
|
<a
|
|
29
|
+
aria-expanded="false"
|
|
28
30
|
class="nav-link nav-group-toggle"
|
|
29
31
|
href="#"
|
|
30
32
|
>
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React, {
|
|
2
|
-
ChangeEvent,
|
|
3
2
|
Children,
|
|
4
3
|
ClipboardEvent,
|
|
5
4
|
cloneElement,
|
|
6
5
|
FocusEvent,
|
|
6
|
+
InputEvent,
|
|
7
7
|
forwardRef,
|
|
8
8
|
HTMLAttributes,
|
|
9
9
|
isValidElement,
|
|
@@ -29,8 +29,7 @@ type ComponentWithDisplayName = {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
export interface COneTimePasswordProps
|
|
32
|
-
extends CFormControlWrapperProps,
|
|
33
|
-
Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {
|
|
32
|
+
extends CFormControlWrapperProps, Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {
|
|
34
33
|
/**
|
|
35
34
|
* Function to generate aria-label for each input field. Receives current index (0-based) and total number of inputs.
|
|
36
35
|
*/
|
|
@@ -199,8 +198,8 @@ export const COneTimePassword = forwardRef<HTMLDivElement, COneTimePasswordProps
|
|
|
199
198
|
)
|
|
200
199
|
|
|
201
200
|
const handleInputChange = useCallback(
|
|
202
|
-
(index: number, event:
|
|
203
|
-
const inputValue = event.
|
|
201
|
+
(index: number, event: InputEvent<HTMLInputElement>) => {
|
|
202
|
+
const inputValue = event.currentTarget.value
|
|
204
203
|
|
|
205
204
|
if (inputValue.length === 1 && !isValidInput(inputValue, type)) {
|
|
206
205
|
return
|
|
@@ -215,7 +214,7 @@ export const COneTimePassword = forwardRef<HTMLDivElement, COneTimePasswordProps
|
|
|
215
214
|
if (inputValue.length === 1) {
|
|
216
215
|
const nextInput = getNextActiveElement(
|
|
217
216
|
inputRefs.current as HTMLInputElement[],
|
|
218
|
-
event.
|
|
217
|
+
event.currentTarget,
|
|
219
218
|
true,
|
|
220
219
|
false
|
|
221
220
|
)
|
|
@@ -402,19 +401,19 @@ export const COneTimePassword = forwardRef<HTMLDivElement, COneTimePasswordProps
|
|
|
402
401
|
|
|
403
402
|
inputMode: type === 'number' ? 'numeric' : 'text',
|
|
404
403
|
pattern: type === 'number' ? '[0-9]*' : '.*',
|
|
405
|
-
onInput: (event:
|
|
404
|
+
onInput: (event: InputEvent<HTMLInputElement>) => {
|
|
406
405
|
handleInputChange(currentInputIndex, event)
|
|
407
|
-
inputChild.props.
|
|
406
|
+
inputChild.props.onInput?.(event)
|
|
408
407
|
},
|
|
409
|
-
onFocus: (event:
|
|
408
|
+
onFocus: (event: FocusEvent<HTMLInputElement>) => {
|
|
410
409
|
handleInputFocus(event)
|
|
411
410
|
inputChild.props.onFocus?.(event)
|
|
412
411
|
},
|
|
413
|
-
onKeyDown: (event:
|
|
412
|
+
onKeyDown: (event: KeyboardEvent<HTMLInputElement>) => {
|
|
414
413
|
handleKeyDown(event)
|
|
415
414
|
inputChild.props.onKeyDown?.(event)
|
|
416
415
|
},
|
|
417
|
-
onPaste: (event:
|
|
416
|
+
onPaste: (event: ClipboardEvent<HTMLInputElement>) => {
|
|
418
417
|
handlePaste(index, event)
|
|
419
418
|
inputChild.props.onPaste?.(event)
|
|
420
419
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react'
|
|
2
2
|
import { render } from '@testing-library/react'
|
|
3
|
-
import '@testing-library/jest-dom
|
|
3
|
+
import '@testing-library/jest-dom'
|
|
4
4
|
import { CPicker } from '../CPicker'
|
|
5
5
|
|
|
6
6
|
test('loads and displays CPicker component', async () => {
|
|
@@ -3,21 +3,7 @@
|
|
|
3
3
|
exports[`loads and displays CPicker component 1`] = `
|
|
4
4
|
<div>
|
|
5
5
|
<div
|
|
6
|
-
class="
|
|
7
|
-
|
|
8
|
-
<button
|
|
9
|
-
aria-expanded="false"
|
|
10
|
-
class="btn btn-primary dropdown-toggle"
|
|
11
|
-
tabindex="0"
|
|
12
|
-
type="button"
|
|
13
|
-
/>
|
|
14
|
-
<div
|
|
15
|
-
aria-hidden="true"
|
|
16
|
-
class="dropdown-menu"
|
|
17
|
-
role="menu"
|
|
18
|
-
>
|
|
19
|
-
Test
|
|
20
|
-
</div>
|
|
21
|
-
</div>
|
|
6
|
+
class=""
|
|
7
|
+
/>
|
|
22
8
|
</div>
|
|
23
9
|
`;
|
|
@@ -182,6 +182,14 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
|
|
|
182
182
|
const { initPopper, destroyPopper } = usePopper()
|
|
183
183
|
|
|
184
184
|
const _delay = typeof delay === 'number' ? { show: delay, hide: delay } : delay
|
|
185
|
+
const timer = useRef<ReturnType<typeof setTimeout>>(undefined)
|
|
186
|
+
|
|
187
|
+
const clearTimer = () => {
|
|
188
|
+
if (timer.current) {
|
|
189
|
+
clearTimeout(timer.current)
|
|
190
|
+
timer.current = undefined
|
|
191
|
+
}
|
|
192
|
+
}
|
|
185
193
|
|
|
186
194
|
const defaultPopperConfig: Partial<Options> = {
|
|
187
195
|
modifiers: [
|
|
@@ -197,19 +205,41 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
|
|
|
197
205
|
...(typeof popperConfig === 'function' ? popperConfig(defaultPopperConfig) : popperConfig),
|
|
198
206
|
}
|
|
199
207
|
|
|
208
|
+
const handleShow = () => {
|
|
209
|
+
clearTimer()
|
|
210
|
+
|
|
211
|
+
if (mounted) {
|
|
212
|
+
timer.current = setTimeout(() => {
|
|
213
|
+
setVisible(true)
|
|
214
|
+
}, _delay.show)
|
|
215
|
+
} else {
|
|
216
|
+
setMounted(true)
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
onShow?.()
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const handleHide = () => {
|
|
223
|
+
clearTimer()
|
|
224
|
+
|
|
225
|
+
timer.current = setTimeout(() => {
|
|
226
|
+
setVisible(false)
|
|
227
|
+
onHide?.()
|
|
228
|
+
}, _delay.hide)
|
|
229
|
+
}
|
|
230
|
+
|
|
200
231
|
useEffect(() => {
|
|
201
|
-
if (visible) {
|
|
232
|
+
if (visible === true) {
|
|
202
233
|
handleShow()
|
|
203
|
-
|
|
234
|
+
} else if (visible === false) {
|
|
235
|
+
handleHide()
|
|
204
236
|
}
|
|
205
|
-
|
|
206
|
-
handleHide()
|
|
207
237
|
}, [visible])
|
|
208
238
|
|
|
209
239
|
useEffect(() => {
|
|
210
240
|
if (mounted && togglerRef.current && popoverRef.current) {
|
|
211
241
|
initPopper(togglerRef.current, popoverRef.current, computedPopperConfig)
|
|
212
|
-
setTimeout(() => {
|
|
242
|
+
timer.current = setTimeout(() => {
|
|
213
243
|
setVisible(true)
|
|
214
244
|
}, _delay.show)
|
|
215
245
|
|
|
@@ -221,6 +251,13 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
|
|
|
221
251
|
}
|
|
222
252
|
}, [mounted])
|
|
223
253
|
|
|
254
|
+
useEffect(() => {
|
|
255
|
+
return () => {
|
|
256
|
+
clearTimer()
|
|
257
|
+
destroyPopper()
|
|
258
|
+
}
|
|
259
|
+
}, [])
|
|
260
|
+
|
|
224
261
|
useEffect(() => {
|
|
225
262
|
if (!_visible && togglerRef.current && popoverRef.current) {
|
|
226
263
|
executeAfterTransition(() => {
|
|
@@ -229,39 +266,47 @@ export const CPopover = forwardRef<HTMLDivElement, CPopoverProps>(
|
|
|
229
266
|
}
|
|
230
267
|
}, [_visible])
|
|
231
268
|
|
|
232
|
-
const
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
onShow()
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
const handleHide = () => {
|
|
240
|
-
setTimeout(() => {
|
|
241
|
-
setVisible(false)
|
|
242
|
-
if (onHide) {
|
|
243
|
-
onHide()
|
|
244
|
-
}
|
|
245
|
-
}, _delay.hide)
|
|
246
|
-
}
|
|
269
|
+
const child = children as React.ReactElement<
|
|
270
|
+
React.HTMLAttributes<HTMLElement> & { ref?: React.Ref<HTMLElement> }
|
|
271
|
+
>
|
|
247
272
|
|
|
248
273
|
return (
|
|
249
274
|
<>
|
|
250
|
-
{React.cloneElement(
|
|
275
|
+
{React.cloneElement(child, {
|
|
251
276
|
...(_visible && {
|
|
252
277
|
'aria-describedby': id,
|
|
253
278
|
}),
|
|
254
279
|
ref: togglerRef,
|
|
255
280
|
...((trigger === 'click' || trigger.includes('click')) && {
|
|
256
|
-
onClick: () =>
|
|
281
|
+
onClick: (event: React.MouseEvent<HTMLElement>) => {
|
|
282
|
+
child.props.onClick?.(event)
|
|
283
|
+
|
|
284
|
+
if (_visible) {
|
|
285
|
+
handleHide()
|
|
286
|
+
} else {
|
|
287
|
+
handleShow()
|
|
288
|
+
}
|
|
289
|
+
},
|
|
257
290
|
}),
|
|
258
291
|
...((trigger === 'focus' || trigger.includes('focus')) && {
|
|
259
|
-
onFocus: () =>
|
|
260
|
-
|
|
292
|
+
onFocus: (event: React.FocusEvent<HTMLElement>) => {
|
|
293
|
+
child.props.onFocus?.(event)
|
|
294
|
+
handleShow()
|
|
295
|
+
},
|
|
296
|
+
onBlur: (event: React.FocusEvent<HTMLElement>) => {
|
|
297
|
+
child.props.onBlur?.(event)
|
|
298
|
+
handleHide()
|
|
299
|
+
},
|
|
261
300
|
}),
|
|
262
301
|
...((trigger === 'hover' || trigger.includes('hover')) && {
|
|
263
|
-
onMouseEnter: () =>
|
|
264
|
-
|
|
302
|
+
onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {
|
|
303
|
+
child.props.onMouseEnter?.(event)
|
|
304
|
+
handleShow()
|
|
305
|
+
},
|
|
306
|
+
onMouseLeave: (event: React.MouseEvent<HTMLElement>) => {
|
|
307
|
+
child.props.onMouseLeave?.(event)
|
|
308
|
+
handleHide()
|
|
309
|
+
},
|
|
265
310
|
}),
|
|
266
311
|
})}
|
|
267
312
|
<CConditionalPortal container={container} portal={true}>
|
|
@@ -16,6 +16,74 @@ afterEach(() => {
|
|
|
16
16
|
cleanup()
|
|
17
17
|
})
|
|
18
18
|
|
|
19
|
+
test('CPopover stays visible when re-hovered during the hide delay', async () => {
|
|
20
|
+
jest.useFakeTimers()
|
|
21
|
+
|
|
22
|
+
render(
|
|
23
|
+
<CPopover trigger="hover" delay={{ show: 0, hide: 300 }} content="content">
|
|
24
|
+
<CButton color="primary">Test</CButton>
|
|
25
|
+
</CPopover>
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
const btn = screen.getByRole('button', { name: /test/i })
|
|
29
|
+
|
|
30
|
+
act(() => {
|
|
31
|
+
fireEvent.mouseOver(btn)
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
act(() => {
|
|
35
|
+
jest.runAllTimers()
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
expect(document.querySelector('.popover')).toHaveClass('show')
|
|
39
|
+
|
|
40
|
+
act(() => {
|
|
41
|
+
fireEvent.mouseOut(btn)
|
|
42
|
+
jest.advanceTimersByTime(100)
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
act(() => {
|
|
46
|
+
fireEvent.mouseOver(btn)
|
|
47
|
+
jest.advanceTimersByTime(1000)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
expect(document.querySelector('.popover')).toHaveClass('show')
|
|
51
|
+
|
|
52
|
+
jest.useRealTimers()
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
test('CPopover preserves event handlers of the child element', async () => {
|
|
56
|
+
jest.useFakeTimers()
|
|
57
|
+
|
|
58
|
+
const onClick = jest.fn()
|
|
59
|
+
const onMouseEnter = jest.fn()
|
|
60
|
+
|
|
61
|
+
render(
|
|
62
|
+
<CPopover trigger={['hover', 'click']} content="content">
|
|
63
|
+
<CButton color="primary" onClick={onClick} onMouseEnter={onMouseEnter}>
|
|
64
|
+
Test
|
|
65
|
+
</CButton>
|
|
66
|
+
</CPopover>
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
const btn = screen.getByRole('button', { name: /test/i })
|
|
70
|
+
|
|
71
|
+
act(() => {
|
|
72
|
+
fireEvent.mouseOver(btn)
|
|
73
|
+
jest.runAllTimers()
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
act(() => {
|
|
77
|
+
fireEvent.click(btn)
|
|
78
|
+
jest.runAllTimers()
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
expect(onMouseEnter).toHaveBeenCalledTimes(1)
|
|
82
|
+
expect(onClick).toHaveBeenCalledTimes(1)
|
|
83
|
+
|
|
84
|
+
jest.useRealTimers()
|
|
85
|
+
})
|
|
86
|
+
|
|
19
87
|
test('loads and displays CPopover component', async () => {
|
|
20
88
|
const { container } = render(
|
|
21
89
|
<CPopover content="A">
|
|
@@ -57,16 +125,23 @@ test('CPopover customize', async () => {
|
|
|
57
125
|
test('CPopover onShow and onHide', async () => {
|
|
58
126
|
jest.useFakeTimers()
|
|
59
127
|
|
|
128
|
+
const onShow = jest.fn()
|
|
129
|
+
const onHide = jest.fn()
|
|
130
|
+
|
|
60
131
|
render(
|
|
61
|
-
<CPopover
|
|
132
|
+
<CPopover
|
|
133
|
+
content="content"
|
|
134
|
+
title="title"
|
|
135
|
+
trigger="click"
|
|
136
|
+
placement="right"
|
|
137
|
+
onShow={onShow}
|
|
138
|
+
onHide={onHide}
|
|
139
|
+
>
|
|
62
140
|
<CButton color="primary">Test</CButton>
|
|
63
141
|
</CPopover>,
|
|
64
142
|
{ container: container! }
|
|
65
143
|
)
|
|
66
144
|
|
|
67
|
-
const onShow = jest.fn()
|
|
68
|
-
const onHide = jest.fn()
|
|
69
|
-
|
|
70
145
|
const btn = screen.getByRole('button', { name: /test/i })
|
|
71
146
|
|
|
72
147
|
expect(onShow).toHaveBeenCalledTimes(0)
|
|
@@ -74,6 +149,9 @@ test('CPopover onShow and onHide', async () => {
|
|
|
74
149
|
|
|
75
150
|
act(() => {
|
|
76
151
|
fireEvent.click(btn)
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
act(() => {
|
|
77
155
|
jest.runAllTimers()
|
|
78
156
|
})
|
|
79
157
|
|
|
@@ -82,6 +160,9 @@ test('CPopover onShow and onHide', async () => {
|
|
|
82
160
|
|
|
83
161
|
act(() => {
|
|
84
162
|
fireEvent.click(btn)
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
act(() => {
|
|
85
166
|
jest.runAllTimers()
|
|
86
167
|
})
|
|
87
168
|
|
|
@@ -6,8 +6,7 @@ import { CProgressStackedContext } from './CProgressStackedContext'
|
|
|
6
6
|
import { CProgressBar, CProgressBarProps } from './CProgressBar'
|
|
7
7
|
|
|
8
8
|
export interface CProgressProps
|
|
9
|
-
extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>,
|
|
10
|
-
CProgressBarProps {
|
|
9
|
+
extends Omit<HTMLAttributes<HTMLDivElement>, 'color'>, CProgressBarProps {
|
|
11
10
|
/**
|
|
12
11
|
* A string of all className you want applied to the component.
|
|
13
12
|
*/
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import React, {
|
|
2
|
+
ButtonHTMLAttributes,
|
|
3
|
+
MouseEvent,
|
|
4
|
+
ReactNode,
|
|
5
|
+
forwardRef,
|
|
6
|
+
useCallback,
|
|
7
|
+
useEffect,
|
|
8
|
+
useMemo,
|
|
9
|
+
useRef,
|
|
10
|
+
useState,
|
|
11
|
+
} from 'react'
|
|
12
|
+
import PropTypes from 'prop-types'
|
|
13
|
+
import classNames from 'classnames'
|
|
14
|
+
|
|
15
|
+
import { useForkedRef } from '../../hooks'
|
|
16
|
+
import {
|
|
17
|
+
formatShortcutTokens,
|
|
18
|
+
getPreferredShortcut,
|
|
19
|
+
getPressedKeys,
|
|
20
|
+
matchesShortcut,
|
|
21
|
+
parseShortcut,
|
|
22
|
+
shouldIgnoreShortcut,
|
|
23
|
+
} from './utils'
|
|
24
|
+
|
|
25
|
+
export interface CSearchButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
26
|
+
/**
|
|
27
|
+
* Content to customize the full button body.
|
|
28
|
+
*/
|
|
29
|
+
children?: ReactNode
|
|
30
|
+
/**
|
|
31
|
+
* A string of all className you want applied to the base component.
|
|
32
|
+
*/
|
|
33
|
+
className?: string
|
|
34
|
+
/**
|
|
35
|
+
* Custom icon displayed before the placeholder text.
|
|
36
|
+
*/
|
|
37
|
+
icon?: ReactNode
|
|
38
|
+
/**
|
|
39
|
+
* Placeholder content rendered inside `.search-button-placeholder`.
|
|
40
|
+
*/
|
|
41
|
+
placeholder?: ReactNode
|
|
42
|
+
/**
|
|
43
|
+
* Callback fired when the component is activated by click or keyboard shortcut.
|
|
44
|
+
*/
|
|
45
|
+
onTrigger?: () => void
|
|
46
|
+
/**
|
|
47
|
+
* Prevent the browser's default behavior when the configured shortcut matches.
|
|
48
|
+
*/
|
|
49
|
+
preventDefault?: boolean
|
|
50
|
+
/**
|
|
51
|
+
* Comma-separated shortcut list. The component matches all configured shortcuts and renders the platform-preferred one.
|
|
52
|
+
*/
|
|
53
|
+
shortcut?: string
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const CSearchButton = forwardRef<HTMLButtonElement, CSearchButtonProps>(
|
|
57
|
+
(
|
|
58
|
+
{
|
|
59
|
+
children,
|
|
60
|
+
className,
|
|
61
|
+
disabled,
|
|
62
|
+
icon,
|
|
63
|
+
onClick,
|
|
64
|
+
onTrigger,
|
|
65
|
+
placeholder = 'Search',
|
|
66
|
+
preventDefault = true,
|
|
67
|
+
shortcut = 'meta+/,ctrl+/',
|
|
68
|
+
type = 'button',
|
|
69
|
+
...rest
|
|
70
|
+
},
|
|
71
|
+
ref
|
|
72
|
+
) => {
|
|
73
|
+
const buttonRef = useRef<HTMLButtonElement>(null)
|
|
74
|
+
const forkedRef = useForkedRef(ref, buttonRef)
|
|
75
|
+
const [activeKeys, setActiveKeys] = useState<string[]>([])
|
|
76
|
+
const shortcuts = useMemo(() => parseShortcut(shortcut), [shortcut])
|
|
77
|
+
const preferredShortcut = useMemo(() => getPreferredShortcut(shortcuts), [shortcuts])
|
|
78
|
+
const shortcutTokens = useMemo(
|
|
79
|
+
() => formatShortcutTokens(preferredShortcut?.shortcut || ''),
|
|
80
|
+
[preferredShortcut]
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
const handleShortcut = useCallback(
|
|
84
|
+
(event: KeyboardEvent) => {
|
|
85
|
+
if (disabled || event.defaultPrevented || event.repeat || shouldIgnoreShortcut(event)) {
|
|
86
|
+
return
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const matchedShortcut = shortcuts.find((shortcut) => matchesShortcut(shortcut, event))
|
|
90
|
+
|
|
91
|
+
if (!matchedShortcut) {
|
|
92
|
+
return
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (preventDefault) {
|
|
96
|
+
event.preventDefault()
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
onTrigger?.()
|
|
100
|
+
},
|
|
101
|
+
[disabled, onTrigger, preventDefault, shortcuts]
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
const handleDocumentKeydown = useCallback(
|
|
105
|
+
(event: KeyboardEvent) => {
|
|
106
|
+
setActiveKeys(Array.from(getPressedKeys(event)))
|
|
107
|
+
handleShortcut(event)
|
|
108
|
+
},
|
|
109
|
+
[handleShortcut]
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
const handleDocumentKeyup = useCallback((event: KeyboardEvent) => {
|
|
113
|
+
setActiveKeys(Array.from(getPressedKeys(event)))
|
|
114
|
+
}, [])
|
|
115
|
+
|
|
116
|
+
const handleWindowBlur = useCallback(() => {
|
|
117
|
+
setActiveKeys([])
|
|
118
|
+
}, [])
|
|
119
|
+
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
if (typeof document === 'undefined' || typeof window === 'undefined') {
|
|
122
|
+
return
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
document.addEventListener('keydown', handleDocumentKeydown)
|
|
126
|
+
document.addEventListener('keyup', handleDocumentKeyup)
|
|
127
|
+
window.addEventListener('blur', handleWindowBlur)
|
|
128
|
+
|
|
129
|
+
return () => {
|
|
130
|
+
document.removeEventListener('keydown', handleDocumentKeydown)
|
|
131
|
+
document.removeEventListener('keyup', handleDocumentKeyup)
|
|
132
|
+
window.removeEventListener('blur', handleWindowBlur)
|
|
133
|
+
}
|
|
134
|
+
}, [handleDocumentKeydown, handleDocumentKeyup, handleWindowBlur])
|
|
135
|
+
|
|
136
|
+
const handleClick = (event: MouseEvent<HTMLButtonElement>) => {
|
|
137
|
+
onClick?.(event)
|
|
138
|
+
onTrigger?.()
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return (
|
|
142
|
+
<button
|
|
143
|
+
type={type}
|
|
144
|
+
className={classNames('search-button', className)}
|
|
145
|
+
disabled={disabled}
|
|
146
|
+
onClick={handleClick}
|
|
147
|
+
{...rest}
|
|
148
|
+
ref={forkedRef}
|
|
149
|
+
>
|
|
150
|
+
{children ?? (
|
|
151
|
+
<>
|
|
152
|
+
{icon ?? (
|
|
153
|
+
<svg
|
|
154
|
+
className="search-button-icon"
|
|
155
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
156
|
+
viewBox="0 0 512 512"
|
|
157
|
+
aria-hidden="true"
|
|
158
|
+
>
|
|
159
|
+
<path
|
|
160
|
+
fill="currentColor"
|
|
161
|
+
d="m479.6 399.716-81.084-81.084-62.368-25.767A175 175 0 0 0 368 192c0-97.047-78.953-176-176-176S16 94.953 16 192s78.953 176 176 176a175.03 175.03 0 0 0 101.619-32.377l25.7 62.2 81.081 81.088a56 56 0 1 0 79.2-79.195M48 192c0-79.4 64.6-144 144-144s144 64.6 144 144-64.6 144-144 144S48 271.4 48 192m408.971 264.284a24.03 24.03 0 0 1-33.942 0l-76.572-76.572-23.894-57.835 57.837 23.894 76.573 76.572a24.03 24.03 0 0 1-.002 33.941"
|
|
162
|
+
/>
|
|
163
|
+
</svg>
|
|
164
|
+
)}
|
|
165
|
+
<span className="search-button-placeholder">{placeholder}</span>
|
|
166
|
+
</>
|
|
167
|
+
)}
|
|
168
|
+
<span className="search-button-keys" aria-hidden="true">
|
|
169
|
+
{shortcutTokens.map((key) => (
|
|
170
|
+
<span
|
|
171
|
+
className={classNames('search-button-key', { active: activeKeys.includes(key) })}
|
|
172
|
+
data-coreui-search-button-key={key}
|
|
173
|
+
key={key}
|
|
174
|
+
>
|
|
175
|
+
{key}
|
|
176
|
+
</span>
|
|
177
|
+
))}
|
|
178
|
+
</span>
|
|
179
|
+
</button>
|
|
180
|
+
)
|
|
181
|
+
}
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
CSearchButton.propTypes = {
|
|
185
|
+
children: PropTypes.node,
|
|
186
|
+
className: PropTypes.string,
|
|
187
|
+
disabled: PropTypes.bool,
|
|
188
|
+
icon: PropTypes.node,
|
|
189
|
+
onTrigger: PropTypes.func,
|
|
190
|
+
placeholder: PropTypes.node,
|
|
191
|
+
preventDefault: PropTypes.bool,
|
|
192
|
+
shortcut: PropTypes.string,
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
CSearchButton.displayName = 'CSearchButton'
|