@coreui/vue-pro 5.8.1 → 5.10.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 (75) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/accordion/CAccordionBody.js +2 -1
  3. package/dist/cjs/components/accordion/CAccordionBody.js.map +1 -1
  4. package/dist/cjs/components/accordion/CAccordionButton.js +3 -1
  5. package/dist/cjs/components/accordion/CAccordionButton.js.map +1 -1
  6. package/dist/cjs/components/accordion/CAccordionItem.d.ts +8 -0
  7. package/dist/cjs/components/accordion/CAccordionItem.js +10 -2
  8. package/dist/cjs/components/accordion/CAccordionItem.js.map +1 -1
  9. package/dist/cjs/components/calendar/CCalendar.d.ts +8 -7
  10. package/dist/cjs/components/calendar/CCalendar.js +41 -37
  11. package/dist/cjs/components/calendar/CCalendar.js.map +1 -1
  12. package/dist/cjs/components/calendar/types.d.ts +3 -0
  13. package/dist/cjs/components/calendar/utils.d.ts +176 -18
  14. package/dist/cjs/components/calendar/utils.js +327 -51
  15. package/dist/cjs/components/calendar/utils.js.map +1 -1
  16. package/dist/cjs/components/date-picker/CDatePicker.d.ts +3 -6
  17. package/dist/cjs/components/date-picker/CDatePicker.js +1 -3
  18. package/dist/cjs/components/date-picker/CDatePicker.js.map +1 -1
  19. package/dist/cjs/components/date-range-picker/CDateRangePicker.d.ts +3 -2
  20. package/dist/cjs/components/date-range-picker/CDateRangePicker.js +1 -1
  21. package/dist/cjs/components/date-range-picker/CDateRangePicker.js.map +1 -1
  22. package/dist/cjs/components/multi-select/CMultiSelect.js +5 -1
  23. package/dist/cjs/components/multi-select/CMultiSelect.js.map +1 -1
  24. package/dist/cjs/components/nav/CNavGroup.js +6 -2
  25. package/dist/cjs/components/nav/CNavGroup.js.map +1 -1
  26. package/dist/cjs/components/range-slider/CRangeSlider.js +6 -2
  27. package/dist/cjs/components/range-slider/CRangeSlider.js.map +1 -1
  28. package/dist/cjs/utils/index.d.ts +2 -1
  29. package/dist/cjs/utils/isEqual.d.ts +2 -0
  30. package/dist/cjs/utils/isEqual.js +78 -0
  31. package/dist/cjs/utils/isEqual.js.map +1 -0
  32. package/dist/esm/components/accordion/CAccordionBody.js +2 -1
  33. package/dist/esm/components/accordion/CAccordionBody.js.map +1 -1
  34. package/dist/esm/components/accordion/CAccordionButton.js +3 -1
  35. package/dist/esm/components/accordion/CAccordionButton.js.map +1 -1
  36. package/dist/esm/components/accordion/CAccordionItem.d.ts +8 -0
  37. package/dist/esm/components/accordion/CAccordionItem.js +11 -3
  38. package/dist/esm/components/accordion/CAccordionItem.js.map +1 -1
  39. package/dist/esm/components/calendar/CCalendar.d.ts +8 -7
  40. package/dist/esm/components/calendar/CCalendar.js +43 -39
  41. package/dist/esm/components/calendar/CCalendar.js.map +1 -1
  42. package/dist/esm/components/calendar/types.d.ts +3 -0
  43. package/dist/esm/components/calendar/utils.d.ts +176 -18
  44. package/dist/esm/components/calendar/utils.js +321 -52
  45. package/dist/esm/components/calendar/utils.js.map +1 -1
  46. package/dist/esm/components/date-picker/CDatePicker.d.ts +3 -6
  47. package/dist/esm/components/date-picker/CDatePicker.js +1 -3
  48. package/dist/esm/components/date-picker/CDatePicker.js.map +1 -1
  49. package/dist/esm/components/date-range-picker/CDateRangePicker.d.ts +3 -2
  50. package/dist/esm/components/date-range-picker/CDateRangePicker.js +1 -1
  51. package/dist/esm/components/date-range-picker/CDateRangePicker.js.map +1 -1
  52. package/dist/esm/components/multi-select/CMultiSelect.js +5 -1
  53. package/dist/esm/components/multi-select/CMultiSelect.js.map +1 -1
  54. package/dist/esm/components/nav/CNavGroup.js +6 -2
  55. package/dist/esm/components/nav/CNavGroup.js.map +1 -1
  56. package/dist/esm/components/range-slider/CRangeSlider.js +6 -2
  57. package/dist/esm/components/range-slider/CRangeSlider.js.map +1 -1
  58. package/dist/esm/utils/index.d.ts +2 -1
  59. package/dist/esm/utils/isEqual.d.ts +2 -0
  60. package/dist/esm/utils/isEqual.js +74 -0
  61. package/dist/esm/utils/isEqual.js.map +1 -0
  62. package/package.json +8 -8
  63. package/src/components/accordion/CAccordionBody.ts +2 -1
  64. package/src/components/accordion/CAccordionButton.ts +3 -1
  65. package/src/components/accordion/CAccordionItem.ts +11 -3
  66. package/src/components/calendar/CCalendar.ts +64 -52
  67. package/src/components/calendar/types.ts +5 -0
  68. package/src/components/calendar/utils.ts +428 -110
  69. package/src/components/date-picker/CDatePicker.ts +2 -3
  70. package/src/components/date-range-picker/CDateRangePicker.ts +3 -1
  71. package/src/components/multi-select/CMultiSelect.ts +10 -2
  72. package/src/components/nav/CNavGroup.ts +7 -2
  73. package/src/components/range-slider/CRangeSlider.ts +7 -2
  74. package/src/utils/index.ts +10 -1
  75. package/src/utils/isEqual.ts +75 -0
