@coreui/react-pro 4.11.2 → 4.12.0-alpha.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 (68) hide show
  1. package/README.md +1 -1
  2. package/dist/components/date-range-picker/CDateRangePicker copy.d.ts +114 -0
  3. package/dist/components/date-range-picker/CDateRangePicker.d.ts +49 -1
  4. package/dist/components/multi-select/CMultiSelect.d.ts +34 -3
  5. package/dist/components/multi-select/CMultiSelectNativeSelect.d.ts +4 -5
  6. package/dist/components/multi-select/CMultiSelectOptions.d.ts +4 -2
  7. package/dist/components/multi-select/CMultiSelectSelection.d.ts +1 -0
  8. package/dist/components/multi-select/types.d.ts +7 -3
  9. package/dist/components/multi-select/utils.d.ts +5 -5
  10. package/dist/components/multi-select-new/CMultiSelect.d.ts +133 -0
  11. package/dist/components/multi-select-new/CMultiSelectNativeSelect.d.ts +7 -0
  12. package/dist/components/multi-select-new/CMultiSelectNew.d.ts +121 -0
  13. package/dist/components/multi-select-new/CMultiSelectOptions.d.ts +16 -0
  14. package/dist/components/multi-select-new/CMultiSelectSelection.d.ts +11 -0
  15. package/dist/components/multi-select-new/index.d.ts +2 -0
  16. package/dist/components/multi-select-new/types.d.ts +15 -0
  17. package/dist/components/multi-select-new/utils.d.ts +11 -0
  18. package/dist/components/picker/CPicker copy.d.ts +82 -0
  19. package/dist/components/picker/CPicker.d.ts +14 -56
  20. package/dist/components/picker copy/CPicker.d.ts +82 -0
  21. package/dist/components/popover/CPopover.d.ts +1 -1
  22. package/dist/components/time-picker/CTimePicker.d.ts +41 -1
  23. package/dist/components/tooltip/CTooltip.d.ts +3 -3
  24. package/dist/index.es.js +2200 -2074
  25. package/dist/index.es.js.map +1 -1
  26. package/dist/index.js +2199 -2073
  27. package/dist/index.js.map +1 -1
  28. package/dist/utils/index.d.ts +2 -1
  29. package/dist/utils/isRTL.d.ts +2 -0
  30. package/package.json +7 -7
  31. package/src/components/calendar/__tests__/__snapshots__/CCalendar.spec.tsx.snap +601 -555
  32. package/src/components/date-picker/__tests__/__snapshots__/CDatePicker.spec.tsx.snap +599 -561
  33. package/src/components/date-range-picker/CDateRangePicker.tsx +198 -97
  34. package/src/components/date-range-picker/__tests__/__snapshots__/CDateRangePicker.spec.tsx.snap +1197 -1121
  35. package/src/components/dropdown/CDropdownMenu.tsx +5 -4
  36. package/src/components/dropdown/__tests__/__snapshots__/CDropdown.spec.tsx.snap +1 -1
  37. package/src/components/element-cover/CElementCover.tsx +1 -0
  38. package/src/components/multi-select/CMultiSelect.tsx +200 -79
  39. package/src/components/multi-select/CMultiSelectNativeSelect.tsx +34 -24
  40. package/src/components/multi-select/CMultiSelectOptions.tsx +25 -23
  41. package/src/components/multi-select/CMultiSelectSelection.tsx +36 -7
  42. package/src/components/multi-select/__tests__/CMultiSelect.spec.tsx +25 -14
  43. package/src/components/multi-select/__tests__/CMultiSelectNativeSelect.spec.tsx +1 -1
  44. package/src/components/multi-select/__tests__/CMultiSelectOptions.spec.tsx +4 -4
  45. package/src/components/multi-select/__tests__/CMultiSelectSelection.spec.tsx +0 -1
  46. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelect.spec.tsx.snap +136 -30
  47. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectNativeSelect.spec.tsx.snap +2 -0
  48. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectOptions.spec.tsx.snap +3 -1
  49. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectSelection.spec.tsx.snap +2 -2
  50. package/src/components/multi-select/types.ts +9 -4
  51. package/src/components/multi-select/utils.ts +56 -39
  52. package/src/components/picker/CPicker.tsx +113 -138
  53. package/src/components/popover/CPopover.tsx +62 -26
  54. package/src/components/smart-table/CSmartTable.tsx +5 -1
  55. package/src/components/smart-table/__tests__/CSmartTable.spec.tsx +1 -1
  56. package/src/components/smart-table/__tests__/__snapshots__/CSmartTable.spec.tsx.snap +580 -0
  57. package/src/components/time-picker/CTimePicker.tsx +182 -82
  58. package/src/components/time-picker/__tests__/__snapshots__/CTimePicker.spec.tsx.snap +1078 -0
  59. package/src/components/tooltip/CTooltip.tsx +66 -31
  60. package/src/components/virtual-scroller/CVirtualScroller.tsx +0 -1
  61. package/src/utils/index.ts +2 -1
  62. package/src/utils/isRTL.ts +13 -0
  63. package/src/components/multi-select/__tests__/CMultiSelectCleaner.spec.tsx +0 -15
  64. package/src/components/multi-select/__tests__/CMultiSelectSearchInput.spec.tsx +0 -17
  65. package/src/components/multi-select/__tests__/CMultiSelectSelectAllButton.spec.tsx +0 -21
  66. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectCleaner.spec.tsx.snap +0 -19
  67. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectSearchInput.spec.tsx.snap +0 -20
  68. package/src/components/multi-select/__tests__/__snapshots__/CMultiSelectSelectAllButton.spec.tsx.snap +0 -24
