perf: Add missing fields in dashboard / sortOptions (#713) @Larsluph

This commit is contained in:
Rémi Marseault 2023-03-19 10:34:38 +01:00 committed by GitHub
parent ba77afb35d
commit 57b9acaeef
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
52 changed files with 1474 additions and 381 deletions

View file

@ -54,6 +54,7 @@
import draggable from 'vuedraggable' import draggable from 'vuedraggable'
import { mdiMenu } from '@mdi/js' import { mdiMenu } from '@mdi/js'
import { i18n } from '@/plugins/i18n' import { i18n } from '@/plugins/i18n'
import { mapState } from 'vuex'
export default { export default {
name: 'VDesktopCard', name: 'VDesktopCard',
@ -64,41 +65,23 @@ export default {
mdiMenu mdiMenu
}), }),
computed: { computed: {
...mapState(['webuiSettings']),
busyDesktopTorrentProperties() { busyDesktopTorrentProperties() {
return this.injectLocalization(this.$store.state.webuiSettings.busyDesktopTorrentProperties) return this.injectLocalization(this.webuiSettings.busyDesktopTorrentProperties)
}, },
doneDesktopTorrentProperties() { doneDesktopTorrentProperties() {
return this.injectLocalization(this.$store.state.webuiSettings.doneDesktopTorrentProperties) return this.injectLocalization(this.webuiSettings.doneDesktopTorrentProperties)
} }
}, },
methods: { methods: {
injectLocalization(properties) { injectLocalization(properties) {
const localePrefix = 'modals.settings.pageVueTorrent.properties' properties.forEach(property => {
const localeMap = { // convert component name from PascalCase to snake_case to match locale key
Size: i18n.t(`${localePrefix}.size`), const value = property.name
Progress: i18n.t(`${localePrefix}.progress`), .replace(/\.?([A-Z]+)/g, (x, y) => "_" + y.toLowerCase())
Download: i18n.t(`${localePrefix}.downloadSpeed`), .replace(/^_/, "")
Upload: i18n.t(`${localePrefix}.uploadSpeed`), property.label = i18n.t(`torrent.properties.${value}`)
Downloaded: i18n.t(`${localePrefix}.downloaded`), })
Directory: i18n.t(`${localePrefix}.save_path`),
Uploaded: i18n.t(`${localePrefix}.uploaded`),
ETA: i18n.t(`${localePrefix}.ETA`),
Peers: i18n.t(`${localePrefix}.peers`),
Seeds: i18n.t(`${localePrefix}.seeds`),
Status: i18n.t(`${localePrefix}.state`),
Ratio: i18n.t(`${localePrefix}.ratio`),
Tracker: i18n.t(`${localePrefix}.tracker`),
Category: i18n.t(`${localePrefix}.category`),
Tags: i18n.t(`${localePrefix}.tags`),
AddedOn: i18n.t(`${localePrefix}.addedOn`),
Availability: i18n.t(`${localePrefix}.availability`),
LastActivity: i18n.t(`${localePrefix}.last_activity`),
CompletedOn: i18n.t(`${localePrefix}.completion_on`),
GlobalSpeed: i18n.t(`${localePrefix}.globalSpeed`),
GlobalVolume: i18n.t(`${localePrefix}.globalVolume`)
}
properties.forEach(property => (property.label = localeMap[property.name]))
return properties return properties
} }
} }

View file

@ -276,6 +276,7 @@ export default {
const ajv = new Ajv() const ajv = new Ajv()
const validate = ajv.compile(StoreStateSchema) const validate = ajv.compile(StoreStateSchema)
isValidJson = validate(userState) isValidJson = validate(userState)
console.error(validate.errors)
} catch (e) { } catch (e) {
console.error(e) console.error(e)
isValidJson = false isValidJson = false

View file

@ -61,24 +61,12 @@ export default {
}, },
methods: { methods: {
injectLocalization(properties) { injectLocalization(properties) {
const localePrefix = 'modals.settings.pageVueTorrent.properties' properties.forEach(property => {
const localeMap = { const value = property.name
Size: i18n.t(`${localePrefix}.size`), .replace(/\.?([A-Z]+)/g, (x, y) => "_" + y.toLowerCase())
Progress: i18n.t(`${localePrefix}.progress`), .replace(/^_/, "")
Download: i18n.t(`${localePrefix}.downloadSpeed`), property.label = i18n.t(`torrent.properties.${value}`)
Upload: i18n.t(`${localePrefix}.uploadSpeed`), })
ETA: i18n.t(`${localePrefix}.ETA`),
Peers: i18n.t(`${localePrefix}.peers`),
Seeds: i18n.t(`${localePrefix}.seeds`),
Status: i18n.t(`${localePrefix}.state`),
Ratio: i18n.t(`${localePrefix}.ratio`),
Uploaded: i18n.t(`${localePrefix}.uploaded`),
Tracker: i18n.t(`${localePrefix}.tracker`),
Category: i18n.t(`${localePrefix}.category`),
Tags: i18n.t(`${localePrefix}.tags`)
}
properties.forEach(property => (property.label = localeMap[property.name]))
return properties return properties
} }
} }

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm2> <v-flex xs6 sm2>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('torrent.added') | titleCase }} {{ $t('torrent.properties.added_on') | titleCase }}
</div> </div>
<div>{{ torrent.added_on }}</div> <div>{{ torrent.added_on }}</div>
</v-flex> </v-flex>

View file

@ -0,0 +1,25 @@
<template>
<v-flex xs6 sm1 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.amount_left') | titleCase }}
</div>
<div>
{{ torrent.amount_left | getDataValue(2) }}
<span class="caption grey--text">
{{ torrent.amount_left | getDataUnit }}
</span>
</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'AmountLeft',
props: {
torrent: Torrent
}
})
</script>

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('torrent.availability') | titleCase }} {{ $t('torrent.properties.availability') | titleCase }}
</div> </div>
<div> <div>
{{ availability }} {{ availability }}

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex v-if="torrent.category" xs6 sm1 md1> <v-flex v-if="torrent.category" xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('category') }} {{ $t('torrent.properties.category') }}
</div> </div>
<v-chip small class="upload white--text caption"> <v-chip small class="upload white--text caption">
{{ torrent.category }} {{ torrent.category }}

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm2> <v-flex xs6 sm2>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('torrent.completed_on') | titleCase }} {{ $t('torrent.properties.completed_on') | titleCase }}
</div> </div>
<div>{{ torrent.completed_on }}</div> <div>{{ torrent.completed_on }}</div>
</v-flex> </v-flex>

View file

@ -0,0 +1,20 @@
<template>
<v-flex xs6 sm1 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.content_path') | titleCase }}
</div>
<div>{{ torrent.content_path }}</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'ContentPath',
props: {
torrent: Torrent
}
})
</script>

View file

@ -0,0 +1,23 @@
<template>
<v-flex xs6 sm1 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.download_limit') | titleCase }}
</div>
<div>
{{ torrent.dl_limit | getDataValue(1) }}
<span class="caption grey--text"> {{ torrent.dl_limit | getDataUnit }}/s </span>
</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'DownloadLimit',
props: {
torrent: Torrent
}
})
</script>

View file

@ -0,0 +1,20 @@
<template>
<v-flex xs6 sm1 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.download_path') | titleCase }}
</div>
<div>{{ torrent.download_path }}</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'DownloadPath',
props: {
torrent: Torrent
}
})
</script>

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('download') }} {{ $t('torrent.properties.download_speed') }}
</div> </div>
<div> <div>
{{ torrent.dlspeed | getDataValue(1) }} {{ torrent.dlspeed | getDataValue(1) }}
@ -15,7 +15,7 @@ import { defineComponent } from 'vue'
import { Torrent } from '@/models' import { Torrent } from '@/models'
export default defineComponent({ export default defineComponent({
name: 'Download', name: 'DownloadSpeed',
props: { props: {
torrent: Torrent torrent: Torrent
} }

View file

@ -1,12 +1,12 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('downloaded') }} {{ $t('torrent.properties.downloaded') }}
</div> </div>
<div> <div>
{{ torrent.dloaded | getDataValue(2) }} {{ torrent.downloaded | getDataValue(2) }}
<span class="caption grey--text"> <span class="caption grey--text">
{{ torrent.dloaded | getDataUnit }} {{ torrent.downloaded | getDataUnit }}
</span> </span>
</div> </div>
</v-flex> </v-flex>

View file

@ -0,0 +1,25 @@
<template>
<v-flex xs6 sm1 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.downloaded_session') | titleCase }}
</div>
<div>
{{ torrent.downloaded_session | getDataValue(2) }}
<span class="caption grey--text">
{{ torrent.downloaded_session | getDataUnit }}
</span>
</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'DownloadedSession',
props: {
torrent: Torrent
}
})
</script>

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('ETA') }} {{ $t('torrent.properties.eta') }}
</div> </div>
<div> <div>
{{ torrent.eta }} {{ torrent.eta }}

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('globalSpeed') }} {{ $t('torrent.properties.global_speed') }}
</div> </div>
<div> <div>
{{ torrent.globalSpeed | getDataValue(1) }} {{ torrent.globalSpeed | getDataValue(1) }}

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('globalVolume') }} {{ $t('torrent.properties.global_volume') }}
</div> </div>
<div> <div>
{{ torrent.globalVolume | getDataValue }} {{ torrent.globalVolume | getDataValue }}

View file

@ -0,0 +1,20 @@
<template>
<v-flex xs6 sm1 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.hash') | titleCase }}
</div>
<div>{{ torrent.hash }}</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'Hash',
props: {
torrent: Torrent
}
})
</script>

View file

@ -0,0 +1,20 @@
<template>
<v-flex xs6 sm1 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.info_hash_v1') | titleCase }}
</div>
<div>{{ torrent.infohash_v1 }}</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'InfoHashV1',
props: {
torrent: Torrent
}
})
</script>

View file

@ -0,0 +1,20 @@
<template>
<v-flex xs6 sm1 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.info_hash_v2') | titleCase }}
</div>
<div>{{ torrent.infohash_v2 }}</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'InfoHashV2',
props: {
torrent: Torrent
}
})
</script>

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm1> <v-flex xs6 sm1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('torrent.last_activity') | titleCase }} {{ $t('torrent.properties.last_activity') | titleCase }}
</div> </div>
<div>{{ torrent.last_activity }}</div> <div>{{ torrent.last_activity }}</div>
</v-flex> </v-flex>

