Skip to content

Commit a2bcf05

Browse files
committed
fix: QContextMenu does not close when another QContextMenu is opened quasarframework#1852
1 parent a6475ac commit a2bcf05

File tree

2 files changed

+83
-8
lines changed

2 files changed

+83
-8
lines changed

dev/components/components/context-menu.vue

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,43 @@
5252
</div>
5353
<p class="caption">Visible: {{visible}}</p>
5454
<pre v-if="event && event.target">{{event.target.innerText}}</pre>
55+
56+
57+
<div class="block-1 q-ma-md">
58+
<q-context-menu>
59+
<q-list link separator style="min-width: 150px;">
60+
<q-item v-close-overlay><q-item-main label="Foo"></q-item-main></q-item>
61+
<q-item v-close-overlay><q-item-main label="Bar"></q-item-main></q-item>
62+
</q-list>
63+
</q-context-menu>
64+
</div>
65+
66+
<div class="block-2 q-ma-md">
67+
<q-context-menu>
68+
<q-list link separator style="min-width: 150px;">
69+
<q-item v-close-overlay><q-item-main label="Foo"></q-item-main></q-item>
70+
<q-item v-close-overlay><q-item-main label="Bar"></q-item-main></q-item>
71+
</q-list>
72+
</q-context-menu>
73+
</div>
74+
75+
<div class="block-3 q-ma-md">
76+
<q-context-menu>
77+
<q-list link separator style="min-width: 150px;">
78+
<q-item v-close-overlay><q-item-main label="Foo"></q-item-main></q-item>
79+
<q-item v-close-overlay><q-item-main label="Bar"></q-item-main></q-item>
80+
</q-list>
81+
</q-context-menu>
82+
</div>
83+
84+
<div class="block-4 q-ma-md">
85+
<q-context-menu>
86+
<q-list link separator style="min-width: 150px;">
87+
<q-item v-close-overlay><q-item-main label="Foo"></q-item-main></q-item>
88+
<q-item v-close-overlay><q-item-main label="Bar"></q-item-main></q-item>
89+
</q-list>
90+
</q-context-menu>
91+
</div>
5592
</div>
5693
</div>
5794
</template>
@@ -94,3 +131,27 @@ export default {
94131
}
95132
}
96133
</script>
134+
135+
<style lang="stylus">
136+
.block-1, .block-2, .block-3, .block-4 {
137+
display: inline-block;
138+
width: 150px;
139+
height: 150px;
140+
}
141+
142+
.block-1 {
143+
background: red;
144+
}
145+
146+
.block-2 {
147+
background: yellow;
148+
}
149+
150+
.block-3 {
151+
background: blue;
152+
}
153+
154+
.block-4 {
155+
background: pink;
156+
}
157+
</style>

src/components/context-menu/ContextMenuDesktop.js

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ export default {
1616
anchorClick: false
1717
},
1818
on: {
19-
show: () => { this.$emit('show', this.event) },
20-
hide: (evt) => { this.$emit('hide', this.event, evt) }
19+
show: this.__onShow,
20+
hide: this.__onHide
2121
}
2222
}, this.$slots.default)
2323
},
@@ -29,25 +29,39 @@ export default {
2929
if (!evt || this.disable) {
3030
return
3131
}
32-
this.hide(evt)
3332
stopAndPrevent(evt)
3433
/*
3534
Opening with a timeout for
3635
Firefox workaround
3736
*/
3837
setTimeout(() => {
39-
this.event = evt
40-
this.$refs.popover.show(evt)
38+
if (this.$refs.popover) {
39+
this.event = evt
40+
this.$refs.popover.show(evt)
41+
}
4142
}, 100)
43+
},
44+
__bodyHide (evt) {
45+
if (!this.$el.contains(evt.target)) {
46+
this.hide(evt)
47+
}
48+
},
49+
__onShow () {
50+
document.body.addEventListener('contextmenu', this.__bodyHide, true)
51+
document.body.addEventListener('click', this.__bodyHide, true)
52+
this.$emit('show', this.event)
53+
},
54+
__onHide (evt) {
55+
document.body.addEventListener('contextmenu', this.__bodyHide, true)
56+
document.body.addEventListener('click', this.__bodyHide, true)
57+
this.$emit('hide', this.event, evt)
4258
}
4359
},
4460
mounted () {
4561
this.target = this.$refs.popover.$el.parentNode
4662
this.target.addEventListener('contextmenu', this.show)
47-
this.target.addEventListener('click', this.hide)
4863
},
4964
beforeDestroy () {
50-
this.target.removeEventListener('contexmenu', this.show)
51-
this.target.removeEventListener('click', this.hide)
65+
this.target.removeEventListener('contextmenu', this.show)
5266
}
5367
}

0 commit comments

Comments
 (0)