@coreui/react-pro 4.2.0-beta.0 → 4.2.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 (163) hide show
  1. package/README.md +1 -1
  2. package/dist/components/accordion/index.d.ts +7 -0
  3. package/dist/components/alert/index.d.ts +4 -0
  4. package/dist/components/avatar/index.d.ts +2 -0
  5. package/dist/components/backdrop/index.d.ts +2 -0
  6. package/dist/components/badge/index.d.ts +2 -0
  7. package/dist/components/breadcrumb/index.d.ts +3 -0
  8. package/dist/components/button/index.d.ts +2 -0
  9. package/dist/components/button-group/index.d.ts +3 -0
  10. package/dist/components/calendar/CCalendar.d.ts +36 -12
  11. package/dist/components/callout/index.d.ts +2 -0
  12. package/dist/components/card/index.d.ts +12 -0
  13. package/dist/components/carousel/index.d.ts +4 -0
  14. package/dist/components/close-button/index.d.ts +2 -0
  15. package/dist/components/collapse/index.d.ts +2 -0
  16. package/dist/components/date-picker/CDatePicker.d.ts +13 -0
  17. package/dist/components/date-picker/index.d.ts +2 -0
  18. package/dist/components/date-range-picker/CDateRangePicker.d.ts +93 -0
  19. package/dist/components/date-range-picker/index.d.ts +2 -0
  20. package/dist/components/datepicker/index.d.ts +2 -0
  21. package/dist/components/daterangepicker/CDateRangePicker.d.ts +26 -11
  22. package/dist/components/daterangepicker/index.d.ts +2 -0
  23. package/dist/components/dropdown/index.d.ts +8 -0
  24. package/dist/components/footer/index.d.ts +2 -0
  25. package/dist/components/form/CForm.d.ts +2 -2
  26. package/dist/components/form/CFormCheck.d.ts +2 -1
  27. package/dist/components/form/CFormControlValidation.d.ts +46 -0
  28. package/dist/components/form/CFormControlWrapper.d.ts +31 -0
  29. package/dist/components/form/CFormInput.d.ts +6 -9
  30. package/dist/components/form/CFormRange.d.ts +7 -1
  31. package/dist/components/form/CFormSelect.d.ts +3 -10
  32. package/dist/components/form/CFormTextarea.d.ts +2 -9
  33. package/dist/components/form/index.d.ts +14 -0
  34. package/dist/components/grid/index.d.ts +4 -0
  35. package/dist/components/header/index.d.ts +7 -0
  36. package/dist/components/image/index.d.ts +2 -0
  37. package/dist/components/index.d.ts +41 -0
  38. package/dist/components/link/index.d.ts +2 -0
  39. package/dist/components/list-group/index.d.ts +3 -0
  40. package/dist/components/loading-button/index.d.ts +2 -0
  41. package/dist/components/modal/CModal.d.ts +3 -0
  42. package/dist/components/modal/index.d.ts +8 -0
  43. package/dist/components/multi-select/index.d.ts +2 -0
  44. package/dist/components/nav/index.d.ts +7 -0
  45. package/dist/components/navbar/index.d.ts +6 -0
  46. package/dist/components/offcanvas/index.d.ts +5 -0
  47. package/dist/components/pagination/index.d.ts +4 -0
  48. package/dist/components/picker/CPicker.d.ts +52 -7
  49. package/dist/components/placeholder/index.d.ts +2 -0
  50. package/dist/components/popover/CPopover.d.ts +2 -2
  51. package/dist/components/popover/index.d.ts +2 -0
  52. package/dist/components/progress/index.d.ts +3 -0
  53. package/dist/components/sidebar/index.d.ts +7 -0
  54. package/dist/components/smart-table/index.d.ts +2 -0
  55. package/dist/components/spinner/index.d.ts +2 -0
  56. package/dist/components/table/index.d.ts +9 -0
  57. package/dist/components/tabs/index.d.ts +3 -0
  58. package/dist/components/time-picker/CTimePicker.d.ts +45 -0
  59. package/dist/components/time-picker/CTimePickerRollCol.d.ts +11 -0
  60. package/dist/components/time-picker/index.d.ts +2 -0
  61. package/dist/components/timepicker/CTimePicker.d.ts +9 -13
  62. package/dist/components/timepicker/index.d.ts +2 -0
  63. package/dist/components/toast/index.d.ts +6 -0
  64. package/dist/components/tooltip/CTooltip.d.ts +6 -2
  65. package/dist/components/tooltip/index.d.ts +2 -0
  66. package/dist/index.d.ts +0 -128
  67. package/dist/index.es.js +8368 -5764
  68. package/dist/index.es.js.map +1 -1
  69. package/dist/index.js +8367 -5764
  70. package/dist/index.js.map +1 -1
  71. package/dist/{components/calendar/CCalendar.utils.d.ts → utils/calendar.d.ts} +5 -2
  72. package/dist/utils/hooks/useStateWithCallback.d.ts +2 -1
  73. package/dist/utils/time.d.ts +21 -0
  74. package/package.json +14 -11
  75. package/src/components/accordion/__tests__/__snapshots__/CAccordionButton.spec.tsx.snap +2 -0
  76. package/src/components/accordion/__tests__/__snapshots__/CAccordionHeader.spec.tsx.snap +2 -0
  77. package/src/components/accordion/index.ts +15 -0
  78. package/src/components/alert/CAlert.tsx +14 -3
  79. package/src/components/alert/index.ts +5 -0
  80. package/src/components/avatar/index.ts +3 -0
  81. package/src/components/backdrop/CBackdrop.tsx +10 -3
  82. package/src/components/backdrop/index.ts +3 -0
  83. package/src/components/badge/index.ts +3 -0
  84. package/src/components/breadcrumb/index.ts +4 -0
  85. package/src/components/button/index.ts +3 -0
  86. package/src/components/button-group/index.ts +4 -0
  87. package/src/components/calendar/CCalendar.tsx +221 -131
  88. package/src/components/calendar/__tests__/CCalendar.spec.tsx +9 -0
  89. package/src/components/calendar/__tests__/__snapshots__/CCalendar.spec.tsx.snap +573 -0
  90. package/src/components/callout/index.ts +3 -0
  91. package/src/components/card/index.ts +25 -0
  92. package/src/components/carousel/index.ts +5 -0
  93. package/src/components/close-button/index.ts +3 -0
  94. package/src/components/collapse/CCollapse.tsx +1 -0
  95. package/src/components/collapse/index.ts +3 -0
  96. package/src/components/{datepicker → date-picker}/CDatePicker.tsx +3 -2
  97. package/src/components/date-picker/__tests__/CDatePicker.spec.tsx +9 -0
  98. package/src/components/date-picker/__tests__/__snapshots__/CDatePicker.spec.tsx.snap +617 -0
  99. package/src/components/date-picker/index.ts +3 -0
  100. package/src/components/date-range-picker/CDateRangePicker.tsx +495 -0
  101. package/src/components/date-range-picker/__tests__/CDateRangePicker.spec.tsx +9 -0
  102. package/src/components/date-range-picker/__tests__/__snapshots__/CDateRangePicker.spec.tsx.snap +1201 -0
  103. package/src/components/date-range-picker/index.ts +3 -0
  104. package/src/components/dropdown/CDropdownItem.tsx +1 -1
  105. package/src/components/dropdown/CDropdownMenu.tsx +14 -14
  106. package/src/components/dropdown/index.ts +17 -0
  107. package/src/components/footer/index.ts +3 -0
  108. package/src/components/form/CForm.tsx +2 -2
  109. package/src/components/form/CFormCheck.tsx +32 -7
  110. package/src/components/form/CFormControlValidation.tsx +97 -0
  111. package/src/components/form/CFormControlWrapper.tsx +85 -0
  112. package/src/components/form/CFormInput.tsx +75 -19
  113. package/src/components/form/CFormRange.tsx +18 -4
  114. package/src/components/form/CFormSelect.tsx +60 -32
  115. package/src/components/form/CFormTextarea.tsx +45 -17
  116. package/src/components/form/index.ts +29 -0
  117. package/src/components/grid/index.ts +5 -0
  118. package/src/components/header/index.ts +8 -0
  119. package/src/components/image/index.ts +3 -0
  120. package/src/components/index.ts +41 -0
  121. package/src/components/link/index.ts +3 -0
  122. package/src/components/list-group/index.ts +4 -0
  123. package/src/components/loading-button/index.ts +3 -0
  124. package/src/components/modal/CModal.tsx +3 -2
  125. package/src/components/modal/index.ts +9 -0
  126. package/src/components/multi-select/CMultiSelect.tsx +46 -38
  127. package/src/components/multi-select/index.ts +3 -0
  128. package/src/components/nav/CNavGroup.tsx +1 -0
  129. package/src/components/nav/index.ts +8 -0
  130. package/src/components/navbar/index.ts +7 -0
  131. package/src/components/offcanvas/COffcanvas.tsx +1 -0
  132. package/src/components/offcanvas/index.ts +6 -0
  133. package/src/components/pagination/index.ts +5 -0
  134. package/src/components/picker/CPicker.tsx +104 -32
  135. package/src/components/picker/__tests__/CPicker.spec.tsx +9 -0
  136. package/src/components/picker/__tests__/__snapshots__/CPicker.spec.tsx.snap +23 -0
  137. package/src/components/placeholder/index.ts +3 -0
  138. package/src/components/popover/CPopover.tsx +59 -57
  139. package/src/components/popover/index.ts +3 -0
  140. package/src/components/progress/index.ts +4 -0
  141. package/src/components/sidebar/index.ts +8 -0
  142. package/src/components/smart-table/CSmartTable.tsx +2 -2
  143. package/src/components/smart-table/index.ts +3 -0
  144. package/src/components/spinner/index.ts +3 -0
  145. package/src/components/table/index.ts +19 -0
  146. package/src/components/tabs/CTabPane.tsx +7 -3
  147. package/src/components/tabs/index.ts +4 -0
  148. package/src/components/{timepicker → time-picker}/CTimePicker.tsx +71 -98
  149. package/src/components/{timepicker → time-picker}/CTimePickerRollCol.tsx +7 -1
  150. package/src/components/time-picker/__tests__/CTimePicker.spec.tsx +9 -0
  151. package/src/components/time-picker/index.ts +3 -0
  152. package/src/components/toast/CToast.tsx +6 -1
  153. package/src/components/toast/index.ts +7 -0
  154. package/src/components/tooltip/CTooltip.tsx +63 -45
  155. package/src/components/tooltip/index.ts +3 -0
  156. package/src/index.ts +0 -258
  157. package/src/{components/calendar/CCalendar.utils.ts → utils/calendar.ts} +97 -10
  158. package/src/utils/hooks/useStateWithCallback.ts +6 -3
  159. package/src/utils/time.ts +84 -0
  160. package/dist/components/dropdown/CDropdownToggleCustom.d.ts +0 -15
  161. package/dist/components/timepicker/CTimePicker.utils.d.ts +0 -4
  162. package/src/components/daterangepicker/CDateRangePicker.tsx +0 -366
  163. package/src/components/timepicker/CTimePicker.utils.ts +0 -27
