92 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="card">
 | |
|     <div role="tab" class="card-header" :aria-expanded="active">
 | |
|       <a
 | |
|         data-toggle="collapse"
 | |
|         data-parent="#accordion"
 | |
|         :href="`#${itemId}`"
 | |
|         @click.prevent="activate"
 | |
|         :aria-controls="`content-${itemId}`"
 | |
|       >
 | |
|         <slot name="title"> {{ title }} </slot>
 | |
|         <i class="tim-icons icon-minimal-down"></i>
 | |
|       </a>
 | |
|     </div>
 | |
|     <collapse-transition :duration="animationDuration">
 | |
|       <div
 | |
|         v-show="active"
 | |
|         :id="`content-${itemId}`"
 | |
|         role="tabpanel"
 | |
|         :aria-labelledby="title"
 | |
|         class="collapsed"
 | |
|       >
 | |
|         <div class="card-body"><slot></slot></div>
 | |
|       </div>
 | |
|     </collapse-transition>
 | |
|   </div>
 | |
| </template>
 | |
| <script>
 | |
| import { CollapseTransition } from 'vue2-transitions';
 | |
| 
 | |
| export default {
 | |
|   name: 'collapse-item',
 | |
|   components: {
 | |
|     CollapseTransition
 | |
|   },
 | |
|   props: {
 | |
|     title: {
 | |
|       type: String,
 | |
|       default: '',
 | |
|       description: 'Collapse item title'
 | |
|     },
 | |
|     id: String
 | |
|   },
 | |
|   inject: {
 | |
|     animationDuration: {
 | |
|       default: 250
 | |
|     },
 | |
|     multipleActive: {
 | |
|       default: false
 | |
|     },
 | |
|     addItem: {
 | |
|       default: () => {}
 | |
|     },
 | |
|     removeItem: {
 | |
|       default: () => {}
 | |
|     },
 | |
|     deactivateAll: {
 | |
|       default: () => {}
 | |
|     }
 | |
|   },
 | |
|   computed: {
 | |
|     itemId() {
 | |
|       return this.id || this.title;
 | |
|     }
 | |
|   },
 | |
|   data() {
 | |
|     return {
 | |
|       active: false
 | |
|     };
 | |
|   },
 | |
|   methods: {
 | |
|     activate() {
 | |
|       let wasActive = this.active;
 | |
|       if (!this.multipleActive) {
 | |
|         this.deactivateAll();
 | |
|       }
 | |
|       this.active = !wasActive;
 | |
|     }
 | |
|   },
 | |
|   mounted() {
 | |
|     this.addItem(this);
 | |
|   },
 | |
|   destroyed() {
 | |
|     if (this.$el && this.$el.parentNode) {
 | |
|       this.$el.parentNode.removeChild(this.$el);
 | |
|     }
 | |
|     this.removeItem(this);
 | |
|   }
 | |
| };
 | |
| </script>
 | |
| <style></style>
 |