@coreui/react-pro 5.7.0 → 5.8.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.
Files changed (477) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/accordion/CAccordion.js.map +1 -1
  3. package/dist/cjs/components/accordion/CAccordionBody.js.map +1 -1
  4. package/dist/cjs/components/accordion/CAccordionButton.js.map +1 -1
  5. package/dist/cjs/components/accordion/CAccordionHeader.js.map +1 -1
  6. package/dist/cjs/components/accordion/CAccordionItem.js.map +1 -1
  7. package/dist/cjs/components/alert/CAlert.js +1 -1
  8. package/dist/cjs/components/alert/CAlert.js.map +1 -1
  9. package/dist/cjs/components/alert/CAlertHeading.js.map +1 -1
  10. package/dist/cjs/components/alert/CAlertLink.js.map +1 -1
  11. package/dist/cjs/components/avatar/CAvatar.js.map +1 -1
  12. package/dist/cjs/components/backdrop/CBackdrop.js +1 -1
  13. package/dist/cjs/components/backdrop/CBackdrop.js.map +1 -1
  14. package/dist/cjs/components/badge/CBadge.js.map +1 -1
  15. package/dist/cjs/components/breadcrumb/CBreadcrumb.js.map +1 -1
  16. package/dist/cjs/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  17. package/dist/cjs/components/button/CButton.js.map +1 -1
  18. package/dist/cjs/components/button-group/CButtonGroup.js.map +1 -1
  19. package/dist/cjs/components/button-group/CButtonToolbar.js.map +1 -1
  20. package/dist/cjs/components/calendar/CCalendar.js +1 -1
  21. package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
  22. package/dist/cjs/components/calendar/utils.js +5 -0
  23. package/dist/cjs/components/calendar/utils.js.map +1 -1
  24. package/dist/cjs/components/callout/CCallout.js.map +1 -1
  25. package/dist/cjs/components/card/CCard.js.map +1 -1
  26. package/dist/cjs/components/card/CCardBody.js.map +1 -1
  27. package/dist/cjs/components/card/CCardFooter.js.map +1 -1
  28. package/dist/cjs/components/card/CCardGroup.js.map +1 -1
  29. package/dist/cjs/components/card/CCardHeader.js.map +1 -1
  30. package/dist/cjs/components/card/CCardImage.js.map +1 -1
  31. package/dist/cjs/components/card/CCardImageOverlay.js.map +1 -1
  32. package/dist/cjs/components/card/CCardLink.js.map +1 -1
  33. package/dist/cjs/components/card/CCardSubtitle.js.map +1 -1
  34. package/dist/cjs/components/card/CCardText.js.map +1 -1
  35. package/dist/cjs/components/card/CCardTitle.js.map +1 -1
  36. package/dist/cjs/components/carousel/CCarousel.js +1 -1
  37. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  38. package/dist/cjs/components/carousel/CCarouselCaption.js.map +1 -1
  39. package/dist/cjs/components/carousel/CCarouselItem.js +1 -1
  40. package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
  41. package/dist/cjs/components/close-button/CCloseButton.js.map +1 -1
  42. package/dist/cjs/components/collapse/CCollapse.js +1 -1
  43. package/dist/cjs/components/collapse/CCollapse.js.map +1 -1
  44. package/dist/cjs/components/conditional-portal/CConditionalPortal.js.map +1 -1
  45. package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
  46. package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
  47. package/dist/cjs/components/date-range-picker/utils.js.map +1 -1
  48. package/dist/cjs/components/dropdown/CDropdown.js +2 -2
  49. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  50. package/dist/cjs/components/dropdown/CDropdownDivider.js.map +1 -1
  51. package/dist/cjs/components/dropdown/CDropdownHeader.js.map +1 -1
  52. package/dist/cjs/components/dropdown/CDropdownItem.js.map +1 -1
  53. package/dist/cjs/components/dropdown/CDropdownItemPlain.js.map +1 -1
  54. package/dist/cjs/components/dropdown/CDropdownMenu.js +1 -1
  55. package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
  56. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  57. package/dist/cjs/components/dropdown/utils.js.map +1 -1
  58. package/dist/cjs/components/element-cover/CElementCover.js +1 -1
  59. package/dist/cjs/components/element-cover/CElementCover.js.map +1 -1
  60. package/dist/cjs/components/footer/CFooter.js.map +1 -1
  61. package/dist/cjs/components/form/CForm.js.map +1 -1
  62. package/dist/cjs/components/form/CFormCheck.js +1 -1
  63. package/dist/cjs/components/form/CFormCheck.js.map +1 -1
  64. package/dist/cjs/components/form/CFormControlValidation.js.map +1 -1
  65. package/dist/cjs/components/form/CFormControlWrapper.js.map +1 -1
  66. package/dist/cjs/components/form/CFormFeedback.js.map +1 -1
  67. package/dist/cjs/components/form/CFormFloating.js.map +1 -1
  68. package/dist/cjs/components/form/CFormInput.js.map +1 -1
  69. package/dist/cjs/components/form/CFormLabel.js.map +1 -1
  70. package/dist/cjs/components/form/CFormRange.js.map +1 -1
  71. package/dist/cjs/components/form/CFormSelect.js.map +1 -1
  72. package/dist/cjs/components/form/CFormSwitch.js.map +1 -1
  73. package/dist/cjs/components/form/CFormText.js.map +1 -1
  74. package/dist/cjs/components/form/CFormTextarea.js.map +1 -1
  75. package/dist/cjs/components/form/CInputGroup.js.map +1 -1
  76. package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
  77. package/dist/cjs/components/grid/CCol.js.map +1 -1
  78. package/dist/cjs/components/grid/CContainer.js.map +1 -1
  79. package/dist/cjs/components/grid/CRow.js.map +1 -1
  80. package/dist/cjs/components/header/CHeader.js.map +1 -1
  81. package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
  82. package/dist/cjs/components/header/CHeaderDivider.js.map +1 -1
  83. package/dist/cjs/components/header/CHeaderNav.js.map +1 -1
  84. package/dist/cjs/components/header/CHeaderText.js.map +1 -1
  85. package/dist/cjs/components/header/CHeaderToggler.js.map +1 -1
  86. package/dist/cjs/components/image/CImage.js.map +1 -1
  87. package/dist/cjs/components/link/CLink.js.map +1 -1
  88. package/dist/cjs/components/list-group/CListGroup.js +4 -3
  89. package/dist/cjs/components/list-group/CListGroup.js.map +1 -1
  90. package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
  91. package/dist/cjs/components/loading-button/CLoadingButton.js.map +1 -1
  92. package/dist/cjs/components/modal/CModal.js +1 -1
  93. package/dist/cjs/components/modal/CModal.js.map +1 -1
  94. package/dist/cjs/components/modal/CModalBody.js.map +1 -1
  95. package/dist/cjs/components/modal/CModalContent.js.map +1 -1
  96. package/dist/cjs/components/modal/CModalDialog.js.map +1 -1
  97. package/dist/cjs/components/modal/CModalFooter.js.map +1 -1
  98. package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
  99. package/dist/cjs/components/modal/CModalTitle.js.map +1 -1
  100. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +26 -3
  101. package/dist/cjs/components/multi-select/CMultiSelect.js +102 -86
  102. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  103. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  104. package/dist/cjs/components/multi-select/CMultiSelectOptions.d.ts +1 -1
  105. package/dist/cjs/components/multi-select/CMultiSelectOptions.js +5 -5
  106. package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
  107. package/dist/cjs/components/multi-select/CMultiSelectSelection.d.ts +2 -2
  108. package/dist/cjs/components/multi-select/CMultiSelectSelection.js +8 -1
  109. package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
  110. package/dist/cjs/components/multi-select/types.d.ts +4 -0
  111. package/dist/cjs/components/multi-select/utils.d.ts +5 -2
  112. package/dist/cjs/components/multi-select/utils.js +18 -1
  113. package/dist/cjs/components/multi-select/utils.js.map +1 -1
  114. package/dist/cjs/components/nav/CNav.js.map +1 -1
  115. package/dist/cjs/components/nav/CNavGroup.js +1 -1
  116. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  117. package/dist/cjs/components/nav/CNavGroupItems.js.map +1 -1
  118. package/dist/cjs/components/nav/CNavItem.js.map +1 -1
  119. package/dist/cjs/components/nav/CNavLink.js +1 -1
  120. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  121. package/dist/cjs/components/nav/CNavTitle.js.map +1 -1
  122. package/dist/cjs/components/navbar/CNavbar.js.map +1 -1
  123. package/dist/cjs/components/navbar/CNavbarBrand.js.map +1 -1
  124. package/dist/cjs/components/navbar/CNavbarNav.js.map +1 -1
  125. package/dist/cjs/components/navbar/CNavbarText.js.map +1 -1
  126. package/dist/cjs/components/navbar/CNavbarToggler.js.map +1 -1
  127. package/dist/cjs/components/offcanvas/COffcanvas.js +1 -1
  128. package/dist/cjs/components/offcanvas/COffcanvas.js.map +1 -1
  129. package/dist/cjs/components/offcanvas/COffcanvasBody.js.map +1 -1
  130. package/dist/cjs/components/offcanvas/COffcanvasHeader.js.map +1 -1
  131. package/dist/cjs/components/offcanvas/COffcanvasTitle.js.map +1 -1
  132. package/dist/cjs/components/pagination/CPagination.js.map +1 -1
  133. package/dist/cjs/components/pagination/CPaginationItem.js.map +1 -1
  134. package/dist/cjs/components/picker/CPicker.js +2 -1
  135. package/dist/cjs/components/picker/CPicker.js.map +1 -1
  136. package/dist/cjs/components/placeholder/CPlaceholder.js.map +1 -1
  137. package/dist/cjs/components/popover/CPopover.js +49 -44
  138. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  139. package/dist/cjs/components/progress/CProgress.js.map +1 -1
  140. package/dist/cjs/components/progress/CProgressBar.js.map +1 -1
  141. package/dist/cjs/components/progress/CProgressStacked.js.map +1 -1
  142. package/dist/cjs/components/rating/CRating.js.map +1 -1
  143. package/dist/cjs/components/sidebar/CSidebar.js +1 -1
  144. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  145. package/dist/cjs/components/sidebar/CSidebarBrand.js.map +1 -1
  146. package/dist/cjs/components/sidebar/CSidebarFooter.js.map +1 -1
  147. package/dist/cjs/components/sidebar/CSidebarHeader.js.map +1 -1
  148. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  149. package/dist/cjs/components/sidebar/CSidebarToggler.js.map +1 -1
  150. package/dist/cjs/components/smart-pagination/CSmartPagination.js.map +1 -1
  151. package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
  152. package/dist/cjs/components/smart-table/CSmartTableBody.js.map +1 -1
  153. package/dist/cjs/components/smart-table/CSmartTableHead.js.map +1 -1
  154. package/dist/cjs/components/smart-table/utils.js.map +1 -1
  155. package/dist/cjs/components/spinner/CSpinner.js.map +1 -1
  156. package/dist/cjs/components/table/CTable.js.map +1 -1
  157. package/dist/cjs/components/table/CTableBody.js.map +1 -1
  158. package/dist/cjs/components/table/CTableCaption.js.map +1 -1
  159. package/dist/cjs/components/table/CTableDataCell.js.map +1 -1
  160. package/dist/cjs/components/table/CTableFoot.js.map +1 -1
  161. package/dist/cjs/components/table/CTableHead.js.map +1 -1
  162. package/dist/cjs/components/table/CTableHeaderCell.js.map +1 -1
  163. package/dist/cjs/components/table/CTableResponsiveWrapper.js.map +1 -1
  164. package/dist/cjs/components/table/CTableRow.js.map +1 -1
  165. package/dist/cjs/components/table/utils.js.map +1 -1
  166. package/dist/cjs/components/tabs/CTab.js.map +1 -1
  167. package/dist/cjs/components/tabs/CTabContent.js.map +1 -1
  168. package/dist/cjs/components/tabs/CTabList.js +1 -1
  169. package/dist/cjs/components/tabs/CTabList.js.map +1 -1
  170. package/dist/cjs/components/tabs/CTabPane.js +1 -1
  171. package/dist/cjs/components/tabs/CTabPane.js.map +1 -1
  172. package/dist/cjs/components/tabs/CTabPanel.js +1 -1
  173. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
  174. package/dist/cjs/components/tabs/CTabs.js.map +1 -1
  175. package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
  176. package/dist/cjs/components/time-picker/CTimePickerRollCol.js +2 -1
  177. package/dist/cjs/components/time-picker/CTimePickerRollCol.js.map +1 -1
  178. package/dist/cjs/components/time-picker/utils.js.map +1 -1
  179. package/dist/cjs/components/toast/CToast.js +1 -1
  180. package/dist/cjs/components/toast/CToast.js.map +1 -1
  181. package/dist/cjs/components/toast/CToastBody.js.map +1 -1
  182. package/dist/cjs/components/toast/CToastClose.js.map +1 -1
  183. package/dist/cjs/components/toast/CToastHeader.js.map +1 -1
  184. package/dist/cjs/components/toast/CToaster.js.map +1 -1
  185. package/dist/cjs/components/tooltip/CTooltip.js +49 -44
  186. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  187. package/dist/cjs/components/virtual-scroller/CVirtualScroller.js +5 -5
  188. package/dist/cjs/components/virtual-scroller/CVirtualScroller.js.map +1 -1
  189. package/dist/cjs/components/widgets/CWidgetStatsA.js.map +1 -1
  190. package/dist/cjs/components/widgets/CWidgetStatsB.js.map +1 -1
  191. package/dist/cjs/components/widgets/CWidgetStatsC.js.map +1 -1
  192. package/dist/cjs/components/widgets/CWidgetStatsD.js.map +1 -1
  193. package/dist/cjs/components/widgets/CWidgetStatsE.js.map +1 -1
  194. package/dist/cjs/components/widgets/CWidgetStatsF.js.map +1 -1
  195. package/dist/cjs/hooks/index.d.ts +2 -1
  196. package/dist/cjs/hooks/useColorModes.js.map +1 -1
  197. package/dist/cjs/hooks/useDebounce.js.map +1 -1
  198. package/dist/cjs/hooks/useDebouncedCallback.js.map +1 -1
  199. package/dist/cjs/hooks/useDropdownWithPopper.d.ts +10 -0
  200. package/dist/cjs/hooks/useDropdownWithPopper.js +98 -0
  201. package/dist/cjs/hooks/useDropdownWithPopper.js.map +1 -0
  202. package/dist/cjs/hooks/useForkedRef.js.map +1 -1
  203. package/dist/cjs/hooks/useIsVisible.js.map +1 -1
  204. package/dist/cjs/hooks/usePopper.js.map +1 -1
  205. package/dist/cjs/hooks/useStateWithCallback.js.map +1 -1
  206. package/dist/cjs/index.js +2 -0
  207. package/dist/cjs/index.js.map +1 -1
  208. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -1
  209. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js.map +1 -1
  210. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
  211. package/dist/cjs/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -1
  212. package/dist/cjs/node_modules/@coreui/icons-react/dist/index.esm.js.map +1 -1
  213. package/dist/cjs/node_modules/classnames/index.js.map +1 -1
  214. package/dist/cjs/node_modules/dom-helpers/esm/addClass.js.map +1 -1
  215. package/dist/cjs/node_modules/dom-helpers/esm/hasClass.js.map +1 -1
  216. package/dist/cjs/node_modules/dom-helpers/esm/removeClass.js.map +1 -1
  217. package/dist/cjs/node_modules/react-device-detect/dist/lib.js.map +1 -1
  218. package/dist/cjs/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
  219. package/dist/cjs/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  220. package/dist/cjs/node_modules/react-transition-group/esm/config.js.map +1 -1
  221. package/dist/cjs/node_modules/react-transition-group/esm/utils/PropTypes.js.map +1 -1
  222. package/dist/cjs/node_modules/react-transition-group/esm/utils/reflow.js.map +1 -1
  223. package/dist/cjs/packages/coreui-react-pro/node_modules/tslib/tslib.es6.js.map +1 -1
  224. package/dist/cjs/props.js.map +1 -1
  225. package/dist/cjs/utils/executeAfterTransition.js.map +1 -1
  226. package/dist/cjs/utils/getNextActiveElement.js +1 -1
  227. package/dist/cjs/utils/getNextActiveElement.js.map +1 -1
  228. package/dist/cjs/utils/getRTLPlacement.js.map +1 -1
  229. package/dist/cjs/utils/getTransitionDurationFromElement.js.map +1 -1
  230. package/dist/cjs/utils/isInViewport.js.map +1 -1
  231. package/dist/cjs/utils/isObjectInArray.js.map +1 -1
  232. package/dist/cjs/utils/isRTL.js.map +1 -1
  233. package/dist/esm/components/accordion/CAccordion.js.map +1 -1
  234. package/dist/esm/components/accordion/CAccordionBody.js.map +1 -1
  235. package/dist/esm/components/accordion/CAccordionButton.js.map +1 -1
  236. package/dist/esm/components/accordion/CAccordionHeader.js.map +1 -1
  237. package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
  238. package/dist/esm/components/alert/CAlert.js +1 -1
  239. package/dist/esm/components/alert/CAlert.js.map +1 -1
  240. package/dist/esm/components/alert/CAlertHeading.js.map +1 -1
  241. package/dist/esm/components/alert/CAlertLink.js.map +1 -1
  242. package/dist/esm/components/avatar/CAvatar.js.map +1 -1
  243. package/dist/esm/components/backdrop/CBackdrop.js +1 -1
  244. package/dist/esm/components/backdrop/CBackdrop.js.map +1 -1
  245. package/dist/esm/components/badge/CBadge.js.map +1 -1
  246. package/dist/esm/components/breadcrumb/CBreadcrumb.js.map +1 -1
  247. package/dist/esm/components/breadcrumb/CBreadcrumbItem.js.map +1 -1
  248. package/dist/esm/components/button/CButton.js.map +1 -1
  249. package/dist/esm/components/button-group/CButtonGroup.js.map +1 -1
  250. package/dist/esm/components/button-group/CButtonToolbar.js.map +1 -1
  251. package/dist/esm/components/calendar/CCalendar.js +1 -1
  252. package/dist/esm/components/calendar/CCalendar.js.map +1 -1
  253. package/dist/esm/components/calendar/utils.js +5 -0
  254. package/dist/esm/components/calendar/utils.js.map +1 -1
  255. package/dist/esm/components/callout/CCallout.js.map +1 -1
  256. package/dist/esm/components/card/CCard.js.map +1 -1
  257. package/dist/esm/components/card/CCardBody.js.map +1 -1
  258. package/dist/esm/components/card/CCardFooter.js.map +1 -1
  259. package/dist/esm/components/card/CCardGroup.js.map +1 -1
  260. package/dist/esm/components/card/CCardHeader.js.map +1 -1
  261. package/dist/esm/components/card/CCardImage.js.map +1 -1
  262. package/dist/esm/components/card/CCardImageOverlay.js.map +1 -1
  263. package/dist/esm/components/card/CCardLink.js.map +1 -1
  264. package/dist/esm/components/card/CCardSubtitle.js.map +1 -1
  265. package/dist/esm/components/card/CCardText.js.map +1 -1
  266. package/dist/esm/components/card/CCardTitle.js.map +1 -1
  267. package/dist/esm/components/carousel/CCarousel.js +1 -1
  268. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  269. package/dist/esm/components/carousel/CCarouselCaption.js.map +1 -1
  270. package/dist/esm/components/carousel/CCarouselItem.js +1 -1
  271. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  272. package/dist/esm/components/close-button/CCloseButton.js.map +1 -1
  273. package/dist/esm/components/collapse/CCollapse.js +1 -1
  274. package/dist/esm/components/collapse/CCollapse.js.map +1 -1
  275. package/dist/esm/components/conditional-portal/CConditionalPortal.js.map +1 -1
  276. package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
  277. package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
  278. package/dist/esm/components/date-range-picker/utils.js.map +1 -1
  279. package/dist/esm/components/dropdown/CDropdown.js +2 -2
  280. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  281. package/dist/esm/components/dropdown/CDropdownDivider.js.map +1 -1
  282. package/dist/esm/components/dropdown/CDropdownHeader.js.map +1 -1
  283. package/dist/esm/components/dropdown/CDropdownItem.js.map +1 -1
  284. package/dist/esm/components/dropdown/CDropdownItemPlain.js.map +1 -1
  285. package/dist/esm/components/dropdown/CDropdownMenu.js +1 -1
  286. package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
  287. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  288. package/dist/esm/components/dropdown/utils.js.map +1 -1
  289. package/dist/esm/components/element-cover/CElementCover.js +1 -1
  290. package/dist/esm/components/element-cover/CElementCover.js.map +1 -1
  291. package/dist/esm/components/footer/CFooter.js.map +1 -1
  292. package/dist/esm/components/form/CForm.js.map +1 -1
  293. package/dist/esm/components/form/CFormCheck.js +1 -1
  294. package/dist/esm/components/form/CFormCheck.js.map +1 -1
  295. package/dist/esm/components/form/CFormControlValidation.js.map +1 -1
  296. package/dist/esm/components/form/CFormControlWrapper.js.map +1 -1
  297. package/dist/esm/components/form/CFormFeedback.js.map +1 -1
  298. package/dist/esm/components/form/CFormFloating.js.map +1 -1
  299. package/dist/esm/components/form/CFormInput.js.map +1 -1
  300. package/dist/esm/components/form/CFormLabel.js.map +1 -1
  301. package/dist/esm/components/form/CFormRange.js.map +1 -1
  302. package/dist/esm/components/form/CFormSelect.js.map +1 -1
  303. package/dist/esm/components/form/CFormSwitch.js.map +1 -1
  304. package/dist/esm/components/form/CFormText.js.map +1 -1
  305. package/dist/esm/components/form/CFormTextarea.js.map +1 -1
  306. package/dist/esm/components/form/CInputGroup.js.map +1 -1
  307. package/dist/esm/components/form/CInputGroupText.js.map +1 -1
  308. package/dist/esm/components/grid/CCol.js.map +1 -1
  309. package/dist/esm/components/grid/CContainer.js.map +1 -1
  310. package/dist/esm/components/grid/CRow.js.map +1 -1
  311. package/dist/esm/components/header/CHeader.js.map +1 -1
  312. package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
  313. package/dist/esm/components/header/CHeaderDivider.js.map +1 -1
  314. package/dist/esm/components/header/CHeaderNav.js.map +1 -1
  315. package/dist/esm/components/header/CHeaderText.js.map +1 -1
  316. package/dist/esm/components/header/CHeaderToggler.js.map +1 -1
  317. package/dist/esm/components/image/CImage.js.map +1 -1
  318. package/dist/esm/components/link/CLink.js.map +1 -1
  319. package/dist/esm/components/list-group/CListGroup.js +4 -3
  320. package/dist/esm/components/list-group/CListGroup.js.map +1 -1
  321. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  322. package/dist/esm/components/loading-button/CLoadingButton.js.map +1 -1
  323. package/dist/esm/components/modal/CModal.js +1 -1
  324. package/dist/esm/components/modal/CModal.js.map +1 -1
  325. package/dist/esm/components/modal/CModalBody.js.map +1 -1
  326. package/dist/esm/components/modal/CModalContent.js.map +1 -1
  327. package/dist/esm/components/modal/CModalDialog.js.map +1 -1
  328. package/dist/esm/components/modal/CModalFooter.js.map +1 -1
  329. package/dist/esm/components/modal/CModalHeader.js.map +1 -1
  330. package/dist/esm/components/modal/CModalTitle.js.map +1 -1
  331. package/dist/esm/components/multi-select/CMultiSelect.d.ts +26 -3
  332. package/dist/esm/components/multi-select/CMultiSelect.js +104 -88
  333. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  334. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  335. package/dist/esm/components/multi-select/CMultiSelectOptions.d.ts +1 -1
  336. package/dist/esm/components/multi-select/CMultiSelectOptions.js +5 -5
  337. package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
  338. package/dist/esm/components/multi-select/CMultiSelectSelection.d.ts +2 -2
  339. package/dist/esm/components/multi-select/CMultiSelectSelection.js +8 -1
  340. package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
  341. package/dist/esm/components/multi-select/types.d.ts +4 -0
  342. package/dist/esm/components/multi-select/utils.d.ts +5 -2
  343. package/dist/esm/components/multi-select/utils.js +16 -2
  344. package/dist/esm/components/multi-select/utils.js.map +1 -1
  345. package/dist/esm/components/nav/CNav.js.map +1 -1
  346. package/dist/esm/components/nav/CNavGroup.js +1 -1
  347. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  348. package/dist/esm/components/nav/CNavGroupItems.js.map +1 -1
  349. package/dist/esm/components/nav/CNavItem.js.map +1 -1
  350. package/dist/esm/components/nav/CNavLink.js +1 -1
  351. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  352. package/dist/esm/components/nav/CNavTitle.js.map +1 -1
  353. package/dist/esm/components/navbar/CNavbar.js.map +1 -1
  354. package/dist/esm/components/navbar/CNavbarBrand.js.map +1 -1
  355. package/dist/esm/components/navbar/CNavbarNav.js.map +1 -1
  356. package/dist/esm/components/navbar/CNavbarText.js.map +1 -1
  357. package/dist/esm/components/navbar/CNavbarToggler.js.map +1 -1
  358. package/dist/esm/components/offcanvas/COffcanvas.js +1 -1
  359. package/dist/esm/components/offcanvas/COffcanvas.js.map +1 -1
  360. package/dist/esm/components/offcanvas/COffcanvasBody.js.map +1 -1
  361. package/dist/esm/components/offcanvas/COffcanvasHeader.js.map +1 -1
  362. package/dist/esm/components/offcanvas/COffcanvasTitle.js.map +1 -1
  363. package/dist/esm/components/pagination/CPagination.js.map +1 -1
  364. package/dist/esm/components/pagination/CPaginationItem.js.map +1 -1
  365. package/dist/esm/components/picker/CPicker.js +2 -1
  366. package/dist/esm/components/picker/CPicker.js.map +1 -1
  367. package/dist/esm/components/placeholder/CPlaceholder.js.map +1 -1
  368. package/dist/esm/components/popover/CPopover.js +50 -45
  369. package/dist/esm/components/popover/CPopover.js.map +1 -1
  370. package/dist/esm/components/progress/CProgress.js.map +1 -1
  371. package/dist/esm/components/progress/CProgressBar.js.map +1 -1
  372. package/dist/esm/components/progress/CProgressStacked.js.map +1 -1
  373. package/dist/esm/components/rating/CRating.js.map +1 -1
  374. package/dist/esm/components/sidebar/CSidebar.js +1 -1
  375. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  376. package/dist/esm/components/sidebar/CSidebarBrand.js.map +1 -1
  377. package/dist/esm/components/sidebar/CSidebarFooter.js.map +1 -1
  378. package/dist/esm/components/sidebar/CSidebarHeader.js.map +1 -1
  379. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  380. package/dist/esm/components/sidebar/CSidebarToggler.js.map +1 -1
  381. package/dist/esm/components/smart-pagination/CSmartPagination.js.map +1 -1
  382. package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
  383. package/dist/esm/components/smart-table/CSmartTableBody.js.map +1 -1
  384. package/dist/esm/components/smart-table/CSmartTableHead.js.map +1 -1
  385. package/dist/esm/components/smart-table/utils.js.map +1 -1
  386. package/dist/esm/components/spinner/CSpinner.js.map +1 -1
  387. package/dist/esm/components/table/CTable.js.map +1 -1
  388. package/dist/esm/components/table/CTableBody.js.map +1 -1
  389. package/dist/esm/components/table/CTableCaption.js.map +1 -1
  390. package/dist/esm/components/table/CTableDataCell.js.map +1 -1
  391. package/dist/esm/components/table/CTableFoot.js.map +1 -1
  392. package/dist/esm/components/table/CTableHead.js.map +1 -1
  393. package/dist/esm/components/table/CTableHeaderCell.js.map +1 -1
  394. package/dist/esm/components/table/CTableResponsiveWrapper.js.map +1 -1
  395. package/dist/esm/components/table/CTableRow.js.map +1 -1
  396. package/dist/esm/components/table/utils.js.map +1 -1
  397. package/dist/esm/components/tabs/CTab.js.map +1 -1
  398. package/dist/esm/components/tabs/CTabContent.js.map +1 -1
  399. package/dist/esm/components/tabs/CTabList.js +1 -1
  400. package/dist/esm/components/tabs/CTabList.js.map +1 -1
  401. package/dist/esm/components/tabs/CTabPane.js +1 -1
  402. package/dist/esm/components/tabs/CTabPane.js.map +1 -1
  403. package/dist/esm/components/tabs/CTabPanel.js +1 -1
  404. package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
  405. package/dist/esm/components/tabs/CTabs.js.map +1 -1
  406. package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
  407. package/dist/esm/components/time-picker/CTimePickerRollCol.js +2 -1
  408. package/dist/esm/components/time-picker/CTimePickerRollCol.js.map +1 -1
  409. package/dist/esm/components/time-picker/utils.js.map +1 -1
  410. package/dist/esm/components/toast/CToast.js +1 -1
  411. package/dist/esm/components/toast/CToast.js.map +1 -1
  412. package/dist/esm/components/toast/CToastBody.js.map +1 -1
  413. package/dist/esm/components/toast/CToastClose.js.map +1 -1
  414. package/dist/esm/components/toast/CToastHeader.js.map +1 -1
  415. package/dist/esm/components/toast/CToaster.js.map +1 -1
  416. package/dist/esm/components/tooltip/CTooltip.js +50 -45
  417. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  418. package/dist/esm/components/virtual-scroller/CVirtualScroller.js +6 -6
  419. package/dist/esm/components/virtual-scroller/CVirtualScroller.js.map +1 -1
  420. package/dist/esm/components/widgets/CWidgetStatsA.js.map +1 -1
  421. package/dist/esm/components/widgets/CWidgetStatsB.js.map +1 -1
  422. package/dist/esm/components/widgets/CWidgetStatsC.js.map +1 -1
  423. package/dist/esm/components/widgets/CWidgetStatsD.js.map +1 -1
  424. package/dist/esm/components/widgets/CWidgetStatsE.js.map +1 -1
  425. package/dist/esm/components/widgets/CWidgetStatsF.js.map +1 -1
  426. package/dist/esm/hooks/index.d.ts +2 -1
  427. package/dist/esm/hooks/useColorModes.js.map +1 -1
  428. package/dist/esm/hooks/useDebounce.js.map +1 -1
  429. package/dist/esm/hooks/useDebouncedCallback.js.map +1 -1
  430. package/dist/esm/hooks/useDropdownWithPopper.d.ts +10 -0
  431. package/dist/esm/hooks/useDropdownWithPopper.js +96 -0
  432. package/dist/esm/hooks/useDropdownWithPopper.js.map +1 -0
  433. package/dist/esm/hooks/useForkedRef.js.map +1 -1
  434. package/dist/esm/hooks/useIsVisible.js.map +1 -1
  435. package/dist/esm/hooks/usePopper.js.map +1 -1
  436. package/dist/esm/hooks/useStateWithCallback.js.map +1 -1
  437. package/dist/esm/index.js +1 -0
  438. package/dist/esm/index.js.map +1 -1
  439. package/dist/esm/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -1
  440. package/dist/esm/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js.map +1 -1
  441. package/dist/esm/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -1
  442. package/dist/esm/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -1
  443. package/dist/esm/node_modules/@coreui/icons-react/dist/index.esm.js.map +1 -1
  444. package/dist/esm/node_modules/classnames/index.js.map +1 -1
  445. package/dist/esm/node_modules/dom-helpers/esm/addClass.js.map +1 -1
  446. package/dist/esm/node_modules/dom-helpers/esm/hasClass.js.map +1 -1
  447. package/dist/esm/node_modules/dom-helpers/esm/removeClass.js.map +1 -1
  448. package/dist/esm/node_modules/react-device-detect/dist/lib.js.map +1 -1
  449. package/dist/esm/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
  450. package/dist/esm/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  451. package/dist/esm/node_modules/react-transition-group/esm/config.js.map +1 -1
  452. package/dist/esm/node_modules/react-transition-group/esm/utils/PropTypes.js.map +1 -1
  453. package/dist/esm/node_modules/react-transition-group/esm/utils/reflow.js.map +1 -1
  454. package/dist/esm/packages/coreui-react-pro/node_modules/tslib/tslib.es6.js.map +1 -1
  455. package/dist/esm/props.js.map +1 -1
  456. package/dist/esm/utils/executeAfterTransition.js.map +1 -1
  457. package/dist/esm/utils/getNextActiveElement.js +1 -1
  458. package/dist/esm/utils/getNextActiveElement.js.map +1 -1
  459. package/dist/esm/utils/getRTLPlacement.js.map +1 -1
  460. package/dist/esm/utils/getTransitionDurationFromElement.js.map +1 -1
  461. package/dist/esm/utils/isInViewport.js.map +1 -1
  462. package/dist/esm/utils/isObjectInArray.js.map +1 -1
  463. package/dist/esm/utils/isRTL.js.map +1 -1
  464. package/package.json +11 -11
  465. package/src/components/calendar/utils.ts +6 -0
  466. package/src/components/list-group/CListGroup.tsx +2 -1
  467. package/src/components/multi-select/CMultiSelect.tsx +200 -116
  468. package/src/components/multi-select/CMultiSelectOptions.tsx +8 -5
  469. package/src/components/multi-select/CMultiSelectSelection.tsx +10 -3
  470. package/src/components/multi-select/types.ts +9 -0
  471. package/src/components/multi-select/utils.ts +26 -1
  472. package/src/components/nav/CNavGroup.tsx +1 -1
  473. package/src/components/popover/CPopover.tsx +65 -46
  474. package/src/components/tooltip/CTooltip.tsx +65 -46
  475. package/src/components/virtual-scroller/CVirtualScroller.tsx +3 -2
  476. package/src/hooks/index.ts +2 -0
  477. package/src/hooks/useDropdownWithPopper.ts +123 -0
