101 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <component
 | |
|     :is="tag"
 | |
|     :class="[{ show: isOpen }, `drop${direction}`]"
 | |
|     @click="toggleDropDown"
 | |
|     v-click-outside="closeDropDown"
 | |
|   >
 | |
|     <slot name="title-container" :is-open="isOpen">
 | |
|       <component
 | |
|         :is="titleTag"
 | |
|         class="btn-rotate"
 | |
|         :class="[{'dropdown-toggle': hasToggle}, titleClasses]"
 | |
|         :aria-expanded="isOpen"
 | |
|         data-toggle="dropdown"
 | |
|       >
 | |
|         <slot name="title" :is-open="isOpen">
 | |
|           <i :class="icon"></i> {{ title }}
 | |
|         </slot>
 | |
|       </component>
 | |
|     </slot>
 | |
|     <ul
 | |
|       class="dropdown-menu"
 | |
|       :class="[
 | |
|         { show: isOpen },
 | |
|         { 'dropdown-menu-right': menuOnRight },
 | |
|         menuClasses
 | |
|       ]"
 | |
|     >
 | |
|       <slot></slot>
 | |
|     </ul>
 | |
|   </component>
 | |
| </template>
 | |
| <script>
 | |
| export default {
 | |
|   name: 'base-dropdown',
 | |
|   props: {
 | |
|     tag: {
 | |
|       type: String,
 | |
|       default: 'div',
 | |
|       description: 'Dropdown html tag (e.g div, ul etc)'
 | |
|     },
 | |
|     titleTag: {
 | |
|       type: String,
 | |
|       default: 'button',
 | |
|       description: 'Dropdown title (toggle) html tag'
 | |
|     },
 | |
|     title: {
 | |
|       type: String,
 | |
|       description: 'Dropdown title'
 | |
|     },
 | |
|     direction: {
 | |
|       type: String,
 | |
|       default: 'down', // up | down
 | |
|       description: 'Dropdown menu direction (up|down)'
 | |
|     },
 | |
|     icon: {
 | |
|       type: String,
 | |
|       description: 'Dropdown icon'
 | |
|     },
 | |
|     titleClasses: {
 | |
|       type: [String, Object, Array],
 | |
|       description: 'Title css classes'
 | |
|     },
 | |
|     menuClasses: {
 | |
|       type: [String, Object],
 | |
|       description: 'Menu css classes'
 | |
|     },
 | |
|     menuOnRight: {
 | |
|       type: Boolean,
 | |
|       description: 'Whether menu should appear on the right'
 | |
|     },
 | |
|     hasToggle: {
 | |
|       type: Boolean,
 | |
|       description: 'Whether dropdown has arrow icon shown',
 | |
|       default: true
 | |
|     }
 | |
|   },
 | |
|   data() {
 | |
|     return {
 | |
|       isOpen: false
 | |
|     };
 | |
|   },
 | |
|   methods: {
 | |
|     toggleDropDown() {
 | |
|       this.isOpen = !this.isOpen;
 | |
|       this.$emit('change', this.isOpen);
 | |
|     },
 | |
|     closeDropDown() {
 | |
|       this.isOpen = false;
 | |
|       this.$emit('change', false);
 | |
|     }
 | |
|   }
 | |
| };
 | |
| </script>
 | |
| <style lang="scss" scoped>
 | |
| .dropdown {
 | |
|   cursor: pointer;
 | |
|   user-select: none;
 | |
| }
 | |
| </style>
 |