@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
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
import { fireEvent, render, screen } from '@testing-library/react'
|
|
3
|
+
import '@testing-library/jest-dom'
|
|
4
|
+
import { CSearchButton } from '../index'
|
|
5
|
+
|
|
6
|
+
const originalPlatform = window.navigator.platform
|
|
7
|
+
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
Object.defineProperty(window.navigator, 'platform', {
|
|
10
|
+
configurable: true,
|
|
11
|
+
value: 'MacIntel',
|
|
12
|
+
})
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
Object.defineProperty(window.navigator, 'platform', {
|
|
17
|
+
configurable: true,
|
|
18
|
+
value: originalPlatform,
|
|
19
|
+
})
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
test('loads and displays CSearchButton component', async () => {
|
|
23
|
+
const { container } = render(<CSearchButton />)
|
|
24
|
+
expect(container).toMatchSnapshot()
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
test('CSearchButton customize', async () => {
|
|
28
|
+
const { container } = render(
|
|
29
|
+
<CSearchButton className="bazinga" placeholder="Command palette" shortcut="meta+k,ctrl+k" />
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
expect(container).toMatchSnapshot()
|
|
33
|
+
expect(container.firstChild).toHaveClass('search-button')
|
|
34
|
+
expect(container.firstChild).toHaveClass('bazinga')
|
|
35
|
+
expect(screen.getByText('Command palette')).toBeInTheDocument()
|
|
36
|
+
expect(screen.getByText('⌘')).toBeInTheDocument()
|
|
37
|
+
expect(screen.getByText('K')).toBeInTheDocument()
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
test('CSearchButton triggers click on matching shortcut', async () => {
|
|
41
|
+
const onClick = jest.fn()
|
|
42
|
+
const onTrigger = jest.fn()
|
|
43
|
+
|
|
44
|
+
render(<CSearchButton onClick={onClick} onTrigger={onTrigger} shortcut="meta+k,ctrl+k" />)
|
|
45
|
+
|
|
46
|
+
fireEvent.keyDown(document, { key: 'k', metaKey: true })
|
|
47
|
+
|
|
48
|
+
expect(onClick).toHaveBeenCalledTimes(0)
|
|
49
|
+
expect(onTrigger).toHaveBeenCalledTimes(1)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
test('CSearchButton ignores plain typing in editable fields', async () => {
|
|
53
|
+
const onClick = jest.fn()
|
|
54
|
+
|
|
55
|
+
render(
|
|
56
|
+
<>
|
|
57
|
+
<input aria-label="Search input" />
|
|
58
|
+
<CSearchButton onClick={onClick} shortcut="k" />
|
|
59
|
+
</>
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
fireEvent.keyDown(screen.getByLabelText('Search input'), { key: 'k' })
|
|
63
|
+
|
|
64
|
+
expect(onClick).not.toHaveBeenCalled()
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
test('CSearchButton highlights active shortcut keys', async () => {
|
|
68
|
+
render(<CSearchButton shortcut="meta+k,ctrl+k" />)
|
|
69
|
+
|
|
70
|
+
fireEvent.keyDown(document, { key: 'Meta', metaKey: true })
|
|
71
|
+
|
|
72
|
+
expect(screen.getByText('⌘')).toHaveClass('active')
|
|
73
|
+
|
|
74
|
+
fireEvent.keyDown(document, { key: 'k', metaKey: true })
|
|
75
|
+
|
|
76
|
+
expect(screen.getByText('⌘')).toHaveClass('active')
|
|
77
|
+
expect(screen.getByText('K')).toHaveClass('active')
|
|
78
|
+
|
|
79
|
+
fireEvent.keyUp(document, { key: 'k' })
|
|
80
|
+
|
|
81
|
+
expect(screen.getByText('⌘')).not.toHaveClass('active')
|
|
82
|
+
expect(screen.getByText('K')).not.toHaveClass('active')
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
test('CSearchButton triggers onTrigger on click', async () => {
|
|
86
|
+
const onClick = jest.fn()
|
|
87
|
+
const onTrigger = jest.fn()
|
|
88
|
+
|
|
89
|
+
render(<CSearchButton onClick={onClick} onTrigger={onTrigger} />)
|
|
90
|
+
|
|
91
|
+
fireEvent.click(screen.getByRole('button'))
|
|
92
|
+
|
|
93
|
+
expect(onClick).toHaveBeenCalledTimes(1)
|
|
94
|
+
expect(onTrigger).toHaveBeenCalledTimes(1)
|
|
95
|
+
})
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`CSearchButton customize 1`] = `
|
|
4
|
+
<div>
|
|
5
|
+
<button
|
|
6
|
+
class="search-button bazinga"
|
|
7
|
+
type="button"
|
|
8
|
+
>
|
|
9
|
+
<svg
|
|
10
|
+
aria-hidden="true"
|
|
11
|
+
class="search-button-icon"
|
|
12
|
+
viewBox="0 0 512 512"
|
|
13
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
14
|
+
>
|
|
15
|
+
<path
|
|
16
|
+
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"
|
|
17
|
+
fill="currentColor"
|
|
18
|
+
/>
|
|
19
|
+
</svg>
|
|
20
|
+
<span
|
|
21
|
+
class="search-button-placeholder"
|
|
22
|
+
>
|
|
23
|
+
Command palette
|
|
24
|
+
</span>
|
|
25
|
+
<span
|
|
26
|
+
aria-hidden="true"
|
|
27
|
+
class="search-button-keys"
|
|
28
|
+
>
|
|
29
|
+
<span
|
|
30
|
+
class="search-button-key"
|
|
31
|
+
data-coreui-search-button-key="⌘"
|
|
32
|
+
>
|
|
33
|
+
⌘
|
|
34
|
+
</span>
|
|
35
|
+
<span
|
|
36
|
+
class="search-button-key"
|
|
37
|
+
data-coreui-search-button-key="K"
|
|
38
|
+
>
|
|
39
|
+
K
|
|
40
|
+
</span>
|
|
41
|
+
</span>
|
|
42
|
+
</button>
|
|
43
|
+
</div>
|
|
44
|
+
`;
|
|
45
|
+
|
|
46
|
+
exports[`loads and displays CSearchButton component 1`] = `
|
|
47
|
+
<div>
|
|
48
|
+
<button
|
|
49
|
+
class="search-button"
|
|
50
|
+
type="button"
|
|
51
|
+
>
|
|
52
|
+
<svg
|
|
53
|
+
aria-hidden="true"
|
|
54
|
+
class="search-button-icon"
|
|
55
|
+
viewBox="0 0 512 512"
|
|
56
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
57
|
+
>
|
|
58
|
+
<path
|
|
59
|
+
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"
|
|
60
|
+
fill="currentColor"
|
|
61
|
+
/>
|
|
62
|
+
</svg>
|
|
63
|
+
<span
|
|
64
|
+
class="search-button-placeholder"
|
|
65
|
+
>
|
|
66
|
+
Search
|
|
67
|
+
</span>
|
|
68
|
+
<span
|
|
69
|
+
aria-hidden="true"
|
|
70
|
+
class="search-button-keys"
|
|
71
|
+
>
|
|
72
|
+
<span
|
|
73
|
+
class="search-button-key"
|
|
74
|
+
data-coreui-search-button-key="⌘"
|
|
75
|
+
>
|
|
76
|
+
⌘
|
|
77
|
+
</span>
|
|
78
|
+
<span
|
|
79
|
+
class="search-button-key"
|
|
80
|
+
data-coreui-search-button-key="/"
|
|
81
|
+
>
|
|
82
|
+
/
|
|
83
|
+
</span>
|
|
84
|
+
</span>
|
|
85
|
+
</button>
|
|
86
|
+
</div>
|
|
87
|
+
`;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { SearchButtonShortcut } from './types'
|
|
2
|
+
|
|
3
|
+
const MODIFIER_KEYS = new Set(['alt', 'ctrl', 'meta', 'shift'])
|
|
4
|
+
const KEY_ALIASES: Record<string, string> = {
|
|
5
|
+
' ': 'space',
|
|
6
|
+
cmd: 'meta',
|
|
7
|
+
command: 'meta',
|
|
8
|
+
control: 'ctrl',
|
|
9
|
+
esc: 'escape',
|
|
10
|
+
option: 'alt',
|
|
11
|
+
return: 'enter',
|
|
12
|
+
spacebar: 'space',
|
|
13
|
+
}
|
|
14
|
+
const KEY_LABELS: Record<string, string> = {
|
|
15
|
+
alt: 'Alt',
|
|
16
|
+
ctrl: 'Ctrl',
|
|
17
|
+
meta: '⌘',
|
|
18
|
+
shift: 'Shift',
|
|
19
|
+
space: 'Space',
|
|
20
|
+
}
|
|
21
|
+
const EDITABLE_TARGET_SELECTOR =
|
|
22
|
+
'input, textarea, select, [contenteditable=""], [contenteditable="true"], [contenteditable="plaintext-only"]'
|
|
23
|
+
|
|
24
|
+
export const normalizeKey = (key: string) => KEY_ALIASES[key.toLowerCase()] || key.toLowerCase()
|
|
25
|
+
|
|
26
|
+
export const parseShortcut = (shortcut: string): SearchButtonShortcut[] =>
|
|
27
|
+
shortcut
|
|
28
|
+
.split(',')
|
|
29
|
+
.map((value) => value.trim())
|
|
30
|
+
.filter(Boolean)
|
|
31
|
+
.map((value) => {
|
|
32
|
+
const keys = value.split('+').map((part) => normalizeKey(part.trim()))
|
|
33
|
+
const modifiers = {
|
|
34
|
+
alt: false,
|
|
35
|
+
ctrl: false,
|
|
36
|
+
meta: false,
|
|
37
|
+
shift: false,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
let key = ''
|
|
41
|
+
|
|
42
|
+
for (const part of keys) {
|
|
43
|
+
if (MODIFIER_KEYS.has(part)) {
|
|
44
|
+
modifiers[part as keyof typeof modifiers] = true
|
|
45
|
+
continue
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
key = part
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
key,
|
|
53
|
+
modifiers,
|
|
54
|
+
shortcut: value,
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
const getPlatform = () => {
|
|
59
|
+
if (typeof window === 'undefined') {
|
|
60
|
+
return ''
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const navigator = window.navigator as Navigator & {
|
|
64
|
+
userAgentData?: {
|
|
65
|
+
platform?: string
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return navigator.userAgentData?.platform || navigator.platform || navigator.userAgent || ''
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export const isMacOS = () => /Mac|iPhone|iPad|iPod|macOS|Macintosh/.test(getPlatform())
|
|
73
|
+
|
|
74
|
+
export const getPreferredShortcut = (shortcuts: SearchButtonShortcut[]) =>
|
|
75
|
+
shortcuts.find((shortcut) => (isMacOS() ? shortcut.modifiers.meta : shortcut.modifiers.ctrl)) ||
|
|
76
|
+
shortcuts[0] ||
|
|
77
|
+
null
|
|
78
|
+
|
|
79
|
+
export const getKeyLabel = (key: string) =>
|
|
80
|
+
KEY_LABELS[key] ||
|
|
81
|
+
(key.length === 1 ? key.toUpperCase() : `${key.charAt(0).toUpperCase()}${key.slice(1)}`)
|
|
82
|
+
|
|
83
|
+
export const formatShortcutTokens = (shortcut: string) =>
|
|
84
|
+
shortcut
|
|
85
|
+
.split('+')
|
|
86
|
+
.map((part) => normalizeKey(part.trim()))
|
|
87
|
+
.map((part) => getKeyLabel(part))
|
|
88
|
+
.filter(Boolean)
|
|
89
|
+
|
|
90
|
+
export const getPressedKeys = (event: KeyboardEvent) => {
|
|
91
|
+
const pressedKeys = new Set<string>()
|
|
92
|
+
|
|
93
|
+
if (event.altKey) {
|
|
94
|
+
pressedKeys.add(KEY_LABELS.alt)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (event.ctrlKey) {
|
|
98
|
+
pressedKeys.add(KEY_LABELS.ctrl)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (event.metaKey) {
|
|
102
|
+
pressedKeys.add(KEY_LABELS.meta)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (event.shiftKey) {
|
|
106
|
+
pressedKeys.add(KEY_LABELS.shift)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const normalizedKey = normalizeKey(event.key)
|
|
110
|
+
|
|
111
|
+
if (!MODIFIER_KEYS.has(normalizedKey) && event.type === 'keydown') {
|
|
112
|
+
pressedKeys.add(getKeyLabel(normalizedKey))
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return pressedKeys
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export const isEditableTarget = (target: EventTarget | null) => {
|
|
119
|
+
if (!(target instanceof Element)) {
|
|
120
|
+
return false
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return target.matches(EDITABLE_TARGET_SELECTOR) || !!target.closest(EDITABLE_TARGET_SELECTOR)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export const shouldIgnoreShortcut = (event: KeyboardEvent) =>
|
|
127
|
+
isEditableTarget(event.target) && !event.ctrlKey && !event.metaKey
|
|
128
|
+
|
|
129
|
+
export const matchesShortcut = (shortcut: SearchButtonShortcut, event: KeyboardEvent) => {
|
|
130
|
+
if (!shortcut.key || normalizeKey(event.key) !== shortcut.key) {
|
|
131
|
+
return false
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return (
|
|
135
|
+
shortcut.modifiers.alt === event.altKey &&
|
|
136
|
+
shortcut.modifiers.ctrl === event.ctrlKey &&
|
|
137
|
+
shortcut.modifiers.meta === event.metaKey &&
|
|
138
|
+
shortcut.modifiers.shift === event.shiftKey
|
|
139
|
+
)
|
|
140
|
+
}
|
|
@@ -92,7 +92,7 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
|
|
|
92
92
|
visible,
|
|
93
93
|
...rest
|
|
94
94
|
},
|
|
95
|
-
ref
|
|
95
|
+
ref
|
|
96
96
|
) => {
|
|
97
97
|
const sidebarRef = useRef<HTMLDivElement>(null)
|
|
98
98
|
const forkedRef = useForkedRef(ref, sidebarRef)
|
|
@@ -101,46 +101,65 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
|
|
|
101
101
|
const [mobile, setMobile] = useState(false)
|
|
102
102
|
const [visibleMobile, setVisibleMobile] = useState<boolean>(false)
|
|
103
103
|
const [visibleDesktop, setVisibleDesktop] = useState<boolean>(
|
|
104
|
-
visible
|
|
104
|
+
visible === undefined ? !overlaid : visible
|
|
105
105
|
)
|
|
106
106
|
|
|
107
107
|
useEffect(() => {
|
|
108
|
-
|
|
109
|
-
|
|
108
|
+
if (sidebarRef.current) {
|
|
109
|
+
setMobile(isOnMobile(sidebarRef.current))
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (visible !== undefined) {
|
|
113
|
+
handleVisibleChange(visible)
|
|
114
|
+
}
|
|
110
115
|
}, [visible])
|
|
111
116
|
|
|
112
117
|
useEffect(() => {
|
|
113
|
-
inViewport !== undefined
|
|
114
|
-
|
|
115
|
-
|
|
118
|
+
if (inViewport !== undefined) {
|
|
119
|
+
onVisibleChange?.(inViewport)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (inViewport) {
|
|
123
|
+
onShow?.()
|
|
124
|
+
} else {
|
|
125
|
+
onHide?.()
|
|
126
|
+
}
|
|
116
127
|
}, [inViewport])
|
|
117
128
|
|
|
118
129
|
useEffect(() => {
|
|
119
|
-
|
|
130
|
+
if (mobile) {
|
|
131
|
+
setVisibleMobile(false)
|
|
132
|
+
}
|
|
120
133
|
}, [mobile])
|
|
121
134
|
|
|
122
135
|
useEffect(() => {
|
|
123
|
-
|
|
124
|
-
|
|
136
|
+
const element = sidebarRef.current
|
|
137
|
+
|
|
138
|
+
if (element) {
|
|
139
|
+
setMobile(isOnMobile(element))
|
|
140
|
+
setInViewport(isInViewport(element))
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const handleTransitionEnd = () => {
|
|
144
|
+
if (element) {
|
|
145
|
+
setInViewport(isInViewport(element))
|
|
146
|
+
}
|
|
147
|
+
}
|
|
125
148
|
|
|
126
149
|
window.addEventListener('resize', handleResize)
|
|
127
150
|
window.addEventListener('mouseup', handleClickOutside)
|
|
128
151
|
window.addEventListener('keyup', handleKeyup)
|
|
129
152
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
sidebarRef.current && setInViewport(isInViewport(sidebarRef.current))
|
|
133
|
-
})
|
|
153
|
+
element?.addEventListener('mouseup', handleOnClick)
|
|
154
|
+
element?.addEventListener('transitionend', handleTransitionEnd)
|
|
134
155
|
|
|
135
156
|
return () => {
|
|
136
157
|
window.removeEventListener('resize', handleResize)
|
|
137
158
|
window.removeEventListener('mouseup', handleClickOutside)
|
|
138
159
|
window.removeEventListener('keyup', handleKeyup)
|
|
139
160
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
sidebarRef.current && setInViewport(isInViewport(sidebarRef.current))
|
|
143
|
-
})
|
|
161
|
+
element?.removeEventListener('mouseup', handleOnClick)
|
|
162
|
+
element?.removeEventListener('transitionend', handleTransitionEnd)
|
|
144
163
|
}
|
|
145
164
|
})
|
|
146
165
|
|
|
@@ -158,8 +177,10 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
|
|
|
158
177
|
}
|
|
159
178
|
|
|
160
179
|
const handleResize = () => {
|
|
161
|
-
|
|
162
|
-
|
|
180
|
+
if (sidebarRef.current) {
|
|
181
|
+
setMobile(isOnMobile(sidebarRef.current))
|
|
182
|
+
setInViewport(isInViewport(sidebarRef.current))
|
|
183
|
+
}
|
|
163
184
|
}
|
|
164
185
|
|
|
165
186
|
const handleKeyup = (event: Event) => {
|
|
@@ -183,11 +204,15 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
|
|
|
183
204
|
|
|
184
205
|
const handleOnClick = (event: Event) => {
|
|
185
206
|
const target = event.target as HTMLAnchorElement
|
|
186
|
-
|
|
207
|
+
|
|
208
|
+
if (
|
|
209
|
+
target &&
|
|
187
210
|
target.classList.contains('nav-link') &&
|
|
188
211
|
!target.classList.contains('nav-group-toggle') &&
|
|
189
|
-
mobile
|
|
212
|
+
mobile
|
|
213
|
+
) {
|
|
190
214
|
handleHide()
|
|
215
|
+
}
|
|
191
216
|
}
|
|
192
217
|
|
|
193
218
|
return (
|
|
@@ -206,7 +231,7 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
|
|
|
206
231
|
show: (mobile && visibleMobile) || (overlaid && visibleDesktop),
|
|
207
232
|
hide: visibleDesktop === false && !mobile && !overlaid,
|
|
208
233
|
},
|
|
209
|
-
className
|
|
234
|
+
className
|
|
210
235
|
)}
|
|
211
236
|
{...rest}
|
|
212
237
|
ref={forkedRef}
|
|
@@ -217,11 +242,11 @@ export const CSidebar: PolymorphicRefForwardingComponent<'div', CSidebarProps> =
|
|
|
217
242
|
mobile &&
|
|
218
243
|
createPortal(
|
|
219
244
|
<CBackdrop className="sidebar-backdrop" visible={mobile && visibleMobile} />,
|
|
220
|
-
document.body
|
|
245
|
+
document.body
|
|
221
246
|
)}
|
|
222
247
|
</>
|
|
223
248
|
)
|
|
224
|
-
}
|
|
249
|
+
}
|
|
225
250
|
)
|
|
226
251
|
|
|
227
252
|
CSidebar.propTypes = {
|
|
@@ -241,4 +266,4 @@ CSidebar.propTypes = {
|
|
|
241
266
|
visible: PropTypes.bool,
|
|
242
267
|
}
|
|
243
268
|
|
|
244
|
-
CSidebar.displayName = 'CSidebar'
|
|
269
|
+
CSidebar.displayName = 'CSidebar'
|
|
@@ -2,18 +2,14 @@ import React, {
|
|
|
2
2
|
ElementType,
|
|
3
3
|
forwardRef,
|
|
4
4
|
HTMLAttributes,
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
useCallback,
|
|
6
|
+
useMemo,
|
|
7
7
|
useState,
|
|
8
8
|
} from 'react'
|
|
9
9
|
import PropTypes from 'prop-types'
|
|
10
10
|
import classNames from 'classnames'
|
|
11
11
|
|
|
12
|
-
import
|
|
13
|
-
import type { CNavLinkProps } from '../nav/CNavLink'
|
|
14
|
-
import type { CNavItemProps } from '../nav/CNavItem'
|
|
15
|
-
|
|
16
|
-
import { CSidebarNavContext } from './CSidebarNavContext'
|
|
12
|
+
import { CNavGroupContext, CNavGroupContextValue } from '../nav/CNavGroupContext'
|
|
17
13
|
|
|
18
14
|
import { PolymorphicRefForwardingComponent } from '../../helpers'
|
|
19
15
|
|
|
@@ -28,60 +24,48 @@ export interface CSidebarNavProps extends HTMLAttributes<HTMLUListElement> {
|
|
|
28
24
|
* A string of all className you want applied to the component.
|
|
29
25
|
*/
|
|
30
26
|
className?: string
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const recursiveClone = (children: ReactNode, id?: string, updateId?: boolean): ReactNode => {
|
|
46
|
-
return React.Children.map(children, (child, index) => {
|
|
47
|
-
if (!isNavElement(child)) {
|
|
48
|
-
return child
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const _id = id ? (updateId ? `${id}.${index}` : `${id}`) : `${index}`
|
|
52
|
-
|
|
53
|
-
if (child.props.children) {
|
|
54
|
-
const type = child.type as { displayName?: string }
|
|
55
|
-
const shouldUpdateId = type.displayName !== 'CNavItem'
|
|
56
|
-
|
|
57
|
-
return React.cloneElement(child, {
|
|
58
|
-
idx: _id,
|
|
59
|
-
children: recursiveClone(child.props.children, _id, shouldUpdateId),
|
|
60
|
-
})
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
return React.cloneElement(child, {
|
|
64
|
-
idx: _id,
|
|
65
|
-
})
|
|
66
|
-
})
|
|
27
|
+
/**
|
|
28
|
+
* Make navigation more compact by cutting link padding in half.
|
|
29
|
+
*
|
|
30
|
+
* @since 5.11.0
|
|
31
|
+
*/
|
|
32
|
+
compact?: boolean
|
|
33
|
+
/**
|
|
34
|
+
* Sets the navigation variant.
|
|
35
|
+
*
|
|
36
|
+
* @since 5.11.0
|
|
37
|
+
*/
|
|
38
|
+
variant?: 'tree'
|
|
67
39
|
}
|
|
68
40
|
|
|
69
41
|
export const CSidebarNav: PolymorphicRefForwardingComponent<'ul', CSidebarNavProps> = forwardRef<
|
|
70
42
|
HTMLUListElement,
|
|
71
43
|
CSidebarNavProps
|
|
72
|
-
>(({ children, as: Component = 'ul', className, ...rest }, ref) => {
|
|
73
|
-
const [
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
44
|
+
>(({ children, as: Component = 'ul', className, compact, variant, ...rest }, ref) => {
|
|
45
|
+
const [activeId, setActiveId] = useState<string | undefined>()
|
|
46
|
+
const openBranch = useCallback(() => {}, [])
|
|
47
|
+
const contextValue = useMemo<CNavGroupContextValue>(
|
|
48
|
+
() => ({ activeId, setActiveId, openBranch }),
|
|
49
|
+
[activeId, openBranch]
|
|
50
|
+
)
|
|
78
51
|
|
|
79
52
|
return (
|
|
80
|
-
<
|
|
81
|
-
<Component
|
|
82
|
-
{
|
|
53
|
+
<CNavGroupContext.Provider value={contextValue}>
|
|
54
|
+
<Component
|
|
55
|
+
className={classNames(
|
|
56
|
+
'sidebar-nav',
|
|
57
|
+
{
|
|
58
|
+
compact,
|
|
59
|
+
'sidebar-nav-tree': variant === 'tree',
|
|
60
|
+
},
|
|
61
|
+
className
|
|
62
|
+
)}
|
|
63
|
+
ref={ref}
|
|
64
|
+
{...rest}
|
|
65
|
+
>
|
|
66
|
+
{children}
|
|
83
67
|
</Component>
|
|
84
|
-
</
|
|
68
|
+
</CNavGroupContext.Provider>
|
|
85
69
|
)
|
|
86
70
|
})
|
|
87
71
|
|
|
@@ -89,6 +73,8 @@ CSidebarNav.propTypes = {
|
|
|
89
73
|
as: PropTypes.elementType,
|
|
90
74
|
children: PropTypes.node,
|
|
91
75
|
className: PropTypes.string,
|
|
76
|
+
compact: PropTypes.bool,
|
|
77
|
+
variant: PropTypes.oneOf(['tree']),
|
|
92
78
|
}
|
|
93
79
|
|
|
94
80
|
CSidebarNav.displayName = 'CSidebarNav'
|
|
@@ -44,3 +44,29 @@ test('CSidebar customize hide', async () => {
|
|
|
44
44
|
expect(container.firstChild).toHaveClass('sidebar')
|
|
45
45
|
expect(container.firstChild).toHaveClass('sidebar-sticky')
|
|
46
46
|
})
|
|
47
|
+
|
|
48
|
+
test('CSidebar removes the exact transitionend listener reference on cleanup', async () => {
|
|
49
|
+
const addSpy = jest.spyOn(HTMLElement.prototype, 'addEventListener')
|
|
50
|
+
const removeSpy = jest.spyOn(HTMLElement.prototype, 'removeEventListener')
|
|
51
|
+
|
|
52
|
+
const { container, unmount } = render(<CSidebar>Test</CSidebar>)
|
|
53
|
+
const sidebar = container.querySelector('.sidebar')
|
|
54
|
+
unmount()
|
|
55
|
+
|
|
56
|
+
const handlersOn = (spy: jest.SpyInstance) =>
|
|
57
|
+
spy.mock.calls
|
|
58
|
+
.map((args, index) => ({ args, context: spy.mock.contexts[index] }))
|
|
59
|
+
.filter(({ args, context }) => args[0] === 'transitionend' && context === sidebar)
|
|
60
|
+
.map(({ args }) => args[1])
|
|
61
|
+
|
|
62
|
+
const added = handlersOn(addSpy)
|
|
63
|
+
const removed = handlersOn(removeSpy)
|
|
64
|
+
|
|
65
|
+
expect(added.length).toBeGreaterThan(0)
|
|
66
|
+
for (const handler of added) {
|
|
67
|
+
expect(removed).toContain(handler)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
addSpy.mockRestore()
|
|
71
|
+
removeSpy.mockRestore()
|
|
72
|
+
})
|
|
@@ -207,9 +207,10 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
|
|
|
207
207
|
|
|
208
208
|
const firstItemOnActivePageIndex: number = _activePage ? (_activePage - 1) * _itemsPerPage : 0
|
|
209
209
|
|
|
210
|
-
const currentItems: Item[] =
|
|
211
|
-
|
|
212
|
-
|
|
210
|
+
const currentItems: Item[] =
|
|
211
|
+
_activePage && pagination
|
|
212
|
+
? sortedItems.slice(firstItemOnActivePageIndex, firstItemOnActivePageIndex + _itemsPerPage)
|
|
213
|
+
: sortedItems
|
|
213
214
|
|
|
214
215
|
useEffect(() => {
|
|
215
216
|
mountedRef.current && onFilteredItemsChange && onFilteredItemsChange(sortedItems)
|
|
@@ -496,7 +497,7 @@ export const CSmartTable = forwardRef<HTMLDivElement, CSmartTableProps>(
|
|
|
496
497
|
)}
|
|
497
498
|
</div>
|
|
498
499
|
|
|
499
|
-
{
|
|
500
|
+
{pagination && (
|
|
500
501
|
<div className="row">
|
|
501
502
|
<div className="col">
|
|
502
503
|
{((pagination && numberOfPages > 1) ||
|
|
@@ -103,7 +103,7 @@ export interface CSmartTableProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
103
103
|
*/
|
|
104
104
|
itemsNumber?: number
|
|
105
105
|
/**
|
|
106
|
-
* Number of items per
|
|
106
|
+
* Number of items per page. Only applicable when `pagination` is enabled.
|
|
107
107
|
*/
|
|
108
108
|
itemsPerPage?: number
|
|
109
109
|
/**
|
|
@@ -115,7 +115,7 @@ export interface CSmartTableProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
115
115
|
*/
|
|
116
116
|
itemsPerPageOptions?: number[]
|
|
117
117
|
/**
|
|
118
|
-
* Adds select element over table, which is used for control items per page in pagination. If you want to customize this element, pass object with optional values:
|
|
118
|
+
* Adds select element over table, which is used for control items per page in pagination. Only applicable when `pagination` is enabled. If you want to customize this element, pass object with optional values:
|
|
119
119
|
* - external (Boolean) - disables automatic 'itemsPerPage' change.
|
|
120
120
|
*/
|
|
121
121
|
itemsPerPageSelect?: boolean | ItemsPerPageSelect
|