@@ -1,5 +1,4 @@
1
1
  import React, {
2
- FormEvent,
3
2
  forwardRef,
4
3
  HTMLAttributes,
5
4
  ReactNode,
@@ -12,18 +11,25 @@ import React, {
12
11
  import classNames from 'classnames'
13
12
  import PropTypes from 'prop-types'
14
13
 
15
- import type { Placement } from '@popperjs/core'
16
-
17
14
  import { CFormControlWrapper, CFormControlWrapperProps } from '../form/CFormControlWrapper'
18
15
 
16
+ import { CConditionalPortal } from '../conditional-portal'
19
17
  import { CMultiSelectNativeSelect } from './CMultiSelectNativeSelect'
20
18
  import { CMultiSelectOptions } from './CMultiSelectOptions'
21
19
  import { CMultiSelectSelection } from './CMultiSelectSelection'
22
20
 
23
- import { useForkedRef, usePopper } from '../../hooks'
24
- import { isRTL } from '../../utils'
25
- import { createOption, filterOptionsList, flattenOptionsArray, selectOptions } from './utils'
26
- import type { Option, OptionsGroup, SelectedOption } from './types'
21
+ import { useDropdownWithPopper } from '../../hooks'
22
+ import { getNextActiveElement } from '../../utils'
23
+ import {
24
+ createOption,
25
+ filterOptionsList,
26
+ flattenOptionsArray,
27
+ getOptionsList,
28
+ isExternalSearch,
29
+ isGlobalSearch,
30
+ selectOptions,
31
+ } from './utils'
32
+ import type { Option, OptionsGroup, Search, SelectedOption } from './types'
27
33
 
28
34
  export interface CMultiSelectProps
29
35
  extends Omit<CFormControlWrapperProps, 'floatingClassName' | 'floatingLabel'>,
@@ -34,6 +40,12 @@ export interface CMultiSelectProps
34
40
  * @since 4.11.0
35
41
  */
36
42
  allowCreateOptions?: boolean
43
+ /**
44
+ * A string that provides an accessible label for the cleaner button. This label is read by screen readers to describe the action associated with the button.
45
+ *
46
+ * @since 5.8.0
47
+ */
48
+ ariaCleanerLabel?: string
37
49
  /**
38
50
  * A string of all className you want applied to the base component.
39
51
  */
@@ -48,6 +60,12 @@ export interface CMultiSelectProps
48
60
  * @since 4.11.0
49
61
  */
50
62
  clearSearchOnSelect?: boolean
63
+ /**
64
+ * Appends the dropdown to a specific element. You can pass an HTML element or function that returns a single element.
65
+ *
66
+ * @since 5.8.0
67
+ */
68
+ container?: DocumentFragment | Element | (() => DocumentFragment | Element | null) | null
51
69
  /**
52
70
  * Toggle the disabled state for the component.
53
71
  */
@@ -121,6 +139,12 @@ export interface CMultiSelectProps
121
139
  * Specifies a short hint that is visible in the search input.
122
140
  */
123
141
  placeholder?: string
142
+ /**
143
+ * Generates dropdown menu using createPortal.
144
+ *
145
+ * @since 5.8.0
146
+ */
147
+ portal?: boolean
124
148
  /**
125
149
  * When it is present, it indicates that the user must choose a value before submitting the form.
126
150
  */
@@ -132,9 +156,14 @@ export interface CMultiSelectProps
132
156
  */
133
157
  resetSelectionOnOptionsChange?: boolean
134
158
  /**
135
- * Enables search input element.
159
+ * The `search` prop determines how the search input element is enabled and behaves. It accepts multiple types to provide flexibility in configuring search behavior:
160
+ *
161
+ * - `true` : Enables the default search input element with standard behavior.
162
+ * - `'external'`: Enables an external search mechanism, possibly integrating with external APIs or services.
163
+ * - `'global'`: When set, the user can perform searches across the entire component, regardless of where their focus is within the component.
164
+ * - `{ external?: boolean; global?: boolean }`: Allows for granular control over the search behavior by specifying individual properties. It is useful when you also want to use external and global search.
136
165
  */
137
- search?: boolean | 'external'
166
+ search?: Search
138
167
  /**
139
168
  * Sets the label for no results when filtering.
140
169
  */
@@ -181,9 +210,11 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
181
210
  (
182
211
  {
183
212
  allowCreateOptions,
213
+ ariaCleanerLabel = 'Clear all selections',
184
214
  className,
185
215
  cleaner = true,
186
216
  clearSearchOnSelect,
217
+ container,
187
218
  disabled,
188
219
  feedback,
189
220
  feedbackInvalid,
@@ -204,6 +235,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
204
235
  optionsTemplate,
205
236
  optionsGroupsTemplate,
206
237
  placeholder = 'Select...',
238
+ portal = false,
207
239
  required,
208
240
  resetSelectionOnOptionsChange = false,
209
241
  search = true,
@@ -223,35 +255,39 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
223
255
  },
224
256
  ref,
225
257
  ) => {
226
- const multiSelectRef = useRef<HTMLDivElement>(null)
227
- const multiSelectForkedRef = useForkedRef(ref, multiSelectRef)
228
-
229
- const dropdownRef = useRef<HTMLDivElement>(null)
258
+ const {
259
+ dropdownMenuElement,
260
+ dropdownRefElement,
261
+ isOpen,
262
+ closeDropdown,
263
+ openDropdown,
264
+ toggleDropdown,
265
+ updatePopper,
266
+ } = useDropdownWithPopper()
230
267
  const nativeSelectRef = useRef<HTMLSelectElement>(null)
231
- const togglerRef = useRef<HTMLDivElement>(null)
232
268
  const searchRef = useRef<HTMLInputElement>(null)
233
269
  const isInitialMount = useRef(true)
234
270
 
235
- const { popper, initPopper, destroyPopper } = usePopper()
236
-
237
- const [_options, setOptions] = useState<(Option | OptionsGroup)[]>(options)
238
- const [_visible, setVisible] = useState(visible)
239
271
  const [searchValue, setSearchValue] = useState('')
240
272
  const [selected, setSelected] = useState<SelectedOption[]>([])
241
273
  const [userOptions, setUserOptions] = useState<Option[]>([])
242
274
 
275
+ useEffect(() => {
276
+ console.log(selected)
277
+ }, [selected])
278
+
243
279
  const filteredOptions = useMemo(
244
280
  () =>
245
281
  flattenOptionsArray(
246
- search === 'external'
247
- ? [..._options, ...filterOptionsList(searchValue, userOptions)]
248
- : filterOptionsList(searchValue, [..._options, ...userOptions]),
282
+ isExternalSearch(search)
283
+ ? [...options, ...filterOptionsList(searchValue, userOptions)]
284
+ : filterOptionsList(searchValue, [...options, ...userOptions]),
249
285
  true,
250
286
  ),
251
- [_options, searchValue, userOptions],
287
+ [options, searchValue, userOptions],
252
288
  )
253
289
 
254
- const flattenedOptions = useMemo(() => flattenOptionsArray(options), [JSON.stringify(options)])
290
+ const flattenedOptions = useMemo(() => flattenOptionsArray(options), [options])
255
291
 
256
292
  const userOption = useMemo(() => {
257
293
  if (
@@ -266,27 +302,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
266
302
  return searchRef.current && createOption(String(searchValue), flattenedOptions)
267
303
  }, [filteredOptions, searchValue])
268
304
 
269
- const popperConfig = {
270
- placement: (isRTL(multiSelectRef.current) ? 'bottom-end' : 'bottom-start') as Placement,
271
- modifiers: [
272
- {
273
- name: 'preventOverflow',
274
- options: {
275
- boundary: 'clippingParents',
276
- },
277
- },
278
- {
279
- name: 'offset',
280
- options: {
281
- offset: [0, 2],
282
- },
283
- },
284
- ],
285
- }
286
-
287
305
  useEffect(() => {
288
- setOptions(options)
289
-
290
306
  if (resetSelectionOnOptionsChange) {
291
307
  return setSelected([])
292
308
  }
@@ -296,8 +312,10 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
296
312
  (option: Option) => option.selected === false,
297
313
  ) as Option[]
298
314
 
299
- _selected && setSelected(selectOptions(_selected, selected, deselected))
300
- }, [JSON.stringify(options)])
315
+ if (_selected.length > 0) {
316
+ setSelected(selectOptions(multiple, _selected, selected, deselected))
317
+ }
318
+ }, [flattenedOptions])
301
319
 
302
320
  useEffect(() => {
303
321
  !isInitialMount.current && onFilterChange && onFilterChange(searchValue)
@@ -308,63 +326,67 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
308
326
  nativeSelectRef.current.dispatchEvent(new Event('change', { bubbles: true }))
309
327
  }
310
328
 
311
- if (popper) {
312
- popper.update()
313
- }
329
+ updatePopper()
314
330
  }, [JSON.stringify(selected)])
