mirror of
https://github.com/webrecorder/pywb.git
synced 2025-03-24 06:59:52 +01:00
vue ui: added progress indicator/loader
This commit is contained in:
parent
0ff8df44cb
commit
173912f963
File diff suppressed because one or more lines are too long
@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app" :class="{expanded: showTimelineView}" data-app="webrecorder-replay-app">
|
<div class="app" :class="{expanded: showTimelineView}" data-app="webrecorder-replay-app">
|
||||||
|
<LoadingSpinner :text="'Loading...'" :is-loading="isLoading"/>
|
||||||
<div class="banner">
|
<div class="banner">
|
||||||
<div class="line">
|
<div class="line">
|
||||||
<div class="logo"><a href="/"><img :src="config.logoImg" style="max-width: 80px" /></a></div>
|
<div class="logo"><a href="/"><img :src="config.logoImg" style="max-width: 80px" /></a></div>
|
||||||
@ -57,6 +58,7 @@ import TimelineBreadcrumbs from "./components/TimelineBreadcrumbs.vue";
|
|||||||
import CalendarYear from "./components/CalendarYear.vue";
|
import CalendarYear from "./components/CalendarYear.vue";
|
||||||
|
|
||||||
import { PywbSnapshot, PywbPeriod } from "./model.js";
|
import { PywbSnapshot, PywbPeriod } from "./model.js";
|
||||||
|
import LoadingSpinner from "./components/LoadingSpinner.vue";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "PywbReplayApp",
|
name: "PywbReplayApp",
|
||||||
@ -74,10 +76,11 @@ export default {
|
|||||||
title: "",
|
title: "",
|
||||||
initialView: {}
|
initialView: {}
|
||||||
},
|
},
|
||||||
|
isLoading: true, // initially data is loading
|
||||||
timelineHighlight: false
|
timelineHighlight: false
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
components: {Timeline, TimelineBreadcrumbs, CalendarYear},
|
components: {LoadingSpinner, Timeline, TimelineBreadcrumbs, CalendarYear},
|
||||||
mounted: function() {
|
mounted: function() {
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
139
pywb/vueui/src/components/LoadingSpinner.vue
Normal file
139
pywb/vueui/src/components/LoadingSpinner.vue
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
<template>
|
||||||
|
<div class="pywb-loading-spinner-mask" :class="{hidden: isHidden, spinning: isSpinning}" @click="setOff">
|
||||||
|
<div class="pywb-loading-spinner">
|
||||||
|
<div data-loading-spinner="circle1"></div>
|
||||||
|
<div data-loading-spinner="circle2"></div>
|
||||||
|
<div data-loading-spinner="circle3"></div>
|
||||||
|
<div data-loading-spinner="circle4"></div>
|
||||||
|
<span data-loading-spinner="text">{{text}}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
let elStyle = null;
|
||||||
|
export default {
|
||||||
|
name: "LoadingSpinner",
|
||||||
|
props: ['text', 'isLoading'],
|
||||||
|
mounted() {
|
||||||
|
this.setOnOff();
|
||||||
|
this.$watch('isLoading', this.setOnOff);
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
isSpinning: '',
|
||||||
|
isHidden: ''
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
setOnOff() {
|
||||||
|
if (this.isLoading) {
|
||||||
|
this.setOn();
|
||||||
|
} else {
|
||||||
|
this.setOff();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setOn() {
|
||||||
|
this.isHidden = false;
|
||||||
|
setTimeout(function setSpinning() {
|
||||||
|
this.isSpinning = true;
|
||||||
|
}.bind(this), 100);
|
||||||
|
},
|
||||||
|
setOff() {
|
||||||
|
this.isSpinning = false;
|
||||||
|
setTimeout(function setHidden() {
|
||||||
|
this.isHidden = true;
|
||||||
|
}.bind(this), 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.pywb-loading-spinner-mask.spinning {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.pywb-loading-spinner-mask.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.pywb-loading-spinner-mask {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100vw;
|
||||||
|
height: 100vh;
|
||||||
|
z-index: 900;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
background-color: rgba(255,255,255, .85);
|
||||||
|
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 500ms ease-in;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pywb-loading-spinner {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
width: 200px;
|
||||||
|
height: 200px;
|
||||||
|
}
|
||||||
|
[data-loading-spinner^=circle] {
|
||||||
|
position: absolute;
|
||||||
|
border: 3px solid #444444;/* #0D4B9F; */
|
||||||
|
width: 70%;
|
||||||
|
height: 70%;
|
||||||
|
margin: 0;
|
||||||
|
border-radius: 50%;
|
||||||
|
border-left-color: transparent;
|
||||||
|
border-right-color: transparent;
|
||||||
|
animation: rotate 2s cubic-bezier(0.26, 1.36, 0.74, -0.29) infinite;
|
||||||
|
}
|
||||||
|
[data-loading-spinner=circle2] {
|
||||||
|
border: 3px solid #ddd;/* #E0EDFF; */
|
||||||
|
width: 80%;
|
||||||
|
height: 80%;
|
||||||
|
border-left-color: transparent;
|
||||||
|
border-right-color: transparent;
|
||||||
|
animation: rotate2 2s cubic-bezier(0.26, 1.36, 0.74, -0.29) infinite;
|
||||||
|
}
|
||||||
|
[data-loading-spinner=circle3] {
|
||||||
|
border: 3px solid #656565;/* #005CDC; */
|
||||||
|
width: 90%;
|
||||||
|
height: 90%;
|
||||||
|
border-left-color: transparent;
|
||||||
|
border-right-color: transparent;
|
||||||
|
animation: rotate 2s cubic-bezier(0.26, 1.36, 0.74, -0.29) infinite;
|
||||||
|
}
|
||||||
|
[data-loading-spinner=circle4] {
|
||||||
|
border: 3px solid #aaa; /* #94B6E5; */
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border-left-color: transparent;
|
||||||
|
border-right-color: transparent;
|
||||||
|
animation: rotate2 2s cubic-bezier(0.26, 1.36, 0.74, -0.29) infinite;
|
||||||
|
}
|
||||||
|
@keyframes rotate {
|
||||||
|
0% {
|
||||||
|
transform: rotateZ(-360deg)
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotateZ(0deg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes rotate2 {
|
||||||
|
0% {
|
||||||
|
transform: rotateZ(360deg)
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: rotateZ(0deg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[data-loading-spinner=text] {
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
x
Reference in New Issue
Block a user