View file

@ -1,11 +1,11 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('peers') }} {{ $t('torrent.properties.peers') }}
</div> </div>
<div> <div>
{{ torrent.num_leechs }} {{ torrent.num_leechs }}
<span class="grey--text caption"> /{{ torrent.available_peers }} </span> <span class="grey--text caption"> / {{ torrent.available_peers }} </span>
</div> </div>
</v-flex> </v-flex>
</template> </template>
@ -15,7 +15,7 @@ import { defineComponent } from 'vue'
import { Torrent } from '@/models' import { Torrent } from '@/models'
export default defineComponent({ export default defineComponent({
name: 'DashboardPeers', name: 'Peers',
props: { props: {
torrent: Torrent torrent: Torrent
} }

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs12 sm1 md1 class="mr-4"> <v-flex xs12 sm1 md1 class="mr-4">
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('torrent.progress') | titleCase }} {{ $t('torrent.properties.progress') | titleCase }}
</div> </div>
<v-progress-linear :value="torrent.progress" height="20" :style="phoneLayout ? '' : 'width: 80%;'" :color="`torrent-${state}`" rounded> <v-progress-linear :value="torrent.progress" height="20" :style="phoneLayout ? '' : 'width: 80%;'" :color="`torrent-${state}`" rounded>
<span class="caption white--text"> {{ torrent.progress }}% </span> <span class="caption white--text"> {{ torrent.progress }}% </span>

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('ratio') }} {{ $t('torrent.properties.ratio') }}
</div> </div>
<div>{{ torrent.ratio }}</div> <div>{{ torrent.ratio }}</div>
</v-flex> </v-flex>

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 md2 sm1> <v-flex xs6 md2 sm1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('torrent.directory') | titleCase }} {{ $t('torrent.properties.save_path') | titleCase }}
</div> </div>
<div class="truncate" :title="torrent.savePath"> <div class="truncate" :title="torrent.savePath">
{{ torrent.savePath }} {{ torrent.savePath }}
@ -14,7 +14,7 @@ import { defineComponent } from 'vue'
import { Torrent } from '@/models' import { Torrent } from '@/models'
export default defineComponent({ export default defineComponent({
name: 'Directory', name: 'SavePath',
props: { props: {
torrent: Torrent torrent: Torrent
} }

View file

@ -1,11 +1,11 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('seeds') }} {{ $t('torrent.properties.seeds') }}
</div> </div>
<div> <div>
{{ torrent.num_seeds }} {{ torrent.num_seeds }}
<span class="grey--text caption"> /{{ torrent.available_seeds }} </span> <span class="grey--text caption"> / {{ torrent.available_seeds }} </span>
</div> </div>
</v-flex> </v-flex>
</template> </template>

View file

@ -0,0 +1,20 @@
<template>
<v-flex xs6 sm1 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.seen_complete') | titleCase }}
</div>
<div>{{ torrent.seen_complete }}</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'SeenComplete',
props: {
torrent: Torrent
}
})
</script>

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('torrent.size') | titleCase }} {{ $t('torrent.properties.size') | titleCase }}
</div> </div>
<div> <div>
{{ torrent.size | getDataValue }} {{ torrent.size | getDataValue }}

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('status') }} {{ $t('torrent.properties.status') }}
</div> </div>
<v-chip style="height: 1.3em" class="caption white--text px-2" :class="state"> <v-chip style="height: 1.3em" class="caption white--text px-2" :class="state">
{{ stateString }} {{ stateString }}

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex v-if="torrent.tags && torrent.tags.length" xs6 sm2> <v-flex v-if="torrent.tags && torrent.tags.length" xs6 sm2>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('tags') }} {{ $t('torrent.properties.tags') }}
</div> </div>
<v-row wrap class="ma-0"> <v-row wrap class="ma-0">
<v-chip v-for="tag in torrent.tags" :key="tag" small class="tags white--text caption mb-1 mx-1"> <v-chip v-for="tag in torrent.tags" :key="tag" small class="tags white--text caption mb-1 mx-1">

View file

@ -0,0 +1,20 @@
<template>
<v-flex xs6 sm2 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.time_active') | titleCase }}
</div>
<div>{{ torrent.time_active }}</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'TimeActive',
props: {
torrent: Torrent
}
})
</script>

View file

@ -0,0 +1,25 @@
<template>
<v-flex xs6 sm1 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.total_size') | titleCase }}
</div>
<div>
{{ torrent.total_size | getDataValue }}
<span class="caption grey--text">
{{ torrent.total_size | getDataUnit }}
</span>
</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'TotalSize',
props: {
torrent: Torrent
}
})
</script>

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex v-if="torrent.tracker" xs6 sm1 md1> <v-flex v-if="torrent.tracker" xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('tracker') }} {{ $t('torrent.properties.tracker') }}
</div> </div>
<v-chip small class="moving white--text caption"> <v-chip small class="moving white--text caption">
{{ trackerString }} {{ trackerString }}
@ -23,7 +23,7 @@ export default defineComponent({
}, },
computed: { computed: {
trackerString() { trackerString() {
return getDomainBody(this.torrent.tracker) return getDomainBody(this.torrent?.tracker)
} }
} }
}) })

View file

@ -0,0 +1,20 @@
<template>
<v-flex xs6 sm1 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.trackers_count') | titleCase }}
</div>
<div>{{ torrent.trackers_count }}</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'TrackersCount',
props: {
torrent: Torrent
}
})
</script>

View file

@ -0,0 +1,23 @@
<template>
<v-flex xs6 sm1 md1>
<div class="caption grey--text">
{{ $t('torrent.properties.upload_limit') }}
</div>
<div>
{{ torrent.up_limit | getDataValue(1) }}
<span class="caption grey--text"> {{ torrent.up_limit | getDataUnit(1) }}/s </span>
</div>
</v-flex>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { Torrent } from '@/models'
export default defineComponent({
name: 'UploadLimit',
props: {
torrent: Torrent
}
})
</script>

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('upload') }} {{ $t('torrent.properties.upload_speed') }}
</div> </div>
<div> <div>
{{ torrent.upspeed | getDataValue(1) }} {{ torrent.upspeed | getDataValue(1) }}
@ -15,7 +15,7 @@ import { defineComponent } from 'vue'
import { Torrent } from '@/models' import { Torrent } from '@/models'
export default defineComponent({ export default defineComponent({
name: 'Upload', name: 'UploadSpeed',
props: { props: {
torrent: Torrent torrent: Torrent
} }

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm1 md1> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('uploaded') }} {{ $t('torrent.properties.uploaded') }}
</div> </div>
<div> <div>
{{ torrent.uploaded | getDataValue }} {{ torrent.uploaded | getDataValue }}

View file

@ -1,7 +1,7 @@
<template> <template>
<v-flex xs6 sm2 md2> <v-flex xs6 sm1 md1>
<div class="caption grey--text"> <div class="caption grey--text">
{{ $t('torrent.uploadedSession') }} {{ $t('torrent.properties.uploaded_session') | titleCase }}
</div> </div>
<div> <div>
{{ torrent.uploaded_session | getDataValue }} {{ torrent.uploaded_session | getDataValue }}

View file

@ -1,47 +1,73 @@
import Size from './Size.vue'
import Progress from './Progress.vue'
import Download from './Download.vue'
import Downloaded from './Downloaded.vue'
import Directory from './Directory.vue'
import Ratio from './Ratio.vue'
import Upload from './Upload.vue'
import ETA from './ETA.vue'
import Peers from './Peers.vue'
import Seeds from './Seeds.vue'
import Status from './Status.vue'
import Tracker from './Tracker.vue'
import Category from './Category.vue'
import Tags from './Tags.vue'
import AddedOn from './AddedOn.vue' import AddedOn from './AddedOn.vue'
import Uploaded from './Uploaded.vue' import AmountLeft from './AmountLeft.vue'
import UploadedSession from './UploadedSession.vue'
import Availability from './Availability.vue' import Availability from './Availability.vue'
import LastActivity from './LastActivity.vue' import Category from './Category.vue'
import CompletedOn from './CompletedOn.vue' import CompletedOn from './CompletedOn.vue'
import ContentPath from './ContentPath.vue'
import DownloadLimit from './DownloadLimit.vue'
import DownloadPath from './DownloadPath.vue'
import DownloadSpeed from './DownloadSpeed.vue'
import Downloaded from './Downloaded.vue'
import DownloadedSession from './DownloadedSession.vue'
import ETA from './ETA.vue'
import GlobalSpeed from './GlobalSpeed.vue' import GlobalSpeed from './GlobalSpeed.vue'
import GlobalVolume from './GlobalVolume.vue' import GlobalVolume from './GlobalVolume.vue'
import Hash from './Hash.vue'
import InfoHashV1 from './InfoHashV1.vue'
import InfoHashV2 from './InfoHashV2.vue'
import LastActivity from './LastActivity.vue'
import Peers from './Peers.vue'
import Progress from './Progress.vue'
import Ratio from './Ratio.vue'
import SavePath from './SavePath.vue'
import Seeds from './Seeds.vue'
import SeenComplete from './SeenComplete.vue'
import Size from './Size.vue'
import Status from './Status.vue'
import Tags from './Tags.vue'
import TimeActive from './TimeActive.vue'
import TotalSize from './TotalSize.vue'
import Tracker from './Tracker.vue'
import TrackersCount from './TrackersCount.vue'
import UploadLimit from './UploadLimit.vue'
import UploadSpeed from './UploadSpeed.vue'
import Uploaded from './Uploaded.vue'
import UploadedSession from './UploadedSession.vue'
export { export {
Size,
CompletedOn,
LastActivity,
Progress,
Download,
Directory,
Ratio,
Upload,
ETA,
Peers,
Seeds,
Status,
Tracker,
Category,
Tags,
AddedOn, AddedOn,
Uploaded, AmountLeft,
UploadedSession,
Downloaded,
Availability, Availability,
Category,
CompletedOn,
ContentPath,
DownloadLimit,
DownloadPath,
DownloadSpeed,
Downloaded,
DownloadedSession,
ETA,
GlobalSpeed, GlobalSpeed,
GlobalVolume GlobalVolume,
Hash,
InfoHashV1,
InfoHashV2,
LastActivity,
Peers,
Progress,
Ratio,
SavePath,
Seeds,
SeenComplete,
Size,
Status,
Tags,
TimeActive,
TotalSize,
Tracker,
TrackersCount,
UploadLimit,
UploadSpeed,
Uploaded,
UploadedSession
} }

View file

@ -22,8 +22,8 @@
<v-flex xs12 class="pa-0 ma-1 row spangap"> <v-flex xs12 class="pa-0 ma-1 row spangap">
<span v-if="isSizeActive"> <span v-if="isSizeActive">
<span class="downloaded"> <span class="downloaded">
<span class="body-2">{{ torrent.dloaded | getDataValue }} </span> <span class="body-2">{{ torrent.downloaded | getDataValue }} </span>
<span class="grey--text caption">{{ torrent.dloaded | getDataUnit }}</span> <span class="grey--text caption">{{ torrent.downloaded | getDataUnit }}</span>
</span> </span>
<span class="grey--text caption">/</span> <span class="grey--text caption">/</span>
<span class="size"> <span class="size">
@ -58,14 +58,14 @@
<div v-if="isPeersActive" class="caption grey--text">{{ torrent.num_leechs }}/{{ torrent.available_peers }} peers</div> <div v-if="isPeersActive" class="caption grey--text">{{ torrent.num_leechs }}/{{ torrent.available_peers }} peers</div>
<v-spacer /> <v-spacer />
<div> <div>
<span v-if="isDownloadActive && torrent.dlspeed"> <span v-if="isDownloadSpeedActive && torrent.dlspeed">
<v-icon small class="grey--text"> <v-icon small class="grey--text">
{{ mdiChevronDown }} {{ mdiChevronDown }}
</v-icon> </v-icon>
<span class="caption font-weight-medium grey--text">{{ torrent.dlspeed | getDataValue(1) }} </span> <span class="caption font-weight-medium grey--text">{{ torrent.dlspeed | getDataValue(1) }} </span>
<span class="caption grey--text" style="font-size: 0.6em !important"> {{ torrent.dlspeed | getDataUnit }}/s </span> <span class="caption grey--text" style="font-size: 0.6em !important"> {{ torrent.dlspeed | getDataUnit }}/s </span>
</span> </span>
<span v-if="isUploadActive && torrent.upspeed"> <span v-if="isUploadSpeedActive && torrent.upspeed">
<v-icon small class="grey--text"> <v-icon small class="grey--text">
{{ mdiChevronUp }} {{ mdiChevronUp }}
</v-icon> </v-icon>
@ -141,11 +141,11 @@ export default {
isPeersActive() { isPeersActive() {
return this.properties.find(e => e.name === DashboardProperty.PEERS).active return this.properties.find(e => e.name === DashboardProperty.PEERS).active
}, },
isDownloadActive() { isDownloadSpeedActive() {
return this.properties.find(e => e.name === DashboardProperty.DOWNLOAD).active return this.properties.find(e => e.name === DashboardProperty.DOWNLOAD_SPEED).active
}, },
isUploadActive() { isUploadSpeedActive() {
return this.properties.find(e => e.name === DashboardProperty.UPLOAD).active return this.properties.find(e => e.name === DashboardProperty.UPLOAD_SPEED).active
} }
} }
} }