315
331
 
316
332
  useEffect(() => {
317
- if (_visible) {
318
- onShow && onShow()
333
+ visible ? openDropdown() : closeDropdown()
334
+ }, [visible])
319
335
 
320
- window.addEventListener('mouseup', handleMouseUp)
321
- window.addEventListener('keyup', handleKeyUp)
336
+ useEffect(() => {
337
+ if (isOpen) {
338
+ if (onShow) onShow()
339
+
340
+ if (portal && dropdownMenuElement.current && dropdownRefElement.current) {
341
+ dropdownMenuElement.current.style.minWidth = `${(dropdownRefElement.current as HTMLElement).offsetWidth}px`
342
+ }
322
343
 
323
- togglerRef.current &&
324
- dropdownRef.current &&
325
- initPopper(togglerRef.current, dropdownRef.current, popperConfig)
326
- searchRef.current && searchRef.current.focus()
344
+ searchRef.current?.focus()
327
345
  }
328
346
 
329
347
  return () => {
330
- onHide && onHide()
348
+ if (onHide) onHide()
331
349
 
332
350
  setSearchValue('')
333
351
  if (searchRef.current) {
334
352
  searchRef.current.value = ''
335
353
  }
336
-
337
- window.removeEventListener('mouseup', handleMouseUp)
338
- window.removeEventListener('keyup', handleKeyUp)
339
-
340
- destroyPopper()
341
354
  }
342
- }, [_visible])
355
+ }, [isOpen])
343
356
 
