@coreui/react-pro 5.10.0 → 5.12.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 (193) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/accordion/CAccordionBody.js +2 -2
  3. package/dist/cjs/components/accordion/CAccordionBody.js.map +1 -1
  4. package/dist/cjs/components/accordion/CAccordionButton.js +2 -2
  5. package/dist/cjs/components/accordion/CAccordionButton.js.map +1 -1
  6. package/dist/cjs/components/accordion/CAccordionItem.d.ts +5 -0
  7. package/dist/cjs/components/accordion/CAccordionItem.js +7 -4
  8. package/dist/cjs/components/accordion/CAccordionItem.js.map +1 -1
  9. package/dist/cjs/components/badge/CBadge.js +1 -1
  10. package/dist/cjs/components/badge/CBadge.js.map +1 -1
  11. package/dist/cjs/components/calendar/CCalendar.d.ts +57 -44
  12. package/dist/cjs/components/calendar/CCalendar.js +51 -187
  13. package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
  14. package/dist/cjs/components/calendar/CCalendarNavigation.d.ts +21 -0
  15. package/dist/cjs/components/calendar/CCalendarNavigation.js +23 -0
  16. package/dist/cjs/components/calendar/CCalendarNavigation.js.map +1 -0
  17. package/dist/cjs/components/calendar/CCalendarPanel.d.ts +28 -0
  18. package/dist/cjs/components/calendar/CCalendarPanel.js +149 -0
  19. package/dist/cjs/components/calendar/CCalendarPanel.js.map +1 -0
  20. package/dist/cjs/components/calendar/types.d.ts +3 -0
  21. package/dist/cjs/components/calendar/utils.d.ts +175 -18
  22. package/dist/cjs/components/calendar/utils.js +312 -43
  23. package/dist/cjs/components/calendar/utils.js.map +1 -1
  24. package/dist/cjs/components/date-picker/CDatePicker.d.ts +1 -1
  25. package/dist/cjs/components/date-range-picker/CDateRangePicker.d.ts +2 -2
  26. package/dist/cjs/components/date-range-picker/CDateRangePicker.js +0 -2
  27. package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
  28. package/dist/cjs/components/date-range-picker/utils.d.ts +16 -0
  29. package/dist/cjs/components/date-range-picker/utils.js +18 -2
  30. package/dist/cjs/components/date-range-picker/utils.js.map +1 -1
  31. package/dist/cjs/components/dropdown/CDropdown.d.ts +77 -20
  32. package/dist/cjs/components/dropdown/CDropdown.js +6 -3
  33. package/dist/cjs/components/dropdown/CDropdown.js.map +1 -1
  34. package/dist/cjs/components/dropdown/CDropdownMenu.js +1 -1
  35. package/dist/cjs/components/dropdown/CDropdownMenu.js.map +1 -1
  36. package/dist/cjs/components/dropdown/CDropdownToggle.js +1 -1
  37. package/dist/cjs/components/dropdown/CDropdownToggle.js.map +1 -1
  38. package/dist/cjs/components/modal/CModal.js +0 -1
  39. package/dist/cjs/components/modal/CModal.js.map +1 -1
  40. package/dist/cjs/components/nav/CNavGroup.js +1 -1
  41. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  42. package/dist/cjs/components/popover/CPopover.d.ts +75 -20
  43. package/dist/cjs/components/popover/CPopover.js +8 -21
  44. package/dist/cjs/components/popover/CPopover.js.map +1 -1
  45. package/dist/cjs/components/progress/CProgress.d.ts +1 -1
  46. package/dist/cjs/components/range-slider/CRangeSlider.js +6 -2
  47. package/dist/cjs/components/range-slider/CRangeSlider.js.map +1 -1
  48. package/dist/cjs/components/sidebar/CSidebar.d.ts +7 -2
  49. package/dist/cjs/components/sidebar/CSidebar.js +7 -6
  50. package/dist/cjs/components/sidebar/CSidebar.js.map +1 -1
  51. package/dist/cjs/components/smart-pagination/CSmartPagination.d.ts +4 -12
  52. package/dist/cjs/components/smart-pagination/CSmartPagination.js.map +1 -1
  53. package/dist/cjs/components/smart-table/CSmartTableHead.js +12 -25
  54. package/dist/cjs/components/smart-table/CSmartTableHead.js.map +1 -1
  55. package/dist/cjs/components/smart-table/types.d.ts +1 -1
  56. package/dist/cjs/components/time-picker/CTimePicker.d.ts +1 -1
  57. package/dist/cjs/components/time-picker/CTimePicker.js.map +1 -1
  58. package/dist/cjs/components/time-picker/types.d.ts +5 -0
  59. package/dist/cjs/components/time-picker/utils.d.ts +8 -11
  60. package/dist/cjs/components/time-picker/utils.js +8 -4
  61. package/dist/cjs/components/time-picker/utils.js.map +1 -1
  62. package/dist/cjs/components/tooltip/CTooltip.d.ts +67 -15
  63. package/dist/cjs/components/tooltip/CTooltip.js +8 -21
  64. package/dist/cjs/components/tooltip/CTooltip.js.map +1 -1
  65. package/dist/cjs/hooks/index.d.ts +2 -1
  66. package/dist/cjs/hooks/useClipboard.d.ts +12 -0
  67. package/dist/cjs/hooks/useClipboard.js +54 -0
  68. package/dist/cjs/hooks/useClipboard.js.map +1 -0
  69. package/dist/cjs/index.js +2 -0
  70. package/dist/cjs/index.js.map +1 -1
  71. package/dist/cjs/node_modules/react-device-detect/dist/lib.js +1 -1
  72. package/dist/cjs/node_modules/react-device-detect/dist/lib.js.map +1 -1
  73. package/dist/cjs/node_modules/tslib/tslib.es6.js +40 -0
  74. package/dist/cjs/node_modules/tslib/tslib.es6.js.map +1 -1
  75. package/dist/cjs/utils/index.d.ts +2 -1
  76. package/dist/cjs/utils/mergeClassNames.d.ts +2 -0
  77. package/dist/esm/components/accordion/CAccordionBody.js +2 -2
  78. package/dist/esm/components/accordion/CAccordionBody.js.map +1 -1
  79. package/dist/esm/components/accordion/CAccordionButton.js +2 -2
  80. package/dist/esm/components/accordion/CAccordionButton.js.map +1 -1
  81. package/dist/esm/components/accordion/CAccordionItem.d.ts +5 -0
  82. package/dist/esm/components/accordion/CAccordionItem.js +8 -5
  83. package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
  84. package/dist/esm/components/badge/CBadge.js +1 -1
  85. package/dist/esm/components/badge/CBadge.js.map +1 -1
  86. package/dist/esm/components/calendar/CCalendar.d.ts +57 -44
  87. package/dist/esm/components/calendar/CCalendar.js +52 -188
  88. package/dist/esm/components/calendar/CCalendar.js.map +1 -1
  89. package/dist/esm/components/calendar/CCalendarNavigation.d.ts +21 -0
  90. package/dist/esm/components/calendar/CCalendarNavigation.js +21 -0
  91. package/dist/esm/components/calendar/CCalendarNavigation.js.map +1 -0
  92. package/dist/esm/components/calendar/CCalendarPanel.d.ts +28 -0
  93. package/dist/esm/components/calendar/CCalendarPanel.js +147 -0
  94. package/dist/esm/components/calendar/CCalendarPanel.js.map +1 -0
  95. package/dist/esm/components/calendar/types.d.ts +3 -0
  96. package/dist/esm/components/calendar/utils.d.ts +175 -18
  97. package/dist/esm/components/calendar/utils.js +306 -44
  98. package/dist/esm/components/calendar/utils.js.map +1 -1
  99. package/dist/esm/components/date-picker/CDatePicker.d.ts +1 -1
  100. package/dist/esm/components/date-range-picker/CDateRangePicker.d.ts +2 -2
  101. package/dist/esm/components/date-range-picker/CDateRangePicker.js +0 -2
  102. package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
  103. package/dist/esm/components/date-range-picker/utils.d.ts +16 -0
  104. package/dist/esm/components/date-range-picker/utils.js +18 -2
  105. package/dist/esm/components/date-range-picker/utils.js.map +1 -1
  106. package/dist/esm/components/dropdown/CDropdown.d.ts +77 -20
  107. package/dist/esm/components/dropdown/CDropdown.js +6 -3
  108. package/dist/esm/components/dropdown/CDropdown.js.map +1 -1
  109. package/dist/esm/components/dropdown/CDropdownMenu.js +1 -1
  110. package/dist/esm/components/dropdown/CDropdownMenu.js.map +1 -1
  111. package/dist/esm/components/dropdown/CDropdownToggle.js +1 -1
  112. package/dist/esm/components/dropdown/CDropdownToggle.js.map +1 -1
  113. package/dist/esm/components/modal/CModal.js +0 -1
  114. package/dist/esm/components/modal/CModal.js.map +1 -1
  115. package/dist/esm/components/nav/CNavGroup.js +1 -1
  116. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  117. package/dist/esm/components/popover/CPopover.d.ts +75 -20
  118. package/dist/esm/components/popover/CPopover.js +8 -21
  119. package/dist/esm/components/popover/CPopover.js.map +1 -1
  120. package/dist/esm/components/progress/CProgress.d.ts +1 -1
  121. package/dist/esm/components/range-slider/CRangeSlider.js +6 -2
  122. package/dist/esm/components/range-slider/CRangeSlider.js.map +1 -1
  123. package/dist/esm/components/sidebar/CSidebar.d.ts +7 -2
  124. package/dist/esm/components/sidebar/CSidebar.js +7 -6
  125. package/dist/esm/components/sidebar/CSidebar.js.map +1 -1
  126. package/dist/esm/components/smart-pagination/CSmartPagination.d.ts +4 -12
  127. package/dist/esm/components/smart-pagination/CSmartPagination.js.map +1 -1
  128. package/dist/esm/components/smart-table/CSmartTableHead.js +13 -26
  129. package/dist/esm/components/smart-table/CSmartTableHead.js.map +1 -1
  130. package/dist/esm/components/smart-table/types.d.ts +1 -1
  131. package/dist/esm/components/time-picker/CTimePicker.d.ts +1 -1
  132. package/dist/esm/components/time-picker/CTimePicker.js.map +1 -1
  133. package/dist/esm/components/time-picker/types.d.ts +5 -0
  134. package/dist/esm/components/time-picker/utils.d.ts +8 -11
  135. package/dist/esm/components/time-picker/utils.js +8 -4
  136. package/dist/esm/components/time-picker/utils.js.map +1 -1
  137. package/dist/esm/components/tooltip/CTooltip.d.ts +67 -15
  138. package/dist/esm/components/tooltip/CTooltip.js +8 -21
  139. package/dist/esm/components/tooltip/CTooltip.js.map +1 -1
  140. package/dist/esm/hooks/index.d.ts +2 -1
  141. package/dist/esm/hooks/useClipboard.d.ts +12 -0
  142. package/dist/esm/hooks/useClipboard.js +52 -0
  143. package/dist/esm/hooks/useClipboard.js.map +1 -0
  144. package/dist/esm/index.js +1 -0
  145. package/dist/esm/index.js.map +1 -1
  146. package/dist/esm/node_modules/react-device-detect/dist/lib.js +1 -1
  147. package/dist/esm/node_modules/react-device-detect/dist/lib.js.map +1 -1
  148. package/dist/esm/node_modules/tslib/tslib.es6.js +39 -1
  149. package/dist/esm/node_modules/tslib/tslib.es6.js.map +1 -1
  150. package/dist/esm/utils/index.d.ts +2 -1
  151. package/dist/esm/utils/mergeClassNames.d.ts +2 -0
  152. package/package.json +12 -10
  153. package/src/components/accordion/CAccordionBody.tsx +3 -3
  154. package/src/components/accordion/CAccordionButton.tsx +3 -2
  155. package/src/components/accordion/CAccordionItem.tsx +14 -5
  156. package/src/components/accordion/__tests__/__snapshots__/CAccordionButton.spec.tsx.snap +0 -2
  157. package/src/components/accordion/__tests__/__snapshots__/CAccordionHeader.spec.tsx.snap +0 -2
  158. package/src/components/badge/CBadge.tsx +1 -1
  159. package/src/components/calendar/CCalendar.tsx +154 -489
  160. package/src/components/calendar/CCalendarNavigation.tsx +120 -0
  161. package/src/components/calendar/CCalendarPanel.tsx +306 -0
  162. package/src/components/calendar/types.ts +5 -0
  163. package/src/components/calendar/utils.ts +414 -109
  164. package/src/components/carousel/__tests__/CCarousel.spec.tsx +1 -2
  165. package/src/components/date-picker/CDatePicker.tsx +1 -1
  166. package/src/components/date-range-picker/CDateRangePicker.tsx +2 -4
  167. package/src/components/date-range-picker/utils.ts +23 -3
  168. package/src/components/dropdown/CDropdown.tsx +106 -26
  169. package/src/components/dropdown/CDropdownMenu.tsx +0 -1
  170. package/src/components/dropdown/CDropdownToggle.tsx +1 -1
  171. package/src/components/dropdown/__tests__/CDropdown.spec.tsx +43 -19
  172. package/src/components/modal/CModal.tsx +0 -2
  173. package/src/components/modal/__tests__/CModal.spec.tsx +33 -25
  174. package/src/components/nav/CNavGroup.tsx +5 -1
  175. package/src/components/nav/__tests__/__snapshots__/CNavGroup.spec.tsx.snap +4 -1
  176. package/src/components/popover/CPopover.tsx +103 -43
  177. package/src/components/popover/__tests__/CPopover.spec.tsx +1 -1
  178. package/src/components/popover/__tests__/__snapshots__/CPopover.spec.tsx.snap +2 -3
  179. package/src/components/progress/CProgress.tsx +1 -1
  180. package/src/components/range-slider/CRangeSlider.tsx +7 -2
  181. package/src/components/sidebar/CSidebar.tsx +15 -5
  182. package/src/components/smart-pagination/CSmartPagination.tsx +4 -12
  183. package/src/components/smart-table/CSmartTableHead.tsx +10 -34
  184. package/src/components/smart-table/types.ts +7 -1
  185. package/src/components/time-picker/CTimePicker.tsx +3 -3
  186. package/src/components/time-picker/types.ts +7 -0
  187. package/src/components/time-picker/utils.ts +15 -13
  188. package/src/components/tooltip/CTooltip.tsx +94 -38
  189. package/src/components/tooltip/__tests__/__snapshots__/CTooltip.spec.tsx.snap +0 -1
  190. package/src/hooks/index.ts +2 -0
  191. package/src/hooks/useClipboard.ts +38 -0
  192. package/src/utils/index.ts +2 -0
  193. package/src/utils/mergeClassNames.ts +25 -0