View file

@ -58,8 +58,8 @@
{{ $t('torrent.downloaded') | titleCase }} {{ $t('torrent.downloaded') | titleCase }}
</td> </td>
<td> <td>
{{ torrent.dloaded | getDataValue }} {{ torrent.downloaded | getDataValue }}
{{ torrent.dloaded | getDataUnit(1) }} {{ torrent.downloaded | getDataUnit(1) }}
</td> </td>
</tr> </tr>
<tr> <tr>

View file

@ -1,23 +1,37 @@
export enum DashboardProperty { export enum DashboardProperty {
SIZE = 'Size',
PROGRESS = 'Progress',
DOWNLOAD = 'Download',
UPLOAD = 'Upload',
DOWNLOADED = 'Downloaded',
DIRECTORY = 'Directory',
UPLOADED = 'Uploaded',
ETA = 'ETA',
PEERS = 'Peers',
SEEDS = 'Seeds',
STATUS = 'Status',
RATIO = 'Ratio',
TRACKER = 'Tracker',
CATEGORY = 'Category',
TAGS = 'Tags',
ADDED_ON = 'AddedOn', ADDED_ON = 'AddedOn',
AMOUNT_LEFT = 'AmountLeft',
AVAILABILITY = 'Availability', AVAILABILITY = 'Availability',
LAST_ACTIVITY = 'LastActivity', CATEGORY = 'Category',
COMPLETED_ON = 'CompletedOn', COMPLETED_ON = 'CompletedOn',
CONTENT_PATH = 'ContentPath',
DOWNLOAD_SPEED = 'DownloadSpeed',
DOWNLOADED = 'Downloaded',
DOWNLOADED_SESSION = 'DownloadedSession',
DOWNLOAD_LIMIT = 'DownloadLimit',
DOWNLOAD_PATH = 'DownloadPath',
ETA = 'ETA',
GLOBAL_SPEED = 'GlobalSpeed', GLOBAL_SPEED = 'GlobalSpeed',
GLOBAL_VOLUME = 'GlobalVolume' GLOBAL_VOLUME = 'GlobalVolume',
HASH = 'Hash',
INFOHASH_V1 = 'InfoHashV1',
INFOHASH_V2 = 'InfoHashV2',
LAST_ACTIVITY = 'LastActivity',
PEERS = 'Peers',
PROGRESS = 'Progress',
RATIO = 'Ratio',
SAVE_PATH = 'SavePath',
SEEDS = 'Seeds',
SEEN_COMPLETE = 'SeenComplete',
SIZE = 'Size',
STATUS = 'Status',
TAGS = 'Tags',
TIME_ACTIVE = 'TimeActive',
TOTAL_SIZE = 'TotalSize',
TRACKER = 'Tracker',
TRACKERS_COUND = 'TrackersCount',
UPLOAD_LIMIT = 'UploadLimit',
UPLOAD_SPEED = 'UploadSpeed',
UPLOADED = 'Uploaded',
UPLOADED_SESSION = 'UploadedSession'
} }

View file

