@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
@@ -12,10 +12,11 @@ import {
12
12
  isDateDisabled,
13
13
  isDisableDateInRange,
14
14
  isSameDateAs,
15
+ setTimeFromDate,
15
16
  } from './utils'
16
17
  import type { DisabledDate, SelectionTypes, ViewTypes } from './types'
17
18
 
18
- import { useForkedRef, useStateWithCallback } from '../../hooks'
19
+ import { useForkedRef } from '../../hooks'
19
20
  import { CCalendarPanel } from './CCalendarPanel'
20
21
 
21
22
  export interface CCalendarProps {
@@ -284,11 +285,10 @@ export const CCalendar = forwardRef<HTMLDivElement, CCalendarProps>(
284
285
  onSelectEndChange,
285
286
  onViewChanged,
286
287
  },
287
- ref,
288
+ ref
288
289
  ) => {
289
290
  const calendarRef = useRef<HTMLDivElement>(null)
290
291
  const forkedRef = useForkedRef(ref, calendarRef)
291
- const isInitialMount = useRef(true)
292
292
  const [_calendarDate, setCalendarDate] = useState<Date | null>(null)
293
293
 
294
294
  useEffect(() => {
@@ -299,7 +299,7 @@ export const CCalendar = forwardRef<HTMLDivElement, CCalendarProps>(
299
299
  year: 'years',
300
300
  }
301
301
 
302
- setView((viewMap[selectionType] as ViewTypes) || 'days')
302
+ handleViewChange((viewMap[selectionType] as ViewTypes) || 'days')
303
303
  }, [selectionType])
304
304
 
305
305
  useEffect(() => {
@@ -310,31 +310,30 @@ export const CCalendar = forwardRef<HTMLDivElement, CCalendarProps>(
310
310
 
311
311
  if (calendarDate) {
312
312
  const date = convertToDateObject(calendarDate, selectionType)
313
- !isSameDateAs(_calendarDate, date) && setCalendarDate(date)
313
+ if (!isSameDateAs(_calendarDate, date)) {
314
+ setCalendarDate(date)
315
+ }
314
316
  }
315
317
  }, [calendarDate])
316
318
 
317
- const [_startDate, setStartDate] = useStateWithCallback<Date | null>(
318
- startDate ? convertToDateObject(startDate, selectionType) : null,
319
- () =>
320
- onStartDateChange && onStartDateChange(getDateBySelectionType(_startDate, selectionType)),
321
- !isInitialMount.current,
319
+ const [_startDate, setStartDate] = useState<Date | null>(
320
+ startDate ? convertToDateObject(startDate, selectionType) : null
321
+ )
322
+
323
+ const [_endDate, setEndDate] = useState<Date | null>(
324
+ endDate ? convertToDateObject(endDate, selectionType) : null
322
325
  )
326
+
323
327
  useEffect(() => {
324
328
  const date = startDate ? convertToDateObject(startDate, selectionType) : null
325
- if (!isSameDateAs(date, _startDate)) {
329
+ if (date?.getTime() !== _startDate?.getTime()) {
326
330
  setStartDate(date)
327
331
  }
328
332
  }, [startDate])
329
333
 
330
- const [_endDate, setEndDate] = useStateWithCallback<Date | null>(
331
- endDate ? convertToDateObject(endDate, selectionType) : null,
332
- () => onEndDateChange && onEndDateChange(getDateBySelectionType(_endDate, selectionType)),
333
- !isInitialMount.current,
334
- )
335
334
  useEffect(() => {
336
335
  const date = endDate ? convertToDateObject(endDate, selectionType) : null
337
- if (!isSameDateAs(date, _endDate)) {
336
+ if (date?.getTime() !== _endDate?.getTime()) {
338
337
  setEndDate(date)
339
338
  }
340
339
  }, [endDate])
@@ -342,34 +341,25 @@ export const CCalendar = forwardRef<HTMLDivElement, CCalendarProps>(
342
341
  const [_hoverDate, setHoverDate] = useState<Date | null>(null)
343
342
 
344
343
  const [_maxDate, setMaxDate] = useState<Date | null>(
345
- maxDate ? convertToDateObject(maxDate, selectionType) : null,
344
+ maxDate ? convertToDateObject(maxDate, selectionType) : null
346
345
  )
347
346
  useEffect(() => {
348
- maxDate && setMaxDate(convertToDateObject(maxDate, selectionType))
347
+ setMaxDate(maxDate ? convertToDateObject(maxDate, selectionType) : null)
349
348
  }, [maxDate])
350
349
 
351
350
  const [_minDate, setMinDate] = useState<Date | null>(
352
- minDate ? convertToDateObject(minDate, selectionType) : null,
351
+ minDate ? convertToDateObject(minDate, selectionType) : null
353
352
  )
354
353
  useEffect(() => {
355
- minDate && setMinDate(convertToDateObject(minDate, selectionType))
354
+ setMinDate(minDate ? convertToDateObject(minDate, selectionType) : null)
356
355
  }, [minDate])
357
356
 
358
- const [_selectEndDate, setSelectEndDate] = useStateWithCallback(
359
- selectEndDate,
360
- onSelectEndChange,
361
- )
357
+ const [_selectEndDate, setSelectEndDate] = useState(selectEndDate)
362
358
  useEffect(() => {
363
359
  setSelectEndDate(selectEndDate)
364
360
  }, [selectEndDate])
365
361
 
366
- useEffect(() => {
367
- if (!isInitialMount.current && typeof _selectEndDate === 'boolean') {
368
- onSelectEndChange?.(_selectEndDate)
369
- }
370
- }, [_selectEndDate])
371
-
372
- const [view, setView] = useStateWithCallback<ViewTypes>('days', onViewChanged)
362
+ const [view, setView] = useState<ViewTypes>('days')
373
363
  const [focusOn, setFocusOn] = useState<number | undefined>()
374
364
 
375
365
  useEffect(() => {
@@ -380,10 +370,6 @@ export const CCalendar = forwardRef<HTMLDivElement, CCalendarProps>(
380
370
  }
381
371
  }, [view])
382
372
 
383
- useEffect(() => {
384
- isInitialMount.current = false
385
- }, [])
386
-
387
373
  const setCalendarPage = (years: number, months = 0, setMonth?: number) => {
388
374
  if (_calendarDate === null) {
389
375
  return
@@ -409,6 +395,36 @@ export const CCalendar = forwardRef<HTMLDivElement, CCalendarProps>(
409
395
  onCalendarDateChange?.(d)
410
396
  }
411
397
 
398
+ const handleStartDateChange = (date: Date | null) => {
399
+ date = date ? convertToDateObject(date, selectionType) : null
400
+ if (date) {
401
+ date = setTimeFromDate(date, _startDate)
402
+ }
403
+
404
+ setStartDate(date)
405
+ onStartDateChange?.(getDateBySelectionType(date, selectionType))
406
+ }
407
+
408
+ const handleEndDateChange = (date: Date | null) => {
409
+ date = date ? convertToDateObject(date, selectionType) : null
410
+ if (date) {
411
+ date = setTimeFromDate(date, _endDate)
412
+ }
413
+
414
+ setEndDate(date)
415
+ onEndDateChange?.(getDateBySelectionType(date, selectionType))
416
+ }
417
+
418
+ const handleSelectEndDateChange = (value: boolean) => {
419
+ setSelectEndDate(value)
420
+ onSelectEndChange?.(value)
421
+ }
422
+
423
+ const handleViewChange = (value: ViewTypes) => {
424
+ setView(value)
425
+ onViewChanged?.(value)
426
+ }
427
+
412
428
  const handleCalendarClick = (date: Date, index?: number) => {
413
429
  const _date = new Date(date)
414
430
 
@@ -418,13 +434,13 @@ export const CCalendar = forwardRef<HTMLDivElement, CCalendarProps>(
418
434
 
419
435
  if (view === 'months' && selectionType !== 'month') {
420
436
  setCalendarDate(index ? new Date(_date.setMonth(_date.getMonth() - index)) : _date)
421
- setView('days')
437
+ handleViewChange('days')
422
438
  return
423
439
  }
424
440
 
425
441
  if (view === 'years' && selectionType !== 'year') {
426
442
  setCalendarDate(index ? new Date(_date.setFullYear(_date.getFullYear() - index)) : _date)
427
- setView('months')
443
+ handleViewChange('months')
428
444
  return
429
445
  }
430
446
 
@@ -435,48 +451,48 @@ export const CCalendar = forwardRef<HTMLDivElement, CCalendarProps>(
435
451
 
436
452
  if (range) {
437
453
  if (_selectEndDate) {
438
- setSelectEndDate(false)
454
+ handleSelectEndDateChange(false)
439
455
 
440
456
  if (_startDate && _startDate > date) {
441
- setStartDate(null)
442
- setEndDate(null)
457
+ handleStartDateChange(null)
458
+ handleEndDateChange(null)
443
459
  return
444
460
  }
445
461
 
446
462
  if (isDisableDateInRange(_startDate, date, disabledDates)) {
447
- setStartDate(null)
448
- setEndDate(null)
463
+ handleStartDateChange(null)
464
+ handleEndDateChange(null)
449
465
  return
450
466
  }
451
467
 
452
- setEndDate(date)
468
+ handleEndDateChange(date)
453
469
  return
454
470
  }
455
471
 
456
472
  if (_endDate && _endDate < date) {
457
- setStartDate(null)
458
- setEndDate(null)
473
+ handleStartDateChange(null)
474
+ handleEndDateChange(null)
459
475
  return
460
476
  }
461
477
 
462
478
  if (isDisableDateInRange(date, _endDate, disabledDates)) {
463
- setStartDate(null)
464
- setEndDate(null)
479
+ handleStartDateChange(null)
480
+ handleEndDateChange(null)
465
481
  return
466
482
  }
467
483
 
468
- setSelectEndDate(true)
469
- setStartDate(date)
484
+ handleSelectEndDateChange(true)
485
+ handleStartDateChange(date)
470
486
  return
471
487
  }
472
488
 
473
- setStartDate(date)
489
+ handleStartDateChange(date)
474
490
  }
475
491
 
476
492
  const handleCalendarKeyDown = (
477
493
  event: React.KeyboardEvent<HTMLDivElement>,
478
494
  date: Date,
479
- index?: number,
495
+ index?: number
480
496
  ) => {
481
497
  if (event.code === 'Space' || event.key === 'Enter') {
482
498
  event.preventDefault()
@@ -602,6 +618,8 @@ export const CCalendar = forwardRef<HTMLDivElement, CCalendarProps>(
602
618
  return
603
619
  }
604
620
 
621
+ date = setTimeFromDate(date, selectEndDate ? _endDate : _startDate)
622
+
605
623
  setHoverDate(date)
606
624
 
607
625
  if (date) {
@@ -654,7 +672,7 @@ export const CCalendar = forwardRef<HTMLDivElement, CCalendarProps>(
654
672
  [`select-${selectionType}`]: selectionType && view === 'days',
655
673
  'show-week-numbers': showWeekNumber,
656
674
  },
657
- className,
675
+ className
658
676
  )}
659
677
  ref={forkedRef}
660
678
  >
@@ -676,9 +694,9 @@ export const CCalendar = forwardRef<HTMLDivElement, CCalendarProps>(
676
694
  navPrevDoubleIcon={navPrevDoubleIcon}
677
695
  navPrevIcon={navPrevIcon}
678
696
  navYearFirst={navYearFirst}
679
- onMonthClick={() => setView('months')}
697
+ onMonthClick={() => handleViewChange('months')}
680
698
  onNavigationClick={handleNavigationOnClick}
681
- onYearClick={() => setView('years')}
699
+ onYearClick={() => handleViewChange('years')}
682
700
  view={view}
683
701
  />
684
702
  <CCalendarPanel
@@ -711,7 +729,7 @@ export const CCalendar = forwardRef<HTMLDivElement, CCalendarProps>(
711
729
  })}
712
730
  </div>
713
731
  )
714
- },
732
+ }
715
733
  )
716
734
 
717
735
  CCalendar.propTypes = {
@@ -41,7 +41,7 @@ export const CCalendarNavigation = forwardRef<HTMLDivElement, CCalendarNavigatio
41
41
  onYearClick,
42
42
  view,
43
43
  },
44
- ref,
44
+ ref
45
45
  ) => {
46
46
  return (
47
47
  <div className="calendar-nav" ref={ref}>
@@ -114,7 +114,7 @@ export const CCalendarNavigation = forwardRef<HTMLDivElement, CCalendarNavigatio
114
114
  )}
115
115
  </div>
116
116
  )
117
- },
117
+ }
118
118
  )
119
119
 
120
120
  CCalendarNavigation.displayName = 'CCalendarNavigation'
@@ -72,7 +72,7 @@ export const CCalendarPanel = forwardRef<HTMLTableElement, CCalendarPanelProps>(
72
72
  weekdayFormat,
73
73
  weekNumbersLabel,
74
74
  },
75
- ref,
75
+ ref
76
76
  ) => {
77
77
  const [listOfMonths, setListOfMonths] = useState<string[][]>([])
78
78
 
@@ -83,7 +83,7 @@ export const CCalendarPanel = forwardRef<HTMLTableElement, CCalendarPanelProps>(
83
83
  const monthDetails = getMonthDetails(
84
84
  calendarDate.getFullYear(),
85
85
  calendarDate.getMonth(),
86
- firstDayOfWeek,
86
+ firstDayOfWeek
87
87
  )
88
88
  const listOfYears = createGroupsInArray(getYears(calendarDate.getFullYear()), 4)
89
89
  const weekDays = monthDetails[0].days
@@ -125,7 +125,7 @@ export const CCalendarPanel = forwardRef<HTMLTableElement, CCalendarPanelProps>(
125
125
  week.weekNumber === 0
126
126
  ? `${calendarDate.getFullYear()}W53`
127
127
  : `${calendarDate.getFullYear()}W${week.weekNumber}`,
128
- selectionType,
128
+ selectionType
129
129
  )
130
130
  const isDisabled = isDateDisabled(date, minDate, maxDate, disabledDates)
131
131
  const isSelected = isDateSelected(date, startDate, endDate)
@@ -300,7 +300,7 @@ export const CCalendarPanel = forwardRef<HTMLTableElement, CCalendarPanelProps>(
300
300
  </tbody>
301
301
  </table>
302
302
  )
303
- },
303
+ }
304
304
  )
