mirror of
https://github.com/VueTorrent/VueTorrent.git
synced 2025-04-03 23:35:10 +03:00
358 lines
9.8 KiB
Vue
358 lines
9.8 KiB
Vue
<template>
|
|
<v-dialog
|
|
v-model="dialog"
|
|
:transition="dTransition"
|
|
:content-class="phoneLayout ? 'rounded-0' : 'rounded-form'"
|
|
max-width="500px"
|
|
:fullscreen="phoneLayout"
|
|
persistent
|
|
>
|
|
<div
|
|
class="noselect"
|
|
style="
|
|
position:fixed;
|
|
left:0;
|
|
top:0;
|
|
width:100%;
|
|
height:100%;
|
|
"
|
|
@drop.prevent="addDropFile"
|
|
@dragover.prevent="showWrapDrag = true"
|
|
@dragend.prevent="showWrapDrag = false"
|
|
@dragleave.prevent="DragLeave"
|
|
/>
|
|
<v-card
|
|
style="height:100%"
|
|
:class="showWrapDrag ? 'wrap-drag' : ''"
|
|
@drop.prevent="addDropFile"
|
|
@dragover.prevent="showWrapDrag = true"
|
|
@dragend.prevent="showWrapDrag = false"
|
|
>
|
|
<v-container :class="`pa-0 project done`">
|
|
<v-card-title class="justify-center">
|
|
<v-toolbar flat dense class="transparent">
|
|
<v-toolbar-title class="mx-auto">
|
|
<h2>{{ $t('modals.add.title') }}</h2>
|
|
</v-toolbar-title>
|
|
<v-btn
|
|
fab
|
|
small
|
|
class="transparent elevation-0"
|
|
@click="close"
|
|
>
|
|
<v-icon>{{ mdiClose }}</v-icon>
|
|
</v-btn>
|
|
</v-toolbar>
|
|
</v-card-title>
|
|
<v-card-text class="pb-0">
|
|
<v-form ref="form" v-model="valid">
|
|
<v-container>
|
|
<v-row no-gutters>
|
|
<v-col ref="fileZone">
|
|
<v-file-input
|
|
v-if="!urls"
|
|
v-model="files"
|
|
color="deep-purple accent-4"
|
|
counter
|
|
:label="$t('modals.add.selectFiles')"
|
|
multiple
|
|
:prepend-icon="mdiPaperclip"
|
|
:rules="fileInputRules"
|
|
outlined
|
|
:show-size="1000"
|
|
>
|
|
<template
|
|
#selection="{ index, text }"
|
|
>
|
|
<v-chip
|
|
v-if="index < 2"
|
|
color="deep-purple accent-4"
|
|
dark
|
|
label
|
|
small
|
|
>
|
|
{{ text }}
|
|
</v-chip>
|
|
<span
|
|
v-else-if="index === 2"
|
|
class="overline grey--text text--darken-3 mx-2"
|
|
>
|
|
+{{
|
|
files.length - 2
|
|
}}
|
|
File(s)
|
|
</span>
|
|
</template>
|
|
</v-file-input>
|
|
<v-textarea
|
|
v-if="files.length == 0"
|
|
v-model="urls"
|
|
style="max-height: 200px; overflow-x: hidden; overflow-y: auto"
|
|
:label="$t('url')"
|
|
:prepend-icon="mdiLink"
|
|
rows="1"
|
|
required
|
|
:autofocus="!phoneLayout"
|
|
auto-grow
|
|
clearable
|
|
:hint="$t('modals.add.urlHint')"
|
|
/>
|
|
</v-col>
|
|
</v-row>
|
|
|
|
<v-combobox
|
|
v-model="category"
|
|
:items="availableCategories"
|
|
clearable
|
|
:label="$t('category')"
|
|
item-text="name"
|
|
:prepend-icon="mdiTag"
|
|
@input="categoryChanged"
|
|
/>
|
|
|
|
<v-text-field
|
|
v-model="directory"
|
|
:disabled="autoTMM"
|
|
:label="$t('modals.add.downloadDirectory')"
|
|
:prepend-icon="mdiFolder"
|
|
autocomplete="download-directory"
|
|
name="download-directory"
|
|
/>
|
|
<v-row no-gutters>
|
|
<v-flex xs12 sm6>
|
|
<v-checkbox
|
|
v-model="start"
|
|
:label="$t('modals.add.starttorrent')"
|
|
hide-details
|
|
/>
|
|
</v-flex>
|
|
<v-flex xs12 sm6>
|
|
<v-checkbox
|
|
v-model="skip_checking"
|
|
:label="$t('modals.add.skipHashCheck')"
|
|
hide-details
|
|
/>
|
|
</v-flex>
|
|
<v-flex xs12 sm6>
|
|
<v-checkbox
|
|
v-model="root_folder"
|
|
:label="$t('modals.add.createSubfolder')"
|
|
hide-details
|
|
/>
|
|
</v-flex>
|
|
<v-flex xs12 sm6>
|
|
<v-checkbox
|
|
v-model="autoTMM"
|
|
:label="$t('modals.add.automaticTorrentManagement')"
|
|
hide-details
|
|
/>
|
|
</v-flex>
|
|
</v-row>
|
|
</v-container>
|
|
</v-form>
|
|
</v-card-text>
|
|
|
|
<v-spacer />
|
|
<v-form>
|
|
<v-card-actions class="justify-center">
|
|
<v-btn
|
|
text
|
|
:disabled="!valid"
|
|
class="accent white--text mx-0 mt-3"
|
|
@click="submit"
|
|
>
|
|
Add Torrent
|
|
</v-btn>
|
|
<v-fab-transition v-if="phoneLayout">
|
|
<v-btn
|
|
color="red"
|
|
dark
|
|
absolute
|
|
bottom
|
|
right
|
|
@click="close"
|
|
>
|
|
<v-icon>{{ mdiClose }}</v-icon>
|
|
</v-btn>
|
|
</v-fab-transition>
|
|
</v-card-actions>
|
|
</v-form>
|
|
</v-container>
|
|
</v-card>
|
|
<div
|
|
v-show="showWrapDrag"
|
|
class="wrap-drag noselect"
|
|
style="
|
|
position:fixed;
|
|
left:0;
|
|
top:0;
|
|
width:100%;
|
|
height:100%;
|
|
text-align:center;
|
|
background-color: rgb(0,0,0,.5)
|
|
"
|
|
>
|
|
<div class="align white--text">
|
|
<div>
|
|
<v-icon size="40" class="white--text">
|
|
{{ mdiCloudUpload }}
|
|
</v-icon>
|
|
</div>
|
|
<div>
|
|
<h3>{{ $t('modals.add.dropHereForAdd') }}</h3>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</v-dialog>
|
|
</template>
|
|
|
|
<script>
|
|
import { mapGetters } from 'vuex'
|
|
import Modal from '@/mixins/Modal'
|
|
import qbit from '@/services/qbit'
|
|
import { mdiCloudUpload, mdiFolder, mdiTag, mdiPaperclip, mdiLink, mdiClose } from '@mdi/js'
|
|
import { FullScreenModal } from '@/mixins'
|
|
export default {
|
|
name: 'AddModal',
|
|
mixins: [Modal, FullScreenModal],
|
|
props: ['initialMagnet', 'openSuddenly'],
|
|
data() {
|
|
return {
|
|
dTransition: 'scale-transition',
|
|
hndlDialog: true,
|
|
showWrapDrag: false,
|
|
files: [],
|
|
category: null,
|
|
directory: '',
|
|
start: true,
|
|
skip_checking: false,
|
|
root_folder: true,
|
|
autoTMM: true,
|
|
fileInputRules: [
|
|
v => {
|
|
const result = v.every(f => {
|
|
if (f.type) return f.type === 'application/x-bittorrent'
|
|
else return /^.*\.torrent$/.test(f.name)
|
|
})
|
|
|
|
return result ? result : this.$i18n.t('modals.add.oneOrMoreFilesInvalidTorrent')
|
|
}
|
|
],
|
|
loading: false,
|
|
urls: null,
|
|
valid: false,
|
|
mdiCloudUpload, mdiFolder, mdiTag, mdiPaperclip, mdiLink, mdiClose
|
|
}
|
|
},
|
|
computed: {
|
|
...mapGetters(['getSettings', 'getCategories']),
|
|
validFile() {
|
|
return this.Files.length > 0
|
|
},
|
|
phoneLayout() {
|
|
return this.$vuetify.breakpoint.xsOnly
|
|
},
|
|
savepath() {
|
|
let savePath = this.getSettings().save_path
|
|
if (this.category) {
|
|
savePath = this.category.savePath
|
|
}
|
|
|
|
return savePath
|
|
},
|
|
availableCategories() {
|
|
return this.getCategories()
|
|
}
|
|
},
|
|
created() {
|
|
this.$store.commit('FETCH_SETTINGS')
|
|
this.$store.commit('FETCH_CATEGORIES')
|
|
this.urls = this.initialMagnet
|
|
this.setSettings()
|
|
if (this.openSuddenly == true) {
|
|
this.dTransition = 'none'
|
|
}
|
|
},
|
|
mounted() {
|
|
this.dTransition = 'scale-transition'
|
|
},
|
|
methods: {
|
|
setSettings() {
|
|
const settings = this.getSettings()
|
|
this.start = !settings.start_paused_enabled
|
|
this.autoTMM = settings.auto_tmm_enabled
|
|
this.root_folder = settings.create_subfolder_enabled
|
|
},
|
|
addDropFile(e) {
|
|
this.showWrapDrag = false
|
|
if (!this.urls)
|
|
this.files.push(...Array.from(e.dataTransfer.files))
|
|
},
|
|
startDropFile() {
|
|
this.showWrapDrag = true
|
|
},
|
|
DragLeave(e) {
|
|
this.showWrapDrag = false
|
|
},
|
|
closeWrap() {
|
|
if (this.showWrapDrag)
|
|
this.showWrapDrag = false
|
|
else
|
|
this.close()
|
|
},
|
|
submit() {
|
|
if (this.files.length || this.urls) {
|
|
const torrents = []
|
|
const params = {
|
|
urls: null,
|
|
paused: !this.start,
|
|
skip_checking: this.skip_checking,
|
|
root_folder: this.root_folder,
|
|
autoTMM: this.autoTMM
|
|
}
|
|
if (this.files.length) torrents.push(...this.files)
|
|
if (this.urls) params.urls = this.urls
|
|
if (this.category) params.category = this.category.name
|
|
if (!this.autoTMM) params.savepath = this.directory
|
|
|
|
qbit.addTorrents(params, torrents)
|
|
|
|
this.resetForm()
|
|
|
|
this.$store.commit('DELETE_MODAL', this.guid)
|
|
}
|
|
},
|
|
categoryChanged() {
|
|
if (this.autoTMM) this.directory = this.savepath
|
|
},
|
|
resetForm() {
|
|
this.url = null
|
|
this.files = []
|
|
this.category = null
|
|
this.directory = this.savepath
|
|
this.skip_checking = null
|
|
},
|
|
close() {
|
|
this.dialog = false
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.wrap-drag {
|
|
pointer-events: none;
|
|
}
|
|
.wrap-drag .align {
|
|
margin: -.5em 0 0;
|
|
position: absolute;
|
|
top: 50%;
|
|
left: 0;
|
|
right: 0;
|
|
-webkit-transform: translateY(-50%);
|
|
-ms-transform: translateY(-50%);
|
|
transform: translateY(-50%);
|
|
color: #fff;
|
|
padding: 0;
|
|
}
|
|
</style>
|