Add progress bar page for Buefy theme
This commit is contained in:
parent
8410419717
commit
01182ef752
190
tailbone/templates/themes/falafel/progress.mako
Normal file
190
tailbone/templates/themes/falafel/progress.mako
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
## -*- coding: utf-8; -*-
|
||||||
|
<%namespace file="/base.mako" import="core_javascript" />
|
||||||
|
<%namespace file="/base.mako" import="core_styles" />
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||||
|
<title>${initial_msg or "Working"}...</title>
|
||||||
|
${core_javascript()}
|
||||||
|
${core_styles()}
|
||||||
|
</head>
|
||||||
|
<body style="height: 100%;">
|
||||||
|
|
||||||
|
<div id="whole-page-app">
|
||||||
|
<whole-page></whole-page>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/x-template" id="whole-page-template">
|
||||||
|
|
||||||
|
<section class="hero is-fullheight">
|
||||||
|
<div class="hero-body">
|
||||||
|
<div class="container">
|
||||||
|
|
||||||
|
<div style="display: flex;">
|
||||||
|
<div style="flex-grow: 1;"></div>
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<p class="block">
|
||||||
|
{{ progressMessage }} ... {{ totalDisplay }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="level">
|
||||||
|
|
||||||
|
<div class="level-item">
|
||||||
|
<b-progress size="is-large"
|
||||||
|
style="width: 400px;"
|
||||||
|
:max="progressMax"
|
||||||
|
:value="progressValue"
|
||||||
|
show-value
|
||||||
|
format="percent"
|
||||||
|
precision="0">
|
||||||
|
</b-progress>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
% if can_cancel:
|
||||||
|
<div class="level-item"
|
||||||
|
style="margin-left: 2rem;">
|
||||||
|
<b-button v-show="canCancel"
|
||||||
|
@click="cancelProgress()"
|
||||||
|
:disabled="cancelingProgress"
|
||||||
|
icon-pack="fas"
|
||||||
|
icon-left="ban">
|
||||||
|
{{ cancelingProgress ? "Canceling, please wait..." : "Cancel" }}
|
||||||
|
</b-button>
|
||||||
|
</div>
|
||||||
|
% endif
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div style="flex-grow: 1;"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
let WholePage = {
|
||||||
|
template: '#whole-page-template',
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
progressURL: '${url('progress', key=progress.key, _query={'sessiontype': progress.session.type})}',
|
||||||
|
progressMessage: "${(initial_msg or "Working").replace('"', '\\"')} (please wait)",
|
||||||
|
progressMax: null,
|
||||||
|
progressMaxDisplay: null,
|
||||||
|
progressValue: null,
|
||||||
|
stillInProgress: true,
|
||||||
|
|
||||||
|
% if can_cancel:
|
||||||
|
canCancel: true,
|
||||||
|
cancelURL: '${url('progress.cancel', key=progress.key, _query={'sessiontype': progress.session.type})}',
|
||||||
|
cancelingProgress: false,
|
||||||
|
% endif
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
|
||||||
|
totalDisplay() {
|
||||||
|
|
||||||
|
% if can_cancel:
|
||||||
|
if (!this.stillInProgress && !this.cancelingProgress) {
|
||||||
|
% else:
|
||||||
|
if (!this.stillInProgress) {
|
||||||
|
% endif
|
||||||
|
return "done!"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.progressMaxDisplay) {
|
||||||
|
return `(${'$'}{this.progressMaxDisplay} total)`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
|
||||||
|
// fetch first progress data, one second from now
|
||||||
|
setTimeout(() => {
|
||||||
|
this.updateProgress()
|
||||||
|
}, 1000)
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
updateProgress() {
|
||||||
|
|
||||||
|
this.$http.get(this.progressURL).then(response => {
|
||||||
|
|
||||||
|
if (response.data.error) {
|
||||||
|
// errors stop the show, we redirect to "cancel" page
|
||||||
|
location.href = '${cancel_url}'
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (response.data.complete || response.data.maximum) {
|
||||||
|
this.progressMessage = response.data.message
|
||||||
|
this.progressMaxDisplay = response.data.maximum_display
|
||||||
|
|
||||||
|
if (response.data.complete) {
|
||||||
|
this.progressValue = this.progressMax
|
||||||
|
this.stillInProgress = false
|
||||||
|
% if can_cancel:
|
||||||
|
this.canCancel = false
|
||||||
|
% endif
|
||||||
|
|
||||||
|
location.href = response.data.success_url
|
||||||
|
|
||||||
|
} else {
|
||||||
|
this.progressValue = response.data.value
|
||||||
|
this.progressMax = response.data.maximum
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.stillInProgress) {
|
||||||
|
|
||||||
|
// fetch progress data again, in one second from now
|
||||||
|
setTimeout(() => {
|
||||||
|
this.updateProgress()
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
% if can_cancel:
|
||||||
|
|
||||||
|
cancelProgress() {
|
||||||
|
|
||||||
|
if (confirm("Do you really wish to cancel this operation?")) {
|
||||||
|
|
||||||
|
this.cancelingProgress = true
|
||||||
|
this.stillInProgress = false
|
||||||
|
|
||||||
|
let params = {cancel_msg: ${json.dumps(cancel_msg)|n}}
|
||||||
|
this.$http.get(this.cancelURL, {params: params}).then(response => {
|
||||||
|
location.href = ${json.dumps(cancel_url)|n}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
% endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Vue.component('whole-page', WholePage)
|
||||||
|
|
||||||
|
new Vue({
|
||||||
|
el: '#whole-page-app'
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Reference in a new issue