parsley/app/javascript/components/AppDropdown.vue

78 lines
1.4 KiB
Vue
Raw Normal View History

2018-08-28 16:52:56 -05:00
<template>
<div class="dropdown" :class="{'is-active': open}">
<div class="dropdown-trigger">
<slot name="button">
<button type="button" class="button" :class="buttonClass" @click="toggle">
<span>{{ label }}</span>
<app-icon icon="caret-bottom"></app-icon>
</button>
</slot>
</div>
<div class="dropdown-menu">
<div class="dropdown-content">
<slot>
Default Content
</slot>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
open: {
required: true,
type: Boolean
},
label: {
required: false,
type: String,
default: 'Select'
},
buttonClass: {
required: false,
default: ""
}
},
methods: {
toggle() {
if (this.open) {
this.triggerClose();
} else {
this.triggerOpen();
}
},
triggerOpen() {
this.$emit("open");
},
triggerClose() {
this.$emit("close");
2018-08-29 16:58:07 -05:00
},
handleOutsideClick(evt) {
if (this.open) {
if (!this.$el.contains(evt.target)) {
this.triggerClose();
}
}
2018-08-28 16:52:56 -05:00
}
2018-08-29 16:58:07 -05:00
},
mounted() {
document.addEventListener("click", this.handleOutsideClick);
},
beforeDestroy() {
document.removeEventListener("click", this.handleOutsideClick);
2018-08-28 16:52:56 -05:00
}
}
</script>