vuetify 2.6.0-beta.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/json/attributes.json +64 -60
- package/dist/json/tags.json +1 -0
- package/dist/json/web-types.json +128 -92
- package/dist/vuetify.css +37 -33
- package/dist/vuetify.css.map +1 -1
- package/dist/vuetify.js +244 -146
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +2 -2
- package/es5/components/VAutocomplete/VAutocomplete.js +20 -2
- package/es5/components/VAutocomplete/VAutocomplete.js.map +1 -1
- package/es5/components/VCalendar/VCalendarDaily.js +13 -15
- package/es5/components/VCalendar/VCalendarDaily.js.map +1 -1
- package/es5/components/VCalendar/mixins/calendar-with-events.js +4 -2
- package/es5/components/VCalendar/mixins/calendar-with-events.js.map +1 -1
- package/es5/components/VCalendar/mixins/mouse.js +1 -1
- package/es5/components/VCalendar/mixins/mouse.js.map +1 -1
- package/es5/components/VCombobox/VCombobox.js +0 -5
- package/es5/components/VCombobox/VCombobox.js.map +1 -1
- package/es5/components/VDialog/VDialog.js +4 -2
- package/es5/components/VDialog/VDialog.js.map +1 -1
- package/es5/components/VList/VListItem.js +8 -1
- package/es5/components/VList/VListItem.js.map +1 -1
- package/es5/components/VMenu/VMenu.js +1 -1
- package/es5/components/VMenu/VMenu.js.map +1 -1
- package/es5/components/VOtpInput/VOtpInput.js +14 -25
- package/es5/components/VOtpInput/VOtpInput.js.map +1 -1
- package/es5/components/VOverlay/VOverlay.js +1 -0
- package/es5/components/VOverlay/VOverlay.js.map +1 -1
- package/es5/components/VRadioGroup/VRadioGroup.js +7 -0
- package/es5/components/VRadioGroup/VRadioGroup.js.map +1 -1
- package/es5/components/VRangeSlider/VRangeSlider.js +4 -1
- package/es5/components/VRangeSlider/VRangeSlider.js.map +1 -1
- package/es5/components/VSelect/VSelect.js +1 -1
- package/es5/components/VSelect/VSelect.js.map +1 -1
- package/es5/components/VTabs/VTab.js +15 -4
- package/es5/components/VTabs/VTab.js.map +1 -1
- package/es5/components/VTextField/VTextField.js +6 -1
- package/es5/components/VTextField/VTextField.js.map +1 -1
- package/es5/components/VTreeview/VTreeviewNode.js +3 -1
- package/es5/components/VTreeview/VTreeviewNode.js.map +1 -1
- package/es5/components/transitions/createTransition.js +0 -20
- package/es5/components/transitions/createTransition.js.map +1 -1
- package/es5/directives/click-outside/index.js +21 -10
- package/es5/directives/click-outside/index.js.map +1 -1
- package/es5/directives/intersect/index.js +16 -12
- package/es5/directives/intersect/index.js.map +1 -1
- package/es5/directives/mutate/index.js +10 -8
- package/es5/directives/mutate/index.js.map +1 -1
- package/es5/directives/resize/index.js +11 -8
- package/es5/directives/resize/index.js.map +1 -1
- package/es5/directives/scroll/index.js +13 -10
- package/es5/directives/scroll/index.js.map +1 -1
- package/es5/framework.js +1 -1
- package/es5/locale/fr.js +1 -1
- package/es5/locale/fr.js.map +1 -1
- package/es5/mixins/detachable/index.js +32 -14
- package/es5/mixins/detachable/index.js.map +1 -1
- package/es5/mixins/intersectable/index.js +11 -2
- package/es5/mixins/intersectable/index.js.map +1 -1
- package/es5/mixins/overlayable/index.js +21 -11
- package/es5/mixins/overlayable/index.js.map +1 -1
- package/es5/mixins/routable/index.js +9 -3
- package/es5/mixins/routable/index.js.map +1 -1
- package/lib/components/VAutocomplete/VAutocomplete.js +18 -2
- package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
- package/lib/components/VCalendar/VCalendarDaily.js +9 -9
- package/lib/components/VCalendar/VCalendarDaily.js.map +1 -1
- package/lib/components/VCalendar/mixins/calendar-with-events.js +4 -2
- package/lib/components/VCalendar/mixins/calendar-with-events.js.map +1 -1
- package/lib/components/VCalendar/mixins/mouse.js +1 -1
- package/lib/components/VCalendar/mixins/mouse.js.map +1 -1
- package/lib/components/VCombobox/VCombobox.js +0 -5
- package/lib/components/VCombobox/VCombobox.js.map +1 -1
- package/lib/components/VDialog/VDialog.js +5 -2
- package/lib/components/VDialog/VDialog.js.map +1 -1
- package/lib/components/VList/VListItem.js +9 -1
- package/lib/components/VList/VListItem.js.map +1 -1
- package/lib/components/VMenu/VMenu.js +1 -1
- package/lib/components/VMenu/VMenu.js.map +1 -1
- package/lib/components/VOtpInput/VOtpInput.js +14 -25
- package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
- package/lib/components/VOverlay/VOverlay.js +1 -0
- package/lib/components/VOverlay/VOverlay.js.map +1 -1
- package/lib/components/VRadioGroup/VRadioGroup.js +9 -0
- package/lib/components/VRadioGroup/VRadioGroup.js.map +1 -1
- package/lib/components/VRangeSlider/VRangeSlider.js +4 -1
- package/lib/components/VRangeSlider/VRangeSlider.js.map +1 -1
- package/lib/components/VSelect/VSelect.js +1 -1
- package/lib/components/VSelect/VSelect.js.map +1 -1
- package/lib/components/VTabs/VTab.js +16 -6
- package/lib/components/VTabs/VTab.js.map +1 -1
- package/lib/components/VTextField/VTextField.js +8 -1
- package/lib/components/VTextField/VTextField.js.map +1 -1
- package/lib/components/VTreeview/VTreeviewNode.js +3 -1
- package/lib/components/VTreeview/VTreeviewNode.js.map +1 -1
- package/lib/components/transitions/createTransition.js +0 -6
- package/lib/components/transitions/createTransition.js.map +1 -1
- package/lib/directives/click-outside/index.js +22 -10
- package/lib/directives/click-outside/index.js.map +1 -1
- package/lib/directives/intersect/index.js +16 -12
- package/lib/directives/intersect/index.js.map +1 -1
- package/lib/directives/mutate/index.js +10 -8
- package/lib/directives/mutate/index.js.map +1 -1
- package/lib/directives/resize/index.js +9 -6
- package/lib/directives/resize/index.js.map +1 -1
- package/lib/directives/scroll/index.js +9 -6
- package/lib/directives/scroll/index.js.map +1 -1
- package/lib/framework.js +1 -1
- package/lib/locale/fr.js +1 -1
- package/lib/locale/fr.js.map +1 -1
- package/lib/mixins/detachable/index.js +28 -13
- package/lib/mixins/detachable/index.js.map +1 -1
- package/lib/mixins/intersectable/index.js +9 -2
- package/lib/mixins/intersectable/index.js.map +1 -1
- package/lib/mixins/overlayable/index.js +21 -11
- package/lib/mixins/overlayable/index.js.map +1 -1
- package/lib/mixins/routable/index.js +12 -3
- package/lib/mixins/routable/index.js.map +1 -1
- package/package.json +2 -2
- package/src/components/VAutocomplete/VAutocomplete.ts +15 -2
- package/src/components/VCalendar/VCalendarDaily.ts +7 -7
- package/src/components/VCalendar/mixins/calendar-with-events.sass +7 -1
- package/src/components/VCalendar/mixins/calendar-with-events.ts +3 -3
- package/src/components/VCalendar/mixins/mouse.ts +1 -1
- package/src/components/VCombobox/VCombobox.ts +0 -5
- package/src/components/VCombobox/__tests__/VCombobox-multiple.spec.ts +113 -0
- package/src/components/VCombobox/__tests__/VCombobox.spec.ts +30 -0
- package/src/components/VDialog/VDialog.ts +4 -2
- package/src/components/VImg/__tests__/VImg.spec.ts +1 -1
- package/src/components/VList/VListItem.sass +2 -1
- package/src/components/VList/VListItem.ts +7 -1
- package/src/components/VList/__tests__/VListItem.spec.ts +16 -0
- package/src/components/VMenu/VMenu.ts +1 -1
- package/src/components/VOtpInput/VOtpInput.sass +13 -16
- package/src/components/VOtpInput/VOtpInput.ts +12 -28
- package/src/components/VOtpInput/_variables.scss +2 -4
- package/src/components/VOverlay/VOverlay.ts +1 -0
- package/src/components/VRadioGroup/VRadioGroup.ts +8 -0
- package/src/components/VRangeSlider/VRangeSlider.ts +3 -1
- package/src/components/VSelect/VSelect.ts +1 -1
- package/src/components/VTabs/VTab.ts +14 -4
- package/src/components/VTabs/VTabs.sass +5 -2
- package/src/components/VTextField/VTextField.ts +8 -3
- package/src/components/VTreeview/VTreeviewNode.ts +3 -1
- package/src/components/transitions/createTransition.ts +0 -8
- package/src/directives/click-outside/__tests__/click-outside-shadow-dom.spec.ts +9 -6
- package/src/directives/click-outside/__tests__/click-outside.spec.ts +7 -4
- package/src/directives/click-outside/index.ts +19 -10
- package/src/directives/intersect/__tests__/intersect.spec.ts +13 -10
- package/src/directives/intersect/index.ts +15 -13
- package/src/directives/mutate/__tests__/mutate.spec.ts +36 -17
- package/src/directives/mutate/index.ts +9 -9
- package/src/directives/resize/__tests__/resize.spec.ts +4 -4
- package/src/directives/resize/index.ts +11 -6
- package/src/directives/scroll/__tests__/scroll.spec.ts +9 -9
- package/src/directives/scroll/index.ts +8 -7
- package/src/globals.d.ts +10 -12
- package/src/locale/fr.ts +1 -1
- package/src/mixins/detachable/index.ts +32 -15
- package/src/mixins/intersectable/index.ts +11 -2
- package/src/mixins/overlayable/index.ts +22 -11
- package/src/mixins/routable/__tests__/routable.spec.ts +82 -5
- package/src/mixins/routable/index.ts +10 -3
- package/src/styles/generic/_transitions.scss +219 -215
- package/src/styles/settings/_variables.scss +10 -9
|
@@ -108,20 +108,31 @@ export default Vue.extend().extend({
|
|
|
108
108
|
hasScrollbar(el) {
|
|
109
109
|
if (!el || el.nodeType !== Node.ELEMENT_NODE) return false;
|
|
110
110
|
const style = window.getComputedStyle(el);
|
|
111
|
-
return ['auto', 'scroll'].includes(style.overflowY) && el.scrollHeight > el.clientHeight;
|
|
111
|
+
return (['auto', 'scroll'].includes(style.overflowY) || el.tagName === 'SELECT') && el.scrollHeight > el.clientHeight || ['auto', 'scroll'].includes(style.overflowX) && el.scrollWidth > el.clientWidth;
|
|
112
112
|
},
|
|
113
113
|
|
|
114
|
-
shouldScroll(el,
|
|
114
|
+
shouldScroll(el, e) {
|
|
115
115
|
if (el.hasAttribute('data-app')) return false;
|
|
116
|
-
const
|
|
117
|
-
const
|
|
116
|
+
const dir = e.shiftKey || e.deltaX ? 'x' : 'y';
|
|
117
|
+
const delta = dir === 'y' ? e.deltaY : e.deltaX || e.deltaY;
|
|
118
|
+
let alreadyAtStart;
|
|
119
|
+
let alreadyAtEnd;
|
|
120
|
+
|
|
121
|
+
if (dir === 'y') {
|
|
122
|
+
alreadyAtStart = el.scrollTop === 0;
|
|
123
|
+
alreadyAtEnd = el.scrollTop + el.clientHeight === el.scrollHeight;
|
|
124
|
+
} else {
|
|
125
|
+
alreadyAtStart = el.scrollLeft === 0;
|
|
126
|
+
alreadyAtEnd = el.scrollLeft + el.clientWidth === el.scrollWidth;
|
|
127
|
+
}
|
|
128
|
+
|
|
118
129
|
const scrollingUp = delta < 0;
|
|
119
130
|
const scrollingDown = delta > 0;
|
|
120
|
-
if (!
|
|
121
|
-
if (!
|
|
131
|
+
if (!alreadyAtStart && scrollingUp) return true;
|
|
132
|
+
if (!alreadyAtEnd && scrollingDown) return true;
|
|
122
133
|
|
|
123
|
-
if (
|
|
124
|
-
return this.shouldScroll(el.parentNode,
|
|
134
|
+
if (alreadyAtStart || alreadyAtEnd) {
|
|
135
|
+
return this.shouldScroll(el.parentNode, e);
|
|
125
136
|
}
|
|
126
137
|
|
|
127
138
|
return false;
|
|
@@ -139,7 +150,6 @@ export default Vue.extend().extend({
|
|
|
139
150
|
|
|
140
151
|
checkPath(e) {
|
|
141
152
|
const path = composedPath(e);
|
|
142
|
-
const delta = e.deltaY;
|
|
143
153
|
|
|
144
154
|
if (e.type === 'keydown' && path[0] === document.body) {
|
|
145
155
|
const dialog = this.$refs.dialog; // getSelection returns null in firefox in some edge cases, can be ignored
|
|
@@ -147,7 +157,7 @@ export default Vue.extend().extend({
|
|
|
147
157
|
const selected = window.getSelection().anchorNode;
|
|
148
158
|
|
|
149
159
|
if (dialog && this.hasScrollbar(dialog) && this.isInside(selected, dialog)) {
|
|
150
|
-
return !this.shouldScroll(dialog,
|
|
160
|
+
return !this.shouldScroll(dialog, e);
|
|
151
161
|
}
|
|
152
162
|
|
|
153
163
|
return true;
|
|
@@ -158,7 +168,7 @@ export default Vue.extend().extend({
|
|
|
158
168
|
if (el === document) return true;
|
|
159
169
|
if (el === document.documentElement) return true;
|
|
160
170
|
if (el === this.$refs.content) return true;
|
|
161
|
-
if (this.hasScrollbar(el)) return !this.shouldScroll(el,
|
|
171
|
+
if (this.hasScrollbar(el)) return !this.shouldScroll(el, e);
|
|
162
172
|
}
|
|
163
173
|
|
|
164
174
|
return true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/mixins/overlayable/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Components\nimport VOverlay from '../../components/VOverlay'\n\n// Utilities\nimport {\n keyCodes,\n addOnceEventListener,\n addPassiveEventListener,\n getZIndex,\n composedPath,\n} from '../../util/helpers'\n\n// Types\nimport Vue from 'vue'\n\ninterface Toggleable extends Vue {\n isActive?: boolean\n}\n\ninterface Stackable extends Vue {\n activeZIndex: number\n}\n\ninterface options {\n absolute?: boolean\n $refs: {\n dialog?: HTMLElement\n content?: HTMLElement\n }\n}\n\n/* @vue/component */\nexport default Vue.extend<Vue & Toggleable & Stackable & options>().extend({\n name: 'overlayable',\n\n props: {\n hideOverlay: Boolean,\n overlayColor: String,\n overlayOpacity: [Number, String],\n },\n\n data () {\n return {\n animationFrame: 0,\n overlay: null as InstanceType<typeof VOverlay> | null,\n }\n },\n\n watch: {\n hideOverlay (value) {\n if (!this.isActive) return\n\n if (value) this.removeOverlay()\n else this.genOverlay()\n },\n },\n\n beforeDestroy () {\n this.removeOverlay()\n },\n\n methods: {\n createOverlay () {\n const overlay = new VOverlay({\n propsData: {\n absolute: this.absolute,\n value: false,\n color: this.overlayColor,\n opacity: this.overlayOpacity,\n },\n })\n\n overlay.$mount()\n\n const parent = this.absolute\n ? this.$el.parentNode\n : document.querySelector('[data-app]')\n\n parent && parent.insertBefore(overlay.$el, parent.firstChild)\n\n this.overlay = overlay\n },\n genOverlay () {\n this.hideScroll()\n\n if (this.hideOverlay) return\n\n if (!this.overlay) this.createOverlay()\n\n this.animationFrame = requestAnimationFrame(() => {\n if (!this.overlay) return\n\n if (this.activeZIndex !== undefined) {\n this.overlay.zIndex = String(this.activeZIndex - 1)\n } else if (this.$el) {\n this.overlay.zIndex = getZIndex(this.$el)\n }\n\n this.overlay.value = true\n })\n\n return true\n },\n /** removeOverlay(false) will not restore the scollbar afterwards */\n removeOverlay (showScroll = true) {\n if (this.overlay) {\n addOnceEventListener(this.overlay.$el, 'transitionend', () => {\n if (\n !this.overlay ||\n !this.overlay.$el ||\n !this.overlay.$el.parentNode ||\n this.overlay.value ||\n this.isActive\n ) return\n\n this.overlay.$el.parentNode.removeChild(this.overlay.$el)\n this.overlay.$destroy()\n this.overlay = null\n })\n\n // Cancel animation frame in case\n // overlay is removed before it\n // has finished its animation\n cancelAnimationFrame(this.animationFrame)\n\n this.overlay.value = false\n }\n\n showScroll && this.showScroll()\n },\n scrollListener (e: WheelEvent & KeyboardEvent) {\n if (e.type === 'keydown') {\n if (\n ['INPUT', 'TEXTAREA', 'SELECT'].includes((e.target as Element).tagName) ||\n // https://github.com/vuetifyjs/vuetify/issues/4715\n (e.target as HTMLElement).isContentEditable\n ) return\n\n const up = [keyCodes.up, keyCodes.pageup]\n const down = [keyCodes.down, keyCodes.pagedown]\n\n if (up.includes(e.keyCode)) {\n (e as any).deltaY = -1\n } else if (down.includes(e.keyCode)) {\n (e as any).deltaY = 1\n } else {\n return\n }\n }\n\n if (e.target === this.overlay ||\n (e.type !== 'keydown' && e.target === document.body) ||\n this.checkPath(e)) e.preventDefault()\n },\n hasScrollbar (el?: Element) {\n if (!el || el.nodeType !== Node.ELEMENT_NODE) return false\n\n const style = window.getComputedStyle(el)\n return ['auto', 'scroll'].includes(style.overflowY!) && el.scrollHeight > el.clientHeight\n },\n shouldScroll (el: Element, delta: number): boolean {\n if (el.hasAttribute('data-app')) return false\n\n const alreadyAtTop = el.scrollTop === 0\n const alreadyAtBottom = el.scrollTop + el.clientHeight === el.scrollHeight\n const scrollingUp = delta < 0\n const scrollingDown = delta > 0\n\n if (!alreadyAtTop && scrollingUp) return true\n if (!alreadyAtBottom && scrollingDown) return true\n if ((alreadyAtTop || alreadyAtBottom)) {\n return this.shouldScroll(el.parentNode as Element, delta)\n }\n\n return false\n },\n isInside (el: Element, parent: Element): boolean {\n if (el === parent) {\n return true\n } else if (el === null || el === document.body) {\n return false\n } else {\n return this.isInside(el.parentNode as Element, parent)\n }\n },\n checkPath (e: WheelEvent) {\n const path = composedPath(e)\n const delta = e.deltaY\n\n if (e.type === 'keydown' && path[0] === document.body) {\n const dialog = this.$refs.dialog\n // getSelection returns null in firefox in some edge cases, can be ignored\n const selected = window.getSelection()!.anchorNode as Element\n if (dialog && this.hasScrollbar(dialog) && this.isInside(selected, dialog)) {\n return !this.shouldScroll(dialog, delta)\n }\n return true\n }\n\n for (let index = 0; index < path.length; index++) {\n const el = path[index]\n\n if (el === document) return true\n if (el === document.documentElement) return true\n if (el === this.$refs.content) return true\n\n if (this.hasScrollbar(el as Element)) return !this.shouldScroll(el as Element, delta)\n }\n\n return true\n },\n hideScroll () {\n if (this.$vuetify.breakpoint.smAndDown) {\n document.documentElement!.classList.add('overflow-y-hidden')\n } else {\n addPassiveEventListener(window, 'wheel', this.scrollListener as EventHandlerNonNull, { passive: false })\n window.addEventListener('keydown', this.scrollListener as EventHandlerNonNull)\n }\n },\n showScroll () {\n document.documentElement!.classList.remove('overflow-y-hidden')\n window.removeEventListener('wheel', this.scrollListener as EventHandlerNonNull)\n window.removeEventListener('keydown', this.scrollListener as EventHandlerNonNull)\n },\n },\n})\n"],"sourceRoot":"","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/mixins/overlayable/index.ts"],"names":[],"mappings":"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","sourcesContent":["// Components\nimport VOverlay from '../../components/VOverlay'\n\n// Utilities\nimport {\n keyCodes,\n addOnceEventListener,\n addPassiveEventListener,\n getZIndex,\n composedPath,\n} from '../../util/helpers'\n\n// Types\nimport Vue from 'vue'\n\ninterface Toggleable extends Vue {\n isActive?: boolean\n}\n\ninterface Stackable extends Vue {\n activeZIndex: number\n}\n\ninterface options {\n absolute?: boolean\n $refs: {\n dialog?: HTMLElement\n content?: HTMLElement\n }\n}\n\n/* @vue/component */\nexport default Vue.extend<Vue & Toggleable & Stackable & options>().extend({\n name: 'overlayable',\n\n props: {\n hideOverlay: Boolean,\n overlayColor: String,\n overlayOpacity: [Number, String],\n },\n\n data () {\n return {\n animationFrame: 0,\n overlay: null as InstanceType<typeof VOverlay> | null,\n }\n },\n\n watch: {\n hideOverlay (value) {\n if (!this.isActive) return\n\n if (value) this.removeOverlay()\n else this.genOverlay()\n },\n },\n\n beforeDestroy () {\n this.removeOverlay()\n },\n\n methods: {\n createOverlay () {\n const overlay = new VOverlay({\n propsData: {\n absolute: this.absolute,\n value: false,\n color: this.overlayColor,\n opacity: this.overlayOpacity,\n },\n })\n\n overlay.$mount()\n\n const parent = this.absolute\n ? this.$el.parentNode\n : document.querySelector('[data-app]')\n\n parent && parent.insertBefore(overlay.$el, parent.firstChild)\n\n this.overlay = overlay\n },\n genOverlay () {\n this.hideScroll()\n\n if (this.hideOverlay) return\n\n if (!this.overlay) this.createOverlay()\n\n this.animationFrame = requestAnimationFrame(() => {\n if (!this.overlay) return\n\n if (this.activeZIndex !== undefined) {\n this.overlay.zIndex = String(this.activeZIndex - 1)\n } else if (this.$el) {\n this.overlay.zIndex = getZIndex(this.$el)\n }\n\n this.overlay.value = true\n })\n\n return true\n },\n /** removeOverlay(false) will not restore the scollbar afterwards */\n removeOverlay (showScroll = true) {\n if (this.overlay) {\n addOnceEventListener(this.overlay.$el, 'transitionend', () => {\n if (\n !this.overlay ||\n !this.overlay.$el ||\n !this.overlay.$el.parentNode ||\n this.overlay.value ||\n this.isActive\n ) return\n\n this.overlay.$el.parentNode.removeChild(this.overlay.$el)\n this.overlay.$destroy()\n this.overlay = null\n })\n\n // Cancel animation frame in case\n // overlay is removed before it\n // has finished its animation\n cancelAnimationFrame(this.animationFrame)\n\n this.overlay.value = false\n }\n\n showScroll && this.showScroll()\n },\n scrollListener (e: WheelEvent & KeyboardEvent) {\n if (e.type === 'keydown') {\n if (\n ['INPUT', 'TEXTAREA', 'SELECT'].includes((e.target as Element).tagName) ||\n // https://github.com/vuetifyjs/vuetify/issues/4715\n (e.target as HTMLElement).isContentEditable\n ) return\n\n const up = [keyCodes.up, keyCodes.pageup]\n const down = [keyCodes.down, keyCodes.pagedown]\n\n if (up.includes(e.keyCode)) {\n (e as any).deltaY = -1\n } else if (down.includes(e.keyCode)) {\n (e as any).deltaY = 1\n } else {\n return\n }\n }\n\n if (e.target === this.overlay ||\n (e.type !== 'keydown' && e.target === document.body) ||\n this.checkPath(e)) e.preventDefault()\n },\n hasScrollbar (el?: Element) {\n if (!el || el.nodeType !== Node.ELEMENT_NODE) return false\n\n const style = window.getComputedStyle(el)\n return ((['auto', 'scroll'].includes(style.overflowY!) || el.tagName === 'SELECT') && el.scrollHeight > el.clientHeight) ||\n ((['auto', 'scroll'].includes(style.overflowX!)) && el.scrollWidth > el.clientWidth)\n },\n shouldScroll (el: Element, e: WheelEvent): boolean {\n if (el.hasAttribute('data-app')) return false\n\n const dir = e.shiftKey || e.deltaX ? 'x' : 'y'\n const delta = dir === 'y' ? e.deltaY : e.deltaX || e.deltaY\n\n let alreadyAtStart: boolean\n let alreadyAtEnd: boolean\n if (dir === 'y') {\n alreadyAtStart = el.scrollTop === 0\n alreadyAtEnd = el.scrollTop + el.clientHeight === el.scrollHeight\n } else {\n alreadyAtStart = el.scrollLeft === 0\n alreadyAtEnd = el.scrollLeft + el.clientWidth === el.scrollWidth\n }\n\n const scrollingUp = delta < 0\n const scrollingDown = delta > 0\n\n if (!alreadyAtStart && scrollingUp) return true\n if (!alreadyAtEnd && scrollingDown) return true\n if ((alreadyAtStart || alreadyAtEnd)) {\n return this.shouldScroll(el.parentNode as Element, e)\n }\n\n return false\n },\n isInside (el: Element, parent: Element): boolean {\n if (el === parent) {\n return true\n } else if (el === null || el === document.body) {\n return false\n } else {\n return this.isInside(el.parentNode as Element, parent)\n }\n },\n checkPath (e: WheelEvent) {\n const path = composedPath(e)\n\n if (e.type === 'keydown' && path[0] === document.body) {\n const dialog = this.$refs.dialog\n // getSelection returns null in firefox in some edge cases, can be ignored\n const selected = window.getSelection()!.anchorNode as Element\n if (dialog && this.hasScrollbar(dialog) && this.isInside(selected, dialog)) {\n return !this.shouldScroll(dialog, e)\n }\n return true\n }\n\n for (let index = 0; index < path.length; index++) {\n const el = path[index]\n\n if (el === document) return true\n if (el === document.documentElement) return true\n if (el === this.$refs.content) return true\n\n if (this.hasScrollbar(el as Element)) return !this.shouldScroll(el as Element, e)\n }\n\n return true\n },\n hideScroll () {\n if (this.$vuetify.breakpoint.smAndDown) {\n document.documentElement!.classList.add('overflow-y-hidden')\n } else {\n addPassiveEventListener(window, 'wheel', this.scrollListener as EventHandlerNonNull, { passive: false })\n window.addEventListener('keydown', this.scrollListener as EventHandlerNonNull)\n }\n },\n showScroll () {\n document.documentElement!.classList.remove('overflow-y-hidden')\n window.removeEventListener('wheel', this.scrollListener as EventHandlerNonNull)\n window.removeEventListener('keydown', this.scrollListener as EventHandlerNonNull)\n },\n },\n})\n"],"sourceRoot":"","file":"index.js"}
|
|
@@ -63,6 +63,11 @@ export default Vue.extend({
|
|
|
63
63
|
watch: {
|
|
64
64
|
$route: 'onRouteChange'
|
|
65
65
|
},
|
|
66
|
+
|
|
67
|
+
mounted() {
|
|
68
|
+
this.onRouteChange();
|
|
69
|
+
},
|
|
70
|
+
|
|
66
71
|
methods: {
|
|
67
72
|
click(e) {
|
|
68
73
|
this.$emit('click', e);
|
|
@@ -128,16 +133,20 @@ export default Vue.extend({
|
|
|
128
133
|
onRouteChange() {
|
|
129
134
|
if (!this.to || !this.$refs.link || !this.$route) return;
|
|
130
135
|
const activeClass = `${this.activeClass} ${this.proxyClass || ''}`.trim();
|
|
131
|
-
const
|
|
136
|
+
const exactActiveClass = `${this.exactActiveClass} ${this.proxyClass || ''}`.trim() || activeClass;
|
|
137
|
+
const path = '_vnode.data.class.' + (this.exact ? exactActiveClass : activeClass);
|
|
132
138
|
this.$nextTick(() => {
|
|
133
139
|
/* istanbul ignore else */
|
|
134
|
-
if (getObjectValueByPath(this.$refs.link, path)) {
|
|
140
|
+
if (!getObjectValueByPath(this.$refs.link, path) === this.isActive) {
|
|
135
141
|
this.toggle();
|
|
136
142
|
}
|
|
137
143
|
});
|
|
138
144
|
},
|
|
139
145
|
|
|
140
|
-
toggle
|
|
146
|
+
toggle() {
|
|
147
|
+
this.isActive = !this.isActive;
|
|
148
|
+
}
|
|
149
|
+
|
|
141
150
|
}
|
|
142
151
|
});
|
|
143
152
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/mixins/routable/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAP,MAAyC,KAAzC,C,CAEA;;AACA,OAAO,MAAP,MAAsC,yBAAtC,C,CAEA;;AACA,SAAS,oBAAT,QAAqC,oBAArC;AAEA,eAAe,GAAG,CAAC,MAAJ,CAAW;AACxB,EAAA,IAAI,EAAE,UADkB;AAGxB,EAAA,UAAU,EAAE;AACV,IAAA;AADU,GAHY;AAOxB,EAAA,KAAK,EAAE;AACL,IAAA,WAAW,EAAE,MADR;AAEL,IAAA,MAAM,EAAE,OAFH;AAGL,IAAA,QAAQ,EAAE,OAHL;AAIL,IAAA,KAAK,EAAE;AACL,MAAA,IAAI,EAAE,OADD;AAEL,MAAA,OAAO,EAAE;AAFJ,KAJF;AAQL,IAAA,SAAS,EAAE,OARN;AASL,IAAA,gBAAgB,EAAE,MATb;AAUL,IAAA,IAAI,EAAE,OAVD;AAWL,IAAA,IAAI,EAAE,CAAC,MAAD,EAAS,MAAT,CAXD;AAYL,IAAA,EAAE,EAAE,CAAC,MAAD,EAAS,MAAT,CAZC;AAaL,IAAA,IAAI,EAAE,OAbD;AAcL,IAAA,OAAO,EAAE,OAdJ;AAeL,IAAA,MAAM,EAAE;AACN,MAAA,IAAI,EAAE,CAAC,OAAD,EAAU,MAAV,CADA;AAEN,MAAA,OAAO,EAAE;AAFH,KAfH;AAmBL,IAAA,GAAG,EAAE,MAnBA;AAoBL,IAAA,MAAM,EAAE;AApBH,GAPiB;AA8BxB,EAAA,IAAI,EAAE,OAAO;AACX,IAAA,QAAQ,EAAE,KADC;AAEX,IAAA,UAAU,EAAE;AAFD,GAAP,CA9BkB;AAmCxB,EAAA,QAAQ,EAAE;AACR,IAAA,OAAO,GAAA;AACL,YAAM,OAAO,GAA4B,EAAzC;AAEA,UAAI,KAAK,EAAT,EAAa,OAAO,OAAP;AAEb,UAAI,KAAK,WAAT,EAAsB,OAAO,CAAC,KAAK,WAAN,CAAP,GAA4B,KAAK,QAAjC;AACtB,UAAI,KAAK,UAAT,EAAqB,OAAO,CAAC,KAAK,UAAN,CAAP,GAA2B,KAAK,QAAhC;AAErB,aAAO,OAAP;AACD,KAVO;;AAWR,IAAA,cAAc,GAAA;AAAA;;AACZ,6BAAO,KAAK,MAAZ,2BAAuB,CAAC,KAAK,QAAN,IAAkB,KAAK,WAA9C;AACD,KAbO;;AAcR,IAAA,WAAW,GAAA;AACT,UAAI,KAAK,QAAT,EAAmB,OAAO,KAAP;AAEnB,aAAO,OAAO,CACZ,KAAK,MAAL,IACA,KAAK,UAAL,CAAgB,KADhB,IAEA,KAAK,UAAL,CAAgB,QAAhB,CAFA,IAGA,KAAK,MAAL,CAAY,QAJA,CAAd;AAMD,KAvBO;;AAwBR,IAAA,MAAM,GAAA;AACJ,aAAO,KAAK,EAAL,IAAW,KAAK,IAAhB,IAAwB,KAAK,IAApC;AACD,KA1BO;;AA2BR,IAAA,MAAM,EAAE,OAAO,EAAP;AA3BA,GAnCc;AAiExB,EAAA,KAAK,EAAE;AACL,IAAA,MAAM,EAAE;AADH,GAjEiB
|
|
1
|
+
{"version":3,"sources":["../../../src/mixins/routable/index.ts"],"names":[],"mappings":"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","sourcesContent":["import Vue, { VNodeData, PropType } from 'vue'\n\n// Directives\nimport Ripple, { RippleOptions } from '../../directives/ripple'\n\n// Utilities\nimport { getObjectValueByPath } from '../../util/helpers'\n\nexport default Vue.extend({\n name: 'routable',\n\n directives: {\n Ripple,\n },\n\n props: {\n activeClass: String,\n append: Boolean,\n disabled: Boolean,\n exact: {\n type: Boolean as PropType<boolean | undefined>,\n default: undefined,\n },\n exactPath: Boolean,\n exactActiveClass: String,\n link: Boolean,\n href: [String, Object],\n to: [String, Object],\n nuxt: Boolean,\n replace: Boolean,\n ripple: {\n type: [Boolean, Object],\n default: null,\n },\n tag: String,\n target: String,\n },\n\n data: () => ({\n isActive: false,\n proxyClass: '',\n }),\n\n computed: {\n classes (): object {\n const classes: Record<string, boolean> = {}\n\n if (this.to) return classes\n\n if (this.activeClass) classes[this.activeClass] = this.isActive\n if (this.proxyClass) classes[this.proxyClass] = this.isActive\n\n return classes\n },\n computedRipple (): RippleOptions | boolean {\n return this.ripple ?? (!this.disabled && this.isClickable)\n },\n isClickable (): boolean {\n if (this.disabled) return false\n\n return Boolean(\n this.isLink ||\n this.$listeners.click ||\n this.$listeners['!click'] ||\n this.$attrs.tabindex\n )\n },\n isLink (): boolean {\n return this.to || this.href || this.link\n },\n styles: () => ({}),\n },\n\n watch: {\n $route: 'onRouteChange',\n },\n\n mounted () {\n this.onRouteChange()\n },\n\n methods: {\n click (e: MouseEvent): void {\n this.$emit('click', e)\n },\n generateRouteLink () {\n let exact = this.exact\n let tag\n\n const data: VNodeData = {\n attrs: {\n tabindex: 'tabindex' in this.$attrs ? this.$attrs.tabindex : undefined,\n },\n class: this.classes,\n style: this.styles,\n props: {},\n directives: [{\n name: 'ripple',\n value: this.computedRipple,\n }],\n [this.to ? 'nativeOn' : 'on']: {\n ...this.$listeners,\n click: this.click,\n },\n ref: 'link',\n }\n\n if (typeof this.exact === 'undefined') {\n exact = this.to === '/' ||\n (this.to === Object(this.to) && this.to.path === '/')\n }\n\n if (this.to) {\n // Add a special activeClass hook\n // for component level styles\n let activeClass = this.activeClass\n let exactActiveClass = this.exactActiveClass || activeClass\n\n if (this.proxyClass) {\n activeClass = `${activeClass} ${this.proxyClass}`.trim()\n exactActiveClass = `${exactActiveClass} ${this.proxyClass}`.trim()\n }\n\n tag = this.nuxt ? 'nuxt-link' : 'router-link'\n Object.assign(data.props, {\n to: this.to,\n exact,\n exactPath: this.exactPath,\n activeClass,\n exactActiveClass,\n append: this.append,\n replace: this.replace,\n })\n } else {\n tag = (this.href && 'a') || this.tag || 'div'\n\n if (tag === 'a' && this.href) data.attrs!.href = this.href\n }\n\n if (this.target) data.attrs!.target = this.target\n\n return { tag, data }\n },\n onRouteChange () {\n if (!this.to || !this.$refs.link || !this.$route) return\n const activeClass = `${this.activeClass} ${this.proxyClass || ''}`.trim()\n const exactActiveClass = `${this.exactActiveClass} ${this.proxyClass || ''}`.trim() || activeClass\n\n const path = '_vnode.data.class.' + (this.exact ? exactActiveClass : activeClass)\n\n this.$nextTick(() => {\n /* istanbul ignore else */\n if (!getObjectValueByPath(this.$refs.link, path) === this.isActive) {\n this.toggle()\n }\n })\n },\n toggle () {\n this.isActive = !this.isActive\n },\n },\n})\n"],"sourceRoot":"","file":"index.js"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vuetify",
|
|
3
3
|
"description": "Vue Material Component Framework",
|
|
4
|
-
"version": "2.6.0
|
|
4
|
+
"version": "2.6.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "John Leider",
|
|
7
7
|
"email": "john@vuetifyjs.com"
|
|
@@ -112,5 +112,5 @@
|
|
|
112
112
|
"attributes": "dist/json/attributes.json"
|
|
113
113
|
},
|
|
114
114
|
"web-types": "dist/json/web-types.json",
|
|
115
|
-
"gitHead": "
|
|
115
|
+
"gitHead": "b786cdd1bbe74c7daca08af7adc37cfc15827b1b"
|
|
116
116
|
}
|
|
@@ -217,7 +217,16 @@ export default VSelect.extend({
|
|
|
217
217
|
// for duplicate items? no idea
|
|
218
218
|
if (val === oldVal) return
|
|
219
219
|
|
|
220
|
-
this.
|
|
220
|
+
if (!this.autoSelectFirst) {
|
|
221
|
+
const preSelectedItem = oldVal[this.$refs.menu.listIndex]
|
|
222
|
+
|
|
223
|
+
if (preSelectedItem) {
|
|
224
|
+
this.setMenuIndex(val.findIndex(i => i === preSelectedItem))
|
|
225
|
+
} else {
|
|
226
|
+
this.setMenuIndex(-1)
|
|
227
|
+
}
|
|
228
|
+
this.$emit('update:list-index', this.$refs.menu.listIndex)
|
|
229
|
+
}
|
|
221
230
|
|
|
222
231
|
this.$nextTick(() => {
|
|
223
232
|
if (
|
|
@@ -227,7 +236,11 @@ export default VSelect.extend({
|
|
|
227
236
|
) return
|
|
228
237
|
|
|
229
238
|
this.$refs.menu.getTiles()
|
|
230
|
-
|
|
239
|
+
|
|
240
|
+
if (this.autoSelectFirst && val.length) {
|
|
241
|
+
this.setMenuIndex(0)
|
|
242
|
+
this.$emit('update:list-index', this.$refs.menu.listIndex)
|
|
243
|
+
}
|
|
231
244
|
})
|
|
232
245
|
},
|
|
233
246
|
onInternalSearchChanged () {
|
|
@@ -167,18 +167,21 @@ export default CalendarWithIntervals.extend({
|
|
|
167
167
|
key: day.date,
|
|
168
168
|
staticClass: 'v-calendar-daily__day',
|
|
169
169
|
class: this.getRelativeClasses(day),
|
|
170
|
+
on: this.getDefaultMouseEventHandlers(':time', e => {
|
|
171
|
+
return this.getSlotScope(this.getTimestampAtEvent(e, day))
|
|
172
|
+
}),
|
|
170
173
|
}, [
|
|
171
|
-
...this.genDayIntervals(index
|
|
174
|
+
...this.genDayIntervals(index),
|
|
172
175
|
...this.genDayBody(day),
|
|
173
176
|
])
|
|
174
177
|
},
|
|
175
178
|
genDayBody (day: CalendarTimestamp): VNode[] {
|
|
176
179
|
return getSlot(this, 'day-body', () => this.getSlotScope(day)) || []
|
|
177
180
|
},
|
|
178
|
-
genDayIntervals (index: number
|
|
179
|
-
return this.intervals[index].map(
|
|
181
|
+
genDayIntervals (index: number): VNode[] {
|
|
182
|
+
return this.intervals[index].map(this.genDayInterval)
|
|
180
183
|
},
|
|
181
|
-
genDayInterval (interval: CalendarTimestamp
|
|
184
|
+
genDayInterval (interval: CalendarTimestamp): VNode {
|
|
182
185
|
const height: string | undefined = convertToUnit(this.intervalHeight)
|
|
183
186
|
const styler = this.intervalStyle || this.intervalStyleDefault
|
|
184
187
|
|
|
@@ -189,9 +192,6 @@ export default CalendarWithIntervals.extend({
|
|
|
189
192
|
height,
|
|
190
193
|
...styler(interval),
|
|
191
194
|
},
|
|
192
|
-
on: this.getDefaultMouseEventHandlers(':time', e => {
|
|
193
|
-
return this.getSlotScope(this.getTimestampAtEvent(e, day))
|
|
194
|
-
}),
|
|
195
195
|
}
|
|
196
196
|
|
|
197
197
|
const children = getSlot(this, 'interval', () => this.getSlotScope(interval))
|
|
@@ -45,7 +45,6 @@
|
|
|
45
45
|
|
|
46
46
|
.v-event-timed
|
|
47
47
|
position: absolute
|
|
48
|
-
overflow: hidden
|
|
49
48
|
white-space: nowrap
|
|
50
49
|
text-overflow: ellipsis
|
|
51
50
|
font-size: $calendar-event-font-size
|
|
@@ -53,6 +52,13 @@
|
|
|
53
52
|
border-radius: $calendar-event-border-radius
|
|
54
53
|
pointer-events: all
|
|
55
54
|
|
|
55
|
+
.v-event-summary
|
|
56
|
+
display: inline-block
|
|
57
|
+
overflow: hidden
|
|
58
|
+
text-overflow: ellipsis
|
|
59
|
+
width: 100%
|
|
60
|
+
white-space: nowrap
|
|
61
|
+
|
|
56
62
|
&.v-calendar-events
|
|
57
63
|
.v-calendar-weekly__head-weekday
|
|
58
64
|
margin-right: -$calendar-line-width
|
|
@@ -302,17 +302,17 @@ export default CalendarBase.extend({
|
|
|
302
302
|
const timeSummary = () => formatTime(event.start, overlapsNoon) + ' - ' + formatTime(event.end, true)
|
|
303
303
|
const eventSummary = () => {
|
|
304
304
|
const name = this.eventNameFunction(event, timedEvent)
|
|
305
|
-
|
|
306
305
|
if (event.start.hasTime) {
|
|
306
|
+
const eventSummaryClass = 'v-event-summary'
|
|
307
307
|
if (timedEvent) {
|
|
308
308
|
const time = timeSummary()
|
|
309
309
|
const delimiter = singline ? ', ' : '<br>'
|
|
310
310
|
|
|
311
|
-
return `<strong>${name}</strong>${delimiter}${time}
|
|
311
|
+
return `<span class="${eventSummaryClass}"><strong>${name}</strong>${delimiter}${time}</span>`
|
|
312
312
|
} else {
|
|
313
313
|
const time = formatTime(event.start, true)
|
|
314
314
|
|
|
315
|
-
return `<strong>${time}</strong> ${name}
|
|
315
|
+
return `<span class="${eventSummaryClass}"><strong>${time}</strong> ${name}</span>`
|
|
316
316
|
}
|
|
317
317
|
}
|
|
318
318
|
|
|
@@ -64,7 +64,7 @@ export default Vue.extend({
|
|
|
64
64
|
// Even if touch point has since moved outside the interactive area of that element
|
|
65
65
|
// Ref: https://developer.mozilla.org/en-US/docs/Web/API/Touch/target
|
|
66
66
|
// This block of code aims to make sure touchEvent is always dispatched from the element that is being pointed at
|
|
67
|
-
if (e
|
|
67
|
+
if (e && 'touches' in e) {
|
|
68
68
|
const currentTarget = document.elementFromPoint(e.changedTouches[0].clientX, e.changedTouches[0].clientY)
|
|
69
69
|
|
|
70
70
|
if (currentTarget &&
|
|
@@ -108,11 +108,6 @@ export default VAutocomplete.extend({
|
|
|
108
108
|
|
|
109
109
|
this.$nextTick(this.updateSelf)
|
|
110
110
|
},
|
|
111
|
-
onFilteredItemsChanged (val: never[], oldVal: never[]) {
|
|
112
|
-
if (!this.autoSelectFirst) return
|
|
113
|
-
|
|
114
|
-
VAutocomplete.options.methods.onFilteredItemsChanged.call(this, val, oldVal)
|
|
115
|
-
},
|
|
116
111
|
onKeyDown (e: KeyboardEvent) {
|
|
117
112
|
const keyCode = e.keyCode
|
|
118
113
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable max-statements */
|
|
1
2
|
// Components
|
|
2
3
|
import VCombobox from '../VCombobox'
|
|
3
4
|
|
|
@@ -578,4 +579,116 @@ describe('VCombobox.ts', () => {
|
|
|
578
579
|
|
|
579
580
|
expect(change).toHaveBeenLastCalledWith(['bar', 'foo'])
|
|
580
581
|
})
|
|
582
|
+
|
|
583
|
+
// example 1 in https://github.com/vuetifyjs/vuetify/issues/14194
|
|
584
|
+
it('should not point to a result that does not exist as in example 1', async () => {
|
|
585
|
+
const { wrapper } = createMultipleCombobox({
|
|
586
|
+
items: ['a', 'aa', 'aaa', 'bar'],
|
|
587
|
+
})
|
|
588
|
+
|
|
589
|
+
const input = wrapper.find('input')
|
|
590
|
+
const element = input.element as HTMLInputElement
|
|
591
|
+
|
|
592
|
+
const listIndexUpdate = jest.fn()
|
|
593
|
+
wrapper.vm.$on('update:list-index', listIndexUpdate)
|
|
594
|
+
|
|
595
|
+
input.trigger('focus')
|
|
596
|
+
await wrapper.vm.$nextTick()
|
|
597
|
+
element.value = 'a'
|
|
598
|
+
input.trigger('input')
|
|
599
|
+
await wrapper.vm.$nextTick()
|
|
600
|
+
|
|
601
|
+
input.trigger('keydown.down')
|
|
602
|
+
await wrapper.vm.$nextTick()
|
|
603
|
+
|
|
604
|
+
input.trigger('keydown.down')
|
|
605
|
+
await wrapper.vm.$nextTick()
|
|
606
|
+
|
|
607
|
+
input.trigger('keydown.down')
|
|
608
|
+
await wrapper.vm.$nextTick()
|
|
609
|
+
|
|
610
|
+
input.trigger('keydown.down')
|
|
611
|
+
await wrapper.vm.$nextTick()
|
|
612
|
+
|
|
613
|
+
element.value = 'aa'
|
|
614
|
+
input.trigger('input')
|
|
615
|
+
await wrapper.vm.$nextTick()
|
|
616
|
+
expect(listIndexUpdate.mock.calls.length === 6).toBe(true)
|
|
617
|
+
expect(listIndexUpdate.mock.calls[0][0]).toBe(-1)
|
|
618
|
+
expect(listIndexUpdate.mock.calls[1][0]).toBe(0)
|
|
619
|
+
expect(listIndexUpdate.mock.calls[2][0]).toBe(1)
|
|
620
|
+
expect(listIndexUpdate.mock.calls[3][0]).toBe(2)
|
|
621
|
+
expect(listIndexUpdate.mock.calls[4][0]).toBe(3)
|
|
622
|
+
expect(listIndexUpdate.mock.calls[5][0]).toBe(-1)
|
|
623
|
+
})
|
|
624
|
+
|
|
625
|
+
// example 2 in https://github.com/vuetifyjs/vuetify/issues/14194
|
|
626
|
+
it('should not change selection on search input as in example 2', async () => {
|
|
627
|
+
const { wrapper } = createMultipleCombobox({
|
|
628
|
+
items: ['a', 'aa', 'aaa', 'bar'],
|
|
629
|
+
})
|
|
630
|
+
|
|
631
|
+
const input = wrapper.find('input')
|
|
632
|
+
const element = input.element as HTMLInputElement
|
|
633
|
+
|
|
634
|
+
const listIndexUpdate = jest.fn()
|
|
635
|
+
wrapper.vm.$on('update:list-index', listIndexUpdate)
|
|
636
|
+
|
|
637
|
+
input.trigger('focus')
|
|
638
|
+
await wrapper.vm.$nextTick()
|
|
639
|
+
element.value = 'a'
|
|
640
|
+
input.trigger('input')
|
|
641
|
+
await wrapper.vm.$nextTick()
|
|
642
|
+
|
|
643
|
+
input.trigger('keydown.down')
|
|
644
|
+
await wrapper.vm.$nextTick()
|
|
645
|
+
|
|
646
|
+
input.trigger('keydown.down')
|
|
647
|
+
await wrapper.vm.$nextTick()
|
|
648
|
+
|
|
649
|
+
input.trigger('keydown.down')
|
|
650
|
+
await wrapper.vm.$nextTick()
|
|
651
|
+
|
|
652
|
+
element.value = 'aa'
|
|
653
|
+
input.trigger('input')
|
|
654
|
+
await wrapper.vm.$nextTick()
|
|
655
|
+
|
|
656
|
+
expect(listIndexUpdate.mock.calls.length === 5).toBe(true)
|
|
657
|
+
expect(listIndexUpdate.mock.calls[0][0]).toBe(-1)
|
|
658
|
+
expect(listIndexUpdate.mock.calls[1][0]).toBe(0)
|
|
659
|
+
expect(listIndexUpdate.mock.calls[2][0]).toBe(1)
|
|
660
|
+
expect(listIndexUpdate.mock.calls[3][0]).toBe(2)
|
|
661
|
+
expect(listIndexUpdate.mock.calls[4][0]).toBe(1)
|
|
662
|
+
})
|
|
663
|
+
|
|
664
|
+
// example 3 in https://github.com/vuetifyjs/vuetify/issues/14194
|
|
665
|
+
it('should not point to a result that does not exist as in example 3', async () => {
|
|
666
|
+
const { wrapper } = createMultipleCombobox({
|
|
667
|
+
items: ['a', 'aa', 'aaa', 'bar'],
|
|
668
|
+
})
|
|
669
|
+
|
|
670
|
+
const input = wrapper.find('input')
|
|
671
|
+
const element = input.element as HTMLInputElement
|
|
672
|
+
|
|
673
|
+
const listIndexUpdate = jest.fn()
|
|
674
|
+
wrapper.vm.$on('update:list-index', listIndexUpdate)
|
|
675
|
+
|
|
676
|
+
input.trigger('focus')
|
|
677
|
+
await wrapper.vm.$nextTick()
|
|
678
|
+
element.value = 'a'
|
|
679
|
+
input.trigger('input')
|
|
680
|
+
await wrapper.vm.$nextTick()
|
|
681
|
+
|
|
682
|
+
input.trigger('keydown.down')
|
|
683
|
+
await wrapper.vm.$nextTick()
|
|
684
|
+
|
|
685
|
+
element.value = 'aaaa'
|
|
686
|
+
input.trigger('input')
|
|
687
|
+
await wrapper.vm.$nextTick()
|
|
688
|
+
|
|
689
|
+
expect(listIndexUpdate.mock.calls.length === 3).toBe(true)
|
|
690
|
+
expect(listIndexUpdate.mock.calls[0][0]).toBe(-1)
|
|
691
|
+
expect(listIndexUpdate.mock.calls[1][0]).toBe(0)
|
|
692
|
+
expect(listIndexUpdate.mock.calls[2][0]).toBe(-1)
|
|
693
|
+
})
|
|
581
694
|
})
|
|
@@ -321,4 +321,34 @@ describe('VCombobox.ts', () => {
|
|
|
321
321
|
|
|
322
322
|
expect(wrapper.vm.$attrs.autocomplete).toBe('on')
|
|
323
323
|
})
|
|
324
|
+
|
|
325
|
+
// https://github.com/vuetifyjs/vuetify/issues/6607
|
|
326
|
+
it('should select first row when autoSelectFirst true is applied', async () => {
|
|
327
|
+
const wrapper = mountFunction({
|
|
328
|
+
propsData: {
|
|
329
|
+
autoSelectFirst: true,
|
|
330
|
+
items: [
|
|
331
|
+
{ text: 'Learn JavaScript', done: false },
|
|
332
|
+
{ text: 'Learn Vue', done: false },
|
|
333
|
+
{ text: 'Play around in JSFiddle', done: true },
|
|
334
|
+
{ text: 'Build something awesome', done: true },
|
|
335
|
+
],
|
|
336
|
+
},
|
|
337
|
+
})
|
|
338
|
+
|
|
339
|
+
const input = wrapper.find('input')
|
|
340
|
+
const element = input.element as HTMLInputElement
|
|
341
|
+
|
|
342
|
+
const listIndexUpdate = jest.fn()
|
|
343
|
+
wrapper.vm.$on('update:list-index', listIndexUpdate)
|
|
344
|
+
|
|
345
|
+
input.trigger('focus')
|
|
346
|
+
await wrapper.vm.$nextTick()
|
|
347
|
+
element.value = 'L'
|
|
348
|
+
input.trigger('input')
|
|
349
|
+
await wrapper.vm.$nextTick()
|
|
350
|
+
|
|
351
|
+
expect(listIndexUpdate.mock.calls.length === 1).toBe(true)
|
|
352
|
+
expect(listIndexUpdate.mock.calls[0][0]).toBe(0)
|
|
353
|
+
})
|
|
324
354
|
})
|
|
@@ -187,8 +187,10 @@ export default baseMixins.extend({
|
|
|
187
187
|
// Double nextTick to wait for lazy content to be generated
|
|
188
188
|
this.$nextTick(() => {
|
|
189
189
|
this.$nextTick(() => {
|
|
190
|
-
this.
|
|
191
|
-
|
|
190
|
+
if (!this.$refs.content.contains(document.activeElement)) {
|
|
191
|
+
this.previousActiveElement = document.activeElement as HTMLElement
|
|
192
|
+
this.$refs.content.focus()
|
|
193
|
+
}
|
|
192
194
|
this.bind()
|
|
193
195
|
})
|
|
194
196
|
})
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
color: map-deep-get($material, 'text', 'disabled')
|
|
7
7
|
|
|
8
8
|
&:not(.v-list-item--active):not(.v-list-item--disabled)
|
|
9
|
-
color: map-deep-get($material, 'text', 'primary')
|
|
9
|
+
color: map-deep-get($material, 'text', 'primary')
|
|
10
10
|
|
|
11
11
|
.v-list-item__mask
|
|
12
12
|
color: map-deep-get($material, 'text', 'disabled')
|
|
@@ -265,3 +265,4 @@
|
|
|
265
265
|
-webkit-line-clamp: 2
|
|
266
266
|
-webkit-box-orient: vertical
|
|
267
267
|
display: -webkit-box
|
|
268
|
+
|
|
@@ -150,6 +150,12 @@ export default baseMixins.extend<options>().extend({
|
|
|
150
150
|
|
|
151
151
|
return attrs
|
|
152
152
|
},
|
|
153
|
+
toggle () {
|
|
154
|
+
if (this.to && this.inputValue === undefined) {
|
|
155
|
+
this.isActive = !this.isActive
|
|
156
|
+
}
|
|
157
|
+
this.$emit('change')
|
|
158
|
+
},
|
|
153
159
|
},
|
|
154
160
|
|
|
155
161
|
render (h): VNode {
|
|
@@ -182,6 +188,6 @@ export default baseMixins.extend<options>().extend({
|
|
|
182
188
|
})
|
|
183
189
|
: this.$slots.default
|
|
184
190
|
|
|
185
|
-
return h(tag, this.setTextColor(this.color, data), children)
|
|
191
|
+
return h(tag, this.isActive ? this.setTextColor(this.color, data) : data, children)
|
|
186
192
|
},
|
|
187
193
|
})
|
|
@@ -218,4 +218,20 @@ describe('VListItem.ts', () => {
|
|
|
218
218
|
})
|
|
219
219
|
expect(wrapper5.element.getAttribute('role')).toBe('listitem')
|
|
220
220
|
})
|
|
221
|
+
|
|
222
|
+
it('should not have an internal state unless its a router-link', async () => {
|
|
223
|
+
const wrapper = mountFunction({})
|
|
224
|
+
|
|
225
|
+
expect(wrapper.vm.isActive).toBeFalsy()
|
|
226
|
+
wrapper.vm.toggle()
|
|
227
|
+
expect(wrapper.vm.isActive).toBeFalsy()
|
|
228
|
+
wrapper.vm.toggle()
|
|
229
|
+
expect(wrapper.vm.isActive).toBeFalsy()
|
|
230
|
+
|
|
231
|
+
const wrapper2 = mountFunction({ propsData: { to: { name: 'test' } }, stubs: ['router-link'] })
|
|
232
|
+
|
|
233
|
+
expect(wrapper2.vm.isActive).toBeFalsy()
|
|
234
|
+
wrapper2.vm.toggle()
|
|
235
|
+
expect(wrapper2.vm.isActive).toBeTruthy()
|
|
236
|
+
})
|
|
221
237
|
})
|
|
@@ -391,7 +391,7 @@ export default baseMixins.extend({
|
|
|
391
391
|
getTiles () {
|
|
392
392
|
if (!this.$refs.content) return
|
|
393
393
|
|
|
394
|
-
this.tiles = Array.from(this.$refs.content.querySelectorAll('.v-list-item'))
|
|
394
|
+
this.tiles = Array.from(this.$refs.content.querySelectorAll('.v-list-item, .v-divider, .v-subheader'))
|
|
395
395
|
},
|
|
396
396
|
mouseEnterHandler () {
|
|
397
397
|
this.runDelay('open', () => {
|
|
@@ -9,32 +9,29 @@
|
|
|
9
9
|
background: map-get($material, 'bg-color')
|
|
10
10
|
|
|
11
11
|
.v-otp-input
|
|
12
|
+
display: flex
|
|
13
|
+
flex-wrap: wrap
|
|
14
|
+
flex: 1 1 auto
|
|
15
|
+
margin-right: -$otp-gutter
|
|
16
|
+
margin-left: -$otp-gutter
|
|
17
|
+
|
|
12
18
|
input
|
|
13
19
|
text-align: center
|
|
20
|
+
|
|
14
21
|
.v-input
|
|
15
22
|
margin: 0
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
flex: 1 0 $otp-width + $otp-gutter * 2
|
|
24
|
+
max-width: 100%
|
|
25
|
+
width: 100%
|
|
26
|
+
padding: $otp-gutter
|
|
27
|
+
|
|
20
28
|
&.v-otp-input--plain
|
|
21
29
|
fieldset
|
|
22
30
|
display: none
|
|
31
|
+
|
|
23
32
|
input[type=number]::-webkit-outer-spin-button,
|
|
24
33
|
input[type=number]::-webkit-inner-spin-button
|
|
25
34
|
-webkit-appearance: none
|
|
26
35
|
margin: 0
|
|
27
36
|
input[type=number]
|
|
28
37
|
-moz-appearance: textfield
|
|
29
|
-
.row-container
|
|
30
|
-
display: flex
|
|
31
|
-
flex-wrap: wrap
|
|
32
|
-
flex: 1 1 auto
|
|
33
|
-
margin-right: $otp-row-container-margin-x
|
|
34
|
-
margin-left: $otp-row-container-margin-x
|
|
35
|
-
>.col-input
|
|
36
|
-
flex-basis: 0
|
|
37
|
-
flex-grow: $otp-col-flex-grow
|
|
38
|
-
max-width: $otp-col-width
|
|
39
|
-
width: $otp-col-width
|
|
40
|
-
padding: $otp-col-padding
|