Skip to content

Commit e4c9364

Browse files
committed
feat(popover/tooltip): Allow append-to property of PopUp Mixins to pass ref. (close #347)
1 parent 545eed9 commit e4c9364

File tree

3 files changed

+63
-5
lines changed

3 files changed

+63
-5
lines changed

src/mixins/popup.mixin.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export default {
3636
default: true
3737
},
3838
appendTo: {
39-
type: String,
39+
type: null,
4040
default: 'body'
4141
},
4242
transition: {
@@ -241,7 +241,14 @@ export default {
241241
// add to dom
242242
if (!popUpAppendedContainer) {
243243
popup.className = `${this.name} ${this.placement} ${this.customClass ? this.customClass : ''} fade`
244-
let container = document.querySelector(this.appendTo)
244+
let container
245+
if (isString(this.appendTo)) { // is selector
246+
container = document.querySelector(this.appendTo)
247+
} else if (isElement(this.appendTo)) { // is element
248+
container = this.appendTo
249+
} else if (isElement(this.appendTo.$el)) { // is component
250+
container = this.appendTo.$el
251+
}
245252
container.appendChild(popup)
246253
this.resetPosition()
247254
}

src/utils/dom.utils.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,19 +218,26 @@ export function isAvailableAtPosition (trigger, popup, placement) {
218218
return top && right && bottom && left
219219
}
220220

221-
export function setTooltipPosition (tooltip, trigger, placement, auto, appendToSelector, viewport) {
221+
export function setTooltipPosition (tooltip, trigger, placement, auto, appendTo, viewport) {
222222
if (!isElement(tooltip) || !isElement(trigger)) {
223223
return
224224
}
225225
const isPopover = tooltip && tooltip.className && tooltip.className.indexOf('popover') >= 0
226226
let containerScrollTop
227227
let containerScrollLeft
228-
if (!isExist(appendToSelector) || appendToSelector === 'body') {
228+
if (!isExist(appendTo) || appendTo === 'body') {
229229
const doc = document.documentElement
230230
containerScrollLeft = (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0)
231231
containerScrollTop = (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0)
232232
} else {
233-
const container = document.querySelector(appendToSelector)
233+
let container
234+
if (isString(appendTo)) { // is selector
235+
container = document.querySelector(appendTo)
236+
} else if (isElement(appendTo)) { // is element
237+
container = appendTo
238+
} else if (isElement(appendTo.$el)) { // is component
239+
container = appendTo.$el
240+
}
234241
containerScrollLeft = container.scrollLeft
235242
containerScrollTop = container.scrollTop
236243
}

test/specs/Popover.spec.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,50 @@ describe('Popover', () => {
4848
expect(document.querySelectorAll('.popover').length).to.equal(1)
4949
})
5050

51+
it('should be able to use custom string append-to', async () => {
52+
vm = createVm(`<div id="test">
53+
<popover append-to="#test" v-model="show" title="123">
54+
<button data-role="trigger"></button>
55+
</popover>
56+
</div>`, {
57+
show: true
58+
})
59+
await sleep(300)
60+
expect(document.querySelectorAll('#test .popover').length).to.equal(1)
61+
})
62+
63+
it('should be able to use custom element append-to', async () => {
64+
vm = createVm(`<div id="test" ref="el">
65+
<popover v-if="appendTo" :append-to="appendTo" v-model="show" title="123">
66+
<button data-role="trigger"></button>
67+
</popover>
68+
</div>`, {
69+
show: true,
70+
appendTo: null
71+
})
72+
await vm.$nextTick()
73+
vm.appendTo = vm.$refs.el
74+
await vm.$nextTick()
75+
await sleep(300)
76+
expect(document.querySelectorAll('#test .popover').length).to.equal(1)
77+
})
78+
79+
it('should be able to use custom component append-to', async () => {
80+
vm = createVm(`<div id="test" ref="el">
81+
<popover v-if="appendTo" :append-to="appendTo" v-model="show" title="123">
82+
<button data-role="trigger"></button>
83+
</popover>
84+
</div>`, {
85+
show: true,
86+
appendTo: null
87+
})
88+
await vm.$nextTick()
89+
vm.appendTo = vm
90+
await vm.$nextTick()
91+
await sleep(300)
92+
expect(document.querySelectorAll('#test .popover').length).to.equal(1)
93+
})
94+
5195
it('should be able to use popover directive', async () => {
5296
vm = createVm(`<btn v-popover="msg"></btn>`, {
5397
msg: { title: 'title', content: 'content' }

0 commit comments

Comments
 (0)