Add a loading icon for deck upload

This commit is contained in:
Adam Goldsmith 2019-01-06 10:20:42 -05:00
parent a4bd5f0605
commit adced87ca3
2 changed files with 36 additions and 2 deletions

View File

@ -4,6 +4,7 @@
<div id="controls"> <div id="controls">
<div> <div>
<button type="button" @click="upload"> Save Deck </button> <button type="button" @click="upload"> Save Deck </button>
<Loader :loading="uploading"></Loader>
Download: Download:
<button type="button" @click="jsonInputDownload"> <button type="button" @click="jsonInputDownload">
Input JSON Input JSON
@ -57,14 +58,16 @@
<script> <script>
import yaml from 'js-yaml'; import yaml from 'js-yaml';
import Deck from './Deck.vue'; import Deck from './Deck.vue';
import Loader from './Loader.vue';
export default { export default {
name: 'Editor', name: 'Editor',
components: {Deck}, components: {Deck, Loader},
props: ['deckID'], props: ['deckID'],
data() { data() {
return { return {
uploading: false,
selected: null, selected: null,
deckInfo: {meta: {name: "", type: ""}, deckInfo: {meta: {name: "", type: ""},
cards: {}}, cards: {}},
@ -119,6 +122,7 @@
upload() { upload() {
// POST the inputed json to the server // POST the inputed json to the server
this.uploading = true;
fetch('/upload', { fetch('/upload', {
method: 'post', method: 'post',
headers: {'Content-Type': 'application/json'}, headers: {'Content-Type': 'application/json'},
@ -129,7 +133,10 @@
css: document.styleSheets[0].href, css: document.styleSheets[0].href,
})}) })})
.then(r => r.json()) .then(r => r.json())
.then(j => this.$router.replace('/edit/' + j.id)) .then(j => {
this.$router.replace('/edit/' + j.id);
this.uploading = false;
})
.catch(err => console.log('Failed to upload' + err)); .catch(err => console.log('Failed to upload' + err));
}, },
}, },

27
src/Loader.vue Normal file
View File

@ -0,0 +1,27 @@
<template>
<div v-show="loading" class="loader"> </div>
</template>
<script>
export default {
name: "Loader",
props: ['loading'],
}
</script>
<style>
.loader {
display: inline-block;
border: .33em solid #f3f3f3; /* Light grey */
border-top: .33em solid #3498db; /* Blue */
border-radius: 50%;
width: .33em;
height: .33em;
animation: spin 2s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>