@@ -1,4 +1,4 @@
1
- import { defineComponent, h, PropType, ref, watch } from 'vue'
1
+ import { defineComponent, h, nextTick, PropType, ref, watch } from 'vue'
2
2
 
3
3
  import { CButton } from '../button'
4
4
 
@@ -14,10 +14,19 @@ import {
14
14
  isDateInRange,
15
15
  isDateSelected,
16
16
  isDisableDateInRange,
17
- isSameDateAs,
17
+ isMonthDisabled,
18
+ isMonthInRange,
19
+ isMonthSelected,
18
20
  isToday,
21
+ isSameDateAs,
22
+ isYearDisabled,
23
+ isYearInRange,
24
+ isYearSelected,
25
+ getSelectableDates,
19
26
  } from './utils'
20
27
 
28
+ import type { DisabledDate, SelectionTypes, ViewTypes } from './types'
29
+
21
30
  const CCalendar = defineComponent({
22
31
  name: 'CCalendar',
23
32
  props: {
@@ -95,7 +104,7 @@ const CCalendar = defineComponent({
95
104
  * Specify the list of dates that cannot be selected.
96
105
  */
97
106
  disabledDates: {
98
- type: Array as PropType<Date[] | Date[][]>,
107
+ type: [Array, Date, Function] as PropType<DisabledDate | DisabledDate[]>,
99
108
  },
100
109
  /**
101
110
  * Initial selected to date (range).
@@ -163,9 +172,9 @@ const CCalendar = defineComponent({
163
172
  * @since 5.0.0
164
173
  */
165
174
  selectionType: {
166
- type: String as PropType<'day' | 'week' | 'month' | 'year'>,
175
+ type: String as PropType<SelectionTypes>,
167
176
  default: 'day',
168
- validator: (value: string) => ['day', 'week', 'month', 'year'].includes(value),
177
+ validator: (value: SelectionTypes) => ['day', 'week', 'month', 'year'].includes(value),
169
178
  },
170
179
  /**
171
180
  * Set whether to display dates in adjacent months (non-selectable) at the start and end of the current month.
@@ -263,25 +272,19 @@ const CCalendar = defineComponent({
263
272
  props.minDate ? convertToDateObject(props.minDate, props.selectionType) : null,
264
273
  )
265
274
  const selectEndDate = ref(props.selectEndDate)
266
- const view = ref<'days' | 'months' | 'years'>('days')
275
+ const view = ref<ViewTypes>('days')
267
276
 
268
277
  watch(
269
278
  () => props.selectionType,
270
279
  () => {
271
- if (props.selectionType === 'day' || props.selectionType === 'week') {
272
- view.value = 'days'
273
- return
280
+ const viewMap = {
281
+ day: 'days',
282
+ week: 'days',
283
+ month: 'months',
284
+ year: 'years',
274
285
  }
275
286
 
276
- if (props.selectionType === 'month') {
277
- view.value = 'months'
278
- return
279
- }
280
-
281
- if (props.selectionType === 'year') {
282
- view.value = 'years'
283
- return
284
- }
287
+ view.value = (viewMap[props.selectionType] as ViewTypes) || 'days'
285
288
  },
286
289
  { immediate: true },
287
290
  )
@@ -355,9 +358,17 @@ const CCalendar = defineComponent({
355
358
  const month = calendarDate.value.getMonth()
356
359
  const d = new Date(year, month, 1)
357
360
 
358
- years && d.setFullYear(d.getFullYear() + years)
359
- months && d.setMonth(d.getMonth() + months)
360
- typeof setMonth === 'number' && d.setMonth(setMonth)
361
+ if (years) {
362
+ d.setFullYear(d.getFullYear() + years)
363
+ }
364
+
365
+ if (months) {
366
+ d.setMonth(d.getMonth() + months)
367
+ }
368
+
369
+ if (typeof setMonth === 'number') {
370
+ d.setMonth(setMonth)
371
+ }
361
372
 
362
373
  calendarDate.value = d
363
374
 
@@ -365,10 +376,6 @@ const CCalendar = defineComponent({
365
376
  }
366
377
 
367
378
  const handleCalendarClick = (date: Date, index?: number) => {
368
- if (isDateDisabled(date, minDate.value, maxDate.value, props.disabledDates)) {
369
- return
370
- }
371
-
372
379
  const _date = new Date(date)
373
380
 
374
381
  if (view.value === 'days') {
@@ -389,6 +396,11 @@ const CCalendar = defineComponent({
389
396
  return
390
397
  }
391
398
 
399
+ // Allow to change the calendarDate but not startDate or endDate
400
+ if (isDateDisabled(date, minDate.value, maxDate.value, props.disabledDates)) {
401
+ return
402
+ }
403
+
392
404
  if (props.range) {
393
405
  if (selectEndDate.value) {
394
406
  selectEndDate.value = false
@@ -432,7 +444,17 @@ const CCalendar = defineComponent({
432
444
  const handleCalendarKeyDown = (event: KeyboardEvent, date: Date, index?: number) => {
433
445
  if (event.code === 'Space' || event.key === 'Enter') {
434
446
  event.preventDefault()
447
+ const _view = view.value
435
448
  handleCalendarClick(date, index)
449
+ if (
450
+ (_view === 'months' && props.selectionType !== 'month') ||
451
+ (_view === 'years' && props.selectionType !== 'year')
452
+ ) {
453
+ nextTick(() => {
454
+ const list: HTMLElement[] = getSelectableDates(calendarRef.value as HTMLDivElement)
455
+ list[0]?.focus()
456
+ })
457
+ }
436
458
  }
437
459
 
438
460
  if (
@@ -445,7 +467,7 @@ const CCalendar = defineComponent({
445
467
 
446
468
  if (
447
469
  maxDate.value &&
448
- date >= convertToDateObject(maxDate.value, props.selectionType) &&
470
+ date >= maxDate.value &&
449
471
  (event.key === 'ArrowRight' || event.key === 'ArrowDown')
450
472
  ) {
451
473
  return
@@ -453,7 +475,7 @@ const CCalendar = defineComponent({
453
475
 
454
476
  if (
455
477
  minDate.value &&
456
- date <= convertToDateObject(minDate.value, props.selectionType) &&
478
+ date <= minDate.value &&
457
479
  (event.key === 'ArrowLeft' || event.key === 'ArrowUp')
458
480
  ) {
459
481
  return
@@ -465,13 +487,7 @@ const CCalendar = defineComponent({
465
487
  element = element.closest('tr[tabindex="0"]') as HTMLElement
466
488
  }
467
489
 
468
- const list: HTMLElement[] = calendarRef.value
469
- ? Array.from(
470
- calendarRef.value.querySelectorAll(
471
- props.selectionType === 'week' ? 'tr[tabindex="0"]' : 'td[tabindex="0"]',
472
- ),
473
- )
474
- : []
490
+ const list: HTMLElement[] = getSelectableDates(calendarRef.value as HTMLDivElement)
475
491
 
476
492
  const index = list.indexOf(element)
477
493
  const first = index === 0
@@ -518,20 +534,16 @@ const CCalendar = defineComponent({
518
534
  }
519
535
 
520
536
  setTimeout(() => {
521
- const _list: HTMLElement[] = element.parentNode?.parentNode
522
- ? Array.from(
523
- element.parentNode.parentNode.querySelectorAll(
524
- 'td[tabindex="0"], tr[tabindex="0"]',
525
- ),
526
- )
527
- : []
537
+ const _list: HTMLElement[] = getSelectableDates(
538
+ element.parentNode?.parentNode as HTMLDivElement,
539
+ )
528
540
 
529
541
  if (_list.length > 0 && event.key === 'ArrowRight') {
530
542
  _list[0].focus()
531
543
  }
532
544
 
533
545
  if (_list.length > 0 && event.key === 'ArrowLeft') {
534
- _list[_list.length - 1].focus()
546
+ _list.at(-1)?.focus()
535
547
  }
536
548
 
537
549
  if (_list.length > 0 && event.key === 'ArrowDown') {
@@ -791,13 +803,13 @@ const CCalendar = defineComponent({
791
803
  row.map((month, idx) => {
792
804
  const monthNumber = index * 3 + idx
793
805
  const date = new Date(_calendarDate.getFullYear(), monthNumber, 1)
794
- const isDisabled = isDateDisabled(
806
+ const isDisabled = isMonthDisabled(
795
807
  date,
796
808
  minDate.value,
797
809
  maxDate.value,
798
810
  props.disabledDates,
799
811
  )
800
- const isSelected = isDateSelected(date, startDate.value, endDate.value)
812
+ const isSelected = isMonthSelected(date, startDate.value, endDate.value)
801
813
  return h(
802
814
  'td',
803
815
  {
@@ -809,9 +821,9 @@ const CCalendar = defineComponent({
809
821
  'range-hover':
810
822
  props.selectionType === 'month' &&
811
823
  (hoverDate.value && selectEndDate.value
812
- ? isDateInRange(date, startDate.value, hoverDate.value)
813
- : isDateInRange(date, hoverDate.value, endDate.value)),
814
- range: isDateInRange(date, startDate.value, endDate.value),
824
+ ? isMonthInRange(date, startDate.value, hoverDate.value)
825
+ : isMonthInRange(date, hoverDate.value, endDate.value)),
826
+ range: isMonthInRange(date, startDate.value, endDate.value),
815
827
  },
816
828
  ],
817
829
  tabindex: isDisabled ? -1 : 0,
@@ -837,13 +849,13 @@ const CCalendar = defineComponent({
837
849
  {},
838
850
  row.map((year) => {
839
851
  const date = new Date(year, 0, 1)
840
- const isDisabled = isDateDisabled(
852
+ const isDisabled = isYearDisabled(
841
853
  date,
842
854
  minDate.value,
843
855
  maxDate.value,
844
856
  props.disabledDates,
845
857
  )
846
- const isSelected = isDateSelected(date, startDate.value, endDate.value)
858
+ const isSelected = isYearSelected(date, startDate.value, endDate.value)
847
859
  return h(
848
860
  'td',
849
861
  {
@@ -855,9 +867,9 @@ const CCalendar = defineComponent({
855
867
  'range-hover':
856
868
  props.selectionType === 'year' &&
857
869
  (hoverDate.value && selectEndDate.value
858
- ? isDateInRange(date, startDate.value, hoverDate.value)
859
- : isDateInRange(date, hoverDate.value, endDate.value)),
860
- range: isDateInRange(date, startDate.value, endDate.value),
870
+ ? isYearInRange(date, startDate.value, hoverDate.value)
871
+ : isYearInRange(date, hoverDate.value, endDate.value)),
872
+ range: isYearInRange(date, startDate.value, endDate.value),
861
873
  },
862
874
  ],
863
875
  tabindex: isDisabled ? -1 : 0,
@@ -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'