@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
|
@@ -226,7 +226,7 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
|
|
|
226
226
|
popperConfig,
|
|
227
227
|
portal = false,
|
|
228
228
|
reference = 'toggle',
|
|
229
|
-
variant = '
|
|
229
|
+
variant = 'dropdown',
|
|
230
230
|
visible = false,
|
|
231
231
|
...rest
|
|
232
232
|
},
|
|
@@ -271,18 +271,14 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
|
|
|
271
271
|
useEffect(() => {
|
|
272
272
|
if (visible) {
|
|
273
273
|
handleShow()
|
|
274
|
-
} else {
|
|
274
|
+
} else if (_visible) {
|
|
275
275
|
handleHide()
|
|
276
276
|
}
|
|
277
277
|
}, [visible])
|
|
278
278
|
|
|
279
279
|
useEffect(() => {
|
|
280
|
-
return () =>
|
|
281
|
-
|
|
282
|
-
handleHide()
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}, [])
|
|
280
|
+
return () => destroyPopper()
|
|
281
|
+
}, [destroyPopper])
|
|
286
282
|
|
|
287
283
|
useEffect(() => {
|
|
288
284
|
const referenceElement = getReferenceElement(reference, dropdownToggleElement, dropdownRef)
|
|
@@ -302,21 +298,12 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
|
|
|
302
298
|
const handleHide = useCallback(() => {
|
|
303
299
|
setVisible(false)
|
|
304
300
|
|
|
305
|
-
const menuElement = dropdownMenuRef.current
|
|
306
|
-
const toggleElement = dropdownToggleElement
|
|
307
|
-
|
|
308
301
|
if (allowPopperUse) {
|
|
309
302
|
destroyPopper()
|
|
310
303
|
}
|
|
311
304
|
|
|
312
|
-
menuElement?.removeEventListener('keydown', handleKeydown)
|
|
313
|
-
toggleElement?.removeEventListener('keydown', handleKeydown)
|
|
314
|
-
|
|
315
|
-
window.removeEventListener('click', handleClick)
|
|
316
|
-
window.removeEventListener('keyup', handleKeyup)
|
|
317
|
-
|
|
318
305
|
onHide?.()
|
|
319
|
-
}, [allowPopperUse,
|
|
306
|
+
}, [allowPopperUse, destroyPopper, onHide])
|
|
320
307
|
|
|
321
308
|
const handleKeydown = useCallback((event: KeyboardEvent) => {
|
|
322
309
|
if (!dropdownMenuRef.current) {
|
|
@@ -399,11 +386,6 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
|
|
|
399
386
|
}
|
|
400
387
|
|
|
401
388
|
toggleElement.focus()
|
|
402
|
-
toggleElement.addEventListener('keydown', handleKeydown)
|
|
403
|
-
menuElement.addEventListener('keydown', handleKeydown)
|
|
404
|
-
|
|
405
|
-
window.addEventListener('click', handleClick)
|
|
406
|
-
window.addEventListener('keyup', handleKeyup)
|
|
407
389
|
|
|
408
390
|
if (event && (event.key === 'ArrowDown' || event.key === 'ArrowUp')) {
|
|
409
391
|
setPendingKeyDownEvent(event)
|
|
@@ -412,19 +394,32 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
|
|
|
412
394
|
onShow?.()
|
|
413
395
|
}
|
|
414
396
|
},
|
|
415
|
-
[
|
|
416
|
-
allowPopperUse,
|
|
417
|
-
computedPopperConfig,
|
|
418
|
-
dropdownToggleElement,
|
|
419
|
-
reference,
|
|
420
|
-
handleClick,
|
|
421
|
-
handleKeydown,
|
|
422
|
-
handleKeyup,
|
|
423
|
-
initPopper,
|
|
424
|
-
onShow,
|
|
425
|
-
]
|
|
397
|
+
[allowPopperUse, computedPopperConfig, dropdownToggleElement, reference, initPopper, onShow]
|
|
426
398
|
)
|
|
427
399
|
|
|
400
|
+
useEffect(() => {
|
|
401
|
+
if (!_visible) {
|
|
402
|
+
return
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const menuElement = dropdownMenuRef.current
|
|
406
|
+
const toggleElement = dropdownToggleElement
|
|
407
|
+
|
|
408
|
+
toggleElement?.addEventListener('keydown', handleKeydown)
|
|
409
|
+
menuElement?.addEventListener('keydown', handleKeydown)
|
|
410
|
+
|
|
411
|
+
window.addEventListener('click', handleClick)
|
|
412
|
+
window.addEventListener('keyup', handleKeyup)
|
|
413
|
+
|
|
414
|
+
return () => {
|
|
415
|
+
toggleElement?.removeEventListener('keydown', handleKeydown)
|
|
416
|
+
menuElement?.removeEventListener('keydown', handleKeydown)
|
|
417
|
+
|
|
418
|
+
window.removeEventListener('click', handleClick)
|
|
419
|
+
window.removeEventListener('keyup', handleKeyup)
|
|
420
|
+
}
|
|
421
|
+
}, [_visible, dropdownToggleElement, handleClick, handleKeydown, handleKeyup])
|
|
422
|
+
|
|
428
423
|
const contextValues = useMemo(
|
|
429
424
|
() => ({
|
|
430
425
|
alignment,
|
|
@@ -106,7 +106,7 @@ export const CDropdownToggle: FC<CDropdownToggleProps> = ({
|
|
|
106
106
|
if (custom && React.isValidElement(children)) {
|
|
107
107
|
return (
|
|
108
108
|
<>
|
|
109
|
-
{React.cloneElement(children as React.ReactElement<
|
|
109
|
+
{React.cloneElement(children as React.ReactElement<Record<string, unknown>>, {
|
|
110
110
|
'aria-expanded': visible,
|
|
111
111
|
...(!rest.disabled && { ...triggers }),
|
|
112
112
|
ref: dropdownToggleRef,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as React from 'react'
|
|
2
2
|
import { render, screen, fireEvent, waitFor } from '@testing-library/react'
|
|
3
3
|
import '@testing-library/jest-dom'
|
|
4
|
+
import { createPopper } from '@popperjs/core'
|
|
4
5
|
import {
|
|
5
6
|
CDropdown,
|
|
6
7
|
CDropdownToggle,
|
|
@@ -11,6 +12,14 @@ import {
|
|
|
11
12
|
CDropdownDivider,
|
|
12
13
|
} from '../index'
|
|
13
14
|
|
|
15
|
+
jest.mock('@popperjs/core', () => {
|
|
16
|
+
const actual = jest.requireActual('@popperjs/core')
|
|
17
|
+
return {
|
|
18
|
+
...actual,
|
|
19
|
+
createPopper: jest.fn(actual.createPopper),
|
|
20
|
+
}
|
|
21
|
+
})
|
|
22
|
+
|
|
14
23
|
test('loads and displays CDropdown component', async () => {
|
|
15
24
|
const { container } = render(<CDropdown>Test</CDropdown>)
|
|
16
25
|
expect(container).toMatchSnapshot()
|
|
@@ -89,7 +98,7 @@ test('CDropdown opens on toggle click and closes on clicking outside', async ()
|
|
|
89
98
|
|
|
90
99
|
// Click outside the dropdown to close it
|
|
91
100
|
const externalArea = screen.getByTestId('external-area')
|
|
92
|
-
fireEvent.
|
|
101
|
+
fireEvent.click(externalArea)
|
|
93
102
|
|
|
94
103
|
// Wait for the dropdown menu to be hidden
|
|
95
104
|
await waitFor(() => {
|
|
@@ -98,6 +107,52 @@ test('CDropdown opens on toggle click and closes on clicking outside', async ()
|
|
|
98
107
|
})
|
|
99
108
|
})
|
|
100
109
|
|
|
110
|
+
test('CDropdown keeps absolute positioning attached to a replaced toggler', async () => {
|
|
111
|
+
const createPopperMock = createPopper as jest.Mock
|
|
112
|
+
createPopperMock.mockClear()
|
|
113
|
+
|
|
114
|
+
const DropdownApp = ({ togglerKey }: { togglerKey: string }) => (
|
|
115
|
+
<CDropdown>
|
|
116
|
+
<CDropdownToggle key={togglerKey} data-testid={`toggler-${togglerKey}`}>
|
|
117
|
+
Toggle
|
|
118
|
+
</CDropdownToggle>
|
|
119
|
+
<CDropdownMenu>
|
|
120
|
+
<CDropdownItem>A</CDropdownItem>
|
|
121
|
+
</CDropdownMenu>
|
|
122
|
+
</CDropdown>
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
const { rerender } = render(<DropdownApp togglerKey="first" />)
|
|
126
|
+
|
|
127
|
+
fireEvent.click(screen.getByTestId('toggler-first'))
|
|
128
|
+
|
|
129
|
+
const menu = screen.getByRole('menu')
|
|
130
|
+
await waitFor(() => {
|
|
131
|
+
expect(menu).toHaveStyle('position: absolute')
|
|
132
|
+
expect(menu).toHaveAttribute('data-popper-placement', 'bottom-start')
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
expect(createPopperMock).toHaveBeenCalledTimes(1)
|
|
136
|
+
expect(createPopperMock.mock.calls[0][0]).toBe(screen.getByTestId('toggler-first'))
|
|
137
|
+
|
|
138
|
+
const firstPopper = createPopperMock.mock.results[0].value
|
|
139
|
+
const destroySpy = jest.spyOn(firstPopper, 'destroy')
|
|
140
|
+
|
|
141
|
+
rerender(<DropdownApp togglerKey="second" />)
|
|
142
|
+
|
|
143
|
+
await waitFor(() => {
|
|
144
|
+
expect(createPopperMock).toHaveBeenCalledTimes(2)
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
expect(destroySpy).toHaveBeenCalledTimes(1)
|
|
148
|
+
expect(createPopperMock.mock.calls[1][0]).toBe(screen.getByTestId('toggler-second'))
|
|
149
|
+
|
|
150
|
+
await waitFor(() => {
|
|
151
|
+
expect(menu).toHaveStyle('position: absolute')
|
|
152
|
+
expect(menu).toHaveAttribute('data-popper-placement', 'bottom-start')
|
|
153
|
+
})
|
|
154
|
+
})
|
|
155
|
+
|
|
101
156
|
test('CDropdown example', async () => {
|
|
102
157
|
jest.useFakeTimers()
|
|
103
158
|
const { container } = render(
|
|
@@ -13,7 +13,7 @@ exports[`CDropdown customize 1`] = `
|
|
|
13
13
|
exports[`CDropdown example 1`] = `
|
|
14
14
|
<div>
|
|
15
15
|
<div
|
|
16
|
-
class="
|
|
16
|
+
class="dropdown"
|
|
17
17
|
>
|
|
18
18
|
<button
|
|
19
19
|
aria-expanded="false"
|
|
@@ -68,7 +68,7 @@ exports[`CDropdown example 1`] = `
|
|
|
68
68
|
exports[`loads and displays CDropdown component 1`] = `
|
|
69
69
|
<div>
|
|
70
70
|
<div
|
|
71
|
-
class="
|
|
71
|
+
class="dropdown"
|
|
72
72
|
>
|
|
73
73
|
Test
|
|
74
74
|
</div>
|
|
@@ -6,7 +6,7 @@ import { CFocusTrap } from '../CFocusTrap'
|
|
|
6
6
|
// Helper function to create a test component with focusable elements
|
|
7
7
|
interface TestComponentProps {
|
|
8
8
|
children?: React.ReactNode
|
|
9
|
-
[key: string]:
|
|
9
|
+
[key: string]: unknown
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
const TestComponent = ({ children, ...props }: TestComponentProps) => (
|
|
@@ -5,7 +5,8 @@ import React, {
|
|
|
5
5
|
KeyboardEvent,
|
|
6
6
|
ReactNode,
|
|
7
7
|
forwardRef,
|
|
8
|
-
|
|
8
|
+
isValidElement,
|
|
9
|
+
useId,
|
|
9
10
|
useMemo,
|
|
10
11
|
useRef,
|
|
11
12
|
useState,
|
|
@@ -13,8 +14,9 @@ import React, {
|
|
|
13
14
|
import PropTypes from 'prop-types'
|
|
14
15
|
import classNames from 'classnames'
|
|
15
16
|
|
|
16
|
-
import {
|
|
17
|
+
import { useChipSet } from '../chip-set/useChipSet'
|
|
17
18
|
import { useForkedRef } from '../../hooks'
|
|
19
|
+
import { isRTL } from '../../utils'
|
|
18
20
|
|
|
19
21
|
type ChipClassName = string | ((value: string) => string)
|
|
20
22
|
|
|
@@ -23,13 +25,17 @@ export interface CChipInputProps extends Omit<
|
|
|
23
25
|
'onChange' | 'onInput' | 'onSelect'
|
|
24
26
|
> {
|
|
25
27
|
/**
|
|
26
|
-
*
|
|
28
|
+
* Declarative `CChip` children used as the initial chips. Their values seed the uncontrolled value when `defaultValue` is not provided (parity with the vanilla Chip Input).
|
|
27
29
|
*/
|
|
28
|
-
|
|
30
|
+
children?: ReactNode
|
|
29
31
|
/**
|
|
30
32
|
* Adds custom classes to chips rendered by the React Chip Input component. Accepts a static className or a resolver function based on chip value.
|
|
31
33
|
*/
|
|
32
34
|
chipClassName?: ChipClassName
|
|
35
|
+
/**
|
|
36
|
+
* Adds custom classes to the React Chip Input component root element.
|
|
37
|
+
*/
|
|
38
|
+
className?: string
|
|
33
39
|
/**
|
|
34
40
|
* Creates a new chip when the React Chip Input component loses focus with a pending value.
|
|
35
41
|
*/
|
|
@@ -42,6 +48,10 @@ export interface CChipInputProps extends Omit<
|
|
|
42
48
|
* Disables the React Chip Input component and prevents adding, removing, or selecting chips.
|
|
43
49
|
*/
|
|
44
50
|
disabled?: boolean
|
|
51
|
+
/**
|
|
52
|
+
* Renders the chips as filter chips, each showing a leading check icon while selected. Implies `selectable`.
|
|
53
|
+
*/
|
|
54
|
+
filter?: boolean
|
|
45
55
|
/**
|
|
46
56
|
* Sets the `id` of the internal text input rendered by the React Chip Input component.
|
|
47
57
|
*/
|
|
@@ -94,6 +104,10 @@ export interface CChipInputProps extends Omit<
|
|
|
94
104
|
* Enables chip selection behavior in the React Chip Input component.
|
|
95
105
|
*/
|
|
96
106
|
selectable?: boolean
|
|
107
|
+
/**
|
|
108
|
+
* Sets how many chips can be selected at once in the React Chip Input component.
|
|
109
|
+
*/
|
|
110
|
+
selectionMode?: 'single' | 'multiple'
|
|
97
111
|
/**
|
|
98
112
|
* Sets the separator character used to create chips while typing or pasting in the React Chip Input component.
|
|
99
113
|
*/
|
|
@@ -127,14 +141,37 @@ const uniqueValues = (values: string[]) => [
|
|
|
127
141
|
...new Set(values.map((value) => value.trim()).filter(Boolean)),
|
|
128
142
|
]
|
|
129
143
|
|
|
144
|
+
// Initial chip values can be supplied declaratively as CChip children (parity
|
|
145
|
+
// with the vanilla ChipInput, which reads existing .chip elements on init).
|
|
146
|
+
const valuesFromChildren = (children: ReactNode): string[] => {
|
|
147
|
+
const values: string[] = []
|
|
148
|
+
React.Children.forEach(children, (child) => {
|
|
149
|
+
if (!isValidElement(child)) {
|
|
150
|
+
return
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const { value, children: childContent } = child.props as {
|
|
154
|
+
value?: string
|
|
155
|
+
children?: ReactNode
|
|
156
|
+
}
|
|
157
|
+
const chipValue = value ?? (typeof childContent === 'string' ? childContent : undefined)
|
|
158
|
+
if (chipValue) {
|
|
159
|
+
values.push(chipValue)
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
return values
|
|
163
|
+
}
|
|
164
|
+
|
|
130
165
|
export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
|
|
131
166
|
(
|
|
132
167
|
{
|
|
168
|
+
children,
|
|
133
169
|
className,
|
|
134
170
|
chipClassName,
|
|
135
171
|
createOnBlur = true,
|
|
136
172
|
defaultValue = [],
|
|
137
173
|
disabled,
|
|
174
|
+
filter,
|
|
138
175
|
id,
|
|
139
176
|
label,
|
|
140
177
|
maxChips = null,
|
|
@@ -148,6 +185,7 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
|
|
|
148
185
|
readOnly,
|
|
149
186
|
removable = true,
|
|
150
187
|
selectable,
|
|
188
|
+
selectionMode,
|
|
151
189
|
separator = ',',
|
|
152
190
|
size,
|
|
153
191
|
value,
|
|
@@ -156,21 +194,34 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
|
|
|
156
194
|
ref
|
|
157
195
|
) => {
|
|
158
196
|
const isControlled = value !== undefined
|
|
159
|
-
const [_values, setValues] = useState<string[]>(() =>
|
|
197
|
+
const [_values, setValues] = useState<string[]>(() =>
|
|
198
|
+
uniqueValues(defaultValue.length > 0 ? defaultValue : valuesFromChildren(children))
|
|
199
|
+
)
|
|
160
200
|
const [inputValue, setInputValue] = useState('')
|
|
161
|
-
const [selectedValues, setSelectedValues] = useState<string[]>([])
|
|
162
|
-
const rootRef = useRef<HTMLDivElement>(null)
|
|
163
201
|
const inputRef = useRef<HTMLInputElement>(null)
|
|
164
|
-
const
|
|
202
|
+
const generatedName = useId()
|
|
165
203
|
|
|
166
204
|
const values = useMemo(
|
|
167
205
|
() => uniqueValues(isControlled ? (value as string[]) : _values),
|
|
168
206
|
[isControlled, value, _values]
|
|
169
207
|
)
|
|
170
208
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
209
|
+
// Build CChipInput on the same engine as CChipSet: selection coordination,
|
|
210
|
+
// roving focus, and chip prop injection all live in useChipSet. CChipInput
|
|
211
|
+
// owns the chip list and adds the text-input layer on top.
|
|
212
|
+
const { rootRef, clearSelection, getFocusableChips, handleKeyDown, renderChipsFromData } =
|
|
213
|
+
useChipSet({
|
|
214
|
+
ariaRemoveLabel: undefined,
|
|
215
|
+
disabled,
|
|
216
|
+
filter,
|
|
217
|
+
removable: Boolean(removable && !disabled && !readOnly),
|
|
218
|
+
selectable,
|
|
219
|
+
selectionMode,
|
|
220
|
+
restoreFocusOnRemove: false,
|
|
221
|
+
onSelectionChange: onSelect,
|
|
222
|
+
onRemoveChip: (chipValue) => remove(chipValue),
|
|
223
|
+
})
|
|
224
|
+
const forkedRef = useForkedRef(ref, rootRef)
|
|
174
225
|
|
|
175
226
|
const emitValuesChange = (nextValues: string[]) => {
|
|
176
227
|
if (!isControlled) {
|
|
@@ -206,16 +257,10 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
|
|
|
206
257
|
return false
|
|
207
258
|
}
|
|
208
259
|
|
|
209
|
-
|
|
210
|
-
emitValuesChange(
|
|
211
|
-
setSelectedValues((prev) => {
|
|
212
|
-
const nextSelected = prev.filter((item) => item !== valueToRemove)
|
|
213
|
-
if (nextSelected.length !== prev.length) {
|
|
214
|
-
onSelect?.(nextSelected)
|
|
215
|
-
}
|
|
216
|
-
return nextSelected
|
|
217
|
-
})
|
|
260
|
+
// Selection is cleaned up by useChipSet; here we just drop the value.
|
|
261
|
+
emitValuesChange(values.filter((item) => item !== valueToRemove))
|
|
218
262
|
onRemove?.(valueToRemove)
|
|
263
|
+
inputRef.current?.focus()
|
|
219
264
|
return true
|
|
220
265
|
}
|
|
221
266
|
|
|
@@ -226,19 +271,8 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
|
|
|
226
271
|
}
|
|
227
272
|
|
|
228
273
|
const focusLastChip = () => {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
const focusableChips = [
|
|
234
|
-
...rootRef.current.querySelectorAll<HTMLElement>(
|
|
235
|
-
'[data-coreui-chip-focusable="true"]:not(.disabled)'
|
|
236
|
-
),
|
|
237
|
-
]
|
|
238
|
-
if (focusableChips.length === 0) {
|
|
239
|
-
return
|
|
240
|
-
}
|
|
241
|
-
focusableChips[focusableChips.length - 1].focus()
|
|
274
|
+
const chips = getFocusableChips()
|
|
275
|
+
chips[chips.length - 1]?.focus()
|
|
242
276
|
}
|
|
243
277
|
|
|
244
278
|
const handleInputKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {
|
|
@@ -258,8 +292,16 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
|
|
|
258
292
|
break
|
|
259
293
|
}
|
|
260
294
|
|
|
261
|
-
case 'ArrowLeft':
|
|
262
|
-
|
|
295
|
+
case 'ArrowLeft':
|
|
296
|
+
case 'ArrowRight': {
|
|
297
|
+
// The arrow pointing toward the chips (left in LTR, right in RTL) jumps
|
|
298
|
+
// to the last chip when the caret is at the start of the input.
|
|
299
|
+
const towardChipsKey = isRTL(rootRef.current) ? 'ArrowRight' : 'ArrowLeft'
|
|
300
|
+
if (
|
|
301
|
+
event.key === towardChipsKey &&
|
|
302
|
+
event.currentTarget.selectionStart === 0 &&
|
|
303
|
+
event.currentTarget.selectionEnd === 0
|
|
304
|
+
) {
|
|
263
305
|
event.preventDefault()
|
|
264
306
|
focusLastChip()
|
|
265
307
|
}
|
|
@@ -359,6 +401,21 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
|
|
|
359
401
|
return
|
|
360
402
|
}
|
|
361
403
|
|
|
404
|
+
// The arrow past the last chip moves focus into the text field (mirrored in RTL).
|
|
405
|
+
if (event.key === (isRTL(rootRef.current) ? 'ArrowLeft' : 'ArrowRight')) {
|
|
406
|
+
const chips = getFocusableChips()
|
|
407
|
+
const lastChip = chips[chips.length - 1]
|
|
408
|
+
if (lastChip?.contains(event.target as Node)) {
|
|
409
|
+
event.preventDefault()
|
|
410
|
+
inputRef.current?.focus()
|
|
411
|
+
return
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
if (handleKeyDown(event)) {
|
|
416
|
+
return
|
|
417
|
+
}
|
|
418
|
+
|
|
362
419
|
if (event.key.length === 1) {
|
|
363
420
|
inputRef.current?.focus()
|
|
364
421
|
}
|
|
@@ -370,16 +427,6 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
|
|
|
370
427
|
}
|
|
371
428
|
}
|
|
372
429
|
|
|
373
|
-
const handleSelectedChange = (chipValue: string, selected: boolean) => {
|
|
374
|
-
setSelectedValues((prev) => {
|
|
375
|
-
const nextSelected = selected
|
|
376
|
-
? uniqueValues([...prev, chipValue])
|
|
377
|
-
: prev.filter((value) => value !== chipValue)
|
|
378
|
-
onSelect?.(nextSelected)
|
|
379
|
-
return nextSelected
|
|
380
|
-
})
|
|
381
|
-
}
|
|
382
|
-
|
|
383
430
|
const inputSize = Math.max(placeholder.length, inputValue.length, 1)
|
|
384
431
|
|
|
385
432
|
return (
|
|
@@ -406,21 +453,14 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
|
|
|
406
453
|
</label>
|
|
407
454
|
)}
|
|
408
455
|
|
|
409
|
-
{
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
ariaRemoveLabel
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
selectable={selectable}
|
|
418
|
-
selected={selectedValues.includes(chipValue)}
|
|
419
|
-
onSelectedChange={(selected) => handleSelectedChange(chipValue, selected)}
|
|
420
|
-
>
|
|
421
|
-
{chipValue}
|
|
422
|
-
</CChip>
|
|
423
|
-
))}
|
|
456
|
+
{renderChipsFromData(
|
|
457
|
+
values.map((chipValue) => ({
|
|
458
|
+
value: chipValue,
|
|
459
|
+
label: chipValue,
|
|
460
|
+
className: resolveChipClassName(chipClassName, chipValue),
|
|
461
|
+
ariaRemoveLabel: `Remove ${chipValue}`,
|
|
462
|
+
}))
|
|
463
|
+
)}
|
|
424
464
|
|
|
425
465
|
<input
|
|
426
466
|
type="text"
|
|
@@ -435,27 +475,24 @@ export const CChipInput = forwardRef<HTMLDivElement, CChipInputProps>(
|
|
|
435
475
|
onChange={(event) => handleInputChange(event.target.value)}
|
|
436
476
|
onKeyDown={handleInputKeyDown}
|
|
437
477
|
onPaste={handlePaste}
|
|
438
|
-
onFocus={
|
|
439
|
-
if (selectedValues.length > 0) {
|
|
440
|
-
setSelectedValues([])
|
|
441
|
-
onSelect?.([])
|
|
442
|
-
}
|
|
443
|
-
}}
|
|
478
|
+
onFocus={clearSelection}
|
|
444
479
|
ref={inputRef}
|
|
445
480
|
/>
|
|
446
481
|
|
|
447
|
-
|
|
482
|
+
<input type="hidden" name={name ?? generatedName} value={values.join(',')} />
|
|
448
483
|
</div>
|
|
449
484
|
)
|
|
450
485
|
}
|
|
451
486
|
)
|
|
452
487
|
|
|
453
488
|
CChipInput.propTypes = {
|
|
489
|
+
children: PropTypes.node,
|
|
454
490
|
chipClassName: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
|
|
455
491
|
className: PropTypes.string,
|
|
456
492
|
createOnBlur: PropTypes.bool,
|
|
457
493
|
defaultValue: PropTypes.array,
|
|
458
494
|
disabled: PropTypes.bool,
|
|
495
|
+
filter: PropTypes.bool,
|
|
459
496
|
id: PropTypes.string,
|
|
460
497
|
label: PropTypes.node,
|
|
461
498
|
maxChips: PropTypes.number,
|
|
@@ -469,6 +506,7 @@ CChipInput.propTypes = {
|
|
|
469
506
|
readOnly: PropTypes.bool,
|
|
470
507
|
removable: PropTypes.bool,
|
|
471
508
|
selectable: PropTypes.bool,
|
|
509
|
+
selectionMode: PropTypes.oneOf(['single', 'multiple']),
|
|
472
510
|
separator: PropTypes.string,
|
|
473
511
|
size: PropTypes.oneOf(['sm', 'lg']),
|
|
474
512
|
value: PropTypes.array,
|
|
@@ -32,8 +32,7 @@ export type ButtonObject = {
|
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export interface CFormCheckProps
|
|
35
|
-
extends CFormControlValidationProps,
|
|
36
|
-
InputHTMLAttributes<HTMLInputElement> {
|
|
35
|
+
extends CFormControlValidationProps, InputHTMLAttributes<HTMLInputElement> {
|
|
37
36
|
/**
|
|
38
37
|
* Create button-like checkboxes and radio buttons.
|
|
39
38
|
*/
|
|
@@ -11,8 +11,7 @@ import classNames from 'classnames'
|
|
|
11
11
|
import { CFormControlWrapper, CFormControlWrapperProps } from './CFormControlWrapper'
|
|
12
12
|
|
|
13
13
|
export interface CFormInputProps
|
|
14
|
-
extends CFormControlWrapperProps,
|
|
15
|
-
Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {
|
|
14
|
+
extends CFormControlWrapperProps, Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {
|
|
16
15
|
/**
|
|
17
16
|
* A string of all className you want applied to the component.
|
|
18
17
|
*/
|
|
@@ -12,8 +12,7 @@ type Option = {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export interface CFormSelectProps
|
|
15
|
-
extends CFormControlWrapperProps,
|
|
16
|
-
Omit<InputHTMLAttributes<HTMLSelectElement>, 'size'> {
|
|
15
|
+
extends CFormControlWrapperProps, Omit<InputHTMLAttributes<HTMLSelectElement>, 'size'> {
|
|
17
16
|
/**
|
|
18
17
|
* A string of all className you want applied to the component.
|
|
19
18
|
*/
|
|
@@ -5,8 +5,7 @@ import classNames from 'classnames'
|
|
|
5
5
|
import { CFormControlWrapper, CFormControlWrapperProps } from './CFormControlWrapper'
|
|
6
6
|
|
|
7
7
|
export interface CFormTextareaProps
|
|
8
|
-
extends CFormControlWrapperProps,
|
|
9
|
-
TextareaHTMLAttributes<HTMLTextAreaElement> {
|
|
8
|
+
extends CFormControlWrapperProps, TextareaHTMLAttributes<HTMLTextAreaElement> {
|
|
10
9
|
/**
|
|
11
10
|
* A string of all className you want applied to the component.
|
|
12
11
|
*/
|
|
@@ -4,8 +4,9 @@ import classNames from 'classnames'
|
|
|
4
4
|
|
|
5
5
|
import { PolymorphicRefForwardingComponent } from '../../helpers'
|
|
6
6
|
|
|
7
|
-
export interface CInputGroupTextProps
|
|
8
|
-
|
|
7
|
+
export interface CInputGroupTextProps extends LabelHTMLAttributes<
|
|
8
|
+
HTMLLabelElement | HTMLSpanElement
|
|
9
|
+
> {
|
|
9
10
|
/**
|
|
10
11
|
* Component used for the root node. Either a string to use a HTML element or a component.
|
|
11
12
|
*/
|