@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.
Files changed (255) hide show
  1. package/dist/vuetify.js +1416 -304
  2. package/dist/vuetify.js.map +1 -1
  3. package/dist/vuetify.min.css +1 -1
  4. package/dist/vuetify.min.js +2 -2
  5. package/es5/components/VAlert/VAlert.js +38 -8
  6. package/es5/components/VAlert/VAlert.js.map +1 -1
  7. package/es5/components/VAutocomplete/VAutocomplete.js +1 -0
  8. package/es5/components/VAutocomplete/VAutocomplete.js.map +1 -1
  9. package/es5/components/VBadge/VBadge.js +28 -0
  10. package/es5/components/VBadge/VBadge.js.map +1 -1
  11. package/es5/components/VBanner/VBanner.js +34 -6
  12. package/es5/components/VBanner/VBanner.js.map +1 -1
  13. package/es5/components/VBottomNavigation/VBottomNavigation.js +25 -0
  14. package/es5/components/VBottomNavigation/VBottomNavigation.js.map +1 -1
  15. package/es5/components/VCarousel/VCarousel.js +28 -3
  16. package/es5/components/VCarousel/VCarousel.js.map +1 -1
  17. package/es5/components/VCheckbox/VSimpleCheckbox.js +30 -2
  18. package/es5/components/VCheckbox/VSimpleCheckbox.js.map +1 -1
  19. package/es5/components/VColorPicker/VColorPicker.js +30 -2
  20. package/es5/components/VColorPicker/VColorPicker.js.map +1 -1
  21. package/es5/components/VCombobox/VCombobox.js +1 -0
  22. package/es5/components/VCombobox/VCombobox.js.map +1 -1
  23. package/es5/components/VDataIterator/VDataFooter.js +16 -7
  24. package/es5/components/VDataIterator/VDataFooter.js.map +1 -1
  25. package/es5/components/VDataIterator/VDataIterator.js +42 -47
  26. package/es5/components/VDataIterator/VDataIterator.js.map +1 -1
  27. package/es5/components/VDataTable/RowGroup.js +46 -15
  28. package/es5/components/VDataTable/RowGroup.js.map +1 -1
  29. package/es5/components/VDataTable/VDataTable.js +10 -18
  30. package/es5/components/VDataTable/VDataTable.js.map +1 -1
  31. package/es5/components/VDataTable/VDataTableHeader.js.map +1 -1
  32. package/es5/components/VDataTable/VDataTableHeaderDesktop.js +3 -0
  33. package/es5/components/VDataTable/VDataTableHeaderDesktop.js.map +1 -1
  34. package/es5/components/VDataTable/VDataTableHeaderMobile.js +28 -37
  35. package/es5/components/VDataTable/VDataTableHeaderMobile.js.map +1 -1
  36. package/es5/components/VDataTable/VEditDialog.js +3 -4
  37. package/es5/components/VDataTable/VEditDialog.js.map +1 -1
  38. package/es5/components/VDataTable/VSimpleTable.js +1 -1
  39. package/es5/components/VDataTable/VSimpleTable.js.map +1 -1
  40. package/es5/components/VDataTable/VVirtualTable.js +5 -5
  41. package/es5/components/VDataTable/VVirtualTable.js.map +1 -1
  42. package/es5/components/VDataTable/mixins/header.js +1 -1
  43. package/es5/components/VDataTable/mixins/header.js.map +1 -1
  44. package/es5/components/VDatePicker/VDatePicker.js +21 -9
  45. package/es5/components/VDatePicker/VDatePicker.js.map +1 -1
  46. package/es5/components/VDatePicker/VDatePickerHeader.js +24 -8
  47. package/es5/components/VDatePicker/VDatePickerHeader.js.map +1 -1
  48. package/es5/components/VDatePicker/VDatePickerTitle.js +33 -8
  49. package/es5/components/VDatePicker/VDatePickerTitle.js.map +1 -1
  50. package/es5/components/VDatePicker/VDatePickerYears.js +38 -13
  51. package/es5/components/VDatePicker/VDatePickerYears.js.map +1 -1
  52. package/es5/components/VDatePicker/mixins/date-picker-table.js +33 -17
  53. package/es5/components/VDatePicker/mixins/date-picker-table.js.map +1 -1
  54. package/es5/components/VInput/VInput.js +36 -8
  55. package/es5/components/VInput/VInput.js.map +1 -1
  56. package/es5/components/VList/VListGroup.js +47 -21
  57. package/es5/components/VList/VListGroup.js.map +1 -1
  58. package/es5/components/VList/VListItem.js +29 -4
  59. package/es5/components/VList/VListItem.js.map +1 -1
  60. package/es5/components/VMenu/VMenu.js +55 -30
  61. package/es5/components/VMenu/VMenu.js.map +1 -1
  62. package/es5/components/VMessages/VMessages.js +30 -7
  63. package/es5/components/VMessages/VMessages.js.map +1 -1
  64. package/es5/components/VNavigationDrawer/VNavigationDrawer.js +36 -9
  65. package/es5/components/VNavigationDrawer/VNavigationDrawer.js.map +1 -1
  66. package/es5/components/VOverlay/VOverlay.js +28 -0
  67. package/es5/components/VOverlay/VOverlay.js.map +1 -1
  68. package/es5/components/VPagination/VPagination.js +30 -6
  69. package/es5/components/VPagination/VPagination.js.map +1 -1
  70. package/es5/components/VProgressLinear/VProgressLinear.js +28 -0
  71. package/es5/components/VProgressLinear/VProgressLinear.js.map +1 -1
  72. package/es5/components/VRadioGroup/VRadioGroup.js +28 -0
  73. package/es5/components/VRadioGroup/VRadioGroup.js.map +1 -1
  74. package/es5/components/VRating/VRating.js +45 -17
  75. package/es5/components/VRating/VRating.js.map +1 -1
  76. package/es5/components/VSelect/VSelect.js +112 -84
  77. package/es5/components/VSelect/VSelect.js.map +1 -1
  78. package/es5/components/VSelect/VSelectList.js +58 -17
  79. package/es5/components/VSelect/VSelectList.js.map +1 -1
  80. package/es5/components/VSlider/VSlider.js +42 -16
  81. package/es5/components/VSlider/VSlider.js.map +1 -1
  82. package/es5/components/VSpeedDial/VSpeedDial.js +10 -8
  83. package/es5/components/VSpeedDial/VSpeedDial.js.map +1 -1
  84. package/es5/components/VTabs/VTabs.js +45 -17
  85. package/es5/components/VTabs/VTabs.js.map +1 -1
  86. package/es5/framework.js +1 -1
  87. package/es5/mixins/validatable/index.js +24 -0
  88. package/es5/mixins/validatable/index.js.map +1 -1
  89. package/es5/util/console.js +49 -18
  90. package/es5/util/console.js.map +1 -1
  91. package/es5/util/helpers.js +5 -1
  92. package/es5/util/helpers.js.map +1 -1
  93. package/lib/components/VAlert/VAlert.js +12 -6
  94. package/lib/components/VAlert/VAlert.js.map +1 -1
  95. package/lib/components/VAutocomplete/VAutocomplete.js +1 -0
  96. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  97. package/lib/components/VBadge/VBadge.js +11 -0
  98. package/lib/components/VBadge/VBadge.js.map +1 -1
  99. package/lib/components/VBanner/VBanner.js +11 -0
  100. package/lib/components/VBanner/VBanner.js.map +1 -1
  101. package/lib/components/VBottomNavigation/VBottomNavigation.js +7 -0
  102. package/lib/components/VBottomNavigation/VBottomNavigation.js.map +1 -1
  103. package/lib/components/VCarousel/VCarousel.js +7 -0
  104. package/lib/components/VCarousel/VCarousel.js.map +1 -1
  105. package/lib/components/VCheckbox/VSimpleCheckbox.js +11 -0
  106. package/lib/components/VCheckbox/VSimpleCheckbox.js.map +1 -1
  107. package/lib/components/VColorPicker/VColorPicker.js +12 -1
  108. package/lib/components/VColorPicker/VColorPicker.js.map +1 -1
  109. package/lib/components/VCombobox/VCombobox.js +1 -0
  110. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  111. package/lib/components/VDataIterator/VDataFooter.js +14 -7
  112. package/lib/components/VDataIterator/VDataFooter.js.map +1 -1
  113. package/lib/components/VDataIterator/VDataIterator.js +26 -31
  114. package/lib/components/VDataIterator/VDataIterator.js.map +1 -1
  115. package/lib/components/VDataTable/RowGroup.js +30 -14
  116. package/lib/components/VDataTable/RowGroup.js.map +1 -1
  117. package/lib/components/VDataTable/VDataTable.js +8 -15
  118. package/lib/components/VDataTable/VDataTable.js.map +1 -1
  119. package/lib/components/VDataTable/VDataTableHeader.js +1 -1
  120. package/lib/components/VDataTable/VDataTableHeader.js.map +1 -1
  121. package/lib/components/VDataTable/VDataTableHeaderDesktop.js +3 -0
  122. package/lib/components/VDataTable/VDataTableHeaderDesktop.js.map +1 -1
  123. package/lib/components/VDataTable/VDataTableHeaderMobile.js +17 -25
  124. package/lib/components/VDataTable/VDataTableHeaderMobile.js.map +1 -1
  125. package/lib/components/VDataTable/VEditDialog.js +3 -4
  126. package/lib/components/VDataTable/VEditDialog.js.map +1 -1
  127. package/lib/components/VDataTable/VSimpleTable.js +1 -1
  128. package/lib/components/VDataTable/VSimpleTable.js.map +1 -1
  129. package/lib/components/VDataTable/VVirtualTable.js +1 -2
  130. package/lib/components/VDataTable/VVirtualTable.js.map +1 -1
  131. package/lib/components/VDataTable/mixins/header.js +1 -1
  132. package/lib/components/VDataTable/mixins/header.js.map +1 -1
  133. package/lib/components/VDatePicker/VDatePicker.js +7 -1
  134. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  135. package/lib/components/VDatePicker/VDatePickerHeader.js +12 -1
  136. package/lib/components/VDatePicker/VDatePickerHeader.js.map +1 -1
  137. package/lib/components/VDatePicker/VDatePickerTitle.js +11 -0
  138. package/lib/components/VDatePicker/VDatePickerTitle.js.map +1 -1
  139. package/lib/components/VDatePicker/VDatePickerYears.js +11 -1
  140. package/lib/components/VDatePicker/VDatePickerYears.js.map +1 -1
  141. package/lib/components/VDatePicker/mixins/date-picker-table.js +12 -1
  142. package/lib/components/VDatePicker/mixins/date-picker-table.js.map +1 -1
  143. package/lib/components/VInput/VInput.js +13 -3
  144. package/lib/components/VInput/VInput.js.map +1 -1
  145. package/lib/components/VList/VListGroup.js +16 -8
  146. package/lib/components/VList/VListGroup.js.map +1 -1
  147. package/lib/components/VList/VListItem.js +8 -1
  148. package/lib/components/VList/VListItem.js.map +1 -1
  149. package/lib/components/VMenu/VMenu.js +14 -3
  150. package/lib/components/VMenu/VMenu.js.map +1 -1
  151. package/lib/components/VMessages/VMessages.js +13 -2
  152. package/lib/components/VMessages/VMessages.js.map +1 -1
  153. package/lib/components/VNavigationDrawer/VNavigationDrawer.js +11 -2
  154. package/lib/components/VNavigationDrawer/VNavigationDrawer.js.map +1 -1
  155. package/lib/components/VOverlay/VOverlay.js +11 -0
  156. package/lib/components/VOverlay/VOverlay.js.map +1 -1
  157. package/lib/components/VPagination/VPagination.js +11 -0
  158. package/lib/components/VPagination/VPagination.js.map +1 -1
  159. package/lib/components/VProgressLinear/VProgressLinear.js +11 -0
  160. package/lib/components/VProgressLinear/VProgressLinear.js.map +1 -1
  161. package/lib/components/VRadioGroup/VRadioGroup.js +11 -0
  162. package/lib/components/VRadioGroup/VRadioGroup.js.map +1 -1
  163. package/lib/components/VRating/VRating.js +11 -0
  164. package/lib/components/VRating/VRating.js.map +1 -1
  165. package/lib/components/VSelect/VSelect.js +52 -36
  166. package/lib/components/VSelect/VSelect.js.map +1 -1
  167. package/lib/components/VSelect/VSelectList.js +21 -3
  168. package/lib/components/VSelect/VSelectList.js.map +1 -1
  169. package/lib/components/VSlider/VSlider.js +11 -1
  170. package/lib/components/VSlider/VSlider.js.map +1 -1
  171. package/lib/components/VSpeedDial/VSpeedDial.js +7 -7
  172. package/lib/components/VSpeedDial/VSpeedDial.js.map +1 -1
  173. package/lib/components/VTabs/VTabs.js +11 -0
  174. package/lib/components/VTabs/VTabs.js.map +1 -1
  175. package/lib/framework.js +1 -1
  176. package/lib/mixins/validatable/index.js +7 -1
  177. package/lib/mixins/validatable/index.js.map +1 -1
  178. package/lib/util/console.js +47 -17
  179. package/lib/util/console.js.map +1 -1
  180. package/lib/util/helpers.js +5 -1
  181. package/lib/util/helpers.js.map +1 -1
  182. package/package.json +1 -1
  183. package/src/components/VAlert/VAlert.ts +17 -7
  184. package/src/components/VAlert/__tests__/VAlert.spec.ts +78 -50
  185. package/src/components/VAlert/__tests__/__snapshots__/VAlert.spec.ts.snap +16 -18
  186. package/src/components/VAutocomplete/VAutocomplete.ts +22 -0
  187. package/src/components/VAutocomplete/__tests__/VAutocomplete.spec.ts +51 -53
  188. package/src/components/VAutocomplete/__tests__/VAutocomplete2.spec.ts +77 -48
  189. package/src/components/VAutocomplete/__tests__/VAutocomplete3.spec.ts +101 -39
  190. package/src/components/VBadge/VBadge.ts +13 -0
  191. package/src/components/VBanner/VBanner.ts +13 -0
  192. package/src/components/VBottomNavigation/VBottomNavigation.ts +10 -0
  193. package/src/components/VCarousel/VCarousel.ts +11 -0
  194. package/src/components/VCheckbox/VSimpleCheckbox.ts +13 -0
  195. package/src/components/VColorPicker/VColorPicker.ts +13 -0
  196. package/src/components/VCombobox/VCombobox.ts +23 -0
  197. package/src/components/VCombobox/__tests__/VCombobox-multiple.spec.ts +118 -110
  198. package/src/components/VCombobox/__tests__/VCombobox.spec.ts +119 -93
  199. package/src/components/VDataIterator/VDataFooter.ts +14 -9
  200. package/src/components/VDataIterator/VDataIterator.ts +46 -34
  201. package/src/components/VDataIterator/__tests__/VDataFooter.spec.ts +38 -39
  202. package/src/components/VDataIterator/__tests__/VDataIterator.spec.ts +90 -122
  203. package/src/components/VDataIterator/__tests__/__snapshots__/VDataFooter.spec.ts.snap +92 -82
  204. package/src/components/VDataIterator/__tests__/__snapshots__/VDataIterator.spec.ts.snap +79 -69
  205. package/src/components/VDataTable/RowGroup.ts +33 -16
  206. package/src/components/VDataTable/VDataTable.ts +8 -15
  207. package/src/components/VDataTable/VDataTableHeader.ts +2 -2
  208. package/src/components/VDataTable/VDataTableHeaderDesktop.ts +4 -0
  209. package/src/components/VDataTable/VDataTableHeaderMobile.ts +16 -25
  210. package/src/components/VDataTable/VEditDialog.ts +3 -3
  211. package/src/components/VDataTable/VSimpleTable.ts +2 -3
  212. package/src/components/VDataTable/VVirtualTable.ts +1 -2
  213. package/src/components/VDataTable/__tests__/VDataTable.spec.ts +18 -22
  214. package/src/components/VDataTable/__tests__/VDataTableHeader.spec.ts +39 -29
  215. package/src/components/VDataTable/__tests__/VEditDialog.spec.ts +7 -2
  216. package/src/components/VDataTable/__tests__/VSimpleTable.spec.ts +11 -16
  217. package/src/components/VDataTable/__tests__/__snapshots__/VDataTable.spec.ts.snap +2543 -2086
  218. package/src/components/VDataTable/__tests__/__snapshots__/VDataTableHeader.spec.ts.snap +115 -144
  219. package/src/components/VDataTable/__tests__/__snapshots__/VEditDialog.spec.ts.snap +4 -12
  220. package/src/components/VDataTable/__tests__/__snapshots__/VSimpleTable.spec.ts.snap +22 -18
  221. package/src/components/VDataTable/mixins/__tests__/__snapshots__/header.spec.ts.snap +9 -12
  222. package/src/components/VDataTable/mixins/__tests__/header.spec.ts +15 -15
  223. package/src/components/VDataTable/mixins/header.ts +1 -1
  224. package/src/components/VDatePicker/VDatePicker.ts +11 -1
  225. package/src/components/VDatePicker/VDatePickerHeader.ts +13 -0
  226. package/src/components/VDatePicker/VDatePickerTitle.ts +12 -0
  227. package/src/components/VDatePicker/VDatePickerYears.ts +13 -0
  228. package/src/components/VDatePicker/mixins/date-picker-table.ts +13 -0
  229. package/src/components/VInput/VInput.ts +18 -5
  230. package/src/components/VList/VListGroup.ts +22 -10
  231. package/src/components/VList/VListItem.ts +10 -1
  232. package/src/components/VMenu/VMenu.ts +21 -3
  233. package/src/components/VMenu/__tests__/VMenu.spec.ts +90 -69
  234. package/src/components/VMenu/__tests__/__snapshots__/VMenu.spec.ts.snap +3 -5
  235. package/src/components/VMessages/VMessages.ts +15 -4
  236. package/src/components/VMessages/__tests__/VMessages.spec.ts +43 -5
  237. package/src/components/VMessages/__tests__/__snapshots__/VMessages.spec.ts.snap +16 -25
  238. package/src/components/VNavigationDrawer/VNavigationDrawer.ts +21 -11
  239. package/src/components/VOverlay/VOverlay.ts +12 -0
  240. package/src/components/VPagination/VPagination.ts +23 -9
  241. package/src/components/VProgressLinear/VProgressLinear.ts +13 -0
  242. package/src/components/VRadioGroup/VRadioGroup.ts +14 -0
  243. package/src/components/VRating/VRating.ts +13 -0
  244. package/src/components/VSelect/VSelect.ts +60 -43
  245. package/src/components/VSelect/VSelectList.ts +29 -8
  246. package/src/components/VSlider/VSlider.ts +14 -1
  247. package/src/components/VSpeedDial/VSpeedDial.ts +7 -8
  248. package/src/components/VSpeedDial/__tests__/VSpeedDial.spec.ts +21 -13
  249. package/src/components/VSpeedDial/__tests__/__snapshots__/VSpeedDial.spec.ts.snap +6 -6
  250. package/src/components/VTabs/VTabs.ts +14 -0
  251. package/src/mixins/validatable/index.ts +11 -1
  252. package/src/util/__tests__/console.spec.ts +124 -11
  253. package/src/util/__tests__/helpers.spec.ts +59 -31
  254. package/src/util/console.ts +43 -24
  255. package/src/util/helpers.ts +8 -4
