mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-11-03 22:13:18 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			140 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						|
  <div
 | 
						|
    v-click-outside="closeDropdown"
 | 
						|
    :class="[
 | 
						|
      'dropdown-group',
 | 
						|
      {'active': (toggle || isActive() )},
 | 
						|
      {'has-child':hasChild},
 | 
						|
      {'toggle-arrow':(hasChild)&&(showArrow)},
 | 
						|
      {'dropdown-light': themeLight}]"
 | 
						|
  >
 | 
						|
    <div class="dropdown-activator" @click.stop.prevent="showDropdown">
 | 
						|
      <slot name="activator"/>
 | 
						|
    </div>
 | 
						|
    <transition name="bounce">
 | 
						|
      <div
 | 
						|
        v-show="toggle"
 | 
						|
        v-if="hasChild"
 | 
						|
        ref="dropdownItems"
 | 
						|
        :class="['dropdown-container', {'align-right': rightAlign}]"
 | 
						|
        @click="closeOnSelectDropdownItem"
 | 
						|
      >
 | 
						|
        <slot />
 | 
						|
      </div>
 | 
						|
    </transition>
 | 
						|
  </div>
 | 
						|
</template>
 | 
						|
<script>
 | 
						|
export default {
 | 
						|
  props: {
 | 
						|
    activeUrl: {
 | 
						|
      type: String,
 | 
						|
      require: true,
 | 
						|
      default: String
 | 
						|
    },
 | 
						|
    showArrow: {
 | 
						|
      type: Boolean,
 | 
						|
      require: true,
 | 
						|
      default: true
 | 
						|
    },
 | 
						|
    themeLight: {
 | 
						|
      type: Boolean,
 | 
						|
      require: true,
 | 
						|
      default: false
 | 
						|
    },
 | 
						|
    closeOnSelect: {
 | 
						|
      type: Boolean,
 | 
						|
      require: true,
 | 
						|
      default: true
 | 
						|
    }
 | 
						|
  },
 | 
						|
  data () {
 | 
						|
    return {
 | 
						|
      toggle: true,
 | 
						|
      hasChild: true,
 | 
						|
      rightAlign: false
 | 
						|
    }
 | 
						|
  },
 | 
						|
  mounted () {
 | 
						|
    this.$nextTick(() => {
 | 
						|
      this.setDropdownPosition()
 | 
						|
      window.addEventListener('resize', e => {
 | 
						|
        if (this.toggle === true) {
 | 
						|
          this.setDropdownPosition()
 | 
						|
        }
 | 
						|
      })
 | 
						|
      if (!this.$slots.default) {
 | 
						|
        this.hasChild = false
 | 
						|
      }
 | 
						|
      this.toggle = false
 | 
						|
    })
 | 
						|
  },
 | 
						|
  methods: {
 | 
						|
    setDropdownPosition () {
 | 
						|
      let rect = this.$refs.dropdownItems.getBoundingClientRect()
 | 
						|
 | 
						|
      let offsetPos = rect.width - this.$el.offsetWidth
 | 
						|
      let itemPos = rect.right + rect.width + offsetPos
 | 
						|
 | 
						|
      if (itemPos > window.innerWidth) {
 | 
						|
        this.rightAlign = true
 | 
						|
      }
 | 
						|
      itemPos += offsetPos + rect.width + offsetPos
 | 
						|
      if (itemPos < window.innerWidth) {
 | 
						|
        this.rightAlign = false
 | 
						|
      }
 | 
						|
    },
 | 
						|
    isActive () {
 | 
						|
      if (this.activeUrl) {
 | 
						|
        return this.$route.path.indexOf(this.activeUrl) > -1
 | 
						|
      }
 | 
						|
      return false
 | 
						|
    },
 | 
						|
    showDropdown () {
 | 
						|
      this.toggle = !this.toggle
 | 
						|
    },
 | 
						|
    closeOnSelectDropdownItem () {
 | 
						|
      if (this.closeOnSelect === false) {
 | 
						|
        this.toggle = true
 | 
						|
      } else {
 | 
						|
        this.toggle = false
 | 
						|
      }
 | 
						|
    },
 | 
						|
    closeDropdown () {
 | 
						|
      this.toggle = false
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
</script>
 | 
						|
<style>
 | 
						|
  .dropdown-item {
 | 
						|
    background: transparent;
 | 
						|
    transform-origin: top;
 | 
						|
    position: relative;
 | 
						|
    color:#040405;
 | 
						|
    animation-name: example;
 | 
						|
    animation-duration: 1s;
 | 
						|
    animation-iteration-count: 1;
 | 
						|
    animation-direction: alternate;
 | 
						|
  }
 | 
						|
  .bounce-enter-active {
 | 
						|
    /* zoom: 1; */
 | 
						|
    transform-origin: top right;
 | 
						|
    margin-top: 5px;
 | 
						|
    animation: bounce-in 0.4s;
 | 
						|
  }
 | 
						|
  .bounce-leave-active {
 | 
						|
     animation: bounce-in 1s reverse;
 | 
						|
  }
 | 
						|
 | 
						|
@keyframes example {
 | 
						|
 0% {color: #FFFFFF;}
 | 
						|
 100% {color:#040405;}
 | 
						|
}
 | 
						|
 | 
						|
@keyframes bounce-in {
 | 
						|
  from { transform: scale(0); }
 | 
						|
  to {  }
 | 
						|
}
 | 
						|
</style>
 |