@@ -2,7 +2,7 @@ import React, { forwardRef, ReactNode, useEffect, useRef, useState } from 'react
2
2
  import PropTypes from 'prop-types'
3
3
  import classNames from 'classnames'
4
4
 
5
- import { CFormInput, CFormSelect, CInputGroup, CInputGroupText } from '../form'
5
+ import { CButton } from '../button'
6
6
  import { CFormControlWrapper, CFormControlWrapperProps } from '../form/CFormControlWrapper'
7
7
  import { CPicker, CPickerProps } from './../picker/CPicker'
8
8
 
@@ -18,14 +18,12 @@ import {
18
18
  isValidTime,
19
19
  } from './utils'
20
20
 
21
+ import { Colors } from '../../types'
21
22
  import type { LocalizedTimePartials } from './types'
22
23
 
23
24
  export interface CTimePickerProps
24
25
  extends Omit<CFormControlWrapperProps, 'floatingLabel'>,
25
- Omit<
26
- CPickerProps,
27
- 'autoClose' | 'component' | 'dark' | 'placeholder' | 'variant' | 'onChange'
28
- > {
26
+ Omit<CPickerProps, 'placeholder'> {
29
27
  /**
30
28
  * Set if the component should use the 12/24 hour format. If `true` forces the interface to a 12-hour format. If `false` forces the interface into a 24-hour format. If `auto` the current locale will determine the 12 or 24-hour interface by default locales.
31
29
  *
@@ -36,10 +34,49 @@ export interface CTimePickerProps
36
34
  * A string of all className you want applied to the component.
37
35
  */
38
36
  className?: string
37
+ /**
38
+ * Toggle visibility or set the content of cancel button.
39
+ */
40
+ cancelButton?: boolean | ReactNode
41
+ /**
42
+ * Sets the color context of the cancel button to one of CoreUI’s themed colors.
43
+ *
44
+ * @type 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | string
45
+ */
46
+ cancelButtonColor?: Colors
47
+ /**
48
+ * Size the cancel button small or large.
49
+ */
50
+ cancelButtonSize?: 'sm' | 'lg'
51
+ /**
52
+ * Set the cancel button variant to an outlined button or a ghost button.
53
+ */
54
+ cancelButtonVariant?: 'outline' | 'ghost'
55
+ /**
56
+ * A string of all className you want applied to the component.
57
+ */
39
58
  /**
40
59
  * Toggle visibility or set the content of the cleaner button.
41
60
  */
42
61
  cleaner?: ReactNode | boolean
62
+ /**
63
+ * Toggle visibility or set the content of confirm button.
64
+ */
65
+ confirmButton?: boolean | ReactNode
66
+ /**
67
+ * Sets the color context of the confirm button to one of CoreUI’s themed colors.
68
+ *
69
+ * @type 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | string
70
+ */
71
+ confirmButtonColor?: Colors
72
+ /**
73
+ * Size the confirm button small or large.
74
+ */
75
+ confirmButtonSize?: 'sm' | 'lg'
76
+ /**
77
+ * Set the confirm button variant to an outlined button or a ghost button.
78
+ */
79
+ confirmButtonVariant?: 'outline' | 'ghost'
43
80
  /**
44
81
  * Toggle visibility or set the content of the input indicator.
45
82
  */
@@ -90,8 +127,16 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
90
127
  (
91
128
  {
92
129
  ampm = 'auto',
130
+ cancelButton = 'Cancel',
131
+ cancelButtonColor = 'primary',
132
+ cancelButtonSize = 'sm',
133
+ cancelButtonVariant = 'ghost',
93
134
  className,
94
135
  cleaner = true,
136
+ confirmButton = 'OK',
137
+ confirmButtonColor = 'primary',
138
+ confirmButtonSize = 'sm',
139
+ confirmButtonVariant,
95
140
  container = 'dropdown',
96
141
  disabled,
97
142
  feedback,
@@ -121,9 +166,12 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
121
166
  },
122
167
  ref,
123
168
  ) => {
169
+ const formRef = useRef<HTMLFormElement>()
124
170
  const inputRef = useRef<HTMLInputElement>(null)
171
+
125
172
  const [date, setDate] = useState<Date | null>(convertTimeToDate(time))
126
173
  const [initialDate, setInitialDate] = useState<Date | null>(null)
174
+ const [isValid, setIsValid] = useState(valid || (invalid && false))
127
175
  const [_ampm, setAmPm] = useState<'am' | 'pm'>(date ? getAmPm(new Date(date), locale) : 'am')
128
176
  const [_visible, setVisible] = useState(visible)
129
177
 
@@ -138,6 +186,10 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
138
186
  setDate(convertTimeToDate(time))
139
187
  }, [time])
140
188
 
189
+ useEffect(() => {
190
+ setIsValid(valid || (invalid && false))
191
+ }, [valid, invalid])
192
+
141
193
  useEffect(() => {
142
194
  setLocalizedTimePartials(getLocalizedTimePartials(locale, ampm))
143
195
 
@@ -153,12 +205,40 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
153
205
  date && setAmPm(getAmPm(new Date(date), locale))
154
206
  }, [date])
155
207
 
208
+ useEffect(() => {
209
+ if (inputRef.current && inputRef.current.form) {
210
+ formRef.current = inputRef.current.form
211
+ }
212
+ }, [inputRef])
213
+
214
+ useEffect(() => {
215
+ if (formRef.current) {
216
+ formRef.current.addEventListener('submit', (event) => {
217
+ setTimeout(() => handleFormValidation(event.target as HTMLFormElement))
218
+ })
219
+
220
+ handleFormValidation(formRef.current)
221
+ }
222
+ }, [formRef, date])
223
+
156
224
  const handleClear = (event: React.MouseEvent<HTMLElement>) => {
157
225
  event.stopPropagation()
158
226
  setDate(null)
159
227
  onTimeChange && onTimeChange(null)
160
228
  }
161
229
 
230
+ const handleFormValidation = (form: HTMLFormElement) => {
231
+ if (!form.classList.contains('was-validated')) {
232
+ return
233
+ }
234
+
235
+ if (date) {
236
+ return setIsValid(true)
237
+ }
238
+
239
+ setIsValid(false)
240
+ }
241
+
162
242
  const handleTimeChange = (set: 'hours' | 'minutes' | 'seconds' | 'toggle', value: string) => {
163
243
  const _date = date || new Date('1970-01-01')
164
244
 
@@ -192,10 +272,11 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
192
272
  }
193
273
 
194
274
  const InputGroup = () => (
195
- <CInputGroup className="picker-input-group" size={size}>
196
- <CFormInput
275
+ <div className="time-picker-input-group">
276
+ <input
197
277
  autoComplete="off"
198
- delay={true}
278
+ className="time-picker-input"
279
+ // delay={true}
199
280
  disabled={disabled}
200
281
  onChange={(event) =>
201
282
  isValidTime(event.target.value) && setDate(convertTimeToDate(event.target.value))
@@ -205,105 +286,88 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
205
286
  required={required}
206
287
  ref={inputRef}
207
288
  />
208
- {(indicator || cleaner) && (
209
- <CInputGroupText>
210
- {indicator && (
211
- <span className="picker-input-group-indicator">
212
- {typeof indicator === 'boolean' ? (
213
- <span className="picker-input-group-icon time-picker-input-icon" />
214
- ) : (
215
- indicator
216
- )}
217
- </span>
218
- )}
219
- {cleaner && date && (
220
- <span
221
- className="picker-input-group-cleaner"
222
- role="button"
223
- onClick={(event) => handleClear(event)}
224
- >
225
- {typeof cleaner === 'boolean' ? (
226
- <span className="picker-input-group-icon time-picker-cleaner-icon" />
227
- ) : (
228
- cleaner
229
- )}
230
- </span>
231
- )}
232
- </CInputGroupText>
233
- )}
234
- </CInputGroup>
289
+ {indicator &&
290
+ (typeof indicator === 'boolean' ? <div className="time-picker-indicator" /> : indicator)}
291
+ {cleaner &&
292
+ date &&
293
+ (typeof cleaner === 'boolean' ? (
294
+ <div className="time-picker-cleaner" onClick={(event) => handleClear(event)} />
295
+ ) : (
296
+ React.isValidElement(cleaner) &&
297
+ React.cloneElement(cleaner as React.ReactElement<any>, {
298
+ onClick: (event: React.MouseEvent<HTMLElement>) => handleClear(event),
299
+ })
300
+ ))}
301
+ </div>
235
302
  )
236
303
 
237
304
  const TimePickerSelect = () => {
238
305
  return (
239
306
  <>
240
307
  <span className="time-picker-inline-icon" />
241
- <CFormSelect
308
+ <select
309
+ className="time-picker-inline-select"
242
310
  disabled={disabled}
243
- options={
244
- localizedTimePartials &&
245
- localizedTimePartials.listOfHours?.map((option) => {
246
- return {
247
- value: option.value.toString(),
248
- label: option.label,
249
- }
250
- })
251
- }
252
311
  onChange={(event: React.ChangeEvent<HTMLSelectElement>) =>
253
312
  handleTimeChange('hours', event.target.value)
254
313
  }
255
314
  value={getSelectedHour(date, locale)}
256
- />
315
+ >
316
+ {localizedTimePartials &&
317
+ localizedTimePartials.listOfHours.map((option, index) => (
318
+ <option value={option.value.toString()} key={index}>
319
+ {option.label}
320
+ </option>
321
+ ))}
322
+ </select>
257
323
  <>:</>
258
- <CFormSelect
324
+ <select
325
+ className="time-picker-inline-select"
259
326
  disabled={disabled}
260
- options={
261
- localizedTimePartials &&
262
- localizedTimePartials.listOfMinutes.map((option) => {
263
- return {
264
- value: option.value.toString(),
265
- label: option.label,
266
- }
267
- })
268
- }
269
327
  onChange={(event: React.ChangeEvent<HTMLSelectElement>) =>
270
328
  handleTimeChange('minutes', event.target.value)
271
329
  }
272
330
  value={getSelectedMinutes(date)}
273
- />
331
+ >
332
+ {localizedTimePartials &&
333
+ localizedTimePartials.listOfMinutes.map((option, index) => (
334
+ <option value={option.value.toString()} key={index}>
335
+ {option.label}
336
+ </option>
337
+ ))}
338
+ </select>
274
339
  {seconds && (
275
340
  <>
276
341
  <>:</>
277
- <CFormSelect
342
+ <select
343
+ className="time-picker-inline-select"
278
344
  disabled={disabled}
279
- options={
280
- localizedTimePartials &&
281
- localizedTimePartials.listOfSeconds.map((option) => {
282
- return {
283
- value: option.value.toString(),
284
- label: option.label,
285
- }
286
- })
287
- }
288
345
  onChange={(event: React.ChangeEvent<HTMLSelectElement>) =>
289
346
  handleTimeChange('seconds', event.target.value)
290
347
  }
291
348
  value={getSelectedSeconds(date)}
292
- />
349
+ >
350
+ {localizedTimePartials &&
351
+ localizedTimePartials.listOfSeconds.map((option, index) => (
352
+ <option value={option.value.toString()} key={index}>
353
+ {option.label}
354
+ </option>
355
+ ))}
356
+ </select>
293
357
  </>
294
358
  )}
295
359
  {localizedTimePartials && localizedTimePartials.hour12 && (
296
- <CFormSelect
360
+ <select
361
+ className="time-picker-inline-select"
297
362
  disabled={disabled}
298
- options={[
299
- { value: 'am', label: 'AM' },
300
- { value: 'pm', label: 'PM' },
301
- ]}
302
363
  onChange={(event: React.ChangeEvent<HTMLSelectElement>) =>
303
364
  handleTimeChange('toggle', event.target.value)
304
365
  }
305
366
  value={_ampm}
306
- />
367
+ >
368
+ <option value="am">AM</option>
369
+ <option value="pm">PM</option>
370
+ </select>
307
371
  )}
308
372
  </>
309
373
  )
@@ -348,29 +412,57 @@ export const CTimePicker = forwardRef<HTMLDivElement | HTMLLIElement, CTimePicke
348
412
  feedbackInvalid={feedbackInvalid}
349
413
  feedbackValid={feedbackValid}
350
414
  id={id}
351
- invalid={invalid}
415
+ invalid={isValid === false ? true : false}
352
416
  label={label}
353
417
  text={text}
354
418
  tooltipFeedback={tooltipFeedback}
355
- valid={valid}
419
+ valid={isValid}
356
420
  >
357
421
  <CPicker
358
422
  className={classNames(
359
423
  'time-picker',
360
424
  {
361
- 'is-invalid': invalid,
362
- 'is-valid': valid,
425
+ [`time-picker-${size}`]: size,
426
+ disabled: disabled,
427
+ 'is-invalid': isValid === false ? true : false,
428
+ 'is-valid': isValid,
363
429
  },
364
430
  className,
365
431
  )}
366
432
  container={container}
367
433
  disabled={disabled}
434
+ dropdownClassNames="time-picker-dropdown"
368
435
  footer={footer}
436
+ footerContent={
437
+ <div className="time-picker-footer">
438
+ {cancelButton && (
439
+ <CButton
440
+ color={cancelButtonColor}
441
+ size={cancelButtonSize}
442
+ variant={cancelButtonVariant}
443
+ onClick={() => {
444
+ initialDate && setDate(new Date(initialDate))
445
+ setVisible(false)
446
+ }}
447
+ >
448
+ {cancelButton}
449
+ </CButton>
450
+ )}
451
+ {confirmButton && (
452
+ <CButton
453
+ color={confirmButtonColor}
454
+ size={confirmButtonSize}
455
+ variant={confirmButtonVariant}
456
+ onClick={() => {
457
+ setVisible(false)
458
+ }}
459
+ >
460
+ {confirmButton}
461
+ </CButton>
462
+ )}
463
+ </div>
464
+ }
369
465
  id={id}
370
- onCancel={() => {
371
- initialDate && setDate(new Date(initialDate))
372
- setVisible(false)
373
- }}
374
466
  onHide={() => {
375
467
  setVisible(false)
376
468
  onHide && onHide()
@@ -402,7 +494,15 @@ CTimePicker.propTypes = {
402
494
  ...CFormControlWrapper.propTypes,
403
495
  ...CPicker.propTypes,
404
496
  ampm: PropTypes.oneOfType([PropTypes.oneOf<'auto'>(['auto']), PropTypes.bool]),
497
+ cancelButton: PropTypes.oneOfType([PropTypes.bool, PropTypes.node]),
498
+ cancelButtonColor: CButton.propTypes?.color,
499
+ cancelButtonSize: CButton.propTypes?.size,
500
+ cancelButtonVariant: CButton.propTypes?.variant,
405
501
  className: PropTypes.string,
502
+ confirmButton: PropTypes.oneOfType([PropTypes.bool, PropTypes.node]),
503
+ confirmButtonColor: CButton.propTypes?.color,
504
+ confirmButtonSize: CButton.propTypes?.size,
505
+ confirmButtonVariant: CButton.propTypes?.variant,
406
506
  locale: PropTypes.string,
407
507
  onTimeChange: PropTypes.func,
408
508
  required: PropTypes.bool,