@coreui/react-pro 5.12.0 → 5.13.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 (245) 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/CAccordionItem.js.map +1 -1
  4. package/dist/cjs/components/alert/CAlert.js.map +1 -1
  5. package/dist/cjs/components/alert/CAlertHeading.js.map +1 -1
  6. package/dist/cjs/components/backdrop/CBackdrop.js.map +1 -1
  7. package/dist/cjs/components/badge/CBadge.js.map +1 -1
  8. package/dist/cjs/components/button/CButton.js.map +1 -1
  9. package/dist/cjs/components/calendar/CCalendar.js +53 -38
  10. package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
  11. package/dist/cjs/components/calendar/CCalendarNavigation.js.map +1 -1
  12. package/dist/cjs/components/calendar/CCalendarPanel.js.map +1 -1
  13. package/dist/cjs/components/calendar/utils.d.ts +8 -0
  14. package/dist/cjs/components/calendar/utils.js +16 -0
  15. package/dist/cjs/components/calendar/utils.js.map +1 -1
  16. package/dist/cjs/components/card/CCardHeader.js.map +1 -1
  17. package/dist/cjs/components/card/CCardSubtitle.js.map +1 -1
  18. package/dist/cjs/components/card/CCardText.js.map +1 -1
  19. package/dist/cjs/components/card/CCardTitle.js.map +1 -1
  20. package/dist/cjs/components/carousel/CCarousel.js.map +1 -1
  21. package/dist/cjs/components/carousel/CCarouselItem.js.map +1 -1
  22. package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
  23. package/dist/cjs/components/date-range-picker/CDateRangePicker.js +53 -33
  24. package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
  25. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  26. package/dist/cjs/components/dropdown/CDropdownHeader.js.map +1 -1
  27. package/dist/cjs/components/dropdown/CDropdownItem.js.map +1 -1
  28. package/dist/cjs/components/dropdown/CDropdownItemPlain.js.map +1 -1
  29. package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
  30. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  31. package/dist/cjs/components/form/CFormCheck.js.map +1 -1
  32. package/dist/cjs/components/form/CFormFeedback.js.map +1 -1
  33. package/dist/cjs/components/form/CFormInput.js.map +1 -1
  34. package/dist/cjs/components/form/CFormLabel.js.map +1 -1
  35. package/dist/cjs/components/form/CFormText.js.map +1 -1
  36. package/dist/cjs/components/form/CInputGroupText.js.map +1 -1
  37. package/dist/cjs/components/header/CHeaderBrand.js.map +1 -1
  38. package/dist/cjs/components/header/CHeaderNav.js.map +1 -1
  39. package/dist/cjs/components/header/CHeaderToggler.js.map +1 -1
  40. package/dist/cjs/components/index.d.ts +1 -0
  41. package/dist/cjs/components/link/CLink.js.map +1 -1
  42. package/dist/cjs/components/list-group/CListGroup.js.map +1 -1
  43. package/dist/cjs/components/list-group/CListGroupItem.js.map +1 -1
  44. package/dist/cjs/components/loading-button/CLoadingButton.js.map +1 -1
  45. package/dist/cjs/components/modal/CModal.js.map +1 -1
  46. package/dist/cjs/components/modal/CModalHeader.js.map +1 -1
  47. package/dist/cjs/components/modal/CModalTitle.js.map +1 -1
  48. package/dist/cjs/components/multi-select/CMultiSelect.d.ts +6 -0
  49. package/dist/cjs/components/multi-select/CMultiSelect.js +21 -4
  50. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  51. package/dist/cjs/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  52. package/dist/cjs/components/multi-select/CMultiSelectOptions.js.map +1 -1
  53. package/dist/cjs/components/multi-select/CMultiSelectSelection.js.map +1 -1
  54. package/dist/cjs/components/nav/CNav.js.map +1 -1
  55. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  56. package/dist/cjs/components/nav/CNavGroupItems.js.map +1 -1
  57. package/dist/cjs/components/nav/CNavItem.js.map +1 -1
  58. package/dist/cjs/components/nav/CNavLink.js.map +1 -1
  59. package/dist/cjs/components/nav/CNavTitle.js.map +1 -1
  60. package/dist/cjs/components/navbar/CNavbar.js.map +1 -1
  61. package/dist/cjs/components/navbar/CNavbarBrand.js.map +1 -1
  62. package/dist/cjs/components/navbar/CNavbarNav.js.map +1 -1
  63. package/dist/cjs/components/navbar/CNavbarToggler.js.map +1 -1
  64. package/dist/cjs/components/offcanvas/COffcanvas.js.map +1 -1
  65. package/dist/cjs/components/offcanvas/COffcanvasTitle.js.map +1 -1
  66. package/dist/cjs/components/pagination/CPaginationItem.js.map +1 -1
  67. package/dist/cjs/components/password-input/CPasswordInput.d.ts +43 -0
  68. package/dist/cjs/components/password-input/CPasswordInput.js +35 -0
  69. package/dist/cjs/components/password-input/CPasswordInput.js.map +1 -0
  70. package/dist/cjs/components/password-input/index.d.ts +2 -0
  71. package/dist/cjs/components/picker/CPicker.js.map +1 -1
  72. package/dist/cjs/components/placeholder/CPlaceholder.js.map +1 -1
  73. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  74. package/dist/cjs/components/progress/CProgressBar.js.map +1 -1
  75. package/dist/cjs/components/range-slider/CRangeSlider.js.map +1 -1
  76. package/dist/cjs/components/rating/CRating.js.map +1 -1
  77. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  78. package/dist/cjs/components/sidebar/CSidebarBrand.js.map +1 -1
  79. package/dist/cjs/components/sidebar/CSidebarNav.js.map +1 -1
  80. package/dist/cjs/components/smart-pagination/CSmartPagination.js.map +1 -1
  81. package/dist/cjs/components/smart-table/CSmartTable.js.map +1 -1
  82. package/dist/cjs/components/smart-table/CSmartTableBody.js.map +1 -1
  83. package/dist/cjs/components/smart-table/CSmartTableHead.js.map +1 -1
  84. package/dist/cjs/components/smart-table/utils.js.map +1 -1
  85. package/dist/cjs/components/spinner/CSpinner.js.map +1 -1
  86. package/dist/cjs/components/tabs/CTab.js.map +1 -1
  87. package/dist/cjs/components/tabs/CTabList.js.map +1 -1
  88. package/dist/cjs/components/tabs/CTabPane.js.map +1 -1
  89. package/dist/cjs/components/tabs/CTabPanel.js.map +1 -1
  90. package/dist/cjs/components/time-picker/CTimePicker.js +13 -7
  91. package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
  92. package/dist/cjs/components/time-picker/CTimePickerRollCol.js.map +1 -1
  93. package/dist/cjs/components/time-picker/utils.d.ts +10 -0
  94. package/dist/cjs/components/time-picker/utils.js +25 -9
  95. package/dist/cjs/components/time-picker/utils.js.map +1 -1
  96. package/dist/cjs/components/toast/CToast.js.map +1 -1
  97. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  98. package/dist/cjs/components/widgets/CWidgetStatsF.js.map +1 -1
  99. package/dist/cjs/hooks/useClipboard.js.map +1 -1
  100. package/dist/cjs/hooks/useColorModes.js.map +1 -1
  101. package/dist/cjs/hooks/useDebouncedCallback.js.map +1 -1
  102. package/dist/cjs/index.js +2 -0
  103. package/dist/cjs/index.js.map +1 -1
  104. package/dist/cjs/node_modules/@coreui/icons-react/dist/index.esm.js.map +1 -1
  105. package/dist/cjs/node_modules/dom-helpers/esm/hasClass.js.map +1 -1
  106. package/dist/cjs/node_modules/react-device-detect/dist/lib.js +1 -1
  107. package/dist/cjs/node_modules/react-device-detect/dist/lib.js.map +1 -1
  108. package/dist/cjs/node_modules/react-transition-group/esm/CSSTransition.js +9 -9
  109. package/dist/cjs/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -1
  110. package/dist/cjs/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  111. package/dist/cjs/node_modules/tslib/tslib.es6.js.map +1 -1
  112. package/dist/cjs/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
  113. package/dist/cjs/utils/executeAfterTransition.js.map +1 -1
  114. package/dist/cjs/utils/getNextActiveElement.js.map +1 -1
  115. package/dist/cjs/utils/isObjectInArray.js.map +1 -1
  116. package/dist/esm/components/accordion/CAccordion.js.map +1 -1
  117. package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
  118. package/dist/esm/components/alert/CAlert.js.map +1 -1
  119. package/dist/esm/components/alert/CAlertHeading.js.map +1 -1
  120. package/dist/esm/components/avatar/CAvatar.js +1 -1
  121. package/dist/esm/components/backdrop/CBackdrop.js.map +1 -1
  122. package/dist/esm/components/badge/CBadge.js +1 -1
  123. package/dist/esm/components/badge/CBadge.js.map +1 -1
  124. package/dist/esm/components/button/CButton.js.map +1 -1
  125. package/dist/esm/components/calendar/CCalendar.js +54 -39
  126. package/dist/esm/components/calendar/CCalendar.js.map +1 -1
  127. package/dist/esm/components/calendar/CCalendarNavigation.js.map +1 -1
  128. package/dist/esm/components/calendar/CCalendarPanel.js.map +1 -1
  129. package/dist/esm/components/calendar/utils.d.ts +8 -0
  130. package/dist/esm/components/calendar/utils.js +16 -1
  131. package/dist/esm/components/calendar/utils.js.map +1 -1
  132. package/dist/esm/components/card/CCardHeader.js.map +1 -1
  133. package/dist/esm/components/card/CCardSubtitle.js.map +1 -1
  134. package/dist/esm/components/card/CCardText.js.map +1 -1
  135. package/dist/esm/components/card/CCardTitle.js.map +1 -1
  136. package/dist/esm/components/carousel/CCarousel.js.map +1 -1
  137. package/dist/esm/components/carousel/CCarouselItem.js.map +1 -1
  138. package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
  139. package/dist/esm/components/date-range-picker/CDateRangePicker.js +47 -27
  140. package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
  141. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  142. package/dist/esm/components/dropdown/CDropdownHeader.js.map +1 -1
  143. package/dist/esm/components/dropdown/CDropdownItem.js.map +1 -1
  144. package/dist/esm/components/dropdown/CDropdownItemPlain.js.map +1 -1
  145. package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
  146. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  147. package/dist/esm/components/form/CFormCheck.js.map +1 -1
  148. package/dist/esm/components/form/CFormFeedback.js.map +1 -1
  149. package/dist/esm/components/form/CFormInput.js.map +1 -1
  150. package/dist/esm/components/form/CFormLabel.js.map +1 -1
  151. package/dist/esm/components/form/CFormText.js.map +1 -1
  152. package/dist/esm/components/form/CInputGroupText.js.map +1 -1
  153. package/dist/esm/components/header/CHeaderBrand.js.map +1 -1
  154. package/dist/esm/components/header/CHeaderNav.js.map +1 -1
  155. package/dist/esm/components/header/CHeaderToggler.js.map +1 -1
  156. package/dist/esm/components/index.d.ts +1 -0
  157. package/dist/esm/components/link/CLink.js.map +1 -1
  158. package/dist/esm/components/list-group/CListGroup.js.map +1 -1
  159. package/dist/esm/components/list-group/CListGroupItem.js.map +1 -1
  160. package/dist/esm/components/loading-button/CLoadingButton.js.map +1 -1
  161. package/dist/esm/components/modal/CModal.js.map +1 -1
  162. package/dist/esm/components/modal/CModalHeader.js.map +1 -1
  163. package/dist/esm/components/modal/CModalTitle.js.map +1 -1
  164. package/dist/esm/components/multi-select/CMultiSelect.d.ts +6 -0
  165. package/dist/esm/components/multi-select/CMultiSelect.js +22 -5
  166. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  167. package/dist/esm/components/multi-select/CMultiSelectNativeSelect.js.map +1 -1
  168. package/dist/esm/components/multi-select/CMultiSelectOptions.js.map +1 -1
  169. package/dist/esm/components/multi-select/CMultiSelectSelection.js.map +1 -1
  170. package/dist/esm/components/nav/CNav.js.map +1 -1
  171. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  172. package/dist/esm/components/nav/CNavGroupItems.js.map +1 -1
  173. package/dist/esm/components/nav/CNavItem.js.map +1 -1
  174. package/dist/esm/components/nav/CNavLink.js.map +1 -1
  175. package/dist/esm/components/nav/CNavTitle.js.map +1 -1
  176. package/dist/esm/components/navbar/CNavbar.js.map +1 -1
  177. package/dist/esm/components/navbar/CNavbarBrand.js.map +1 -1
  178. package/dist/esm/components/navbar/CNavbarNav.js.map +1 -1
  179. package/dist/esm/components/navbar/CNavbarToggler.js.map +1 -1
  180. package/dist/esm/components/offcanvas/COffcanvas.js.map +1 -1
  181. package/dist/esm/components/offcanvas/COffcanvasTitle.js.map +1 -1
  182. package/dist/esm/components/pagination/CPaginationItem.js.map +1 -1
  183. package/dist/esm/components/password-input/CPasswordInput.d.ts +43 -0
  184. package/dist/esm/components/password-input/CPasswordInput.js +33 -0
  185. package/dist/esm/components/password-input/CPasswordInput.js.map +1 -0
  186. package/dist/esm/components/password-input/index.d.ts +2 -0
  187. package/dist/esm/components/picker/CPicker.js.map +1 -1
  188. package/dist/esm/components/placeholder/CPlaceholder.js.map +1 -1
  189. package/dist/esm/components/popover/CPopover.js +1 -1
  190. package/dist/esm/components/popover/CPopover.js.map +1 -1
  191. package/dist/esm/components/progress/CProgressBar.js.map +1 -1
  192. package/dist/esm/components/range-slider/CRangeSlider.js.map +1 -1
  193. package/dist/esm/components/rating/CRating.js.map +1 -1
  194. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  195. package/dist/esm/components/sidebar/CSidebarBrand.js.map +1 -1
  196. package/dist/esm/components/sidebar/CSidebarNav.js.map +1 -1
  197. package/dist/esm/components/smart-pagination/CSmartPagination.js.map +1 -1
  198. package/dist/esm/components/smart-table/CSmartTable.js.map +1 -1
  199. package/dist/esm/components/smart-table/CSmartTableBody.js.map +1 -1
  200. package/dist/esm/components/smart-table/CSmartTableHead.js.map +1 -1
  201. package/dist/esm/components/smart-table/utils.js +1 -1
  202. package/dist/esm/components/smart-table/utils.js.map +1 -1
  203. package/dist/esm/components/spinner/CSpinner.js.map +1 -1
  204. package/dist/esm/components/tabs/CTab.js.map +1 -1
  205. package/dist/esm/components/tabs/CTabList.js.map +1 -1
  206. package/dist/esm/components/tabs/CTabPane.js.map +1 -1
  207. package/dist/esm/components/tabs/CTabPanel.js.map +1 -1
  208. package/dist/esm/components/time-picker/CTimePicker.js +14 -8
  209. package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
  210. package/dist/esm/components/time-picker/CTimePickerRollCol.js.map +1 -1
  211. package/dist/esm/components/time-picker/utils.d.ts +10 -0
  212. package/dist/esm/components/time-picker/utils.js +25 -10
  213. package/dist/esm/components/time-picker/utils.js.map +1 -1
  214. package/dist/esm/components/toast/CToast.js.map +1 -1
  215. package/dist/esm/components/tooltip/CTooltip.js +1 -1
  216. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  217. package/dist/esm/components/widgets/CWidgetStatsF.js.map +1 -1
  218. package/dist/esm/hooks/useClipboard.js.map +1 -1
  219. package/dist/esm/hooks/useColorModes.js.map +1 -1
  220. package/dist/esm/hooks/useDebouncedCallback.js.map +1 -1
  221. package/dist/esm/index.js +1 -0
  222. package/dist/esm/index.js.map +1 -1
  223. package/dist/esm/node_modules/@coreui/icons-react/dist/index.esm.js.map +1 -1
  224. package/dist/esm/node_modules/dom-helpers/esm/hasClass.js.map +1 -1
  225. package/dist/esm/node_modules/react-device-detect/dist/lib.js +1 -1
  226. package/dist/esm/node_modules/react-device-detect/dist/lib.js.map +1 -1
  227. package/dist/esm/node_modules/react-transition-group/esm/Transition.js.map +1 -1
  228. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
  229. package/dist/esm/node_modules/ua-parser-js/dist/ua-parser.min.js.map +1 -1
  230. package/dist/esm/utils/executeAfterTransition.js.map +1 -1
  231. package/dist/esm/utils/getNextActiveElement.js.map +1 -1
  232. package/dist/esm/utils/isObjectInArray.js.map +1 -1
  233. package/package.json +9 -9
  234. package/src/components/calendar/CCalendar.tsx +74 -56
  235. package/src/components/calendar/CCalendarNavigation.tsx +2 -2
  236. package/src/components/calendar/CCalendarPanel.tsx +4 -4
  237. package/src/components/calendar/utils.ts +33 -10
  238. package/src/components/date-picker/CDatePicker.tsx +1 -1
  239. package/src/components/date-range-picker/CDateRangePicker.tsx +37 -21
  240. package/src/components/index.ts +1 -0
  241. package/src/components/multi-select/CMultiSelect.tsx +49 -14
  242. package/src/components/password-input/CPasswordInput.tsx +164 -0
  243. package/src/components/password-input/index.ts +3 -0
  244. package/src/components/time-picker/CTimePicker.tsx +19 -12
  245. package/src/components/time-picker/utils.ts +30 -14