@@ -0,0 +1,120 @@
1
+ import React, { forwardRef, ReactNode } from 'react'
2
+ import { CButton } from '../button/CButton'
3
+ import type { ViewTypes } from './types'
4
+
5
+ export interface CCalendarNavigationProps {
6
+ ariaNavNextMonthLabel?: string
7
+ ariaNavNextYearLabel?: string
8
+ ariaNavPrevMonthLabel?: string
9
+ ariaNavPrevYearLabel?: string
10
+ calendarDate?: Date
11
+ locale?: string
12
+ navigation?: boolean
13
+ navNextDoubleIcon?: ReactNode
14
+ navNextIcon?: ReactNode
15
+ navPrevDoubleIcon?: ReactNode
16
+ navPrevIcon?: ReactNode
17
+ navYearFirst?: boolean | undefined
18
+ onMonthClick: () => void
19
+ onNavigationClick: (direction: string, double?: boolean) => void
20
+ onYearClick: () => void
21
+ view: ViewTypes
22
+ }
23
+
24
+ export const CCalendarNavigation = forwardRef<HTMLDivElement, CCalendarNavigationProps>(
25
+ (
26
+ {
27
+ ariaNavNextMonthLabel,
28
+ ariaNavNextYearLabel,
29
+ ariaNavPrevMonthLabel,
30
+ ariaNavPrevYearLabel,
31
+ calendarDate,
32
+ locale,
33
+ navigation,
34
+ navNextDoubleIcon,
35
+ navNextIcon,
36
+ navPrevDoubleIcon,
37
+ navPrevIcon,
38
+ navYearFirst,
39
+ onMonthClick,
40
+ onNavigationClick,
41
+ onYearClick,
42
+ view,
43
+ },
44
+ ref,
45
+ ) => {
46
+ return (
47
+ <div className="calendar-nav" ref={ref}>
48
+ {navigation && (
49
+ <div className="calendar-nav-prev">
50
+ <CButton
51
+ color="transparent"
52
+ size="sm"
53
+ aria-label={ariaNavPrevYearLabel}
54
+ onClick={() => onNavigationClick('prev', true)}
55
+ >
56
+ {navPrevDoubleIcon ?? (
57
+ <span className="calendar-nav-icon calendar-nav-icon-double-prev" />
58
+ )}
59
+ </CButton>
60
+ {view === 'days' && (
61
+ <CButton
62
+ color="transparent"
63
+ size="sm"
64
+ aria-label={ariaNavPrevMonthLabel}
65
+ onClick={() => onNavigationClick('prev')}
66
+ >
67
+ {navPrevIcon ?? <span className="calendar-nav-icon calendar-nav-icon-prev" />}
68
+ </CButton>
69
+ )}
70
+ </div>
71
+ )}
72
+ <div
73
+ className="calendar-nav-date"
74
+ aria-live="polite"
75
+ {...(navYearFirst && { style: { display: 'flex', justifyContent: 'center' } })}
76
+ >
77
+ {view === 'days' && (
78
+ <CButton color="transparent" size="sm" onClick={() => navigation && onMonthClick()}>
79
+ {calendarDate && calendarDate.toLocaleDateString(locale, { month: 'long' })}
80
+ </CButton>
81
+ )}
82
+ <CButton
83
+ color="transparent"
84
+ size="sm"
85
+ onClick={() => navigation && onYearClick()}
86
+ {...(navYearFirst && { style: { order: '-1' } })}
87
+ >
88
+ {calendarDate && calendarDate.toLocaleDateString(locale, { year: 'numeric' })}
89
+ </CButton>
90
+ </div>
91
+ {navigation && (
92
+ <div className="calendar-nav-next">
93
+ {view === 'days' && (
94
+ <CButton
95
+ color="transparent"
96
+ size="sm"
97
+ aria-label={ariaNavNextMonthLabel}
98
+ onClick={() => onNavigationClick('next')}
99
+ >
100
+ {navNextIcon ?? <span className="calendar-nav-icon calendar-nav-icon-next" />}
101
+ </CButton>
102
+ )}
103
+ <CButton
104
+ color="transparent"
105
+ size="sm"
106
+ aria-label={ariaNavNextYearLabel}
107
+ onClick={() => onNavigationClick('next', true)}
108
+ >
109
+ {navNextDoubleIcon ?? (
110
+ <span className="calendar-nav-icon calendar-nav-icon-double-next" />
111
+ )}
112
+ </CButton>
113
+ </div>
114
+ )}
115
+ </div>
116
+ )
117
+ },
118
+ )
119
+
120
+ CCalendarNavigation.displayName = 'CCalendarNavigation'
@@ -0,0 +1,306 @@
1
+ import React, { forwardRef, KeyboardEvent, useEffect, useState } from 'react'
2
+ import classNames from 'classnames'
3
+
4
+ import {
5
+ convertToDateObject,
6
+ createGroupsInArray,
7
+ getMonthDetails,
8
+ getMonthsNames,
9
+ getYears,
10
+ isDateDisabled,
11
+ isDateInRange,
12
+ isDateSelected,
13
+ isMonthDisabled,
14
+ isMonthInRange,
15
+ isMonthSelected,
16
+ isToday,
17
+ isYearDisabled,
18
+ isYearInRange,
19
+ isYearSelected,
20
+ } from './utils'
21
+ import type { DisabledDate, SelectionTypes, ViewTypes } from './types'
22
+
23
+ export interface CCalendarPanelProps {
24
+ calendarDate: Date
25
+ dayFormat?: 'numeric' | '2-digit' | ((date: Date) => string | number)
26
+ disabledDates?: DisabledDate | DisabledDate[]
27
+ endDate: Date | null
28
+ firstDayOfWeek: number
29
+ hoverDate: Date | null
30
+ locale: string
31
+ maxDate: Date | null
32
+ minDate: Date | null
33
+ onCalendarClick: (date: Date) => void
34
+ onCalendarKeyDown: (event: KeyboardEvent<HTMLDivElement>, date: Date) => void
35
+ onCalendarMouseEnter: (date: Date) => void
36
+ onCalendarMouseLeave: () => void
37
+ order: number
38
+ selectAdjacementDays: boolean
39
+ selectEndDate: boolean | undefined
40
+ selectionType: SelectionTypes
41
+ showAdjacementDays: boolean
42
+ showWeekNumber: boolean
43
+ startDate: Date | null
44
+ view: ViewTypes
45
+ weekdayFormat: number | 'long' | 'narrow' | 'short' | ((date: Date) => string | number)
46
+ weekNumbersLabel: string | undefined
47
+ }
48
+
49
+ export const CCalendarPanel = forwardRef<HTMLTableElement, CCalendarPanelProps>(
50
+ (
51
+ {
52
+ calendarDate,
53
+ dayFormat,
54
+ disabledDates,
55
+ endDate,
56
+ firstDayOfWeek,
57
+ hoverDate,
58
+ locale,
59
+ maxDate,
60
+ minDate,
61
+ onCalendarClick,
62
+ onCalendarKeyDown,
63
+ onCalendarMouseEnter,
64
+ onCalendarMouseLeave,
65
+ selectAdjacementDays,
66
+ selectEndDate,
67
+ selectionType,
68
+ showWeekNumber,
69
+ showAdjacementDays,
70
+ startDate,
71
+ view,
72
+ weekdayFormat,
73
+ weekNumbersLabel,
74
+ },
75
+ ref,
76
+ ) => {
77
+ const [listOfMonths, setListOfMonths] = useState<string[][]>([])
78
+
79
+ useEffect(() => {
80
+ setListOfMonths(createGroupsInArray(getMonthsNames(locale), 4))
81
+ }, [])
82
+
83
+ const monthDetails = getMonthDetails(
84
+ calendarDate.getFullYear(),
85
+ calendarDate.getMonth(),
86
+ firstDayOfWeek,
87
+ )
88
+ const listOfYears = createGroupsInArray(getYears(calendarDate.getFullYear()), 4)
89
+ const weekDays = monthDetails[0].days
90
+
91
+ return (
92
+ <table ref={ref}>
93
+ {view === 'days' && (
94
+ <thead>
95
+ <tr>
96
+ {showWeekNumber && (
97
+ <th className="calendar-cell">
98
+ <div className="calendar-header-cell-inner">{weekNumbersLabel}</div>
99
+ </th>
100
+ )}
101
+ {weekDays.map(({ date }: { date: Date }, idx: number) => (
102
+ <th
103
+ className="calendar-cell"
104
+ abbr={date.toLocaleDateString(locale, { weekday: 'long' })}
105
+ key={idx}
106
+ >
107
+ <div className="calendar-header-cell-inner">
108
+ {typeof weekdayFormat === 'function'
109
+ ? weekdayFormat(date)
110
+ : typeof weekdayFormat === 'string'
111
+ ? date.toLocaleDateString(locale, { weekday: weekdayFormat })
112
+ : date
113
+ .toLocaleDateString(locale, { weekday: 'long' })
114
+ .slice(0, weekdayFormat)}
115
+ </div>
116
+ </th>
117
+ ))}
118
+ </tr>
119
+ </thead>
120
+ )}
121
+ <tbody>
122
+ {view === 'days' &&
123
+ monthDetails.map((week, index) => {
124
+ const date = convertToDateObject(
125
+ week.weekNumber === 0
126
+ ? `${calendarDate.getFullYear()}W53`
127
+ : `${calendarDate.getFullYear()}W${week.weekNumber}`,
128
+ selectionType,
129
+ )
130
+ const isDisabled = isDateDisabled(date, minDate, maxDate, disabledDates)
131
+ const isSelected = isDateSelected(date, startDate, endDate)
132
+ const current = week.days.some((day) => day.month === 'current')
133
+ return (
134
+ <tr
135
+ className={classNames('calendar-row', {
136
+ disabled: isDisabled,
137
+ range: selectionType === 'week' && isDateInRange(date, startDate, endDate),
138
+ 'range-hover':
139
+ selectionType === 'week' && hoverDate && selectEndDate
140
+ ? isDateInRange(date, startDate, hoverDate)
141
+ : isDateInRange(date, hoverDate, endDate),
142
+ selected: isSelected,
143
+ })}
144
+ key={index}
145
+ tabIndex={selectionType === 'week' && current && !isDisabled ? 0 : -1}
146
+ {...(isSelected && { 'aria-selected': true })}
147
+ {...(selectionType === 'week' &&
148
+ !isDisabled && {
149
+ onBlur: () => onCalendarMouseLeave(),
150
+ onClick: () => onCalendarClick(date),
151
+ onFocus: () => onCalendarMouseEnter(date),
152
+ onKeyDown: (event) => onCalendarKeyDown(event, date),
153
+ onMouseEnter: () => onCalendarMouseEnter(date),
154
+ onMouseLeave: () => onCalendarMouseLeave(),
155
+ })}
156
+ >
157
+ {showWeekNumber && (
158
+ <th className="calendar-cell-week-number">
159
+ {week.weekNumber === 0 ? 53 : week.weekNumber}
160
+ </th>
161
+ )}
162
+ {week.days.map(({ date, month }: { date: Date; month: string }, idx: number) => {
163
+ const isDisabled = isDateDisabled(date, minDate, maxDate, disabledDates)
164
+ const isSelected = isDateSelected(date, startDate, endDate)
165
+ return month === 'current' || showAdjacementDays ? (
166
+ <td
167
+ className={classNames('calendar-cell', {
168
+ ...(selectionType === 'day' && {
169
+ clickable: month !== 'current' && selectAdjacementDays,
170
+ disabled: isDisabled,
171
+ 'range-hover':
172
+ month === 'current' &&
173
+ (hoverDate && selectEndDate
174
+ ? isDateInRange(date, startDate, hoverDate)
175
+ : isDateInRange(date, hoverDate, endDate)),
176
+ range: month === 'current' && isDateInRange(date, startDate, endDate),
177
+ selected: isSelected,
178
+ }),
179
+ [month]: true,
180
+ today: month === 'current' && isToday(date),
181
+ })}
182
+ key={idx}
183
+ tabIndex={
184
+ selectionType === 'day' &&
185
+ (month === 'current' || selectAdjacementDays) &&
186
+ !isDisabled
187
+ ? 0
188
+ : -1
189
+ }
190
+ title={date.toLocaleDateString(locale)}
191
+ {...(isSelected && { 'aria-selected': true })}
192
+ {...(selectionType === 'day' &&
193
+ (month === 'current' || selectAdjacementDays) && {
194
+ onBlur: () => onCalendarMouseLeave(),
195
+ onClick: () => onCalendarClick(date),
196
+ onFocus: () => onCalendarMouseEnter(date),
197
+ onKeyDown: (event) => onCalendarKeyDown(event, date),
198
+ onMouseEnter: () => onCalendarMouseEnter(date),
199
+ onMouseLeave: () => onCalendarMouseLeave(),
200
+ })}
201
+ {...(month !== 'current' &&
202
+ !selectAdjacementDays && {
203
+ onMouseEnter: () => onCalendarMouseLeave(),
204
+ })}
205
+ >
206
+ <div className="calendar-cell-inner">
207
+ {typeof dayFormat === 'function'
208
+ ? dayFormat(date)
209
+ : date.toLocaleDateString(locale, { day: dayFormat })}
210
+ </div>
211
+ </td>
212
+ ) : (
213
+ <td key={idx}></td>
214
+ )
215
+ })}
216
+ </tr>
217
+ )
218
+ })}
219
+ {view === 'months' &&
220
+ listOfMonths.map((row, index) => {
221
+ return (
222
+ <tr key={index}>
223
+ {row.map((month, idx) => {
224
+ const monthNumber = index * 3 + idx
225
+ const date = new Date(calendarDate.getFullYear(), monthNumber, 1)
226
+ const isDisabled = isMonthDisabled(date, minDate, maxDate, disabledDates)
227
+ const isSelected = isMonthSelected(date, startDate, endDate)
228
+ return (
229
+ <td
230
+ className={classNames('calendar-cell', {
231
+ disabled: isDisabled,
232
+ selected: isSelected,
233
+ 'range-hover':
234
+ selectionType === 'month' &&
235
+ (hoverDate && selectEndDate
236
+ ? isMonthInRange(date, startDate, hoverDate)
237
+ : isMonthInRange(date, hoverDate, endDate)),
238
+ range: isMonthInRange(date, startDate, endDate),
239
+ })}
240
+ key={idx}
241
+ tabIndex={isDisabled ? -1 : 0}
242
+ {...(isSelected && { 'aria-selected': true })}
243
+ {...(!isDisabled && {
244
+ onBlur: () => onCalendarMouseLeave(),
245
+ onClick: () => onCalendarClick(date),
246
+ onFocus: () => onCalendarMouseEnter(date),
247
+ onKeyDown: (event) => onCalendarKeyDown(event, date),
248
+ onMouseEnter: () => onCalendarMouseEnter(date),
249
+ onMouseLeave: () => onCalendarMouseLeave(),
250
+ })}
251
+ >
252
+ <div className="calendar-cell-inner">{month}</div>
253
+ </td>
254
+ )
255
+ })}
256
+ </tr>
257
+ )
258
+ })}
259
+ {view === 'years' &&
260
+ listOfYears.map((row, index) => {
261
+ return (
262
+ <tr key={index}>
263
+ {row.map((year, idx) => {
264
+ const date = new Date(year, 0, 1)
265
+ const isDisabled = isYearDisabled(date, minDate, maxDate, disabledDates)
266
+ const isSelected = isYearSelected(date, startDate, endDate)
267
+ return (
268
+ <td
269
+ className={classNames('calendar-cell year', {
270
+ disabled: isDisabled,
271
+ selected: isSelected,
272
+ 'range-hover':
273
+ selectionType === 'year' &&
274
+ (hoverDate && selectEndDate
275
+ ? isYearInRange(date, startDate, hoverDate)
276
+ : isYearInRange(date, hoverDate, endDate)),
277
+ range: isYearInRange(date, startDate, endDate),
278
+ })}
279
+ key={idx}
280
+ tabIndex={isDisabled ? -1 : 0}
281
+ {...(isSelected && { 'aria-selected': true })}
282
+ {...(!isDisabled && {
283
+ onBlur: () => onCalendarMouseLeave(),
284
+ onClick: () => onCalendarClick(date),
285
+ onFocus: () => onCalendarMouseEnter(date),
286
+ onKeyDown: (event) => onCalendarKeyDown(event, date),
287
+ onMouseEnter: () => onCalendarMouseEnter(date),
288
+ onMouseLeave: () => onCalendarMouseLeave(),
289
+ })}
290
+ >
291
+ <div className="calendar-cell-inner">
292
+ {new Date(year, 0, 1).toLocaleDateString(locale, { year: 'numeric' })}
293
+ </div>
294
+ </td>
295
+ )
296
+ })}
297
+ </tr>
298
+ )
299
+ })}
300
+ </tbody>
301
+ </table>
302
+ )
303
+ },
304
+ )
305
+
306
+ CCalendarPanel.displayName = 'CCalendarPanel'
@@ -0,0 +1,5 @@
1
+ export type DisabledDate = ((date: Date) => boolean) | Date | Date[]
2
+
3
+ export type SelectionTypes = 'day' | 'week' | 'month' | 'year'
4
+
5
+ export type ViewTypes = 'days' | 'months' | 'years'