344
357
  useEffect(() => {
345
358
  isInitialMount.current = false
346
359
  }, [])
347
360
 
348
- const handleKeyUp = (event: KeyboardEvent) => {
349
- if (event.key === 'Escape') {
350
- setVisible(false)
351
- }
361
+ const handleSearchChange = (event: React.ChangeEvent<HTMLInputElement>) => {
362
+ setSearchValue(event.target.value)
352
363
  }
353
364
 
354
- const handleMouseUp = (event: Event) => {
355
- if (multiSelectRef.current && multiSelectRef.current.contains(event.target as HTMLElement)) {
356
- return
365
+ const handleSearchKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
366
+ if (!isOpen) {
367
+ openDropdown()
357
368
  }
358
369
 
359
- setVisible(false)
360
- }
370
+ if (
371
+ event.key === 'ArrowDown' &&
372
+ dropdownMenuElement.current &&
373
+ searchRef.current &&
374
+ searchRef.current.value.length === searchRef.current.selectionStart
375
+ ) {
376
+ event.preventDefault()
361
377
 
362
- const handleSearchChange = (event: FormEvent<HTMLInputElement>) => {
363
- const value = (event.target as HTMLInputElement).value
364
- setSearchValue(value)
365
- }
378
+ const items = getOptionsList(dropdownMenuElement.current)
379
+ const target = event.target as HTMLDivElement
380
+
381
+ getNextActiveElement(
382
+ items,
383
+ target,
384
+ event.key === 'ArrowDown',
385
+ !items.includes(target),
386
+ ).focus()
387
+ return
388
+ }
366
389
 
367
- const handleSearchKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
368
390
  if (event.key === 'Enter' && searchValue && allowCreateOptions) {
369
391
  event.preventDefault()
370
392
 
@@ -396,14 +418,48 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
396
418
 
397
419
  if (event.key === 'Backspace' || event.key === 'Delete') {
398
420
  const last = selected.filter((option: Option) => !option.disabled).pop()
399
- last && setSelected(selected.filter((option: Option) => option.value !== last.value))
421
+
422
+ if (last) {
423
+ setSelected(selected.filter((option: Option) => option.value !== last.value))
424
+ }
425
+ }
426
+ }
427
+
428
+ const handleTogglerKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
429
+ if (!isOpen && (event.key === 'Enter' || event.key === 'ArrowDown')) {
430
+ event.preventDefault()
431
+ openDropdown()
432
+ return
433
+ }
434
+
435
+ if (isOpen && dropdownMenuElement.current && event.key === 'ArrowDown') {
436
+ event.preventDefault()
437
+ const items = getOptionsList(dropdownMenuElement.current)
438
+ const target = event.target as HTMLDivElement
439
+
440
+ getNextActiveElement(
441
+ items,
442
+ target,
443
+ event.key === 'ArrowDown',
444
+ !items.includes(target),
445
+ ).focus()
400
446
  }
401
447
  }
402
448
 
403
- const handleOptionOnClick = (option: Option) => {
449
+ const handleGlobalSearch = (event: React.KeyboardEvent<HTMLDivElement>) => {
450
+ if (
451
+ isGlobalSearch(search) &&
452
+ searchRef.current &&
453
+ (event.key.length === 1 || event.key === 'Backspace' || event.key === 'Delete')
454
+ ) {
455
+ searchRef.current.focus()
456
+ }
457
+ }
458
+
459
+ const handleOnOptionClick = (option: Option) => {
404
460
  if (!multiple) {
405
461
  setSelected([option] as SelectedOption[])
406
- setVisible(false)
462
+ closeDropdown()
407
463
  setSearchValue('')
408
464
  if (searchRef.current) {
409
465
  searchRef.current.value = ''
@@ -434,6 +490,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
434
490
  const handleSelectAll = () => {
435
491
  setSelected(
436
492
  selectOptions(
493
+ multiple,
437
494
  [...flattenedOptions.filter((option: Option) => !option.disabled), ...userOptions],
438
495
  selected,
439
496
  ),
@@ -479,22 +536,25 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
479
536
  disabled,
480
537
  'is-invalid': invalid,
481
538
  'is-valid': valid,
482
- show: _visible,
539
+ show: isOpen,
483
540
  },
484
541
  className,
485
542
  )}
486
- aria-expanded={_visible}
487
- ref={multiSelectForkedRef}
543
+ onKeyDown={handleGlobalSearch}
544
+ aria-expanded={isOpen}
545
+ ref={ref}
488
546
  >
489
547
  <div
490
548
  className="form-multi-select-input-group"
491
- onClick={() => !disabled && setVisible(true)}
492
- ref={togglerRef}
549
+ {...(!search && !disabled && { tabIndex: 0 })}
550
+ onClick={() => !disabled && openDropdown()}
551
+ onKeyDown={handleTogglerKeyDown}
552
+ ref={dropdownRefElement}
493
553
  >
494
554
  <CMultiSelectSelection
495
555
  disabled={disabled}
496
556
  multiple={multiple}
497
- onRemove={(option) => !disabled && handleOptionOnClick(option)}
557
+ onRemove={(option) => !disabled && handleOnOptionClick(option)}
498
558
  placeholder={placeholder}
499
559
  search={search}
500
560
  selected={selected}
@@ -522,6 +582,9 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
522
582
  ref={searchRef}
523
583
  ></input>
524
584
  )}
585
+ {!search && selected.length === 0 && (
586
+ <span className="form-multi-select-placeholder">{placeholder}</span>
587
+ )}
525
588
  </CMultiSelectSelection>
526
589
  <div className="form-multi-select-buttons">
527
590
  {!disabled && cleaner && selected.length > 0 && (
@@ -529,6 +592,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
529
592
  type="button"
530
593
  className="form-multi-select-cleaner"
531
594
  onClick={() => handleDeselectAll()}
595
+ aria-label={ariaCleanerLabel}
532
596
  ></button>
533
597
  )}
534
598
  <button
@@ -539,41 +603,50 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
539
603
  event.stopPropagation()
540
604
 
541
605
  if (!disabled) {
542
- setVisible(!_visible)
606
+ toggleDropdown()
543
607
  }
544
608
  }}
