Skip to content

Commit ecf5cb7

Browse files
VdustRmarcosmoura
authored andcommitted
feat(MdMenu): new props mdCloseOnClick (#1630)
* feat(MdMenu): new props mdCloseOnClick option for auto close after any click event * docs(Menu): fix AutoClose component name * fix(MdMenu): change mdCloseOnClick default to false
1 parent 63b8ac0 commit ecf5cb7

File tree

5 files changed

+93
-22
lines changed

5 files changed

+93
-22
lines changed

docs/app/pages/Components/Menu/Menu.vue

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<example src="./examples/Directions.vue" />
22
<example src="./examples/Sizes.vue" />
33
<example src="./examples/MenuAlignments.vue" />
4+
<example src="./examples/AutoClose.vue" />
45
<example src="./examples/MultipleContent.vue" />
56

67
<template>
@@ -33,6 +34,13 @@
3334
<note-block>The max-width of a menu is 280px.</note-block>
3435
</div>
3536

37+
<div class="page-container-section">
38+
<h2>AutoClose</h2>
39+
40+
<p><code>md-menu</code> can be auto closed on click or select:</p>
41+
<code-example title="Auto close menu on events" :component="examples['auto-close']" />
42+
</div>
43+
3644
<div class="page-container-section">
3745
<h2>Rich Content and Icon Alignment</h2>
3846

@@ -71,6 +79,12 @@
7179
description: 'Used to show/hide a menu programatically.',
7280
defaults: 'false'
7381
},
82+
{
83+
name: 'md-close-on-click',
84+
type: 'Boolean',
85+
description: 'When this options is true, the menu will be closed after any click event.',
86+
defaults: 'false'
87+
},
7488
{
7589
name: 'md-close-on-select',
7690
type: 'Boolean',
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<template>
2+
<div>
3+
<div>
4+
<md-checkbox :value="true" v-model="closeOnClick">closeOnClick</md-checkbox>
5+
<md-checkbox :value="true" v-model="closeOnSelect">closeOnSelect</md-checkbox>
6+
</div>
7+
<div>
8+
<md-menu md-direction="bottom-end" :mdCloseOnClick="closeOnClick" :mdCloseOnSelect="closeOnSelect">
9+
<md-button md-menu-trigger>Bottom End</md-button>
10+
11+
<md-menu-content>
12+
<md-menu-item disabled @click="data = 'click disabled'">Disabled</md-menu-item>
13+
<md-menu-item @click="data = 'click 1'">Click Event 1</md-menu-item>
14+
<md-menu-item @click="data = 'click 2'">Click Event 2</md-menu-item>
15+
<md-menu-item>Plain text</md-menu-item>
16+
</md-menu-content>
17+
</md-menu>
18+
</div>
19+
<div>{{data}}</div>
20+
</div>
21+
</template>
22+
23+
<script>
24+
export default {
25+
name: 'AutoClose',
26+
27+
data () {
28+
return {
29+
data: '',
30+
closeOnClick: false,
31+
closeOnSelect: true
32+
}
33+
}
34+
}
35+
</script>
36+
37+
<style lang="scss" scoped>
38+
.md-menu {
39+
margin: 24px;
40+
}
41+
</style>

src/components/MdMenu/MdMenu.vue

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
type: Boolean,
3131
default: true
3232
},
33+
mdCloseOnClick: {
34+
type: Boolean,
35+
default: false
36+
},
3337
mdSize: {
3438
type: String,
3539
default: 'small',
@@ -56,6 +60,7 @@
5660
fullWidth: this.mdFullWidth,
5761
dense: this.mdDense,
5862
closeOnSelect: this.mdCloseOnSelect,
63+
closeOnClick: this.mdCloseOnClick,
5964
bodyClickObserver: null,
6065
windowResizeObserver: null,
6166
$el: this.$el
@@ -102,6 +107,12 @@
102107
} else {
103108
this.$emit('md-opened')
104109
}
110+
},
111+
mdCloseOnSelect () {
112+
this.MdMenu.closeOnSelect = this.mdCloseOnSelect
113+
},
114+
mdCloseOnClick () {
115+
this.MdMenu.closeOnClick = this.mdCloseOnClick
105116
}
106117
},
107118
methods: {

src/components/MdMenu/MdMenuContent.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,8 @@
199199
$event.stopPropagation()
200200
let isMdMenu = this.MdMenu.$el ? this.MdMenu.$el.contains($event.target) : false
201201
let isMenuContentEl = this.$refs.menu ? this.$refs.menu.contains($event.target) : false
202-
if (!this.$el.contains($event.target) && !isMdMenu && !isMenuContentEl) {
202+
let onBackdropExpectMenu = !this.$el.contains($event.target) && !isMenuContentEl
203+
if (!isMdMenu && (this.MdMenu.closeOnClick || onBackdropExpectMenu)) {
203204
this.MdMenu.active = false
204205
this.MdMenu.bodyClickObserver.destroy()
205206
this.MdMenu.windowResizeObserver.destroy()

src/components/MdMenu/MdMenuItem.vue

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,38 @@
1616
},
1717
inject: ['MdMenu'],
1818
data: () => ({
19-
listeners: {},
2019
highlighted: false
2120
}),
2221
computed: {
2322
itemClasses () {
2423
return {
2524
'md-highlight': this.highlighted
2625
}
26+
},
27+
listeners () {
28+
if (this.disabled) {
29+
return {}
30+
}
31+
32+
if (!this.MdMenu.closeOnSelect) {
33+
return this.$listeners
34+
}
35+
36+
let listeners = {}
37+
let listenerNames = Object.keys(this.$listeners)
38+
39+
listenerNames.forEach(listener => {
40+
if (MdInteractionEvents.includes(listener)) {
41+
listeners[listener] = $event => {
42+
this.$listeners[listener]($event)
43+
this.closeMenu()
44+
}
45+
} else {
46+
listeners[listener] = this.$listeners[listener]
47+
}
48+
})
49+
50+
return listeners
2751
}
2852
},
2953
methods: {
@@ -41,26 +65,6 @@
4165
}
4266
}
4367
},
44-
created () {
45-
if (this.MdMenu.closeOnSelect) {
46-
let listenerNames = Object.keys(this.$listeners)
47-
48-
listenerNames.forEach(listener => {
49-
if (MdInteractionEvents.includes(listener)) {
50-
this.listeners[listener] = $event => {
51-
if (!this.disabled) {
52-
this.$listeners[listener]($event)
53-
this.closeMenu()
54-
}
55-
}
56-
} else {
57-
this.listeners[listener] = this.$listeners[listener]
58-
}
59-
})
60-
} else {
61-
this.listeners = this.$listeners
62-
}
63-
},
6468
mounted () {
6569
if (this.$el.children && this.$el.children[0]) {
6670
let listItem = this.$el.children[0]

0 commit comments

Comments
 (0)