305
305
 
306
306
  CCalendarPanel.displayName = 'CCalendarPanel'
@@ -80,7 +80,7 @@ export const getCalendarDate = (calendarDate: Date, order: number, view: ViewTyp
80
80
  */
81
81
  export const getDateBySelectionType = (
82
82
  date: Date | null,
83
- selectionType: SelectionTypes,
83
+ selectionType: SelectionTypes
84
84
  ): string | Date | null => {
85
85
  if (date === null) {
86
86
  return null
@@ -116,7 +116,7 @@ export const getFirstAvailableDateInRange = (
116
116
  endDate: Date,
117
117
  min?: Date | null,
118
118
  max?: Date | null,
119
- disabledDates?: DisabledDate | DisabledDate[],
119
+ disabledDates?: DisabledDate | DisabledDate[]
120
120
  ): Date | null => {
121
121
  const _min = min ? new Date(Math.max(startDate.getTime(), min.getTime())) : startDate
122
122
  const _max = max ? new Date(Math.min(endDate.getTime(), max.getTime())) : endDate
@@ -158,7 +158,7 @@ export const getMonthsNames = (locale: string, format: 'short' | 'long' = 'short
158
158
  */
159
159
  export const getSelectableDates = (
160
160
  element: HTMLElement,
161
- selector: string = 'tr[tabindex="0"], td[tabindex="0"]',
161
+ selector: string = 'tr[tabindex="0"], td[tabindex="0"]'
162
162
  ) => {
163
163
  return [...Element.prototype.querySelectorAll.call(element, selector)] as HTMLElement[]
164
164
  }
@@ -183,7 +183,7 @@ export const getYears = (year: number, range: number = 6): number[] => {
183
183
  const getLeadingDays = (
184
184
  year: number,
185
185
  month: number,
186
- firstDayOfWeek: number,
186
+ firstDayOfWeek: number
187
187
  ): { date: Date; month: string }[] => {
188
188
  // 0: sunday
189
189
  // 1: monday
@@ -239,7 +239,7 @@ const getTrailingDays = (
239
239
  year: number,
240
240
  month: number,
241
241
  leadingDays: { date: Date; month: string }[],
242
- monthDays: { date: Date; month: string }[],
242
+ monthDays: { date: Date; month: string }[]
243
243
  ) => {
244
244
  const dates = []
245
245
  const days = 42 - (leadingDays.length + monthDays.length)
@@ -283,7 +283,7 @@ export const getWeekNumber = (date: Date): number => {
283
283
  export const getMonthDetails = (
284
284
  year: number,
285
285
  month: number,
286
- firstDayOfWeek: number,
286
+ firstDayOfWeek: number
287
287
  ): { weekNumber?: number; days: { date: Date; month: string }[] }[] => {
288
288
  const daysPrevMonth = getLeadingDays(year, month, firstDayOfWeek)
289
289
  const daysThisMonth = getMonthDays(year, month)
@@ -320,7 +320,7 @@ export const isDateDisabled = (
320
320
  date: Date,
321
321
  min?: Date | null,
322
322
  max?: Date | null,
323
- disabledDates?: DisabledDate | DisabledDate[],
323
+ disabledDates?: DisabledDate | DisabledDate[]
324
324
  ): boolean => {
325
325
  if (min && date < min) {
326
326
  return true
@@ -405,7 +405,7 @@ export const isDateSelected = (date: Date, start: Date | null, end: Date | null)
405
405
  export const isDisableDateInRange = (
406
406
  startDate?: Date | null,
407
407
  endDate?: Date | null,
408
- disabledDates?: DisabledDate | DisabledDate[],
408
+ disabledDates?: DisabledDate | DisabledDate[]
409
409
  ): boolean => {
410
410
  if (startDate && endDate) {
411
411
  const date = new Date(startDate)
@@ -437,7 +437,7 @@ export const isMonthDisabled = (
437
437
  date: Date,
438
438
  min?: Date | null,
439
439
  max?: Date | null,
440
- disabledDates?: DisabledDate | DisabledDate[],
440
+ disabledDates?: DisabledDate | DisabledDate[]
441
441
  ) => {
442
442
  const current = date.getFullYear() * 12 + date.getMonth()
443
443
  const _min = min ? min.getFullYear() * 12 + min.getMonth() : null
@@ -556,7 +556,7 @@ export const isYearDisabled = (
556
556
  date: Date,
557
557
  min?: Date | null,
558
558
  max?: Date | null,
559
- disabledDates?: DisabledDate | DisabledDate[],
559
+ disabledDates?: DisabledDate | DisabledDate[]
560
560
  ) => {
561
561
  const year = date.getFullYear()
562
562
  const minYear = min ? min.getFullYear() : null
@@ -638,3 +638,26 @@ export const removeTimeFromDate = (date: Date): Date => {
638
638
  clearedDate.setHours(0, 0, 0, 0)
639
639
  return clearedDate
640
640
  }
641
+
642
+ /**
643
+ * Copies the time (hours, minutes, seconds, milliseconds) from one Date to another.
644
+ *
645
+ * @param {Date} target - The date whose time will be updated.
646
+ * @param {Date | null} source - The date to copy the time from.
647
+ * @returns {Date} A new Date instance with the date from `target` and time from `source`.
648
+ */
649
+ export const setTimeFromDate = (target: Date, source: Date | null): Date => {
650
+ if (!(source instanceof Date)) {
651
+ return target
652
+ }
653
+
654
+ const result = new Date(target) // create a copy to avoid mutation
655
+ result.setHours(
656
+ source.getHours(),
657
+ source.getMinutes(),
658
+ source.getSeconds(),
659
+ source.getMilliseconds()
660
+ )
661
+
662
+ return result
663
+ }
@@ -53,7 +53,7 @@ export const CDatePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDatePicke
53
53
  {...rest}
54
54
  />
55
55
  )
56
- },
56
+ }
57
57
  )
58
58
 
59
59
  CDatePicker.displayName = 'CDatePicker'
@@ -208,7 +208,6 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
208
208
  ariaNavPrevMonthLabel,
209
209
  ariaNavPrevYearLabel,
210
210
  calendars = 2,
211
- calendarDate,
212
211
  cancelButton = 'Cancel',
213
212
  cancelButtonColor = 'primary',
214
213
  cancelButtonSize = 'sm',
@@ -274,15 +273,16 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
274
273
  visible,
275
274
  weekdayFormat,
276
275
  weekNumbersLabel,
276
+ calendarDate = startDate || endDate || null,
277
277
  ...rest
278
278
  },
279
- ref,
279
+ ref
280
280
  ) => {
281
281
  const inputEndRef = useRef<HTMLInputElement>(null)
282
282
  const inputStartRef = useRef<HTMLInputElement>(null)
283
283
  const formRef = useRef<HTMLFormElement>()
284
284
 
285
- const [_calendarDate, setCalendarDate] = useState<Date | string | null>(calendarDate ?? null)
285
+ const [_calendarDate, setCalendarDate] = useState<Date | string | null>(calendarDate)
286
286
  const [_endDate, setEndDate] = useState<Date | string | null>(endDate ?? null)
287
287
  const [_maxDate, setMaxDate] = useState<Date | string | null>(maxDate ?? null)
288
288
  const [_minDate, setMinDate] = useState<Date | string | null>(minDate ?? null)
@@ -290,7 +290,7 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
290
290
  const [_visible, setVisible] = useState(visible)
291
291
 
292
292
  const [initialStartDate, setInitialStartDate] = useState<Date | string | null>(
293
- startDate ?? null,
293
+ startDate ?? null
294
294
  )
295
295
  const [initialEndDate, setInitialEndDate] = useState<Date | string | null>(endDate ?? null)
296
296
  const [inputStartHoverValue, setInputStartHoverValue] = useState<Date | string | null>(null)
@@ -303,19 +303,27 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
303
303
  }, [valid, invalid])
304
304
 
305
305
  useEffect(() => {
306
- setStartDate(startDate ? startDate : null)
306
+ if (startDate) {
307
+ setStartDate(startDate)
308
+ }
307
309
  }, [startDate])
308
310
 
309
311
  useEffect(() => {
310
- setEndDate(endDate ? endDate : null)
312
+ if (endDate) {
313
+ setEndDate(endDate)
314
+ }
311
315
  }, [endDate])
312
316
 
313
317
  useEffect(() => {
314
- maxDate && setMaxDate(maxDate)
318
+ if (maxDate) {
319
+ setMaxDate(maxDate)
320
+ }
315
321
  }, [maxDate])
316
322
 
317
323
  useEffect(() => {
318
- minDate && setMinDate(minDate)
324
+ if (minDate) {
325
+ setMinDate(minDate)
326
+ }
319
327
  }, [minDate])
320
328
 
321
329
  useEffect(() => {
@@ -355,7 +363,7 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
355
363
  const formatDate = (date: Date | string) => {
356
364
  if (inputDateFormat) {
357
365
  return inputDateFormat(
358
- date instanceof Date ? new Date(date) : convertToDateObject(date, selectionType),
366
+ date instanceof Date ? new Date(date) : convertToDateObject(date, selectionType)
359
367
  )
360
368
  }
361
369
 
@@ -382,7 +390,11 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
382
390
  }
383
391
 
384
392
  const handleDateHover = (date: Date | string | null) => {
385
- selectEndDate ? setInputEndHoverValue(date) : setInputStartHoverValue(date)
393
+ if (selectEndDate) {
394
+ setInputEndHoverValue(date)
395
+ } else {
396
+ setInputStartHoverValue(date)
397
+ }
386
398
  }
387
399
 
388
400
  const handleClear = (event: React.MouseEvent<HTMLElement>) => {
@@ -394,14 +406,14 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
394
406
  const handleEndDateChange = (date: Date | string | null) => {
395
407
  setEndDate(date)
396
408
  setInputEndHoverValue(null)
397
- onEndDateChange && onEndDateChange(date)
409
+ onEndDateChange?.(date)
398
410
 
399
411
  if (timepicker || footer) {
400
412
  return
401
413
  }
402
414
 
403
- if (closeOnSelect) {
404
- _startDate !== null && setVisible(false)
415
+ if (closeOnSelect && _startDate !== null) {
416
+ setVisible(false)
405
417
  }
406
418
  }
407
419
 
@@ -420,7 +432,7 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
420
432
  const handleStartDateChange = (date: Date | string | null) => {
421
433
  setStartDate(date)
422
434
  setInputStartHoverValue(null)
423
- onStartDateChange && onStartDateChange(date)
435
+ onStartDateChange?.(date)
424
436
 
425
437
  if (timepicker || footer) {
426
438
  return
@@ -437,7 +449,11 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
437
449
  : getLocalDateFromString(value, locale, timepicker)
438
450
  if (date instanceof Date && date.getTime()) {
439
451
  setCalendarDate(date)
440
- input === 'start' ? setStartDate(date) : setEndDate(date)
452
+ if (input === 'start') {
453
+ setStartDate(date)
454
+ } else {
455
+ setEndDate(date)
456
+ }
441
457
  }
442
458
  }, inputOnChangeDelay)
443
459
 
@@ -536,7 +552,7 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
536
552
  'is-invalid': isValid === false ? true : false,
537
553
  'is-valid': isValid,
538
554
  },
539
- className,
555
+ className
540
556
  )}
541
557
  disabled={disabled}
542
558
  dropdownClassNames="date-picker-dropdown"
@@ -552,7 +568,7 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
552
568
  onClick={() => {
553
569
  const date = new Date()
554
570
  handleStartDateChange(date)
555
- range && handleEndDateChange(date)
571
+ if (range) handleEndDateChange(date)
556
572
  setCalendarDate(date)
557
573
  }}
558
574
  >
@@ -566,7 +582,7 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
566
582
  variant={cancelButtonVariant}
567
583
  onClick={() => {
568
584
  handleStartDateChange(initialStartDate)
569
- range && handleEndDateChange(initialEndDate)
585
+ if (range) handleEndDateChange(initialEndDate)
570
586
  setVisible(false)
571
587
  }}
572
588
  >
@@ -591,13 +607,13 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
591
607
  portal={portal}
592
608
  onHide={() => {
593
609
  setVisible(false)
594
- onHide && onHide()
610
+ onHide?.()
595
611
  }}
596
612
  onShow={() => {
597
613
  setInitialStartDate(_startDate)
598
614
  setInitialEndDate(_endDate)
599
615
  setVisible(true)
600
- onShow && onShow()
616
+ onShow?.()
601
617
  }}
602
618
  visible={_visible}
603
619
  {...rest}
@@ -710,7 +726,7 @@ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDate
710
726
  </CPicker>
711
727
  </CFormControlWrapper>
712
728
  )
713
- },
729
+ }
714
730
  )
715
731
 
716
732
  CDateRangePicker.displayName = 'CDateRangePicker'
@@ -30,6 +30,7 @@ export * from './multi-select'
30
30
  export * from './nav'
31
31
  export * from './navbar'
32
32
  export * from './offcanvas'
33
+ export * from './password-input'
33
34
  export * from './pagination'
34
35
  export * from './placeholder'
35
36
  export * from './progress'