158 lines
6.4 KiB
Vue
158 lines
6.4 KiB
Vue
<template>
|
|
<div class="ui segment">
|
|
<h3 class="ui header"><translate translate-context="Content/Library/Title">Current usage</translate></h3>
|
|
<div v-if="isLoading" :class="['ui', {'active': isLoading}, 'inverted', 'dimmer']">
|
|
<div class="ui text loader"><translate translate-context="Content/Library/Paragraph">Loading usage data…</translate></div>
|
|
</div>
|
|
<div :class="['ui', {'success': progress < 60}, {'yellow': progress >= 60 && progress < 96}, {'error': progress >= 95}, 'progress']">
|
|
<div class="bar" :style="{width: `${progress}%`}">
|
|
<div class="progress">{{ progress }}%</div>
|
|
</div>
|
|
<div class="label" v-if="quotaStatus">
|
|
<translate translate-context="Content/Library/Paragraph" :translate-params="{max: humanSize(quotaStatus.max * 1000 * 1000), current: humanSize(quotaStatus.current * 1000 * 1000)}">%{ current } used on %{ max } allowed</translate>
|
|
</div>
|
|
</div>
|
|
<div class="ui hidden divider"></div>
|
|
<div v-if="quotaStatus" class="ui stackable three column grid">
|
|
<div v-if="quotaStatus.pending > 0" class="column">
|
|
<div class="ui tiny yellow statistic">
|
|
<div class="value">
|
|
{{ humanSize(quotaStatus.pending * 1000 * 1000) }}
|
|
</div>
|
|
<div class="label">
|
|
<translate translate-context="Content/Library/Label">Pending files</translate>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<router-link
|
|
class="ui basic blue tiny button"
|
|
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'pending'}])}}">
|
|
<translate translate-context="Content/Library/Link/Verb">View files</translate>
|
|
</router-link>
|
|
|
|
<dangerous-button
|
|
color="grey"
|
|
class="basic tiny"
|
|
:action="purgePendingFiles">
|
|
<translate translate-context="Content/Library/Button.Label/Verb">Purge</translate>
|
|
<p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge pending files?</translate></p>
|
|
<p slot="modal-content"><translate translate-context="Popup/Library/Paragraph">Removes uploaded but yet to be processed tracks completely, adding the corresponding data to your quota.</translate></p>
|
|
<div slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Purge</translate></div>
|
|
</dangerous-button>
|
|
</div>
|
|
</div>
|
|
<div v-if="quotaStatus.skipped > 0" class="column">
|
|
<div class="ui tiny grey statistic">
|
|
<div class="value">
|
|
{{ humanSize(quotaStatus.skipped * 1000 * 1000) }}
|
|
</div>
|
|
<div class="label">
|
|
<translate translate-context="Content/Library/Label">Skipped files</translate>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<router-link
|
|
class="ui basic blue tiny button"
|
|
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'skipped'}])}}">
|
|
<translate translate-context="Content/Library/Link/Verb">View files</translate>
|
|
</router-link>
|
|
<dangerous-button
|
|
color="grey"
|
|
class="basic tiny"
|
|
:action="purgeSkippedFiles">
|
|
<translate translate-context="Content/Library/Button.Label/Verb">Purge</translate>
|
|
<p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge skipped files?</translate></p>
|
|
<p slot="modal-content"><translate translate-context="Popup/Library/Paragraph">Removes uploaded tracks skipped during the import processes completely, adding the corresponding data to your quota.</translate></p>
|
|
<div slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Purge</translate></div>
|
|
</dangerous-button>
|
|
</div>
|
|
</div>
|
|
<div v-if="quotaStatus.errored > 0" class="column">
|
|
<div class="ui tiny red statistic">
|
|
<div class="value">
|
|
{{ humanSize(quotaStatus.errored * 1000 * 1000) }}
|
|
</div>
|
|
<div class="label">
|
|
<translate translate-context="Content/Library/Label">Errored files</translate>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<router-link
|
|
class="ui basic blue tiny button"
|
|
:to="{name: 'content.libraries.files', query: {q: compileTokens([{field: 'status', value: 'errored'}])}}">
|
|
<translate translate-context="Content/Library/Link/Verb">View files</translate>
|
|
</router-link>
|
|
<dangerous-button
|
|
color="grey"
|
|
class="basic tiny"
|
|
:action="purgeErroredFiles">
|
|
<translate translate-context="Content/Library/Button.Label/Verb">Purge</translate>
|
|
<p slot="modal-header"><translate translate-context="Popup/Library/Title">Purge errored files?</translate></p>
|
|
<p slot="modal-content"><translate translate-context="Popup/Library/Paragraph">Removes uploaded tracks that could not be processed by the server completely, adding the corresponding data to your quota.</translate></p>
|
|
<div slot="modal-confirm"><translate translate-context="Popup/Library/Button.Label">Purge</translate></div>
|
|
</dangerous-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import axios from 'axios'
|
|
import {humanSize} from '@/filters'
|
|
import {compileTokens} from '@/search'
|
|
|
|
export default {
|
|
data () {
|
|
return {
|
|
quotaStatus: null,
|
|
isLoading: false,
|
|
humanSize,
|
|
compileTokens
|
|
}
|
|
},
|
|
created () {
|
|
this.fetch()
|
|
},
|
|
methods: {
|
|
fetch () {
|
|
let self = this
|
|
self.isLoading = true
|
|
axios.get('users/users/me/').then((response) => {
|
|
self.quotaStatus = response.data.quota_status
|
|
self.isLoading = false
|
|
})
|
|
},
|
|
purge (status) {
|
|
let self = this
|
|
let payload = {
|
|
action: 'delete',
|
|
objects: 'all',
|
|
filters: {
|
|
import_status: status
|
|
}
|
|
}
|
|
axios.post('uploads/action/', payload).then((response) => {
|
|
self.fetch()
|
|
})
|
|
},
|
|
purgeSkippedFiles () {
|
|
this.purge('skipped')
|
|
},
|
|
purgePendingFiles () {
|
|
this.purge('pending')
|
|
},
|
|
purgeErroredFiles () {
|
|
this.purge('errored')
|
|
},
|
|
},
|
|
computed: {
|
|
progress () {
|
|
if (!this.quotaStatus) {
|
|
return 0
|
|
}
|
|
return Math.min(parseInt(this.quotaStatus.current * 100 / this.quotaStatus.max), 100)
|
|
}
|
|
}
|
|
}
|
|
</script>
|