@coreui/vue-pro 4.9.0-rc.0 → 4.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coreui/vue-pro",
3
- "version": "4.9.0-rc.0",
3
+ "version": "4.10.0",
4
4
  "description": "UI Components Library for Vue.js",
5
5
  "keywords": [
6
6
  "vue",
@@ -38,21 +38,21 @@
38
38
  },
39
39
  "devDependencies": {
40
40
  "@popperjs/core": "^2.11.8",
41
- "@rollup/plugin-commonjs": "^25.0.1",
41
+ "@rollup/plugin-commonjs": "^25.0.2",
42
42
  "@rollup/plugin-node-resolve": "^15.1.0",
43
- "@rollup/plugin-typescript": "^11.1.1",
43
+ "@rollup/plugin-typescript": "^11.1.2",
44
44
  "@types/jest": "^29.5.2",
45
- "@vue/test-utils": "^2.3.2",
45
+ "@vue/test-utils": "^2.4.0",
46
46
  "@vue/vue3-jest": "29.2.4",
47
47
  "date-fns": "^2.29.3",
48
- "jest": "^29.5.0",
49
- "jest-environment-jsdom": "^29.5.0",
50
- "rollup": "^3.25.0",
48
+ "jest": "^29.6.1",
49
+ "jest-environment-jsdom": "^29.6.1",
50
+ "rollup": "^3.26.2",
51
51
  "rollup-plugin-vue": "^6.0.0",
52
- "ts-jest": "^29.1.0",
52
+ "ts-jest": "^29.1.1",
53
53
  "typescript": "^4.9.5",
54
54
  "vue": "^3.3.4",
55
- "vue-types": "^5.0.3"
55
+ "vue-types": "^5.1.0"
56
56
  },
