2021-03-24 19:42:17 +01:00

80 lines
1.6 KiB
Vue

<template>
<div id="accordion" role="tablist" aria-multiselectable="true" class="accordion">
<slot></slot>
</div>
</template>
<script>
export default {
name: 'collapse',
props: {
animationDuration: {
type: Number,
default: 250,
description: 'Collapse animation duration',
},
multipleActive: {
type: Boolean,
default: true,
description: 'Whether you can have multiple collapse items opened at the same time',
},
activeIndex: {
type: Number,
default: -1,
description: 'Active collapse item index',
},
},
provide() {
return {
animationDuration: this.animationDuration,
multipleActive: this.multipleActive,
addItem: this.addItem,
removeItem: this.removeItem,
deactivateAll: this.deactivateAll,
}
},
data() {
return {
items: [],
}
},
methods: {
addItem(item) {
const index = this.$slots.default.indexOf(item.$vnode)
if (index !== -1) {
this.items.splice(index, 0, item)
}
},
removeItem(item) {
const items = this.items
const index = items.indexOf(item)
if (index > -1) {
items.splice(index, 1)
}
},
deactivateAll() {
this.items.forEach((item) => {
item.active = false
})
},
activateItem() {
if (this.activeIndex !== -1) {
this.items[this.activeIndex].active = true
}
},
},
mounted() {
this.$nextTick(() => {
this.activateItem()
})
},
watch: {
activeIndex() {
this.activateItem()
},
},
}
</script>
<style scoped></style>