@@ -0,0 +1,495 @@
1
+ import React, { forwardRef, ReactNode, useEffect, useRef, useState } from 'react'
2
+
3
+ import classNames from 'classnames'
4
+ import { format as dateFormat } from 'date-fns'
5
+ import PropTypes from 'prop-types'
6
+ import { isMobile } from 'react-device-detect'
7
+
8
+ import { CButton } from '../button'
9
+ import { CCalendar, CCalendarProps } from '../calendar/CCalendar'
10
+ import { CFormInput, CInputGroup, CInputGroupText } from '../form'
11
+ import { CPicker, CPickerProps } from '../picker/CPicker'
12
+ import { CTimePicker } from '../time-picker/CTimePicker'
13
+
14
+ import { getLocalDateFromString } from '../../utils/calendar'
15
+
16
+ import { Colors } from '../Types'
17
+ export interface CDateRangePickerProps
18
+ extends Omit<CPickerProps, 'autoClose' | 'component' | 'dark' | 'placeholder' | 'variant'>,
19
+ Omit<CCalendarProps, 'onCalendarCellHover' | 'onCalendarDateChange'> {
20
+ /**
21
+ * The number of calendars that render on desktop devices.
22
+ */
23
+ calendars?: number
24
+ /**
25
+ * A string of all className you want applied to the component.
26
+ */
27
+ className?: string
28
+ /**
29
+ * Toggle visibility or set the content of the cleaner button.
30
+ */
31
+ cleaner?: boolean
32
+ /**
33
+ * Set date format.
34
+ * We use date-fns to format dates. Visit https://date-fns.org/v2.28.0/docs/format to check accepted patterns.
35
+ */
36
+ format?: string
37
+ /**
38
+ * Toggle visibility or set the content of the input indicator.
39
+ */
40
+ indicator?: ReactNode | boolean
41
+ /**
42
+ * Toggle the readonly state for the component.
43
+ */
44
+ inputReadOnly?: boolean
45
+ /**
46
+ * Specifies short hints that are visible in start date and end date inputs.
47
+ */
48
+ placeholder?: string | string[]
49
+ /**
50
+ * @ignore
51
+ */
52
+ range?: boolean
53
+ /**
54
+ * Predefined date ranges the user can select from.
55
+ */
56
+ ranges?: object
57
+ /**
58
+ * Sets the color context of the cancel button to one of CoreUI’s themed colors.
59
+ *
60
+ * @type 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | string
61
+ */
62
+ rangesButtonsColor?: Colors
63
+ /**
64
+ * Size the ranges button small or large.
65
+ */
66
+ rangesButtonsSize?: 'sm' | 'lg'
67
+ /**
68
+ * Set the ranges button variant to an outlined button or a ghost button.
69
+ */
70
+ rangesButtonsVariant?: 'outline' | 'ghost'
71
+ /**
72
+ * Default icon or character character that separates two dates.
73
+ */
74
+ separator?: ReactNode | boolean
75
+ /**
76
+ * Size the component small or large.
77
+ */
78
+ size?: 'sm' | 'lg'
79
+ /**
80
+ * Provide an additional time selection by adding select boxes to choose times.
81
+ */
82
+ timepicker?: boolean
83
+ /**
84
+ * Toggle visibility or set the content of today button.
85
+ *
86
+ * @default 'Today'
87
+ */
88
+ todayButton?: boolean | ReactNode
89
+ /**
90
+ * Sets the color context of the today button to one of CoreUI’s themed colors.
91
+ *
92
+ * @type 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | string
93
+ * @default 'primary'
94
+ */
95
+ todayButtonColor?: Colors
96
+ /**
97
+ * Size the today button small or large.
98
+ *
99
+ * @default 'sm'
100
+ */
101
+ todayButtonSize?: 'sm' | 'lg'
102
+ /**
103
+ * Set the today button variant to an outlined button or a ghost button.
104
+ */
105
+ todayButtonVariant?: 'outline' | 'ghost'
106
+ }
107
+
108
+ export const CDateRangePicker = forwardRef<HTMLDivElement | HTMLLIElement, CDateRangePickerProps>(
109
+ (
110
+ {
111
+ calendars = 2,
112
+ className,
113
+ cleaner = true,
114
+ calendarDate,
115
+ indicator = true,
116
+ disabled,
117
+ disabledDates,
118
+ endDate,
119
+ firstDayOfWeek,
120
+ format,
121
+ footer,
122
+ inputReadOnly,
123
+ locale = 'default',
124
+ maxDate,
125
+ minDate,
126
+ navigation,
127
+ onEndDateChange,
128
+ onHide,
129
+ onStartDateChange,
130
+ onShow,
131
+ placeholder = ['Start date', 'End date'],
132
+ range = true,
133
+ ranges,
134
+ rangesButtonsColor = 'secondary',
135
+ rangesButtonsSize,
136
+ rangesButtonsVariant = 'ghost',
137
+ separator = true,
138
+ size,
139
+ startDate,
140
+ timepicker,
141
+ toggler,
142
+ todayButton = 'Today',
143
+ todayButtonColor = 'primary',
144
+ todayButtonSize = 'sm',
145
+ todayButtonVariant,
146
+ visible,
147
+ ...rest
148
+ },
149
+ ref,
150
+ ) => {
151
+ const [_visible, setVisible] = useState(visible)
152
+
153
+ const inputStartRef = useRef<HTMLInputElement>(null)
154
+ const inputEndRef = useRef<HTMLInputElement>(null)
155
+ const [inputStartHoverValue, setInputStartHoverValue] = useState<Date | null>(null)
156
+ const [inputEndHoverValue, setInputEndHoverValue] = useState<Date | null>(null)
157
+
158
+ const [_calendarDate, setCalendarDate] = useState<Date>(
159
+ calendarDate ? new Date(calendarDate) : new Date(),
160
+ )
161
+ const [_startDate, setStartDate] = useState<Date | null>(startDate ? new Date(startDate) : null)
162
+ const [_endDate, setEndDate] = useState<Date | null>(endDate ? new Date(endDate) : null)
163
+ const [initialStartDate, setInitialStartDate] = useState<Date | null>(
164
+ startDate ? new Date(startDate) : null,
165
+ )
166
+ const [initialEndDate, setInitialEndDate] = useState<Date | null>(
167
+ endDate ? new Date(endDate) : null,
168
+ )
169
+ const [_maxDate, setMaxDate] = useState<Date | null>(maxDate ? new Date(maxDate) : null)
170
+ const [_minDate, setMinDate] = useState<Date | null>(minDate ? new Date(minDate) : null)
171
+ const [selectEndDate, setSelectEndDate] = useState(false)
172
+
173
+ useEffect(() => {
174
+ startDate && setCalendarDate(new Date(startDate))
175
+ }, [startDate])
176
+
177
+ useEffect(() => {
178
+ endDate && setCalendarDate(new Date(endDate))
179
+ }, [endDate])
180
+
181
+ useEffect(() => {
182
+ maxDate && setMaxDate(new Date(maxDate))
183
+ }, [maxDate])
184
+
185
+ useEffect(() => {
186
+ minDate && setMinDate(new Date(minDate))
187
+ }, [minDate])
188
+
189
+ useEffect(() => {
190
+ if (inputStartHoverValue) {
191
+ setInputValue(inputStartRef.current, inputStartHoverValue)
192
+ return
193
+ }
194
+
195
+ setInputValue(inputStartRef.current, _startDate)
196
+ }, [inputStartHoverValue, _startDate])
197
+
198
+ useEffect(() => {
199
+ if (inputEndHoverValue) {
200
+ setInputValue(inputEndRef.current, inputEndHoverValue)
201
+ return
202
+ }
203
+
204
+ setInputValue(inputEndRef.current, _endDate)
205
+ }, [inputEndHoverValue, _endDate])
206
+
207
+ const formatDate = (date: Date) => {
208
+ return format
209
+ ? dateFormat(date, format)
210
+ : timepicker
211
+ ? date.toLocaleString(locale)
212
+ : date.toLocaleDateString(locale)
213
+ }
214
+
215
+ const setInputValue = (el: HTMLInputElement | null, date: Date | null) => {
216
+ if (!el) {
217
+ return
218
+ }
219
+
220
+ if (date) {
221
+ el.value = formatDate(date)
222
+ return
223
+ }
224
+
225
+ el.value = ''
226
+ }
227
+
228
+ const handleCalendarCellHover = (date: Date | null) => {
229
+ selectEndDate ? setInputEndHoverValue(date) : setInputStartHoverValue(date)
230
+ }
231
+
232
+ const handleCalendarDateChange = (date: Date, difference?: number) => {
233
+ difference
234
+ ? setCalendarDate(new Date(date.getFullYear(), date.getMonth() - difference, 1))
235
+ : setCalendarDate(date)
236
+ }
237
+
238
+ const handleStartDateChange = (date: Date | null) => {
239
+ setStartDate(date)
240
+ setInputStartHoverValue(null)
241
+ onStartDateChange && onStartDateChange(date, date ? formatDate(date) : undefined)
242
+ }
243
+
244
+ const handleEndDateChange = (date: Date | null) => {
245
+ setEndDate(date)
246
+ setInputEndHoverValue(null)
247
+ onEndDateChange && onEndDateChange(date, date ? formatDate(date) : undefined)
248
+
249
+ if (timepicker !== true && footer !== true) {
250
+ _startDate !== null && setVisible(false)
251
+ }
252
+ }
253
+
254
+ const handleClear = (event: React.MouseEvent<HTMLElement>) => {
255
+ event.stopPropagation()
256
+ setStartDate(null)
257
+ setEndDate(null)
258
+ }
259
+
260
+ const _className = classNames('date-picker', className)
261
+
262
+ const InputGroup = () => (
263
+ <CInputGroup className="picker-input-group" size={size}>
264
+ <CFormInput
265
+ className={classNames({
266
+ hover: inputStartHoverValue,
267
+ })}
268
+ delay={true}
269
+ disabled={disabled}
270
+ placeholder={Array.isArray(placeholder) ? placeholder[0] : placeholder}
271
+ readOnly={inputReadOnly || typeof format === 'string'}
272
+ onChange={(event) => {
273
+ const date = getLocalDateFromString(event.target.value, locale, timepicker)
274
+ if (date instanceof Date && date.getTime()) {
275
+ setCalendarDate(date)
276
+ setStartDate(date)
277
+ }
278
+ }}
279
+ onClick={() => setSelectEndDate(false)}
280
+ ref={inputStartRef}
281
+ />
282
+ {range && separator !== false && (
283
+ <CInputGroupText>
284
+ {typeof separator === 'boolean' ? (
285
+ <span className="picker-input-group-icon date-picker-arrow-icon" />
286
+ ) : (
287
+ separator
288
+ )}
289
+ </CInputGroupText>
290
+ )}
291
+ {range && (
292
+ <CFormInput
293
+ className={classNames({
294
+ hover: inputEndHoverValue,
295
+ })}
296
+ delay={true}
297
+ disabled={disabled}
298
+ placeholder={placeholder[1]}
299
+ readOnly={inputReadOnly || typeof format === 'string'}
300
+ onChange={(event) => {
301
+ const date = getLocalDateFromString(event.target.value, locale, timepicker)
302
+ if (date instanceof Date && date.getTime()) {
303
+ setCalendarDate(date)
304
+ setEndDate(date)
305
+ }
306
+ }}
307
+ onClick={() => setSelectEndDate(true)}
308
+ ref={inputEndRef}
309
+ />
310
+ )}
311
+ {(indicator || cleaner) && (
312
+ <CInputGroupText>
313
+ {indicator && (
314
+ <span className="picker-input-group-indicator">
315
+ {typeof indicator === 'boolean' ? (
316
+ <span className="picker-input-group-icon date-picker-input-icon" />
317
+ ) : (
318
+ indicator
319
+ )}
320
+ </span>
321
+ )}
322
+ {cleaner && _startDate && (
323
+ <span
324
+ className="picker-input-group-cleaner"
325
+ role="button"
326
+ onClick={(event) => handleClear(event)}
327
+ >
328
+ {typeof cleaner === 'boolean' ? (
329
+ <span className="picker-input-group-icon date-picker-cleaner-icon" />
330
+ ) : (
331
+ cleaner
332
+ )}
333
+ </span>
334
+ )}
335
+ </CInputGroupText>
336
+ )}
337
+ </CInputGroup>
338
+ )
339
+
340
+ return (
341
+ <CPicker
342
+ className={_className}
343
+ disabled={disabled}
344
+ footer={footer || timepicker}
345
+ footerContent={
346
+ todayButton && (
347
+ <CButton
348
+ className="me-auto"
349
+ color={todayButtonColor}
350
+ size={todayButtonSize}
351
+ variant={todayButtonVariant}
352
+ onClick={() => {
353
+ const date = new Date()
354
+ handleStartDateChange(date)
355
+ handleEndDateChange(date)
356
+ setCalendarDate(date)
357
+ }}
358
+ >
359
+ {todayButton}
360
+ </CButton>
361
+ )
362
+ }
363
+ toggler={toggler ? toggler : InputGroup()}
364
+ onCancel={() => {
365
+ handleStartDateChange(initialStartDate)
366
+ handleEndDateChange(initialEndDate)
367
+ setVisible(false)
368
+ }}
369
+ onHide={() => {
370
+ onHide && onHide()
371
+ }}
372
+ onShow={() => {
373
+ setInitialStartDate(_startDate)
374
+ setInitialEndDate(_endDate)
375
+ onShow && onShow()
376
+ }}
377
+ visible={_visible}
378
+ {...rest}
379
+ ref={ref}
380
+ >
381
+ <div className="date-picker-body">
382
+ {ranges && (
383
+ <div className="date-picker-ranges">
384
+ {Object.keys(ranges).map((key: string, index: number) => (
385
+ <CButton
386
+ color={rangesButtonsColor}
387
+ key={index}
388
+ onClick={() => {
389
+ setStartDate(ranges[key][0])
390
+ setEndDate(ranges[key][1])
391
+ }}
392
+ size={rangesButtonsSize}
393
+ variant={rangesButtonsVariant}
394
+ >
395
+ {key}
396
+ </CButton>
397
+ ))}
398
+ </div>
399
+ )}
400
+ <CCalendar
401
+ calendarDate={_calendarDate}
402
+ calendars={isMobile ? 1 : calendars}
403
+ className="date-picker-calendars"
404
+ disabledDates={disabledDates}
405
+ endDate={_endDate}
406
+ firstDayOfWeek={firstDayOfWeek}
407
+ locale={locale}
408
+ maxDate={_maxDate}
409
+ minDate={_minDate}
410
+ navigation={navigation}
411
+ range={range}
412
+ selectEndDate={selectEndDate}
413
+ startDate={_startDate}
414
+ onCalendarCellHover={(date) => handleCalendarCellHover(date)}
415
+ onCalendarDateChange={(date) => handleCalendarDateChange(date)}
416
+ onStartDateChange={(date) => handleStartDateChange(date)}
417
+ onEndDateChange={(date) => handleEndDateChange(date)}
418
+ onSelectEndChange={(value) => setSelectEndDate(value)}
419
+ />
420
+ {timepicker && (
421
+ <div className="date-picker-timepickers">
422
+ {isMobile || (range && calendars === 1) ? (
423
+ <>
424
+ <CTimePicker
425
+ container="inline"
426
+ disabled={_startDate === null ? true : false}
427
+ locale={locale}
428
+ onTimeChange={(_, __, date) => handleStartDateChange(date)}
429
+ time={_startDate}
430
+ variant="select"
431
+ />
432
+ <CTimePicker
433
+ container="inline"
434
+ disabled={_endDate === null ? true : false}
435
+ locale={locale}
436
+ onTimeChange={(_, __, date) => handleEndDateChange(date)}
437
+ time={_endDate}
438
+ variant="select"
439
+ />
440
+ </>
441
+ ) : (
442
+ [...Array(calendars)].map((_, index) => (
443
+ <CTimePicker
444
+ container="inline"
445
+ disabled={
446
+ index === 0
447
+ ? _startDate === null
448
+ ? true
449
+ : false
450
+ : _endDate === null
451
+ ? true
452
+ : false
453
+ }
454
+ key={index}
455
+ locale={locale}
456
+ onTimeChange={(_, __, date) =>
457
+ index === 0 ? handleStartDateChange(date) : handleEndDateChange(date)
458
+ }
459
+ time={index === 0 ? _startDate : _endDate}
460
+ variant="select"
461
+ />
462
+ ))
463
+ )}
464
+ </div>
465
+ )}
466
+ </div>
467
+ </CPicker>
468
+ )
469
+ },
470
+ )
471
+
472
+ CDateRangePicker.displayName = 'CDateRangePicker'
473
+
474
+ CDateRangePicker.propTypes = {
475
+ ...CCalendar.propTypes,
476
+ ...CPicker.propTypes,
477
+ calendars: PropTypes.number,
478
+ className: PropTypes.string,
479
+ cleaner: PropTypes.bool,
480
+ indicator: PropTypes.oneOfType([PropTypes.bool, PropTypes.node]),
481
+ inputReadOnly: PropTypes.bool,
482
+ placeholder: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.any)]),
483
+ range: PropTypes.bool,
484
+ ranges: PropTypes.object,
485
+ rangesButtonsColor: CButton.propTypes?.color,
486
+ rangesButtonsSize: CButton.propTypes?.size,
487
+ rangesButtonsVariant: CButton.propTypes?.variant,
488
+ separator: PropTypes.oneOfType([PropTypes.bool, PropTypes.node]),
489
+ size: PropTypes.oneOf(['sm', 'lg']),
490
+ timepicker: PropTypes.bool,
491
+ todayButton: PropTypes.oneOfType([PropTypes.bool, PropTypes.node]),
492
+ todayButtonColor: CButton.propTypes?.color,
493
+ todayButtonSize: CButton.propTypes?.size,
494
+ todayButtonVariant: CButton.propTypes?.variant,
495
+ }
@@ -0,0 +1,9 @@
1
+ import * as React from 'react'
2
+ import { render } from '@testing-library/react'
3
+ import '@testing-library/jest-dom/extend-expect'
4
+ import { CDateRangePicker } from '../CDateRangePicker'
5
+
6
+ test('loads and displays CDateRangePicker component', async () => {
7
+ const { container } = render(<CDateRangePicker />)
8
+ expect(container).toMatchSnapshot()
9
+ })