@ -59,9 +59,48 @@
"selectAll": "Select All", "selectAll": "Select All",
"selectAllCaption": "Select / Release All (Ctrl + A)" "selectAllCaption": "Select / Release All (Ctrl + A)"
}, },
"emptyTorrentList": "Nothing to see here!" "emptyTorrentList": "Nothing to see here!",
"not_complete": "Not Yet Completed"
}, },
"torrent": { "torrent": {
"properties": {
"added_on": "Added On",
"amount_left": "Amount Left",
"availability": "Availability",
"category": "Category",
"completed_on": "Completed On",
"content_path": "Content Path",
"download_limit": "Download Limit",
"download_speed": "Download Speed",
"downloaded": "Downloaded (global)",
"downloaded_session": "Downloaded (session)",
"download_path": "Download Path",
"eta": "ETA",
"global_speed": "Global Speed",
"global_volume": "Global Volume",
"hash": "Hash",
"info_hash_v1": "Infohash v1",
"info_hash_v2": "Infohash v2",
"last_activity": "Last Activity",
"peers": "Peers",
"priority": "Priority",
"progress": "Progress",
"ratio": "Ratio",
"save_path": "Save Path",
"seeds": "Seeds",
"seen_complete": "Seen Complete",
"size": "Size",
"status": "Status",
"tags": "Tags",
"time_active": "Time Active",
"total_size": "Total Size",
"tracker": "Tracker",
"trackers_count": "Trackers Count",
"upload_limit": "Upload Limit",
"upload_speed": "Upload Speed",
"uploaded": "Uploaded (global)",
"uploaded_session": "Uploaded (session)"
},
"title": "Title", "title": "Title",
"added": "Added On", "added": "Added On",
"availability": "Availability", "availability": "Availability",
@ -464,30 +503,58 @@
"title": "Sort Torrents", "title": "Sort Torrents",
"reverse": "Reverse", "reverse": "Reverse",
"sortBy": { "sortBy": {
"default": "Default",
"added_on": "Added On",
"amount_left": "Amount Left",
"auto_tmm": "Auto TMM",
"availability": "Availability", "availability": "Availability",
"category": "Category", "category": "Category",
"completed": "Completed", "completed": "Completed",
"completion_on": "Completed On", "completion_on": "Completed On",
"downloaded": "Downloaded", "content_path": "Content Path",
"ETA": "ETA", "dl_limit": "Download Limit",
"name": "Name", "dlspeed": "Download Speed",
"default": "Default", "download_path": "Download Path",
"downloaded": "Downloaded (Global)",
"downloaded_session": "Downloaded (Session)",
"eta": "ETA",
"f_l_piece_prio": "First / Last Piece Priority",
"force_start": "Force Start",
"globalSpeed": "Global Speed",
"globalVolume": "Global Volume",
"hash": "Hash",
"infohash_v1": "Infohash v1",
"infohash_v2": "Infohash v2",
"last_activity": "Last Activity", "last_activity": "Last Activity",
"peers": "Peers", "magnet_uri": "Magnet URI",
"max_ratio": "Max Ratio",
"max_seeding_time": "Max Seeding Time",
"name": "Name",
"num_complete": "Seeds (swarm)",
"num_incomplete": "Peers (swarm)",
"num_leechs": "Peers (connected)",
"num_seeds": "Seeds (connected)",
"priority": "Priority", "priority": "Priority",
"progress": "Progress", "progress": "Progress",
"ratio": "Ratio", "ratio": "Ratio",
"save_path": "Directory", "ratio_limit": "Ratio Limit",
"seeds": "Seeds", "save_path": "Save Path",
"seeding_time": "Seeding Time",
"seeding_time_limit": "Seeding Time Limit",
"seen_complete": "Seen Complete",
"seq_dl": "Sequential Download",
"size": "Size", "size": "Size",
"state": "State", "state": "State",
"uploaded": "Uploaded", "super_seeding": "Super Seeding",
"addedOn": "Added On", "tags": "Tags",
"downloadSpeed": "Download Speed", "time_active": "Time Active",
"timeActive": "Time Active", "total_size": "Total Size",
"uploadSpeed": "Upload Speed", "tracker": "Tracker",
"globalSpeed": "Global Speed", "trackers_count": "Trackers Count",
"globalVolume": "Global Volume" "up_limit": "Upload Limit",
"uploaded": "Uploaded (Global)",
"uploaded_session": "Uploaded (Session)",
"upspeed": "Upload Speed"
} }
}, },
"speedLimit": { "speedLimit": {
@ -516,7 +583,7 @@
"pasteNotSupported": "Unable to paste, context isn't secured", "pasteNotSupported": "Unable to paste, context isn't secured",
"shutdownSuccess": "qBittorrent was shutdown successfully!", "shutdownSuccess": "qBittorrent was shutdown successfully!",
"shutdownError": "Unable to shutdown app. Make sure qBittorrent is running!", "shutdownError": "Unable to shutdown app. Make sure qBittorrent is running!",
"invalidJson": "Invalid JSON!" "invalidJson": "Invalid JSON! Check console for details"
}, },
"rightClick": { "rightClick": {
"resume": "resume", "resume": "resume",

View file

@ -1,9 +1,10 @@
import dayjs from 'dayjs' import dayjs from 'dayjs'
import duration from 'dayjs/plugin/duration' import duration from 'dayjs/plugin/duration'
import relativeTime from 'dayjs/plugin/relativeTime' import relativeTime from 'dayjs/plugin/relativeTime'
import { TorrentState as QbitTorrentState } from '@/enums/qbit' import {Priority, TorrentState as QbitTorrentState} from '@/enums/qbit'
import { TorrentState as VtTorrentState } from '@/enums/vuetorrent' import { TorrentState as VtTorrentState } from '@/enums/vuetorrent'
import type { Torrent as QbitTorrent } from '@/types/qbit/models' import type { Torrent as QbitTorrent } from '@/types/qbit/models'
import i18n from "@/plugins/i18n";
dayjs.extend(duration) dayjs.extend(duration)
dayjs.extend(relativeTime) dayjs.extend(relativeTime)
@ -13,88 +14,112 @@ const durationFormat = 'D[d] H[h] m[m] s[s]'
export default class Torrent { export default class Torrent {
static computedValues = ['globalSpeed', 'globalVolume'] static computedValues = ['globalSpeed', 'globalVolume']
name: string
size: number
added_on: string added_on: string
amount_left: number
auto_tmm: boolean
availability: number
available_peers: number
available_seeds: number
category: string
completed_on: string completed_on: string
content_path: string
dl_limit: number
dlspeed: number dlspeed: number
dloaded: number download_path: string
upspeed: number downloaded: number
uploaded: number downloaded_session : number
uploaded_session: number
eta: string eta: string
f_l_piece_prio: boolean
forced: boolean
hash: string
infohash_v1: string
infohash_v2: string
last_activity: string
magnet: string
name: string
num_leechs: number num_leechs: number
num_seeds: number num_seeds: number
state: VtTorrentState priority: Priority
hash: string
available_seeds: number
available_peers: number
savePath: string
progress: number progress: number
ratio: number ratio: number
tags: string[] | null
category: string
tracker: string
f_l_piece_prio: boolean
seq_dl: boolean
auto_tmm: boolean
dl_limit: number
up_limit: number
ratio_limit: number ratio_limit: number
ratio_time_limit: number ratio_time_limit: number
availability: number savePath: string
forced: boolean
magnet: string
time_active: string
seeding_time: string | null seeding_time: string | null
last_activity: string seen_complete: string
seq_dl: boolean
size: number
state: VtTorrentState
super_seeding: boolean
tags: string[] | null
time_active: string
total_size: number
tracker: string
trackers_count: number
up_limit: number
uploaded: number
uploaded_session: number
upspeed: number
globalSpeed: number globalSpeed: number
globalVolume: number globalVolume: number
constructor(data: QbitTorrent, format = 'DD/MM/YYYY, HH:mm:ss') { constructor(data: QbitTorrent, format = 'DD/MM/YYYY, HH:mm:ss') {
this.name = data.name
this.size = data.size
this.added_on = dayjs(data.added_on * 1000).format(format) this.added_on = dayjs(data.added_on * 1000).format(format)
this.completed_on = dayjs(data.completion_on * 1000).format(format) this.amount_left = data.amount_left
this.auto_tmm = data.auto_tmm
this.availability = Math.round(data.availability * 100) / 100
this.available_peers = data.num_incomplete
this.available_seeds = data.num_complete
this.category = data.category
this.completed_on = data.completion_on > 0
? dayjs(data.completion_on * 1000).format(format)
: i18n.t('dashboard.not_complete').toString()
this.content_path = data.content_path
this.dl_limit = data.dl_limit
this.dlspeed = data.dlspeed this.dlspeed = data.dlspeed
this.dloaded = data.completed this.download_path = data.download_path
this.upspeed = data.upspeed this.downloaded = data.downloaded
this.uploaded = data.uploaded this.downloaded_session = data.downloaded_session
this.uploaded_session = data.uploaded_session
this.eta = this.formatEta(data.eta) this.eta = this.formatEta(data.eta)
this.f_l_piece_prio = data.f_l_piece_prio
this.forced = data.force_start
this.hash = data.hash
this.infohash_v1 = data.infohash_v1
this.infohash_v2 = data.infohash_v2
this.last_activity = dayjs(data.last_activity * 1000).fromNow()
this.magnet = data.magnet_uri
this.name = data.name
this.num_leechs = data.num_leechs this.num_leechs = data.num_leechs
this.num_seeds = data.num_seeds this.num_seeds = data.num_seeds
this.state = this.formatState(data.state) this.priority = data.priority
this.hash = data.hash
this.available_seeds = data.num_complete
this.available_peers = data.num_incomplete
this.savePath = data.save_path
this.progress = Math.round(data.progress * 10000) / 100 this.progress = Math.round(data.progress * 10000) / 100
this.ratio = Math.round(data.ratio * 100) / 100 this.ratio = Math.round(data.ratio * 100) / 100
this.tags = data.tags.length > 0 ? data.tags.split(', ').map(t => t.trim()) : null
this.category = data.category
this.tracker = data.tracker
this.f_l_piece_prio = data.f_l_piece_prio
this.seq_dl = data.seq_dl
this.auto_tmm = data.auto_tmm
this.dl_limit = data.dl_limit
this.up_limit = data.up_limit
this.ratio_limit = data.max_ratio this.ratio_limit = data.max_ratio
this.ratio_time_limit = data.max_seeding_time this.ratio_time_limit = data.max_seeding_time
this.availability = Math.round(data.availability * 100) / 100 this.savePath = data.save_path
this.forced = data.state.includes('forced')
this.magnet = data.magnet_uri
this.time_active = dayjs.duration(data.time_active, 'seconds').format(durationFormat)
this.seeding_time = data.seeding_time > 0 ? dayjs.duration(data.seeding_time, 'seconds').format(durationFormat) : null this.seeding_time = data.seeding_time > 0 ? dayjs.duration(data.seeding_time, 'seconds').format(durationFormat) : null
this.last_activity = dayjs(data.last_activity * 1000).fromNow() this.seen_complete = dayjs(data.seen_complete * 1000).format(format)
this.seq_dl = data.seq_dl
this.size = data.size
this.state = this.formatState(data.state)
this.super_seeding = data.super_seeding
this.tags = data.tags.length > 0 ? data.tags.split(', ').map(t => t.trim()) : null
this.time_active = dayjs.duration(data.time_active, 'seconds').format(durationFormat)
this.total_size = data.total_size
this.tracker = data.tracker
this.trackers_count = data.trackers_count
this.up_limit = data.up_limit
this.uploaded = data.uploaded
this.uploaded_session = data.uploaded_session
this.upspeed = data.upspeed
// computed values // computed values
this.globalSpeed = this.dlspeed + this.upspeed this.globalSpeed = this.dlspeed + this.upspeed
this.globalVolume = this.dloaded + this.uploaded this.globalVolume = this.downloaded + this.uploaded
Object.freeze(this) Object.freeze(this)
} }
formatState(state: QbitTorrentState): VtTorrentState { private formatState(state: QbitTorrentState): VtTorrentState {
switch (state) { switch (state) {
case QbitTorrentState.FORCED_DL: case QbitTorrentState.FORCED_DL:
case QbitTorrentState.DOWNLOADING: case QbitTorrentState.DOWNLOADING:
@ -130,7 +155,7 @@ export default class Torrent {
} }
} }
formatEta(value: number): string { private formatEta(value: number): string {
const options = { dayLimit: 100 } const options = { dayLimit: 100 }
const minute = 60 const minute = 60
const hour = minute * 60 const hour = minute * 60

View file

@ -80,35 +80,49 @@ export const StoreStateSchema: JSONSchemaType<PersistentStoreState> = {
$id: '/schemas/desktopDashboardProperties', $id: '/schemas/desktopDashboardProperties',
type: 'array', type: 'array',
uniqueItems: true, uniqueItems: true,
minItems: 21, minItems: 35,
maxItems: 21, maxItems: 35,
items: { items: {
type: 'object', type: 'object',
properties: { properties: {
name: { name: {
type: 'string', type: 'string',
enum: [ enum: [
DashboardProperty.SIZE,
DashboardProperty.PROGRESS,
DashboardProperty.DOWNLOAD,
DashboardProperty.UPLOAD,
DashboardProperty.DOWNLOADED,
DashboardProperty.DIRECTORY,
DashboardProperty.UPLOADED,
DashboardProperty.ETA,
DashboardProperty.PEERS,
DashboardProperty.SEEDS,
DashboardProperty.STATUS,
DashboardProperty.RATIO,
DashboardProperty.TRACKER,
DashboardProperty.CATEGORY,
DashboardProperty.TAGS,
DashboardProperty.ADDED_ON, DashboardProperty.ADDED_ON,
DashboardProperty.AMOUNT_LEFT,
DashboardProperty.AVAILABILITY, DashboardProperty.AVAILABILITY,
DashboardProperty.LAST_ACTIVITY, DashboardProperty.CATEGORY,
DashboardProperty.COMPLETED_ON, DashboardProperty.COMPLETED_ON,
DashboardProperty.CONTENT_PATH,
DashboardProperty.DOWNLOAD_SPEED,
DashboardProperty.DOWNLOADED,
DashboardProperty.DOWNLOADED_SESSION,
DashboardProperty.DOWNLOAD_LIMIT,
DashboardProperty.DOWNLOAD_PATH,
DashboardProperty.ETA,
DashboardProperty.GLOBAL_SPEED, DashboardProperty.GLOBAL_SPEED,
DashboardProperty.GLOBAL_VOLUME DashboardProperty.GLOBAL_VOLUME,
DashboardProperty.HASH,
DashboardProperty.INFOHASH_V1,
DashboardProperty.INFOHASH_V2,
DashboardProperty.LAST_ACTIVITY,
DashboardProperty.PEERS,
DashboardProperty.PROGRESS,
DashboardProperty.RATIO,
DashboardProperty.SAVE_PATH,
DashboardProperty.SEEDS,
DashboardProperty.SEEN_COMPLETE,
DashboardProperty.SIZE,
DashboardProperty.STATUS,
DashboardProperty.TAGS,
DashboardProperty.TIME_ACTIVE,
DashboardProperty.TOTAL_SIZE,
DashboardProperty.TRACKER,
DashboardProperty.TRACKERS_COUND,
DashboardProperty.UPLOAD_LIMIT,
DashboardProperty.UPLOAD_SPEED,
DashboardProperty.UPLOADED,
DashboardProperty.UPLOADED_SESSION
] ]
}, },
active: { type: 'boolean' } active: { type: 'boolean' }
@ -130,8 +144,8 @@ export const StoreStateSchema: JSONSchemaType<PersistentStoreState> = {
enum: [ enum: [
DashboardProperty.SIZE, DashboardProperty.SIZE,
DashboardProperty.PROGRESS, DashboardProperty.PROGRESS,
DashboardProperty.DOWNLOAD, DashboardProperty.DOWNLOAD_SPEED,
DashboardProperty.UPLOAD, DashboardProperty.UPLOAD_SPEED,
DashboardProperty.ETA, DashboardProperty.ETA,
DashboardProperty.PEERS, DashboardProperty.PEERS,
DashboardProperty.SEEDS, DashboardProperty.SEEDS,

View file

@ -25,10 +25,10 @@ Vue.use(Vuex)
const desktopPropertiesTemplate = [ const desktopPropertiesTemplate = [
{ name: DashboardProperty.SIZE, active: true }, { name: DashboardProperty.SIZE, active: true },
{ name: DashboardProperty.PROGRESS, active: true }, { name: DashboardProperty.PROGRESS, active: true },
{ name: DashboardProperty.DOWNLOAD, active: true }, { name: DashboardProperty.DOWNLOAD_SPEED, active: true },
{ name: DashboardProperty.UPLOAD, active: true }, { name: DashboardProperty.UPLOAD_SPEED, active: true },
{ name: DashboardProperty.DOWNLOADED, active: true }, { name: DashboardProperty.DOWNLOADED, active: true },
{ name: DashboardProperty.DIRECTORY, active: false }, { name: DashboardProperty.SAVE_PATH, active: false },
{ name: DashboardProperty.UPLOADED, active: true }, { name: DashboardProperty.UPLOADED, active: true },
{ name: DashboardProperty.ETA, active: true }, { name: DashboardProperty.ETA, active: true },
{ name: DashboardProperty.PEERS, active: true }, { name: DashboardProperty.PEERS, active: true },
@ -42,6 +42,20 @@ const desktopPropertiesTemplate = [
{ name: DashboardProperty.AVAILABILITY, active: true }, { name: DashboardProperty.AVAILABILITY, active: true },
{ name: DashboardProperty.LAST_ACTIVITY, active: false }, { name: DashboardProperty.LAST_ACTIVITY, active: false },
{ name: DashboardProperty.COMPLETED_ON, active: false }, { name: DashboardProperty.COMPLETED_ON, active: false },
{ name: DashboardProperty.AMOUNT_LEFT, active: false },
{ name: DashboardProperty.CONTENT_PATH, active: false },
{ name: DashboardProperty.DOWNLOADED_SESSION, active: false },
{ name: DashboardProperty.DOWNLOAD_LIMIT, active: false },
{ name: DashboardProperty.DOWNLOAD_PATH, active: false },
{ name: DashboardProperty.HASH, active: false },
{ name: DashboardProperty.INFOHASH_V1, active: false },
{ name: DashboardProperty.INFOHASH_V2, active: false },
{ name: DashboardProperty.SEEN_COMPLETE, active: false },
{ name: DashboardProperty.TIME_ACTIVE, active: false },
{ name: DashboardProperty.TOTAL_SIZE, active: false },
{ name: DashboardProperty.TRACKERS_COUND, active: false },
{ name: DashboardProperty.UPLOADED_SESSION, active: false },
{ name: DashboardProperty.UPLOAD_LIMIT, active: false },
{ name: DashboardProperty.GLOBAL_SPEED, active: false }, { name: DashboardProperty.GLOBAL_SPEED, active: false },
{ name: DashboardProperty.GLOBAL_VOLUME, active: false } { name: DashboardProperty.GLOBAL_VOLUME, active: false }
] ]
@ -58,8 +72,8 @@ const mobilePropertiesTemplate = [
{ name: DashboardProperty.ETA, active: true }, { name: DashboardProperty.ETA, active: true },
{ name: DashboardProperty.SEEDS, active: true }, { name: DashboardProperty.SEEDS, active: true },
{ name: DashboardProperty.PEERS, active: true }, { name: DashboardProperty.PEERS, active: true },
{ name: DashboardProperty.DOWNLOAD, active: true }, { name: DashboardProperty.DOWNLOAD_SPEED, active: true },
{ name: DashboardProperty.UPLOAD, active: true } { name: DashboardProperty.UPLOAD_SPEED, active: true }
] ]
export default new Vuex.Store<StoreState>({ export default new Vuex.Store<StoreState>({

View file

@ -1,92 +1,103 @@
import type { TorrentState } from '@/enums/qbit' import type { TorrentState } from '@/enums/qbit'
import {Priority} from "@/enums/qbit";
export default interface Torrent { export default interface Torrent {
// Time (Unix Epoch) when the torrent was added to the client /** Time (Unix Epoch) when the torrent was added to the client */
added_on: number added_on: number
// Amount of data left to download (bytes) /** Amount of data left to download (bytes) */
amount_left: number amount_left: number
// Whether this torrent is managed by Automatic Torrent Management /** Whether this torrent is managed by Automatic Torrent Management */
auto_tmm: boolean auto_tmm: boolean
// Percentage of file pieces currently available /** Percentage of file pieces currently available */
availability: number availability: number
// Category of the torrent /** Category of the torrent */
category: string category: string
// Amount of transfer data completed (bytes) /** Amount of transfer data completed (bytes) */
completed: number completed: number
// Time (Unix Epoch) when the torrent completed /** Time (Unix Epoch) when the torrent completed */
completion_on: number completion_on: number
// Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents) /** Absolute path of torrent content (root path for multifile torrents, absolute file path for singlefile torrents) */
content_path: string content_path: string
// Torrent download speed limit (bytes/s). -1 if ulimited. /** Torrent download speed limit (bytes/s). -1 if unlimited. */
dl_limit: number dl_limit: number
// Torrent download speed (bytes/s) /** Torrent download speed (bytes/s) */
dlspeed: number dlspeed: number
// Amount of data downloaded /** TODO */
download_path: string
/** Amount of data downloaded */
downloaded: number downloaded: number
// Amount of data downloaded this session /** Amount of data downloaded this session */
downloaded_session: number downloaded_session: number
// Torrent ETA (seconds) /** Torrent ETA (seconds) */
eta: number eta: number
// True if first last piece are prioritized /** True if first last piece are prioritized */
f_l_piece_prio: boolean f_l_piece_prio: boolean
// True if force start is enabled for this torrent /** True if force start is enabled for this torrent */
force_start: boolean force_start: boolean
// Torrent hash /** Torrent hash */
hash: string hash: string
// Last time (Unix Epoch) when a chunk was downloaded/uploaded /** TODO */
infohash_v1: string
/** TODO */
infohash_v2: string
/** Last time (Unix Epoch) when a chunk was downloaded/uploaded */
last_activity: number last_activity: number
// Magnet URI corresponding to this torrent /** Magnet URI corresponding to this torrent */
magnet_uri: string magnet_uri: string
// Maximum share ratio until torrent is stopped from seeding/uploading /** Maximum share ratio until torrent is stopped from seeding/uploading */
max_ratio: number max_ratio: number
// Maximum seeding time (seconds) until torrent is stopped from seeding /** Maximum seeding time (seconds) until torrent is stopped from seeding */
max_seeding_time: number max_seeding_time: number
// Torrent name /** Torrent name */
name: string name: string
// Number of seeds in the swarm /** Number of seeds in the swarm */
num_complete: number num_complete: number
// Number of leechers in the swarm /** Number of leechers in the swarm */
num_incomplete: number num_incomplete: number
// Number of leechers connected to /** Number of leechers connected to */
num_leechs: number num_leechs: number
// Number of seeds connected to /** Number of seeds connected to */
num_seeds: number num_seeds: number
// Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode /** Torrent priority. Returns -1 if queuing is disabled or torrent is in seed mode */
priority: number priority: Priority
// Torrent progress (percentage/100) /** Torrent progress (percentage/100) */
progress: number progress: number
// Torrent share ratio. Max ratio value: 9999. /** Torrent share ratio. Max ratio value: 9999. */
ratio: number ratio: number
/** TODO */
ratio_limit: number ratio_limit: number
// Path where this torrent's data is stored /** Path where this torrent's data is stored */
save_path: string save_path: string
// Torrent elapsed time while complete (seconds) /** Torrent elapsed time while complete (seconds) */
seeding_time: number seeding_time: number
/** TODO */
seeding_time_limit: number seeding_time_limit: number
// Time (Unix Epoch) when this torrent was last seen complete /** Time (Unix Epoch) when this torrent was last seen complete */
seen_complete: number seen_complete: number
// True if sequential download is enabled /** True if sequential download is enabled */
seq_dl: boolean seq_dl: boolean
// Total size (bytes) of files selected for download /** Total size (bytes) of files selected for download */
size: number size: number
// Torrent state. See table here below for the possible values /** Torrent state. See table here below for the possible values */
state: TorrentState state: TorrentState
// True if super seeding is enabled /** True if super seeding is enabled */
super_seeding: boolean super_seeding: boolean
// Comma-concatenated tag list of the torrent /** Comma-concatenated tag list of the torrent */
tags: string tags: string
// Total active time (seconds) /** Total active time (seconds) */
time_active: number time_active: number
// Total size (bytes) of all file in this torrent (including unselected ones) /** Total size (bytes) of all file in this torrent (including unselected ones) */
total_size: number total_size: number
// The first tracker with working status. Returns empty string if no tracker is working. /** The first tracker with working status. Returns empty string if no tracker is working. */
tracker: string tracker: string
// Torrent upload speed limit (bytes/s). -1 if unlimited. /** TODO */
trackers_count: number
/** Torrent upload speed limit (bytes/s). -1 if unlimited. */
up_limit: number up_limit: number
// Amount of data uploaded /** Amount of data uploaded */
uploaded: number uploaded: number
// Amount of data uploaded this session /** Amount of data uploaded this session */
uploaded_session: number uploaded_session: number
// Torrent upload speed (bytes/s) /** Torrent upload speed (bytes/s) */
upspeed: number upspeed: number
} }

View file

@ -159,6 +159,61 @@ export default {
components: { Torrent, TorrentRightClickMenu }, components: { Torrent, TorrentRightClickMenu },
mixins: [TorrentSelect, General], mixins: [TorrentSelect, General],
data() { data() {
const sortOptions = [
{ value: 'added_on', text: this.$t('modals.sort.sortBy.added_on') },
{ value: 'amount_left', text: this.$t('modals.sort.sortBy.amount_left') },
{ value: 'auto_tmm', text: this.$t('modals.sort.sortBy.auto_tmm') },
{ value: 'availability', text: this.$t('modals.sort.sortBy.availability') },
{ value: 'category', text: this.$t('modals.sort.sortBy.category') },
{ value: 'completed', text: this.$t('modals.sort.sortBy.completed') },
{ value: 'completion_on', text: this.$t('modals.sort.sortBy.completion_on') },
{ value: 'content_path', text: this.$t('modals.sort.sortBy.content_path') },
{ value: 'dl_limit', text: this.$t('modals.sort.sortBy.dl_limit') },
{ value: 'dlspeed', text: this.$t('modals.sort.sortBy.dlspeed') },
{ value: 'download_path', text: this.$t('modals.sort.sortBy.download_path') },
{ value: 'downloaded', text: this.$t('modals.sort.sortBy.downloaded') },
{ value: 'downloaded_session', text: this.$t('modals.sort.sortBy.downloaded_session') },
{ value: 'eta', text: this.$t('modals.sort.sortBy.eta') },
{ value: 'f_l_piece_prio', text: this.$t('modals.sort.sortBy.f_l_piece_prio') },
{ value: 'force_start', text: this.$t('modals.sort.sortBy.force_start') },
{ value: 'globalSpeed', text: this.$t('modals.sort.sortBy.globalSpeed') },
{ value: 'globalVolume', text: this.$t('modals.sort.sortBy.globalVolume') },
{ value: 'hash', text: this.$t('modals.sort.sortBy.hash') },
{ value: 'infohash_v1', text: this.$t('modals.sort.sortBy.infohash_v1') },
{ value: 'infohash_v2', text: this.$t('modals.sort.sortBy.infohash_v2') },
{ value: 'last_activity', text: this.$t('modals.sort.sortBy.last_activity') },
{ value: 'magnet_uri', text: this.$t('modals.sort.sortBy.magnet_uri') },
{ value: 'max_ratio', text: this.$t('modals.sort.sortBy.max_ratio') },
{ value: 'max_seeding_time', text: this.$t('modals.sort.sortBy.max_seeding_time') },
{ value: 'name', text: this.$t('modals.sort.sortBy.name') },
{ value: 'num_complete', text: this.$t('modals.sort.sortBy.num_complete') },
{ value: 'num_incomplete', text: this.$t('modals.sort.sortBy.num_incomplete') },
{ value: 'num_leechs', text: this.$t('modals.sort.sortBy.num_leechs') },
{ value: 'num_seeds', text: this.$t('modals.sort.sortBy.num_seeds') },
{ value: 'priority', text: this.$t('modals.sort.sortBy.priority') },
{ value: 'progress', text: this.$t('modals.sort.sortBy.progress') },
{ value: 'ratio', text: this.$t('modals.sort.sortBy.ratio') },
{ value: 'ratio_limit', text: this.$t('modals.sort.sortBy.ratio_limit') },
{ value: 'save_path', text: this.$t('modals.sort.sortBy.save_path') },
{ value: 'seeding_time', text: this.$t('modals.sort.sortBy.seeding_time') },
{ value: 'seeding_time_limit', text: this.$t('modals.sort.sortBy.seeding_time_limit') },
{ value: 'seen_complete', text: this.$t('modals.sort.sortBy.seen_complete') },
{ value: 'seq_dl', text: this.$t('modals.sort.sortBy.seq_dl') },
{ value: 'size', text: this.$t('modals.sort.sortBy.size') },
{ value: 'state', text: this.$t('modals.sort.sortBy.state') },
{ value: 'super_seeding', text: this.$t('modals.sort.sortBy.super_seeding') },
{ value: 'tags', text: this.$t('modals.sort.sortBy.tags') },
{ value: 'time_active', text: this.$t('modals.sort.sortBy.time_active') },
{ value: 'total_size', text: this.$t('modals.sort.sortBy.total_size') },
{ value: 'tracker', text: this.$t('modals.sort.sortBy.tracker') },
{ value: 'trackers_count', text: this.$t('modals.sort.sortBy.trackers_count') },
{ value: 'up_limit', text: this.$t('modals.sort.sortBy.up_limit') },
{ value: 'uploaded', text: this.$t('modals.sort.sortBy.uploaded') },
{ value: 'uploaded_session', text: this.$t('modals.sort.sortBy.uploaded_session') },
{ value: 'upspeed', text: this.$t('modals.sort.sortBy.upspeed') }
]
sortOptions.sort((a,b) => a.text.localeCompare(b.text))
return { return {
data: null, data: null,
trcMenu: { trcMenu: {
@ -177,29 +232,7 @@ export default {
sortEnabled: false, sortEnabled: false,
sortOptions: [ sortOptions: [
{ value: '', text: this.$t('modals.sort.sortBy.default') }, { value: '', text: this.$t('modals.sort.sortBy.default') },
{ value: 'added_on', text: this.$t('modals.sort.sortBy.addedOn') }, ...sortOptions
{ value: 'availability', text: this.$t('modals.sort.sortBy.availability') },
{ value: 'category', text: this.$t('modals.sort.sortBy.category') },
{ value: 'completed', text: this.$t('modals.sort.sortBy.completed') },
{ value: 'completion_on', text: this.$t('modals.sort.sortBy.completion_on') },
{ value: 'dlspeed', text: this.$t('modals.sort.sortBy.downloadSpeed') },
{ value: 'downloaded', text: this.$t('modals.sort.sortBy.downloaded') },
{ value: 'eta', text: this.$t('modals.sort.sortBy.ETA') },
{ value: 'globalSpeed', text: this.$t('modals.sort.sortBy.globalSpeed') },
{ value: 'globalVolume', text: this.$t('modals.sort.sortBy.globalVolume') },
{ value: 'last_activity', text: this.$t('modals.sort.sortBy.last_activity') },
{ value: 'name', text: this.$t('modals.sort.sortBy.name') },
{ value: 'num_leechs', text: this.$t('modals.sort.sortBy.peers') },
{ value: 'num_seeds', text: this.$t('modals.sort.sortBy.seeds') },
{ value: 'priority', text: this.$t('modals.sort.sortBy.priority') },
{ value: 'progress', text: this.$t('modals.sort.sortBy.progress') },
{ value: 'ratio', text: this.$t('modals.sort.sortBy.ratio') },
{ value: 'save_path', text: this.$t('modals.sort.sortBy.save_path') },
{ value: 'size', text: this.$t('modals.sort.sortBy.size') },
{ value: 'state', text: this.$t('modals.sort.sortBy.state') },
{ value: 'time_active', text: this.$t('modals.sort.sortBy.timeActive') },
{ value: 'uploaded', text: this.$t('modals.sort.sortBy.uploaded') },
{ value: 'upspeed', text: this.$t('modals.sort.sortBy.uploadSpeed') }
], ],
mdiTextBoxSearch, mdiTextBoxSearch,
mdiChevronLeftCircle, mdiChevronLeftCircle,

View file

@ -2,9 +2,85 @@ import { describe, beforeEach, it, expect, vi } from 'vitest'
import { shallowMount } from '@vue/test-utils' import { shallowMount } from '@vue/test-utils'
import DesktopCard from '@/components/Settings/Tabs/VueTorrent/VDesktopCard.vue' import DesktopCard from '@/components/Settings/Tabs/VueTorrent/VDesktopCard.vue'
import {DashboardProperty} from "@/enums/vuetorrent";
let wrapper let wrapper
const desktopPropertiesTemplate = [
{ name: DashboardProperty.SIZE, active: true },
{ name: DashboardProperty.PROGRESS, active: true },
{ name: DashboardProperty.DOWNLOAD_SPEED, active: true },
{ name: DashboardProperty.UPLOAD_SPEED, active: true },
{ name: DashboardProperty.DOWNLOADED, active: true },
{ name: DashboardProperty.SAVE_PATH, active: false },
{ name: DashboardProperty.UPLOADED, active: true },
{ name: DashboardProperty.ETA, active: true },
{ name: DashboardProperty.PEERS, active: true },
{ name: DashboardProperty.SEEDS, active: true },
{ name: DashboardProperty.STATUS, active: true },
{ name: DashboardProperty.RATIO, active: true },
{ name: DashboardProperty.TRACKER, active: false },
{ name: DashboardProperty.CATEGORY, active: true },
{ name: DashboardProperty.TAGS, active: true },
{ name: DashboardProperty.ADDED_ON, active: true },
{ name: DashboardProperty.AVAILABILITY, active: true },
{ name: DashboardProperty.LAST_ACTIVITY, active: false },
{ name: DashboardProperty.COMPLETED_ON, active: false },
{ name: DashboardProperty.AMOUNT_LEFT, active: false },
{ name: DashboardProperty.CONTENT_PATH, active: false },
{ name: DashboardProperty.DOWNLOADED_SESSION, active: false },
{ name: DashboardProperty.DOWNLOAD_LIMIT, active: false },
{ name: DashboardProperty.DOWNLOAD_PATH, active: false },
{ name: DashboardProperty.HASH, active: false },
{ name: DashboardProperty.INFOHASH_V1, active: false },
{ name: DashboardProperty.INFOHASH_V2, active: false },
{ name: DashboardProperty.SEEN_COMPLETE, active: false },
{ name: DashboardProperty.TIME_ACTIVE, active: false },
{ name: DashboardProperty.TOTAL_SIZE, active: false },
{ name: DashboardProperty.TRACKERS_COUND, active: false },
{ name: DashboardProperty.UPLOADED_SESSION, active: false },
{ name: DashboardProperty.UPLOAD_LIMIT, active: false },
{ name: DashboardProperty.GLOBAL_SPEED, active: false },
{ name: DashboardProperty.GLOBAL_VOLUME, active: false }
]
const desktopPropertiesTemplateExpected = [
{ name: 'Size', label: 'Size', active: true },
{ name: 'Progress', label: 'Progress', active: true },
{ name: 'DownloadSpeed', label: 'Download Speed', active: true },
{ name: 'UploadSpeed', label: 'Upload Speed', active: true },
{ name: 'Downloaded', label: 'Downloaded (global)', active: true },
{ name: 'SavePath', label: 'Save Path', active: false },
{ name: 'Uploaded', label: 'Uploaded (global)', active: true },
{ name: 'ETA', label: 'ETA', active: true },
{ name: 'Peers', label: 'Peers', active: true },
{ name: 'Seeds', label: 'Seeds', active: true },
{ name: 'Status', label: 'Status', active: true },
{ name: 'Ratio', label: 'Ratio', active: true },
{ name: 'Tracker', label: 'Tracker', active: false },
{ name: 'Category', label: 'Category', active: true },
{ name: 'Tags', label: 'Tags', active: true },
{ name: 'AddedOn', label: 'Added On', active: true },
{ name: 'Availability', label: 'Availability', active: true },
{ name: 'LastActivity', label: 'Last Activity', active: false },
{ name: 'CompletedOn', label: 'Completed On', active: false },
{ name: 'AmountLeft', label: 'Amount Left', active: false },
{ name: 'ContentPath', label: 'Content Path', active: false },
{ name: 'DownloadedSession', label: 'Downloaded (session)', active: false },
{ name: 'DownloadLimit', label: 'Download Limit', active: false },
{ name: 'DownloadPath', label: 'Download Path', active: false },
{ name: 'Hash', label: 'Hash', active: false },
{ name: 'InfoHashV1', label: 'Infohash v1', active: false },
{ name: 'InfoHashV2', label: 'Infohash v2', active: false },
{ name: 'SeenComplete', label: 'Seen Complete', active: false },
{ name: 'TimeActive', label: 'Time Active', active: false },
{ name: 'TotalSize', label: 'Total Size', active: false },
{ name: 'TrackersCount', label: 'Trackers Count', active: false },
{ name: 'UploadedSession', label: 'Uploaded (session)', active: false },
{ name: 'UploadLimit', label: 'Upload Limit', active: false },
{ name: 'GlobalSpeed', label: 'Global Speed', active: false },
{ name: 'GlobalVolume', label: 'Global Volume', active: false }
]
describe('DesktopCard', () => { describe('DesktopCard', () => {
beforeEach(() => { beforeEach(() => {
wrapper = shallowMount(DesktopCard, { wrapper = shallowMount(DesktopCard, {
@ -27,40 +103,11 @@ describe('DesktopCard', () => {
title: 'Default', title: 'Default',
rightDrawer: false, rightDrawer: false,
paginationSize: 15, paginationSize: 15,
busyDesktopTorrentProperties: [ dateFormat: 'DD/MM/YYYY, HH:mm:ss',
{ name: 'Size', active: true }, openSideBarOnStart: true,
{ name: 'Progress', active: true }, showShutdownButton: true,
{ name: 'Download', active: true }, busyDesktopTorrentProperties: JSON.parse(JSON.stringify(desktopPropertiesTemplate)),
{ name: 'Upload', active: true }, doneDesktopTorrentProperties: JSON.parse(JSON.stringify(desktopPropertiesTemplate))
{ name: 'Downloaded', active: true },
{ name: 'Uploaded', active: true },
{ name: 'ETA', active: true },
{ name: 'Peers', active: true },
{ name: 'Seeds', active: true },
{ name: 'Status', active: true },
{ name: 'Ratio', active: true },
{ name: 'Category', active: true },
{ name: 'Tags', active: true },
{ name: 'AddedOn', active: true },
{ name: 'Availability', active: true }
],
doneDesktopTorrentProperties: [
{ name: 'Size', active: true },
{ name: 'Progress', active: true },
{ name: 'Download', active: true },
{ name: 'Upload', active: true },
{ name: 'Downloaded', active: true },
{ name: 'Uploaded', active: true },
{ name: 'ETA', active: true },
{ name: 'Peers', active: true },
{ name: 'Seeds', active: true },
{ name: 'Status', active: true },
{ name: 'Ratio', active: true },
{ name: 'Category', active: true },
{ name: 'Tags', active: true },
{ name: 'AddedOn', active: true },
{ name: 'Availability', active: true }
]
} }
} }
} }
@ -73,44 +120,10 @@ describe('DesktopCard', () => {
}) })
it('tests busyDesktopTorrentProperties', () => { it('tests busyDesktopTorrentProperties', () => {
const busyDesktopTorrentProperties = [ expect(wrapper.vm.busyDesktopTorrentProperties).toEqual(desktopPropertiesTemplateExpected)
{ name: 'Size', label: 'Size', active: true },
{ name: 'Progress', label: 'Progress', active: true },
{ name: 'Download', label: 'Download Speed', active: true },
{ name: 'Upload', label: 'Upload Speed', active: true },
{ name: 'Downloaded', label: 'Downloaded', active: true },
{ name: 'Uploaded', label: 'Uploaded', active: true },
{ name: 'ETA', label: 'ETA', active: true },
{ name: 'Peers', label: 'Peers', active: true },
{ name: 'Seeds', label: 'Seeds', active: true },
{ name: 'Status', label: 'State', active: true },
{ name: 'Ratio', label: 'Ratio', active: true },
{ name: 'Category', label: 'Category', active: true },
{ name: 'Tags', label: 'Tags', active: true },
{ name: 'AddedOn', label: 'Added On', active: true },
{ name: 'Availability', label: 'Availability', active: true }
]
expect(wrapper.vm.busyDesktopTorrentProperties).toEqual(busyDesktopTorrentProperties)
}) })
it('tests doneDesktopTorrentProperties', () => { it('tests doneDesktopTorrentProperties', () => {
const doneDesktopTorrentProperties = [ expect(wrapper.vm.doneDesktopTorrentProperties).toEqual(desktopPropertiesTemplateExpected)
{ name: 'Size', label: 'Size', active: true },
{ name: 'Progress', label: 'Progress', active: true },
{ name: 'Download', label: 'Download Speed', active: true },
{ name: 'Upload', label: 'Upload Speed', active: true },
{ name: 'Downloaded', label: 'Downloaded', active: true },
{ name: 'Uploaded', label: 'Uploaded', active: true },
{ name: 'ETA', label: 'ETA', active: true },
{ name: 'Peers', label: 'Peers', active: true },
{ name: 'Seeds', label: 'Seeds', active: true },
{ name: 'Status', label: 'State', active: true },
{ name: 'Ratio', label: 'Ratio', active: true },
{ name: 'Category', label: 'Category', active: true },
{ name: 'Tags', label: 'Tags', active: true },
{ name: 'AddedOn', label: 'Added On', active: true },
{ name: 'Availability', label: 'Availability', active: true }
]
expect(wrapper.vm.doneDesktopTorrentProperties).toEqual(doneDesktopTorrentProperties)
}) })
}) })

View file

@ -0,0 +1,85 @@
import { describe, beforeEach, it, expect, vi } from 'vitest'
import { shallowMount } from '@vue/test-utils'
import MobileCard from '@/components/Settings/Tabs/VueTorrent/VMobileCard.vue'
import {DashboardProperty} from '@/enums/vuetorrent'
let wrapper
const mobilePropertiesTemplate = [
{ name: DashboardProperty.STATUS, active: true },
{ name: DashboardProperty.TRACKER, active: true },
{ name: DashboardProperty.CATEGORY, active: true },
{ name: DashboardProperty.TAGS, active: true },
{ name: DashboardProperty.SIZE, active: true },
{ name: DashboardProperty.PROGRESS, active: true },
{ name: DashboardProperty.RATIO, active: true },
{ name: DashboardProperty.UPLOADED, active: true },
{ name: DashboardProperty.ETA, active: true },
{ name: DashboardProperty.SEEDS, active: true },
{ name: DashboardProperty.PEERS, active: true },
{ name: DashboardProperty.DOWNLOAD_SPEED, active: true },
{ name: DashboardProperty.UPLOAD_SPEED, active: true }
]
const mobilePropertiesTemplateExpected = [
{ name: 'Status', label: 'Status', active: true },
{ name: 'Tracker', label: 'Tracker', active: true },
{ name: 'Category', label: 'Category', active: true },
{ name: 'Tags', label: 'Tags', active: true },
{ name: 'Size', label: 'Size', active: true },
{ name: 'Progress', label: 'Progress', active: true },
{ name: 'Ratio', label: 'Ratio', active: true },
{ name: 'Uploaded', label: 'Uploaded (global)', active: true },
{ name: 'ETA', label: 'ETA', active: true },
{ name: 'Seeds', label: 'Seeds', active: true },
{ name: 'Peers', label: 'Peers', active: true },
{ name: 'DownloadSpeed', label: 'Download Speed', active: true },
{ name: 'UploadSpeed', label: 'Upload Speed', active: true }
]
describe('MobileCard', () => {
beforeEach(() => {
wrapper = shallowMount(MobileCard, {
mocks: {
$t: x => x,
$store: {
getters: { getAppVersion: vi.fn() },
state: {
webuiSettings: {
lang: 'en',
darkTheme: false,
showFreeSpace: true,
showSpeedGraph: true,
showSessionStat: true,
showAlltimeStat: true,
showCurrentSpeed: true,
showTrackerFilter: false,
showSpeedInTitle: false,
deleteWithFiles: false,
title: 'Default',
rightDrawer: false,
paginationSize: 15,
dateFormat: 'DD/MM/YYYY, HH:mm:ss',
openSideBarOnStart: true,
showShutdownButton: true,
busyMobileCardProperties: JSON.parse(JSON.stringify(mobilePropertiesTemplate)),
doneMobileCardProperties: JSON.parse(JSON.stringify(mobilePropertiesTemplate))
}
}
}
}
})
})
it('render correctly', () => {
expect(wrapper.html()).toMatchSnapshot()
})
it('tests busyMobileCardProperties', () => {
expect(wrapper.vm.busyMobileCardProperties).toEqual(mobilePropertiesTemplateExpected)
})
it('tests doneMobileCardProperties', () => {
expect(wrapper.vm.doneMobileCardProperties).toEqual(mobilePropertiesTemplateExpected)
})
})

View file

@ -7,7 +7,7 @@ exports[`DesktopCard > render correctly 1`] = `
<v-subheader-stub> modals.settings.pageVueTorrent.pageDesktopCard.busyTorrentTip </v-subheader-stub> <v-subheader-stub> modals.settings.pageVueTorrent.pageDesktopCard.busyTorrentTip </v-subheader-stub>
<v-row-stub tag=\\"div\\" dense=\\"true\\"> <v-row-stub tag=\\"div\\" dense=\\"true\\">
<v-list-stub tag=\\"div\\" flat=\\"true\\" class=\\"ma-2 pa-0\\"> <v-list-stub tag=\\"div\\" flat=\\"true\\" class=\\"ma-2 pa-0\\">
<draggable-stub list=\\"[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]\\" clone=\\"[Function]\\" element=\\"div\\" tag=\\"tbody\\"> <draggable-stub list=\\"[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]\\" clone=\\"[Function]\\" element=\\"div\\" tag=\\"tbody\\">
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\"> <v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub> <v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\"> <v-list-item-content-stub tag=\\"div\\">
@ -47,7 +47,16 @@ exports[`DesktopCard > render correctly 1`] = `
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\"> <v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub> <v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\"> <v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Downloaded</v-list-item-title-stub> <v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Downloaded (global)</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Save Path</v-list-item-title-stub>
</v-list-item-content-stub> </v-list-item-content-stub>
<v-list-item-action-stub> <v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub> <v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
@ -56,7 +65,7 @@ exports[`DesktopCard > render correctly 1`] = `
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\"> <v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub> <v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\"> <v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Uploaded</v-list-item-title-stub> <v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Uploaded (global)</v-list-item-title-stub>
</v-list-item-content-stub> </v-list-item-content-stub>
<v-list-item-action-stub> <v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub> <v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
@ -92,7 +101,7 @@ exports[`DesktopCard > render correctly 1`] = `
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\"> <v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub> <v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\"> <v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">State</v-list-item-title-stub> <v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Status</v-list-item-title-stub>
</v-list-item-content-stub> </v-list-item-content-stub>
<v-list-item-action-stub> <v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub> <v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
@ -107,6 +116,15 @@ exports[`DesktopCard > render correctly 1`] = `
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub> <v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub> </v-list-item-action-stub>
</v-list-item-stub> </v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Tracker</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\"> <v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub> <v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\"> <v-list-item-content-stub tag=\\"div\\">
@ -143,6 +161,168 @@ exports[`DesktopCard > render correctly 1`] = `
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub> <v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub> </v-list-item-action-stub>
</v-list-item-stub> </v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Last Activity</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Completed On</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Amount Left</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Content Path</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Downloaded (session)</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Download Limit</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Download Path</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Hash</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Infohash v1</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Infohash v2</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Seen Complete</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Time Active</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Total Size</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Trackers Count</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Uploaded (session)</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Upload Limit</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Global Speed</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Global Volume</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
</draggable-stub> </draggable-stub>
</v-list-stub> </v-list-stub>
</v-row-stub> </v-row-stub>
@ -151,7 +331,7 @@ exports[`DesktopCard > render correctly 1`] = `
<v-subheader-stub> modals.settings.pageVueTorrent.pageDesktopCard.completedTorrentTip </v-subheader-stub> <v-subheader-stub> modals.settings.pageVueTorrent.pageDesktopCard.completedTorrentTip </v-subheader-stub>
<v-row-stub tag=\\"div\\" dense=\\"true\\"> <v-row-stub tag=\\"div\\" dense=\\"true\\">
<v-list-stub tag=\\"div\\" flat=\\"true\\" class=\\"ma-2 pa-0\\"> <v-list-stub tag=\\"div\\" flat=\\"true\\" class=\\"ma-2 pa-0\\">
<draggable-stub list=\\"[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]\\" clone=\\"[Function]\\" element=\\"div\\" tag=\\"tbody\\"> <draggable-stub list=\\"[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]\\" clone=\\"[Function]\\" element=\\"div\\" tag=\\"tbody\\">
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\"> <v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub> <v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\"> <v-list-item-content-stub tag=\\"div\\">
@ -191,7 +371,16 @@ exports[`DesktopCard > render correctly 1`] = `
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\"> <v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub> <v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\"> <v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Downloaded</v-list-item-title-stub> <v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Downloaded (global)</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Save Path</v-list-item-title-stub>
</v-list-item-content-stub> </v-list-item-content-stub>
<v-list-item-action-stub> <v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub> <v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
@ -200,7 +389,7 @@ exports[`DesktopCard > render correctly 1`] = `
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\"> <v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub> <v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\"> <v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Uploaded</v-list-item-title-stub> <v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Uploaded (global)</v-list-item-title-stub>
</v-list-item-content-stub> </v-list-item-content-stub>
<v-list-item-action-stub> <v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub> <v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
@ -236,7 +425,7 @@ exports[`DesktopCard > render correctly 1`] = `
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\"> <v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub> <v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\"> <v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">State</v-list-item-title-stub> <v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Status</v-list-item-title-stub>
</v-list-item-content-stub> </v-list-item-content-stub>
<v-list-item-action-stub> <v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub> <v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
@ -251,6 +440,15 @@ exports[`DesktopCard > render correctly 1`] = `
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub> <v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub> </v-list-item-action-stub>
</v-list-item-stub> </v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Tracker</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\"> <v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub> <v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\"> <v-list-item-content-stub tag=\\"div\\">
@ -287,6 +485,168 @@ exports[`DesktopCard > render correctly 1`] = `
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub> <v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub> </v-list-item-action-stub>
</v-list-item-stub> </v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Last Activity</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Completed On</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Amount Left</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Content Path</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Downloaded (session)</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Download Limit</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Download Path</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Hash</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Infohash v1</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Infohash v2</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Seen Complete</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Time Active</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Total Size</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Trackers Count</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Uploaded (session)</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Upload Limit</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Global Speed</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Global Volume</v-list-item-title-stub>
</v-list-item-content-stub>
<v-list-item-action-stub>
<v-icon-stub> M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z </v-icon-stub>
</v-list-item-action-stub>
</v-list-item-stub>
</draggable-stub> </draggable-stub>
</v-list-stub> </v-list-stub>
</v-row-stub> </v-row-stub>

View file

@ -0,0 +1,178 @@
// Vitest Snapshot v1
exports[`MobileCard > render correctly 1`] = `
"<v-card-stub loaderheight=\\"4\\" tag=\\"div\\" flat=\\"true\\">
<v-row-stub tag=\\"div\\" dense=\\"true\\">
<v-col-stub cols=\\"12\\" md=\\"6\\" tag=\\"div\\">
<v-subheader-stub> modals.settings.pageVueTorrent.pageMobileCard.busyTorrentTip </v-subheader-stub>
<v-row-stub tag=\\"div\\" dense=\\"true\\">
<v-list-stub tag=\\"div\\" flat=\\"true\\" class=\\"ma-2 pa-0\\">
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Status</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Tracker</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Category</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Tags</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Size</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Progress</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Ratio</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Uploaded (global)</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">ETA</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Seeds</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Peers</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Download Speed</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Upload Speed</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
</v-list-stub>
</v-row-stub>
</v-col-stub>
<v-col-stub cols=\\"12\\" md=\\"6\\" tag=\\"div\\">
<v-subheader-stub> modals.settings.pageVueTorrent.pageMobileCard.completedTorrentTip </v-subheader-stub>
<v-row-stub tag=\\"div\\" dense=\\"true\\">
<v-list-stub tag=\\"div\\" flat=\\"true\\" class=\\"ma-2 pa-0\\">
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Status</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Tracker</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Category</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Tags</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Size</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Progress</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Ratio</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Uploaded (global)</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">ETA</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Seeds</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Peers</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Download Speed</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
<v-list-item-stub activeclass=\\"\\" tag=\\"div\\" class=\\"ma-2 elevation-2 rounded-lg pointer\\">
<v-checkbox-stub errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"pa-0 ma-0\\"></v-checkbox-stub>
<v-list-item-content-stub tag=\\"div\\">
<v-list-item-title-stub tag=\\"div\\" class=\\"truncate\\">Upload Speed</v-list-item-title-stub>
</v-list-item-content-stub>
</v-list-item-stub>
</v-list-stub>
</v-row-stub>
</v-col-stub>
</v-row-stub>
</v-card-stub>"
`;