57
57
  "peerDependencies": {
58
58
  "@coreui/coreui-pro": "^4.5.0",
@@ -4,7 +4,6 @@ import { format as dateFormat } from 'date-fns'
4
4
 
5
5
  import { CButton } from '../button'
6
6
  import { CCalendar } from '../calendar'
7
- import { CInputGroup } from '../form'
8
7
  import { CFormControlWrapper } from './../form/CFormControlWrapper'
9
8
  import { CPicker } from '../picker'
10
9
  import { CTimePicker } from '../time-picker'
@@ -645,61 +644,30 @@ const CDateRangePicker = defineComponent({
645
644
  }
646
645
 
647
646
  const InputGroup = () =>
648
- h(CInputGroup, { class: 'picker-input-group', size: props.size }, () => [
649
- h('input', {
650
- autocomplete: 'off',
647
+ h(
648
+ 'div',
649
+ {
651
650
  class: [
652
- 'form-control date-picker-input',
651
+ 'input-group',
652
+ 'picker-input-group',
653
653
  {
654
- hover: inputStartHoverValue.value,
654
+ [`input-group-${props.size}`]: props.size,
655
655
  },
656
656
  ],
657
- disabled: props.disabled,
658
- ...(props.id && { name: props.range ? `${props.id}-start-date` : `${props.id}-date` }),
659
- onClick: () => {
660
- selectEndDate.value = false
661
- },
662
- onInput: (event: Event) => {
663
- const date = getLocalDateFromString(
664
- (event.target as HTMLInputElement).value,
665
- props.locale,
666
- props.timepicker,
667
- )
668
- if (date instanceof Date && date.getTime()) {
669
- calendarDate.value = date
670
- startDate.value = date
671
- }
672
- },
673
- placeholder: Array.isArray(props.placeholder) ? props.placeholder[0] : props.placeholder,
674
- readonly: props.inputReadOnly || typeof props.format === 'string',
675
- required: props.required,
676
- ref: inputStartRef,
677
- value: inputStartHoverValue.value
678
- ? setInputValue(inputStartHoverValue.value)
679
- : setInputValue(startDate.value),
680
- }),
681
- props.range &&
682
- props.separator !== false &&
683
- h(
684
- 'span',
685
- { class: 'input-group-text' },
686
- slots.separator
687
- ? slots.separator()
688
- : h('span', { class: 'picker-input-group-icon date-picker-arrow-icon' }),
689
- ),
690
- props.range &&
657
+ },
658
+ [
691
659
  h('input', {
692
660
  autocomplete: 'off',
693
661
  class: [
694
662
  'form-control date-picker-input',
695
663
  {
696
- hover: inputEndHoverValue.value,
664
+ hover: inputStartHoverValue.value,
697
665
  },
698
666
  ],
699
667
  disabled: props.disabled,
700
- ...(props.id && { name: `${props.id}-end-date` }),
668
+ ...(props.id && { name: props.range ? `${props.id}-start-date` : `${props.id}-date` }),
701
669
  onClick: () => {
702
- selectEndDate.value = true
670
+ selectEndDate.value = false
703
671
  },
704
672
  onInput: (event: Event) => {
705
673
  const date = getLocalDateFromString(
@@ -709,43 +677,88 @@ const CDateRangePicker = defineComponent({
709
677
  )
710
678
  if (date instanceof Date && date.getTime()) {
711
679
  calendarDate.value = date
712
- endDate.value = date
680
+ startDate.value = date
713
681
  }
714
682
  },
715
- placeholder: props.placeholder[1],
683
+ placeholder: Array.isArray(props.placeholder)
684
+ ? props.placeholder[0]
685
+ : props.placeholder,
716
686
  readonly: props.inputReadOnly || typeof props.format === 'string',
717
687
  required: props.required,
718
- ref: inputEndRef,
719
- value: inputEndHoverValue.value
720
- ? setInputValue(inputEndHoverValue.value)
721
- : setInputValue(endDate.value),
688
+ ref: inputStartRef,
689
+ value: inputStartHoverValue.value
690
+ ? setInputValue(inputStartHoverValue.value)
691
+ : setInputValue(startDate.value),
722
692
  }),
723
- (props.indicator || props.cleaner) &&
724
- h('span', { class: 'input-group-text' }, [
725
- props.indicator &&
726
- h(
727
- 'span',
728
- {
729
- class: 'picker-input-group-indicator',
730
- },
731
- slots.indicator
732
- ? slots.indicator()
733
- : h('span', { class: 'picker-input-group-icon date-picker-input-icon' }),
734
- ),
735
- props.cleaner &&
736
- h(
737
- 'span',
693
+ props.range &&
694
+ props.separator !== false &&
695
+ h(
696
+ 'span',
697
+ { class: 'input-group-text' },
698
+ slots.separator
699
+ ? slots.separator()
700
+ : h('span', { class: 'picker-input-group-icon date-picker-arrow-icon' }),
701
+ ),
702
+ props.range &&
703
+ h('input', {
704
+ autocomplete: 'off',
705
+ class: [
706
+ 'form-control date-picker-input',
738
707
  {
739
- class: 'picker-input-group-cleaner',
740
- onClick: (event: Event) => handleClear(event),
741
- role: 'button',
708
+ hover: inputEndHoverValue.value,
742
709
  },
743
- slots.cleaner
744
- ? slots.cleaner()
745
- : h('span', { class: 'picker-input-group-icon date-picker-cleaner-icon' }),
746
- ),
747
- ]),
748
- ])
710
+ ],
711
+ disabled: props.disabled,
712
+ ...(props.id && { name: `${props.id}-end-date` }),
713
+ onClick: () => {
714
+ selectEndDate.value = true
715
+ },
716
+ onInput: (event: Event) => {
717
+ const date = getLocalDateFromString(
718
+ (event.target as HTMLInputElement).value,
719
+ props.locale,
720
+ props.timepicker,
721
+ )
722
+ if (date instanceof Date && date.getTime()) {
723
+ calendarDate.value = date
724
+ endDate.value = date
725
+ }
726
+ },
727
+ placeholder: props.placeholder[1],
728
+ readonly: props.inputReadOnly || typeof props.format === 'string',
729
+ required: props.required,
730
+ ref: inputEndRef,
731
+ value: inputEndHoverValue.value
732
+ ? setInputValue(inputEndHoverValue.value)
733
+ : setInputValue(endDate.value),
734
+ }),
735
+ (props.indicator || props.cleaner) &&
736
+ h('span', { class: 'input-group-text' }, [
737
+ props.indicator &&
738
+ h(
739
+ 'span',
740
+ {
741
+ class: 'picker-input-group-indicator',
742
+ },
743
+ slots.indicator
744
+ ? slots.indicator()
745
+ : h('span', { class: 'picker-input-group-icon date-picker-input-icon' }),
746
+ ),
747
+ props.cleaner &&
748
+ h(
749
+ 'span',
750
+ {
751
+ class: 'picker-input-group-cleaner',
752
+ onClick: (event: Event) => handleClear(event),
753
+ role: 'button',
754
+ },
755
+ slots.cleaner
756
+ ? slots.cleaner()
757
+ : h('span', { class: 'picker-input-group-icon date-picker-cleaner-icon' }),
758
+ ),
759
+ ]),
760
+ ],
761
+ )
749
762
 
750
763
  return () =>
751
764
  h(
@@ -121,7 +121,7 @@ const CDropdown = defineComponent({
121
121
  /**
122
122
  * Offset of the dropdown menu relative to its target.
123
123
  *
124
- * @since 4.9.0-rc.0
124
+ * @since 4.9.0
125
125
  */
126
126
  offset: {
127
127
  type: Array,
@@ -14,6 +14,12 @@ const CFormCheck = defineComponent({
14
14
  * @see http://coreui.io/vue/docs/components/button.html
15
15
  */
16
16
  button: Object,
17
+ /**
18
+ * Use in conjunction with the v-model directive to specify the value that should be assigned to the bound variable when the checkbox is in the `false` state.
19
+ *
20
+ * @since 4.10.0
21
+ */
22
+ falseValue: String,
17
23
  /**
18
24
  * Provide valuable, actionable feedback.
19
25
  *
@@ -66,7 +72,7 @@ const CFormCheck = defineComponent({
66
72
  * The default name for a value passed using v-model.
67
73
  */
68
74
  modelValue: {
69
- type: [Boolean, String],
75
+ type: [Array, Boolean, String],
70
76
  value: undefined,
71
77
  },
72
78
  /**
@@ -81,6 +87,12 @@ const CFormCheck = defineComponent({
81
87
  * @since 4.3.0
82
88
  */
83
89
  tooltipFeedback: Boolean,
90
+ /**
91
+ * Use in conjunction with the v-model directive to specify the value that should be assigned to the bound variable when the checkbox is in the `true` state.
92
+ *
93
+ * @since 4.10.0
94
+ */
95
+ trueValue: String,
84
96
  /**
85
97
  * Specifies the type of component.
86
98
  *
@@ -111,8 +123,35 @@ const CFormCheck = defineComponent({
111
123
  ],
112
124
  setup(props, { attrs, emit, slots }) {
113
125
  const handleChange = (event: InputEvent) => {
126
+ const target = event.target as HTMLInputElement
114
127
  emit('change', event)
115
- emit('update:modelValue', (event.target as HTMLInputElement).value)
128
+
129
+ if (props.falseValue && props.trueValue) {
130
+ emit('update:modelValue', target.checked ? props.trueValue : props.falseValue)
131
+ return
132
+ }
133
+
134
+ if (props.value && Array.isArray(props.modelValue)) {
135
+ if (props.modelValue.includes(props.value)) {
136
+ emit(
137
+ 'update:modelValue',
138
+ props.modelValue.filter((value) => value !== props.value),
139
+ )
140
+ } else {
141
+ emit('update:modelValue', [...props.modelValue, props.value])
142
+ }
143
+
144
+ return
145
+ }
146
+
147
+ if (props.value === undefined) {
148
+ emit('update:modelValue', target.checked)
149
+ return
150
+ }
151
+
152
+ if (props.value && (props.modelValue === undefined || typeof props.modelValue === 'string')) {
153
+ emit('update:modelValue', target.checked ? props.value : undefined)
154
+ }
116
155
  }
117
156
 
118
157
  const className = [
@@ -135,12 +174,22 @@ const CFormCheck = defineComponent({
135
174
  },
136
175
  ]
137
176
 
138
- const isChecked = computed(() => props.modelValue == props.value)
177
+ const isChecked = computed(() => {
178
+ if (Array.isArray(props.modelValue)) {
179
+ return props.modelValue.includes(props.value)
180
+ }
181
+
182
+ if (typeof props.modelValue === 'string') {
183
+ return props.modelValue === props.value
184
+ }
185
+
186
+ return props.modelValue
187
+ })
139
188
 
140
189
  const formControl = () => {
141
190
  return h('input', {
142
191
  ...attrs,
143
- ...(props.modelValue && { checked: isChecked.value }),
192
+ ...(props.modelValue && props.value && { checked: isChecked.value }),
144
193
  class: inputClassName,
145
194
  id: props.id,
146
195
  indeterminate: props.indeterminate,
@@ -210,4 +259,4 @@ const CFormCheck = defineComponent({
210
259
  },
211
260
  })
212
261
 
213
- export { CFormCheck }
262
+ export { CFormCheck }
@@ -19,7 +19,7 @@ const CMultiSelect = defineComponent({
19
19
  /**
20
20
  * Allow users to create options if they are not in the list of options.
21
21
  *
22
- * @since 4.9.0-next.0
22
+ * @since 4.9.0
23
23
  */
24
24
  allowCreateOptions: Boolean,
25
25
  /**
@@ -34,7 +34,7 @@ const CMultiSelect = defineComponent({
34
34
  /**
35
35
  * Clear current search on selecting an item.
36
36
  *
37
- * @since 4.9.0-next.0
37
+ * @since 4.9.0
38
38
  */
39
39
  clearSearchOnSelect: Boolean,
40
40
  /**
@@ -78,7 +78,7 @@ const CMultiSelect = defineComponent({
78
78
  /**
79
79
  * When set, the options list will have a loading style: loading spinner and reduced opacity.
80
80
  *
81
- * @since 4.9.0-next.0
81
+ * @since 4.9.0
82
82
  */
83
83
  loading: Boolean,
84
84
  /**
@@ -12,7 +12,7 @@ const CPopover = defineComponent({
12
12
  /**
13
13
  * Apply a CSS fade transition to the popover.
14
14
  *
15
- * @since 4.9.0-rc.0
15
+ * @since 4.9.0
16
16
  */
17
17
  animation: {
18
18
  type: Boolean,
@@ -25,7 +25,7 @@ const CPopover = defineComponent({
25
25
  /**
26
26
  * The delay for displaying and hiding the popover (in milliseconds). When a numerical value is provided, the delay applies to both the hide and show actions. The object structure for specifying the delay is as follows: delay: `{ 'show': 500, 'hide': 100 }`.
27
27
  *
28
- * @since 4.9.0-rc.0
28
+ * @since 4.9.0
29
29
  */
30
30
  delay: {
31
31
  type: [Number, Object] as PropType<number | { show: number; hide: number }>,
@@ -34,7 +34,7 @@ const CPopover = defineComponent({
34
34
  /**
35
35
  * Specify the desired order of fallback placements by providing a list of placements as an array. The placements should be prioritized based on preference.
36
36
  *
37
- * @since 4.9.0-rc.0
37
+ * @since 4.9.0
38
38
  */
39
39
  fallbackPlacements: {
40
40
  type: [String, Array] as PropType<Placements | Placements[]>,
@@ -1,7 +1,6 @@
1
1
  import { defineComponent, h, ref, watch } from 'vue'
2
2
 
3
3
  import { CButton } from '../button'
4
- import { CInputGroup } from '../form'
5
4
  import { CFormControlWrapper } from '../form/CFormControlWrapper'
6
5
  import { CPicker } from '../picker'
7
6
 
@@ -392,60 +391,72 @@ const CTimePicker = defineComponent({
392
391
  }
393
392
 
394
393
  const InputGroup = () =>
395
- h(CInputGroup, { class: 'picker-input-group', size: props.size }, () => [
396
- h('input', {
397
- autocomplete: 'off',
398
- class: 'form-control',
399
- disabled: props.disabled,
400
- onInput: (event: Event) => {
401
- if (isValidTime((event.target as HTMLInputElement).value)) {
402
- date.value = convertTimeToDate((event.target as HTMLInputElement).value)
403
- }
404
- },
405
- placeholder: props.placeholder,
406
- readonly: props.inputReadOnly,
407
- ref: inputRef,
408
- required: props.required,
409
- value: date.value
410
- ? date.value.toLocaleTimeString(props.locale, {
411
- hour12: localizedTimePartials.value && localizedTimePartials.value.hour12,
412
- ...(!props.seconds && { timeStyle: 'short' }),
413
- })
414
- : '',
415
- }),
416
- (props.indicator || props.cleaner) &&
417
- h('div', { class: 'input-group-text' }, [
418
- props.indicator &&
419
- h(
420
- 'span',
421
- {
422
- class: 'picker-input-group-indicator',
423
- },
424
- slots.indicator
425
- ? slots.indicator()
426
- : h('span', { class: 'picker-input-group-icon time-picker-input-icon' }),
427
- ),
428
- props.cleaner &&
429
- h(
430
- 'span',
431
- {
432
- class: 'picker-input-group-cleaner',
433
- onClick: (event: Event) => handleClear(event),
434
- role: 'button',
435
- },
436
- slots.cleaner
437
- ? slots.cleaner()
438
- : h('span', { class: 'picker-input-group-icon time-picker-cleaner-icon' }),
439
- ),
440
- ]),
441
- ])
394
+ h(
395
+ 'div',
396
+ {
397
+ class: [
398
+ 'input-group',
399
+ 'picker-input-group',
400
+ {
401
+ [`input-group-${props.size}`]: props.size,
402
+ },
403
+ ],
404
+ },
405
+ [
406
+ h('input', {
407
+ autocomplete: 'off',
408
+ class: 'form-control',
409
+ disabled: props.disabled,
410
+ onInput: (event: Event) => {
411
+ if (isValidTime((event.target as HTMLInputElement).value)) {
412
+ date.value = convertTimeToDate((event.target as HTMLInputElement).value)
413
+ }
414
+ },
415
+ placeholder: props.placeholder,
416
+ readonly: props.inputReadOnly,
417
+ ref: inputRef,
418
+ required: props.required,
419
+ value: date.value
420
+ ? date.value.toLocaleTimeString(props.locale, {
421
+ hour12: localizedTimePartials.value && localizedTimePartials.value.hour12,
422
+ ...(!props.seconds && { timeStyle: 'short' }),
423
+ })
424
+ : '',
425
+ }),
426
+ (props.indicator || props.cleaner) &&
427
+ h('div', { class: 'input-group-text' }, [
428
+ props.indicator &&
429
+ h(
430
+ 'span',
431
+ {
432
+ class: 'picker-input-group-indicator',
433
+ },
434
+ slots.indicator
435
+ ? slots.indicator()
436
+ : h('span', { class: 'picker-input-group-icon time-picker-input-icon' }),
437
+ ),
438
+ props.cleaner &&
439
+ h(
440
+ 'span',
441
+ {
442
+ class: 'picker-input-group-cleaner',
443
+ onClick: (event: Event) => handleClear(event),
444
+ role: 'button',
445
+ },
446
+ slots.cleaner
447
+ ? slots.cleaner()
448
+ : h('span', { class: 'picker-input-group-icon time-picker-cleaner-icon' }),
449
+ ),
450
+ ]),
451
+ ],
452
+ )
442
453
 
443
454
  const TimePickerSelect = () => [
444
455
  h('span', { class: 'time-picker-inline-icon' }),
445
456
  h(
446
457
  'select',
447
458
  {
448
- class: 'time-picker-inline-select',
459
+ class: 'form-select',
449
460
  disabled: props.disabled,
450
461
  onChange: (event: Event) =>
451
462
  handleTimeChange('hours', (event.target as HTMLSelectElement).value),
@@ -466,7 +477,7 @@ const CTimePicker = defineComponent({
466
477
  h(
467
478
  'select',
468
479
  {
469
- class: 'time-picker-inline-select',
480
+ class: 'form-select',
470
481
  disabled: props.disabled,
471
482
  onChange: (event: Event) =>
472
483
  handleTimeChange('minutes', (event.target as HTMLSelectElement).value),
@@ -488,7 +499,7 @@ const CTimePicker = defineComponent({
488
499
  h(
489
500
  'select',
490
501
  {
491
- class: 'time-picker-inline-select',
502
+ class: 'form-select',
492
503
  disabled: props.disabled,
493
504
  onChange: (event: Event) =>
494
505
  handleTimeChange('seconds', (event.target as HTMLSelectElement).value),
@@ -510,7 +521,7 @@ const CTimePicker = defineComponent({
510
521
  h(
511
522
  'select',
512
523
  {
513
- class: 'time-picker-inline-select',
524
+ class: 'form-select',
514
525
  disabled: props.disabled,
515
526
  onChange: (event: Event) =>
516
527
  handleTimeChange('toggle', (event.target as HTMLSelectElement).value),
@@ -12,7 +12,7 @@ const CTooltip = defineComponent({
12
12
  /**
13
13
  * Apply a CSS fade transition to the tooltip.
14
14
  *
15
- * @since 4.9.0-rc.0
15
+ * @since 4.9.0
16
16
  */
17
17
  animation: {
18
18
  type: Boolean,
@@ -25,7 +25,7 @@ const CTooltip = defineComponent({
25
25
  /**
26
26
  * The delay for displaying and hiding the popover (in milliseconds). When a numerical value is provided, the delay applies to both the hide and show actions. The object structure for specifying the delay is as follows: delay: `{ 'show': 500, 'hide': 100 }`.
27
27
  *
28
- * @since 4.9.0-rc.0
28
+ * @since 4.9.0
29
29
  */
30
30
  delay: {
31
31
  type: [Number, Object] as PropType<number | { show: number; hide: number }>,
@@ -34,7 +34,7 @@ const CTooltip = defineComponent({
34
34
  /**
35
35
  * Specify the desired order of fallback placements by providing a list of placements as an array. The placements should be prioritized based on preference.
36
36
  *
37
- * @since 4.9.0-rc.0
37
+ * @since 4.9.0
38
38
  */
39
39
  fallbackPlacements: {
40
40
  type: [String, Array] as PropType<Placements | Placements[]>,
@@ -1,5 +1,5 @@
1
1
  import { Placement } from '@popperjs/core'
2
- import { isRTL } from '../utils'
2
+ import isRTL from './isRTL'
3
3
 
4
4
  const getRTLPlacement = (placement: string, element: HTMLDivElement | null): Placement => {
5
5
  switch (placement) {