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