@@ -188,6 +188,12 @@ export interface CMultiSelectProps
188
188
  * Size the component small or large.
189
189
  */
190
190
  size?: 'sm' | 'lg'
191
+ /**
192
+ * Sets the initially selected values for the multi-select component.
193
+ *
194
+ * @since 5.13.0
195
+ */
196
+ value?: string | number | (string | number)[]
191
197
  /**
192
198
  * Enable virtual scroller for the options list.
193
199
  *
@@ -248,12 +254,13 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
248
254
  text,
249
255
  tooltipFeedback,
250
256
  valid,
257
+ value,
251
258
  virtualScroller,
252
259
  visible = false,
253
260
  visibleItems = 10,
254
261
  ...rest
255
262
  },
256
- ref,
263
+ ref
257
264
  ) => {
258
265
  const {
259
266
  dropdownMenuElement,
@@ -278,18 +285,38 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
278
285
  isExternalSearch(search)
279
286
  ? [...options, ...filterOptionsList(searchValue, userOptions)]
280
287
  : filterOptionsList(searchValue, [...options, ...userOptions]),
281
- true,
288
+ true
282
289
  ),
283
- [options, searchValue, userOptions],
290
+ [options, searchValue, userOptions]
284
291
  )
285
292
 
286
- const flattenedOptions = useMemo(() => flattenOptionsArray(options), [options])
293
+ const flattenedOptions = useMemo(
294
+ () =>
295
+ flattenOptionsArray(options).map((option) => {
296
+ if (value && Array.isArray(value)) {
297
+ return {
298
+ ...option,
299
+ selected: value.includes(option.value),
300
+ }
301
+ }
302
+
303
+ if (value === option.value) {
304
+ return {
305
+ ...option,
306
+ selected: true,
307
+ }
308
+ }
309
+
310
+ return option
311
+ }),
312
+ [options, value]
313
+ )
287
314
 
288
315
  const userOption = useMemo(() => {
289
316
  if (
290
317
  allowCreateOptions &&
291
318
  filteredOptions.some(
292
- (option) => option.label && option.label.toLowerCase() === searchValue.toLowerCase(),
319
+ (option) => option.label && option.label.toLowerCase() === searchValue.toLowerCase()
293
320
  )
294
321
  ) {
295
322
  return false
@@ -305,7 +332,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
305
332
 
306
333
  const _selected = flattenedOptions.filter((option: Option) => option.selected === true)
307
334
  const deselected = flattenedOptions.filter(
308
- (option: Option) => option.selected === false,
335
+ (option: Option) => option.selected === false
309
336
  ) as Option[]
310
337
 
311
338
  if (_selected.length > 0) {
@@ -314,7 +341,9 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
314
341
  }, [flattenedOptions])
315
342
 
316
343
  useEffect(() => {
317
- !isInitialMount.current && onFilterChange && onFilterChange(searchValue)
344
+ if (!isInitialMount.current && onFilterChange) {
345
+ onFilterChange(searchValue)
346
+ }
318
347
  }, [searchValue])
319
348
 
320
349
  useEffect(() => {
@@ -378,7 +407,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
378
407
  items,
379
408
  target,
380
409
  event.key === 'ArrowDown',
381
- !items.includes(target),
410
+ !items.includes(target)
382
411
  ).focus()
383
412
  return
384
413
  }
@@ -395,7 +424,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
395
424
  setSelected([
396
425
  ...selected,
397
426
  filteredOptions.find(
398
- (option) => String(option.label).toLowerCase() === searchValue.toLowerCase(),
427
+ (option) => String(option.label).toLowerCase() === searchValue.toLowerCase()
399
428
  ) as Option,
400
429
  ])
401
430
  }
@@ -437,7 +466,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
437
466
  items,
438
467
  target,
439
468
  event.key === 'ArrowDown',
440
- !items.includes(target),
469
+ !items.includes(target)
441
470
  ).focus()
442
471
  }
443
472
  }
@@ -488,8 +517,8 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
488
517
  selectOptions(
489
518
  multiple,
490
519
  [...flattenedOptions.filter((option: Option) => !option.disabled), ...userOptions],
491
- selected,
492
- ),
520
+ selected
521
+ )
493
522
  )
494
523
  }
495
524
 
@@ -534,7 +563,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
534
563
  'is-valid': valid,
535
564
  show: isOpen,
536
565
  },
537
- className,
566
+ className
538
567
  )}
539
568
  onKeyDown={handleGlobalSearch}
540
569
  aria-expanded={isOpen}
@@ -646,7 +675,7 @@ export const CMultiSelect = forwardRef<HTMLDivElement, CMultiSelectProps>(
646
675
  </div>
647
676
  </CFormControlWrapper>
648
677
  )
649
- },
678
+ }
650
679
  )
651
680
 
652
681
  CMultiSelect.propTypes = {
@@ -687,6 +716,12 @@ CMultiSelect.propTypes = {
687
716
  selectionType: PropTypes.oneOf(['counter', 'tags', 'text']),
688
717
  selectionTypeCounterText: PropTypes.string,
689
718
  size: PropTypes.oneOf(['sm', 'lg']),
719
+ value: PropTypes.oneOfType([
720
+ PropTypes.number,
721
+ PropTypes.string,
722
+ PropTypes.arrayOf(PropTypes.number),
723
+ PropTypes.arrayOf(PropTypes.string),
724
+ ]),
690
725
  virtualScroller: PropTypes.bool,
691
726
  visible: PropTypes.bool,
692
727
  visibleItems: PropTypes.number,
@@ -0,0 +1,164 @@
1
+ import React, {
2
+ ChangeEventHandler,
3
+ forwardRef,
4
+ InputHTMLAttributes,
5
+ useEffect,
6
+ useState,
7
+ } from 'react'
8
+ import PropTypes from 'prop-types'
9
+ import classNames from 'classnames'
10
+
11
+ import { CFormControlWrapper, CFormControlWrapperProps } from '../form/CFormControlWrapper'
12
+
13
+ export interface CPasswordInputProps
14
+ extends CFormControlWrapperProps,
15
+ Omit<InputHTMLAttributes<HTMLInputElement>, 'size'> {
16
+ /**
17
+ * Sets the accessible label (`aria-label`) for the toggle password visibility button. This improves accessibility for screen readers and should describe the action, e.g. `"Show password"` or `"Hide password"`.
18
+ */
19
+ ariaLabelToggler?: string
20
+
21
+ /**
22
+ * A string of all className you want applied to the component.
23
+ */
24
+ className?: string
25
+
26
+ /**
27
+ * Enables delayed `onChange` execution for improved performance in React password inputs.
28
+ * - `true` delays the `onChange` callback by 500ms.
29
+ * - You can also pass a custom delay (in milliseconds) as a number.
30
+ */
31
+ delay?: boolean | number
32
+
33
+ /**
34
+ * Disables the password input field. When `true`, the user cannot interact with the field.
35
+ */
36
+ disabled?: boolean
37
+
38
+ /**
39
+ * Callback triggered when the value of the password input changes. If `delay` is set, the callback is called after the specified timeout.
40
+ */
41
+ onChange?: ChangeEventHandler<HTMLInputElement>
42
+
43
+ /**
44
+ * Makes the React password input read-only. Prevents user input but allows text selection.
45
+ */
46
+ readOnly?: boolean
47
+
48
+ /**
49
+ * Controls the initial visibility of the password. When `true`, the input type is set to `"text"` instead of `"password"`. This allows **toggling password visibility** in React forms.
50
+ */
51
+ showPassword?: boolean
52
+
53
+ /**
54
+ * Sets the visual size of the password input. Use `'sm'` for small or `'lg'` for large input fields.
55
+ */
56
+ size?: 'sm' | 'lg'
57
+
58
+ /**
59
+ * The value of the password input field. To make the input controlled, pair this with the `onChange` handler.
60
+ */
61
+ value?: string | string[] | number
62
+ }
63
+
64
+ export const CPasswordInput = forwardRef<HTMLInputElement, CPasswordInputProps>(
65
+ (
66
+ {
67
+ children,
68
+ ariaLabelToggler = 'Toggle password visibility',
69
+ className,
70
+ delay = false,
71
+ feedback,
72
+ feedbackInvalid,
73
+ feedbackValid,
74
+ floatingClassName,
75
+ floatingLabel,
76
+ id,
77
+ invalid,
78
+ label,
79
+ onChange,
80
+ showPassword: showPasswordProp = false,
81
+ size,
82
+ text,
83
+ tooltipFeedback,
84
+ valid,
85
+ ...rest
86
+ },
87
+ ref
88
+ ) => {
89
+ const [value, setValue] = useState<React.ChangeEvent<HTMLInputElement>>()
90
+ const [showPassword, setShowPassword] = useState<boolean>(showPasswordProp)
91
+
92
+ useEffect(() => {
93
+ const timeOutId = setTimeout(
94
+ () => value && onChange && onChange(value),
95
+ typeof delay === 'number' ? delay : 500
96
+ )
97
+
98
+ return () => clearTimeout(timeOutId)
99
+ }, [value])
100
+
101
+ useEffect(() => {
102
+ setShowPassword(showPasswordProp)
103
+ }, [showPasswordProp])
104
+
105
+ return (
106
+ <CFormControlWrapper
107
+ describedby={rest['aria-describedby']}
108
+ feedback={feedback}
109
+ feedbackInvalid={feedbackInvalid}
110
+ feedbackValid={feedbackValid}
111
+ floatingClassName={floatingClassName}
112
+ floatingLabel={floatingLabel}
113
+ id={id}
114
+ invalid={invalid}
115
+ label={label}
116
+ text={text}
117
+ tooltipFeedback={tooltipFeedback}
118
+ valid={valid}
119
+ >
120
+ <div className="form-password">
121
+ <input
122
+ className={classNames(
123
+ 'form-control',
124
+ {
125
+ [`form-control-${size}`]: size,
126
+ 'is-invalid': invalid,
127
+ 'is-valid': valid,
128
+ },
129
+ className
130
+ )}
131
+ id={id}
132
+ type={showPassword ? 'text' : 'password'}
133
+ onChange={(event) => (delay ? setValue(event) : onChange && onChange(event))}
134
+ {...rest}
135
+ ref={ref}
136
+ >
137
+ {children}
138
+ </input>
139
+ <button
140
+ type="button"
141
+ className="form-password-action"
142
+ data-coreui-toggle="password"
143
+ aria-label={ariaLabelToggler}
144
+ onClick={() => setShowPassword((prev) => !prev)}
145
+ >
146
+ <span className="form-password-action-icon"></span>
147
+ </button>
148
+ </div>
149
+ </CFormControlWrapper>
150
+ )
151
+ }
152
+ )
153
+
154
+ CPasswordInput.propTypes = {
155
+ ariaLabelToggler: PropTypes.string,
156
+ className: PropTypes.string,
157
+ id: PropTypes.string,
158
+ delay: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]),
159
+ showPassword: PropTypes.bool,
160
+ size: PropTypes.oneOf(['sm', 'lg']),
161
+ ...CFormControlWrapper.propTypes,
162
+ }
163
+
164
+ CPasswordInput.displayName = 'CPasswordInput'
@@ -0,0 +1,3 @@
1
+ import { CPasswordInput } from './CPasswordInput'
2
+
3
+ export { CPasswordInput }
@@ -200,7 +200,7 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
200
200
  visible,