545
609
  {...(disabled && { tabIndex: -1 })}
546
610
  ></button>
547
611
  </div>
548
612
  </div>
549
- <div className="form-multi-select-dropdown" role="menu" ref={dropdownRef}>
550
- {multiple && selectAll && (
551
- <button
552
- type="button"
553
- className="form-multi-select-all"
554
- onClick={() => handleSelectAll()}
555
- >
556
- {selectAllLabel}
557
- </button>
558
- )}
559
- <CMultiSelectOptions
560
- handleOptionOnClick={(option) => !disabled && handleOptionOnClick(option)}
561
- loading={loading}
562
- options={
563
- filteredOptions.length === 0 && allowCreateOptions
564
- ? userOption || []
565
- : filteredOptions
566
- }
567
- optionsMaxHeight={optionsMaxHeight}
568
- optionsStyle={optionsStyle}
569
- optionsTemplate={optionsTemplate}
570
- optionsGroupsTemplate={optionsGroupsTemplate}
571
- searchNoResultsLabel={searchNoResultsLabel}
572
- selected={selected}
573
- virtualScroller={virtualScroller}
574
- visibleItems={visibleItems}
575
- />
576
- </div>
613
+ <CConditionalPortal container={container} portal={portal}>
614
+ <div
615
+ className={classNames('form-multi-select-dropdown', {
616
+ show: portal && isOpen,
617
+ })}
618
+ onKeyDown={handleGlobalSearch}
619
+ role="menu"
620
+ ref={dropdownMenuElement}
621
+ >
622
+ {multiple && selectAll && (
623
+ <button
624
+ type="button"
625
+ className="form-multi-select-all"
626
+ onClick={() => handleSelectAll()}
627
+ >
628
+ {selectAllLabel}
629
+ </button>
630
+ )}
631
+ <CMultiSelectOptions
632
+ loading={loading}
633
+ onOptionOnClick={(option) => !disabled && handleOnOptionClick(option)}
634
+ options={
635
+ filteredOptions.length === 0 && allowCreateOptions
636
+ ? userOption || []
637
+ : filteredOptions
638
+ }
639
+ optionsMaxHeight={optionsMaxHeight}
640
+ optionsStyle={optionsStyle}
641
+ optionsTemplate={optionsTemplate}
642
+ optionsGroupsTemplate={optionsGroupsTemplate}
643
+ searchNoResultsLabel={searchNoResultsLabel}
644
+ selected={selected}
645
+ virtualScroller={virtualScroller}
646
+ visibleItems={visibleItems}
647
+ />
648
+ </div>
649
+ </CConditionalPortal>
577
650
  </div>
