@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
@@ -2,30 +2,27 @@
2
2
  import VAlert from '../VAlert'
3
3
 
4
4
  // Utilities
5
- import {
6
- mount,
7
- Wrapper,
8
- } from '@vue/test-utils'
5
+ import { mount, enableAutoUnmount, VueWrapper, config } from '@vue/test-utils'
9
6
 
10
7
  // Types
11
8
  import { ExtractVue } from '../../../util/mixins'
12
9
 
13
10
  describe('VAlert.ts', () => {
14
- type Instance = ExtractVue<typeof VAlert>
15
- let mountFunction: (options?: object) => Wrapper<Instance>
11
+ type Instance = ExtractVue<typeof VAlert>;
12
+ let mountFunction: (options?: object) => VueWrapper<Instance>
13
+
14
+ enableAutoUnmount(afterEach)
16
15
 
17
16
  beforeEach(() => {
18
17
  mountFunction = (options = {}) => {
18
+ console.log('options', options)
19
19
  return mount(VAlert, {
20
20
  ...options,
21
- // https://github.com/vuejs/vue-test-utils/issues/1130
22
- sync: false,
23
- mocks: {
24
- $vuetify: {
25
- lang: {
26
- t: (val: string) => val,
27
- },
21
+ global: {
22
+ mocks: {
23
+ ...config.global.mocks,
28
24
  },
25
+ ...options.global,
29
26
  },
30
27
  })
31
28
  }
@@ -37,16 +34,18 @@ describe('VAlert.ts', () => {
37
34
  expect(wrapper.element.style.display).toBe('')
38
35
  expect(wrapper.html()).toMatchSnapshot()
39
36
 
40
- wrapper.setProps({ value: false })
41
- await wrapper.vm.$nextTick()
37
+ await wrapper.setProps({ modelValue: false })
42
38
 
39
+ // Check that isActive is false
40
+ expect(wrapper.vm.isActive).toBe(false)
41
+ // Check that element is hidden
43
42
  expect(wrapper.element.style.display).toBe('none')
44
43
  expect(wrapper.html()).toMatchSnapshot()
45
44
  })
46
45
 
47
46
  it('should have a close icon', () => {
48
47
  const wrapper = mountFunction({
49
- propsData: { dismissible: true },
48
+ props: { dismissible: true },
50
49
  })
51
50
 
52
51
  expect(wrapper.html()).toMatchSnapshot()
@@ -54,66 +53,61 @@ describe('VAlert.ts', () => {
54
53
 
55
54
  it('should be dismissible', async () => {
56
55
  const wrapper = mountFunction({
57
- propsData: {
56
+ props: {
58
57
  dismissible: true,
59
58
  },
60
59
  })
61
60
 
62
61
  const icon = wrapper.find('.v-alert__dismissible')
63
- const input = jest.fn(show => wrapper.setProps({ show }))
64
-
65
- wrapper.vm.$on('input', input)
66
62
 
67
- icon.trigger('click')
68
- await wrapper.vm.$nextTick()
63
+ await icon.trigger('click')
69
64
 
70
- expect(input).toHaveBeenCalledWith(false)
65
+ expect(wrapper.emitted('update:modelValue')).toBeTruthy()
66
+ expect(wrapper.emitted('update:modelValue')?.[0]).toEqual([false])
71
67
  expect(wrapper.html()).toMatchSnapshot()
72
68
  })
73
69
 
74
70
  it('should have a custom icon', () => {
75
71
  const wrapper = mountFunction({
76
- propsData: {
77
- icon: 'list',
72
+ props: {
73
+ icon: 'mdi-list',
78
74
  },
79
75
  })
80
76
 
81
77
  const icon = wrapper.find('.v-alert__icon')
82
78
 
83
- expect(icon.text()).toBe('list')
79
+ expect(icon.exists()).toBe(true)
80
+ // С component: null иконки рендерятся как font-иконки с содержимым
81
+ expect(icon.classes()).toContain('v-icon')
82
+ expect(icon.classes()).toContain('v-alert__icon')
84
83
  })
85
84
 
86
85
  it('should have no icon', () => {
87
86
  const wrapper = mountFunction()
88
87
 
89
- expect(wrapper.contains('.v-icon')).toBe(false)
88
+ expect(wrapper.find('.v-icon').exists()).toBe(false)
90
89
  })
91
90
 
92
- // TODO: this fails without sync, nextTick doesn't help
93
- // https://github.com/vuejs/vue-test-utils/issues/1130
94
- it.skip('should display contextual colors by type', async () => {
91
+ it('should display contextual colors by type', async () => {
95
92
  const wrapper = mountFunction({
96
- propsData: { type: 'error' },
93
+ props: { type: 'error' },
97
94
  })
98
95
 
99
96
  expect(wrapper.classes('error')).toBe(true)
100
97
 
101
- wrapper.setProps({ type: 'success' })
102
- await wrapper.vm.$nextTick()
98
+ await wrapper.setProps({ type: 'success' })
103
99
  expect(wrapper.classes('success')).toBe(true)
104
100
 
105
- wrapper.setProps({ type: 'warning' })
106
- await wrapper.vm.$nextTick()
101
+ await wrapper.setProps({ type: 'warning' })
107
102
  expect(wrapper.classes('warning')).toBe(true)
108
103
 
109
- wrapper.setProps({ type: 'info' })
110
- await wrapper.vm.$nextTick()
104
+ await wrapper.setProps({ type: 'info' })
111
105
  expect(wrapper.classes('info')).toBe(true)
112
106
  })
113
107
 
114
108
  it('should allow overriding color for contextual alert', () => {
115
109
  const wrapper = mountFunction({
116
- propsData: {
110
+ props: {
117
111
  type: 'error',
118
112
  color: 'primary',
119
113
  },
@@ -124,28 +118,33 @@ describe('VAlert.ts', () => {
124
118
 
125
119
  it('should allow overriding icon for contextual alert', () => {
126
120
  const wrapper = mountFunction({
127
- propsData: {
121
+ props: {
128
122
  type: 'error',
129
- icon: 'block',
123
+ icon: 'mdi-block',
130
124
  },
131
125
  })
132
126
 
133
127
  const icon = wrapper.find('.v-alert__icon')
134
128
 
135
- expect(icon.text()).toBe('block')
129
+ expect(icon.exists()).toBe(true)
130
+ // С component: null иконки рендерятся как font-иконки с содержимым
131
+ expect(icon.classes()).toContain('v-icon')
132
+ expect(icon.classes()).toContain('v-alert__icon')
136
133
  })
137
134
 
138
135
  it('should render custom dismissible icon', () => {
139
136
  const wrapper = mountFunction({
140
- propsData: {
137
+ props: {
141
138
  dismissible: true,
142
- closeIcon: 'foo',
139
+ closeIcon: 'mdi-close',
143
140
  },
144
141
  })
145
142
 
146
- const icon = wrapper.find('.v-alert__content + .v-btn')
143
+ const icon = wrapper.find('.v-alert__content + .v-btn .v-icon')
147
144
 
148
- expect(icon.text()).toBe('foo')
145
+ expect(icon.exists()).toBe(true)
146
+ // С component: null иконки рендерятся как font-иконки с содержимым
147
+ expect(icon.classes()).toContain('v-icon')
149
148
  })
150
149
 
151
150
  it('should show border', async () => {
@@ -155,8 +154,7 @@ describe('VAlert.ts', () => {
155
154
  expect(wrapper.classes('v-alert--border')).toBe(false)
156
155
 
157
156
  for (const border of directions) {
158
- wrapper.setProps({ border })
159
- await wrapper.vm.$nextTick()
157
+ await wrapper.setProps({ border })
160
158
 
161
159
  expect(wrapper.classes('v-alert--border')).toBe(true)
162
160
  expect(wrapper.classes(`v-alert--border-${border}`)).toBe(true)
@@ -165,7 +163,7 @@ describe('VAlert.ts', () => {
165
163
 
166
164
  it('should move color classes to border and icon elements', async () => {
167
165
  const wrapper = mountFunction({
168
- propsData: {
166
+ props: {
169
167
  color: 'pink',
170
168
  border: 'left',
171
169
  },
@@ -175,8 +173,7 @@ describe('VAlert.ts', () => {
175
173
  expect(wrapper.classes('pink')).toBe(true)
176
174
  expect(border.classes('pink')).toBe(false)
177
175
 
178
- wrapper.setProps({ coloredBorder: true })
179
- await wrapper.vm.$nextTick()
176
+ await wrapper.setProps({ coloredBorder: true })
180
177
  expect(wrapper.classes('pink')).toBe(false)
181
178
  expect(border.classes('pink')).toBe(true)
182
179
  expect(border.classes('v-alert__border--has-color')).toBe(true)
@@ -191,4 +188,35 @@ describe('VAlert.ts', () => {
191
188
 
192
189
  expect(wrapper.vm.isActive).toBe(false)
193
190
  })
191
+
192
+ it('should render font icons with proper classes', () => {
193
+ const wrapper = mountFunction({
194
+ props: {
195
+ type: 'error',
196
+ icon: 'mdi-alert',
197
+ },
198
+ })
199
+
200
+ const icon = wrapper.find('.v-alert__icon')
201
+
202
+ expect(icon.exists()).toBe(true)
203
+ // С component: null иконки рендерятся как font-иконки с CSS классами
204
+ // В JSDOM текстовое содержимое не отображается, но классы присутствуют
205
+ expect(icon.classes()).toContain('v-icon')
206
+ expect(icon.classes()).toContain('v-alert__icon')
207
+ expect(icon.classes()).toContain('mdi')
208
+ expect(icon.classes()).toContain('mdi-alert')
209
+ })
210
+
211
+ it('should translate aria-label correctly', () => {
212
+ const wrapper = mountFunction({
213
+ props: { dismissible: true },
214
+ })
215
+
216
+ const button = wrapper.find('.v-alert__dismissible')
217
+
218
+ expect(button.exists()).toBe(true)
219
+ // Проверяем что перевод $vuetify.close работает правильно
220
+ expect(button.element.getAttribute('aria-label')).toBe('Close')
221
+ })
194
222
  })
@@ -1,22 +1,21 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`VAlert.ts should be dismissible 1`] = `
4
- <div role="alert"
5
- class="v-alert v-sheet theme--light"
4
+ <div class="v-alert v-sheet theme--light"
5
+ role="alert"
6
6
  style="display: none;"
7
7
  >
8
8
  <div class="v-alert__wrapper">
9
9
  <div class="v-alert__content">
10
10
  </div>
11
- <button type="button"
12
- class="v-alert__dismissible v-btn v-btn--icon v-btn--round theme--light v-size--small"
13
- aria-label="$vuetify.close"
11
+ <button class="v-btn v-btn--icon v-btn--round theme--light v-size--small v-alert__dismissible"
12
+ type="button"
13
+ aria-label="Close"
14
14
  >
15
15
  <span class="v-btn__content">
16
16
  <i aria-hidden="true"
17
- class="v-icon notranslate material-icons theme--light"
17
+ class="v-icon notranslate mdi mdi-close-circle theme--light"
18
18
  >
19
- $cancel
20
19
  </i>
21
20
  </span>
22
21
  </button>
@@ -25,8 +24,8 @@ exports[`VAlert.ts should be dismissible 1`] = `
25
24
  `;
26
25
 
27
26
  exports[`VAlert.ts should be open by default 1`] = `
28
- <div role="alert"
29
- class="v-alert v-sheet theme--light"
27
+ <div class="v-alert v-sheet theme--light"
28
+ role="alert"
30
29
  >
31
30
  <div class="v-alert__wrapper">
32
31
  <div class="v-alert__content">
@@ -36,8 +35,8 @@ exports[`VAlert.ts should be open by default 1`] = `
36
35
  `;
37
36
 
38
37
  exports[`VAlert.ts should be open by default 2`] = `
39
- <div role="alert"
40
- class="v-alert v-sheet theme--light"
38
+ <div class="v-alert v-sheet theme--light"
39
+ role="alert"
41
40
  style="display: none;"
42
41
  >
43
42
  <div class="v-alert__wrapper">
@@ -48,21 +47,20 @@ exports[`VAlert.ts should be open by default 2`] = `
48
47
  `;
49
48
 
50
49
  exports[`VAlert.ts should have a close icon 1`] = `
51
- <div role="alert"
52
- class="v-alert v-sheet theme--light"
50
+ <div class="v-alert v-sheet theme--light"
51
+ role="alert"
53
52
  >
54
53
  <div class="v-alert__wrapper">
55
54
  <div class="v-alert__content">
56
55
  </div>
57
- <button type="button"
58
- class="v-alert__dismissible v-btn v-btn--icon v-btn--round theme--light v-size--small"
59
- aria-label="$vuetify.close"
56
+ <button class="v-btn v-btn--icon v-btn--round theme--light v-size--small v-alert__dismissible"
57
+ type="button"
58
+ aria-label="Close"
60
59
  >
61
60
  <span class="v-btn__content">
62
61
  <i aria-hidden="true"
63
- class="v-icon notranslate material-icons theme--light"
62
+ class="v-icon notranslate mdi mdi-close-circle theme--light"
64
63
  >
65
- $cancel
66
64
  </i>
67
65
  </span>
68
66
  </button>
@@ -29,6 +29,28 @@ export default defineComponent({
29
29
  name: 'v-autocomplete',
30
30
  extends: VSelect,
31
31
 
32
+ emits: [
33
+ 'update:search-input',
34
+ 'update:modelValue',
35
+ 'change',
36
+ 'focus',
37
+ 'blur',
38
+ 'keydown',
39
+ 'click',
40
+ 'update:list-index',
41
+ 'mousedown',
42
+ 'mouseup',
43
+ 'touchstart',
44
+ 'touchend',
45
+ 'click:prepend',
46
+ 'click:append',
47
+ 'click:append-outer',
48
+ 'click:prepend-inner',
49
+ 'click:clear',
50
+ 'input',
51
+ 'update:error',
52
+ ],
53
+
32
54
  props: {
33
55
  autoSelectFirst: {
34
56
  type: Boolean,
@@ -4,13 +4,16 @@ import VAutocomplete from '../VAutocomplete'
4
4
  // Utilities
5
5
  import {
6
6
  mount,
7
- Wrapper,
7
+ VueWrapper,
8
+ enableAutoUnmount,
8
9
  } from '@vue/test-utils'
9
10
  import { keyCodes } from '../../../util/helpers'
10
11
 
11
12
  describe('VAutocomplete.ts', () => {
12
13
  type Instance = InstanceType<typeof VAutocomplete>
13
- let mountFunction: (options?: object) => Wrapper<Instance>
14
+ let mountFunction: (options?: object) => VueWrapper<Instance>
15
+
16
+ enableAutoUnmount(afterEach)
14
17
 
15
18
  beforeEach(() => {
16
19
  document.body.setAttribute('data-app', 'true')
@@ -18,15 +21,18 @@ describe('VAutocomplete.ts', () => {
18
21
  mountFunction = (options = {}) => {
19
22
  return mount(VAutocomplete, {
20
23
  ...options,
21
- // https://github.com/vuejs/vue-test-utils/issues/1130
22
- sync: false,
23
- mocks: {
24
- $vuetify: {
25
- lang: {
26
- t: (val: string) => val,
27
- },
28
- theme: {
29
- dark: false,
24
+ global: {
25
+ mocks: {
26
+ $vuetify: {
27
+ lang: {
28
+ t: (val: string) => val,
29
+ },
30
+ theme: {
31
+ dark: false,
32
+ },
33
+ icons: {
34
+ component: null,
35
+ },
30
36
  },
31
37
  },
32
38
  },
@@ -46,28 +52,23 @@ describe('VAutocomplete.ts', () => {
46
52
  })
47
53
 
48
54
  it('should emit search input changes', async () => {
49
- const wrapper = mountFunction({
50
- propsData: {
51
- },
52
- })
55
+ const wrapper = mountFunction()
53
56
 
54
57
  const input = wrapper.find('input')
55
58
  const element = input.element as HTMLInputElement
56
59
 
57
- const update = jest.fn()
58
- wrapper.vm.$on('update:search-input', update)
59
-
60
60
  element.value = 'test'
61
61
  input.trigger('input')
62
62
 
63
63
  await wrapper.vm.$nextTick()
64
64
 
65
- expect(update).toHaveBeenCalledWith('test')
65
+ expect(wrapper.emitted('update:search-input')).toBeTruthy()
66
+ expect(wrapper.emitted('update:search-input')?.[0]).toEqual(['test'])
66
67
  })
67
68
 
68
69
  it('should filter autocomplete search results', async () => {
69
70
  const wrapper = mountFunction({
70
- propsData: { items: ['foo', 'bar'] },
71
+ props: { items: ['foo', 'bar'] },
71
72
  })
72
73
 
73
74
  wrapper.setData({ internalSearch: 'foo' })
@@ -78,7 +79,7 @@ describe('VAutocomplete.ts', () => {
78
79
 
79
80
  it('should filter numeric primitives', () => {
80
81
  const wrapper = mountFunction({
81
- propsData: {
82
+ props: {
82
83
  items: [1, 2],
83
84
  },
84
85
  })
@@ -91,7 +92,7 @@ describe('VAutocomplete.ts', () => {
91
92
 
92
93
  it('should activate when search changes and not active', async () => {
93
94
  const wrapper = mountFunction({
94
- propsData: {
95
+ props: {
95
96
  items: [1, 2, 3, 4],
96
97
  multiple: true,
97
98
  },
@@ -109,7 +110,7 @@ describe('VAutocomplete.ts', () => {
109
110
  // https://github.com/vuejs/vue-test-utils/issues/1130
110
111
  it.skip('should set searchValue to null when deactivated', async () => {
111
112
  const wrapper = mountFunction({
112
- propsData: {
113
+ props: {
113
114
  items: [1, 2, 3, 4],
114
115
  multiple: true,
115
116
  },
@@ -128,7 +129,7 @@ describe('VAutocomplete.ts', () => {
128
129
 
129
130
  wrapper.setProps({
130
131
  multiple: false,
131
- value: 1,
132
+ modelValue: 1,
132
133
  })
133
134
 
134
135
  await wrapper.vm.$nextTick()
@@ -154,7 +155,7 @@ describe('VAutocomplete.ts', () => {
154
155
 
155
156
  it('should not duplicate items after items update when caching is turned on', async () => {
156
157
  const wrapper = mountFunction({
157
- propsData: {
158
+ props: {
158
159
  cacheItems: true,
159
160
  returnObject: true,
160
161
  itemText: 'text',
@@ -171,7 +172,7 @@ describe('VAutocomplete.ts', () => {
171
172
 
172
173
  it('should cache items passed via prop', async () => {
173
174
  const wrapper = mountFunction({
174
- propsData: {
175
+ props: {
175
176
  cacheItems: true,
176
177
  items: [1, 2, 3, 4],
177
178
  },
@@ -186,7 +187,7 @@ describe('VAutocomplete.ts', () => {
186
187
 
187
188
  it('should not filter text with no items', async () => {
188
189
  const wrapper = mountFunction({
189
- propsData: {
190
+ props: {
190
191
  eager: true,
191
192
  items: ['foo', 'bar'],
192
193
  },
@@ -206,9 +207,9 @@ describe('VAutocomplete.ts', () => {
206
207
 
207
208
  it('should not display menu when tab focused', async () => {
208
209
  const wrapper = mountFunction({
209
- propsData: {
210
+ props: {
210
211
  items: [1, 2],
211
- value: 1,
212
+ modelValue: 1,
212
213
  },
213
214
  })
214
215
 
@@ -225,11 +226,11 @@ describe('VAutocomplete.ts', () => {
225
226
  // eslint-disable-next-line max-statements
226
227
  it.skip('should change selected index', async () => {
227
228
  const wrapper = mountFunction({
228
- attachToDocument: true,
229
- propsData: {
229
+ attachTo: document.body,
230
+ props: {
230
231
  items: ['foo', 'bar', 'fizz'],
231
232
  multiple: true,
232
- value: ['foo', 'bar', 'fizz'],
233
+ modelValue: ['foo', 'bar', 'fizz'],
233
234
  },
234
235
  })
235
236
 
@@ -304,7 +305,7 @@ describe('VAutocomplete.ts', () => {
304
305
 
305
306
  expect(wrapper.vm.selectedIndex).toBe(-1)
306
307
 
307
- wrapper.setProps({ value: ['foo', 'bar', 'fizz'] })
308
+ wrapper.setProps({ modelValue: ['foo', 'bar', 'fizz'] })
308
309
 
309
310
  await wrapper.vm.$nextTick()
310
311
 
@@ -313,7 +314,7 @@ describe('VAutocomplete.ts', () => {
313
314
  wrapper.vm.selectedIndex = 2
314
315
 
315
316
  // Simulating removing items when an index already selected
316
- wrapper.setProps({ value: ['foo', 'bar'] })
317
+ wrapper.setProps({ modelValue: ['foo', 'bar'] })
317
318
 
318
319
  await wrapper.vm.$nextTick()
319
320
 
@@ -326,8 +327,8 @@ describe('VAutocomplete.ts', () => {
326
327
 
327
328
  it('should conditionally show the menu', async () => {
328
329
  const wrapper = mountFunction({
329
- attachToDocument: true,
330
- propsData: {
330
+ attachTo: document.body,
331
+ props: {
331
332
  items: ['foo', 'bar', 'fizz'],
332
333
  },
333
334
  })
@@ -367,10 +368,10 @@ describe('VAutocomplete.ts', () => {
367
368
  // https://github.com/vuejs/vue-test-utils/issues/1130
368
369
  it.skip('should have the correct selected item', async () => {
369
370
  const wrapper = mountFunction({
370
- propsData: {
371
+ props: {
371
372
  items: ['foo', 'bar', 'fizz'],
372
373
  multiple: true,
373
- value: ['foo'],
374
+ modelValue: ['foo'],
374
375
  },
375
376
  })
376
377
 
@@ -378,7 +379,7 @@ describe('VAutocomplete.ts', () => {
378
379
 
379
380
  wrapper.setProps({
380
381
  multiple: false,
381
- value: 'foo',
382
+ modelValue: 'foo',
382
383
  })
383
384
 
384
385
  expect(wrapper.vm.selectedItem).toBe('foo')
@@ -386,7 +387,7 @@ describe('VAutocomplete.ts', () => {
386
387
 
387
388
  it('should reset lazySearch', async () => {
388
389
  const wrapper = mountFunction({
389
- propsData: {
390
+ props: {
390
391
  chips: true,
391
392
  items: ['foo', 'bar', 'fizz'],
392
393
  searchInput: 'foo',
@@ -406,7 +407,7 @@ describe('VAutocomplete.ts', () => {
406
407
 
407
408
  it('should select input text on focus', async () => {
408
409
  const wrapper = mountFunction({
409
- attachToDocument: true,
410
+ attachTo: document.body,
410
411
  })
411
412
  const select = jest.fn()
412
413
  wrapper.vm.$refs.input.select = select
@@ -430,9 +431,9 @@ describe('VAutocomplete.ts', () => {
430
431
  it('should not respond to click', () => {
431
432
  const onFocus = jest.fn()
432
433
  const wrapper = mountFunction({
433
- propsData: { disabled: true },
434
- methods: { onFocus },
434
+ props: { disabled: true },
435
435
  })
436
+ wrapper.vm.onFocus = onFocus
436
437
  const slot = wrapper.find('.v-input__slot')
437
438
 
438
439
  slot.trigger('click')
@@ -457,14 +458,11 @@ describe('VAutocomplete.ts', () => {
457
458
  const changeSelectedIndex = jest.fn()
458
459
  const onEscDown = jest.fn()
459
460
  const onTabDown = jest.fn()
460
- const wrapper = mountFunction({
461
- methods: {
462
- activateMenu,
463
- changeSelectedIndex,
464
- onEscDown,
465
- onTabDown,
466
- },
467
- })
461
+ const wrapper = mountFunction()
462
+ wrapper.vm.activateMenu = activateMenu
463
+ wrapper.vm.changeSelectedIndex = changeSelectedIndex
464
+ wrapper.vm.onEscDown = onEscDown
465
+ wrapper.vm.onTabDown = onTabDown
468
466
 
469
467
  const input = wrapper.find('input')
470
468
  const element = input.element as HTMLInputElement
@@ -509,10 +507,10 @@ describe('VAutocomplete.ts', () => {
509
507
 
510
508
  it('should not delete item if readonly', async () => {
511
509
  const wrapper = mountFunction({
512
- propsData: {
510
+ props: {
513
511
  items: ['a', 'b', 'c'],
514
512
  multiple: true,
515
- value: ['a', 'b', 'c'],
513
+ modelValue: ['a', 'b', 'c'],
516
514
  },
517
515
  })
518
516
  wrapper.vm.changeSelectedIndex(keyCodes.right)