201
201
  ...rest
202
202
  },
203
- ref,
203
+ ref
204
204
  ) => {
205
205
  const formRef = useRef<HTMLFormElement>()
206
206
  const inputRef = useRef<HTMLInputElement>(null)
@@ -239,8 +239,9 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
239
239
  })
240
240
  : ''
241
241
  }
242
-
243
- date && setAmPm(getAmPm(new Date(date), locale))
242
+ if (date) {
243
+ setAmPm(getAmPm(new Date(date), locale))
244
+ }
244
245
  }, [date])
245
246
 
246
247
  useEffect(() => {
@@ -262,7 +263,7 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
262
263
  const handleClear = (event: React.MouseEvent<HTMLElement>) => {
263
264
  event.stopPropagation()
264
265
  setDate(null)
265
- onTimeChange && onTimeChange(null)
266
+ onTimeChange?.(null)
266
267
  }
267
268
 
268
269
  const handleFormValidation = (form: HTMLFormElement) => {
@@ -279,7 +280,7 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
279
280
 
280
281
  const handleOnChange = useDebouncedCallback(
281
282
  (value: string) => isValidTime(value) && setDate(convertTimeToDate(value)),
282
- inputOnChangeDelay,
283
+ inputOnChangeDelay
283
284
  )
284
285
 
285
286
  const handleTimeChange = (set: 'hours' | 'minutes' | 'seconds' | 'toggle', value: string) => {
@@ -311,7 +312,7 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
311
312
  }
312
313
 
313
314
  setDate(new Date(_date))
314
- onTimeChange && onTimeChange(_date.toTimeString(), _date.toLocaleTimeString(), _date)
315
+ onTimeChange?.(_date.toTimeString(), _date.toLocaleTimeString(), _date)
315
316
  }
316
317
 
317
318
  const InputGroup = () => (
@@ -456,7 +457,7 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
456
457
  'is-invalid': isValid === false ? true : false,
457
458
  'is-valid': isValid,
458
459
  },
459
- className,
460
+ className
460
461
  )}
