206 lines
5.5 KiB
Vue
206 lines
5.5 KiB
Vue
<template>
|
|
<modal
|
|
v-model:show="$store.state.channels.showUploadModal"
|
|
class="small"
|
|
>
|
|
<h4 class="header">
|
|
<translate
|
|
v-if="step === 1"
|
|
key="1"
|
|
translate-context="Popup/Channels/Title/Verb"
|
|
>
|
|
Publish audio
|
|
</translate>
|
|
<translate
|
|
v-else-if="step === 2"
|
|
key="2"
|
|
translate-context="Popup/Channels/Title"
|
|
>
|
|
Files to upload
|
|
</translate>
|
|
<translate
|
|
v-else-if="step === 3"
|
|
key="3"
|
|
translate-context="Popup/Channels/Title"
|
|
>
|
|
Upload details
|
|
</translate>
|
|
<translate
|
|
v-else-if="step === 4"
|
|
key="4"
|
|
translate-context="Popup/Channels/Title"
|
|
>
|
|
Processing uploads
|
|
</translate>
|
|
</h4>
|
|
<div class="scrolling content">
|
|
<channel-upload-form
|
|
ref="uploadForm"
|
|
:channel="$store.state.channels.uploadModalConfig.channel"
|
|
@step="step = $event"
|
|
@loading="isLoading = $event"
|
|
@published="$store.commit('channels/publish', $event)"
|
|
@status="statusData = $event"
|
|
@submittable="submittable = $event"
|
|
/>
|
|
</div>
|
|
<div class="actions">
|
|
<div class="left floated text left align">
|
|
<template v-if="statusData && step >= 2">
|
|
{{ statusInfo.join(' · ') }}
|
|
</template>
|
|
<div class="ui very small hidden divider" />
|
|
<template v-if="statusData && statusData.quotaStatus">
|
|
<translate translate-context="Content/Library/Paragraph">
|
|
Remaining storage space:
|
|
</translate>
|
|
{{ (statusData.quotaStatus.remaining * 1000 * 1000) - humanSize(statusData.uploadedSize) }}
|
|
</template>
|
|
</div>
|
|
<div class="ui hidden clearing divider mobile-only" />
|
|
<button
|
|
v-if="step === 1"
|
|
class="ui basic cancel button"
|
|
>
|
|
<translate translate-context="*/*/Button.Label/Verb">
|
|
Cancel
|
|
</translate>
|
|
</button>
|
|
<button
|
|
v-else-if="step < 3"
|
|
class="ui basic button"
|
|
@click.stop.prevent="$refs.uploadForm.step -= 1"
|
|
>
|
|
<translate translate-context="*/*/Button.Label/Verb">
|
|
Previous step
|
|
</translate>
|
|
</button>
|
|
<button
|
|
v-else-if="step === 3"
|
|
class="ui basic button"
|
|
@click.stop.prevent="$refs.uploadForm.step -= 1"
|
|
>
|
|
<translate translate-context="*/*/Button.Label/Verb">
|
|
Update
|
|
</translate>
|
|
</button>
|
|
<button
|
|
v-if="step === 1"
|
|
class="ui primary button"
|
|
@click.stop.prevent="$refs.uploadForm.step += 1"
|
|
>
|
|
<translate translate-context="*/*/Button.Label">
|
|
Next step
|
|
</translate>
|
|
</button>
|
|
<div
|
|
v-if="step === 2"
|
|
class="ui primary buttons"
|
|
>
|
|
<button
|
|
:class="['ui', 'primary button', {loading: isLoading}]"
|
|
type="submit"
|
|
:disabled="!statusData || !statusData.canSubmit || null"
|
|
@click.prevent.stop="$refs.uploadForm.publish"
|
|
>
|
|
<translate translate-context="*/Channels/Button.Label">
|
|
Publish
|
|
</translate>
|
|
</button>
|
|
<button
|
|
ref="dropdown"
|
|
v-dropdown
|
|
class="ui floating dropdown icon button"
|
|
:disabled="!statusData || !statusData.canSubmit || null"
|
|
>
|
|
<i class="dropdown icon" />
|
|
<div class="menu">
|
|
<div
|
|
role="button"
|
|
class="basic item"
|
|
@click="update(false)"
|
|
>
|
|
<translate translate-context="Content/*/Button.Label/Verb">
|
|
Finish later
|
|
</translate>
|
|
</div>
|
|
</div>
|
|
</button>
|
|
</div>
|
|
<button
|
|
v-if="step === 4"
|
|
class="ui basic cancel button"
|
|
@click="update(false)"
|
|
>
|
|
<translate translate-context="*/*/Button.Label/Verb">
|
|
Close
|
|
</translate>
|
|
</button>
|
|
</div>
|
|
</modal>
|
|
</template>
|
|
|
|
<script>
|
|
import Modal from '~/components/semantic/Modal.vue'
|
|
import ChannelUploadForm from '~/components/channels/UploadForm.vue'
|
|
import { humanSize } from '~/utils/filters'
|
|
import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
|
|
|
|
export default {
|
|
components: {
|
|
Modal,
|
|
ChannelUploadForm
|
|
},
|
|
setup () {
|
|
const guard = () => {
|
|
this.$store.commit('channels/showUploadModal', { show: false })
|
|
}
|
|
|
|
onBeforeRouteUpdate(guard)
|
|
onBeforeRouteLeave(guard)
|
|
|
|
return { humanSize }
|
|
},
|
|
data () {
|
|
return {
|
|
step: 1,
|
|
isLoading: false,
|
|
submittable: true,
|
|
statusData: null
|
|
}
|
|
},
|
|
computed: {
|
|
labels () {
|
|
return {}
|
|
},
|
|
statusInfo () {
|
|
if (!this.statusData) {
|
|
return []
|
|
}
|
|
const info = []
|
|
if (this.statusData.totalSize) {
|
|
info.push(humanSize(this.statusData.totalSize))
|
|
}
|
|
if (this.statusData.totalFiles) {
|
|
const msg = this.$npgettext('*/*/*', '%{ count } file', '%{ count } files', this.statusData.totalFiles)
|
|
info.push(
|
|
this.$gettextInterpolate(msg, { count: this.statusData.totalFiles })
|
|
)
|
|
}
|
|
if (this.statusData.progress) {
|
|
info.push(`${this.statusData.progress}%`)
|
|
}
|
|
if (this.statusData.speed) {
|
|
info.push(`${humanSize(this.statusData.speed)}/s`)
|
|
}
|
|
return info
|
|
}
|
|
},
|
|
methods: {
|
|
update (v) {
|
|
this.$store.commit('channels/showUploadModal', { show: v })
|
|
}
|
|
}
|
|
}
|
|
</script>
|