1<template> 2 <transition name="fade"> 3 <b-progress v-if="!isLoadingComplete"> 4 <b-progress-bar 5 striped 6 animated 7 :value="loadingIndicatorValue" 8 :aria-label="$t('global.ariaLabel.progressBar')" 9 /> 10 </b-progress> 11 </transition> 12</template> 13 14<script> 15export default { 16 data() { 17 return { 18 loadingIndicatorValue: 0, 19 isLoadingComplete: false, 20 loadingIntervalId: null, 21 timeoutId: null 22 }; 23 }, 24 created() { 25 this.$root.$on('loader::start', () => { 26 this.startLoadingInterval(); 27 }); 28 this.$root.$on('loader::end', () => { 29 this.endLoadingInterval(); 30 }); 31 this.$root.$on('loader::hide', () => { 32 this.hideLoadingBar(); 33 }); 34 }, 35 methods: { 36 startLoadingInterval() { 37 this.clearLoadingInterval(); 38 this.clearTimeout(); 39 this.loadingIndicatorValue = 0; 40 this.isLoadingComplete = false; 41 this.loadingIntervalId = setInterval(() => { 42 this.loadingIndicatorValue += 1; 43 if (this.loadingIndicatorValue > 100) this.clearLoadingInterval(); 44 }, 100); 45 }, 46 endLoadingInterval() { 47 this.clearLoadingInterval(); 48 this.clearTimeout(); 49 this.loadingIndicatorValue = 100; 50 this.timeoutId = setTimeout(() => { 51 // Let animation complete before hiding 52 // the loading bar 53 this.isLoadingComplete = true; 54 }, 1000); 55 }, 56 hideLoadingBar() { 57 this.clearLoadingInterval(); 58 this.clearTimeout(); 59 this.loadingIndicatorValue = 0; 60 this.isLoadingComplete = true; 61 }, 62 clearLoadingInterval() { 63 if (this.loadingIntervalId) clearInterval(this.loadingIntervalId); 64 this.loadingIntervalId = null; 65 }, 66 clearTimeout() { 67 if (this.timeoutId) clearTimeout(this.timeoutId); 68 this.timeoutId = null; 69 } 70 } 71}; 72</script> 73 74<style lang="scss" scoped> 75.progress { 76 position: absolute; 77 left: 0; 78 right: 0; 79 bottom: -0.4rem; 80 opacity: 1; 81 transition: opacity $duration--moderate-01 $standard-easing--productive; 82 height: 0.4rem; 83 &.fade-enter, 84 &.fade-leave-to { 85 opacity: 0; 86 } 87} 88.progress-bar { 89 background-color: $loading-color; 90} 91</style> 92