461
462
  container={container}
462
463
  disabled={disabled}
@@ -470,7 +471,10 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
470
471
  size={cancelButtonSize}
471
472
  variant={cancelButtonVariant}
472
473
  onClick={() => {
473
- initialDate && setDate(new Date(initialDate))
474
+ if (initialDate) {
475
+ setDate(new Date(initialDate))
476
+ }
477
+
474
478
  setVisible(false)
475
479
  }}
476
480
  >
@@ -493,12 +497,15 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
493
497
  }
494
498
  onHide={() => {
495
499
  setVisible(false)
496
- onHide && onHide()
500
+ onHide?.()
497
501
  }}
498
502
  onShow={() => {
499
- date && setInitialDate(new Date(date))
503
+ if (date) {
504
+ setInitialDate(new Date(date))
505
+ }
506
+
500
507
  setVisible(true)
501
- onShow && onShow()
508
+ onShow?.()
502
509
  }}
503
510
  portal={portal}
504
511
  toggler={InputGroup()}
@@ -550,7 +557,7 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
550
557
  </CPicker>
551
558
  </CFormControlWrapper>
552
559
  )
553
- },
560
+ }
554
561
  )
555
562
 
556
563
  CTimePicker.propTypes = {
@@ -65,12 +65,12 @@ export const getAmPm = (date: Date, locale: string): AmPm => {
65
65
  export const formatTimePartials = (
66
66
  values: number[],
67
67
  locale: string,
68
- partial: 'hour' | 'minute' | 'second',
68
+ partial: 'hour' | 'minute' | 'second'
69
69
  ): FormattedPartial[] => {
70
70
  const date = new Date()
71
-
71
+ const forceTwoDigit = shouldUseTwoDigitHour(locale)
72
72
  const formatter = new Intl.DateTimeFormat(locale, {
73
- hour: 'numeric',
73
+ hour: forceTwoDigit ? '2-digit' : 'numeric',
74
74
  minute: '2-digit',
75
75
  second: '2-digit',
76
76
  })
@@ -109,32 +109,32 @@ export const getLocalizedTimePartials = (
109
109
  ampm: 'auto' | boolean = 'auto',
110
110
  hours: boolean | number[] | ((hour: number) => number[]) = [],
111
111
  minutes: boolean | number[] | ((minute: number) => number[]) = [],
112
- seconds: boolean | number[] | ((second: number) => number[]) = [],
112
+ seconds: boolean | number[] | ((second: number) => number[]) = []
113
113
  ): LocalizedTimePartials => {
114
114
  const hour12 = (ampm === 'auto' && isAmPm(locale)) || ampm === true
115
115
 
116
116
  const listOfHours =
117
117
  Array.isArray(hours) && hours.length > 0
118
118
  ? hours
119
- : (typeof hours === 'function'
119
+ : typeof hours === 'function'
120
120
  ? Array.from({ length: hour12 ? 12 : 24 }, (_, i) => (hour12 ? i + 1 : i)).filter((hour) =>
121
- hours(hour),
121
+ hours(hour)
122
122
  )
123
- : Array.from({ length: hour12 ? 12 : 24 }, (_, i) => (hour12 ? i + 1 : i)))
123
+ : Array.from({ length: hour12 ? 12 : 24 }, (_, i) => (hour12 ? i + 1 : i))
124
124
 
125
125
  const listOfMinutes =
126
126
  Array.isArray(minutes) && minutes.length > 0
127
127
  ? minutes
128
- : (typeof minutes === 'function'
128
+ : typeof minutes === 'function'
129
129
  ? Array.from({ length: 60 }, (_, i) => i).filter((minute) => minutes(minute))
130
- : Array.from({ length: 60 }, (_, i) => i))
130
+ : Array.from({ length: 60 }, (_, i) => i)
131
131
 
132
132
  const listOfSeconds =
133
133
  Array.isArray(seconds) && seconds.length > 0
134
134
  ? seconds
135
- : (typeof seconds === 'function'
135
+ : typeof seconds === 'function'
136
136
  ? Array.from({ length: 60 }, (_, i) => i).filter((second) => seconds(second))
137
- : Array.from({ length: 60 }, (_, i) => i))
137
+ : Array.from({ length: 60 }, (_, i) => i)
138
138
 
139
139
  return {
140
140
  listOfHours: formatTimePartials(listOfHours, locale, 'hour'),
@@ -154,12 +154,12 @@ export const getLocalizedTimePartials = (
154
154
  export const getSelectedHour = (
155
155
  date: Date | null,
156
156
  locale: string,
157
- ampm: 'auto' | boolean = 'auto',
157
+ ampm: 'auto' | boolean = 'auto'
158
158
  ): number | string =>
159
159
  date
160
- ? ((ampm === 'auto' && isAmPm(locale)) || ampm === true
160
+ ? (ampm === 'auto' && isAmPm(locale)) || ampm === true
161
161
  ? convert24hTo12h(date.getHours())
162
- : date.getHours())
162
+ : date.getHours()
163
163
  : ''
164
164
 
165
165
  /**
@@ -195,3 +195,19 @@ export const isValidTime = (time: string): boolean => {
195
195
  const d = new Date(`1970-01-01T${time}`)
196
196
  return d instanceof Date && !Number.isNaN(d.getTime())
197
197
  }
198
+
199
+ /**
200
+ * Checks whether the given locale formats the hour "9" with a leading zero ("09")
201
+ * when using `hour: 'numeric'` in `toLocaleTimeString`.
202
+ *
203
+ * This helps determine if you should force `hour: '2-digit'` for consistent formatting.
204
+ *
205
+ * @param {string} locale - The locale code (e.g., "en-US", "pl-PL").
206
+ * @returns {boolean} `true` if the formatted hour starts with a leading zero, otherwise `false`.
207
+ */
208
+ export const shouldUseTwoDigitHour = (locale: string): boolean => {
209
+ const d = new Date(2020, 0, 1, 7, 5, 7) // 7:05:07
210
+ const formatted = d.toLocaleTimeString(locale)
211
+
212
+ return formatted.startsWith('0') // check if the hour starts with "0"
213
+ }