@dimailn/vuetify 2.7.2-alpha28 → 2.7.2-alpha29
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/dist/vuetify.js +1416 -304
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +1 -1
- package/dist/vuetify.min.js +2 -2
- package/es5/components/VAlert/VAlert.js +38 -8
- package/es5/components/VAlert/VAlert.js.map +1 -1
- package/es5/components/VAutocomplete/VAutocomplete.js +1 -0
- package/es5/components/VAutocomplete/VAutocomplete.js.map +1 -1
- package/es5/components/VBadge/VBadge.js +28 -0
- package/es5/components/VBadge/VBadge.js.map +1 -1
- package/es5/components/VBanner/VBanner.js +34 -6
- package/es5/components/VBanner/VBanner.js.map +1 -1
- package/es5/components/VBottomNavigation/VBottomNavigation.js +25 -0
- package/es5/components/VBottomNavigation/VBottomNavigation.js.map +1 -1
- package/es5/components/VCarousel/VCarousel.js +28 -3
- package/es5/components/VCarousel/VCarousel.js.map +1 -1
- package/es5/components/VCheckbox/VSimpleCheckbox.js +30 -2
- package/es5/components/VCheckbox/VSimpleCheckbox.js.map +1 -1
- package/es5/components/VColorPicker/VColorPicker.js +30 -2
- package/es5/components/VColorPicker/VColorPicker.js.map +1 -1
- package/es5/components/VCombobox/VCombobox.js +1 -0
- package/es5/components/VCombobox/VCombobox.js.map +1 -1
- package/es5/components/VDataIterator/VDataFooter.js +16 -7
- package/es5/components/VDataIterator/VDataFooter.js.map +1 -1
- package/es5/components/VDataIterator/VDataIterator.js +42 -47
- package/es5/components/VDataIterator/VDataIterator.js.map +1 -1
- package/es5/components/VDataTable/RowGroup.js +46 -15
- package/es5/components/VDataTable/RowGroup.js.map +1 -1
- package/es5/components/VDataTable/VDataTable.js +10 -18
- package/es5/components/VDataTable/VDataTable.js.map +1 -1
- package/es5/components/VDataTable/VDataTableHeader.js.map +1 -1
- package/es5/components/VDataTable/VDataTableHeaderDesktop.js +3 -0
- package/es5/components/VDataTable/VDataTableHeaderDesktop.js.map +1 -1
- package/es5/components/VDataTable/VDataTableHeaderMobile.js +28 -37
- package/es5/components/VDataTable/VDataTableHeaderMobile.js.map +1 -1
- package/es5/components/VDataTable/VEditDialog.js +3 -4
- package/es5/components/VDataTable/VEditDialog.js.map +1 -1
- package/es5/components/VDataTable/VSimpleTable.js +1 -1
- package/es5/components/VDataTable/VSimpleTable.js.map +1 -1
- package/es5/components/VDataTable/VVirtualTable.js +5 -5
- package/es5/components/VDataTable/VVirtualTable.js.map +1 -1
- package/es5/components/VDataTable/mixins/header.js +1 -1
- package/es5/components/VDataTable/mixins/header.js.map +1 -1
- package/es5/components/VDatePicker/VDatePicker.js +21 -9
- package/es5/components/VDatePicker/VDatePicker.js.map +1 -1
- package/es5/components/VDatePicker/VDatePickerHeader.js +24 -8
- package/es5/components/VDatePicker/VDatePickerHeader.js.map +1 -1
- package/es5/components/VDatePicker/VDatePickerTitle.js +33 -8
- package/es5/components/VDatePicker/VDatePickerTitle.js.map +1 -1
- package/es5/components/VDatePicker/VDatePickerYears.js +38 -13
- package/es5/components/VDatePicker/VDatePickerYears.js.map +1 -1
- package/es5/components/VDatePicker/mixins/date-picker-table.js +33 -17
- package/es5/components/VDatePicker/mixins/date-picker-table.js.map +1 -1
- package/es5/components/VInput/VInput.js +36 -8
- package/es5/components/VInput/VInput.js.map +1 -1
- package/es5/components/VList/VListGroup.js +47 -21
- package/es5/components/VList/VListGroup.js.map +1 -1
- package/es5/components/VList/VListItem.js +29 -4
- package/es5/components/VList/VListItem.js.map +1 -1
- package/es5/components/VMenu/VMenu.js +55 -30
- package/es5/components/VMenu/VMenu.js.map +1 -1
- package/es5/components/VMessages/VMessages.js +30 -7
- package/es5/components/VMessages/VMessages.js.map +1 -1
- package/es5/components/VNavigationDrawer/VNavigationDrawer.js +36 -9
- package/es5/components/VNavigationDrawer/VNavigationDrawer.js.map +1 -1
- package/es5/components/VOverlay/VOverlay.js +28 -0
- package/es5/components/VOverlay/VOverlay.js.map +1 -1
- package/es5/components/VPagination/VPagination.js +30 -6
- package/es5/components/VPagination/VPagination.js.map +1 -1
- package/es5/components/VProgressLinear/VProgressLinear.js +28 -0
- package/es5/components/VProgressLinear/VProgressLinear.js.map +1 -1
- package/es5/components/VRadioGroup/VRadioGroup.js +28 -0
- package/es5/components/VRadioGroup/VRadioGroup.js.map +1 -1
- package/es5/components/VRating/VRating.js +45 -17
- package/es5/components/VRating/VRating.js.map +1 -1
- package/es5/components/VSelect/VSelect.js +112 -84
- package/es5/components/VSelect/VSelect.js.map +1 -1
- package/es5/components/VSelect/VSelectList.js +58 -17
- package/es5/components/VSelect/VSelectList.js.map +1 -1
- package/es5/components/VSlider/VSlider.js +42 -16
- package/es5/components/VSlider/VSlider.js.map +1 -1
- package/es5/components/VSpeedDial/VSpeedDial.js +10 -8
- package/es5/components/VSpeedDial/VSpeedDial.js.map +1 -1
- package/es5/components/VTabs/VTabs.js +45 -17
- package/es5/components/VTabs/VTabs.js.map +1 -1
- package/es5/framework.js +1 -1
- package/es5/mixins/validatable/index.js +24 -0
- package/es5/mixins/validatable/index.js.map +1 -1
- package/es5/util/console.js +49 -18
- package/es5/util/console.js.map +1 -1
- package/es5/util/helpers.js +5 -1
- package/es5/util/helpers.js.map +1 -1
- package/lib/components/VAlert/VAlert.js +12 -6
- package/lib/components/VAlert/VAlert.js.map +1 -1
- package/lib/components/VAutocomplete/VAutocomplete.js +1 -0
- package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
- package/lib/components/VBadge/VBadge.js +11 -0
- package/lib/components/VBadge/VBadge.js.map +1 -1
- package/lib/components/VBanner/VBanner.js +11 -0
- package/lib/components/VBanner/VBanner.js.map +1 -1
- package/lib/components/VBottomNavigation/VBottomNavigation.js +7 -0
- package/lib/components/VBottomNavigation/VBottomNavigation.js.map +1 -1
- package/lib/components/VCarousel/VCarousel.js +7 -0
- package/lib/components/VCarousel/VCarousel.js.map +1 -1
- package/lib/components/VCheckbox/VSimpleCheckbox.js +11 -0
- package/lib/components/VCheckbox/VSimpleCheckbox.js.map +1 -1
- package/lib/components/VColorPicker/VColorPicker.js +12 -1
- package/lib/components/VColorPicker/VColorPicker.js.map +1 -1
- package/lib/components/VCombobox/VCombobox.js +1 -0
- package/lib/components/VCombobox/VCombobox.js.map +1 -1
- package/lib/components/VDataIterator/VDataFooter.js +14 -7
- package/lib/components/VDataIterator/VDataFooter.js.map +1 -1
- package/lib/components/VDataIterator/VDataIterator.js +26 -31
- package/lib/components/VDataIterator/VDataIterator.js.map +1 -1
- package/lib/components/VDataTable/RowGroup.js +30 -14
- package/lib/components/VDataTable/RowGroup.js.map +1 -1
- package/lib/components/VDataTable/VDataTable.js +8 -15
- package/lib/components/VDataTable/VDataTable.js.map +1 -1
- package/lib/components/VDataTable/VDataTableHeader.js +1 -1
- package/lib/components/VDataTable/VDataTableHeader.js.map +1 -1
- package/lib/components/VDataTable/VDataTableHeaderDesktop.js +3 -0
- package/lib/components/VDataTable/VDataTableHeaderDesktop.js.map +1 -1
- package/lib/components/VDataTable/VDataTableHeaderMobile.js +17 -25
- package/lib/components/VDataTable/VDataTableHeaderMobile.js.map +1 -1
- package/lib/components/VDataTable/VEditDialog.js +3 -4
- package/lib/components/VDataTable/VEditDialog.js.map +1 -1
- package/lib/components/VDataTable/VSimpleTable.js +1 -1
- package/lib/components/VDataTable/VSimpleTable.js.map +1 -1
- package/lib/components/VDataTable/VVirtualTable.js +1 -2
- package/lib/components/VDataTable/VVirtualTable.js.map +1 -1
- package/lib/components/VDataTable/mixins/header.js +1 -1
- package/lib/components/VDataTable/mixins/header.js.map +1 -1
- package/lib/components/VDatePicker/VDatePicker.js +7 -1
- package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
- package/lib/components/VDatePicker/VDatePickerHeader.js +12 -1
- package/lib/components/VDatePicker/VDatePickerHeader.js.map +1 -1
- package/lib/components/VDatePicker/VDatePickerTitle.js +11 -0
- package/lib/components/VDatePicker/VDatePickerTitle.js.map +1 -1
- package/lib/components/VDatePicker/VDatePickerYears.js +11 -1
- package/lib/components/VDatePicker/VDatePickerYears.js.map +1 -1
- package/lib/components/VDatePicker/mixins/date-picker-table.js +12 -1
- package/lib/components/VDatePicker/mixins/date-picker-table.js.map +1 -1
- package/lib/components/VInput/VInput.js +13 -3
- package/lib/components/VInput/VInput.js.map +1 -1
- package/lib/components/VList/VListGroup.js +16 -8
- package/lib/components/VList/VListGroup.js.map +1 -1
- package/lib/components/VList/VListItem.js +8 -1
- package/lib/components/VList/VListItem.js.map +1 -1
- package/lib/components/VMenu/VMenu.js +14 -3
- package/lib/components/VMenu/VMenu.js.map +1 -1
- package/lib/components/VMessages/VMessages.js +13 -2
- package/lib/components/VMessages/VMessages.js.map +1 -1
- package/lib/components/VNavigationDrawer/VNavigationDrawer.js +11 -2
- package/lib/components/VNavigationDrawer/VNavigationDrawer.js.map +1 -1
- package/lib/components/VOverlay/VOverlay.js +11 -0
- package/lib/components/VOverlay/VOverlay.js.map +1 -1
- package/lib/components/VPagination/VPagination.js +11 -0
- package/lib/components/VPagination/VPagination.js.map +1 -1
- package/lib/components/VProgressLinear/VProgressLinear.js +11 -0
- package/lib/components/VProgressLinear/VProgressLinear.js.map +1 -1
- package/lib/components/VRadioGroup/VRadioGroup.js +11 -0
- package/lib/components/VRadioGroup/VRadioGroup.js.map +1 -1
- package/lib/components/VRating/VRating.js +11 -0
- package/lib/components/VRating/VRating.js.map +1 -1
- package/lib/components/VSelect/VSelect.js +52 -36
- package/lib/components/VSelect/VSelect.js.map +1 -1
- package/lib/components/VSelect/VSelectList.js +21 -3
- package/lib/components/VSelect/VSelectList.js.map +1 -1
- package/lib/components/VSlider/VSlider.js +11 -1
- package/lib/components/VSlider/VSlider.js.map +1 -1
- package/lib/components/VSpeedDial/VSpeedDial.js +7 -7
- package/lib/components/VSpeedDial/VSpeedDial.js.map +1 -1
- package/lib/components/VTabs/VTabs.js +11 -0
- package/lib/components/VTabs/VTabs.js.map +1 -1
- package/lib/framework.js +1 -1
- package/lib/mixins/validatable/index.js +7 -1
- package/lib/mixins/validatable/index.js.map +1 -1
- package/lib/util/console.js +47 -17
- package/lib/util/console.js.map +1 -1
- package/lib/util/helpers.js +5 -1
- package/lib/util/helpers.js.map +1 -1
- package/package.json +1 -1
- package/src/components/VAlert/VAlert.ts +17 -7
- package/src/components/VAlert/__tests__/VAlert.spec.ts +78 -50
- package/src/components/VAlert/__tests__/__snapshots__/VAlert.spec.ts.snap +16 -18
- package/src/components/VAutocomplete/VAutocomplete.ts +22 -0
- package/src/components/VAutocomplete/__tests__/VAutocomplete.spec.ts +51 -53
- package/src/components/VAutocomplete/__tests__/VAutocomplete2.spec.ts +77 -48
- package/src/components/VAutocomplete/__tests__/VAutocomplete3.spec.ts +101 -39
- package/src/components/VBadge/VBadge.ts +13 -0
- package/src/components/VBanner/VBanner.ts +13 -0
- package/src/components/VBottomNavigation/VBottomNavigation.ts +10 -0
- package/src/components/VCarousel/VCarousel.ts +11 -0
- package/src/components/VCheckbox/VSimpleCheckbox.ts +13 -0
- package/src/components/VColorPicker/VColorPicker.ts +13 -0
- package/src/components/VCombobox/VCombobox.ts +23 -0
- package/src/components/VCombobox/__tests__/VCombobox-multiple.spec.ts +118 -110
- package/src/components/VCombobox/__tests__/VCombobox.spec.ts +119 -93
- package/src/components/VDataIterator/VDataFooter.ts +14 -9
- package/src/components/VDataIterator/VDataIterator.ts +46 -34
- package/src/components/VDataIterator/__tests__/VDataFooter.spec.ts +38 -39
- package/src/components/VDataIterator/__tests__/VDataIterator.spec.ts +90 -122
- package/src/components/VDataIterator/__tests__/__snapshots__/VDataFooter.spec.ts.snap +92 -82
- package/src/components/VDataIterator/__tests__/__snapshots__/VDataIterator.spec.ts.snap +79 -69
- package/src/components/VDataTable/RowGroup.ts +33 -16
- package/src/components/VDataTable/VDataTable.ts +8 -15
- package/src/components/VDataTable/VDataTableHeader.ts +2 -2
- package/src/components/VDataTable/VDataTableHeaderDesktop.ts +4 -0
- package/src/components/VDataTable/VDataTableHeaderMobile.ts +16 -25
- package/src/components/VDataTable/VEditDialog.ts +3 -3
- package/src/components/VDataTable/VSimpleTable.ts +2 -3
- package/src/components/VDataTable/VVirtualTable.ts +1 -2
- package/src/components/VDataTable/__tests__/VDataTable.spec.ts +18 -22
- package/src/components/VDataTable/__tests__/VDataTableHeader.spec.ts +39 -29
- package/src/components/VDataTable/__tests__/VEditDialog.spec.ts +7 -2
- package/src/components/VDataTable/__tests__/VSimpleTable.spec.ts +11 -16
- package/src/components/VDataTable/__tests__/__snapshots__/VDataTable.spec.ts.snap +2543 -2086
- package/src/components/VDataTable/__tests__/__snapshots__/VDataTableHeader.spec.ts.snap +115 -144
- package/src/components/VDataTable/__tests__/__snapshots__/VEditDialog.spec.ts.snap +4 -12
- package/src/components/VDataTable/__tests__/__snapshots__/VSimpleTable.spec.ts.snap +22 -18
- package/src/components/VDataTable/mixins/__tests__/__snapshots__/header.spec.ts.snap +9 -12
- package/src/components/VDataTable/mixins/__tests__/header.spec.ts +15 -15
- package/src/components/VDataTable/mixins/header.ts +1 -1
- package/src/components/VDatePicker/VDatePicker.ts +11 -1
- package/src/components/VDatePicker/VDatePickerHeader.ts +13 -0
- package/src/components/VDatePicker/VDatePickerTitle.ts +12 -0
- package/src/components/VDatePicker/VDatePickerYears.ts +13 -0
- package/src/components/VDatePicker/mixins/date-picker-table.ts +13 -0
- package/src/components/VInput/VInput.ts +18 -5
- package/src/components/VList/VListGroup.ts +22 -10
- package/src/components/VList/VListItem.ts +10 -1
- package/src/components/VMenu/VMenu.ts +21 -3
- package/src/components/VMenu/__tests__/VMenu.spec.ts +90 -69
- package/src/components/VMenu/__tests__/__snapshots__/VMenu.spec.ts.snap +3 -5
- package/src/components/VMessages/VMessages.ts +15 -4
- package/src/components/VMessages/__tests__/VMessages.spec.ts +43 -5
- package/src/components/VMessages/__tests__/__snapshots__/VMessages.spec.ts.snap +16 -25
- package/src/components/VNavigationDrawer/VNavigationDrawer.ts +21 -11
- package/src/components/VOverlay/VOverlay.ts +12 -0
- package/src/components/VPagination/VPagination.ts +23 -9
- package/src/components/VProgressLinear/VProgressLinear.ts +13 -0
- package/src/components/VRadioGroup/VRadioGroup.ts +14 -0
- package/src/components/VRating/VRating.ts +13 -0
- package/src/components/VSelect/VSelect.ts +60 -43
- package/src/components/VSelect/VSelectList.ts +29 -8
- package/src/components/VSlider/VSlider.ts +14 -1
- package/src/components/VSpeedDial/VSpeedDial.ts +7 -8
- package/src/components/VSpeedDial/__tests__/VSpeedDial.spec.ts +21 -13
- package/src/components/VSpeedDial/__tests__/__snapshots__/VSpeedDial.spec.ts.snap +6 -6
- package/src/components/VTabs/VTabs.ts +14 -0
- package/src/mixins/validatable/index.ts +11 -1
- package/src/util/__tests__/console.spec.ts +124 -11
- package/src/util/__tests__/helpers.spec.ts +59 -31
- package/src/util/console.ts +43 -24
- package/src/util/helpers.ts +8 -4
|
@@ -5,26 +5,33 @@ import VCombobox from '../VCombobox'
|
|
|
5
5
|
import {
|
|
6
6
|
mount,
|
|
7
7
|
Wrapper,
|
|
8
|
+
enableAutoUnmount,
|
|
8
9
|
} from '@vue/test-utils'
|
|
10
|
+
import { nextTick } from 'vue'
|
|
9
11
|
|
|
10
12
|
describe('VCombobox.ts', () => {
|
|
11
13
|
type Instance = InstanceType<typeof VCombobox>
|
|
12
14
|
let mountFunction: (options?: object) => Wrapper<Instance>
|
|
13
15
|
|
|
16
|
+
enableAutoUnmount(afterEach)
|
|
17
|
+
|
|
14
18
|
beforeEach(() => {
|
|
15
19
|
document.body.setAttribute('data-app', 'true')
|
|
16
20
|
|
|
17
21
|
mountFunction = (options = {}) => {
|
|
18
22
|
return mount(VCombobox, {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
global: {
|
|
24
|
+
mocks: {
|
|
25
|
+
$vuetify: {
|
|
26
|
+
lang: {
|
|
27
|
+
t: (val: string) => val,
|
|
28
|
+
},
|
|
29
|
+
theme: {
|
|
30
|
+
dark: false,
|
|
31
|
+
},
|
|
32
|
+
icons: {
|
|
33
|
+
component: null,
|
|
34
|
+
},
|
|
28
35
|
},
|
|
29
36
|
},
|
|
30
37
|
},
|
|
@@ -37,135 +44,148 @@ describe('VCombobox.ts', () => {
|
|
|
37
44
|
// https://github.com/vuejs/vue-test-utils/issues/1130
|
|
38
45
|
it.skip('should evaluate the range of an integer', async () => {
|
|
39
46
|
const wrapper = mountFunction({
|
|
40
|
-
|
|
41
|
-
|
|
47
|
+
props: {
|
|
48
|
+
modelValue: 11,
|
|
42
49
|
},
|
|
43
50
|
})
|
|
44
51
|
|
|
45
|
-
await
|
|
52
|
+
await nextTick()
|
|
46
53
|
expect(wrapper.vm.currentRange).toBe(2)
|
|
47
54
|
|
|
48
|
-
wrapper.setProps({
|
|
49
|
-
await
|
|
55
|
+
await wrapper.setProps({ modelValue: 0 })
|
|
56
|
+
await nextTick()
|
|
50
57
|
expect(wrapper.vm.currentRange).toBe(1)
|
|
51
58
|
})
|
|
52
59
|
|
|
53
60
|
it('should not use search input when blurring', async () => {
|
|
54
61
|
const wrapper = mountFunction({
|
|
55
|
-
|
|
56
|
-
|
|
62
|
+
attachTo: document.body,
|
|
63
|
+
props: {
|
|
57
64
|
eager: true,
|
|
58
65
|
items: [1, 12],
|
|
59
66
|
},
|
|
60
67
|
})
|
|
61
68
|
|
|
62
|
-
const event = jest.fn()
|
|
63
|
-
wrapper.vm.$on('input', event)
|
|
64
|
-
|
|
65
69
|
const input = wrapper.find('input')
|
|
66
70
|
input.trigger('focus')
|
|
67
|
-
await
|
|
71
|
+
await nextTick()
|
|
68
72
|
|
|
69
|
-
wrapper.setProps({ searchInput: '1' })
|
|
70
|
-
await
|
|
73
|
+
await wrapper.setProps({ searchInput: '1' })
|
|
74
|
+
await nextTick()
|
|
71
75
|
|
|
72
76
|
expect(wrapper.vm.internalSearch).toBe('1')
|
|
73
77
|
|
|
74
|
-
const
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
+
const listItems = wrapper.findAll('.v-list-item')
|
|
79
|
+
if (listItems.length > 1) {
|
|
80
|
+
const list = listItems[1]
|
|
81
|
+
list.trigger('click')
|
|
82
|
+
await nextTick()
|
|
83
|
+
|
|
84
|
+
const emitted = wrapper.emitted('update:modelValue')
|
|
85
|
+
expect(emitted).toBeTruthy()
|
|
86
|
+
expect(emitted![0]).toEqual([12])
|
|
87
|
+
}
|
|
78
88
|
})
|
|
79
89
|
|
|
80
90
|
it('should not use search input if an option is selected from the menu', async () => {
|
|
81
91
|
const item = { value: 123, text: 'Foo' }
|
|
82
92
|
const wrapper = mountFunction({
|
|
83
|
-
|
|
93
|
+
props: {
|
|
84
94
|
items: [item],
|
|
85
95
|
},
|
|
86
96
|
})
|
|
87
97
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
wrapper.setData({ isMenuActive: true })
|
|
92
|
-
await wrapper.vm.$nextTick()
|
|
98
|
+
wrapper.vm.isMenuActive = true
|
|
99
|
+
await nextTick()
|
|
93
100
|
|
|
94
101
|
wrapper.vm.selectItem(item)
|
|
95
|
-
await
|
|
102
|
+
await nextTick()
|
|
96
103
|
|
|
97
|
-
wrapper.
|
|
98
|
-
await
|
|
104
|
+
wrapper.vm.isMenuActive = false
|
|
105
|
+
await nextTick()
|
|
99
106
|
|
|
100
|
-
|
|
107
|
+
const emitted = wrapper.emitted('update:modelValue')
|
|
108
|
+
expect(emitted).toBeTruthy()
|
|
109
|
+
expect(emitted![0]).toEqual([item])
|
|
101
110
|
})
|
|
102
111
|
|
|
103
112
|
it('should not populate search field if value is falsey', async () => {
|
|
104
113
|
const wrapper = mountFunction()
|
|
105
114
|
|
|
106
|
-
|
|
107
|
-
|
|
115
|
+
wrapper.vm.isMenuActive = true
|
|
116
|
+
await nextTick()
|
|
108
117
|
|
|
109
|
-
wrapper.
|
|
110
|
-
await
|
|
118
|
+
await wrapper.setProps({ searchInput: '' })
|
|
119
|
+
await nextTick()
|
|
111
120
|
|
|
112
|
-
wrapper.
|
|
113
|
-
await
|
|
121
|
+
wrapper.vm.isMenuActive = false
|
|
122
|
+
await nextTick()
|
|
114
123
|
|
|
115
|
-
wrapper.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
expect(event).not.toHaveBeenCalled()
|
|
124
|
+
const emitted = wrapper.emitted('update:modelValue')
|
|
125
|
+
expect(emitted).toBeFalsy()
|
|
119
126
|
})
|
|
120
127
|
|
|
121
128
|
// TODO: fails with TS 3.9
|
|
122
129
|
it.skip('should clear value', async () => {
|
|
123
130
|
const wrapper = mountFunction({
|
|
124
|
-
|
|
131
|
+
attachTo: document.body,
|
|
125
132
|
})
|
|
126
|
-
await
|
|
133
|
+
await nextTick()
|
|
127
134
|
|
|
128
|
-
const change = jest.fn()
|
|
129
135
|
const input = wrapper.find('input')
|
|
130
136
|
const element = input.element as HTMLInputElement
|
|
131
137
|
|
|
132
|
-
wrapper.vm.$on('change', change)
|
|
133
|
-
wrapper.vm.$on('input', change)
|
|
134
|
-
|
|
135
138
|
input.trigger('focus')
|
|
136
139
|
element.value = 'foo'
|
|
137
140
|
input.trigger('input')
|
|
138
141
|
input.trigger('keydown.enter')
|
|
139
142
|
|
|
140
|
-
await
|
|
143
|
+
await nextTick()
|
|
141
144
|
|
|
142
|
-
|
|
143
|
-
expect(
|
|
145
|
+
const emitted = wrapper.emitted('update:modelValue')
|
|
146
|
+
expect(emitted).toBeTruthy()
|
|
147
|
+
expect(emitted![0]).toEqual(['foo'])
|
|
144
148
|
expect(wrapper.vm.internalValue).toBe('foo')
|
|
145
149
|
|
|
146
150
|
element.value = ''
|
|
147
151
|
input.trigger('input')
|
|
148
152
|
input.trigger('keydown.enter')
|
|
149
153
|
|
|
150
|
-
await
|
|
154
|
+
await nextTick()
|
|
151
155
|
|
|
152
156
|
expect(wrapper.vm.internalValue).toBe('')
|
|
153
|
-
|
|
157
|
+
const allEmitted = wrapper.emitted('update:modelValue')
|
|
158
|
+
expect(allEmitted).toHaveLength(2)
|
|
154
159
|
})
|
|
155
160
|
|
|
156
161
|
it('should call methods on blur', async () => {
|
|
157
162
|
const updateCombobox = jest.fn()
|
|
158
163
|
const wrapper = mountFunction({
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
164
|
+
attachTo: document.body,
|
|
165
|
+
global: {
|
|
166
|
+
mocks: {
|
|
167
|
+
$vuetify: {
|
|
168
|
+
lang: {
|
|
169
|
+
t: (val: string) => val,
|
|
170
|
+
},
|
|
171
|
+
theme: {
|
|
172
|
+
dark: false,
|
|
173
|
+
},
|
|
174
|
+
icons: {
|
|
175
|
+
component: null,
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
},
|
|
162
179
|
},
|
|
163
180
|
})
|
|
164
181
|
|
|
182
|
+
// Mock the method
|
|
183
|
+
wrapper.vm.updateCombobox = updateCombobox
|
|
184
|
+
|
|
165
185
|
const e = { preventDefault: jest.fn() }
|
|
166
186
|
wrapper.vm.onEnterDown(e)
|
|
167
187
|
|
|
168
|
-
await
|
|
188
|
+
await nextTick()
|
|
169
189
|
|
|
170
190
|
// https://github.com/vuetifyjs/vuetify/issues/4974
|
|
171
191
|
expect(e.preventDefault).toHaveBeenCalled()
|
|
@@ -178,18 +198,18 @@ describe('VCombobox.ts', () => {
|
|
|
178
198
|
const input = wrapper.find('input')
|
|
179
199
|
const element = input.element as HTMLInputElement
|
|
180
200
|
|
|
181
|
-
const change = jest.fn()
|
|
182
|
-
wrapper.vm.$on('change', change)
|
|
183
|
-
|
|
184
201
|
input.trigger('focus')
|
|
185
|
-
await
|
|
202
|
+
await nextTick()
|
|
186
203
|
|
|
187
204
|
element.value = 'foo'
|
|
188
205
|
input.trigger('input')
|
|
189
206
|
|
|
190
207
|
input.trigger('keydown.enter')
|
|
191
|
-
await
|
|
192
|
-
|
|
208
|
+
await nextTick()
|
|
209
|
+
|
|
210
|
+
const emitted = wrapper.emitted('update:modelValue')
|
|
211
|
+
expect(emitted).toBeTruthy()
|
|
212
|
+
expect(emitted![0]).toEqual(['foo'])
|
|
193
213
|
|
|
194
214
|
input.trigger('keydown.esc')
|
|
195
215
|
expect(wrapper.vm.isMenuActive).toBe(false)
|
|
@@ -197,14 +217,14 @@ describe('VCombobox.ts', () => {
|
|
|
197
217
|
element.value = ''
|
|
198
218
|
input.trigger('input')
|
|
199
219
|
|
|
200
|
-
await
|
|
220
|
+
await nextTick()
|
|
201
221
|
expect(wrapper.vm.isMenuActive).toBe(false)
|
|
202
222
|
})
|
|
203
223
|
|
|
204
224
|
it('should conditionally show the menu', async () => {
|
|
205
225
|
const wrapper = mountFunction({
|
|
206
|
-
|
|
207
|
-
|
|
226
|
+
attachTo: document.body,
|
|
227
|
+
props: {
|
|
208
228
|
items: ['foo', 'bar', 'fizz'],
|
|
209
229
|
searchInput: 'foobar',
|
|
210
230
|
},
|
|
@@ -217,16 +237,17 @@ describe('VCombobox.ts', () => {
|
|
|
217
237
|
input.trigger('focus')
|
|
218
238
|
|
|
219
239
|
expect(wrapper.vm.isFocused).toBe(true)
|
|
220
|
-
|
|
240
|
+
// Note: $_menuProps might not be available in Vue 3, checking isMenuActive instead
|
|
241
|
+
expect(wrapper.vm.isMenuActive).toBe(false)
|
|
221
242
|
|
|
222
243
|
slot.trigger('click')
|
|
223
244
|
|
|
224
|
-
expect(wrapper.vm
|
|
245
|
+
expect(wrapper.vm.isMenuActive).toBe(false)
|
|
225
246
|
|
|
226
247
|
// TODO: Add expects for tags when impl
|
|
227
248
|
})
|
|
228
249
|
|
|
229
|
-
it('should return an object', () => {
|
|
250
|
+
it('should return an object', async () => {
|
|
230
251
|
const items = [
|
|
231
252
|
{ text: 'Programming', value: 0 },
|
|
232
253
|
{ text: 'Design', value: 1 },
|
|
@@ -234,8 +255,8 @@ describe('VCombobox.ts', () => {
|
|
|
234
255
|
{ text: 'Vuetify', value: 3 },
|
|
235
256
|
]
|
|
236
257
|
const wrapper = mountFunction({
|
|
237
|
-
|
|
238
|
-
|
|
258
|
+
attachTo: document.body,
|
|
259
|
+
props: {
|
|
239
260
|
items,
|
|
240
261
|
},
|
|
241
262
|
})
|
|
@@ -243,16 +264,16 @@ describe('VCombobox.ts', () => {
|
|
|
243
264
|
const input = wrapper.find('input')
|
|
244
265
|
const element = input.element as HTMLInputElement
|
|
245
266
|
|
|
246
|
-
const event = jest.fn()
|
|
247
|
-
wrapper.vm.$on('input', event)
|
|
248
|
-
|
|
249
267
|
input.trigger('focus')
|
|
250
268
|
element.value = 'Programming'
|
|
251
269
|
input.trigger('input')
|
|
252
270
|
wrapper.vm.selectItem(items[0])
|
|
253
271
|
|
|
254
272
|
expect(wrapper.vm.isFocused).toBe(true)
|
|
255
|
-
|
|
273
|
+
|
|
274
|
+
const emitted = wrapper.emitted('update:modelValue')
|
|
275
|
+
expect(emitted).toBeTruthy()
|
|
276
|
+
expect(emitted![0]).toEqual([items[0]])
|
|
256
277
|
|
|
257
278
|
input.trigger('keydown.tab')
|
|
258
279
|
|
|
@@ -266,19 +287,21 @@ describe('VCombobox.ts', () => {
|
|
|
266
287
|
it.skip('should select item if menu index is greater than -1', async () => {
|
|
267
288
|
const selectItem = jest.fn()
|
|
268
289
|
const wrapper = mountFunction({
|
|
269
|
-
|
|
290
|
+
props: {
|
|
270
291
|
items: ['foo'],
|
|
271
292
|
},
|
|
272
|
-
methods: { selectItem },
|
|
273
293
|
})
|
|
274
294
|
|
|
295
|
+
// Mock the method
|
|
296
|
+
wrapper.vm.selectItem = selectItem
|
|
297
|
+
|
|
275
298
|
const input = wrapper.find('input')
|
|
276
299
|
|
|
277
300
|
input.trigger('focus')
|
|
278
301
|
input.trigger('keydown.enter')
|
|
279
302
|
input.trigger('keydown.down')
|
|
280
303
|
|
|
281
|
-
await
|
|
304
|
+
await nextTick()
|
|
282
305
|
|
|
283
306
|
expect(wrapper.vm.getMenuIndex()).toBe(0)
|
|
284
307
|
|
|
@@ -303,7 +326,7 @@ describe('VCombobox.ts', () => {
|
|
|
303
326
|
wrapper.vm.setValue(undefined)
|
|
304
327
|
expect(wrapper.vm.internalValue).toBeUndefined()
|
|
305
328
|
|
|
306
|
-
wrapper.
|
|
329
|
+
wrapper.vm.lazySearch = 'foo'
|
|
307
330
|
|
|
308
331
|
wrapper.vm.setValue(null)
|
|
309
332
|
expect(wrapper.vm.internalValue).toBeNull()
|
|
@@ -319,13 +342,13 @@ describe('VCombobox.ts', () => {
|
|
|
319
342
|
},
|
|
320
343
|
})
|
|
321
344
|
|
|
322
|
-
expect(wrapper.
|
|
345
|
+
expect(wrapper.attributes('autocomplete')).toBe('on')
|
|
323
346
|
})
|
|
324
347
|
|
|
325
348
|
// https://github.com/vuetifyjs/vuetify/issues/6607
|
|
326
349
|
it('should select first row when autoSelectFirst true is applied', async () => {
|
|
327
350
|
const wrapper = mountFunction({
|
|
328
|
-
|
|
351
|
+
props: {
|
|
329
352
|
autoSelectFirst: true,
|
|
330
353
|
items: [
|
|
331
354
|
{ text: 'Learn JavaScript', done: false },
|
|
@@ -339,16 +362,19 @@ describe('VCombobox.ts', () => {
|
|
|
339
362
|
const input = wrapper.find('input')
|
|
340
363
|
const element = input.element as HTMLInputElement
|
|
341
364
|
|
|
342
|
-
const listIndexUpdate = jest.fn()
|
|
343
|
-
wrapper.vm.$on('update:list-index', listIndexUpdate)
|
|
344
|
-
|
|
345
365
|
input.trigger('focus')
|
|
346
|
-
await
|
|
366
|
+
await nextTick()
|
|
347
367
|
element.value = 'L'
|
|
348
368
|
input.trigger('input')
|
|
349
|
-
await
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
369
|
+
await nextTick()
|
|
370
|
+
|
|
371
|
+
// Check if the event is emitted with the correct name
|
|
372
|
+
const emitted = wrapper.emitted('update:list-index') || wrapper.emitted('update:listIndex')
|
|
373
|
+
if (emitted) {
|
|
374
|
+
expect(emitted[0]).toEqual([0])
|
|
375
|
+
} else {
|
|
376
|
+
// If the event is not emitted, check if the list index is updated internally
|
|
377
|
+
expect(wrapper.vm.listIndex).toBe(0)
|
|
378
|
+
}
|
|
353
379
|
})
|
|
354
380
|
})
|
|
@@ -8,7 +8,6 @@ import VBtn from '../VBtn'
|
|
|
8
8
|
// Types
|
|
9
9
|
import { defineComponent, VNode, VNodeChildrenArrayContents, PropType, h } from 'vue'
|
|
10
10
|
import { DataPagination, DataOptions, DataItemsPerPageOption } from 'vuetify/types'
|
|
11
|
-
import { PropValidator } from 'vue/types/options'
|
|
12
11
|
import { getSlot, normalizeAttrs } from '../../util/helpers'
|
|
13
12
|
|
|
14
13
|
export default defineComponent({
|
|
@@ -24,9 +23,9 @@ export default defineComponent({
|
|
|
24
23
|
required: true,
|
|
25
24
|
},
|
|
26
25
|
itemsPerPageOptions: {
|
|
27
|
-
type: Array
|
|
26
|
+
type: Array as PropType<DataItemsPerPageOption[]>,
|
|
28
27
|
default: () => ([5, 10, 15, -1]),
|
|
29
|
-
}
|
|
28
|
+
},
|
|
30
29
|
prevIcon: {
|
|
31
30
|
type: String,
|
|
32
31
|
default: '$prev',
|
|
@@ -61,7 +60,9 @@ export default defineComponent({
|
|
|
61
60
|
},
|
|
62
61
|
},
|
|
63
62
|
|
|
64
|
-
emits:
|
|
63
|
+
emits: {
|
|
64
|
+
'update:options': (options: DataOptions) => true,
|
|
65
|
+
},
|
|
65
66
|
|
|
66
67
|
computed: {
|
|
67
68
|
disableNextPageIcon (): boolean {
|
|
@@ -122,7 +123,7 @@ export default defineComponent({
|
|
|
122
123
|
hideDetails: true,
|
|
123
124
|
auto: true,
|
|
124
125
|
minWidth: '75px',
|
|
125
|
-
|
|
126
|
+
'onUpdate:modelValue': this.onChangeItemsPerPage,
|
|
126
127
|
})),
|
|
127
128
|
])
|
|
128
129
|
},
|
|
@@ -138,11 +139,15 @@ export default defineComponent({
|
|
|
138
139
|
? itemsLength
|
|
139
140
|
: this.pagination.pageStop
|
|
140
141
|
|
|
141
|
-
|
|
142
|
-
|
|
142
|
+
const pageTextSlot = getSlot(this, 'page-text', { pageStart, pageStop, itemsLength })
|
|
143
|
+
children = pageTextSlot
|
|
144
|
+
? [pageTextSlot]
|
|
143
145
|
: [this.$vuetify.lang.t(this.pageText, pageStart, pageStop, itemsLength)]
|
|
144
|
-
} else
|
|
145
|
-
|
|
146
|
+
} else {
|
|
147
|
+
const pageTextSlot = getSlot(this, 'page-text', { pageStart, pageStop, itemsLength })
|
|
148
|
+
if (pageTextSlot) {
|
|
149
|
+
children = [pageTextSlot]
|
|
150
|
+
}
|
|
146
151
|
}
|
|
147
152
|
|
|
148
153
|
return h('div', {
|
|
@@ -12,32 +12,30 @@ import { deepEqual, getObjectValueByPath, getPrefixedScopedSlots, getSlot, camel
|
|
|
12
12
|
import { breaking, removed } from '../../util/console'
|
|
13
13
|
|
|
14
14
|
// Types
|
|
15
|
-
import { VNode, VNodeChildren } from 'vue'
|
|
16
|
-
import { PropValidator } from 'vue/types/options'
|
|
15
|
+
import { h, VNode, VNodeChildren, PropType, defineComponent } from 'vue'
|
|
17
16
|
import { DataItemProps, DataScopeProps } from 'vuetify/types'
|
|
18
17
|
|
|
19
18
|
/* @vue/component */
|
|
20
|
-
export default
|
|
21
|
-
Mobile,
|
|
22
|
-
Themeable
|
|
23
|
-
).extend({
|
|
19
|
+
export default defineComponent({
|
|
24
20
|
name: 'v-data-iterator',
|
|
25
21
|
|
|
22
|
+
mixins: [Mobile, Themeable],
|
|
23
|
+
|
|
26
24
|
props: {
|
|
27
25
|
...VData.props, // TODO: filter out props not used
|
|
28
26
|
itemKey: {
|
|
29
27
|
type: String,
|
|
30
28
|
default: 'id',
|
|
31
29
|
},
|
|
32
|
-
|
|
33
|
-
type: Array
|
|
30
|
+
modelValue: {
|
|
31
|
+
type: Array as PropType<any[]>,
|
|
34
32
|
default: () => [],
|
|
35
|
-
}
|
|
33
|
+
},
|
|
36
34
|
singleSelect: Boolean,
|
|
37
35
|
expanded: {
|
|
38
|
-
type: Array
|
|
36
|
+
type: Array as PropType<any[]>,
|
|
39
37
|
default: () => [],
|
|
40
|
-
}
|
|
38
|
+
},
|
|
41
39
|
mobileBreakpoint: {
|
|
42
40
|
...Mobile.props.mobileBreakpoint,
|
|
43
41
|
default: 600,
|
|
@@ -64,7 +62,23 @@ export default mixins(
|
|
|
64
62
|
},
|
|
65
63
|
},
|
|
66
64
|
|
|
67
|
-
emits: [
|
|
65
|
+
emits: [
|
|
66
|
+
'update:modelValue',
|
|
67
|
+
'update:expanded',
|
|
68
|
+
'toggle-select-all',
|
|
69
|
+
'item-selected',
|
|
70
|
+
'item-expanded',
|
|
71
|
+
'update:options',
|
|
72
|
+
'update:page',
|
|
73
|
+
'update:items-per-page',
|
|
74
|
+
'update:sort-by',
|
|
75
|
+
'update:sort-desc',
|
|
76
|
+
'update:group-by',
|
|
77
|
+
'update:group-desc',
|
|
78
|
+
'pagination',
|
|
79
|
+
'current-items',
|
|
80
|
+
'page-count',
|
|
81
|
+
],
|
|
68
82
|
|
|
69
83
|
data: () => ({
|
|
70
84
|
selection: {} as Record<string, any>,
|
|
@@ -92,7 +106,7 @@ export default mixins(
|
|
|
92
106
|
watch: {
|
|
93
107
|
modelValue: {
|
|
94
108
|
handler (value: any[]) {
|
|
95
|
-
if(!value) return
|
|
109
|
+
if (!value) return
|
|
96
110
|
|
|
97
111
|
this.selection = value.reduce((selection, item) => {
|
|
98
112
|
selection[getObjectValueByPath(item, this.itemKey)] = item
|
|
@@ -125,6 +139,8 @@ export default mixins(
|
|
|
125
139
|
|
|
126
140
|
created () {
|
|
127
141
|
const breakingProps = [
|
|
142
|
+
['value', 'modelValue'],
|
|
143
|
+
['onInput', 'onUpdate:modelValue'],
|
|
128
144
|
['disable-initial-sort', 'sort-by'],
|
|
129
145
|
['filter', 'custom-filter'],
|
|
130
146
|
['pagination', 'options'],
|
|
@@ -303,15 +319,14 @@ export default mixins(
|
|
|
303
319
|
...this.sanitizedFooterProps,
|
|
304
320
|
options: props.options,
|
|
305
321
|
pagination: props.pagination,
|
|
306
|
-
|
|
322
|
+
onUpdateOptions: (value: any) => props.updateOptions(value),
|
|
307
323
|
}
|
|
308
324
|
|
|
309
325
|
const scopedSlots = getPrefixedScopedSlots('footer.', this.$slots)
|
|
310
326
|
|
|
311
327
|
return h(VDataFooter, {
|
|
312
|
-
scopedSlots,
|
|
313
328
|
...data,
|
|
314
|
-
})
|
|
329
|
+
}, scopedSlots)
|
|
315
330
|
},
|
|
316
331
|
genDefaultScopedSlot (props: any) {
|
|
317
332
|
const outerProps = {
|
|
@@ -334,25 +349,22 @@ export default mixins(
|
|
|
334
349
|
|
|
335
350
|
render (): VNode {
|
|
336
351
|
return h(VData, {
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
this.$emit('current-items', v)
|
|
350
|
-
},
|
|
351
|
-
'page-count': (v: number) => this.$emit('page-count', v),
|
|
352
|
-
},
|
|
353
|
-
scopedSlots: {
|
|
354
|
-
default: this.genDefaultScopedSlot,
|
|
352
|
+
...this.$props,
|
|
353
|
+
onUpdateOptions: (v: any, old: any) => !deepEqual(v, old) && this.$emit('update:options', v),
|
|
354
|
+
onUpdatePage: (v: any) => this.$emit('update:page', v),
|
|
355
|
+
onUpdateItemsPerPage: (v: any) => this.$emit('update:items-per-page', v),
|
|
356
|
+
onUpdateSortBy: (v: any) => this.$emit('update:sort-by', v),
|
|
357
|
+
onUpdateSortDesc: (v: any) => this.$emit('update:sort-desc', v),
|
|
358
|
+
onUpdateGroupBy: (v: any) => this.$emit('update:group-by', v),
|
|
359
|
+
onUpdateGroupDesc: (v: any) => this.$emit('update:group-desc', v),
|
|
360
|
+
onPagination: (v: any, old: any) => !deepEqual(v, old) && this.$emit('pagination', v),
|
|
361
|
+
onCurrentItems: (v: any[]) => {
|
|
362
|
+
this.internalCurrentItems = v
|
|
363
|
+
this.$emit('current-items', v)
|
|
355
364
|
},
|
|
365
|
+
onPageCount: (v: number) => this.$emit('page-count', v),
|
|
366
|
+
}, {
|
|
367
|
+
default: this.genDefaultScopedSlot,
|
|
356
368
|
})
|
|
357
369
|
},
|
|
358
370
|
})
|