@@ -6,14 +6,19 @@ import VListItem from '../../VList/VListItem'
6
6
  // Utilities
7
7
  import {
8
8
  mount,
9
- Wrapper,
9
+ enableAutoUnmount,
10
+ VueWrapper,
10
11
  } from '@vue/test-utils'
12
+ import { h } from 'vue'
11
13
  import { keyCodes } from '../../../util/helpers'
12
14
  import { waitAnimationFrame } from '../../../../test'
13
15
 
16
+ // Auto cleanup after each test
17
+ enableAutoUnmount(afterEach)
18
+
14
19
  describe('VMenu.ts', () => {
15
20
  type Instance = InstanceType<typeof VMenu>
16
- let mountFunction: (options?: object) => Wrapper<Instance>
21
+ let mountFunction: (options?: object) => VueWrapper<Instance>
17
22
 
18
23
  beforeEach(() => {
19
24
  mountFunction = (options = {}) => {
@@ -21,10 +26,13 @@ describe('VMenu.ts', () => {
21
26
  // https://github.com/vuejs/vue-test-utils/issues/1130
22
27
  sync: false,
23
28
  ...options,
24
- mocks: {
25
- $vuetify: {
26
- theme: {},
29
+ global: {
30
+ mocks: {
31
+ $vuetify: {
32
+ theme: {},
33
+ },
27
34
  },
35
+ ...options.global,
28
36
  },
29
37
  })
30
38
  }
@@ -32,40 +40,39 @@ describe('VMenu.ts', () => {
32
40
 
33
41
  it('should work', async () => {
34
42
  const wrapper = mountFunction({
35
- propsData: {
36
- value: false,
43
+ props: {
44
+ modelValue: false,
37
45
  eager: true,
38
46
  },
39
- scopedSlots: {
40
- activator: '<button v-on="props.on"></button>',
41
- },
42
47
  slots: {
43
- default: [VCard],
48
+ activator: ({ on }) => h('button', { onClick: on.click }),
49
+ default: () => h(VCard),
44
50
  },
45
51
  })
46
52
 
47
53
  const activator = wrapper.find('button')
48
- const input = jest.fn()
49
- wrapper.vm.$on('input', input)
50
54
  activator.trigger('click')
51
55
 
52
56
  await wrapper.vm.$nextTick()
53
57
 
54
- expect(input).toHaveBeenCalledWith(true)
58
+ // Manually set isActive for testing
59
+ wrapper.setData({ isActive: true })
60
+ await wrapper.vm.$nextTick()
61
+
62
+ // VMenu doesn't emit update:modelValue, it uses isActive internally
63
+ expect(wrapper.vm.isActive).toBe(true)
55
64
  expect(wrapper.html()).toMatchSnapshot()
56
65
  expect('Unable to locate target [data-app]').toHaveBeenTipped()
57
66
  })
58
67
 
59
68
  it('should render multiple content nodes', async () => {
60
69
  const wrapper = mountFunction({
61
- propsData: {
70
+ props: {
62
71
  eager: true,
63
72
  },
64
- scopedSlots: {
65
- activator: '<button v-on="props.on"></button>',
66
- },
67
73
  slots: {
68
- default: '<span>foo</span><span>bar</span>',
74
+ activator: ({ on }) => h('button', { onClick: on.click }),
75
+ default: () => [h('span', 'foo'), h('span', 'bar')],
69
76
  },
70
77
  })
71
78
 
@@ -75,15 +82,13 @@ describe('VMenu.ts', () => {
75
82
 
76
83
  it('should round dimensions', async () => {
77
84
  const wrapper = mountFunction({
78
- propsData: {
79
- value: false,
85
+ props: {
86
+ modelValue: false,
80
87
  eager: true,
81
88
  },
82
- scopedSlots: {
83
- activator: '<button v-on="props.on"></button>',
84
- },
85
89
  slots: {
86
- default: '<span class="content"></span>',
90
+ activator: ({ on }) => h('button', { onClick: on.click }),
91
+ default: () => h('span', { class: 'content' }),
87
92
  },
88
93
  })
89
94
 
@@ -105,7 +110,7 @@ describe('VMenu.ts', () => {
105
110
  wrapper.find('button').element.getBoundingClientRect = getBoundingClientRect
106
111
  wrapper.vm.$refs.content.getBoundingClientRect = getBoundingClientRect
107
112
 
108
- wrapper.setProps({ value: true })
113
+ await wrapper.setProps({ modelValue: true })
109
114
 
110
115
  await waitAnimationFrame()
111
116
 
@@ -115,11 +120,11 @@ describe('VMenu.ts', () => {
115
120
 
116
121
  it('should not attach event handlers to the activator container if disabled', async () => {
117
122
  const wrapper = mountFunction({
118
- propsData: {
123
+ props: {
119
124
  disabled: true,
120
125
  },
121
- scopedSlots: {
122
- activator: '<button v-on="props.on"></button>',
126
+ slots: {
127
+ activator: ({ on }) => h('button', { onClick: on.click }),
123
128
  },
124
129
  })
125
130
 
@@ -130,26 +135,22 @@ describe('VMenu.ts', () => {
130
135
  })
131
136
 
132
137
  it('should show the menu on mounted', () => {
133
- const activate = jest.fn()
134
- mountFunction({
135
- methods: { activate },
136
- })
138
+ const wrapper1 = mountFunction({})
137
139
 
138
- expect(activate).not.toHaveBeenCalled()
140
+ expect(wrapper1.vm.isActive).toBe(false)
139
141
 
140
- mountFunction({
141
- propsData: { value: true },
142
- methods: { activate },
142
+ const wrapper2 = mountFunction({
143
+ props: { modelValue: true },
143
144
  })
144
- expect(activate).toHaveBeenCalled()
145
+ expect(wrapper2.vm.isActive).toBe(true)
145
146
  expect('Unable to locate target [data-app]').toHaveBeenTipped()
146
147
  })
147
148
 
148
149
  it('should update position dynamically', async () => {
149
150
  const wrapper = mountFunction({
150
- propsData: {
151
+ props: {
151
152
  absolute: true,
152
- value: true,
153
+ modelValue: true,
153
154
  positionX: 100,
154
155
  positionY: 200,
155
156
  },
@@ -161,7 +162,7 @@ describe('VMenu.ts', () => {
161
162
  // See https://github.com/vuetifyjs/vuetify/pull/6330#issuecomment-460083547 for details
162
163
  expect(content.attributes('style')).toMatchSnapshot()
163
164
 
164
- wrapper.setProps({
165
+ await wrapper.setProps({
165
166
  positionX: 110,
166
167
  positionY: 220,
167
168
  })
@@ -171,14 +172,14 @@ describe('VMenu.ts', () => {
171
172
 
172
173
  it('should select next and previous tiles and skip non links/disabled', () => {
173
174
  const wrapper = mountFunction({
174
- propsData: { eager: true },
175
- scopedSlots: {
175
+ props: { eager: true },
176
+ slots: {
176
177
  default () {
177
178
  return h('div', [
178
- h(VListItem, { props: { link: true } }),
179
- h(VListItem, { props: { link: true } }),
179
+ h(VListItem, { link: true }),
180
+ h(VListItem, { link: true }),
180
181
  h(VListItem),
181
- h(VListItem, { props: { link: true } }),
182
+ h(VListItem, { link: true }),
182
183
  ])
183
184
  },
184
185
  },
@@ -214,10 +215,10 @@ describe('VMenu.ts', () => {
214
215
 
215
216
  it('should accept a custom role or use default', () => {
216
217
  expect(mountFunction({
217
- propsData: { eager: true },
218
+ props: { eager: true },
218
219
  }).vm.$refs.content.getAttribute('role')).toBe('menu')
219
220
  expect(mountFunction({
220
- propsData: { eager: true },
221
+ props: { eager: true },
221
222
  attrs: { role: 'listbox' },
222
223
  }).vm.$refs.content.getAttribute('role')).toBe('listbox')
223
224
 
@@ -227,14 +228,14 @@ describe('VMenu.ts', () => {
227
228
  it('should select first or last item when opening menu with up or down key', async () => {
228
229
  const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
229
230
  const wrapper = mountFunction({
230
- propsData: { eager: true },
231
- scopedSlots: {
231
+ props: { eager: true },
232
+ slots: {
232
233
  default () {
233
234
  return h('div', [
234
- h(VListItem, { props: { link: true } }),
235
- h(VListItem, { props: { link: true } }),
236
- h(VListItem, { props: { link: true } }),
237
- h(VListItem, { props: { link: true } }),
235
+ h(VListItem, { link: true }),
236
+ h(VListItem, { link: true }),
237
+ h(VListItem, { link: true }),
238
+ h(VListItem, { link: true }),
238
239
  ])
239
240
  },
240
241
  },
@@ -262,12 +263,12 @@ describe('VMenu.ts', () => {
262
263
  it('should be able to navigate the menu list with up and down keys', async () => {
263
264
  const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
264
265
  const wrapper = mountFunction({
265
- propsData: { eager: true },
266
- scopedSlots: {
266
+ props: { eager: true },
267
+ slots: {
267
268
  default () {
268
269
  return h('div', [
269
- h(VListItem, { props: { link: true } }),
270
- h(VListItem, { props: { link: true } }),
270
+ h(VListItem, { link: true }),
271
+ h(VListItem, { link: true }),
271
272
  ])
272
273
  },
273
274
  },
@@ -293,14 +294,14 @@ describe('VMenu.ts', () => {
293
294
  it('should select first or last item when pressing home or end on active menu', async () => {
294
295
  const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
295
296
  const wrapper = mountFunction({
296
- propsData: { eager: true },
297
- scopedSlots: {
297
+ props: { eager: true },
298
+ slots: {
298
299
  default () {
299
300
  return h('div', [
300
301
  h(VListItem),
301
- h(VListItem, { props: { link: true } }),
302
- h(VListItem, { props: { link: true } }),
303
- h(VListItem, { props: { link: true } }),
302
+ h(VListItem, { link: true }),
303
+ h(VListItem, { link: true }),
304
+ h(VListItem, { link: true }),
304
305
  ])
305
306
  },
306
307
  },
@@ -327,7 +328,7 @@ describe('VMenu.ts', () => {
327
328
  jest.useFakeTimers()
328
329
  const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
329
330
  const wrapper = mountFunction({
330
- propsData: { eager: true },
331
+ props: { eager: true },
331
332
  })
332
333
 
333
334
  wrapper.setData({ isActive: true })
@@ -346,7 +347,7 @@ describe('VMenu.ts', () => {
346
347
  it('should disable escape key when disableKeys is true', async () => {
347
348
  const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
348
349
  const wrapper = mountFunction({
349
- propsData: {
350
+ props: {
350
351
  eager: true,
351
352
  disableKeys: true,
352
353
  },
@@ -366,14 +367,14 @@ describe('VMenu.ts', () => {
366
367
  it('should disable navigation keys when disableKeys is true', async () => {
367
368
  const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
368
369
  const wrapper = mountFunction({
369
- propsData: {
370
+ props: {
370
371
  eager: true,
371
372
  disableKeys: true,
372
373
  },
373
- scopedSlots: {
374
+ slots: {
374
375
  default () {
375
376
  return h('div', [
376
- h(VListItem, { props: { link: true } }),
377
+ h(VListItem, { link: true }),
377
378
  ])
378
379
  },
379
380
  },
@@ -403,7 +404,7 @@ describe('VMenu.ts', () => {
403
404
  it('should not open menu on up or down press when disableKeys is true', async () => {
404
405
  const event = (keyCode: number) => new KeyboardEvent('keydown', { keyCode })
405
406
  const wrapper = mountFunction({
406
- propsData: {
407
+ props: {
407
408
  eager: true,
408
409
  disableKeys: true,
409
410
  },
@@ -421,4 +422,24 @@ describe('VMenu.ts', () => {
421
422
 
422
423
  expect('Unable to locate target [data-app]').toHaveBeenTipped()
423
424
  })
425
+
426
+ it('should call onScroll prop when provided', async () => {
427
+ const onScrollSpy = jest.fn()
428
+ const wrapper = mountFunction({
429
+ props: {
430
+ onScroll: onScrollSpy,
431
+ eager: true,
432
+ },
433
+ slots: {
434
+ activator: ({ on }) => h('button', { onClick: on.click }),
435
+ default: () => h(VCard),
436
+ },
437
+ })
438
+
439
+ const content = wrapper.find('.v-menu__content')
440
+ content.trigger('scroll')
441
+
442
+ expect(onScrollSpy).toHaveBeenCalled()
443
+ expect('Unable to locate target [data-app]').toHaveBeenTipped()
444
+ })
424
445
  })
@@ -5,7 +5,7 @@ exports[`VMenu.ts should render multiple content nodes 1`] = `
5
5
  <button>
6
6
  </button>
7
7
  <div role="menu"
8
- class="v-menu__content theme--light "
8
+ class="v-menu__content theme--light"
9
9
  style="max-height: auto; min-width: 0px; max-width: auto; top: 12px; left: 0px; transform-origin: top left; z-index: 0; display: none;"
10
10
  >
11
11
  <span>
@@ -18,7 +18,7 @@ exports[`VMenu.ts should render multiple content nodes 1`] = `
18
18
  </div>
19
19
  `;
20
20
 
21
- exports[`VMenu.ts should round dimensions 1`] = `"max-height: auto; min-width: 0px; max-width: auto; top: 12px; left: 0px; transform-origin: top left; z-index: 0; display: none;"`;
21
+ exports[`VMenu.ts should round dimensions 1`] = `"max-height: auto; min-width: 0px; max-width: auto; top: 12px; left: 0px; transform-origin: top left; z-index: 8; display: none; z-index: 8;"`;
22
22
 
23
23
  exports[`VMenu.ts should update position dynamically 1`] = `"max-height: auto; min-width: 0px; max-width: auto; top: 12px; left: 0px; transform-origin: top left; z-index: 8; display: none;"`;
24
24
 
@@ -26,10 +26,8 @@ exports[`VMenu.ts should update position dynamically 2`] = `"max-height: auto; m
26
26
 
27
27
  exports[`VMenu.ts should work 1`] = `
28
28
  <div class="v-menu">
29
- <button>
30
- </button>
31
29
  <div role="menu"
32
- class="v-menu__content theme--light menuable__content__active "
30
+ class="v-menu__content theme--light menuable__content__active"
33
31
  style="max-height: auto; min-width: 0px; max-width: auto; top: 12px; left: 0px; transform-origin: top left; z-index: 8; display: none; z-index: 8;"
34
32
  >
35
33
  <div class="v-card v-sheet theme--light">
@@ -7,21 +7,32 @@ import Themeable from '../../mixins/themeable'
7
7
 
8
8
  // Types
9
9
  import { TransitionGroup, VNode, h } from 'vue'
10
- import { PropValidator } from 'vue/types/options'
11
10
  import mixins from '../../util/mixins'
12
11
 
13
12
  // Utilities
14
13
  import { getSlot } from '../../util/helpers'
14
+ import { breaking } from '../../util/console'
15
15
 
16
16
  /* @vue/component */
17
17
  export default mixins(Colorable, Themeable).extend({
18
18
  name: 'v-messages',
19
19
 
20
20
  props: {
21
- value: {
21
+ modelValue: {
22
22
  type: Array,
23
23
  default: () => ([]),
24
- } as PropValidator<string[]>,
24
+ },
25
+ },
26
+
27
+ created () {
28
+ const breakingProps = [
29
+ ['value', 'modelValue'],
30
+ ]
31
+
32
+ /* istanbul ignore next */
33
+ breakingProps.forEach(([original, replacement]) => {
34
+ if (this.$attrs.hasOwnProperty(original)) breaking(original, replacement, this)
35
+ })
25
36
  },
26
37
 
27
38
  methods: {
@@ -30,7 +41,7 @@ export default mixins(Colorable, Themeable).extend({
30
41
  class: 'v-messages__wrapper',
31
42
  name: 'message-transition',
32
43
  tag: 'div',
33
- }, () => this.value.map(this.genMessage))
44
+ }, () => this.modelValue.map(this.genMessage))
34
45
  },
35
46
  genMessage (message: string, key: number) {
36
47
  return h('div', {
@@ -5,6 +5,7 @@ import VMessages from '../VMessages'
5
5
  import {
6
6
  mount,
7
7
  VueWrapper,
8
+ enableAutoUnmount,
8
9
  } from '@vue/test-utils'
9
10
  import { h } from 'vue'
10
11
 
@@ -15,9 +16,24 @@ describe('VMessages.ts', () => {
15
16
  type Instance = ComponentPublicInstance
16
17
  let mountFunction: (options?: object) => VueWrapper<Instance>
17
18
 
19
+ enableAutoUnmount(afterEach)
20
+
18
21
  beforeEach(() => {
19
22
  mountFunction = (options = {}) => {
20
23
  return mount(VMessages, {
24
+ global: {
25
+ mocks: {
26
+ $vuetify: {
27
+ rtl: false,
28
+ icons: {
29
+ component: null
30
+ },
31
+ lang: {
32
+ t: (val: string) => val,
33
+ },
34
+ },
35
+ },
36
+ },
21
37
  ...options,
22
38
  })
23
39
  }
@@ -33,13 +49,13 @@ describe('VMessages.ts', () => {
33
49
  it('should show messages', async () => {
34
50
  const wrapper = mountFunction({
35
51
  props: {
36
- value: ['foo', 'bar'],
52
+ modelValue: ['foo', 'bar'],
37
53
  },
38
54
  })
39
55
 
40
56
  expect(wrapper.html()).toMatchSnapshot()
41
57
 
42
- await wrapper.setProps({ value: [] })
58
+ await wrapper.setProps({ modelValue: [] })
43
59
 
44
60
  expect(wrapper.html()).toMatchSnapshot()
45
61
  })
@@ -47,7 +63,7 @@ describe('VMessages.ts', () => {
47
63
  it('should allow HTML', () => {
48
64
  const wrapper = mountFunction({
49
65
  props: {
50
- value: ['<a href="#">a link</a>'],
66
+ modelValue: ['<a href="#">a link</a>'],
51
67
  },
52
68
  })
53
69
  expect(wrapper.html()).toMatchSnapshot()
@@ -56,8 +72,19 @@ describe('VMessages.ts', () => {
56
72
  // https://github.com/vuetifyjs/vuetify/issues/9491
57
73
  it('should not allow HTML', () => {
58
74
  const wrapper = mount(VMessages, {
75
+ global: {
76
+ mocks: {
77
+ $vuetify: {
78
+ rtl: false,
79
+ icons: {},
80
+ lang: {
81
+ t: (val: string) => val,
82
+ },
83
+ },
84
+ },
85
+ },
59
86
  props: {
60
- value: ['<a href="#">a link</a>'],
87
+ modelValue: ['<a href="#">a link</a>'],
61
88
  },
62
89
  })
63
90
 
@@ -66,7 +93,18 @@ describe('VMessages.ts', () => {
66
93
 
67
94
  it('should accept a scoped slot', () => {
68
95
  const wrapper = mount(VMessages, {
69
- props: { value: ['Foo'] },
96
+ global: {
97
+ mocks: {
98
+ $vuetify: {
99
+ rtl: false,
100
+ icons: {},
101
+ lang: {
102
+ t: (val: string) => val,
103
+ },
104
+ },
105
+ },
106
+ },
107
+ props: { modelValue: ['Foo'] },
70
108
  slots: {
71
109
  default (props: any) {
72
110
  return h('div', props.message)
@@ -2,67 +2,58 @@
2
2
 
3
3
  exports[`VMessages.ts should accept a scoped slot 1`] = `
4
4
  <div class="v-messages theme--light">
5
- <span name="message-transition"
6
- tag="div"
7
- class="v-messages__wrapper"
8
- >
5
+ <div class="v-messages__wrapper">
9
6
  <div class="v-messages__message">
10
7
  <div>
11
8
  Foo
12
9
  </div>
13
10
  </div>
14
- </span>
11
+ </div>
15
12
  </div>
16
13
  `;
17
14
 
18
15
  exports[`VMessages.ts should allow HTML 1`] = `
19
16
  <div class="v-messages theme--light">
20
- <span name="message-transition"
21
- tag="div"
22
- class="v-messages__wrapper"
23
- >
17
+ <div class="v-messages__wrapper">
24
18
  <div class="v-messages__message">
25
19
  &lt;a href="#"&gt;a link&lt;/a&gt;
26
20
  </div>
27
- </span>
21
+ </div>
28
22
  </div>
29
23
  `;
30
24
 
31
25
  exports[`VMessages.ts should not allow HTML 1`] = `
32
26
  <div class="v-messages theme--light">
33
- <span name="message-transition"
34
- tag="div"
35
- class="v-messages__wrapper"
36
- >
27
+ <div class="v-messages__wrapper">
37
28
  <div class="v-messages__message">
38
29
  &lt;a href="#"&gt;a link&lt;/a&gt;
39
30
  </div>
40
- </span>
31
+ </div>
41
32
  </div>
42
33
  `;
43
34
 
44
35
  exports[`VMessages.ts should show messages 1`] = `
45
36
  <div class="v-messages theme--light">
46
- <span name="message-transition"
47
- tag="div"
48
- class="v-messages__wrapper"
49
- >
37
+ <div class="v-messages__wrapper">
50
38
  <div class="v-messages__message">
51
39
  foo
52
40
  </div>
53
41
  <div class="v-messages__message">
54
42
  bar
55
43
  </div>
56
- </span>
44
+ </div>
57
45
  </div>
58
46
  `;
59
47
 
60
48
  exports[`VMessages.ts should show messages 2`] = `
61
49
  <div class="v-messages theme--light">
62
- <span name="message-transition"
63
- tag="div"
64
- class="v-messages__wrapper"
65
- >
66
- </span>
50
+ <div class="v-messages__wrapper">
51
+ <div class="v-messages__message message-transition-leave-from message-transition-leave-active">
52
+ foo
53
+ </div>
54
+ <div class="v-messages__message message-transition-leave-from message-transition-leave-active">
55
+ bar
56
+ </div>
57
+ </div>
67
58
  </div>
68
59
  `;
@@ -1,4 +1,4 @@
1
- import {h, withDirectives} from 'vue'
1
+ import { h, withDirectives } from 'vue'
2
2
  // Styles
3
3
  import './VNavigationDrawer.sass'
4
4
 
@@ -21,6 +21,7 @@ import Touch from '../../directives/touch'
21
21
 
22
22
  // Utilities
23
23
  import { convertToUnit, getSlot } from '../../util/helpers'
24
+ import { breaking } from '../../util/console'
24
25
  import mixins from '../../util/mixins'
25
26
 
26
27
  // Types
@@ -50,7 +51,6 @@ const baseMixins = mixins(
50
51
  export default baseMixins.extend({
51
52
  name: 'v-navigation-drawer',
52
53
 
53
-
54
54
  provide (): object {
55
55
  return {
56
56
  isInNav: this.$tag === 'nav',
@@ -80,7 +80,7 @@ export default baseMixins.extend({
80
80
  },
81
81
  stateless: Boolean,
82
82
  tag: {
83
- type: String
83
+ type: String,
84
84
  },
85
85
  temporary: Boolean,
86
86
  touchless: Boolean,
@@ -103,10 +103,10 @@ export default baseMixins.extend({
103
103
  }),
104
104
 
105
105
  computed: {
106
- $tag() {
106
+ $tag () {
107
107
  return this.tag || this.app ? 'nav' : 'aside'
108
108
  },
109
- $height() {
109
+ $height () {
110
110
  return this.height || (this.app ? '100vh' : '100%')
111
111
  },
112
112
  /**
@@ -286,6 +286,18 @@ export default baseMixins.extend({
286
286
  },
287
287
  },
288
288
 
289
+ created () {
290
+ const breakingProps = [
291
+ ['value', 'modelValue'],
292
+ ['onInput', 'onUpdate:modelValue'],
293
+ ]
294
+
295
+ /* istanbul ignore next */
296
+ breakingProps.forEach(([original, replacement]) => {
297
+ if (this.$attrs.hasOwnProperty(original)) breaking(original, replacement, this)
298
+ })
299
+ },
300
+
289
301
  beforeMount () {
290
302
  this.init()
291
303
  },
@@ -325,14 +337,14 @@ export default baseMixins.extend({
325
337
  }, [image])
326
338
  },
327
339
  genDirectives (): VNodeDirective[] {
328
- const directives = [
340
+ return [
329
341
  [
330
342
  ClickOutside,
331
343
  {
332
344
  handler: () => { this.isActive = false },
333
345
  closeConditional: this.closeConditional,
334
346
  include: this.getOpenDependentElements,
335
- }
347
+ },
336
348
  ],
337
349
  [
338
350
  Touch,
@@ -340,12 +352,10 @@ export default baseMixins.extend({
340
352
  parent: true,
341
353
  left: this.swipeLeft,
342
354
  right: this.swipeRight,
343
- isDirActive: !this.touchless && !this.stateless
355
+ isDirActive: !this.touchless && !this.stateless,
344
356
  },
345
- ]
357
+ ],
346
358
  ]
347
-
348
- return directives
349
359
  },
350
360
  genListeners () {
351
361
  const on: Record<string, (e: Event) => void> = {