quasar 1.22.3 → 1.22.5
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/icon-set/bootstrap-icons.umd.min.js +1 -1
- package/dist/icon-set/eva-icons.umd.min.js +1 -1
- package/dist/icon-set/fontawesome-v5-pro.umd.min.js +1 -1
- package/dist/icon-set/fontawesome-v5.umd.min.js +1 -1
- package/dist/icon-set/fontawesome-v6-pro.umd.min.js +1 -1
- package/dist/icon-set/fontawesome-v6.umd.min.js +1 -1
- package/dist/icon-set/ionicons-v4.umd.min.js +1 -1
- package/dist/icon-set/line-awesome.umd.min.js +1 -1
- package/dist/icon-set/material-icons-outlined.umd.min.js +1 -1
- package/dist/icon-set/material-icons-round.umd.min.js +1 -1
- package/dist/icon-set/material-icons-sharp.umd.min.js +1 -1
- package/dist/icon-set/material-icons.umd.min.js +1 -1
- package/dist/icon-set/material-symbols-outlined.umd.min.js +1 -1
- package/dist/icon-set/material-symbols-rounded.umd.min.js +1 -1
- package/dist/icon-set/material-symbols-sharp.umd.min.js +1 -1
- package/dist/icon-set/mdi-v3.umd.min.js +1 -1
- package/dist/icon-set/mdi-v4.umd.min.js +1 -1
- package/dist/icon-set/mdi-v5.umd.min.js +1 -1
- package/dist/icon-set/mdi-v6.umd.min.js +1 -1
- package/dist/icon-set/mdi-v7.umd.min.js +1 -1
- package/dist/icon-set/svg-bootstrap-icons.umd.min.js +1 -1
- package/dist/icon-set/svg-eva-icons.umd.min.js +1 -1
- package/dist/icon-set/svg-fontawesome-v5.umd.min.js +1 -1
- package/dist/icon-set/svg-fontawesome-v6.umd.min.js +1 -1
- package/dist/icon-set/svg-ionicons-v4.umd.min.js +1 -1
- package/dist/icon-set/svg-ionicons-v5.umd.min.js +1 -1
- package/dist/icon-set/svg-ionicons-v6.umd.min.js +1 -1
- package/dist/icon-set/svg-line-awesome.umd.min.js +1 -1
- package/dist/icon-set/svg-material-icons-outlined.umd.min.js +1 -1
- package/dist/icon-set/svg-material-icons-round.umd.min.js +1 -1
- package/dist/icon-set/svg-material-icons-sharp.umd.min.js +1 -1
- package/dist/icon-set/svg-material-icons.umd.min.js +1 -1
- package/dist/icon-set/svg-material-symbols-outlined.umd.min.js +1 -1
- package/dist/icon-set/svg-material-symbols-rounded.umd.min.js +1 -1
- package/dist/icon-set/svg-material-symbols-sharp.umd.min.js +1 -1
- package/dist/icon-set/svg-mdi-v4.umd.min.js +1 -1
- package/dist/icon-set/svg-mdi-v5.umd.min.js +1 -1
- package/dist/icon-set/svg-mdi-v6.umd.min.js +1 -1
- package/dist/icon-set/svg-mdi-v7.umd.min.js +1 -1
- package/dist/icon-set/svg-themify.umd.min.js +1 -1
- package/dist/icon-set/themify.umd.min.js +1 -1
- package/dist/lang/ar.umd.min.js +1 -1
- package/dist/lang/az-latn.umd.min.js +1 -1
- package/dist/lang/bg.umd.min.js +1 -1
- package/dist/lang/ca.umd.min.js +1 -1
- package/dist/lang/cs.umd.min.js +1 -1
- package/dist/lang/da.umd.min.js +1 -1
- package/dist/lang/de.umd.min.js +1 -1
- package/dist/lang/el.umd.min.js +1 -1
- package/dist/lang/en-gb.umd.min.js +1 -1
- package/dist/lang/en-us.umd.min.js +1 -1
- package/dist/lang/eo.umd.min.js +1 -1
- package/dist/lang/es.umd.min.js +1 -1
- package/dist/lang/et.umd.min.js +1 -1
- package/dist/lang/eu.umd.min.js +1 -1
- package/dist/lang/fa-ir.umd.min.js +1 -1
- package/dist/lang/fa.umd.min.js +1 -1
- package/dist/lang/fi.umd.min.js +1 -1
- package/dist/lang/fr.umd.min.js +1 -1
- package/dist/lang/gn.umd.min.js +1 -1
- package/dist/lang/he.umd.min.js +1 -1
- package/dist/lang/hr.umd.min.js +1 -1
- package/dist/lang/hu.umd.min.js +1 -1
- package/dist/lang/id.umd.min.js +1 -1
- package/dist/lang/is.umd.min.js +1 -1
- package/dist/lang/it.umd.min.js +1 -1
- package/dist/lang/ja.umd.min.js +1 -1
- package/dist/lang/km.umd.min.js +1 -1
- package/dist/lang/ko-kr.umd.min.js +1 -1
- package/dist/lang/kur-ckb.umd.min.js +1 -1
- package/dist/lang/kz.umd.min.js +1 -1
- package/dist/lang/lu.umd.min.js +1 -1
- package/dist/lang/lv.umd.min.js +1 -1
- package/dist/lang/ml.umd.min.js +1 -1
- package/dist/lang/mm.umd.min.js +1 -1
- package/dist/lang/ms.umd.min.js +1 -1
- package/dist/lang/my.umd.min.js +1 -1
- package/dist/lang/nb-no.umd.min.js +1 -1
- package/dist/lang/nl.umd.min.js +1 -1
- package/dist/lang/pl.umd.min.js +1 -1
- package/dist/lang/pt-br.umd.min.js +1 -1
- package/dist/lang/pt.umd.min.js +1 -1
- package/dist/lang/ro.umd.min.js +1 -1
- package/dist/lang/ru.umd.min.js +1 -1
- package/dist/lang/sk.umd.min.js +1 -1
- package/dist/lang/sl.umd.min.js +1 -1
- package/dist/lang/sm.umd.min.js +1 -1
- package/dist/lang/sr.umd.min.js +1 -1
- package/dist/lang/sv.umd.min.js +1 -1
- package/dist/lang/ta.umd.min.js +1 -1
- package/dist/lang/th.umd.min.js +1 -1
- package/dist/lang/tr.umd.min.js +1 -1
- package/dist/lang/ug.umd.min.js +1 -1
- package/dist/lang/uk.umd.min.js +1 -1
- package/dist/lang/uz-Cyrl.umd.min.js +1 -1
- package/dist/lang/uz-Latn.umd.min.js +1 -1
- package/dist/lang/vi.umd.min.js +1 -1
- package/dist/lang/zh-hans.umd.min.js +1 -1
- package/dist/lang/zh-hant.umd.min.js +1 -1
- package/dist/quasar.addon.css +1 -1
- package/dist/quasar.addon.rtl.css +1 -1
- package/dist/quasar.common.js +2 -2
- package/dist/quasar.css +1 -1
- package/dist/quasar.esm.js +2 -2
- package/dist/quasar.ie.polyfills.js +1 -1
- package/dist/quasar.ie.polyfills.umd.min.js +1 -1
- package/dist/quasar.rtl.css +1 -1
- package/dist/quasar.sass +1 -1
- package/dist/quasar.styl +1 -1
- package/dist/quasar.umd.js +134 -39
- package/dist/quasar.umd.min.js +2 -2
- package/dist/quasar.umd.modern.js +129 -38
- package/dist/quasar.umd.modern.min.js +2 -2
- package/dist/web-types/web-types.json +1 -1
- package/package.json +1 -1
- package/src/components/dialog/QDialog.js +2 -1
- package/src/components/infinite-scroll/QInfiniteScroll.js +37 -2
- package/src/css/core/visibility.sass +0 -1
- package/src/css/core/visibility.styl +0 -1
- package/src/mixins/prevent-scroll.js +9 -1
- package/src/utils/is.js +11 -6
- package/src/utils/private/position-engine.js +67 -30
package/package.json
CHANGED
|
@@ -372,7 +372,7 @@ export default Vue.extend({
|
|
|
372
372
|
staticClass: 'q-dialog__backdrop fixed-full',
|
|
373
373
|
attrs: backdropAttrs,
|
|
374
374
|
on: cache(this, 'bkdrop', {
|
|
375
|
-
[ this
|
|
375
|
+
[ this.backdropEvt ]: this.__onBackdropClick
|
|
376
376
|
})
|
|
377
377
|
})
|
|
378
378
|
] : null),
|
|
@@ -395,6 +395,7 @@ export default Vue.extend({
|
|
|
395
395
|
created () {
|
|
396
396
|
this.__useTick('__registerTick', '__removeTick')
|
|
397
397
|
this.__useTimeout('__registerTimeout')
|
|
398
|
+
this.backdropEvt = this.$q.platform.is.ios === true || this.$q.platform.is.safari ? 'click' : 'focusin'
|
|
398
399
|
},
|
|
399
400
|
|
|
400
401
|
mounted () {
|
|
@@ -44,6 +44,12 @@ export default Vue.extend({
|
|
|
44
44
|
}
|
|
45
45
|
},
|
|
46
46
|
|
|
47
|
+
computed: {
|
|
48
|
+
renderLoadingSlot () {
|
|
49
|
+
return this.disable !== true && this.isWorking === true
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
|
|
47
53
|
watch: {
|
|
48
54
|
disable (val) {
|
|
49
55
|
if (val === true) { this.stop() }
|
|
@@ -62,6 +68,14 @@ export default Vue.extend({
|
|
|
62
68
|
|
|
63
69
|
debounce (val) {
|
|
64
70
|
this.__setDebounce(val)
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
isFetching () {
|
|
74
|
+
this.__updateSvgAnimations()
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
renderLoadingSlot () {
|
|
78
|
+
this.__updateSvgAnimations()
|
|
65
79
|
}
|
|
66
80
|
},
|
|
67
81
|
|
|
@@ -183,14 +197,34 @@ export default Vue.extend({
|
|
|
183
197
|
|
|
184
198
|
this.__scrollTarget.addEventListener('scroll', this.poll, passive)
|
|
185
199
|
}
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
__updateSvgAnimations (isRetry) {
|
|
203
|
+
if (this.renderLoadingSlot === true) {
|
|
204
|
+
const el = this.$refs.loading
|
|
205
|
+
|
|
206
|
+
if (!el) {
|
|
207
|
+
isRetry !== true && this.$nextTick(() => {
|
|
208
|
+
this.__updateSvgAnimations(true)
|
|
209
|
+
})
|
|
210
|
+
return
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// we need to pause svg animations (if any) when hiding
|
|
214
|
+
// otherwise the browser will keep on recalculating the style
|
|
215
|
+
const action = `${ this.isFetching === true ? 'un' : '' }pauseAnimations`
|
|
216
|
+
Array.from(el.getElementsByTagName('svg')).forEach(el => {
|
|
217
|
+
el[ action ]()
|
|
218
|
+
})
|
|
219
|
+
}
|
|
186
220
|
}
|
|
187
221
|
},
|
|
188
222
|
|
|
189
223
|
mounted () {
|
|
190
224
|
this.immediatePoll = this.poll
|
|
191
225
|
this.__setDebounce(this.debounce)
|
|
192
|
-
|
|
193
226
|
this.updateScrollTarget()
|
|
227
|
+
this.isFetching === false && this.__updateSvgAnimations()
|
|
194
228
|
},
|
|
195
229
|
|
|
196
230
|
activated () {
|
|
@@ -212,9 +246,10 @@ export default Vue.extend({
|
|
|
212
246
|
render (h) {
|
|
213
247
|
const child = uniqueSlot(this, 'default', [])
|
|
214
248
|
|
|
215
|
-
if (this.
|
|
249
|
+
if (this.renderLoadingSlot === true) {
|
|
216
250
|
child[this.reverse === false ? 'push' : 'unshift'](
|
|
217
251
|
h('div', {
|
|
252
|
+
ref: 'loading',
|
|
218
253
|
staticClass: 'q-infinite-scroll__loading',
|
|
219
254
|
class: this.isFetching === true ? '' : 'invisible'
|
|
220
255
|
}, slot(this, 'loading'))
|
|
@@ -10,6 +10,7 @@ let
|
|
|
10
10
|
vpPendingUpdate = false,
|
|
11
11
|
bodyLeft,
|
|
12
12
|
bodyTop,
|
|
13
|
+
href,
|
|
13
14
|
closeTimer
|
|
14
15
|
|
|
15
16
|
function onWheel (e) {
|
|
@@ -96,6 +97,8 @@ function apply (action) {
|
|
|
96
97
|
bodyLeft = body.style.left
|
|
97
98
|
bodyTop = body.style.top
|
|
98
99
|
|
|
100
|
+
href = window.location.href
|
|
101
|
+
|
|
99
102
|
body.style.left = `-${scrollPositionX}px`
|
|
100
103
|
body.style.top = `-${scrollPositionY}px`
|
|
101
104
|
if (overflowY !== 'hidden' && (overflowY === 'scroll' || body.scrollHeight > window.innerHeight)) {
|
|
@@ -104,6 +107,7 @@ function apply (action) {
|
|
|
104
107
|
|
|
105
108
|
body.classList.add('q-body--prevent-scroll')
|
|
106
109
|
document.qScrollPrevented = true
|
|
110
|
+
|
|
107
111
|
if (client.is.ios === true) {
|
|
108
112
|
if (hasViewport === true) {
|
|
109
113
|
window.scrollTo(0, 0)
|
|
@@ -140,7 +144,11 @@ function apply (action) {
|
|
|
140
144
|
body.style.left = bodyLeft
|
|
141
145
|
body.style.top = bodyTop
|
|
142
146
|
|
|
143
|
-
|
|
147
|
+
// scroll back only if route has not changed
|
|
148
|
+
if (window.location.href === href) {
|
|
149
|
+
window.scrollTo(scrollPositionX, scrollPositionY)
|
|
150
|
+
}
|
|
151
|
+
|
|
144
152
|
maxScrollTop = void 0
|
|
145
153
|
}
|
|
146
154
|
}
|
package/src/utils/is.js
CHANGED
|
@@ -36,20 +36,23 @@ export function isDeepEqual (a, b) {
|
|
|
36
36
|
return false
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
let iter = a.entries()
|
|
40
|
+
|
|
41
|
+
i = iter.next()
|
|
40
42
|
while (i.done !== true) {
|
|
41
43
|
if (b.has(i.value[0]) !== true) {
|
|
42
44
|
return false
|
|
43
45
|
}
|
|
44
|
-
i =
|
|
46
|
+
i = iter.next()
|
|
45
47
|
}
|
|
46
48
|
|
|
47
|
-
|
|
49
|
+
iter = a.entries()
|
|
50
|
+
i = iter.next()
|
|
48
51
|
while (i.done !== true) {
|
|
49
52
|
if (isDeepEqual(i.value[1], b.get(i.value[0])) !== true) {
|
|
50
53
|
return false
|
|
51
54
|
}
|
|
52
|
-
i =
|
|
55
|
+
i = iter.next()
|
|
53
56
|
}
|
|
54
57
|
|
|
55
58
|
return true
|
|
@@ -60,12 +63,14 @@ export function isDeepEqual (a, b) {
|
|
|
60
63
|
return false
|
|
61
64
|
}
|
|
62
65
|
|
|
63
|
-
|
|
66
|
+
const iter = a.entries()
|
|
67
|
+
|
|
68
|
+
i = iter.next()
|
|
64
69
|
while (i.done !== true) {
|
|
65
70
|
if (b.has(i.value[0]) !== true) {
|
|
66
71
|
return false
|
|
67
72
|
}
|
|
68
|
-
i =
|
|
73
|
+
i = iter.next()
|
|
69
74
|
}
|
|
70
75
|
|
|
71
76
|
return true
|
|
@@ -48,11 +48,6 @@ export function parsePosition (pos, rtl) {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
export function validateCover (val) {
|
|
52
|
-
if (val === true || val === false) { return true }
|
|
53
|
-
return validatePosition(val)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
51
|
export function getAnchorProps (el, offset) {
|
|
57
52
|
let { top, left, right, bottom, width, height } = el.getBoundingClientRect()
|
|
58
53
|
|
|
@@ -67,17 +62,32 @@ export function getAnchorProps (el, offset) {
|
|
|
67
62
|
}
|
|
68
63
|
|
|
69
64
|
return {
|
|
70
|
-
top,
|
|
71
|
-
left,
|
|
72
|
-
right,
|
|
73
|
-
bottom,
|
|
74
|
-
width,
|
|
75
|
-
height,
|
|
65
|
+
top, bottom, height,
|
|
66
|
+
left, right, width,
|
|
76
67
|
middle: left + (right - left) / 2,
|
|
77
68
|
center: top + (bottom - top) / 2
|
|
78
69
|
}
|
|
79
70
|
}
|
|
80
71
|
|
|
72
|
+
function getAbsoluteAnchorProps (el, absoluteOffset, offset) {
|
|
73
|
+
let { top, left } = el.getBoundingClientRect()
|
|
74
|
+
|
|
75
|
+
top += absoluteOffset.top
|
|
76
|
+
left += absoluteOffset.left
|
|
77
|
+
|
|
78
|
+
if (offset !== void 0) {
|
|
79
|
+
top += offset[ 1 ]
|
|
80
|
+
left += offset[ 0 ]
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
top, bottom: top + 1, height: 1,
|
|
85
|
+
left, right: left + 1, width: 1,
|
|
86
|
+
middle: left,
|
|
87
|
+
center: top
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
81
91
|
export function getTargetProps (el) {
|
|
82
92
|
return {
|
|
83
93
|
top: 0,
|
|
@@ -89,6 +99,13 @@ export function getTargetProps (el) {
|
|
|
89
99
|
}
|
|
90
100
|
}
|
|
91
101
|
|
|
102
|
+
function getTopLeftProps (anchorProps, targetProps, cfg) {
|
|
103
|
+
return {
|
|
104
|
+
top: anchorProps[ cfg.anchorOrigin.vertical ] - targetProps[ cfg.selfOrigin.vertical ],
|
|
105
|
+
left: anchorProps[ cfg.anchorOrigin.horizontal ] - targetProps[ cfg.selfOrigin.horizontal ]
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
92
109
|
// cfg: { el, anchorEl, anchorOrigin, selfOrigin, offset, absoluteOffset, cover, fit, maxHeight, maxWidth }
|
|
93
110
|
export function setPosition (cfg) {
|
|
94
111
|
if (client.is.ios === true && window.visualViewport !== void 0) {
|
|
@@ -107,25 +124,15 @@ export function setPosition (cfg) {
|
|
|
107
124
|
}
|
|
108
125
|
}
|
|
109
126
|
|
|
110
|
-
let anchorProps
|
|
111
|
-
|
|
112
127
|
// scroll position might change
|
|
113
128
|
// if max-height/-width changes, so we
|
|
114
129
|
// need to restore it after we calculate
|
|
115
130
|
// the new positioning
|
|
116
131
|
const { scrollLeft, scrollTop } = cfg.el
|
|
117
132
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
else {
|
|
122
|
-
const
|
|
123
|
-
{ top: anchorTop, left: anchorLeft } = cfg.anchorEl.getBoundingClientRect(),
|
|
124
|
-
top = anchorTop + cfg.absoluteOffset.top,
|
|
125
|
-
left = anchorLeft + cfg.absoluteOffset.left
|
|
126
|
-
|
|
127
|
-
anchorProps = { top, left, width: 1, height: 1, right: left + 1, center: top, middle: left, bottom: top + 1 }
|
|
128
|
-
}
|
|
133
|
+
const anchorProps = cfg.absoluteOffset === void 0
|
|
134
|
+
? getAnchorProps(cfg.anchorEl, cfg.cover === true ? [ 0, 0 ] : cfg.offset)
|
|
135
|
+
: getAbsoluteAnchorProps(cfg.anchorEl, cfg.absoluteOffset, cfg.offset)
|
|
129
136
|
|
|
130
137
|
let elStyle = {
|
|
131
138
|
maxHeight: cfg.maxHeight,
|
|
@@ -142,14 +149,44 @@ export function setPosition (cfg) {
|
|
|
142
149
|
|
|
143
150
|
Object.assign(cfg.el.style, elStyle)
|
|
144
151
|
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
152
|
+
const targetProps = getTargetProps(cfg.el)
|
|
153
|
+
let props = getTopLeftProps(anchorProps, targetProps, cfg)
|
|
154
|
+
|
|
155
|
+
if (cfg.absoluteOffset === void 0 || cfg.offset === void 0) {
|
|
156
|
+
applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin)
|
|
157
|
+
}
|
|
158
|
+
else { // we have touch position or context menu with offset
|
|
159
|
+
const { top, left } = props // cache initial values
|
|
160
|
+
|
|
161
|
+
// apply initial boundaries
|
|
162
|
+
applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin)
|
|
163
|
+
|
|
164
|
+
let hasChanged = false
|
|
165
|
+
|
|
166
|
+
// did it flip vertically?
|
|
167
|
+
if (props.top !== top) {
|
|
168
|
+
hasChanged = true
|
|
169
|
+
const offsetY = 2 * cfg.offset[ 1 ]
|
|
170
|
+
anchorProps.center = anchorProps.top -= offsetY
|
|
171
|
+
anchorProps.bottom -= offsetY + 2
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// did it flip horizontally?
|
|
175
|
+
if (props.left !== left) {
|
|
176
|
+
hasChanged = true
|
|
177
|
+
const offsetX = 2 * cfg.offset[ 0 ]
|
|
178
|
+
anchorProps.middle = anchorProps.left -= offsetX
|
|
179
|
+
anchorProps.right -= offsetX + 2
|
|
150
180
|
}
|
|
151
181
|
|
|
152
|
-
|
|
182
|
+
if (hasChanged === true) {
|
|
183
|
+
// re-calculate props with the new anchor
|
|
184
|
+
props = getTopLeftProps(anchorProps, targetProps, cfg)
|
|
185
|
+
|
|
186
|
+
// and re-apply boundaries
|
|
187
|
+
applyBoundaries(props, anchorProps, targetProps, cfg.anchorOrigin, cfg.selfOrigin)
|
|
188
|
+
}
|
|
189
|
+
}
|
|
153
190
|
|
|
154
191
|
elStyle = {
|
|
155
192
|
top: props.top + 'px',
|