578
651
  </CFormControlWrapper>
579
652
  )
@@ -581,9 +654,12 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
581
654
  )
582
655
 
583
656
  CMultiSelect.propTypes = {
657
+ allowCreateOptions: PropTypes.bool,
658
+ ariaCleanerLabel: PropTypes.string,
584
659
  className: PropTypes.string,
585
660
  cleaner: PropTypes.bool,
586
661
  clearSearchOnSelect: PropTypes.bool,
662
+ container: PropTypes.any,
587
663
  disabled: PropTypes.bool,
588
664
  loading: PropTypes.bool,
589
665
  multiple: PropTypes.bool,
@@ -598,9 +674,17 @@ CMultiSelect.propTypes = {
598
674
  optionsTemplate: PropTypes.func,
599
675
  optionsGroupsTemplate: PropTypes.func,
600
676
  placeholder: PropTypes.string,
677
+ portal: PropTypes.bool,
601
678
  required: PropTypes.bool,
602
679
  resetSelectionOnOptionsChange: PropTypes.bool,
603
- search: PropTypes.oneOfType([PropTypes.bool, PropTypes.oneOf<'external'>(['external'])]),
680
+ search: PropTypes.oneOfType([
681
+ PropTypes.bool,
682
+ PropTypes.oneOf<'external' | 'global'>(['external', 'global']),
683
+ PropTypes.shape({
684
+ external: PropTypes.bool.isRequired,
685
+ global: PropTypes.bool.isRequired,
686
+ }),
687
+ ]),
604
688
  searchNoResultsLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
605
689
  selectAll: PropTypes.bool,
606
690
  selectAllLabel: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
@@ -9,8 +9,8 @@ import { getNextSibling, getPreviousSibling } from './utils'
9
9
  import type { Option, OptionsGroup } from './types'
10
10
 
11
11
  export interface CMultiSelectOptionsProps extends HTMLAttributes<HTMLDivElement> {
12
- handleOptionOnClick?: (option: Option) => void
13
12
  loading?: boolean
13
+ onOptionOnClick?: (option: Option) => void
14
14
  options: (Option | OptionsGroup)[]
15
15
  optionsMaxHeight?: number | string
16
16
  optionsStyle?: 'checkbox' | 'text'
@@ -25,8 +25,9 @@ export interface CMultiSelectOptionsProps extends HTMLAttributes<HTMLDivElement>
25
25
  export const CMultiSelectOptions = forwardRef<HTMLDivElement, CMultiSelectOptionsProps>(
26
26
  (
27
27
  {
28
- handleOptionOnClick,
29
28
  loading,
29
+ onKeyDown,
30
+ onOptionOnClick,
30
31
  options,
31
32
  optionsMaxHeight,
32
33
  optionsStyle,
@@ -42,7 +43,7 @@ export const CMultiSelectOptions = forwardRef<HTMLDivElement, CMultiSelectOption
42
43
  const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>, option: Option) => {
43
44
  if (event.code === 'Space' || event.key === 'Enter') {
44
45
  event.preventDefault()
45
- handleOptionOnClick && handleOptionOnClick(option)
46
+ onOptionOnClick && onOptionOnClick(option)
46
47
  }
47
48
 
48
49
  if (event.key === 'Down' || event.key === 'ArrowDown') {
@@ -73,7 +74,7 @@ export const CMultiSelectOptions = forwardRef<HTMLDivElement, CMultiSelectOption
73
74
  disabled: option.disabled,
74
75
  })}
75
76
  key={index}
76
- onClick={() => handleOptionOnClick && handleOptionOnClick(option as Option)}
77
+ onClick={() => onOptionOnClick && onOptionOnClick(option as Option)}
77
78
  onKeyDown={(event) => handleKeyDown(event, option as Option)}
78
79
  tabIndex={0}
79
80
  >
@@ -94,6 +95,7 @@ export const CMultiSelectOptions = forwardRef<HTMLDivElement, CMultiSelectOption
94
95
  {virtualScroller ? (
95
96
  <CVirtualScroller
96
97
  className="form-multi-select-options"
98
+ onKeyDown={onKeyDown}
97
99
  visibleItems={visibleItems}
98
100
  ref={ref}
99
101
  >
@@ -102,6 +104,7 @@ export const CMultiSelectOptions = forwardRef<HTMLDivElement, CMultiSelectOption
102
104
  ) : (
103
105
  <div
104
106
  className="form-multi-select-options"
107
+ onKeyDown={onKeyDown}
105
108
  {...(optionsMaxHeight !== 'auto' && {
106
109
  style: { maxHeight: optionsMaxHeight, overflow: 'scroll' },
107
110
  })}
@@ -117,8 +120,8 @@ export const CMultiSelectOptions = forwardRef<HTMLDivElement, CMultiSelectOption
117
120
  )
118
121
 
119
122
  CMultiSelectOptions.propTypes = {
120
- handleOptionOnClick: PropTypes.func,
121
123
  loading: PropTypes.bool,
124
+ onOptionOnClick: PropTypes.func,
122
125
  options: PropTypes.array.isRequired,
123
126
  optionsMaxHeight: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
124
127
  optionsStyle: PropTypes.oneOf(['checkbox', 'text']),
@@ -3,14 +3,14 @@ import React, { forwardRef, HTMLAttributes } from 'react'
3
3
  import classNames from 'classnames'
4
4
  import PropTypes from 'prop-types'
5
5
 
6
- import type { SelectedOption } from './types'
6
+ import type { Search, SelectedOption } from './types'
7
7
 
8
8
  export interface CMultiSelectSelectionProps extends HTMLAttributes<HTMLSpanElement> {
9
9
  disabled?: boolean
10
10
  multiple?: boolean
11
11
  onRemove?: (option: SelectedOption) => void
12
12
  placeholder?: string
13
- search?: boolean | 'external'
13
+ search?: Search
14
14
  selected?: SelectedOption[]
15
15
  selectionType?: 'counter' | 'tags' | 'text'
16
16
  selectionTypeCounterText?: string
@@ -85,7 +85,14 @@ CMultiSelectSelection.propTypes = {
85
85
  multiple: PropTypes.bool,
86
86
  onRemove: PropTypes.func,
87
87
  placeholder: PropTypes.string,
88
- search: PropTypes.oneOfType([PropTypes.bool, PropTypes.oneOf<'external'>(['external'])]),
88
+ search: PropTypes.oneOfType([
89
+ PropTypes.bool,
90
+ PropTypes.oneOf<'external' | 'global'>(['external', 'global']),
91
+ PropTypes.shape({
92
+ external: PropTypes.bool.isRequired,
93
+ global: PropTypes.bool.isRequired,
94
+ }),
95
+ ]),
89
96
  selected: PropTypes.array,
90
97
  selectionType: PropTypes.oneOf(['counter', 'tags', 'text']),
91
98
  selectionTypeCounterText: PropTypes.string,
@@ -13,6 +13,15 @@ export type OptionsGroup = {
13
13
  [key: string]: number | string | any
14
14
  }
15
15
 
16
+ export type Search =
17
+ | boolean
18
+ | 'external'
19
+ | 'global'
20
+ | {
21
+ external?: boolean
22
+ global?: boolean
23
+ }
24
+
16
25
  export type SelectedOption = {
17
26
  disabled?: boolean
18
27
  label: string