feat!: move to vite + typescript => BREAKS PWA, please re-install! (#352)

This commit is contained in:
Daan Wijns 2022-11-15 09:36:54 +01:00 committed by WDaan
parent d3cf4d5795
commit 5aa83fa95e
139 changed files with 6488 additions and 28134 deletions

View file

@ -1 +1,2 @@
node_modules/*
node_modules/*
vuetorrent/

View file

@ -1,85 +1,19 @@
module.exports = {
extends: [
'eslint:recommended',
'plugin:vue/recommended'
],
parserOptions: {
parser: '@babel/eslint-parser',
ecmaVersion: 2017,
sourceType: 'module'
},
root: true,
env: {
es6: true,
node: true,
browser: true,
node: true
es2016: true
},
plugins: [
'vue'
],
extends: ['eslint:recommended', 'plugin:vue/recommended', '@vue/typescript/recommended', 'prettier', 'plugin:import/recommended'],
parserOptions: {
ecmaVersion: 2020
},
plugins: ['vue', 'prettier'],
rules: {
'arrow-parens': ['error', 'as-needed'],
'key-spacing': ['error', { beforeColon: false, afterColon: true }],
'array-bracket-spacing': ['error', 'never'],
'comma-spacing': ['error', { before: false, after: true }],
'brace-style': ['error', '1tbs'],
'comma-dangle': ['error', 'never'],
'comma-style': ['error', 'last'],
eqeqeq: 0,
indent: ['error', 2, {
SwitchCase: 1,
ignoredNodes: ['TemplateLiteral']
}],
'vue/html-indent': [
'error',
2,
{ ignores: ['VElement[name=code-block].children'] }
],
'vue/multiline-html-element-content-newline': ['error', {
ignores: ['code-block']
}],
'linebreak-style': ['error', 'unix'],
'keyword-spacing': 'error',
'prefer-const': 'error',
'new-parens': 'error',
'no-case-declarations': 'off',
'no-const-assign': 'error',
'no-unused-vars': ['error', { args: 'none' }],
'no-whitespace-before-property': 'error',
'object-curly-spacing': ['error', 'always'],
quotes: ['error', 'single'],
'quote-props': ['error', 'as-needed'],
semi: ['error', 'never'],
'space-before-blocks': 'error',
'space-before-function-paren': ['error', { anonymous: 'always', named: 'never' }],
'space-in-parens': ['error', 'never'],
'space-infix-ops': 'error',
strict: ['error', 'never'],
'vue/max-attributes-per-line': ['error', {
singleline: 3,
multiline: {
max: 1,
allowFirstLine: false
}
}],
'vue/no-v-html': 'off',
'vue/require-prop-types': 'off',
'vue/require-default-prop': 'off',
'vue/require-v-for-key': 'off',
'vue/order-in-components': ['error'],
'vue/space-infix-ops': 'error',
'arrow-spacing': ['error', { before: true, after: true }],
'no-multi-spaces': ['error'],
'newline-before-return': ['error']
},
overrides: [
{
files: [
'**/__tests__/*.{j,t}s?(x)',
'**/tests/unit/**/*.spec.{j,t}s?(x)'
],
env: {
jest: true
}
}
]
'vue/multi-word-component-names': 'off',
'vue/first-attribute-linebreak': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off'
}
}

View file

@ -1,9 +1,10 @@
# My Title [feat/fix/perf/chore]
Please explain what kind of feature your PR's brings or what kind of bug it fixes.
Feel free to include screenshots for UI related changes.
Keep all the commits inside your PR related to topic of the PR, otherwise create a seperate PR
Please explain what kind of feature your PR's brings or what kind of bug it fixes. Feel free to include screenshots for UI related changes. Keep all the commits inside your PR
related to topic of the PR, otherwise create a seperate PR
# PR Checklist
- [ ] I've started from master
- [ ] I've only committed changes related to this PR
- [ ] All Unit tests pass

View file

@ -1,4 +1,4 @@
name: "CodeQL"
name: 'CodeQL'
on:
schedule:
@ -12,19 +12,19 @@ jobs:
strategy:
fail-fast: false
matrix:
language: [ 'javascript' ]
language: ['javascript']
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
- name: Autobuild
uses: github/codeql-action/autobuild@v1
- name: Autobuild
uses: github/codeql-action/autobuild@v1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

View file

@ -19,7 +19,8 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }}
release-type: node
package-name: vuetorrent
changelog-types: '[{"type":"feat","section":"Features","hidden":false},{"type":"fix","section":"Bug Fixes","hidden":false},{"type":"perf","section":"Improvements","hidden":false}]'
changelog-types:
'[{"type":"feat","section":"Features","hidden":false},{"type":"fix","section":"Bug Fixes","hidden":false},{"type":"perf","section":"Improvements","hidden":false}]'
upload-release:
needs: setup-release

View file

@ -1,6 +1,6 @@
name: Test Release Build
on:
workflow_dispatch:
workflow_dispatch:
jobs:
test-build:
@ -22,4 +22,3 @@ jobs:
run: npm ci
- name: Build VueTorrent
run: npm run build

10
.prettierrc Normal file
View file

@ -0,0 +1,10 @@
{
"printWidth": 180,
"semi": false,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "none",
"proseWrap": "always",
"endOfLine": "auto",
"arrowParens": "avoid"
}

View file

@ -2,442 +2,497 @@
### [0.19.1](https://github.com/WDaan/VueTorrent/compare/v0.19.0...v0.19.1) (2022-10-11)
### Bug Fixes
* login console error on refresh ([254d7c8](https://github.com/WDaan/VueTorrent/commit/254d7c8562e3fec5a16b4f65a4de0382ef7662c1))
* login prompt being displayed when whitelisted ([#511](https://github.com/WDaan/VueTorrent/issues/511)) ([077cf54](https://github.com/WDaan/VueTorrent/commit/077cf54c6bb5ccc7e5ccf9b94731ec468bd17ecd))
* refresh torrent detail data from store ([#509](https://github.com/WDaan/VueTorrent/issues/509)) ([5270619](https://github.com/WDaan/VueTorrent/commit/5270619a5d27eba380a33a8f12632c2c61611886))
* temporarily disable render link feat for security ([#512](https://github.com/WDaan/VueTorrent/issues/512)) ([13e6584](https://github.com/WDaan/VueTorrent/commit/13e6584c5d9a541d01e770d901c9a6266e7c9b24))
- login console error on refresh ([254d7c8](https://github.com/WDaan/VueTorrent/commit/254d7c8562e3fec5a16b4f65a4de0382ef7662c1))
- login prompt being displayed when whitelisted ([#511](https://github.com/WDaan/VueTorrent/issues/511))
([077cf54](https://github.com/WDaan/VueTorrent/commit/077cf54c6bb5ccc7e5ccf9b94731ec468bd17ecd))
- refresh torrent detail data from store ([#509](https://github.com/WDaan/VueTorrent/issues/509))
([5270619](https://github.com/WDaan/VueTorrent/commit/5270619a5d27eba380a33a8f12632c2c61611886))
- temporarily disable render link feat for security ([#512](https://github.com/WDaan/VueTorrent/issues/512))
([13e6584](https://github.com/WDaan/VueTorrent/commit/13e6584c5d9a541d01e770d901c9a6266e7c9b24))
## [0.19.0](https://github.com/WDaan/VueTorrent/compare/v0.18.2...v0.19.0) (2022-10-10)
### Features
* Links in torrent details view are now clickable ([#506](https://github.com/WDaan/VueTorrent/issues/506)) ([f1536cb](https://github.com/WDaan/VueTorrent/commit/f1536cb010e2ebc8d7d026a62be491e8a3a04cfa))
* support for renaming folders ([#500](https://github.com/WDaan/VueTorrent/issues/500)) ([cf8f43a](https://github.com/WDaan/VueTorrent/commit/cf8f43aac3c235cf616bed4c1ce1ceda0fad8fe4))
- Links in torrent details view are now clickable ([#506](https://github.com/WDaan/VueTorrent/issues/506))
([f1536cb](https://github.com/WDaan/VueTorrent/commit/f1536cb010e2ebc8d7d026a62be491e8a3a04cfa))
- support for renaming folders ([#500](https://github.com/WDaan/VueTorrent/issues/500))
([cf8f43a](https://github.com/WDaan/VueTorrent/commit/cf8f43aac3c235cf616bed4c1ce1ceda0fad8fe4))
### Bug Fixes
* Cookies not sent with request for Web App manifest.json ([#504](https://github.com/WDaan/VueTorrent/issues/504)) ([2efe73a](https://github.com/WDaan/VueTorrent/commit/2efe73ad7e51c7b45ad65827503d4c3fcebd58a4))
* font-size difference in right click menu ([#505](https://github.com/WDaan/VueTorrent/issues/505)) ([a8f28dd](https://github.com/WDaan/VueTorrent/commit/a8f28dd5b468924f7dcf09d101e438a15e1269ba))
- Cookies not sent with request for Web App manifest.json ([#504](https://github.com/WDaan/VueTorrent/issues/504))
([2efe73a](https://github.com/WDaan/VueTorrent/commit/2efe73ad7e51c7b45ad65827503d4c3fcebd58a4))
- font-size difference in right click menu ([#505](https://github.com/WDaan/VueTorrent/issues/505))
([a8f28dd](https://github.com/WDaan/VueTorrent/commit/a8f28dd5b468924f7dcf09d101e438a15e1269ba))
### [0.18.2](https://github.com/WDaan/VueTorrent/compare/v0.18.1...v0.18.2) (2022-09-13)
### Bug Fixes
* anonymous mode [#362](https://github.com/WDaan/VueTorrent/issues/362) ([27a0717](https://github.com/WDaan/VueTorrent/commit/27a07179f08225292e2e26fb57bbfa6f846b272b))
* connection password type [#456](https://github.com/WDaan/VueTorrent/issues/456) ([a8616cc](https://github.com/WDaan/VueTorrent/commit/a8616cce545ed579e39db9e64c0005a74eee63d5))
* connection status [#482](https://github.com/WDaan/VueTorrent/issues/482) ([e047467](https://github.com/WDaan/VueTorrent/commit/e0474671042dc7b1c4f2490018c5484e4730ccf1))
* no autocapitalize on login form [#489](https://github.com/WDaan/VueTorrent/issues/489) ([e352de0](https://github.com/WDaan/VueTorrent/commit/e352de0643dec66256f5565be6a686ee00f040e5))
* Russian language ([#494](https://github.com/WDaan/VueTorrent/issues/494)) ([72548fa](https://github.com/WDaan/VueTorrent/commit/72548fac4ad7e5002a83b80c0b9cdb6b2d82e075))
* torrent search ([#478](https://github.com/WDaan/VueTorrent/issues/478)) @Anteus ([baba4ac](https://github.com/WDaan/VueTorrent/commit/baba4acda4adcc2414d0a0cab6e7b13446152050))
* Update Paramaters Sent to /torrents/renameFile ([#470](https://github.com/WDaan/VueTorrent/issues/470)) ([1ccdf08](https://github.com/WDaan/VueTorrent/commit/1ccdf08b606bfff9e9e016765c0d03ed0e2e7715))
- anonymous mode [#362](https://github.com/WDaan/VueTorrent/issues/362) ([27a0717](https://github.com/WDaan/VueTorrent/commit/27a07179f08225292e2e26fb57bbfa6f846b272b))
- connection password type [#456](https://github.com/WDaan/VueTorrent/issues/456) ([a8616cc](https://github.com/WDaan/VueTorrent/commit/a8616cce545ed579e39db9e64c0005a74eee63d5))
- connection status [#482](https://github.com/WDaan/VueTorrent/issues/482) ([e047467](https://github.com/WDaan/VueTorrent/commit/e0474671042dc7b1c4f2490018c5484e4730ccf1))
- no autocapitalize on login form [#489](https://github.com/WDaan/VueTorrent/issues/489)
([e352de0](https://github.com/WDaan/VueTorrent/commit/e352de0643dec66256f5565be6a686ee00f040e5))
- Russian language ([#494](https://github.com/WDaan/VueTorrent/issues/494)) ([72548fa](https://github.com/WDaan/VueTorrent/commit/72548fac4ad7e5002a83b80c0b9cdb6b2d82e075))
- torrent search ([#478](https://github.com/WDaan/VueTorrent/issues/478)) @Anteus ([baba4ac](https://github.com/WDaan/VueTorrent/commit/baba4acda4adcc2414d0a0cab6e7b13446152050))
- Update Paramaters Sent to /torrents/renameFile ([#470](https://github.com/WDaan/VueTorrent/issues/470))
([1ccdf08](https://github.com/WDaan/VueTorrent/commit/1ccdf08b606bfff9e9e016765c0d03ed0e2e7715))
### Improvements
* add Russian translations ([#493](https://github.com/WDaan/VueTorrent/issues/493)) [@reysonk](https://github.com/reysonk) ([9b6deb9](https://github.com/WDaan/VueTorrent/commit/9b6deb90371ac4e56ac2691002bda578e25758ea))
* Improved Ukrainian translation ([#457](https://github.com/WDaan/VueTorrent/issues/457)) ([b56a16f](https://github.com/WDaan/VueTorrent/commit/b56a16f7cebaf3b434f85c621b73e2d3e3385ba8))
* updated japanese translate file ([#491](https://github.com/WDaan/VueTorrent/issues/491)) ([7e5cc48](https://github.com/WDaan/VueTorrent/commit/7e5cc4891a61d441429c155ec759d5a668c3498f))
- add Russian translations ([#493](https://github.com/WDaan/VueTorrent/issues/493)) [@reysonk](https://github.com/reysonk)
([9b6deb9](https://github.com/WDaan/VueTorrent/commit/9b6deb90371ac4e56ac2691002bda578e25758ea))
- Improved Ukrainian translation ([#457](https://github.com/WDaan/VueTorrent/issues/457))
([b56a16f](https://github.com/WDaan/VueTorrent/commit/b56a16f7cebaf3b434f85c621b73e2d3e3385ba8))
- updated japanese translate file ([#491](https://github.com/WDaan/VueTorrent/issues/491))
([7e5cc48](https://github.com/WDaan/VueTorrent/commit/7e5cc4891a61d441429c155ec759d5a668c3498f))
### [0.18.1](https://github.com/WDaan/VueTorrent/compare/v0.18.0...v0.18.1) (2022-07-05)
### Bug Fixes
* broken build [#453](https://github.com/WDaan/VueTorrent/issues/453) ([8f1a12d](https://github.com/WDaan/VueTorrent/commit/8f1a12d15fa438e55194a9c807bbdc0115a3deda))
* release build ([7a74275](https://github.com/WDaan/VueTorrent/commit/7a74275a4d15280205ec1e749415da1cb0cd7e41))
- broken build [#453](https://github.com/WDaan/VueTorrent/issues/453) ([8f1a12d](https://github.com/WDaan/VueTorrent/commit/8f1a12d15fa438e55194a9c807bbdc0115a3deda))
- release build ([7a74275](https://github.com/WDaan/VueTorrent/commit/7a74275a4d15280205ec1e749415da1cb0cd7e41))
### Improvements
* lazy load pages for smaller chunk sizes ([abe909e](https://github.com/WDaan/VueTorrent/commit/abe909e14d740f4a78267564d87e2d46ef3c08a8))
* Update Simplified Chinese translation. ([#454](https://github.com/WDaan/VueTorrent/issues/454)) ([20f4a67](https://github.com/WDaan/VueTorrent/commit/20f4a67f4988629d1bc74ec18226cd858e2469e1))
- lazy load pages for smaller chunk sizes ([abe909e](https://github.com/WDaan/VueTorrent/commit/abe909e14d740f4a78267564d87e2d46ef3c08a8))
- Update Simplified Chinese translation. ([#454](https://github.com/WDaan/VueTorrent/issues/454))
([20f4a67](https://github.com/WDaan/VueTorrent/commit/20f4a67f4988629d1bc74ec18226cd858e2469e1))
## [0.18.0](https://github.com/WDaan/VueTorrent/compare/v0.17.1...v0.18.0) (2022-07-04)
### Features
* basic proxy support [#261](https://github.com/WDaan/VueTorrent/issues/261) ([71a09fc](https://github.com/WDaan/VueTorrent/commit/71a09fc58a9c29037cfc87fa6c6f0cfdb645233e))
* Basic rss interface ([#447](https://github.com/WDaan/VueTorrent/issues/447)) ([732e519](https://github.com/WDaan/VueTorrent/commit/732e5193ec76d521249ac6fb73c4a6e975091476))
- basic proxy support [#261](https://github.com/WDaan/VueTorrent/issues/261) ([71a09fc](https://github.com/WDaan/VueTorrent/commit/71a09fc58a9c29037cfc87fa6c6f0cfdb645233e))
- Basic rss interface ([#447](https://github.com/WDaan/VueTorrent/issues/447)) ([732e519](https://github.com/WDaan/VueTorrent/commit/732e5193ec76d521249ac6fb73c4a6e975091476))
### Bug Fixes
* category download folder not showing correctly ([#448](https://github.com/WDaan/VueTorrent/issues/448)) ([06579c8](https://github.com/WDaan/VueTorrent/commit/06579c8bbee5f991f195df596054da8751d0ea72))
* favicon [#441](https://github.com/WDaan/VueTorrent/issues/441) ([745376c](https://github.com/WDaan/VueTorrent/commit/745376c02be7a1d9398feb5181bebe9026d22638))
* favicon [#441](https://github.com/WDaan/VueTorrent/issues/441) ([b7e7de1](https://github.com/WDaan/VueTorrent/commit/b7e7de1e9095228d9207845201c0ceff814623a4))
- category download folder not showing correctly ([#448](https://github.com/WDaan/VueTorrent/issues/448))
([06579c8](https://github.com/WDaan/VueTorrent/commit/06579c8bbee5f991f195df596054da8751d0ea72))
- favicon [#441](https://github.com/WDaan/VueTorrent/issues/441) ([745376c](https://github.com/WDaan/VueTorrent/commit/745376c02be7a1d9398feb5181bebe9026d22638))
- favicon [#441](https://github.com/WDaan/VueTorrent/issues/441) ([b7e7de1](https://github.com/WDaan/VueTorrent/commit/b7e7de1e9095228d9207845201c0ceff814623a4))
### Improvements
* add ukranian ([e063168](https://github.com/WDaan/VueTorrent/commit/e06316812134df15ac1f5fbb73034436eb7d519c))
* use pages instead of modals [#398](https://github.com/WDaan/VueTorrent/issues/398) ([#450](https://github.com/WDaan/VueTorrent/issues/450)) ([fcb0219](https://github.com/WDaan/VueTorrent/commit/fcb021972ae62ee36e91bbbf5cba0ee6dc87725a))
- add ukranian ([e063168](https://github.com/WDaan/VueTorrent/commit/e06316812134df15ac1f5fbb73034436eb7d519c))
- use pages instead of modals [#398](https://github.com/WDaan/VueTorrent/issues/398) ([#450](https://github.com/WDaan/VueTorrent/issues/450))
([fcb0219](https://github.com/WDaan/VueTorrent/commit/fcb021972ae62ee36e91bbbf5cba0ee6dc87725a))
### [0.17.1](https://github.com/WDaan/VueTorrent/compare/v0.17.0...v0.17.1) (2022-06-11)
### Bug Fixes
* add progress border + percentage [#430](https://github.com/WDaan/VueTorrent/issues/430) ([acc0733](https://github.com/WDaan/VueTorrent/commit/acc07335d31b027cd7ca989959c6d450a957010e))
* category download folder [#435](https://github.com/WDaan/VueTorrent/issues/435) ([5a0ec26](https://github.com/WDaan/VueTorrent/commit/5a0ec26ddb7b9c7fc1a03102684fd2268b2ae33f))
* non-capital words ([#432](https://github.com/WDaan/VueTorrent/issues/432)) ([ce1e7c3](https://github.com/WDaan/VueTorrent/commit/ce1e7c3546c150243fede941bd8b4b724e4a5c27))
* white scrollbar [#433](https://github.com/WDaan/VueTorrent/issues/433) ([db86506](https://github.com/WDaan/VueTorrent/commit/db86506c5e493e2bb69e441e56d86d78667df54b))
- add progress border + percentage [#430](https://github.com/WDaan/VueTorrent/issues/430)
([acc0733](https://github.com/WDaan/VueTorrent/commit/acc07335d31b027cd7ca989959c6d450a957010e))
- category download folder [#435](https://github.com/WDaan/VueTorrent/issues/435) ([5a0ec26](https://github.com/WDaan/VueTorrent/commit/5a0ec26ddb7b9c7fc1a03102684fd2268b2ae33f))
- non-capital words ([#432](https://github.com/WDaan/VueTorrent/issues/432)) ([ce1e7c3](https://github.com/WDaan/VueTorrent/commit/ce1e7c3546c150243fede941bd8b4b724e4a5c27))
- white scrollbar [#433](https://github.com/WDaan/VueTorrent/issues/433) ([db86506](https://github.com/WDaan/VueTorrent/commit/db86506c5e493e2bb69e441e56d86d78667df54b))
### Improvements
* complete French translation ([#438](https://github.com/WDaan/VueTorrent/issues/438)) ([3a8ec90](https://github.com/WDaan/VueTorrent/commit/3a8ec90ca20dd20bf22d4af468031d347de7f686))
- complete French translation ([#438](https://github.com/WDaan/VueTorrent/issues/438))
([3a8ec90](https://github.com/WDaan/VueTorrent/commit/3a8ec90ca20dd20bf22d4af468031d347de7f686))
## [0.17.0](https://github.com/WDaan/VueTorrent/compare/v0.16.3...v0.17.0) (2022-06-05)
### Features
* add dialog missing options [#418](https://github.com/WDaan/VueTorrent/issues/418) ([68223f5](https://github.com/WDaan/VueTorrent/commit/68223f5f45da3a4819b43398707fed1e172468e8))
* piece states progress bar ([#426](https://github.com/WDaan/VueTorrent/issues/426)) ([1722a14](https://github.com/WDaan/VueTorrent/commit/1722a14dba74dafca3b373d50c6dcd94814ab074))
- add dialog missing options [#418](https://github.com/WDaan/VueTorrent/issues/418) ([68223f5](https://github.com/WDaan/VueTorrent/commit/68223f5f45da3a4819b43398707fed1e172468e8))
- piece states progress bar ([#426](https://github.com/WDaan/VueTorrent/issues/426))
([1722a14](https://github.com/WDaan/VueTorrent/commit/1722a14dba74dafca3b373d50c6dcd94814ab074))
### Bug Fixes
* allow native context menu in input elements ([#428](https://github.com/WDaan/VueTorrent/issues/428)) ([b8ad965](https://github.com/WDaan/VueTorrent/commit/b8ad965763fd647b230f7fcbd9798d182cefd762))
* load default folder [#417](https://github.com/WDaan/VueTorrent/issues/417) ([c63d0a4](https://github.com/WDaan/VueTorrent/commit/c63d0a403939c99a442a10563789cb8753d67771))
- allow native context menu in input elements ([#428](https://github.com/WDaan/VueTorrent/issues/428))
([b8ad965](https://github.com/WDaan/VueTorrent/commit/b8ad965763fd647b230f7fcbd9798d182cefd762))
- load default folder [#417](https://github.com/WDaan/VueTorrent/issues/417) ([c63d0a4](https://github.com/WDaan/VueTorrent/commit/c63d0a403939c99a442a10563789cb8753d67771))
### [0.16.3](https://github.com/WDaan/VueTorrent/compare/v0.16.2...v0.16.3) (2022-05-14)
### Bug Fixes
* speed limit dialog incorrect text display and zh-hant fix ([#425](https://github.com/WDaan/VueTorrent/issues/425)) ([45b244f](https://github.com/WDaan/VueTorrent/commit/45b244fbcf1ed63ebb2757a821343ed384a832f4))
- speed limit dialog incorrect text display and zh-hant fix ([#425](https://github.com/WDaan/VueTorrent/issues/425))
([45b244f](https://github.com/WDaan/VueTorrent/commit/45b244fbcf1ed63ebb2757a821343ed384a832f4))
### Improvements
* update Traditional Chinese translations ([#422](https://github.com/WDaan/VueTorrent/issues/422)) ([964b145](https://github.com/WDaan/VueTorrent/commit/964b1451a1758522856fae2c730af9db66e351a1))
- update Traditional Chinese translations ([#422](https://github.com/WDaan/VueTorrent/issues/422))
([964b145](https://github.com/WDaan/VueTorrent/commit/964b1451a1758522856fae2c730af9db66e351a1))
### [0.16.2](https://github.com/WDaan/VueTorrent/compare/v0.16.1...v0.16.2) (2022-05-08)
### Bug Fixes
* magnet text area max size [#413](https://github.com/WDaan/VueTorrent/issues/413) ([4dd81f7](https://github.com/WDaan/VueTorrent/commit/4dd81f7cd49ab807fddeb50ff2e871364fd955e5))
- magnet text area max size [#413](https://github.com/WDaan/VueTorrent/issues/413) ([4dd81f7](https://github.com/WDaan/VueTorrent/commit/4dd81f7cd49ab807fddeb50ff2e871364fd955e5))
### Improvements
* support more translations + add Simplified Chinese translations ([#415](https://github.com/WDaan/VueTorrent/issues/415)) ([ddd28ae](https://github.com/WDaan/VueTorrent/commit/ddd28ae6192862928ef26c1e1135565f6303095b))
* translation fixes ([#419](https://github.com/WDaan/VueTorrent/issues/419)) ([521ac58](https://github.com/WDaan/VueTorrent/commit/521ac5804a622c68d788de1f5730b0c43f49f0a1))
- support more translations + add Simplified Chinese translations ([#415](https://github.com/WDaan/VueTorrent/issues/415))
([ddd28ae](https://github.com/WDaan/VueTorrent/commit/ddd28ae6192862928ef26c1e1135565f6303095b))
- translation fixes ([#419](https://github.com/WDaan/VueTorrent/issues/419)) ([521ac58](https://github.com/WDaan/VueTorrent/commit/521ac5804a622c68d788de1f5730b0c43f49f0a1))
### [0.16.1](https://www.github.com/WDaan/VueTorrent/compare/v0.16.0...v0.16.1) (2022-04-17)
### Bug Fixes
* torrent progress color [#410](https://www.github.com/WDaan/VueTorrent/issues/410) ([886bc13](https://www.github.com/WDaan/VueTorrent/commit/886bc13f10d82b8973d6ea63fa051ae873b8aea2))
- torrent progress color [#410](https://www.github.com/WDaan/VueTorrent/issues/410)
([886bc13](https://www.github.com/WDaan/VueTorrent/commit/886bc13f10d82b8973d6ea63fa051ae873b8aea2))
### Improvements
* add all-time stats [#351](https://www.github.com/WDaan/VueTorrent/issues/351) ([a268e77](https://www.github.com/WDaan/VueTorrent/commit/a268e774def5875354129c06122898bad018d5ed))
* better authenticated check ([#411](https://www.github.com/WDaan/VueTorrent/issues/411)) ([ce698e3](https://www.github.com/WDaan/VueTorrent/commit/ce698e38a80fb7ba1dee01251451865df75f68d4))
* move notification banner to botton [#389](https://www.github.com/WDaan/VueTorrent/issues/389) ([4b90d56](https://www.github.com/WDaan/VueTorrent/commit/4b90d56df5a43bf466acafd3c7bb43a960bffab8))
* topmenu tooltip delay [#399](https://www.github.com/WDaan/VueTorrent/issues/399) ([2d5ad9d](https://www.github.com/WDaan/VueTorrent/commit/2d5ad9d44227f2ffd3e180eff9740e82ba0281cb))
- add all-time stats [#351](https://www.github.com/WDaan/VueTorrent/issues/351) ([a268e77](https://www.github.com/WDaan/VueTorrent/commit/a268e774def5875354129c06122898bad018d5ed))
- better authenticated check ([#411](https://www.github.com/WDaan/VueTorrent/issues/411))
([ce698e3](https://www.github.com/WDaan/VueTorrent/commit/ce698e38a80fb7ba1dee01251451865df75f68d4))
- move notification banner to botton [#389](https://www.github.com/WDaan/VueTorrent/issues/389)
([4b90d56](https://www.github.com/WDaan/VueTorrent/commit/4b90d56df5a43bf466acafd3c7bb43a960bffab8))
- topmenu tooltip delay [#399](https://www.github.com/WDaan/VueTorrent/issues/399)
([2d5ad9d](https://www.github.com/WDaan/VueTorrent/commit/2d5ad9d44227f2ffd3e180eff9740e82ba0281cb))
## [0.16.0](https://www.github.com/WDaan/VueTorrent/compare/v0.15.4...v0.16.0) (2022-04-16)
### Features
* add support for setting global speed limits ([#406](https://www.github.com/WDaan/VueTorrent/issues/406)) ([23fee41](https://www.github.com/WDaan/VueTorrent/commit/23fee419fd1561f440f88e4b354ac3745ed813cd))
- add support for setting global speed limits ([#406](https://www.github.com/WDaan/VueTorrent/issues/406))
([23fee41](https://www.github.com/WDaan/VueTorrent/commit/23fee419fd1561f440f88e4b354ac3745ed813cd))
### [0.15.4](https://www.github.com/WDaan/VueTorrent/compare/v0.15.3...v0.15.4) (2022-04-04)
### Bug Fixes
* low visibility text in dark theme ([#390](https://www.github.com/WDaan/VueTorrent/issues/390)) ([84750af](https://www.github.com/WDaan/VueTorrent/commit/84750af3d4d584f5fc0fd8f3cbabd1b0ecfa2e9f))
* PWA manifest [#405](https://www.github.com/WDaan/VueTorrent/issues/405) ([94727a1](https://www.github.com/WDaan/VueTorrent/commit/94727a142a1822c533c665d558ad4af6c207d5b9))
* search results not loading until stopped ([#391](https://www.github.com/WDaan/VueTorrent/issues/391)) ([8b126d8](https://www.github.com/WDaan/VueTorrent/commit/8b126d8df5607f1c31174fec81f86091f4ad47cf))
- low visibility text in dark theme ([#390](https://www.github.com/WDaan/VueTorrent/issues/390))
([84750af](https://www.github.com/WDaan/VueTorrent/commit/84750af3d4d584f5fc0fd8f3cbabd1b0ecfa2e9f))
- PWA manifest [#405](https://www.github.com/WDaan/VueTorrent/issues/405) ([94727a1](https://www.github.com/WDaan/VueTorrent/commit/94727a142a1822c533c665d558ad4af6c207d5b9))
- search results not loading until stopped ([#391](https://www.github.com/WDaan/VueTorrent/issues/391))
([8b126d8](https://www.github.com/WDaan/VueTorrent/commit/8b126d8df5607f1c31174fec81f86091f4ad47cf))
### Improvements
* add Japanese language support ([#401](https://www.github.com/WDaan/VueTorrent/issues/401)) ([a178205](https://www.github.com/WDaan/VueTorrent/commit/a1782058c8417e6a8c06acd22ce56418b4fe9419))
* add Spanish Language ([#385](https://www.github.com/WDaan/VueTorrent/issues/385)) ([d0f7055](https://www.github.com/WDaan/VueTorrent/commit/d0f7055148b6e88bb00c1c8cd58ec1fa123488e9))
* add Vietnamese ([#392](https://www.github.com/WDaan/VueTorrent/issues/392)) ([6019759](https://www.github.com/WDaan/VueTorrent/commit/6019759260d6561af29dbeb1a95497028b2b8b87))
- add Japanese language support ([#401](https://www.github.com/WDaan/VueTorrent/issues/401))
([a178205](https://www.github.com/WDaan/VueTorrent/commit/a1782058c8417e6a8c06acd22ce56418b4fe9419))
- add Spanish Language ([#385](https://www.github.com/WDaan/VueTorrent/issues/385))
([d0f7055](https://www.github.com/WDaan/VueTorrent/commit/d0f7055148b6e88bb00c1c8cd58ec1fa123488e9))
- add Vietnamese ([#392](https://www.github.com/WDaan/VueTorrent/issues/392)) ([6019759](https://www.github.com/WDaan/VueTorrent/commit/6019759260d6561af29dbeb1a95497028b2b8b87))
### [0.15.3](https://www.github.com/WDaan/VueTorrent/compare/v0.15.2...v0.15.3) (2022-02-28)
### Bug Fixes
* spelling mistake in README and "qBittorrent" casing ([#368](https://www.github.com/WDaan/VueTorrent/issues/368)) ([90d6623](https://www.github.com/WDaan/VueTorrent/commit/90d66237115f50828a38edec7b10caf817a55b66))
- spelling mistake in README and "qBittorrent" casing ([#368](https://www.github.com/WDaan/VueTorrent/issues/368))
([90d6623](https://www.github.com/WDaan/VueTorrent/commit/90d66237115f50828a38edec7b10caf817a55b66))
### [0.15.2](https://www.github.com/WDaan/VueTorrent/compare/v0.15.1...v0.15.2) (2022-01-13)
### Bug Fixes
* Qbittorrent title on tab ([05bcc9e](https://www.github.com/WDaan/VueTorrent/commit/05bcc9e58783e4de49d698cfd25c902fad7776de))
- Qbittorrent title on tab ([05bcc9e](https://www.github.com/WDaan/VueTorrent/commit/05bcc9e58783e4de49d698cfd25c902fad7776de))
### Improvements
* Chinese translations ([#363](https://www.github.com/WDaan/VueTorrent/issues/363)) ([6c7372b](https://www.github.com/WDaan/VueTorrent/commit/6c7372b41ef72387c7781e0dcfd51fb046fb7881))
- Chinese translations ([#363](https://www.github.com/WDaan/VueTorrent/issues/363))
([6c7372b](https://www.github.com/WDaan/VueTorrent/commit/6c7372b41ef72387c7781e0dcfd51fb046fb7881))
### [0.15.1](https://www.github.com/WDaan/VueTorrent/compare/v0.15.0...v0.15.1) (2022-01-13)
### Bug Fixes
* mention QBittorent [#356](https://www.github.com/WDaan/VueTorrent/issues/356) ([bbc31fb](https://www.github.com/WDaan/VueTorrent/commit/bbc31fb8c5be1cc1189000e53f90ba7886e05ba8))
- mention QBittorent [#356](https://www.github.com/WDaan/VueTorrent/issues/356) ([bbc31fb](https://www.github.com/WDaan/VueTorrent/commit/bbc31fb8c5be1cc1189000e53f90ba7886e05ba8))
### Improvements
* add French translations ([#337](https://www.github.com/WDaan/VueTorrent/issues/337)) ([30d5dc0](https://www.github.com/WDaan/VueTorrent/commit/30d5dc01c4349e0f52c5c58ec8f602ded16e706d))
* add Indonesian ([#361](https://www.github.com/WDaan/VueTorrent/issues/361)) ([908af5b](https://www.github.com/WDaan/VueTorrent/commit/908af5b3faaa07a327665df51f296a977ddef9e6))
* add Portugese ([#350](https://www.github.com/WDaan/VueTorrent/issues/350)) ([abb4c5b](https://www.github.com/WDaan/VueTorrent/commit/abb4c5ba69a779b729d99bb404fd59d25afb8b72))
* more translations ([4f8c697](https://www.github.com/WDaan/VueTorrent/commit/4f8c697757d818eeaf70d1c6970cd1f6000d6497))
- add French translations ([#337](https://www.github.com/WDaan/VueTorrent/issues/337))
([30d5dc0](https://www.github.com/WDaan/VueTorrent/commit/30d5dc01c4349e0f52c5c58ec8f602ded16e706d))
- add Indonesian ([#361](https://www.github.com/WDaan/VueTorrent/issues/361)) ([908af5b](https://www.github.com/WDaan/VueTorrent/commit/908af5b3faaa07a327665df51f296a977ddef9e6))
- add Portugese ([#350](https://www.github.com/WDaan/VueTorrent/issues/350)) ([abb4c5b](https://www.github.com/WDaan/VueTorrent/commit/abb4c5ba69a779b729d99bb404fd59d25afb8b72))
- more translations ([4f8c697](https://www.github.com/WDaan/VueTorrent/commit/4f8c697757d818eeaf70d1c6970cd1f6000d6497))
## [0.15.0](https://www.github.com/WDaan/VueTorrent/compare/v0.14.0...v0.15.0) (2021-11-27)
### Features
* 1st torrent progress in title [#166](https://www.github.com/WDaan/VueTorrent/issues/166) ([5faa248](https://www.github.com/WDaan/VueTorrent/commit/5faa248395e6edd4e892717fcd0ce41ae27efe08))
* add uploaded property ([#145](https://www.github.com/WDaan/VueTorrent/issues/145)) ([0a58d98](https://www.github.com/WDaan/VueTorrent/commit/0a58d98b9f50affee99f05fb4f93d9b37d38ac76))
* auto install search plugins when none installed ([abc5457](https://www.github.com/WDaan/VueTorrent/commit/abc5457882892ce4840ae0eef7a438e5ea4c7c90))
* auto refresh peers ([dfd10be](https://www.github.com/WDaan/VueTorrent/commit/dfd10beeab4c757ff1ac0c3eecbdc4e740573a75))
* auto releasing ci ([#146](https://www.github.com/WDaan/VueTorrent/issues/146)) ([d217627](https://www.github.com/WDaan/VueTorrent/commit/d217627d9ad15535bfe67116790a78414c44c673))
* basic limit share ratio [#308](https://www.github.com/WDaan/VueTorrent/issues/308) ([2c1fc34](https://www.github.com/WDaan/VueTorrent/commit/2c1fc34ebdc6f096628d23a6072ea1970764b267))
* basic multilang support ([#320](https://www.github.com/WDaan/VueTorrent/issues/320)) ([a7cc03c](https://www.github.com/WDaan/VueTorrent/commit/a7cc03c3ba60f7dbc2d18fff78a0b5f5c6db4b1a))
* bypass authentication ([#310](https://www.github.com/WDaan/VueTorrent/issues/310)) ([b069ce4](https://www.github.com/WDaan/VueTorrent/commit/b069ce490e74baf003c9c92cd780c51414702c13))
* checkbox + button with color feedback for TorrentDeleteModal ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
* copy name/hash/magnet [#277](https://www.github.com/WDaan/VueTorrent/issues/277) ([42afd92](https://www.github.com/WDaan/VueTorrent/commit/42afd921274c0be3fc122a4d5b8d2aeae5fe0c13))
* drawer on right side [#276](https://www.github.com/WDaan/VueTorrent/issues/276) ([a18bded](https://www.github.com/WDaan/VueTorrent/commit/a18bded9cb9792b3301008cc717b52053191c8f9))
* fullscreen toggle on torrent info modal (desktop) ([1de9e64](https://www.github.com/WDaan/VueTorrent/commit/1de9e6459657c386332d146352c3ed765f70fa3c))
* improved per-torrent speed limits modal ([#172](https://www.github.com/WDaan/VueTorrent/issues/172)) ([7bed9ee](https://www.github.com/WDaan/VueTorrent/commit/7bed9eef12321e06bb143d96f02326d967e6f739))
* New Logo ([b2858a4](https://www.github.com/WDaan/VueTorrent/commit/b2858a4f68238867996cfe5e61e0947dae3af022))
* New select mode color ([8f8d3db](https://www.github.com/WDaan/VueTorrent/commit/8f8d3dbb765d950baa9c5e7654a356e2d300ed28))
* open addmodal when dragging a file into the dashboard ([5807db5](https://www.github.com/WDaan/VueTorrent/commit/5807db5e99ac84436261e9d0e2b9a6767d851ba2))
* PWA splash & bar color ([dfbed5c](https://www.github.com/WDaan/VueTorrent/commit/dfbed5cb05c0b6974c09c86c6e82e1478f1100d6))
* remember delete with files preference [#291](https://www.github.com/WDaan/VueTorrent/issues/291) ([684bbec](https://www.github.com/WDaan/VueTorrent/commit/684bbecff0f7fe239f0ee05dfb5392b4a6401069))
* remove torrent files with checkbox [#199](https://www.github.com/WDaan/VueTorrent/issues/199) ([0eddf64](https://www.github.com/WDaan/VueTorrent/commit/0eddf6458ea3b72ce19282fbcd07e19ff96fd3f8))
* run external program on torrent completion [#258](https://www.github.com/WDaan/VueTorrent/issues/258) ([99fa1c4](https://www.github.com/WDaan/VueTorrent/commit/99fa1c419d47516a1e265e753c127fedf370ffec))
* Show connection status at the bottom of Navbar ([#255](https://www.github.com/WDaan/VueTorrent/issues/255)) ([204d74c](https://www.github.com/WDaan/VueTorrent/commit/204d74c4e84df5404819796e9e5078c01106990a))
* show created by info [#279](https://www.github.com/WDaan/VueTorrent/issues/279) ([7a7562e](https://www.github.com/WDaan/VueTorrent/commit/7a7562e54e66aebbf782baefa89b1f17e5119afa))
* Speed cards as pills with icon in first column and speed on top of the unit in second column ([#169](https://www.github.com/WDaan/VueTorrent/issues/169)) ([354fe4f](https://www.github.com/WDaan/VueTorrent/commit/354fe4f5f870bb48613ef390341c4c1971e2936e))
* torrent detail infinity sign for unlimited speeds ([#173](https://www.github.com/WDaan/VueTorrent/issues/173)) ([6f9a5d5](https://www.github.com/WDaan/VueTorrent/commit/6f9a5d5fefd9c0a2622ce62588ee717f762b7eee))
* use confirmation modal when deleting from context menu [#191](https://www.github.com/WDaan/VueTorrent/issues/191) ([53c548b](https://www.github.com/WDaan/VueTorrent/commit/53c548b502bacc95bab59026b836eb2bb2b785ec))
- 1st torrent progress in title [#166](https://www.github.com/WDaan/VueTorrent/issues/166)
([5faa248](https://www.github.com/WDaan/VueTorrent/commit/5faa248395e6edd4e892717fcd0ce41ae27efe08))
- add uploaded property ([#145](https://www.github.com/WDaan/VueTorrent/issues/145))
([0a58d98](https://www.github.com/WDaan/VueTorrent/commit/0a58d98b9f50affee99f05fb4f93d9b37d38ac76))
- auto install search plugins when none installed ([abc5457](https://www.github.com/WDaan/VueTorrent/commit/abc5457882892ce4840ae0eef7a438e5ea4c7c90))
- auto refresh peers ([dfd10be](https://www.github.com/WDaan/VueTorrent/commit/dfd10beeab4c757ff1ac0c3eecbdc4e740573a75))
- auto releasing ci ([#146](https://www.github.com/WDaan/VueTorrent/issues/146))
([d217627](https://www.github.com/WDaan/VueTorrent/commit/d217627d9ad15535bfe67116790a78414c44c673))
- basic limit share ratio [#308](https://www.github.com/WDaan/VueTorrent/issues/308)
([2c1fc34](https://www.github.com/WDaan/VueTorrent/commit/2c1fc34ebdc6f096628d23a6072ea1970764b267))
- basic multilang support ([#320](https://www.github.com/WDaan/VueTorrent/issues/320))
([a7cc03c](https://www.github.com/WDaan/VueTorrent/commit/a7cc03c3ba60f7dbc2d18fff78a0b5f5c6db4b1a))
- bypass authentication ([#310](https://www.github.com/WDaan/VueTorrent/issues/310))
([b069ce4](https://www.github.com/WDaan/VueTorrent/commit/b069ce490e74baf003c9c92cd780c51414702c13))
- checkbox + button with color feedback for TorrentDeleteModal ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
- copy name/hash/magnet [#277](https://www.github.com/WDaan/VueTorrent/issues/277)
([42afd92](https://www.github.com/WDaan/VueTorrent/commit/42afd921274c0be3fc122a4d5b8d2aeae5fe0c13))
- drawer on right side [#276](https://www.github.com/WDaan/VueTorrent/issues/276)
([a18bded](https://www.github.com/WDaan/VueTorrent/commit/a18bded9cb9792b3301008cc717b52053191c8f9))
- fullscreen toggle on torrent info modal (desktop) ([1de9e64](https://www.github.com/WDaan/VueTorrent/commit/1de9e6459657c386332d146352c3ed765f70fa3c))
- improved per-torrent speed limits modal ([#172](https://www.github.com/WDaan/VueTorrent/issues/172))
([7bed9ee](https://www.github.com/WDaan/VueTorrent/commit/7bed9eef12321e06bb143d96f02326d967e6f739))
- New Logo ([b2858a4](https://www.github.com/WDaan/VueTorrent/commit/b2858a4f68238867996cfe5e61e0947dae3af022))
- New select mode color ([8f8d3db](https://www.github.com/WDaan/VueTorrent/commit/8f8d3dbb765d950baa9c5e7654a356e2d300ed28))
- open addmodal when dragging a file into the dashboard ([5807db5](https://www.github.com/WDaan/VueTorrent/commit/5807db5e99ac84436261e9d0e2b9a6767d851ba2))
- PWA splash & bar color ([dfbed5c](https://www.github.com/WDaan/VueTorrent/commit/dfbed5cb05c0b6974c09c86c6e82e1478f1100d6))
- remember delete with files preference [#291](https://www.github.com/WDaan/VueTorrent/issues/291)
([684bbec](https://www.github.com/WDaan/VueTorrent/commit/684bbecff0f7fe239f0ee05dfb5392b4a6401069))
- remove torrent files with checkbox [#199](https://www.github.com/WDaan/VueTorrent/issues/199)
([0eddf64](https://www.github.com/WDaan/VueTorrent/commit/0eddf6458ea3b72ce19282fbcd07e19ff96fd3f8))
- run external program on torrent completion [#258](https://www.github.com/WDaan/VueTorrent/issues/258)
([99fa1c4](https://www.github.com/WDaan/VueTorrent/commit/99fa1c419d47516a1e265e753c127fedf370ffec))
- Show connection status at the bottom of Navbar ([#255](https://www.github.com/WDaan/VueTorrent/issues/255))
([204d74c](https://www.github.com/WDaan/VueTorrent/commit/204d74c4e84df5404819796e9e5078c01106990a))
- show created by info [#279](https://www.github.com/WDaan/VueTorrent/issues/279)
([7a7562e](https://www.github.com/WDaan/VueTorrent/commit/7a7562e54e66aebbf782baefa89b1f17e5119afa))
- Speed cards as pills with icon in first column and speed on top of the unit in second column ([#169](https://www.github.com/WDaan/VueTorrent/issues/169))
([354fe4f](https://www.github.com/WDaan/VueTorrent/commit/354fe4f5f870bb48613ef390341c4c1971e2936e))
- torrent detail infinity sign for unlimited speeds ([#173](https://www.github.com/WDaan/VueTorrent/issues/173))
([6f9a5d5](https://www.github.com/WDaan/VueTorrent/commit/6f9a5d5fefd9c0a2622ce62588ee717f762b7eee))
- use confirmation modal when deleting from context menu [#191](https://www.github.com/WDaan/VueTorrent/issues/191)
([53c548b](https://www.github.com/WDaan/VueTorrent/commit/53c548b502bacc95bab59026b836eb2bb2b785ec))
### Bug Fixes
* 0 speed when no speed data returned ([a7b8ed9](https://www.github.com/WDaan/VueTorrent/commit/a7b8ed9da3dbca8d2f3be0665880d3cda5f5a50b))
* add tracker dialog bug [#187](https://www.github.com/WDaan/VueTorrent/issues/187) ([7c7e40d](https://www.github.com/WDaan/VueTorrent/commit/7c7e40d4a5105ce3e0e9422551ad6cd2673da932))
* altspeed value ([aadb3f2](https://www.github.com/WDaan/VueTorrent/commit/aadb3f2171d38d5a94f9ca9847c50137669055b3))
* always fetch full data (more reliable) ([89cf6ba](https://www.github.com/WDaan/VueTorrent/commit/89cf6ba32c7a4b24cd0ea4d358e56e1d859d4665))
* application version getter ([#222](https://www.github.com/WDaan/VueTorrent/issues/222)) ([6535ac5](https://www.github.com/WDaan/VueTorrent/commit/6535ac56265d3062c877f35fa5e44b9635e26fcd))
* Context menu placement ([ed08c91](https://www.github.com/WDaan/VueTorrent/commit/ed08c914ebde9fba53e8b24f58c0a80918569b26))
* double click opens info [#287](https://www.github.com/WDaan/VueTorrent/issues/287) ([c8ffce5](https://www.github.com/WDaan/VueTorrent/commit/c8ffce59b1ebb7b72575f8797d35942bdfe62ef4))
* Establish Service WalkerRules ([#227](https://www.github.com/WDaan/VueTorrent/issues/227)) ([04971dc](https://www.github.com/WDaan/VueTorrent/commit/04971dcf874c2f952f57c3abef94d8d92337e488))
* Global Speed Title (upload & download were switched) ([#218](https://www.github.com/WDaan/VueTorrent/issues/218)) ([906f6d5](https://www.github.com/WDaan/VueTorrent/commit/906f6d5f872b848fc7b3c5071c51a9696ce7c734))
* interrupted divider in torrenfinfo [#151](https://www.github.com/WDaan/VueTorrent/issues/151) ([d362aef](https://www.github.com/WDaan/VueTorrent/commit/d362aef27574bb6a60c3675eef52655f1a57bebe))
* invisble close button on modal [#314](https://www.github.com/WDaan/VueTorrent/issues/314) [#297](https://www.github.com/WDaan/VueTorrent/issues/297) ([8001dc9](https://www.github.com/WDaan/VueTorrent/commit/8001dc91c738e4b9bfa9dd8a6b6b52249e727f5a))
* issue where 'torrent details' modal does not work properly on iOS ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
* layout issues + remove vue-perfect-scrollbar + refactor context menu ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
* logout [#286](https://www.github.com/WDaan/VueTorrent/issues/286) ([9121230](https://www.github.com/WDaan/VueTorrent/commit/912123098e5fca6193ebb6f66ad06c8442d07861))
* margin when freespace card is disabled ([6be41e3](https://www.github.com/WDaan/VueTorrent/commit/6be41e33cfb0eb365df18e53c396cd4a36d4b8e5))
* mobile search [#156](https://www.github.com/WDaan/VueTorrent/issues/156) - maybe redesign in future ([463dabd](https://www.github.com/WDaan/VueTorrent/commit/463dabde00a34c495d238aff4fd82ea65acc9e54))
* mobile search [#156](https://www.github.com/WDaan/VueTorrent/issues/156) - maybe redesign in future ([0f62f4d](https://www.github.com/WDaan/VueTorrent/commit/0f62f4df6763e4449b1ceab946092f9b67b06411))
* Persistent add modal ([d517d9f](https://www.github.com/WDaan/VueTorrent/commit/d517d9f3341e59de572118922b43a9e1adb8c9ad))
* push precompiled release in a public folder ([adfc6a0](https://www.github.com/WDaan/VueTorrent/commit/adfc6a00f2e0b2e09f7f4e67a2efc3dc1db50194))
* remove black box on iOS PWA [#180](https://www.github.com/WDaan/VueTorrent/issues/180) ([f918ff5](https://www.github.com/WDaan/VueTorrent/commit/f918ff5ee5c0ddd1c288caa261bbd95e40de4d24))
* remove device darkmode because its unreliable [#285](https://www.github.com/WDaan/VueTorrent/issues/285) ([e6c0863](https://www.github.com/WDaan/VueTorrent/commit/e6c0863545c4a6a24ecc57158ff61421d17f9070))
* remove gesture feature on tabs (buggy anyway) ([0960962](https://www.github.com/WDaan/VueTorrent/commit/0960962441e424c28c8ad6014a79f733f495b881))
* remove vue-context import ([edcd825](https://www.github.com/WDaan/VueTorrent/commit/edcd825969f6876b1962dc8875be4b9447704820))
* scrollbar ([c460e29](https://www.github.com/WDaan/VueTorrent/commit/c460e29d95eb034266b3ae1006ebb57001f5aa83))
* searchmodal pagination layout ([a9a9aff](https://www.github.com/WDaan/VueTorrent/commit/a9a9aff74f1310df724b0661011c97f798cdfaf6))
* selection list not cleared when closing deletemodal without button press ([80573f4](https://www.github.com/WDaan/VueTorrent/commit/80573f436498def7edae86e161535ef378c538e7))
* Settings>VueTorrent>Dashboard layout & UX ([d93e540](https://www.github.com/WDaan/VueTorrent/commit/d93e540a71c72bb274da14f36ae5fd72404bc65d))
* show torrent comment [#292](https://www.github.com/WDaan/VueTorrent/issues/292) ([4c3c2d3](https://www.github.com/WDaan/VueTorrent/commit/4c3c2d36d713c5f5fda2393a4cfc14b68b09244f))
* speedcard value cutoff [#141](https://www.github.com/WDaan/VueTorrent/issues/141) ([a81b1ea](https://www.github.com/WDaan/VueTorrent/commit/a81b1ea2e878b7e890b1c01037b54abba514f969))
* Torrent Detail modal with multiple tags shows only one tag selected [#167](https://www.github.com/WDaan/VueTorrent/issues/167) ([1973b5d](https://www.github.com/WDaan/VueTorrent/commit/1973b5dc520ed23682b7788a1ace3905d55c36d8))
* torrent done color to similar to seeding [#162](https://www.github.com/WDaan/VueTorrent/issues/162) ([bd71906](https://www.github.com/WDaan/VueTorrent/commit/bd7190685fd598d08ced9af9923e7cd3cfe50c5a))
* torrent search on enter [#149](https://www.github.com/WDaan/VueTorrent/issues/149) ([51fbec1](https://www.github.com/WDaan/VueTorrent/commit/51fbec13240f57dccd0177ee8e435f6aba290540))
* tweak search treshold [#250](https://www.github.com/WDaan/VueTorrent/issues/250) ([bdbc87b](https://www.github.com/WDaan/VueTorrent/commit/bdbc87b72423891a04a9c8c7a5de69e1d4ccd755))
* Update registerServiceWorker.js (delete all cache on when new version is released) ([d846c92](https://www.github.com/WDaan/VueTorrent/commit/d846c924937c99746cbf5a102b0de8ed27381a5d))
* wrong tempPathEnabled state [#284](https://www.github.com/WDaan/VueTorrent/issues/284) ([d8e2610](https://www.github.com/WDaan/VueTorrent/commit/d8e26104196120fdbb3475b36f4976c3619ba464))
- 0 speed when no speed data returned ([a7b8ed9](https://www.github.com/WDaan/VueTorrent/commit/a7b8ed9da3dbca8d2f3be0665880d3cda5f5a50b))
- add tracker dialog bug [#187](https://www.github.com/WDaan/VueTorrent/issues/187)
([7c7e40d](https://www.github.com/WDaan/VueTorrent/commit/7c7e40d4a5105ce3e0e9422551ad6cd2673da932))
- altspeed value ([aadb3f2](https://www.github.com/WDaan/VueTorrent/commit/aadb3f2171d38d5a94f9ca9847c50137669055b3))
- always fetch full data (more reliable) ([89cf6ba](https://www.github.com/WDaan/VueTorrent/commit/89cf6ba32c7a4b24cd0ea4d358e56e1d859d4665))
- application version getter ([#222](https://www.github.com/WDaan/VueTorrent/issues/222))
([6535ac5](https://www.github.com/WDaan/VueTorrent/commit/6535ac56265d3062c877f35fa5e44b9635e26fcd))
- Context menu placement ([ed08c91](https://www.github.com/WDaan/VueTorrent/commit/ed08c914ebde9fba53e8b24f58c0a80918569b26))
- double click opens info [#287](https://www.github.com/WDaan/VueTorrent/issues/287)
([c8ffce5](https://www.github.com/WDaan/VueTorrent/commit/c8ffce59b1ebb7b72575f8797d35942bdfe62ef4))
- Establish Service WalkerRules ([#227](https://www.github.com/WDaan/VueTorrent/issues/227))
([04971dc](https://www.github.com/WDaan/VueTorrent/commit/04971dcf874c2f952f57c3abef94d8d92337e488))
- Global Speed Title (upload & download were switched) ([#218](https://www.github.com/WDaan/VueTorrent/issues/218))
([906f6d5](https://www.github.com/WDaan/VueTorrent/commit/906f6d5f872b848fc7b3c5071c51a9696ce7c734))
- interrupted divider in torrenfinfo [#151](https://www.github.com/WDaan/VueTorrent/issues/151)
([d362aef](https://www.github.com/WDaan/VueTorrent/commit/d362aef27574bb6a60c3675eef52655f1a57bebe))
- invisble close button on modal [#314](https://www.github.com/WDaan/VueTorrent/issues/314) [#297](https://www.github.com/WDaan/VueTorrent/issues/297)
([8001dc9](https://www.github.com/WDaan/VueTorrent/commit/8001dc91c738e4b9bfa9dd8a6b6b52249e727f5a))
- issue where 'torrent details' modal does not work properly on iOS ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
- layout issues + remove vue-perfect-scrollbar + refactor context menu ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
- logout [#286](https://www.github.com/WDaan/VueTorrent/issues/286) ([9121230](https://www.github.com/WDaan/VueTorrent/commit/912123098e5fca6193ebb6f66ad06c8442d07861))
- margin when freespace card is disabled ([6be41e3](https://www.github.com/WDaan/VueTorrent/commit/6be41e33cfb0eb365df18e53c396cd4a36d4b8e5))
- mobile search [#156](https://www.github.com/WDaan/VueTorrent/issues/156) - maybe redesign in future
([463dabd](https://www.github.com/WDaan/VueTorrent/commit/463dabde00a34c495d238aff4fd82ea65acc9e54))
- mobile search [#156](https://www.github.com/WDaan/VueTorrent/issues/156) - maybe redesign in future
([0f62f4d](https://www.github.com/WDaan/VueTorrent/commit/0f62f4df6763e4449b1ceab946092f9b67b06411))
- Persistent add modal ([d517d9f](https://www.github.com/WDaan/VueTorrent/commit/d517d9f3341e59de572118922b43a9e1adb8c9ad))
- push precompiled release in a public folder ([adfc6a0](https://www.github.com/WDaan/VueTorrent/commit/adfc6a00f2e0b2e09f7f4e67a2efc3dc1db50194))
- remove black box on iOS PWA [#180](https://www.github.com/WDaan/VueTorrent/issues/180)
([f918ff5](https://www.github.com/WDaan/VueTorrent/commit/f918ff5ee5c0ddd1c288caa261bbd95e40de4d24))
- remove device darkmode because its unreliable [#285](https://www.github.com/WDaan/VueTorrent/issues/285)
([e6c0863](https://www.github.com/WDaan/VueTorrent/commit/e6c0863545c4a6a24ecc57158ff61421d17f9070))
- remove gesture feature on tabs (buggy anyway) ([0960962](https://www.github.com/WDaan/VueTorrent/commit/0960962441e424c28c8ad6014a79f733f495b881))
- remove vue-context import ([edcd825](https://www.github.com/WDaan/VueTorrent/commit/edcd825969f6876b1962dc8875be4b9447704820))
- scrollbar ([c460e29](https://www.github.com/WDaan/VueTorrent/commit/c460e29d95eb034266b3ae1006ebb57001f5aa83))
- searchmodal pagination layout ([a9a9aff](https://www.github.com/WDaan/VueTorrent/commit/a9a9aff74f1310df724b0661011c97f798cdfaf6))
- selection list not cleared when closing deletemodal without button press ([80573f4](https://www.github.com/WDaan/VueTorrent/commit/80573f436498def7edae86e161535ef378c538e7))
- Settings>VueTorrent>Dashboard layout & UX ([d93e540](https://www.github.com/WDaan/VueTorrent/commit/d93e540a71c72bb274da14f36ae5fd72404bc65d))
- show torrent comment [#292](https://www.github.com/WDaan/VueTorrent/issues/292)
([4c3c2d3](https://www.github.com/WDaan/VueTorrent/commit/4c3c2d36d713c5f5fda2393a4cfc14b68b09244f))
- speedcard value cutoff [#141](https://www.github.com/WDaan/VueTorrent/issues/141)
([a81b1ea](https://www.github.com/WDaan/VueTorrent/commit/a81b1ea2e878b7e890b1c01037b54abba514f969))
- Torrent Detail modal with multiple tags shows only one tag selected [#167](https://www.github.com/WDaan/VueTorrent/issues/167)
([1973b5d](https://www.github.com/WDaan/VueTorrent/commit/1973b5dc520ed23682b7788a1ace3905d55c36d8))
- torrent done color to similar to seeding [#162](https://www.github.com/WDaan/VueTorrent/issues/162)
([bd71906](https://www.github.com/WDaan/VueTorrent/commit/bd7190685fd598d08ced9af9923e7cd3cfe50c5a))
- torrent search on enter [#149](https://www.github.com/WDaan/VueTorrent/issues/149)
([51fbec1](https://www.github.com/WDaan/VueTorrent/commit/51fbec13240f57dccd0177ee8e435f6aba290540))
- tweak search treshold [#250](https://www.github.com/WDaan/VueTorrent/issues/250)
([bdbc87b](https://www.github.com/WDaan/VueTorrent/commit/bdbc87b72423891a04a9c8c7a5de69e1d4ccd755))
- Update registerServiceWorker.js (delete all cache on when new version is released)
([d846c92](https://www.github.com/WDaan/VueTorrent/commit/d846c924937c99746cbf5a102b0de8ed27381a5d))
- wrong tempPathEnabled state [#284](https://www.github.com/WDaan/VueTorrent/issues/284)
([d8e2610](https://www.github.com/WDaan/VueTorrent/commit/d8e26104196120fdbb3475b36f4976c3619ba464))
### Improvements
* 'Vue2-perfect-scrollbar' is no longer dependent ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
* better share limit modal ([#316](https://www.github.com/WDaan/VueTorrent/issues/316)) ([9f2ca42](https://www.github.com/WDaan/VueTorrent/commit/9f2ca4230da46431965d6ed0777f465554926494))
* Context (right click) menu refactor! Works way better on mobile ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
* more chinese translations ([65943ae](https://www.github.com/WDaan/VueTorrent/commit/65943aea02b1a349719a704492f2905b1f8f2f81))
* only update changed data + code cleanup ([664e4db](https://www.github.com/WDaan/VueTorrent/commit/664e4dbe2ff9bf04a2ef766fe2726d5f994b1228))
* Remove redundant dialog code, use Modal Mixin ([33cf62f](https://www.github.com/WDaan/VueTorrent/commit/33cf62ff9b6ea671dc1022e345a65705bd814640))
* softer red color [#155](https://www.github.com/WDaan/VueTorrent/issues/155) ([cbf845a](https://www.github.com/WDaan/VueTorrent/commit/cbf845a8a407895e8d6093c584ea96497c45cac0))
- 'Vue2-perfect-scrollbar' is no longer dependent ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
- better share limit modal ([#316](https://www.github.com/WDaan/VueTorrent/issues/316))
([9f2ca42](https://www.github.com/WDaan/VueTorrent/commit/9f2ca4230da46431965d6ed0777f465554926494))
- Context (right click) menu refactor! Works way better on mobile ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
- more chinese translations ([65943ae](https://www.github.com/WDaan/VueTorrent/commit/65943aea02b1a349719a704492f2905b1f8f2f81))
- only update changed data + code cleanup ([664e4db](https://www.github.com/WDaan/VueTorrent/commit/664e4dbe2ff9bf04a2ef766fe2726d5f994b1228))
- Remove redundant dialog code, use Modal Mixin ([33cf62f](https://www.github.com/WDaan/VueTorrent/commit/33cf62ff9b6ea671dc1022e345a65705bd814640))
- softer red color [#155](https://www.github.com/WDaan/VueTorrent/issues/155) ([cbf845a](https://www.github.com/WDaan/VueTorrent/commit/cbf845a8a407895e8d6093c584ea96497c45cac0))
## [0.13.0](https://www.github.com/WDaan/VueTorrent/compare/v0.12.0...v0.13.0) (2021-11-01)
### Features
* basic limit share ratio [#308](https://www.github.com/WDaan/VueTorrent/issues/308) ([2c1fc34](https://www.github.com/WDaan/VueTorrent/commit/2c1fc34ebdc6f096628d23a6072ea1970764b267))
* bypass authentication ([#310](https://www.github.com/WDaan/VueTorrent/issues/310)) ([b069ce4](https://www.github.com/WDaan/VueTorrent/commit/b069ce490e74baf003c9c92cd780c51414702c13))
- basic limit share ratio [#308](https://www.github.com/WDaan/VueTorrent/issues/308)
([2c1fc34](https://www.github.com/WDaan/VueTorrent/commit/2c1fc34ebdc6f096628d23a6072ea1970764b267))
- bypass authentication ([#310](https://www.github.com/WDaan/VueTorrent/issues/310))
([b069ce4](https://www.github.com/WDaan/VueTorrent/commit/b069ce490e74baf003c9c92cd780c51414702c13))
## [0.12.0](https://www.github.com/WDaan/VueTorrent/compare/v0.11.0...v0.12.0) (2021-08-29)
### Features
* remember delete with files preference [#291](https://www.github.com/WDaan/VueTorrent/issues/291) ([684bbec](https://www.github.com/WDaan/VueTorrent/commit/684bbecff0f7fe239f0ee05dfb5392b4a6401069))
- remember delete with files preference [#291](https://www.github.com/WDaan/VueTorrent/issues/291)
([684bbec](https://www.github.com/WDaan/VueTorrent/commit/684bbecff0f7fe239f0ee05dfb5392b4a6401069))
### Bug Fixes
* double click opens info [#287](https://www.github.com/WDaan/VueTorrent/issues/287) ([c8ffce5](https://www.github.com/WDaan/VueTorrent/commit/c8ffce59b1ebb7b72575f8797d35942bdfe62ef4))
* logout [#286](https://www.github.com/WDaan/VueTorrent/issues/286) ([9121230](https://www.github.com/WDaan/VueTorrent/commit/912123098e5fca6193ebb6f66ad06c8442d07861))
* remove device darkmode because its unreliable [#285](https://www.github.com/WDaan/VueTorrent/issues/285) ([e6c0863](https://www.github.com/WDaan/VueTorrent/commit/e6c0863545c4a6a24ecc57158ff61421d17f9070))
* show torrent comment [#292](https://www.github.com/WDaan/VueTorrent/issues/292) ([4c3c2d3](https://www.github.com/WDaan/VueTorrent/commit/4c3c2d36d713c5f5fda2393a4cfc14b68b09244f))
* wrong tempPathEnabled state [#284](https://www.github.com/WDaan/VueTorrent/issues/284) ([d8e2610](https://www.github.com/WDaan/VueTorrent/commit/d8e26104196120fdbb3475b36f4976c3619ba464))
- double click opens info [#287](https://www.github.com/WDaan/VueTorrent/issues/287)
([c8ffce5](https://www.github.com/WDaan/VueTorrent/commit/c8ffce59b1ebb7b72575f8797d35942bdfe62ef4))
- logout [#286](https://www.github.com/WDaan/VueTorrent/issues/286) ([9121230](https://www.github.com/WDaan/VueTorrent/commit/912123098e5fca6193ebb6f66ad06c8442d07861))
- remove device darkmode because its unreliable [#285](https://www.github.com/WDaan/VueTorrent/issues/285)
([e6c0863](https://www.github.com/WDaan/VueTorrent/commit/e6c0863545c4a6a24ecc57158ff61421d17f9070))
- show torrent comment [#292](https://www.github.com/WDaan/VueTorrent/issues/292)
([4c3c2d3](https://www.github.com/WDaan/VueTorrent/commit/4c3c2d36d713c5f5fda2393a4cfc14b68b09244f))
- wrong tempPathEnabled state [#284](https://www.github.com/WDaan/VueTorrent/issues/284)
([d8e2610](https://www.github.com/WDaan/VueTorrent/commit/d8e26104196120fdbb3475b36f4976c3619ba464))
## [0.11.0](https://www.github.com/WDaan/VueTorrent/compare/v0.10.0...v0.11.0) (2021-08-14)
### Features
* copy name/hash/magnet [#277](https://www.github.com/WDaan/VueTorrent/issues/277) ([42afd92](https://www.github.com/WDaan/VueTorrent/commit/42afd921274c0be3fc122a4d5b8d2aeae5fe0c13))
* drawer on right side [#276](https://www.github.com/WDaan/VueTorrent/issues/276) ([a18bded](https://www.github.com/WDaan/VueTorrent/commit/a18bded9cb9792b3301008cc717b52053191c8f9))
* Show connection status at the bottom of Navbar ([#255](https://www.github.com/WDaan/VueTorrent/issues/255)) ([204d74c](https://www.github.com/WDaan/VueTorrent/commit/204d74c4e84df5404819796e9e5078c01106990a))
* show created by info [#279](https://www.github.com/WDaan/VueTorrent/issues/279) ([7a7562e](https://www.github.com/WDaan/VueTorrent/commit/7a7562e54e66aebbf782baefa89b1f17e5119afa))
- copy name/hash/magnet [#277](https://www.github.com/WDaan/VueTorrent/issues/277)
([42afd92](https://www.github.com/WDaan/VueTorrent/commit/42afd921274c0be3fc122a4d5b8d2aeae5fe0c13))
- drawer on right side [#276](https://www.github.com/WDaan/VueTorrent/issues/276)
([a18bded](https://www.github.com/WDaan/VueTorrent/commit/a18bded9cb9792b3301008cc717b52053191c8f9))
- Show connection status at the bottom of Navbar ([#255](https://www.github.com/WDaan/VueTorrent/issues/255))
([204d74c](https://www.github.com/WDaan/VueTorrent/commit/204d74c4e84df5404819796e9e5078c01106990a))
- show created by info [#279](https://www.github.com/WDaan/VueTorrent/issues/279)
([7a7562e](https://www.github.com/WDaan/VueTorrent/commit/7a7562e54e66aebbf782baefa89b1f17e5119afa))
### Bug Fixes
* Persistent add modal ([d517d9f](https://www.github.com/WDaan/VueTorrent/commit/d517d9f3341e59de572118922b43a9e1adb8c9ad))
- Persistent add modal ([d517d9f](https://www.github.com/WDaan/VueTorrent/commit/d517d9f3341e59de572118922b43a9e1adb8c9ad))
## [0.10.0](https://www.github.com/WDaan/VueTorrent/compare/v0.9.0...v0.10.0) (2021-05-02)
### Features
* New select mode color ([8f8d3db](https://www.github.com/WDaan/VueTorrent/commit/8f8d3dbb765d950baa9c5e7654a356e2d300ed28))
* open addmodal when dragging a file into the dashboard ([5807db5](https://www.github.com/WDaan/VueTorrent/commit/5807db5e99ac84436261e9d0e2b9a6767d851ba2))
- New select mode color ([8f8d3db](https://www.github.com/WDaan/VueTorrent/commit/8f8d3dbb765d950baa9c5e7654a356e2d300ed28))
- open addmodal when dragging a file into the dashboard ([5807db5](https://www.github.com/WDaan/VueTorrent/commit/5807db5e99ac84436261e9d0e2b9a6767d851ba2))
### Bug Fixes
* application version getter ([#222](https://www.github.com/WDaan/VueTorrent/issues/222)) ([6535ac5](https://www.github.com/WDaan/VueTorrent/commit/6535ac56265d3062c877f35fa5e44b9635e26fcd))
* Context menu placement ([ed08c91](https://www.github.com/WDaan/VueTorrent/commit/ed08c914ebde9fba53e8b24f58c0a80918569b26))
* Establish Service WalkerRules ([#227](https://www.github.com/WDaan/VueTorrent/issues/227)) ([04971dc](https://www.github.com/WDaan/VueTorrent/commit/04971dcf874c2f952f57c3abef94d8d92337e488))
* Global Speed Title (upload & download were switched) ([#218](https://www.github.com/WDaan/VueTorrent/issues/218)) ([906f6d5](https://www.github.com/WDaan/VueTorrent/commit/906f6d5f872b848fc7b3c5071c51a9696ce7c734))
* remove vue-context import ([edcd825](https://www.github.com/WDaan/VueTorrent/commit/edcd825969f6876b1962dc8875be4b9447704820))
* scrollbar ([c460e29](https://www.github.com/WDaan/VueTorrent/commit/c460e29d95eb034266b3ae1006ebb57001f5aa83))
* tweak search treshold [#250](https://www.github.com/WDaan/VueTorrent/issues/250) ([bdbc87b](https://www.github.com/WDaan/VueTorrent/commit/bdbc87b72423891a04a9c8c7a5de69e1d4ccd755))
- application version getter ([#222](https://www.github.com/WDaan/VueTorrent/issues/222))
([6535ac5](https://www.github.com/WDaan/VueTorrent/commit/6535ac56265d3062c877f35fa5e44b9635e26fcd))
- Context menu placement ([ed08c91](https://www.github.com/WDaan/VueTorrent/commit/ed08c914ebde9fba53e8b24f58c0a80918569b26))
- Establish Service WalkerRules ([#227](https://www.github.com/WDaan/VueTorrent/issues/227))
([04971dc](https://www.github.com/WDaan/VueTorrent/commit/04971dcf874c2f952f57c3abef94d8d92337e488))
- Global Speed Title (upload & download were switched) ([#218](https://www.github.com/WDaan/VueTorrent/issues/218))
([906f6d5](https://www.github.com/WDaan/VueTorrent/commit/906f6d5f872b848fc7b3c5071c51a9696ce7c734))
- remove vue-context import ([edcd825](https://www.github.com/WDaan/VueTorrent/commit/edcd825969f6876b1962dc8875be4b9447704820))
- scrollbar ([c460e29](https://www.github.com/WDaan/VueTorrent/commit/c460e29d95eb034266b3ae1006ebb57001f5aa83))
- tweak search treshold [#250](https://www.github.com/WDaan/VueTorrent/issues/250)
([bdbc87b](https://www.github.com/WDaan/VueTorrent/commit/bdbc87b72423891a04a9c8c7a5de69e1d4ccd755))
### Performance Improvements
* Remove redundant dialog code, use Modal Mixin ([33cf62f](https://www.github.com/WDaan/VueTorrent/commit/33cf62ff9b6ea671dc1022e345a65705bd814640))
- Remove redundant dialog code, use Modal Mixin ([33cf62f](https://www.github.com/WDaan/VueTorrent/commit/33cf62ff9b6ea671dc1022e345a65705bd814640))
## [0.9.0](https://www.github.com/WDaan/VueTorrent/compare/v0.8.0...v0.9.0) (2021-04-15)
### Features
* checkbox + button with color feedback for TorrentDeleteModal ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
* New Logo ([b2858a4](https://www.github.com/WDaan/VueTorrent/commit/b2858a4f68238867996cfe5e61e0947dae3af022))
* remove torrent files with checkbox [#199](https://www.github.com/WDaan/VueTorrent/issues/199) ([0eddf64](https://www.github.com/WDaan/VueTorrent/commit/0eddf6458ea3b72ce19282fbcd07e19ff96fd3f8))
- checkbox + button with color feedback for TorrentDeleteModal ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
- New Logo ([b2858a4](https://www.github.com/WDaan/VueTorrent/commit/b2858a4f68238867996cfe5e61e0947dae3af022))
- remove torrent files with checkbox [#199](https://www.github.com/WDaan/VueTorrent/issues/199)
([0eddf64](https://www.github.com/WDaan/VueTorrent/commit/0eddf6458ea3b72ce19282fbcd07e19ff96fd3f8))
### Bug Fixes
* altspeed value ([aadb3f2](https://www.github.com/WDaan/VueTorrent/commit/aadb3f2171d38d5a94f9ca9847c50137669055b3))
* issue where 'torrent details' modal does not work properly on iOS ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
* layout issues + remove vue-perfect-scrollbar + refactor context menu ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
* selection list not cleared when closing deletemodal without button press ([80573f4](https://www.github.com/WDaan/VueTorrent/commit/80573f436498def7edae86e161535ef378c538e7))
- altspeed value ([aadb3f2](https://www.github.com/WDaan/VueTorrent/commit/aadb3f2171d38d5a94f9ca9847c50137669055b3))
- issue where 'torrent details' modal does not work properly on iOS ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
- layout issues + remove vue-perfect-scrollbar + refactor context menu ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
- selection list not cleared when closing deletemodal without button press ([80573f4](https://www.github.com/WDaan/VueTorrent/commit/80573f436498def7edae86e161535ef378c538e7))
### Performance Improvements
* 'Vue2-perfect-scrollbar' is no longer dependent ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
* Context (right click) menu refactor! Works way better on mobile ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
- 'Vue2-perfect-scrollbar' is no longer dependent ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
- Context (right click) menu refactor! Works way better on mobile ([a83ea14](https://www.github.com/WDaan/VueTorrent/commit/a83ea144cf1daac09fc76feff5d03347c8ea87ca))
## [0.8.0](https://www.github.com/WDaan/VueTorrent/compare/v0.7.0...v0.8.0) (2021-04-06)
### Features
* auto install search plugins when none installed ([abc5457](https://www.github.com/WDaan/VueTorrent/commit/abc5457882892ce4840ae0eef7a438e5ea4c7c90))
* auto refresh peers ([dfd10be](https://www.github.com/WDaan/VueTorrent/commit/dfd10beeab4c757ff1ac0c3eecbdc4e740573a75))
* fullscreen toggle on torrent info modal (desktop) ([1de9e64](https://www.github.com/WDaan/VueTorrent/commit/1de9e6459657c386332d146352c3ed765f70fa3c))
* PWA splash & bar color ([dfbed5c](https://www.github.com/WDaan/VueTorrent/commit/dfbed5cb05c0b6974c09c86c6e82e1478f1100d6))
* use confirmation modal when deleting from context menu [#191](https://www.github.com/WDaan/VueTorrent/issues/191) ([53c548b](https://www.github.com/WDaan/VueTorrent/commit/53c548b502bacc95bab59026b836eb2bb2b785ec))
- auto install search plugins when none installed ([abc5457](https://www.github.com/WDaan/VueTorrent/commit/abc5457882892ce4840ae0eef7a438e5ea4c7c90))
- auto refresh peers ([dfd10be](https://www.github.com/WDaan/VueTorrent/commit/dfd10beeab4c757ff1ac0c3eecbdc4e740573a75))
- fullscreen toggle on torrent info modal (desktop) ([1de9e64](https://www.github.com/WDaan/VueTorrent/commit/1de9e6459657c386332d146352c3ed765f70fa3c))
- PWA splash & bar color ([dfbed5c](https://www.github.com/WDaan/VueTorrent/commit/dfbed5cb05c0b6974c09c86c6e82e1478f1100d6))
- use confirmation modal when deleting from context menu [#191](https://www.github.com/WDaan/VueTorrent/issues/191)
([53c548b](https://www.github.com/WDaan/VueTorrent/commit/53c548b502bacc95bab59026b836eb2bb2b785ec))
### Bug Fixes
* 0 speed when no speed data returned ([a7b8ed9](https://www.github.com/WDaan/VueTorrent/commit/a7b8ed9da3dbca8d2f3be0665880d3cda5f5a50b))
* add tracker dialog bug [#187](https://www.github.com/WDaan/VueTorrent/issues/187) ([7c7e40d](https://www.github.com/WDaan/VueTorrent/commit/7c7e40d4a5105ce3e0e9422551ad6cd2673da932))
* always fetch full data (more reliable) ([89cf6ba](https://www.github.com/WDaan/VueTorrent/commit/89cf6ba32c7a4b24cd0ea4d358e56e1d859d4665))
* remove gesture feature on tabs (buggy anyway) ([0960962](https://www.github.com/WDaan/VueTorrent/commit/0960962441e424c28c8ad6014a79f733f495b881))
* Settings>VueTorrent>Dashboard layout & UX ([d93e540](https://www.github.com/WDaan/VueTorrent/commit/d93e540a71c72bb274da14f36ae5fd72404bc65d))
* Update registerServiceWorker.js (delete all cache on when new version is released) ([d846c92](https://www.github.com/WDaan/VueTorrent/commit/d846c924937c99746cbf5a102b0de8ed27381a5d))
- 0 speed when no speed data returned ([a7b8ed9](https://www.github.com/WDaan/VueTorrent/commit/a7b8ed9da3dbca8d2f3be0665880d3cda5f5a50b))
- add tracker dialog bug [#187](https://www.github.com/WDaan/VueTorrent/issues/187)
([7c7e40d](https://www.github.com/WDaan/VueTorrent/commit/7c7e40d4a5105ce3e0e9422551ad6cd2673da932))
- always fetch full data (more reliable) ([89cf6ba](https://www.github.com/WDaan/VueTorrent/commit/89cf6ba32c7a4b24cd0ea4d358e56e1d859d4665))
- remove gesture feature on tabs (buggy anyway) ([0960962](https://www.github.com/WDaan/VueTorrent/commit/0960962441e424c28c8ad6014a79f733f495b881))
- Settings>VueTorrent>Dashboard layout & UX ([d93e540](https://www.github.com/WDaan/VueTorrent/commit/d93e540a71c72bb274da14f36ae5fd72404bc65d))
- Update registerServiceWorker.js (delete all cache on when new version is released)
([d846c92](https://www.github.com/WDaan/VueTorrent/commit/d846c924937c99746cbf5a102b0de8ed27381a5d))
### Performance Improvements
* only update changed data + code cleanup ([664e4db](https://www.github.com/WDaan/VueTorrent/commit/664e4dbe2ff9bf04a2ef766fe2726d5f994b1228))
- only update changed data + code cleanup ([664e4db](https://www.github.com/WDaan/VueTorrent/commit/664e4dbe2ff9bf04a2ef766fe2726d5f994b1228))
## [0.7.0](https://www.github.com/WDaan/VueTorrent/compare/v0.6.0...v0.7.0) (2021-03-25)
### Features
* 1st torrent progress in title [#166](https://www.github.com/WDaan/VueTorrent/issues/166) ([5faa248](https://www.github.com/WDaan/VueTorrent/commit/5faa248395e6edd4e892717fcd0ce41ae27efe08))
* global pause/resume [#158](https://www.github.com/WDaan/VueTorrent/issues/158) ([28cdd0f](https://www.github.com/WDaan/VueTorrent/commit/28cdd0ff735f797d94c7b216990560c22030d101))
* improved per-torrent speed limits modal ([#172](https://www.github.com/WDaan/VueTorrent/issues/172)) ([7bed9ee](https://www.github.com/WDaan/VueTorrent/commit/7bed9eef12321e06bb143d96f02326d967e6f739))
* select all toggle [#161](https://www.github.com/WDaan/VueTorrent/issues/161) ([d3a5ac8](https://www.github.com/WDaan/VueTorrent/commit/d3a5ac8f978177e3cb69261c01e279e9615da2f4))
* Speed cards as pills with icon in first column and speed on top of the unit in second column ([#169](https://www.github.com/WDaan/VueTorrent/issues/169)) ([354fe4f](https://www.github.com/WDaan/VueTorrent/commit/354fe4f5f870bb48613ef390341c4c1971e2936e))
* torrent detail infinity sign for unlimited speeds ([#173](https://www.github.com/WDaan/VueTorrent/issues/173)) ([6f9a5d5](https://www.github.com/WDaan/VueTorrent/commit/6f9a5d5fefd9c0a2622ce62588ee717f762b7eee))
- 1st torrent progress in title [#166](https://www.github.com/WDaan/VueTorrent/issues/166)
([5faa248](https://www.github.com/WDaan/VueTorrent/commit/5faa248395e6edd4e892717fcd0ce41ae27efe08))
- global pause/resume [#158](https://www.github.com/WDaan/VueTorrent/issues/158)
([28cdd0f](https://www.github.com/WDaan/VueTorrent/commit/28cdd0ff735f797d94c7b216990560c22030d101))
- improved per-torrent speed limits modal ([#172](https://www.github.com/WDaan/VueTorrent/issues/172))
([7bed9ee](https://www.github.com/WDaan/VueTorrent/commit/7bed9eef12321e06bb143d96f02326d967e6f739))
- select all toggle [#161](https://www.github.com/WDaan/VueTorrent/issues/161) ([d3a5ac8](https://www.github.com/WDaan/VueTorrent/commit/d3a5ac8f978177e3cb69261c01e279e9615da2f4))
- Speed cards as pills with icon in first column and speed on top of the unit in second column ([#169](https://www.github.com/WDaan/VueTorrent/issues/169))
([354fe4f](https://www.github.com/WDaan/VueTorrent/commit/354fe4f5f870bb48613ef390341c4c1971e2936e))
- torrent detail infinity sign for unlimited speeds ([#173](https://www.github.com/WDaan/VueTorrent/issues/173))
([6f9a5d5](https://www.github.com/WDaan/VueTorrent/commit/6f9a5d5fefd9c0a2622ce62588ee717f762b7eee))
### Bug Fixes
* push precompiled release in a public folder ([adfc6a0](https://www.github.com/WDaan/VueTorrent/commit/adfc6a00f2e0b2e09f7f4e67a2efc3dc1db50194))
* remove black box on iOS PWA [#180](https://www.github.com/WDaan/VueTorrent/issues/180) ([f918ff5](https://www.github.com/WDaan/VueTorrent/commit/f918ff5ee5c0ddd1c288caa261bbd95e40de4d24))
* searchmodal pagination layout ([a9a9aff](https://www.github.com/WDaan/VueTorrent/commit/a9a9aff74f1310df724b0661011c97f798cdfaf6))
* Torrent Detail modal with multiple tags shows only one tag selected [#167](https://www.github.com/WDaan/VueTorrent/issues/167) ([1973b5d](https://www.github.com/WDaan/VueTorrent/commit/1973b5dc520ed23682b7788a1ace3905d55c36d8))
* torrent done color to similar to seeding [#162](https://www.github.com/WDaan/VueTorrent/issues/162) ([bd71906](https://www.github.com/WDaan/VueTorrent/commit/bd7190685fd598d08ced9af9923e7cd3cfe50c5a))
- push precompiled release in a public folder ([adfc6a0](https://www.github.com/WDaan/VueTorrent/commit/adfc6a00f2e0b2e09f7f4e67a2efc3dc1db50194))
- remove black box on iOS PWA [#180](https://www.github.com/WDaan/VueTorrent/issues/180)
([f918ff5](https://www.github.com/WDaan/VueTorrent/commit/f918ff5ee5c0ddd1c288caa261bbd95e40de4d24))
- searchmodal pagination layout ([a9a9aff](https://www.github.com/WDaan/VueTorrent/commit/a9a9aff74f1310df724b0661011c97f798cdfaf6))
- Torrent Detail modal with multiple tags shows only one tag selected [#167](https://www.github.com/WDaan/VueTorrent/issues/167)
([1973b5d](https://www.github.com/WDaan/VueTorrent/commit/1973b5dc520ed23682b7788a1ace3905d55c36d8))
- torrent done color to similar to seeding [#162](https://www.github.com/WDaan/VueTorrent/issues/162)
([bd71906](https://www.github.com/WDaan/VueTorrent/commit/bd7190685fd598d08ced9af9923e7cd3cfe50c5a))
## [0.6.0](https://www.github.com/WDaan/VueTorrent/compare/0.5.6...v0.6.0) (2021-02-17)
### Features
* add uploaded property ([#145](https://www.github.com/WDaan/VueTorrent/issues/145)) ([0a58d98](https://www.github.com/WDaan/VueTorrent/commit/0a58d98b9f50affee99f05fb4f93d9b37d38ac76))
* auto releasing ci ([#146](https://www.github.com/WDaan/VueTorrent/issues/146)) ([d217627](https://www.github.com/WDaan/VueTorrent/commit/d217627d9ad15535bfe67116790a78414c44c673))
- add uploaded property ([#145](https://www.github.com/WDaan/VueTorrent/issues/145))
([0a58d98](https://www.github.com/WDaan/VueTorrent/commit/0a58d98b9f50affee99f05fb4f93d9b37d38ac76))
- auto releasing ci ([#146](https://www.github.com/WDaan/VueTorrent/issues/146))
([d217627](https://www.github.com/WDaan/VueTorrent/commit/d217627d9ad15535bfe67116790a78414c44c673))
### Bug Fixes
* interrupted divider in torrenfinfo [#151](https://www.github.com/WDaan/VueTorrent/issues/151) ([d362aef](https://www.github.com/WDaan/VueTorrent/commit/d362aef27574bb6a60c3675eef52655f1a57bebe))
* margin when freespace card is disabled ([6be41e3](https://www.github.com/WDaan/VueTorrent/commit/6be41e33cfb0eb365df18e53c396cd4a36d4b8e5))
* mobile search [#156](https://www.github.com/WDaan/VueTorrent/issues/156) - maybe redesign in future ([463dabd](https://www.github.com/WDaan/VueTorrent/commit/463dabde00a34c495d238aff4fd82ea65acc9e54))
* mobile search [#156](https://www.github.com/WDaan/VueTorrent/issues/156) - maybe redesign in future ([0f62f4d](https://www.github.com/WDaan/VueTorrent/commit/0f62f4df6763e4449b1ceab946092f9b67b06411))
* speedcard value cutoff [#141](https://www.github.com/WDaan/VueTorrent/issues/141) ([a81b1ea](https://www.github.com/WDaan/VueTorrent/commit/a81b1ea2e878b7e890b1c01037b54abba514f969))
* torrent search on enter [#149](https://www.github.com/WDaan/VueTorrent/issues/149) ([51fbec1](https://www.github.com/WDaan/VueTorrent/commit/51fbec13240f57dccd0177ee8e435f6aba290540))
- interrupted divider in torrenfinfo [#151](https://www.github.com/WDaan/VueTorrent/issues/151)
([d362aef](https://www.github.com/WDaan/VueTorrent/commit/d362aef27574bb6a60c3675eef52655f1a57bebe))
- margin when freespace card is disabled ([6be41e3](https://www.github.com/WDaan/VueTorrent/commit/6be41e33cfb0eb365df18e53c396cd4a36d4b8e5))
- mobile search [#156](https://www.github.com/WDaan/VueTorrent/issues/156) - maybe redesign in future
([463dabd](https://www.github.com/WDaan/VueTorrent/commit/463dabde00a34c495d238aff4fd82ea65acc9e54))
- mobile search [#156](https://www.github.com/WDaan/VueTorrent/issues/156) - maybe redesign in future
([0f62f4d](https://www.github.com/WDaan/VueTorrent/commit/0f62f4df6763e4449b1ceab946092f9b67b06411))
- speedcard value cutoff [#141](https://www.github.com/WDaan/VueTorrent/issues/141)
([a81b1ea](https://www.github.com/WDaan/VueTorrent/commit/a81b1ea2e878b7e890b1c01037b54abba514f969))
- torrent search on enter [#149](https://www.github.com/WDaan/VueTorrent/issues/149)
([51fbec1](https://www.github.com/WDaan/VueTorrent/commit/51fbec13240f57dccd0177ee8e435f6aba290540))
### Performance Improvements
* softer red color [#155](https://www.github.com/WDaan/VueTorrent/issues/155) ([cbf845a](https://www.github.com/WDaan/VueTorrent/commit/cbf845a8a407895e8d6093c584ea96497c45cac0))
- softer red color [#155](https://www.github.com/WDaan/VueTorrent/issues/155) ([cbf845a](https://www.github.com/WDaan/VueTorrent/commit/cbf845a8a407895e8d6093c584ea96497c45cac0))

View file

@ -1,13 +1,13 @@
# VueTorrent
<p>
<img align="right" width="200px" src="https://imgur.com/x6dKNB3.png">
<img align="right" width="200px" src="https://imgur.com/x6dKNB3.png">
<p>&nbsp;</p>
The sleekest looking WebUI for qBittorrent made with Vue.js!
The sleekest looking WebUI for qBittorrent made with Vue.js!
> Vue, qBittorrent, Vuetify
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
@ -60,6 +60,7 @@ The sleekest looking WebUI for qBittorrent made with Vue.js!
- Pull changes every once in a while, using `git pull`
### Lazy/Easy
- use [hotio's qbittorrent](https://hotio.dev/containers/qbittorrent/) docker image, that comes pre-packed with VueTorrent.
[Alternative methods - May work for older QBit versions](../../wiki/Alternative_Installation_Methods)
@ -68,7 +69,7 @@ The sleekest looking WebUI for qBittorrent made with Vue.js!
- Clone the repo
- `npm install`
- `npm run serve`
- `npm run dev`
- `npm run lint` (to format the code)
- `docker-compose up -d` (to start qbittorrent docker => optional, you can edit `vue.config.js` as well)
- You now may open and access the WebUI under localhost with the default username `admin` and password `adminadmin`.
@ -106,7 +107,8 @@ I'll gladly accept help/pull requests & advice!
Open up an issue 😛
but before you do that:
- confirm you're on the latest version of VueTorrent
- confirm you're on the latest version of VueTorrent
- confirm there is no other issue mentioning the same problem
<a href="https://www.buymeacoffee.com/wdaan"><img src="https://img.buymeacoffee.com/button-api/?text=Buy me a coffee&emoji=&slug=wdaan&button_colour=FFDD00&font_colour=000000&font_family=Arial&outline_colour=000000&coffee_colour=ffffff"></a>

View file

@ -1,5 +1,14 @@
module.exports = {
presets: [
'@vue/app'
presets: ['@babel/preset-env'],
plugins: [
function () {
return {
visitor: {
MetaProperty(path) {
path.replaceWithSourceString('process')
}
}
}
}
]
}
}

View file

@ -1,18 +1,18 @@
version: '3.6'
services:
qbit:
image: linuxserver/qbittorrent:latest
container_name: qbit
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/London
- UMASK_SET=022
- WEBUI_PORT=8080
volumes:
- ./config:/config
- ./Downloads:/downloads
- ./vuetorrent:/vuetorrent
ports:
- 8080:8080
restart: unless-stopped
qbit:
image: linuxserver/qbittorrent:latest
container_name: qbit
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/London
- UMASK_SET=022
- WEBUI_PORT=8080
volumes:
- ./config:/config
- ./Downloads:/downloads
- ./vuetorrent:/vuetorrent
ports:
- 8080:8080
restart: unless-stopped

4
env.d.ts vendored Normal file
View file

@ -0,0 +1,4 @@
declare module '*.vue' {
import Vue from 'vue'
export default Vue
}

24
index.html Normal file
View file

@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="initial-scale=1, viewport-fit=cover, width=device-width" />
<title>VueTorrent</title>
<meta name="description" content="VueTorrent" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="mobile-web-app-capable" content="yes" />
<link rel="icon" href="/favicon.ico" type="image/png" sizes="16x16" />
<link rel="apple-touch-icon" href="/icons/apple-touch-icon.png" sizes="180x180" />
<link rel="mask-icon" href="/favicon.ico" color="#000" />
<meta name="theme-color" content="#000" />
</head>
<body oncontextmenu="return false">
<noscript>
<strong>We're sorry but Vuetorrent doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

View file

@ -1,8 +0,0 @@
module.exports = {
preset: '@vue/cli-plugin-unit-jest',
moduleFileExtensions: ['js', 'json', 'vue'],
transform: {
'.*\\.(vue)$': '@vue/vue2-jest',
'^.+\\.js$': '<rootDir>/node_modules/babel-jest'
}
}

27358
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,31 +1,28 @@
{
"name": "vuetorrent",
"version": "0.19.1",
"version": "0.21.3",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"test:unit": "vue-cli-service test:unit --setupTestFrameworkScriptFile=./tests/setup.js",
"lint": "vue-cli-service lint",
"start": "npm run serve"
"dev": "vite --host",
"build": "vite build",
"test": "npm run test:unit",
"test:unit": "vitest run",
"lint": "eslint --fix --ignore-path .gitignore && prettier . -w -u --ignore-path .gitignore",
"start": "npm run dev"
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"apexcharts": "^3.35.0",
"axios": "^0.26.1",
"core-js": "^3.22.0",
"dayjs": "^1.11.1",
"dayjs": "^1.10.4",
"fuse.js": "^6.5.3",
"lodash": "^4.17.21",
"register-service-worker": "^1.7.2",
"sass-loader": "^12.6.0",
"typeface-roboto": "^1.1.13",
"typeface-roboto-mono": "^1.1.13",
"uuid": "^8.3.2",
"vue": "^2.7",
"vue": "^2.7.14",
"vue-apexcharts": "^1.6.2",
"vue-i18n": "^8.26.7",
"vue-router": "^3.5.1",
"vue-i18n": "^8",
"vue-router": "^3.6.5",
"vue-toastification": "^1.7.11",
"vuedraggable": "^2.24.3",
"vuetify": "^2.6.10",
@ -33,27 +30,26 @@
"vuex-persist": "^3.1.3"
},
"devDependencies": {
"@babel/eslint-parser": "^7.17",
"@mdi/js": "^5.9.55",
"@vue/babel-preset-app": "^5.0.4",
"@vue/cli-plugin-babel": "^5.0.4",
"@vue/cli-plugin-eslint": "^5.0.4",
"@vue/cli-plugin-pwa": "^5.0.4",
"@vue/cli-plugin-unit-jest": "^5.0.4",
"@vue/cli-service": "^5.0.4",
"@vue/eslint-config-prettier": "^7.0.0",
"@vue/test-utils": "^1.3",
"@vue/vue2-jest": "^27.0.0-alpha.4",
"eslint": "^8.13.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-prettier": "^3.3.1",
"eslint-plugin-vue": "^7.17.0",
"fibers": "^5.0.0",
"node-sass": "^7.0.0",
"sass": "~1.32.0",
"vue-cli-plugin-vuetify": "^2.4.2",
"vue-template-compiler": "^2.6.11",
"vuetify-loader": "^1.7.0"
"@types/jsdom": "^20.0.1",
"@typescript-eslint/eslint-plugin": "^5",
"@typescript-eslint/parser": "^5",
"@vitejs/plugin-vue2": "^2",
"@vue/eslint-config-typescript": "^11",
"@vue/test-utils": "^1",
"eslint": "^8",
"eslint-config-prettier": "^8",
"eslint-plugin-prettier": "^4",
"eslint-plugin-vue": "^9",
"jsdom": "^20.0.2",
"prettier": "^2",
"sass": "~1.32.12",
"unplugin-vue-components": "^0.22",
"vite": "^3",
"vite-plugin-eslint": "^1",
"vite-plugin-pwa": "^0.13",
"vitest": "^0.25",
"vue-template-compiler": "^2"
},
"browserslist": [
"> 1%",

View file

@ -1,13 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="mobile-web-app-capable" content="yes">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" type="image/png" href="./favicon.ico?s=1">
<link rel="icon" href="./img/icons/favicon.svg" sizes="any" type="image/svg+xml">
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<link rel="icon" type="image/png" href="./favicon.ico?s=1" />
<link rel="icon" href="./img/icons/favicon.svg" sizes="any" type="image/svg+xml" />
<title>qBittorrent</title>
</head>
<body>

View file

@ -1,11 +1,6 @@
<template>
<v-app>
<component
:is="modal.component"
v-for="modal in modals"
:key="modal.guid"
v-bind="{ guid: modal.guid, ...modal.props }"
/>
<component :is="modal.component" v-for="modal in modals" :key="modal.guid" v-bind="{ guid: modal.guid, ...modal.props }" />
<Navbar v-if="isAuthenticated" />
<v-main class="background">
<router-view />
@ -18,6 +13,7 @@ import { mapState, mapGetters } from 'vuex'
import Navbar from '@/components/Navbar/Navbar.vue'
import qbit from '@/services/qbit'
import { General } from '@/mixins'
import { getVersion } from './helpers'
export default {
name: 'App',
@ -34,7 +30,7 @@ export default {
}
},
created() {
this.$store.commit('SET_APP_VERSION', process.env['APPLICATION_VERSION'])
this.$store.commit('SET_APP_VERSION', getVersion())
this.$store.commit('SET_LANGUAGE')
this.checkAuthentication()
this.blockContextMenu()

View file

@ -1,10 +1,7 @@
export class Hostname {
static get(url) {
const match = url.match(/:\/\/(www[0-9]?\.)?(.[^/:]+)/i)
if (match != null &&
match.length > 2 &&
typeof match[2] === 'string' &&
match[2].length > 0) {
if (match != null && match.length > 2 && typeof match[2] === 'string' && match[2].length > 0) {
return match[2]
} else {
return ''

View file

@ -1,6 +1,4 @@
import { ArrayHelper } from './ArrayHelper'
import { Hostname } from './Hostname'
export {
ArrayHelper, Hostname
}
export { ArrayHelper, Hostname }

View file

@ -1,7 +1,6 @@
import { formatBytes } from '@/helpers'
import store from '../store'
export class DocumentTitle {
static setDefault() {
this.set('qBittorrent')

View file

@ -17,8 +17,6 @@ export class Tags {
if (response.tags) {
store.state.tags = ArrayHelper.concat(store.state.tags, response.tags)
}
}
}

View file

@ -4,7 +4,8 @@ import Torrent from '@/models/Torrent'
export class Torrents {
static update(data) {
if (store.state.webuiSettings.showTrackerFilter) { // dont calculate trackers when disabled
if (store.state.webuiSettings.showTrackerFilter) {
// dont calculate trackers when disabled
if (store.state.sort_options.tracker !== null) {
data = data.filter(d => Hostname.get(d.tracker) === store.state.sort_options.tracker)

View file

@ -4,7 +4,8 @@ import { Hostname } from '@/Helpers/index.js'
export class Trackers {
static update(data) {
if (store.state.webuiSettings.showTrackerFilter) {
store.state.trackers = data.map(t => t.tracker)
store.state.trackers = data
.map(t => t.tracker)
.map(url => Hostname.get(url))
.filter((domain, index, self) => index === self.indexOf(domain) && domain)
.sort()

View file

@ -5,7 +5,4 @@ import { Trackers } from './Trackers'
import { Graph } from './Graph'
import { ServerStatus } from './ServerStatus'
export {
DocumentTitle, Tags, Torrents, Trackers,
Graph, ServerStatus
}
export { DocumentTitle, Tags, Torrents, Trackers, Graph, ServerStatus }

View file

@ -1,13 +1,5 @@
<template>
<v-card
v-ripple
flat
rounded="md"
color="secondary"
class="speedCard"
data-testid="SpeedCard"
@click="open"
>
<v-card v-ripple flat rounded="md" color="secondary" class="speedCard" data-testid="SpeedCard" @click="open">
<v-layout row align-center :class="color + '--text'">
<v-flex v-if="icon" xs2 class="pl-1">
<v-icon data-testid="SpeedCard-icon" :color="color" size="20px">
@ -20,12 +12,8 @@
{{ value | getSpeedValue }}
</span>
</v-flex>
<v-flex
class="caption robot-mono text-center mt-n1"
>
<span data-testid="SpeedCard-unit">
{{ value | getDataUnit(1) }}/s
</span>
<v-flex class="caption robot-mono text-center mt-n1">
<span data-testid="SpeedCard-unit"> {{ value | getDataUnit(1) }}/s </span>
</v-flex>
</v-layout>
</v-layout>
@ -60,7 +48,7 @@ export default {
<style scoped>
.speedCard {
padding: 20px 20px !important;
font-size: 1.10em;
font-size: 1.1em;
cursor: pointer;
}
</style>

View file

@ -2,11 +2,7 @@
<v-card flat color="secondary" class="mr-2 ml-2">
<v-layout row wrap class="pa-3 mx-auto">
<v-flex md6>
<div
style="margin-top: 6px"
:class="color + '--text'"
data-testid="StorageCard-label"
>
<div style="margin-top: 6px" :class="color + '--text'" data-testid="StorageCard-label">
{{ label }}
</div>
</v-flex>
@ -27,4 +23,4 @@ export default {
name: 'StorageCard',
props: ['color', 'label', 'value']
}
</script>
</script>

View file

@ -10,36 +10,20 @@
>
<div
class="noselect"
style="
position:fixed;
left:0;
top:0;
width:100%;
height:100%;
"
style="position: fixed; left: 0; top: 0; width: 100%; height: 100%"
@drop.prevent="addDropFile"
@dragover.prevent="showWrapDrag = true"
@dragend.prevent="showWrapDrag = false"
@dragleave.prevent="DragLeave"
/>
<v-card
:class="showWrapDrag ? 'wrap-drag' : ''"
@drop.prevent="addDropFile"
@dragover.prevent="showWrapDrag = true"
@dragend.prevent="showWrapDrag = false"
>
<v-card :class="showWrapDrag ? 'wrap-drag' : ''" @drop.prevent="addDropFile" @dragover.prevent="showWrapDrag = true" @dragend.prevent="showWrapDrag = false">
<v-container :class="`pa-0 project done`">
<v-card-title class="justify-center">
<v-toolbar flat dense class="transparent">
<v-toolbar-title class="mx-auto">
<h2>{{ $t('modals.add.title') }}</h2>
</v-toolbar-title>
<v-btn
fab
small
class="transparent elevation-0"
@click="close"
>
<v-btn fab small class="transparent elevation-0" @click="close">
<v-icon>{{ mdiClose }}</v-icon>
</v-btn>
</v-toolbar>
@ -61,25 +45,12 @@
outlined
:show-size="1000"
>
<template
#selection="{ index, text }"
>
<v-chip
v-if="index < 2"
color="deep-purple accent-4"
dark
label
small
>
<template #selection="{ index, text }">
<v-chip v-if="index < 2" color="deep-purple accent-4" dark label small>
{{ text }}
</v-chip>
<span
v-else-if="index === 2"
class="overline grey--text text--darken-3 mx-2"
>
+{{
files.length - 2
}}
<span v-else-if="index === 2" class="overline grey--text text--darken-3 mx-2">
+{{ files.length - 2 }}
File(s)
</span>
</template>
@ -100,15 +71,7 @@
</v-col>
</v-row>
<v-combobox
v-model="category"
:items="availableCategories"
clearable
:label="$t('category')"
item-text="name"
:prepend-icon="mdiTag"
@input="categoryChanged"
/>
<v-combobox v-model="category" :items="availableCategories" clearable :label="$t('category')" item-text="name" :prepend-icon="mdiTag" @input="categoryChanged" />
<v-text-field
v-model="directory"
@ -120,46 +83,22 @@
/>
<v-row no-gutters>
<v-flex xs12 sm6>
<v-checkbox
v-model="start"
:label="$t('modals.add.starttorrent')"
hide-details
/>
<v-checkbox v-model="start" :label="$t('modals.add.starttorrent')" hide-details />
</v-flex>
<v-flex xs12 sm6>
<v-checkbox
v-model="skip_checking"
:label="$t('modals.add.skipHashCheck')"
hide-details
/>
<v-checkbox v-model="skip_checking" :label="$t('modals.add.skipHashCheck')" hide-details />
</v-flex>
<v-flex xs12 sm6>
<v-checkbox
v-model="root_folder"
:label="$t('modals.add.createSubfolder')"
hide-details
/>
<v-checkbox v-model="root_folder" :label="$t('modals.add.createSubfolder')" hide-details />
</v-flex>
<v-flex xs12 sm6>
<v-checkbox
v-model="autoTMM"
:label="$t('modals.add.automaticTorrentManagement')"
hide-details
/>
<v-checkbox v-model="autoTMM" :label="$t('modals.add.automaticTorrentManagement')" hide-details />
</v-flex>
<v-flex xs12 sm6>
<v-checkbox
v-model="sequentialDownload"
:label="$t('rightClick.advanced.sequentialDownload')"
hide-details
/>
<v-checkbox v-model="sequentialDownload" :label="$t('rightClick.advanced.sequentialDownload')" hide-details />
</v-flex>
<v-flex xs12 sm6>
<v-checkbox
v-model="firstLastPiecePrio"
:label="$t('rightClick.advanced.firstLastPriority')"
hide-details
/>
<v-checkbox v-model="firstLastPiecePrio" :label="$t('rightClick.advanced.firstLastPriority')" hide-details />
</v-flex>
</v-row>
</v-container>
@ -169,24 +108,9 @@
<v-spacer />
<v-form>
<v-card-actions class="justify-center">
<v-btn
ref="addTorrent"
text
:disabled="!valid"
class="accent white--text mx-0 mt-3"
@click="submit"
>
Add Torrent
</v-btn>
<v-btn ref="addTorrent" text :disabled="!valid" class="accent white--text mx-0 mt-3" @click="submit"> Add Torrent </v-btn>
<v-fab-transition v-if="phoneLayout">
<v-btn
color="red"
dark
absolute
bottom
right
@click="close"
>
<v-btn color="red" dark absolute bottom right @click="close">
<v-icon>{{ mdiClose }}</v-icon>
</v-btn>
</v-fab-transition>
@ -197,15 +121,7 @@
<div
v-show="showWrapDrag"
class="wrap-drag noselect"
style="
position:fixed;
left:0;
top:0;
width:100%;
height:100%;
text-align:center;
background-color: rgb(0,0,0,.5)
"
style="position: fixed; left: 0; top: 0; width: 100%; height: 100%; text-align: center; background-color: rgb(0, 0, 0, 0.5)"
>
<div class="align white--text">
<div>
@ -259,7 +175,12 @@ export default {
loading: false,
urls: null,
valid: false,
mdiCloudUpload, mdiFolder, mdiTag, mdiPaperclip, mdiLink, mdiClose
mdiCloudUpload,
mdiFolder,
mdiTag,
mdiPaperclip,
mdiLink,
mdiClose
}
},
computed: {
@ -304,8 +225,7 @@ export default {
},
addDropFile(e) {
this.showWrapDrag = false
if (!this.urls)
this.files.push(...Array.from(e.dataTransfer.files))
if (!this.urls) this.files.push(...Array.from(e.dataTransfer.files))
},
startDropFile() {
this.showWrapDrag = true
@ -314,10 +234,8 @@ export default {
this.showWrapDrag = false
},
closeWrap() {
if (this.showWrapDrag)
this.showWrapDrag = false
else
this.close()
if (this.showWrapDrag) this.showWrapDrag = false
else this.close()
},
submit() {
if (this.files.length || this.urls) {
@ -366,7 +284,7 @@ export default {
}
.wrap-drag .align {
margin: -.5em 0 0;
margin: -0.5em 0 0;
position: absolute;
top: 50%;
left: 0;

View file

@ -1,10 +1,5 @@
<template>
<v-dialog
v-model="dialog"
scrollable
:width="dialogWidth"
:fullscreen="isPhone"
>
<v-dialog v-model="dialog" scrollable :width="dialogWidth" :fullscreen="isPhone">
<v-card>
<v-card-title class="pa-0">
<v-toolbar-title class="ma-4 primarytext--text">
@ -15,34 +10,18 @@
<v-container>
<v-row>
<v-col>
<v-text-field
v-model="torrent.name"
:label="$t('modals.changeLocation.torrentName')"
:prepend-icon="mdiFile"
readonly
/>
<v-text-field
v-model="newPath"
:label="$t('directory')"
:prepend-icon="mdiFolder"
@keydown.enter="setLocation"
/>
<v-text-field v-model="torrent.name" :label="$t('modals.changeLocation.torrentName')" :prepend-icon="mdiFile" readonly />
<v-text-field v-model="newPath" :label="$t('directory')" :prepend-icon="mdiFolder" @keydown.enter="setLocation" />
</v-col>
</v-row>
</v-container>
</v-card-text>
<v-divider />
<v-card-actions class="justify-end">
<v-btn
class="accent white--text elevation-0 px-4"
@click="setLocation"
>
<v-btn class="accent white--text elevation-0 px-4" @click="setLocation">
{{ $t('save') }}
</v-btn>
<v-btn
class="error white--text elevation-0 px-4"
@click="close"
>
<v-btn class="error white--text elevation-0 px-4" @click="close">
{{ $t('cancel') }}
</v-btn>
</v-card-actions>
@ -65,7 +44,9 @@ export default {
data() {
return {
newPath: '',
mdiFile, mdiFolder, mdiClose
mdiFile,
mdiFolder,
mdiClose
}
},
computed: {

View file

@ -1,10 +1,5 @@
<template>
<v-dialog
v-model="dialog"
scrollable
content-class="rounded-form"
max-width="600px"
>
<v-dialog v-model="dialog" scrollable content-class="rounded-form" max-width="600px">
<v-card class="pa-2">
<v-card-title class="pa-0">
<v-toolbar-title class="mx-4 mt-2">
@ -13,40 +8,21 @@
</v-card-title>
<v-card-text class="px-6p py-2 mb-2">
<v-list flat class="mb-4">
<v-list-item
v-for="t in torrents"
:key="t.hash"
else
>
<v-list-item v-for="t in torrents" :key="t.hash" else>
<v-list-item-content>
<v-list-item-title
class="text-wrap"
v-text="t.name"
/>
<v-list-item-title class="text-wrap" v-text="t.name" />
</v-list-item-content>
</v-list-item>
</v-list>
<v-checkbox
v-model="settings.deleteWithFiles"
class="ma-0 pa-0"
:label="$t('modals.delete.check')"
hide-details
/>
<v-checkbox v-model="settings.deleteWithFiles" class="ma-0 pa-0" :label="$t('modals.delete.check')" hide-details />
</v-card-text>
<v-divider />
<v-card-actions class="justify-end">
<v-btn
class="white--text elevation-0 px-4"
:class="settings.deleteWithFiles ? 'error' : 'info'"
@click="deleteTorrent()"
>
<v-btn class="white--text elevation-0 px-4" :class="settings.deleteWithFiles ? 'error' : 'info'" @click="deleteTorrent()">
{{ $t('delete') }}
</v-btn>
<v-spacer />
<v-btn
class="grey white--text elevation-0 px-4"
@click="close()"
>
<v-btn class="grey white--text elevation-0 px-4" @click="close()">
{{ $t('cancel') }}
</v-btn>
</v-card-actions>

View file

@ -1,11 +1,5 @@
<template>
<v-dialog
v-model="dialog"
scrollable
max-width="750px"
:content-class="isPhone ? 'rounded-0' : 'rounded-form'"
:fullscreen="isPhone"
>
<v-dialog v-model="dialog" scrollable max-width="750px" :content-class="isPhone ? 'rounded-0' : 'rounded-form'" :fullscreen="isPhone">
<v-card>
<v-card-title class="pa-0">
<v-toolbar-title class="ma-4 primarytext--text">
@ -16,38 +10,19 @@
<v-container>
<v-row>
<v-col>
<v-textarea
v-model="name"
rows="1"
auto-grow
clearable
:label="$t('modals.rename.torrentName')"
:prepend-inner-icon="mdiFile"
/>
<v-textarea v-model="name" rows="1" auto-grow clearable :label="$t('modals.rename.torrentName')" :prepend-inner-icon="mdiFile" />
</v-col>
</v-row>
</v-container>
</v-card-text>
<v-divider />
<v-card-actions class="justify-end">
<v-btn
v-if="enableUrlDecode"
class="info white--text elevation-0 px-4"
@click="urlDecode"
>
URL DECODE
</v-btn>
<v-btn v-if="enableUrlDecode" class="info white--text elevation-0 px-4" @click="urlDecode"> URL DECODE </v-btn>
<v-spacer />
<v-btn
class="accent white--text elevation-0 px-4"
@click="rename"
>
<v-btn class="accent white--text elevation-0 px-4" @click="rename">
{{ $t('save') }}
</v-btn>
<v-btn
class="error white--text elevation-0 px-4"
@click="close"
>
<v-btn class="error white--text elevation-0 px-4" @click="close">
{{ $t('cancel') }}
</v-btn>
</v-card-actions>
@ -95,8 +70,7 @@ export default {
this.enableUrlDecode = false
if (this.name.indexOf(' ') == -1) {
const exp = /\+|%/
if (exp.test(this.name))
this.enableUrlDecode = true
if (exp.test(this.name)) this.enableUrlDecode = true
}
},
rename() {

View file

@ -9,34 +9,19 @@
<v-card-text>
<v-form ref="feedForm" class="px-6 mt-3">
<v-container>
<v-text-field
v-model="feed.url"
:label="$t('modals.newFeed.url')"
required
/>
<v-text-field v-model="feed.url" :label="$t('modals.newFeed.url')" required />
</v-container>
</v-form>
</v-card-text>
<v-divider />
<v-card-actions class="justify-end">
<v-btn
v-if="!hasInitialFeed"
class="accent white--text elevation-0 px-4"
@click="create"
>
<v-btn v-if="!hasInitialFeed" class="accent white--text elevation-0 px-4" @click="create">
{{ $t('create') }}
</v-btn>
<v-btn
v-else
class="accent white--text elevation-0 px-4"
@click="edit"
>
<v-btn v-else class="accent white--text elevation-0 px-4" @click="edit">
{{ $t('edit') }}
</v-btn>
<v-btn
class="error white--text elevation-0 px-4"
@click="cancel"
>
<v-btn class="error white--text elevation-0 px-4" @click="cancel">
{{ $t('cancel') }}
</v-btn>
</v-card-actions>
@ -59,13 +44,14 @@ export default {
},
data: () => ({
feed: { url: '' },
mdiCancel, mdiTagPlus, mdiPencil
mdiCancel,
mdiTagPlus,
mdiPencil
}),
computed: {
...mapGetters(['getSelectedFeed']),
hasInitialFeed() {
return !!(this.initialFeed &&
this.initialFeed.name)
return !!(this.initialFeed && this.initialFeed.name)
}
},
created() {

View file

@ -3,57 +3,37 @@
<v-card flat>
<v-card-title class="pa-0">
<v-toolbar-title class="ma-4 primarytext--text">
<h3>
{{ hasInitialRule ? $t("edit") : $t("createNew") }} {{ $t("rule") }}
</h3>
<h3>{{ hasInitialRule ? $t('edit') : $t('createNew') }} {{ $t('rule') }}</h3>
</v-toolbar-title>
</v-card-title>
<v-card-text class="pa-2">
<v-form ref="ruleForm">
<v-container>
<v-text-field
v-model="rule.name"
:label="$t('modals.newRule.name')"
required
/>
<v-text-field v-model="rule.name" :label="$t('modals.newRule.name')" required />
</v-container>
<v-container>
<v-text-field
v-model="rule.def.mustContain"
:label="$t('modals.newRule.def.mustContain')"
required
/>
<v-text-field v-model="rule.def.mustContain" :label="$t('modals.newRule.def.mustContain')" required />
</v-container>
<v-container>
<v-subheader class="pa-0">
{{ $t("modals.newRule.def.affectedFeeds") }}
{{ $t('modals.newRule.def.affectedFeeds') }}
</v-subheader>
<template v-for="(item, index) in availableFeeds">
<v-checkbox
:key="index"
v-model="rule.def.affectedFeeds"
hide-details
:label="item.name"
:value="item.url"
/>
<v-checkbox :key="index" v-model="rule.def.affectedFeeds" hide-details :label="item.name" :value="item.url" />
</template>
</v-container>
</v-form>
</v-card-text>
<v-divider />
<v-card-actions class="justify-end">
<v-btn
v-if="!hasInitialRule"
class="accent white--text elevation-0 px-4"
@click="create"
>
{{ $t("create") }}
<v-btn v-if="!hasInitialRule" class="accent white--text elevation-0 px-4" @click="create">
{{ $t('create') }}
</v-btn>
<v-btn v-else class="accent white--text elevation-0 px-4" @click="edit">
{{ $t("edit") }}
{{ $t('edit') }}
</v-btn>
<v-btn class="error white--text elevation-0 px-4" @click="cancel">
{{ $t("cancel") }}
{{ $t('cancel') }}
</v-btn>
</v-card-actions>
</v-card>

View file

@ -4,38 +4,25 @@
<v-icon>{{ mdiCog }}</v-icon> {{ $t('modals.pluginManager.title') | titleCase }}
</v-btn>
<v-bottom-sheet
v-if="$vuetify.breakpoint.smAndDown"
v-model="opened"
scrollable
inset
>
<v-bottom-sheet v-if="$vuetify.breakpoint.smAndDown" v-model="opened" scrollable inset>
<v-sheet>
<v-card>
<v-card-title> <v-icon>{{ mdiToyBrick }}</v-icon> Plugin manager </v-card-title>
<v-card-title>
<v-icon>{{ mdiToyBrick }}</v-icon> Plugin manager
</v-card-title>
<v-card-text>
<v-switch
v-for="(plugin, key) in searchPlugins"
:key="key"
:input-value="plugin.enabled"
:label="plugin.fullName"
@change="togglePlugin(plugin)"
/>
<v-switch v-for="(plugin, key) in searchPlugins" :key="key" :input-value="plugin.enabled" :label="plugin.fullName" @change="togglePlugin(plugin)" />
</v-card-text>
</v-card>
</v-sheet>
</v-bottom-sheet>
<v-dialog v-else v-model="opened" width="50%">
<v-card>
<v-card-title> <v-icon>{{ mdiToyBrick }}</v-icon> Plugin manager </v-card-title>
<v-card-title>
<v-icon>{{ mdiToyBrick }}</v-icon> Plugin manager
</v-card-title>
<v-card-text>
<v-switch
v-for="(plugin, key) in searchPlugins"
:key="key"
v-model="plugin.enabled"
:label="plugin.fullName"
@change="togglePlugin(plugin)"
/>
<v-switch v-for="(plugin, key) in searchPlugins" :key="key" v-model="plugin.enabled" :label="plugin.fullName" @change="togglePlugin(plugin)" />
</v-card-text>
</v-card>
</v-dialog>
@ -50,7 +37,8 @@ export default {
name: 'PluginsManager',
data: () => ({
opened: false,
mdiCog, mdiToyBrick
mdiCog,
mdiToyBrick
}),
computed: {
...mapState(['searchPlugins'])

View file

@ -1,17 +1,8 @@
<template>
<v-dialog
v-model="dialog"
scrollable
:width="dialogWidth"
:fullscreen="phoneLayout"
:style="{ height: phoneLayout ? '100vh' : '' }"
>
<v-dialog v-model="dialog" scrollable :width="dialogWidth" :fullscreen="phoneLayout" :style="{ height: phoneLayout ? '100vh' : '' }">
<v-card :style="{ height: phoneLayout ? '100vh' : '' }">
<v-card-text class="pa-0">
<v-form
ref="form"
v-model="searchForm.valid"
>
<v-form ref="form" v-model="searchForm.valid">
<v-flex row class="my-1 py-1 px-2 mx-auto">
<v-col class="pa-0" cols="8">
<v-text-field
@ -20,19 +11,13 @@
label="Search"
:rules="[v => !!v || 'Search term is required']"
clearable
style="width: 95%;"
style="width: 95%"
autofocus
@keydown.enter.prevent="$refs.searchButton.click"
/>
</v-col>
<v-col class="pa-0 mt-2" cols="3">
<v-btn
ref="searchButton"
class="mt-2 mx-0"
:disabled="!searchForm.valid"
:color="loading ? 'warning' : 'primary'"
@click="loading ? stopSearch() : startSearch()"
>
<v-btn ref="searchButton" class="mt-2 mx-0" :disabled="!searchForm.valid" :color="loading ? 'warning' : 'primary'" @click="loading ? stopSearch() : startSearch()">
{{ loading ? $t('modals.search.btnStopSearch') : $t('modals.search.btnStartSearch') }}
</v-btn>
</v-col>
@ -44,7 +29,7 @@
:items="search.results"
:items-per-page="10"
:loading="loading"
:style="{ maxHeight: '60vh'}"
:style="{ maxHeight: '60vh' }"
:search="filter"
:custom-filter="customFilter"
:sort-by.sync="sortBy"
@ -52,19 +37,10 @@
:mobile-breakpoint="0"
>
<template #top>
<v-text-field
ref="filterRef"
v-model="filter"
label="Filter"
class="mx-4"
/>
<v-text-field ref="filterRef" v-model="filter" label="Filter" class="mx-4" />
</template>
<template #[`item.fileName`]="{ item }">
<a
:href="item.descrLink"
target="_blank"
v-text="item.fileName"
/>
<a :href="item.descrLink" target="_blank" v-text="item.fileName" />
</template>
<template #[`item.fileSize`]="{ item }">
{{ item.fileSize | formatSize }}
@ -80,14 +56,7 @@
<PluginManager />
</v-card-actions>
<v-fab-transition v-if="phoneLayout">
<v-btn
color="red"
dark
absolute
bottom
right
@click="close"
>
<v-btn color="red" dark absolute bottom right @click="close">
<v-icon>{{ mdiClose }}</v-icon>
</v-btn>
</v-fab-transition>
@ -99,7 +68,7 @@
import { mapGetters } from 'vuex'
import qbit from '@/services/qbit'
import { Modal, FullScreenModal, General } from '@/mixins'
import PluginManager from './PluginManager'
import PluginManager from './PluginManager.vue'
import { mdiClose, mdiMagnify, mdiDownload } from '@mdi/js'
export default {
@ -121,8 +90,15 @@ export default {
{ text: this.$i18n.t('modals.search.columnTitle.size'), value: 'fileSize' },
{ text: this.$i18n.t('modals.search.columnTitle.seeds'), value: 'nbSeeders' },
{ text: this.$i18n.t('modals.search.columnTitle.peers'), value: 'nbLeechers' },
{ text: this.$i18n.t('modals.search.columnTitle.search_engine'), value: 'siteUrl' },
{ text: this.$i18n.t('modals.search.columnTitle.action'), value: 'actions', sortable: false }
{
text: this.$i18n.t('modals.search.columnTitle.search_engine'),
value: 'siteUrl'
},
{
text: this.$i18n.t('modals.search.columnTitle.action'),
value: 'actions',
sortable: false
}
]
},
searchForm: {
@ -130,7 +106,9 @@ export default {
pattern: ''
},
filter: '',
mdiClose, mdiMagnify, mdiDownload,
mdiClose,
mdiMagnify,
mdiDownload,
sortBy: 'nbSeeders',
sortDesc: true
}
@ -193,11 +171,8 @@ export default {
},
customFilter(value, search, item) {
const searchArr = search.trim().toLowerCase().split(' ')
return value != null &&
search != null &&
typeof value === 'string' &&
searchArr.every(i => (value.toString().toLowerCase().indexOf(i) !== -1))
return value != null && search != null && typeof value === 'string' && searchArr.every(i => value.toString().toLowerCase().indexOf(i) !== -1)
}
}
}

View file

@ -1,44 +1,22 @@
<template>
<div style="min-width: 300px;">
<div style="min-width: 300px">
<h3>{{ title }}</h3>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="global"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.shareLimit.input.globalLimit')"
@change="disableUnlimited"
/>
<v-switch v-model="global" class="v-input--reverse pa-0 ma-0" hide-details inset :label="$t('modals.shareLimit.input.globalLimit')" @change="disableUnlimited" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="unlimited"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.shareLimit.input.unlimited')"
@change="disabledGlobal"
/>
<v-switch v-model="unlimited" class="v-input--reverse pa-0 ma-0" hide-details inset :label="$t('modals.shareLimit.input.unlimited')" @change="disabledGlobal" />
</v-col>
</v-row>
</v-list-item>
<v-list-item class="mx-2">
<v-text-field
v-model="limit"
type="number"
autofocus
clearable
dense
:label="`${title} Limit`"
:prepend-inner-icon="title === 'Ratio' ? mdiPercent : mdiClockTimeEight"
/>
<v-text-field v-model="limit" type="number" autofocus clearable dense :label="`${title} Limit`" :prepend-inner-icon="title === 'Ratio' ? mdiPercent : mdiClockTimeEight" />
</v-list-item>
</div>
</template>
@ -50,11 +28,12 @@ export default {
props: ['title', 'initialLimit'],
data() {
return {
mdiPercent, mdiClose, mdiClockTimeEight,
mdiPercent,
mdiClose,
mdiClockTimeEight,
global: false,
unlimited: false,
limit: ''
}
},
created() {

View file

@ -1,11 +1,5 @@
<template>
<v-dialog
v-model="dialog"
scrollable
content-class="rounded-form"
max-width="500px"
:fullscreen="isPhone"
>
<v-dialog v-model="dialog" scrollable content-class="rounded-form" max-width="500px" :fullscreen="isPhone">
<v-card class="px-2">
<v-card-title class="pa-0">
<v-toolbar-title class="ma-4 primarytext--text">
@ -13,17 +7,8 @@
</v-toolbar-title>
</v-card-title>
<v-card-text class="px-4 py-2">
<ShareLimitInput
ref="ratio"
:title="$t('modals.shareLimit.titleRatio')"
:initial-limit="torrent.ratio_limit"
/>
<ShareLimitInput
ref="time"
:title="$t('modals.shareLimit.titleDuration')"
:initial-limit="torrent.ratio_time_limit"
class="mt-2"
/>
<ShareLimitInput ref="ratio" :title="$t('modals.shareLimit.titleRatio')" :initial-limit="torrent.ratio_limit" />
<ShareLimitInput ref="time" :title="$t('modals.shareLimit.titleDuration')" :initial-limit="torrent.ratio_time_limit" class="mt-2" />
</v-card-text>
<v-divider />
<v-card-actions class="justify-end">
@ -62,10 +47,7 @@ export default {
},
methods: {
save() {
qbit.setShareLimit([this.hash],
this.$refs.ratio.export(),
this.$refs.time.export()
)
qbit.setShareLimit([this.hash], this.$refs.ratio.export(), this.$refs.time.export())
this.close()
},
close() {
@ -78,7 +60,7 @@ export default {
<style lang="scss" scoped>
// Reversed input variant
:deep(.v-input--reverse .v-input__slot) {
@import "../../../styles/styles";
@import '../../../styles/styles';
@include reverse-switch;
}
</style>

View file

@ -1,10 +1,5 @@
<template>
<v-dialog
v-model="dialog"
scrollable
content-class="rounded-form"
max-width="500px"
>
<v-dialog v-model="dialog" scrollable content-class="rounded-form" max-width="500px">
<v-card>
<v-card-title class="justify-center primarytext--text">
<h2>{{ $t('modals.sort.title') }}</h2>
@ -12,25 +7,8 @@
<v-card-text>
<v-form class="px-6 mt-3 justify-center mx-auto">
<v-container class="sortmodal">
<v-select
v-model="sort_options.sort"
:value="sortProperty"
flat
class="ml-2 mr-2"
:items="options"
item-text="name"
item-value="value"
dense
solo
height="55"
/>
<v-switch
v-model="sort_options.reverse"
class="v-input--reverse v-input--expand pa-0 ma-0"
inset
color="accent"
style="padding-left: 10px !important"
>
<v-select v-model="sort_options.sort" :value="sortProperty" flat class="ml-2 mr-2" :items="options" item-text="name" item-value="value" dense solo height="55" />
<v-switch v-model="sort_options.reverse" class="v-input--reverse v-input--expand pa-0 ma-0" inset color="accent" style="padding-left: 10px !important">
<template #label>
{{ $t('modals.sort.reverse') }}
</template>
@ -89,11 +67,11 @@ export default {
<style lang="scss" scoped>
.sortmodal .v-select__selection,
.v-input__icon i {
color: var(--search) !important;
color: var(--search) !important;
}
// Reversed input variant
:deep(.v-input--reverse .v-input__slot) {
@import "src/styles/styles.scss";
@import 'src/styles/styles.scss';
@include reverse-switch;
}
</style>

View file

@ -1,11 +1,5 @@
<template>
<v-dialog
v-model="dialog"
scrollable
content-class="rounded-form"
max-width="500px"
:fullscreen="isPhone"
>
<v-dialog v-model="dialog" scrollable content-class="rounded-form" max-width="500px" :fullscreen="isPhone">
<v-card>
<v-card-title class="pa-0">
<v-toolbar-title class="ma-4 primarytext--text">
@ -32,18 +26,8 @@
</v-card-text>
<v-divider />
<v-card-actions class="justify-end">
<v-btn
class="accent white--text elevation-0 px-4"
@click="setLimit"
>
Save
</v-btn>
<v-btn
class="error white--text elevation-0 px-4"
@click="close"
>
Cancel
</v-btn>
<v-btn class="accent white--text elevation-0 px-4" @click="setLimit"> Save </v-btn>
<v-btn class="error white--text elevation-0 px-4" @click="close"> Cancel </v-btn>
</v-card-actions>
</v-card>
</v-dialog>
@ -64,7 +48,8 @@ export default {
data() {
return {
limit: '',
mdiSpeedometer, mdiClose
mdiSpeedometer,
mdiClose
}
},
computed: {

View file

@ -9,44 +9,20 @@
<v-card-text>
<v-form ref="categoryForm" class="px-6 mt-3">
<v-container>
<v-text-field
v-model="category.name"
:rules="nameRules"
:counter="15"
:label="$t('modals.newCategory.categoryName')"
required
:disabled="hasInitialCategory"
/>
<v-text-field
v-model="category.savePath"
:rules="PathRules"
:counter="40"
:label="$t('path')"
required
/>
<v-text-field v-model="category.name" :rules="nameRules" :counter="15" :label="$t('modals.newCategory.categoryName')" required :disabled="hasInitialCategory" />
<v-text-field v-model="category.savePath" :rules="PathRules" :counter="40" :label="$t('path')" required />
</v-container>
</v-form>
</v-card-text>
<v-divider />
<v-card-actions class="justify-end">
<v-btn
v-if="!hasInitialCategory"
class="accent white--text elevation-0 px-4"
@click="create"
>
<v-btn v-if="!hasInitialCategory" class="accent white--text elevation-0 px-4" @click="create">
{{ $t('create') }}
</v-btn>
<v-btn
v-else
class="accent white--text elevation-0 px-4"
@click="edit"
>
<v-btn v-else class="accent white--text elevation-0 px-4" @click="edit">
{{ $t('edit') }}
</v-btn>
<v-btn
class="error white--text elevation-0 px-4"
@click="cancel"
>
<v-btn class="error white--text elevation-0 px-4" @click="cancel">
{{ $t('cancel') }}
</v-btn>
</v-card-actions>
@ -69,27 +45,20 @@ export default {
},
data: () => ({
category: { name: '', savePath: '' },
mdiCancel, mdiTagPlus, mdiPencil
mdiCancel,
mdiTagPlus,
mdiPencil
}),
computed: {
...mapGetters(['getSelectedCategory']),
hasInitialCategory() {
return !!(this.initialCategory &&
this.initialCategory.name)
return !!(this.initialCategory && this.initialCategory.name)
},
nameRules() {
return [
v => !!v || this.$i18n.t('modals.newCategory.tipOnNoName'),
v =>
(v && v.length <= 15) ||
this.$i18n.t('modals.newCategory.tipOnNameTooLong')
]
return [v => !!v || this.$i18n.t('modals.newCategory.tipOnNoName'), v => (v && v.length <= 15) || this.$i18n.t('modals.newCategory.tipOnNameTooLong')]
},
PathRules() {
return [
v => !!v || this.$i18n.t('modals.newCategory.tipOnNoPath'),
v => (v && v.length <= 40) || this.$i18n.t('modals.newCategory.TipOnPathTooLong')
]
return [v => !!v || this.$i18n.t('modals.newCategory.tipOnNoPath'), v => (v && v.length <= 40) || this.$i18n.t('modals.newCategory.TipOnPathTooLong')]
}
},
created() {

View file

@ -9,28 +9,16 @@
<v-card-text>
<v-form class="px-6 mt-3">
<v-container>
<v-text-field
v-model="tagname"
:rules="rules"
:counter="10"
:label="$t('modals.newTag.tagName')"
required
/>
<v-text-field v-model="tagname" :rules="rules" :counter="10" :label="$t('modals.newTag.tagName')" required />
</v-container>
</v-form>
</v-card-text>
<v-divider />
<v-card-actions class="justify-end">
<v-btn
class="accent white--text elevation-0 px-4"
@click="create"
>
<v-btn class="accent white--text elevation-0 px-4" @click="create">
{{ $t('create') }}
</v-btn>
<v-btn
class="error white--text elevation-0 px-4"
@click="cancel"
>
<v-btn class="error white--text elevation-0 px-4" @click="cancel">
{{ $t('cancel') }}
</v-btn>
</v-card-actions>
@ -46,10 +34,7 @@ export default {
mixins: [Modal],
data: () => ({
tagname: '',
rules: [
v => !!v || 'Tag is required',
v => v.length <= 10 || 'Tag must be less than 10 characters'
]
rules: [v => !!v || 'Tag is required', v => v.length <= 10 || 'Tag must be less than 10 characters']
}),
methods: {
create() {

View file

@ -1,7 +1,4 @@
import CreateNewTagDialog from './CreateTagDialog.vue'
import CreateNewCategoryDialog from './CreateCategoryDialog.vue'
export {
CreateNewTagDialog,
CreateNewCategoryDialog
}
export { CreateNewTagDialog, CreateNewCategoryDialog }

View file

@ -13,12 +13,7 @@
</template>
<script>
import {
mdiCheckNetwork,
mdiNetworkOff,
mdiCloseNetwork,
mdiHelpNetwork
} from '@mdi/js'
import { mdiCheckNetwork, mdiNetworkOff, mdiCloseNetwork, mdiHelpNetwork } from '@mdi/js'
export default {
props: ['status'],

View file

@ -16,7 +16,7 @@
<script>
import { mdiChevronUp, mdiChevronDown } from '@mdi/js'
import SpeedCard from '@/components/Core/SpeedCard'
import SpeedCard from '@/components/Core/SpeedCard.vue'
export default {
name: 'CurrentSpeed',
components: {

View file

@ -36,9 +36,7 @@
@input="setCategory"
/>
<div v-if="showTrackerFilter">
<label class="white--text text-uppercase font-weight-medium caption ml-4">
Tracker
</label>
<label class="white--text text-uppercase font-weight-medium caption ml-4"> Tracker </label>
<v-select
aria-label="tracker_filter"
:value="selectedTracker"
@ -81,18 +79,27 @@ export default {
{ value: 'active', name: this.$i18n.t('active') },
{ value: 'inactive', name: this.$i18n.t('inactive') },
{ value: 'stalled', name: this.$i18n.t('stalled') },
{ value: 'stalled_uploading', name: this.$i18n.t('navbar.filters.stalled_uploading') },
{ value: 'stalled_downloading', name: this.$i18n.t('navbar.filters.stalled_downloading') },
{
value: 'stalled_uploading',
name: this.$i18n.t('navbar.filters.stalled_uploading')
},
{
value: 'stalled_downloading',
name: this.$i18n.t('navbar.filters.stalled_downloading')
},
{ value: 'errored', name: this.$i18n.t('errored') }
]
},
availableCategories() {
const categories = [
{ name: 'All', value: null },
{ name: 'Uncategorized', value: '' }]
categories.push(...this.getCategories().map(c => {
return { name: c.name, value: c.name }
}))
{ name: 'Uncategorized', value: '' }
]
categories.push(
...this.getCategories().map(c => {
return { name: c.name, value: c.name }
})
)
return categories
},
@ -101,13 +108,16 @@ export default {
{ name: 'All', value: null },
{ name: 'Not working', value: '' }
]
if (this.showTrackerFilter) {
trackers.push(...this.getTrackers().map(t => {
return {
name: t, value: t
}
}))
trackers.push(
...this.getTrackers().map(t => {
return {
name: t,
value: t
}
})
)
}
return trackers
@ -160,4 +170,3 @@ export default {
margin: 0;
}
</style>

View file

@ -1,17 +1,11 @@
<template>
<div v-if="space" class="mb-4">
<StorageCard
v-if="space"
class="mt-8"
:label="$t('navbar.freeSpace') | titleCase"
color="upload"
:value="space"
/>
<StorageCard v-if="space" class="mt-8" :label="$t('navbar.freeSpace') | titleCase" color="upload" :value="space" />
</div>
</template>
<script>
import StorageCard from '@/components/Core/StorageCard'
import StorageCard from '@/components/Core/StorageCard.vue'
export default {
name: 'FreeSpace',
components: {

View file

@ -1,23 +1,9 @@
<template>
<nav>
<!--title-->
<v-app-bar
app
elevate-on-scroll
class="noselect"
>
<v-app-bar-nav-icon
class="grey--text text--lighten-1"
aria-label="Open Navigation Drawer"
@click.stop="drawer = !drawer"
/>
<v-toolbar-title
v-if="!$vuetify.breakpoint.xs"
:class="[
'grey--text',
{ 'subheading ml-0': $vuetify.breakpoint.smAndDown }
]"
>
<v-app-bar app elevate-on-scroll class="noselect">
<v-app-bar-nav-icon class="grey--text text--lighten-1" aria-label="Open Navigation Drawer" @click.stop="drawer = !drawer" />
<v-toolbar-title v-if="!$vuetify.breakpoint.xs" :class="['grey--text', { 'subheading ml-0': $vuetify.breakpoint.smAndDown }]">
<span class="font-weight-light">qBit</span>
<span>torrent</span>
</v-toolbar-title>
@ -26,51 +12,20 @@
<TopMenu />
</v-app-bar>
<!--navigation drawer itself -->
<v-navigation-drawer
v-model="drawer"
app
class="primary drawer"
style="position: fixed;"
width="256"
height="100%"
disable-resize-watcher
:right="webuiSettings.rightDrawer"
>
<v-card
v-if="status"
style="display: flex; flex-direction: column;"
class="pt-3 primary"
flat
>
<CurrentSpeed
v-if="webuiSettings.showCurrentSpeed"
:status="status"
/>
<v-navigation-drawer v-model="drawer" app class="primary drawer" style="position: fixed" width="256" height="100%" disable-resize-watcher :right="webuiSettings.rightDrawer">
<v-card v-if="status" style="display: flex; flex-direction: column" class="pt-3 primary" flat>
<CurrentSpeed v-if="webuiSettings.showCurrentSpeed" :status="status" />
<SpeedGraph v-if="webuiSettings.showSpeedGraph" />
<TranserStats
v-if="webuiSettings.showAlltimeStat"
:session="false"
:status="status"
/>
<TranserStats v-if="webuiSettings.showAlltimeStat" :session="false" :status="status" />
<TranserStats
v-if="webuiSettings.showSessionStat"
:session="true"
:status="status"
/>
<TranserStats v-if="webuiSettings.showSessionStat" :session="true" :status="status" />
<FreeSpace
v-if="webuiSettings.showFreeSpace"
:space="status.freeDiskSpace"
/>
<FreeSpace v-if="webuiSettings.showFreeSpace" :space="status.freeDiskSpace" />
<FilterSelect :show-tracker-filter="webuiSettings.showTrackerFilter" />
<div
style="font-size: 0.9em"
class="download--text text-uppercase text-center mt-5"
>
<div style="font-size: 0.9em" class="download--text text-uppercase text-center mt-5">
{{ torrentCountString }}
</div>
</v-card>
@ -85,15 +40,7 @@
<script>
import { mapGetters } from 'vuex'
import {
BottomActions,
TopMenu,
SpeedGraph,
FreeSpace,
TranserStats,
CurrentSpeed,
FilterSelect
} from './index'
import { BottomActions, TopMenu, SpeedGraph, FreeSpace, TranserStats, CurrentSpeed, FilterSelect } from './index'
export default {
name: 'Navbar',
@ -140,14 +87,18 @@ export default {
}
}
.v-app-bar > .v-toolbar__content{
padding-right: 0;
.v-app-bar > .v-toolbar__content {
padding-right: 0;
}
.navbar {
@media screen and (max-width: 480px) {
.v-toolbar__title { display: none; }
.spacer { display: none; }
.v-toolbar__title {
display: none;
}
.spacer {
display: none;
}
}
}
</style>

View file

@ -3,13 +3,7 @@
<v-col>
<v-tooltip top>
<template #activator="{ on }">
<v-btn
text
tile
block
v-on="on"
@click="logout"
>
<v-btn text tile block v-on="on" @click="logout">
<v-icon :class="commonStyle">
{{ mdiExitToApp }}
</v-icon>
@ -21,13 +15,7 @@
<v-col>
<v-tooltip top>
<template #activator="{ on }">
<v-btn
text
tile
block
v-on="on"
@click="toggleSpeed"
>
<v-btn text tile block v-on="on" @click="toggleSpeed">
<v-icon :class="altSpeed ? 'accent--text' : commonStyle">
{{ altSpeed ? mdiSpeedometerSlow : mdiSpeedometer }}
</v-icon>
@ -42,13 +30,7 @@
<v-col>
<v-tooltip top>
<template #activator="{ on }">
<v-btn
text
tile
block
v-on="on"
@click="toggleTheme"
>
<v-btn text tile block v-on="on" @click="toggleTheme">
<v-icon :class="commonStyle">
{{ theme === 'Light' ? mdiBrightness7 : mdiBrightness4 }}
</v-icon>
@ -63,15 +45,7 @@
<script>
import qbit from '@/services/qbit'
import { mapGetters } from 'vuex'
import {
mdiBrightness4,
mdiSpeedometerSlow,
mdiBrightness7,
mdiSpeedometer,
mdiExitToApp,
mdiBell,
mdiBellOff
} from '@mdi/js'
import { mdiBrightness4, mdiSpeedometerSlow, mdiBrightness7, mdiSpeedometer, mdiExitToApp, mdiBell, mdiBellOff } from '@mdi/js'
import ConnectionStatus from './ConnectionStatus.vue'
export default {

View file

@ -0,0 +1,26 @@
<template>
<div v-if="status" class="mt-3 mb-3">
<label class="text-uppercase white--text caption font-weight-medium ml-4"> Session Stats </label>
<v-tooltip bottom>
<template #activator="{ on }">
<v-icon color="white" style="opacity: 0.3" small v-on="on">
{{ mdiInformationOutline }}
</v-icon>
</template>
<span>{{ $t('navbar.sessionStats.tooltip') }}</span>
</v-tooltip>
<StorageCard class="mb-4 mt-4" label="Downloaded" color="download" :value="status.downloaded" />
<StorageCard label="Uploaded" color="upload" :value="status.uploaded" />
</div>
</template>
<script>
import { mdiInformationOutline } from '@mdi/js'
import StorageCard from '@/components/Core/StorageCard.vue'
export default {
name: 'SessionStats',
components: { StorageCard },
props: ['status'],
data: () => ({ mdiInformationOutline })
}
</script>

View file

@ -1,11 +1,6 @@
<template>
<div class="mt-4">
<apexcharts
ref="chart"
type="line"
:options="chartOptions"
:series="series"
/>
<apexcharts ref="chart" type="line" :options="chartOptions" :series="series" />
</div>
</template>
@ -33,10 +28,7 @@ export default {
}
}
},
colors: [
this.$vuetify.theme.currentTheme.upload,
this.$vuetify.theme.currentTheme.download
],
colors: [this.$vuetify.theme.currentTheme.upload, this.$vuetify.theme.currentTheme.download],
stroke: {
show: true,
curve: 'smooth',
@ -59,7 +51,7 @@ export default {
x: {
formatter: value => {
const val = 32 - value * 2
return val + ' seconds ago'
}
},

View file

@ -2,16 +2,7 @@
<div :class="mobile ? '' : 'flex-shrink-0 ml-0'">
<v-tooltip bottom open-delay="400">
<template #activator="{ on }">
<v-btn
:text="!mobile"
small
fab
color="grey--text"
class="mr-0 ml-0"
:aria-label="$t('navbar.topActions.addTorrent')"
v-on="on"
@click="addModal('AddModal')"
>
<v-btn :text="!mobile" small fab color="grey--text" class="mr-0 ml-0" :aria-label="$t('navbar.topActions.addTorrent')" v-on="on" @click="addModal('AddModal')">
<v-icon color="grey">
{{ mdiPlus }}
</v-icon>
@ -21,15 +12,7 @@
</v-tooltip>
<v-tooltip bottom open-delay="400">
<template #activator="{ on }">
<v-btn
small
fab
:text="!mobile"
class="mr-0 ml-0"
:aria-label="$t('navbar.topActions.resumeSelected')"
v-on="on"
@click="resumeTorrents"
>
<v-btn small fab :text="!mobile" class="mr-0 ml-0" :aria-label="$t('navbar.topActions.resumeSelected')" v-on="on" @click="resumeTorrents">
<v-icon color="grey">
{{ mdiPlay }}
</v-icon>
@ -39,15 +22,7 @@
</v-tooltip>
<v-tooltip bottom open-delay="400">
<template #activator="{ on }">
<v-btn
small
fab
:text="!mobile"
class="mr-0 ml-0"
:aria-label="$t('navbar.topActions.pauseSelected')"
v-on="on"
@click="pauseTorrents"
>
<v-btn small fab :text="!mobile" class="mr-0 ml-0" :aria-label="$t('navbar.topActions.pauseSelected')" v-on="on" @click="pauseTorrents">
<v-icon color="grey">
{{ mdiPause }}
</v-icon>
@ -57,15 +32,7 @@
</v-tooltip>
<v-tooltip bottom open-delay="400">
<template #activator="{ on }">
<v-btn
small
fab
:text="!mobile"
class="mr-0 ml-0"
:aria-label="$t('navbar.topActions.removeSelected')"
v-on="on"
@click="removeTorrents"
>
<v-btn small fab :text="!mobile" class="mr-0 ml-0" :aria-label="$t('navbar.topActions.removeSelected')" v-on="on" @click="removeTorrents">
<v-icon color="grey">
{{ mdiDelete }}
</v-icon>
@ -75,16 +42,7 @@
</v-tooltip>
<v-tooltip bottom open-delay="400">
<template #activator="{ on }">
<v-btn
:text="!mobile"
small
fab
color="grey--text"
class="mr-0 ml-0"
:aria-label="$t('navbar.topActions.searchNew')"
v-on="on"
@click="addModal('SearchModal')"
>
<v-btn :text="!mobile" small fab color="grey--text" class="mr-0 ml-0" :aria-label="$t('navbar.topActions.searchNew')" v-on="on" @click="addModal('SearchModal')">
<v-icon color="grey">
{{ mdiSearchWeb }}
</v-icon>
@ -94,15 +52,7 @@
</v-tooltip>
<v-tooltip bottom open-delay="400">
<template #activator="{ on }">
<v-btn
small
fab
:text="!mobile"
class="mr-0 ml-0"
:aria-label="$t('navbar.topActions.openSettings')"
v-on="on"
@click="goToSettings"
>
<v-btn small fab :text="!mobile" class="mr-0 ml-0" :aria-label="$t('navbar.topActions.openSettings')" v-on="on" @click="goToSettings">
<v-icon color="grey">
{{ mdiCog }}
</v-icon>
@ -117,10 +67,7 @@
import { General } from '@/mixins'
import { mapState } from 'vuex'
import qbit from '@/services/qbit'
import {
mdiSort, mdiCog, mdiCheckboxBlankOutline, mdiCheckboxMarked,
mdiSearchWeb, mdiDelete, mdiPlus, mdiPlay, mdiPause
} from '@mdi/js'
import { mdiSort, mdiCog, mdiCheckboxBlankOutline, mdiCheckboxMarked, mdiSearchWeb, mdiDelete, mdiPlus, mdiPlay, mdiPause } from '@mdi/js'
export default {
name: 'TopActions',
@ -159,8 +106,7 @@ export default {
this.createModal(name)
},
goToSettings() {
if (this.$route.name !== 'settings')
this.$router.push({ name: 'settings' })
if (this.$route.name !== 'settings') this.$router.push({ name: 'settings' })
}
}
}

View file

@ -1,20 +1,8 @@
<template>
<TopActions v-if="!$vuetify.breakpoint.xsOnly" />
<v-speed-dial
v-else
v-model="fab"
transition="slide-y-transition"
direction="bottom"
style="position: absolute; top: 0.3em; right: 1em"
>
<v-speed-dial v-else v-model="fab" transition="slide-y-transition" direction="bottom" style="position: absolute; top: 0.3em; right: 1em">
<template #activator>
<v-btn
v-model="fab"
color="grey"
text
small
fab
>
<v-btn v-model="fab" color="grey" text small fab>
<v-icon>
{{ fab ? mdiClose : mdiDotsVertical }}
</v-icon>
@ -25,7 +13,7 @@
</template>
<script>
import TopActions from './TopActions'
import TopActions from './TopActions.vue'
import { mdiDotsVertical, mdiClose } from '@mdi/js'
export default {
@ -40,4 +28,3 @@ export default {
}
}
</script>

View file

@ -5,30 +5,20 @@
</label>
<v-tooltip v-if="isSession" bottom>
<template #activator="{ on }">
<v-icon
color="white"
style="opacity: 0.3;"
small
v-on="on"
>
<v-icon color="white" style="opacity: 0.3" small v-on="on">
{{ mdiInformationOutline }}
</v-icon>
</template>
<span>{{ $t('navbar.sessionStats.tooltip') }}</span>
</v-tooltip>
<StorageCard
class="mb-4 mt-4"
:label="titleCase($t('downloaded'))"
color="download"
:value="getDownload"
/>
<StorageCard class="mb-4 mt-4" :label="titleCase($t('downloaded'))" color="download" :value="getDownload" />
<StorageCard :label="titleCase($t('uploaded'))" color="upload" :value="getUpload" />
</div>
</template>
<script>
import { mdiInformationOutline } from '@mdi/js'
import StorageCard from '@/components/Core/StorageCard'
import StorageCard from '../Core/StorageCard.vue'
// eslint-disable-next-line no-unused-vars
import { titleCase } from '../../filters'
@ -62,4 +52,3 @@ export default {
}
}
</script>

View file

@ -8,14 +8,4 @@ import CurrentSpeed from './CurrentSpeed.vue'
import FilterSelect from './FilterSelect.vue'
import TopMenu from './TopMenu.vue'
export {
Navbar,
BottomActions,
TopActions,
SpeedGraph,
FreeSpace,
TranserStats,
CurrentSpeed,
FilterSelect,
TopMenu
}
export { Navbar, BottomActions, TopActions, SpeedGraph, FreeSpace, TranserStats, CurrentSpeed, FilterSelect, TopMenu }

View file

@ -2,45 +2,20 @@
<v-card flat>
<v-subheader>{{ $t('modals.settings.pageBittorrent.subHeaderPrivacy') }}</v-subheader>
<v-list-item>
<v-checkbox
v-model="settings.dht"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageBittorrent.enableDHT')"
/>
<v-checkbox v-model="settings.dht" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.enableDHT')" />
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.pex"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageBittorrent.enablePeX')"
/>
<v-checkbox v-model="settings.pex" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.enablePeX')" />
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.lsd"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageBittorrent.enableLPD')"
/>
<v-checkbox v-model="settings.lsd" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.enableLPD')" />
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.anonymous_mode"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageBittorrent.enableAnonymous')"
/>
<v-checkbox v-model="settings.anonymous_mode" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.enableAnonymous')" />
</v-list-item>
<v-divider insert />
<v-list-item>
<v-checkbox
v-model="settings.queueing_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageBittorrent.torrentQueue')"
/>
<v-checkbox v-model="settings.queueing_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.torrentQueue')" />
</v-list-item>
<v-list-item>
<v-text-field
@ -79,12 +54,7 @@
/>
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.dont_count_slow_torrents"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageBittorrent.excludeSlowTorrent')"
/>
<v-checkbox v-model="settings.dont_count_slow_torrents" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.excludeSlowTorrent')" />
</v-list-item>
<v-list-item>
<v-text-field
@ -127,46 +97,20 @@
<v-list-item>
<v-row dense>
<v-col>
<v-checkbox
v-model="settings.max_ratio_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageBittorrent.whenRatioReaches')"
/>
<v-checkbox v-model="settings.max_ratio_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.whenRatioReaches')" />
</v-col>
<v-col>
<v-text-field
v-model="settings.max_ratio"
class="mb-2"
outlined
dense
type="number"
hide-details
:disabled="!settings.max_ratio_enabled"
/>
<v-text-field v-model="settings.max_ratio" class="mb-2" outlined dense type="number" hide-details :disabled="!settings.max_ratio_enabled" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-checkbox
v-model="settings.max_seeding_time_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageBittorrent.whenSeedingTimeReaches')"
/>
<v-checkbox v-model="settings.max_seeding_time_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.whenSeedingTimeReaches')" />
</v-col>
<v-col>
<v-text-field
v-model="settings.max_seeding_time"
class="mb-2"
outlined
dense
type="number"
hide-details
:disabled="!settings.max_seeding_time_enabled"
/>
<v-text-field v-model="settings.max_seeding_time" class="mb-2" outlined dense type="number" hide-details :disabled="!settings.max_seeding_time_enabled" />
</v-col>
</v-row>
</v-list-item>
@ -213,11 +157,10 @@ export default {
{
value: 3,
text: this.$i18n.t('modals.settings.pageBittorrent.maxRatioRemoveTorrentAndFiles')
},
{
value: 2,
text: this.$i18n.t('modals.settings.pageBittorrent.maxRatioTorrentSuperseeding')
text: this.$i18n.t('modals.settings.pageBittorrent.maxRatioTorrentSuperseeding')
}
]
}

View file

@ -1,18 +1,10 @@
<template>
<v-card flat>
<v-subheader>
{{ $t("modals.settings.pageConnection.subHeader") }}
{{ $t('modals.settings.pageConnection.subHeader') }}
</v-subheader>
<v-list-item>
<v-text-field
v-model="settings.max_connec"
class="mb-2"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.pageConnection.globalMaxConnection')"
/>
<v-text-field v-model="settings.max_connec" class="mb-2" outlined dense type="number" hide-details :label="$t('modals.settings.pageConnection.globalMaxConnection')" />
</v-list-item>
<v-list-item>
<v-text-field
@ -26,15 +18,7 @@
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.max_uploads"
class="mb-2"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.pageConnection.globalMaxUploadSlots')"
/>
<v-text-field v-model="settings.max_uploads" class="mb-2" outlined dense type="number" hide-details :label="$t('modals.settings.pageConnection.globalMaxUploadSlots')" />
</v-list-item>
<v-list-item>
<v-text-field
@ -49,67 +33,30 @@
</v-list-item>
<v-divider />
<v-subheader>
{{ $t("modals.settings.pageConnection.proxySubHeader") }}
{{ $t('modals.settings.pageConnection.proxySubHeader') }}
</v-subheader>
<v-list-item>
<v-row class="ml-5 mr-5 pb-4">
<v-col cols="5" class="pa-0 pr-2">
<v-select
v-model="settings.proxy_type"
outlined
dense
hide-details
small-chips
:items="proxyTypes"
/>
<v-select v-model="settings.proxy_type" outlined dense hide-details small-chips :items="proxyTypes" />
</v-col>
<v-col cols="4" class="pa-0">
<v-text-field
v-model="settings.proxy_ip"
class="mr-1"
outlined
dense
hide-details
:label="$t('modals.settings.pageWebUI.ipAddress')"
/>
<v-text-field v-model="settings.proxy_ip" class="mr-1" outlined dense hide-details :label="$t('modals.settings.pageWebUI.ipAddress')" />
</v-col>
<v-col cols="3" class="pa-0">
<v-text-field
v-model="settings.proxy_port"
class="ml-1"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.pageWebUI.port')"
/>
<v-text-field v-model="settings.proxy_port" class="ml-1" outlined dense type="number" hide-details :label="$t('modals.settings.pageWebUI.port')" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.proxy_peer_connections"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageConnection.proxyPeerConnections')"
/>
<v-checkbox v-model="settings.proxy_peer_connections" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageConnection.proxyPeerConnections')" />
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.proxy_torrents_only"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageConnection.proxyTorrentOnly')"
/>
<v-checkbox v-model="settings.proxy_torrents_only" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageConnection.proxyTorrentOnly')" />
</v-list-item>
<v-divider />
<v-list-item>
<v-checkbox
v-model="settings.proxy_auth_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageConnection.proxyAuth')"
/>
<v-checkbox v-model="settings.proxy_auth_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageConnection.proxyAuth')" />
</v-list-item>
<v-list-item>
<v-text-field

View file

@ -2,117 +2,79 @@
<v-card flat>
<v-subheader>{{ $t('modals.settings.pageDownloads.subHeaderWhenAddTorrent') }}</v-subheader>
<v-list-item>
<v-checkbox
v-model="settings.create_subfolder_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageDownloads.whenAddTorrent.createSubFolder')"
/>
<v-checkbox v-model="settings.create_subfolder_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.whenAddTorrent.createSubFolder')" />
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.start_paused_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageDownloads.whenAddTorrent.donotAutoStart')"
/>
<v-checkbox v-model="settings.start_paused_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.whenAddTorrent.donotAutoStart')" />
</v-list-item>
<v-divider insert />
<v-subheader>{{ $t('modals.settings.pageDownloads.subHeaderPublicSettings') }}</v-subheader>
<v-list-item>
<v-checkbox
v-model="settings.preallocate_all"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageDownloads.publicSettings.preAllocateDisk')"
/>
<v-checkbox v-model="settings.preallocate_all" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.publicSettings.preAllocateDisk')" />
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.incomplete_files_ext"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageDownloads.publicSettings.appendQBExtension')"
/>
<v-checkbox v-model="settings.incomplete_files_ext" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.publicSettings.appendQBExtension')" />
</v-list-item>
<v-divider insert />
<v-subheader>{{ $t('modals.settings.pageDownloads.subHeaderSaveManagement') }}</v-subheader>
<v-list-item>
<v-checkbox
v-model="settings.auto_tmm_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageDownloads.saveManagement.autoManagement')"
/>
<v-checkbox v-model="settings.auto_tmm_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.saveManagement.autoManagement')" />
</v-list-item>
<v-list-item class="mb-2">
<v-checkbox
v-model="settings.save_path_changed_tmm_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageDownloads.saveManagement.relocate')"
/>
<v-checkbox v-model="settings.save_path_changed_tmm_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.saveManagement.relocate')" />
</v-list-item>
<v-list-item class="mb-2">
<v-text-field
v-model="settings.save_path"
class="mb-2"
outlined
dense
:label="$t('modals.settings.pageDownloads.saveManagement.defaultSavePath')"
hide-details
/>
<v-text-field v-model="settings.save_path" class="mb-2" outlined dense :label="$t('modals.settings.pageDownloads.saveManagement.defaultSavePath')" hide-details />
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.temp_path_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageDownloads.saveManagement.keepIncompleteIn')"
/>
<v-checkbox v-model="settings.temp_path_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.saveManagement.keepIncompleteIn')" />
</v-list-item>
<v-list-item v-if="settings.temp_path_enabled">
<v-text-field
v-model="settings.temp_path"
class="mb-2"
outlined
dense
hide-details
/>
<v-text-field v-model="settings.temp_path" class="mb-2" outlined dense hide-details />
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.autorun_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageDownloads.saveManagement.autoEnabled')"
/>
<v-checkbox v-model="settings.autorun_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.saveManagement.autoEnabled')" />
</v-list-item>
<v-list-item v-if="settings.autorun_enabled">
<v-text-field
v-model="settings.autorun_program"
class="mb-2"
outlined
dense
:label="$t('modals.settings.pageDownloads.saveManagement.autorunProgram')"
hide-details
/>
<v-text-field v-model="settings.autorun_program" class="mb-2" outlined dense :label="$t('modals.settings.pageDownloads.saveManagement.autorunProgram')" hide-details />
</v-list-item>
<v-list-item v-if="settings.autorun_enabled" class="mb-4">
<v-card flat color="grey--text selected">
<v-card-text>
<h5>{{ $t('modals.settings.pageDownloads.saveManagement.supportParamTitle') }}</h5>
<h5>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamTitle') }}
</h5>
<ul>
<li>{{ $t('modals.settings.pageDownloads.saveManagement.supportParamN') }}</li>
<li>{{ $t('modals.settings.pageDownloads.saveManagement.supportParamL') }}</li>
<li>{{ $t('modals.settings.pageDownloads.saveManagement.supportParamG') }}</li>
<li>{{ $t('modals.settings.pageDownloads.saveManagement.supportParamF') }}</li>
<li>{{ $t('modals.settings.pageDownloads.saveManagement.supportParamR') }}</li>
<li>{{ $t('modals.settings.pageDownloads.saveManagement.supportParamD') }}</li>
<li>{{ $t('modals.settings.pageDownloads.saveManagement.supportParamC') }}</li>
<li>{{ $t('modals.settings.pageDownloads.saveManagement.supportParamZ') }}</li>
<li>{{ $t('modals.settings.pageDownloads.saveManagement.supportParamT') }}</li>
<li>{{ $t('modals.settings.pageDownloads.saveManagement.supportParamI') }}</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamN') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamL') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamG') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamF') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamR') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamD') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamC') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamZ') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamT') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamI') }}
</li>
</ul>
</v-card-text>
</v-card>

View file

@ -34,7 +34,9 @@ import { FullScreenModal } from '@/mixins'
export default {
name: 'Rss',
components: {
General, Feeds, Rules
General,
Feeds,
Rules
},
mixins: [FullScreenModal],
data: () => ({

View file

@ -14,16 +14,10 @@
</v-icon>
</v-list-item-action>
</v-list-item>
<v-divider
v-if="index < availableFeeds.length - 1"
:key="index"
/>
<v-divider v-if="index < availableFeeds.length - 1" :key="index" />
</template>
<v-list-item>
<v-btn
class="mx-auto accent white--text elevation-0 px-4"
@click="createFeed"
>
<v-btn class="mx-auto accent white--text elevation-0 px-4" @click="createFeed">
{{ $t('modals.settings.pageRss.pageFeeds.btnCreateNew') }}
</v-btn>
</v-list-item>
@ -66,4 +60,4 @@ export default {
}
}
}
</script>
</script>

View file

@ -1,15 +1,10 @@
<template>
<v-card flat>
<v-subheader>
{{ $t("modals.settings.pageRss.pageGeneral.rssAutoProcessing") }}
{{ $t('modals.settings.pageRss.pageGeneral.rssAutoProcessing') }}
</v-subheader>
<v-list-item>
<v-checkbox
v-model="settings.rss_processing_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageRss.pageGeneral.input.enableRssProcessing')"
/>
<v-checkbox v-model="settings.rss_processing_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageRss.pageGeneral.input.enableRssProcessing')" />
</v-list-item>
<v-list-item>
<v-text-field
@ -19,7 +14,7 @@
dense
type="number"
hide-details
:label="$t('modals.settings.pageRss.pageGeneral.input.feedsRefreshInterval') "
:label="$t('modals.settings.pageRss.pageGeneral.input.feedsRefreshInterval')"
/>
</v-list-item>
<v-list-item>
@ -30,24 +25,15 @@
dense
type="number"
hide-details
:label="$t('modals.settings.pageRss.pageGeneral.input.feedsMaxArticles') "
:label="$t('modals.settings.pageRss.pageGeneral.input.feedsMaxArticles')"
/>
</v-list-item>
<v-divider />
<v-subheader>
{{ $t("modals.settings.pageRss.pageGeneral.rssAutoDownloader") }}
{{ $t('modals.settings.pageRss.pageGeneral.rssAutoDownloader') }}
</v-subheader>
<v-list-item>
<v-checkbox
v-model="settings.rss_auto_downloading_enabled"
hide-details
class="ma-0 pa-0"
:label="
$t(
'modals.settings.pageRss.pageGeneral.input.enableRssAutoDownload'
)
"
/>
<v-checkbox v-model="settings.rss_auto_downloading_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageRss.pageGeneral.input.enableRssAutoDownload')" />
</v-list-item>
</v-card>
</template>
@ -55,7 +41,7 @@
import { FullScreenModal, SettingsTab } from '@/mixins'
export default {
name: 'Rss',
name: 'RssGeneral',
mixins: [SettingsTab, FullScreenModal]
}
</script>
@ -67,7 +53,7 @@ export default {
}
// Reversed input variant
:deep(.v-input--reverse .v-input__slot) {
@import "../../../../styles/styles";
@import '../../../../styles/styles';
@include reverse-switch;
}
</style>

View file

@ -14,16 +14,10 @@
</v-icon>
</v-list-item-action>
</v-list-item>
<v-divider
v-if="index < availableRules.length - 1"
:key="index"
/>
<v-divider v-if="index < availableRules.length - 1" :key="index" />
</template>
<v-list-item>
<v-btn
class="mx-auto accent white--text elevation-0 px-4"
@click="createRule"
>
<v-btn class="mx-auto accent white--text elevation-0 px-4" @click="createRule">
{{ $t('modals.settings.pageRss.pageRules.btnCreateNew') }}
</v-btn>
</v-list-item>
@ -66,4 +60,4 @@ export default {
}
}
}
</script>
</script>

View file

@ -14,21 +14,15 @@
</v-icon>
</v-list-item-action>
</v-list-item>
<v-divider
v-if="index < availableTags.length - 1"
:key="index"
/>
<v-divider v-if="index < availableTags.length - 1" :key="index" />
</template>
<v-list-item>
<v-btn
class="mx-auto accent white--text elevation-0 px-4"
@click="createTag"
>
<v-btn class="mx-auto accent white--text elevation-0 px-4" @click="createTag">
{{ $t('modals.settings.pageTagsAndCategories.btnCreateNew') }}
</v-btn>
</v-list-item>
</v-col>
<v-col cols="12" md="6">
<v-subheader>{{ $t('modals.settings.pageTagsAndCategories.subHeaderCategories') }}</v-subheader>
<template v-for="(item, index) in availableCategories">
@ -48,16 +42,10 @@
</v-list-item-action>
</v-list-item>
<v-divider
v-if="index < availableCategories.length - 1"
:key="index"
/>
<v-divider v-if="index < availableCategories.length - 1" :key="index" />
</template>
<v-list-item>
<v-btn
class="mx-auto accent white--text elevation-0 px-4"
@click="createCategory"
>
<v-btn class="mx-auto accent white--text elevation-0 px-4" @click="createCategory">
{{ $t('modals.settings.pageTagsAndCategories.btnCreateNew') }}
</v-btn>
</v-list-item>
@ -119,4 +107,3 @@ export default {
}
}
</script>

View file

@ -10,7 +10,7 @@
</v-tabs>
<v-tabs-items v-model="tab" touchless>
<v-tab-item eager value="general">
<General />
<VGeneral />
</v-tab-item>
<v-tab-item eager value="dashboard">
<Dashboard />
@ -20,14 +20,15 @@
</template>
<script>
import General from './VueTorrent/General.vue'
import VGeneral from './VueTorrent/VGeneral.vue'
import Dashboard from './VueTorrent/Dashboard.vue'
import { FullScreenModal } from '@/mixins'
export default {
name: 'VueTorrent',
components: {
General, Dashboard
VGeneral,
Dashboard
},
mixins: [FullScreenModal],
data: () => ({

View file

@ -7,21 +7,9 @@
</v-subheader>
<v-row dense>
<v-list flat class="ma-2 pa-0">
<draggable
:list="busyTorrentProperties"
tag="tbody"
>
<v-list-item
v-for="(item, index) in busyTorrentProperties"
:key="index"
class="ma-2 elevation-2 rounded-lg pointer"
>
<v-checkbox
v-model="item.active"
dense
hide-details
class="pa-0 ma-0"
/>
<draggable :list="busyTorrentProperties" tag="tbody">
<v-list-item v-for="(item, index) in busyTorrentProperties" :key="index" class="ma-2 elevation-2 rounded-lg pointer">
<v-checkbox v-model="item.active" dense hide-details class="pa-0 ma-0" />
<v-list-item-content>
<v-list-item-title class="truncate" v-text="item.name" />
</v-list-item-content>
@ -42,21 +30,9 @@
</v-subheader>
<v-row dense>
<v-list flat class="ma-2 pa-0">
<draggable
:list="doneTorrentProperties"
tag="tbody"
>
<v-list-item
v-for="(item, index) in doneTorrentProperties"
:key="index"
class="ma-2 elevation-2 rounded-lg pointer"
>
<v-checkbox
v-model="item.active"
dense
hide-details
class="pa-0 ma-0"
/>
<draggable :list="doneTorrentProperties" tag="tbody">
<v-list-item v-for="(item, index) in doneTorrentProperties" :key="index" class="ma-2 elevation-2 rounded-lg pointer">
<v-checkbox v-model="item.active" dense hide-details class="pa-0 ma-0" />
<v-list-item-content>
<v-list-item-title class="truncate" v-text="item.name" />
</v-list-item-content>
@ -94,4 +70,4 @@ export default {
}
}
}
</script>
</script>

View file

@ -6,91 +6,49 @@
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="showCurrentSpeed"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.currentSpeed')"
/>
<v-switch v-model="showCurrentSpeed" class="v-input--reverse pa-0 ma-0" hide-details inset :label="$t('modals.settings.pageVueTorrent.pageGeneral.currentSpeed')" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="showSpeedGraph"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.speedGraph')"
/>
<v-switch v-model="showSpeedGraph" class="v-input--reverse pa-0 ma-0" hide-details inset :label="$t('modals.settings.pageVueTorrent.pageGeneral.speedGraph')" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="showSessionStat"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.sessionStats')"
/>
<v-switch v-model="showSessionStat" class="v-input--reverse pa-0 ma-0" hide-details inset :label="$t('modals.settings.pageVueTorrent.pageGeneral.sessionStats')" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="showAlltimeStat"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.allTimeStats')"
/>
<v-switch v-model="showAlltimeStat" class="v-input--reverse pa-0 ma-0" hide-details inset :label="$t('modals.settings.pageVueTorrent.pageGeneral.allTimeStats')" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="freeSpace"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.freeSpace')"
/>
<v-switch v-model="freeSpace" class="v-input--reverse pa-0 ma-0" hide-details inset :label="$t('modals.settings.pageVueTorrent.pageGeneral.freeSpace')" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="showTrackerFilter"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.trackerFilter')"
/>
<v-switch v-model="showTrackerFilter" class="v-input--reverse pa-0 ma-0" hide-details inset :label="$t('modals.settings.pageVueTorrent.pageGeneral.trackerFilter')" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="rightDrawer"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.rightDrawer')"
/>
<v-switch v-model="rightDrawer" class="v-input--reverse pa-0 ma-0" hide-details inset :label="$t('modals.settings.pageVueTorrent.pageGeneral.rightDrawer')" />
</v-col>
</v-row>
</v-list-item>
@ -102,16 +60,7 @@
</p>
</v-col>
<v-col cols="4" sm="4" md="2">
<v-select
v-model="lang"
flat
solo
dense
hide-details
background-color="background"
class="rounded-xl"
:items="languages"
/>
<v-select v-model="lang" flat solo dense hide-details background-color="background" class="rounded-xl" :items="languages" />
</v-col>
</v-row>
</v-list-item>
@ -123,16 +72,7 @@
</p>
</v-col>
<v-col cols="4" sm="4" md="2">
<v-select
v-model="paginationSize"
flat
solo
dense
hide-details
background-color="background"
class="rounded-xl"
:items="paginationSizes"
/>
<v-select v-model="paginationSize" flat solo dense hide-details background-color="background" class="rounded-xl" :items="paginationSizes" />
</v-col>
</v-row>
</v-list-item>
@ -144,16 +84,7 @@
</p>
</v-col>
<v-col cols="4" sm="4" md="2">
<v-select
v-model="title"
flat
solo
dense
hide-details
background-color="background"
class="rounded-xl"
:items="titleOptions"
/>
<v-select v-model="title" flat solo dense hide-details background-color="background" class="rounded-xl" :items="titleOptions" />
</v-col>
</v-row>
</v-list-item>
@ -192,13 +123,14 @@
<script>
import { mapState, mapGetters } from 'vuex'
import qbit from '@/services/qbit'
import { availableLanguages } from '@/lang'
import { Qbit } from '../../../../services/qbit'
import { i18n } from '@/plugins/i18n'
export default {
name: 'General',
name: 'VueTorrent-General',
data() {
return {
languages: availableLanguages,
languages: i18n.availableLocales,
paginationSizes: [5, 15, 30, 50],
titleOptions: ['Default', 'Global Speed', 'First Torrent Status'],
Qbitversion: 0
@ -296,8 +228,7 @@ export default {
},
methods: {
async fetchQbitVersion() {
const version = await qbit.getAppVersion()
this.Qbitversion = version.includes('v') ? version.substring(1) : version
this.Qbitversion = await Qbit.getAppVersion()
}
}
}
@ -310,7 +241,7 @@ export default {
}
// Reversed input variant
:deep(.v-input--reverse .v-input__slot) {
@import "src/styles/styles.scss";
@import 'src/styles/styles.scss';
@include reverse-switch;
}
</style>
</style>

View file

@ -1,12 +1,7 @@
<template>
<v-card flat>
<v-list-item>
<v-checkbox
v-model="settings.alternative_webui_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageWebUI.useAlternativeWebUI')"
/>
<v-checkbox v-model="settings.alternative_webui_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageWebUI.useAlternativeWebUI')" />
</v-list-item>
<v-list-item>
<v-text-field
@ -24,25 +19,10 @@
<v-list-item>
<v-row class="ml-5 mr-5 pb-4">
<v-col cols="9" class="pa-0">
<v-text-field
v-model="settings.web_ui_address"
class="mr-1"
outlined
dense
hide-details="true"
:label="$t('modals.settings.pageWebUI.ipAddress')"
/>
<v-text-field v-model="settings.web_ui_address" class="mr-1" outlined dense hide-details="true" :label="$t('modals.settings.pageWebUI.ipAddress')" />
</v-col>
<v-col cols="3" class="pa-0">
<v-text-field
v-model="settings.web_ui_port"
class="ml-1"
outlined
dense
type="number"
hide-details="true"
:label="$t('modals.settings.pageWebUI.port')"
/>
<v-text-field v-model="settings.web_ui_port" class="ml-1" outlined dense type="number" hide-details="true" :label="$t('modals.settings.pageWebUI.port')" />
</v-col>
</v-row>
</v-list-item>
@ -51,24 +31,10 @@
<v-list-item>
<v-row class="ml-5 mr-5 pb-4">
<v-col cols="6" class="pa-0">
<v-text-field
v-model="settings.web_ui_username"
class="mr-1"
outlined
dense
hide-details="true"
:label="$t('modals.settings.pageWebUI.username')"
/>
<v-text-field v-model="settings.web_ui_username" class="mr-1" outlined dense hide-details="true" :label="$t('modals.settings.pageWebUI.username')" />
</v-col>
<v-col cols="6" class="pa-0">
<v-text-field
v-model="settings.web_ui_password"
class="ml-1"
outlined
dense
hide-details="true"
:label="$t('modals.settings.pageWebUI.password')"
/>
<v-text-field v-model="settings.web_ui_password" class="ml-1" outlined dense hide-details="true" :label="$t('modals.settings.pageWebUI.password')" />
</v-col>
</v-row>
</v-list-item>
@ -86,15 +52,7 @@
/>
</v-col>
<v-col cols="6" class="pa-0">
<v-text-field
v-model="settings.web_ui_ban_duration"
class="ml-1"
outlined
dense
type="number"
hide-details="true"
:label="$t('modals.settings.pageWebUI.banDuration')"
/>
<v-text-field v-model="settings.web_ui_ban_duration" class="ml-1" outlined dense type="number" hide-details="true" :label="$t('modals.settings.pageWebUI.banDuration')" />
</v-col>
</v-row>
</v-list-item>
@ -110,12 +68,7 @@
/>
</v-list-item>
<v-list-item class="ml-4">
<v-checkbox
v-model="settings.bypass_local_auth"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageWebUI.bypassAuthenticationForClientsOnLocalhost')"
/>
<v-checkbox v-model="settings.bypass_local_auth" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageWebUI.bypassAuthenticationForClientsOnLocalhost')" />
</v-list-item>
<v-list-item class="ml-4">
<v-checkbox

View file

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

View file

@ -5,11 +5,7 @@
</div>
<div>
{{ torrent.dlspeed | getDataValue(1) }}
<span class="caption grey--text">
{{
torrent.dlspeed | getDataUnit(1)
}}/s
</span>
<span class="caption grey--text"> {{ torrent.dlspeed | getDataUnit(1) }}/s </span>
</div>
</v-flex>
</template>

View file

@ -6,9 +6,7 @@
<div>
{{ torrent.dloaded | getDataValue(2) }}
<span class="caption grey--text">
{{
torrent.dloaded | getDataUnit(1)
}}
{{ torrent.dloaded | getDataUnit(1) }}
</span>
</div>
</v-flex>

View file

@ -5,17 +5,13 @@
</div>
<div>
{{ torrent.num_leechs }}
<span
class="grey--text caption"
>
/{{ torrent.available_peers }}
</span>
<span class="grey--text caption"> /{{ torrent.available_peers }} </span>
</div>
</v-flex>
</template>
<script>
export default {
name: 'Peers',
name: 'DashboardPeers',
props: ['torrent']
}
</script>

View file

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

View file

@ -5,11 +5,7 @@
</div>
<div>
{{ torrent.num_seeds }}
<span
class="grey--text caption"
>
/{{ torrent.available_seeds }}
</span>
<span class="grey--text caption"> /{{ torrent.available_seeds }} </span>
</div>
</v-flex>
</template>

View file

@ -6,9 +6,7 @@
<div>
{{ torrent.size | getDataValue }}
<span class="caption grey--text">
{{
torrent.size | getDataUnit
}}
{{ torrent.size | getDataUnit }}
</span>
</div>
</v-flex>

View file

@ -1,18 +1,9 @@
<template>
<v-flex
xs6
sm1
md1
class="mr-4"
>
<v-flex xs6 sm1 md1 class="mr-4">
<div class="caption grey--text">
{{ $t('status') }}
</div>
<v-chip
small
class="caption white--text px-2"
:class="state"
>
<v-chip small class="caption white--text px-2" :class="state">
{{ stateString }}
</v-chip>
</v-flex>
@ -27,8 +18,8 @@ export default {
stateString() {
if (this.torrent.forced) {
return `[F] ${this.torrent.state}`
}
}
return this.torrent.state
}
}

View file

@ -4,17 +4,7 @@
{{ $t('tags') }}
</div>
<v-row wrap class="ma-0">
<v-chip
v-for="tag in torrent.tags"
:key="tag"
small
:class="
theme === 'light'
? 'white--text'
: 'black--text'
"
class="download caption mb-1 mx-1"
>
<v-chip v-for="tag in torrent.tags" :key="tag" small :class="theme === 'light' ? 'white--text' : 'black--text'" class="download caption mb-1 mx-1">
{{ tag }}
</v-chip>
</v-row>

View file

@ -5,11 +5,7 @@
</div>
<div>
{{ torrent.upspeed | getDataValue(1) }}
<span class="caption grey--text">
{{
torrent.upspeed | getDataUnit(1)
}}/s
</span>
<span class="caption grey--text"> {{ torrent.upspeed | getDataUnit(1) }}/s </span>
</div>
</v-flex>
</template>

View file

@ -6,9 +6,7 @@
<div>
{{ torrent.uploaded | getDataValue }}
<span class="caption grey--text">
{{
torrent.uploaded | getDataUnit
}}
{{ torrent.uploaded | getDataUnit }}
</span>
</div>
</v-flex>

View file

@ -7,9 +7,7 @@
<div>
{{ torrent.uploaded_session | getDataValue }}
<span class="caption grey--text">
{{
torrent.uploaded_session | getDataUnit
}}
{{ torrent.uploaded_session | getDataUnit }}
</span>
</div>
</v-flex>

View file

@ -1,35 +1,18 @@
import Size from './Size'
import Progress from './Progress'
import Download from './Download'
import Downloaded from './Downloaded'
import Ratio from './Ratio'
import Upload from './Upload'
import ETA from './ETA'
import Peers from './Peers'
import Seeds from './Seeds'
import Status from './Status'
import Category from './Category'
import Tags from './Tags'
import AddedOn from './AddedOn'
import Uploaded from './Uploaded'
import UploadedSession from './UploadedSession'
import Availability from './Availability'
import Size from './Size.vue'
import Progress from './Progress.vue'
import Download from './Download.vue'
import Downloaded from './Downloaded.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 Category from './Category.vue'
import Tags from './Tags.vue'
import AddedOn from './AddedOn.vue'
import Uploaded from './Uploaded.vue'
import UploadedSession from './UploadedSession.vue'
import Availability from './Availability.vue'
export {
Size,
Progress,
Download,
Ratio,
Upload,
ETA,
Peers,
Seeds,
Status,
Category,
Tags,
AddedOn,
Uploaded,
UploadedSession,
Downloaded,
Availability
}
export { Size, Progress, Download, Ratio, Upload, ETA, Peers, Seeds, Status, Category, Tags, AddedOn, Uploaded, UploadedSession, Downloaded, Availability }

View file

@ -1,9 +1,5 @@
<template>
<v-layout
row
wrap
class="ma-0 px-4 py-2 ml-0 "
>
<v-layout row wrap class="ma-0 px-4 py-2 ml-0">
<v-flex xs12>
<div class="caption grey--text">
{{ $t('torrent.torrentTitle') }}
@ -12,12 +8,7 @@
{{ torrent.name }}
</div>
</v-flex>
<component
:is="item.name"
v-for="item in properties"
:key="item.name"
:torrent="torrent"
/>
<component :is="item.name" v-for="item in properties" :key="item.name" :torrent="torrent" />
</v-layout>
</template>
<script>
@ -43,4 +34,4 @@ export default {
}
}
}
</script>
</script>

View file

@ -1,29 +1,15 @@
<template>
<v-layout
row
wrap
class="ma-0 pa-1"
>
<v-layout row wrap class="ma-0 pa-1">
<v-flex xs12 class="ma-1" row>
<span class="subtitle-1" style="line-height: 1.3em; font-size: .95em !important;">
<span class="subtitle-1" style="line-height: 1.3em; font-size: 0.95em !important">
{{ torrent.name }}
</span>
</v-flex>
<v-flex xs12 row class="ma-1 mt-0">
<v-chip
small
class="caption white--text mr-2"
:class="torrent.state.toLowerCase()"
style="height: 20px;"
>
<v-chip small class="caption white--text mr-2" :class="torrent.state.toLowerCase()" style="height: 20px">
{{ torrent.state }}
</v-chip>
<v-chip
v-if="torrent.category"
small
class="upload caption white--text"
style="height: 20px;"
>
<v-chip v-if="torrent.category" small class="upload caption white--text" style="height: 20px">
{{ torrent.category }}
</v-chip>
</v-flex>
@ -45,36 +31,27 @@
<span class="body-2 ml-1"> {{ torrent.eta }} </span>
</v-flex>
<v-flex xs12 class="ma-1">
<v-progress-linear
rounded
color="upload"
height="5"
:value="torrent.progress"
/>
<v-progress-linear rounded color="upload" height="5" :value="torrent.progress" />
</v-flex>
<v-flex row xs12 class="ma-1">
<div class="caption grey--text">
{{ torrent.num_seeds }}/{{ torrent.available_seeds }} seeds
</div>
<div class="caption grey--text">{{ torrent.num_seeds }}/{{ torrent.available_seeds }} seeds</div>
<span class="mx-1 grey--text" style="margin-top: 2px"></span>
<div class="caption grey--text">
{{ torrent.num_leechs }}/{{ torrent.available_peers }} peers
</div>
<div class="caption grey--text">{{ torrent.num_leechs }}/{{ torrent.available_peers }} peers</div>
<v-spacer />
<div>
<span v-if="torrent.dlspeed">
<v-icon small class="grey--text">
{{ mdiChevronDown }}
</v-icon>
</v-icon>
<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(1) }}/s </span>
<span class="caption grey--text" style="font-size: 0.6em !important"> {{ torrent.dlspeed | getDataUnit(1) }}/s </span>
</span>
<span v-if="torrent.upspeed">
<v-icon small class="grey--text">
{{ mdiChevronUp }}
</v-icon>
</v-icon>
<span class="caption font-weight-medium grey--text">{{ torrent.upspeed | getDataValue(1) }} </span>
<span class="caption grey--text" style="font-size: 0.6em !important;"> {{ torrent.upspeed | getDataUnit(1) }}/s </span>
<span class="caption grey--text" style="font-size: 0.6em !important"> {{ torrent.upspeed | getDataUnit(1) }}/s </span>
</span>
</div>
</v-flex>
@ -88,7 +65,8 @@ export default {
torrent: Object
},
data: () => ({
mdiChevronUp, mdiChevronDown
mdiChevronUp,
mdiChevronDown
})
}
</script>
</script>

View file

@ -1,11 +1,6 @@
<template>
<v-card
class="pointer noselect elevation-0 rounded-0 ma-0 pa-0"
:class="style"
>
<v-layout
@click="evtClicnk"
>
<v-card class="pointer noselect elevation-0 rounded-0 ma-0 pa-0" :class="style">
<v-layout @click="evtClicnk">
<MobileCard v-if="isMobile" :torrent="torrent" />
<DesktopCard v-else :torrent="torrent" />
</v-layout>

View file

@ -2,25 +2,19 @@
<v-list class="noselect">
<v-list-item link @click="resume">
<v-icon>{{ mdiPlay }}</v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.resume') | titleCase }}
</v-list-item-title>
</v-list-item>
<v-list-item link @click="forceResume">
<v-icon>{{ mdiFastForward }}</v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.forceResume') | titleCase }}
</v-list-item-title>
</v-list-item>
<v-list-item link @click="pause">
<v-icon>{{ mdiPause }}</v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('pause') | titleCase }}
</v-list-item-title>
</v-list-item>
@ -30,26 +24,16 @@
<v-icon color="red">
{{ mdiDelete }}
</v-icon>
<v-list-item-title
class="ml-2 red--text list-item__title"
>
<v-list-item-title class="ml-2 red--text list-item__title">
{{ $t('delete') | titleCase }}
</v-list-item-title>
</v-list-item>
<v-divider />
<v-menu
:open-on-hover="!touchmode"
top
offset-x
:transition="isRightside ? 'slide-x-reverse-transition' : 'slide-x-transition'"
:left="isRightside"
>
<v-menu :open-on-hover="!touchmode" top offset-x :transition="isRightside ? 'slide-x-reverse-transition' : 'slide-x-transition'" :left="isRightside">
<template #activator="{ on }">
<v-list-item link v-on="on">
<v-icon>{{ mdiHeadCog }}</v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.advanced.advanced') | titleCase }}
</v-list-item-title>
<v-list-item-action>
@ -60,75 +44,59 @@
<v-list>
<v-list-item v-if="!multiple" link @click="location">
<v-icon>{{ mdiFolder }}</v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.advanced.changeLocation') | titleCase }}
</v-list-item-title>
</v-list-item>
<v-list-item v-if="!multiple" link @click="rename">
<v-icon>{{ mdiRenameBox }}</v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.advanced.rename') | titleCase }}
</v-list-item-title>
</v-list-item>
<v-list-item link @click="recheck">
<v-icon>{{ mdiPlaylistCheck }}</v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.advanced.forceRecheck') | titleCase }}
</v-list-item-title>
</v-list-item>
<v-list-item link @click="reannounce">
<v-icon>{{ mdiBullhorn }}</v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.advanced.forceReannounce') | titleCase }}
</v-list-item-title>
</v-list-item>
<v-list-item v-if="!multiple" link @click="toggleSeq">
<v-icon> {{ torrent.seq_dl ? mdiCheckboxMarked : mdiCheckboxBlankOutline }} </v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-icon>
{{ torrent.seq_dl ? mdiCheckboxMarked : mdiCheckboxBlankOutline }}
</v-icon>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.advanced.sequentialDownload') | titleCase }}
</v-list-item-title>
</v-list-item>
<v-list-item v-if="!multiple" link @click="toggleFL">
<v-icon> {{ torrent.f_l_piece_prio ? mdiCheckboxMarked : mdiCheckboxBlankOutline }} </v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-icon>
{{ torrent.f_l_piece_prio ? mdiCheckboxMarked : mdiCheckboxBlankOutline }}
</v-icon>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.advanced.firstLastPriority') | titleCase }}
</v-list-item-title>
</v-list-item>
<v-list-item v-if="!multiple" link @click="toggleAutoTMM">
<v-icon> {{ torrent.auto_tmm ? mdiCheckboxMarked : mdiCheckboxBlankOutline }} </v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-icon>
{{ torrent.auto_tmm ? mdiCheckboxMarked : mdiCheckboxBlankOutline }}
</v-icon>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.advanced.automaticTorrentManagement') | titleCase }}
</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
<v-menu
:open-on-hover="!touchmode"
top
offset-x
:transition="isRightside ? 'slide-x-reverse-transition' : 'slide-x-transition'"
:left="isRightside"
>
<v-menu :open-on-hover="!touchmode" top offset-x :transition="isRightside ? 'slide-x-reverse-transition' : 'slide-x-transition'" :left="isRightside">
<template #activator="{ on }">
<v-list-item link v-on="on">
<v-icon>{{ mdiPriorityHigh }}</v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.prio.prio') | titleCase }}
</v-list-item-title>
<v-list-item-action>
@ -137,32 +105,19 @@
</v-list-item>
</template>
<v-list>
<v-list-item
v-for="(item, index) in priority_options"
:key="index"
link
@click="setPriority(item.action)"
>
<v-list-item v-for="(item, index) in priority_options" :key="index" link @click="setPriority(item.action)">
<v-icon>{{ item.icon }}</v-icon>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.prio.' + item.name ) | titleCase }}
{{ $t('rightClick.prio.' + item.name) | titleCase }}
</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
<v-menu
:open-on-hover="!touchmode"
top
offset-x
:transition="isRightside ? 'slide-x-reverse-transition' : 'slide-x-transition'"
:left="isRightside"
>
<v-menu :open-on-hover="!touchmode" top offset-x :transition="isRightside ? 'slide-x-reverse-transition' : 'slide-x-transition'" :left="isRightside">
<template #activator="{ on }">
<v-list-item link v-on="on">
<v-icon>{{ mdiShape }}</v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.category') | titleCase }}
</v-list-item-title>
<v-list-item-action>
@ -171,32 +126,18 @@
</v-list-item>
</template>
<v-list>
<v-list-item
v-for="(item, index) in availableCategories"
:key="index"
link
@click="setCategory(item.value)"
>
<v-list-item v-for="(item, index) in availableCategories" :key="index" link @click="setCategory(item.value)">
<v-list-item-title class="ml-2 list-item__title">
{{ item.name }}
</v-list-item-title>
</v-list-item>
</v-list>
</v-menu>
<v-menu
v-if="!multiple"
:open-on-hover="!touchmode"
top
offset-x
:transition="isRightside ? 'slide-x-reverse-transition' : 'slide-x-transition'"
:left="isRightside"
>
<v-menu v-if="!multiple" :open-on-hover="!touchmode" top offset-x :transition="isRightside ? 'slide-x-reverse-transition' : 'slide-x-transition'" :left="isRightside">
<template #activator="{ on }">
<v-list-item link v-on="on">
<v-icon>{{ mdiSpeedometerSlow }}</v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.limit') | titleCase }}
</v-list-item-title>
<v-list-item-action>
@ -225,20 +166,11 @@
</v-list-item>
</v-list>
</v-menu>
<v-menu
v-if="!multiple"
:open-on-hover="!touchmode"
top
offset-x
:transition="isRightside ? 'slide-x-reverse-transition' : 'slide-x-transition'"
:left="isRightside"
>
<v-menu v-if="!multiple" :open-on-hover="!touchmode" top offset-x :transition="isRightside ? 'slide-x-reverse-transition' : 'slide-x-transition'" :left="isRightside">
<template #activator="{ on }">
<v-list-item link v-on="on">
<v-icon>{{ mdiContentCopy }}</v-icon>
<v-list-item-title
class="ml-2 list-item__title"
>
<v-list-item-title class="ml-2 list-item__title">
{{ $t('rightClick.copy') | titleCase }}
</v-list-item-title>
<v-list-item-action>
@ -282,11 +214,31 @@ import { mapGetters, mapState } from 'vuex'
import qbit from '@/services/qbit'
import { General, TorrentSelect } from '@/mixins'
import {
mdiBullhorn, mdiPlaylistCheck, mdiArrowUp, mdiArrowDown, mdiPriorityLow,
mdiInformation, mdiRenameBox, mdiFolder, mdiDelete, mdiAccountGroup,
mdiPlay, mdiPause, mdiSelect, mdiPriorityHigh, mdiChevronRight,
mdiFastForward, mdiShape, mdiHeadCog, mdiCheckboxMarked, mdiCheckboxBlankOutline,
mdiSpeedometerSlow, mdiChevronUp, mdiChevronDown, mdiContentCopy, mdiMagnet
mdiBullhorn,
mdiPlaylistCheck,
mdiArrowUp,
mdiArrowDown,
mdiPriorityLow,
mdiInformation,
mdiRenameBox,
mdiFolder,
mdiDelete,
mdiAccountGroup,
mdiPlay,
mdiPause,
mdiSelect,
mdiPriorityHigh,
mdiChevronRight,
mdiFastForward,
mdiShape,
mdiHeadCog,
mdiCheckboxMarked,
mdiCheckboxBlankOutline,
mdiSpeedometerSlow,
mdiChevronUp,
mdiChevronDown,
mdiContentCopy,
mdiMagnet
} from '@mdi/js'
export default {
@ -306,22 +258,40 @@ export default {
{ name: 'decrease', icon: mdiArrowDown, action: 'decreasePrio' },
{ name: 'bottom', icon: mdiPriorityLow, action: 'bottomPrio' }
],
mdiDelete, mdiPlay, mdiPause, mdiSelect, mdiFastForward,
mdiFolder, mdiRenameBox, mdiInformation, mdiMagnet, mdiAccountGroup,
mdiPlaylistCheck, mdiPriorityHigh, mdiBullhorn, mdiChevronRight,
mdiShape, mdiHeadCog, mdiCheckboxMarked, mdiCheckboxBlankOutline,
mdiSpeedometerSlow, mdiChevronUp, mdiChevronDown, mdiContentCopy
mdiDelete,
mdiPlay,
mdiPause,
mdiSelect,
mdiFastForward,
mdiFolder,
mdiRenameBox,
mdiInformation,
mdiMagnet,
mdiAccountGroup,
mdiPlaylistCheck,
mdiPriorityHigh,
mdiBullhorn,
mdiChevronRight,
mdiShape,
mdiHeadCog,
mdiCheckboxMarked,
mdiCheckboxBlankOutline,
mdiSpeedometerSlow,
mdiChevronUp,
mdiChevronDown,
mdiContentCopy
}
},
computed: {
...mapGetters(['getCategories']),
...mapState(['selected_torrents']),
availableCategories() {
const categories = [
{ name: 'None', value: '' }]
categories.push(...this.getCategories().map(c => {
return { name: c.name, value: c.name }
}))
const categories = [{ name: 'None', value: '' }]
categories.push(
...this.getCategories().map(c => {
return { name: c.name, value: c.name }
})
)
return categories
},
@ -419,8 +389,8 @@ export default {
</script>
<style scoped lang="scss">
.list-item {
&__title {
font-size: 1em;
}
&__title {
font-size: 1em;
}
}
</style>

View file

@ -1,14 +1,6 @@
<template>
<v-card flat>
<v-treeview
v-model="selected"
:items="fileTree"
:open.sync="opened"
activatable
selectable
item-key="fullName"
open-all
>
<v-treeview v-model="selected" :items="fileTree" :open.sync="opened" activatable selectable item-key="fullName" open-all>
<template #prepend="{ item, open }">
<v-icon v-if="!item.icon">
{{ open ? mdiFolderOpen : mdiFolderOpen }}
@ -19,40 +11,18 @@
</template>
<template #label="{ item }">
<span v-if="!item.editing">{{ item.name }}</span>
<v-text-field
v-if="item.editing"
v-model="item.newName"
autofocus
/>
<v-text-field v-if="item.editing" v-model="item.newName" autofocus />
</template>
<template v-if="!$vuetify.breakpoint.smAndDown" #append="{ item }">
<div v-if="!item.icon">
<span class="ml-4">{{ item.children.length }} Files</span>
<v-btn
v-if="!item.editing"
fab
x-small
class="accent white--text elevation-0 px-4 ml-2"
@click="edit(item)"
>
<v-btn v-if="!item.editing" fab x-small class="accent white--text elevation-0 px-4 ml-2" @click="edit(item)">
<v-icon>{{ mdiPencil }}</v-icon>
</v-btn>
<v-btn
v-if="item.editing"
fab
x-small
class="accent white--text elevation-0 px-4 ml-2"
@click="renameFolder(item)"
>
<v-btn v-if="item.editing" fab x-small class="accent white--text elevation-0 px-4 ml-2" @click="renameFolder(item)">
<v-icon>{{ mdiContentSave }}</v-icon>
</v-btn>
<v-btn
v-if="item.editing"
fab
x-small
class="error white--text elevation-0 px-4 ml-2"
@click="togleEditing(item)"
>
<v-btn v-if="item.editing" fab x-small class="error white--text elevation-0 px-4 ml-2" @click="togleEditing(item)">
<v-icon>{{ mdiClose }}</v-icon>
</v-btn>
</div>
@ -60,27 +30,14 @@
<span>[{{ item.size }}]</span>
<span class="ml-4">{{ item.progress }}%</span>
<span class="ml-4">[ {{ item.priority | priority }} ]</span>
<v-menu
open-on-hover
offset-y
>
<v-menu open-on-hover offset-y>
<template #activator="{ on }">
<v-btn
fab
x-small
class="accent white--text elevation-0 px-4 ml-2"
v-on="on"
>
<v-btn fab x-small class="accent white--text elevation-0 px-4 ml-2" v-on="on">
<v-icon>{{ mdiTrendingUp }}</v-icon>
</v-btn>
</template>
<v-list>
<v-list-item
v-for="prio in priority_options"
:key="prio.value"
link
@click="setFilePrio(item.id, prio.value)"
>
<v-list-item v-for="prio in priority_options" :key="prio.value" link @click="setFilePrio(item.id, prio.value)">
<v-icon>{{ prio.icon }}</v-icon>
<v-list-item-title class="caption">
{{ prio.name }}
@ -88,31 +45,13 @@
</v-list-item>
</v-list>
</v-menu>
<v-btn
v-if="!item.editing"
fab
x-small
class="accent white--text elevation-0 px-4 ml-2"
@click="edit(item)"
>
<v-btn v-if="!item.editing" fab x-small class="accent white--text elevation-0 px-4 ml-2" @click="edit(item)">
<v-icon>{{ mdiPencil }}</v-icon>
</v-btn>
<v-btn
v-if="item.editing"
fab
x-small
class="accent white--text elevation-0 px-4 ml-2"
@click="renameFile(item)"
>
<v-btn v-if="item.editing" fab x-small class="accent white--text elevation-0 px-4 ml-2" @click="renameFile(item)">
<v-icon>{{ mdiContentSave }}</v-icon>
</v-btn>
<v-btn
v-if="item.editing"
fab
x-small
class="error white--text elevation-0 px-4 ml-2"
@click="togleEditing(item)"
>
<v-btn v-if="item.editing" fab x-small class="error white--text elevation-0 px-4 ml-2" @click="togleEditing(item)">
<v-icon>{{ mdiClose }}</v-icon>
</v-btn>
</div>
@ -125,11 +64,7 @@
import qbit from '@/services/qbit'
import { treeify } from '@/helpers'
import { FullScreenModal } from '@/mixins'
import {
mdiClose, mdiContentSave, mdiPencil, mdiFolderOpen,
mdiFolder, mdiFile, mdiTrendingUp, mdiPriorityHigh,
mdiArrowUp, mdiArrowDown, mdiPriorityLow
} from '@mdi/js'
import { mdiClose, mdiContentSave, mdiPencil, mdiFolderOpen, mdiFolder, mdiFile, mdiTrendingUp, mdiPriorityHigh, mdiArrowUp, mdiArrowDown, mdiPriorityLow } from '@mdi/js'
const FILE_PRIORITY_OPTIONS = [
{ name: 'max', icon: mdiPriorityHigh, value: 7 },
@ -193,16 +128,8 @@ export default {
methods: {
initFiles() {
this.getTorrentFiles().then(() => {
this.opened = []
.concat(
...this.treeData
.map(file => file.name.split('/'))
.filter(f => f.splice(-1, 1))
)
.filter((f, index, self) => index === self.indexOf(f))
this.selected = this.treeData
.filter(file => file.priority !== 0)
.map(file => file.name)
this.opened = [].concat(...this.treeData.map(file => file.name.split('/')).filter(f => f.splice(-1, 1))).filter((f, index, self) => index === self.indexOf(f))
this.selected = this.treeData.filter(file => file.priority !== 0).map(file => file.name)
})
},
async getTorrentFiles() {
@ -255,8 +182,7 @@ export default {
this.togleEditing(item)
},
setFilePrio(fileId, priority) {
qbit.setTorrentFilePriority(this.hash, [fileId], priority)
.then(() => this.initFiles())
qbit.setTorrentFilePriority(this.hash, [fileId], priority).then(() => this.initFiles())
}
}
}

View file

@ -1,29 +1,13 @@
<template>
<v-card flat>
<v-data-table
v-if="peers"
dense
:headers="headers"
:items="peers"
:items-per-page="-1"
:hide-default-footer="true"
mobile-breakpoint="0"
>
<v-data-table v-if="peers" dense :headers="headers" :items="peers" :items-per-page="-1" :hide-default-footer="true" mobile-breakpoint="0">
<template #item="row">
<tr>
<td class="ip">
<template v-if="row.item.country_code">
<img
v-if="isWindows"
class="country-flag"
:title="row.item.country"
:alt="codeToFlag(row.item.country_code).char"
:src="codeToFlag(row.item.country_code).url"
>
<img v-if="isWindows" class="country-flag" :title="row.item.country" :alt="codeToFlag(row.item.country_code).char" :src="codeToFlag(row.item.country_code).url" />
<template v-else>
{{
codeToFlag(row.item.country_code).char
}}
{{ codeToFlag(row.item.country_code).char }}
</template>
</template>
{{ row.item.ip }}
@ -52,8 +36,9 @@ import { map, merge } from 'lodash'
import qbit from '@/services/qbit'
import { codeToFlag, isWindows } from '@/helpers'
import { FullScreenModal } from '@/mixins'
export default {
name: 'Peers',
name: 'DetailPeers',
mixins: [FullScreenModal],
props: { hash: String, isActive: Boolean },
data: () => ({
@ -79,7 +64,10 @@ export default {
{ text: this.$i18n.t('modals.detail.pagePeers.flags'), value: 'flags' },
{ text: this.$i18n.t('modals.detail.pagePeers.client'), value: 'client' },
{ text: this.$i18n.t('modals.detail.pagePeers.progress'), value: 'progress' },
{ text: this.$i18n.t('modals.detail.pagePeers.downloadSpeed'), value: 'dl_speed' },
{
text: this.$i18n.t('modals.detail.pagePeers.downloadSpeed'),
value: 'dl_speed'
},
{ text: this.$i18n.t('modals.detail.pagePeers.downloaded'), value: 'downloaded' },
{ text: this.$i18n.t('modals.detail.pagePeers.upSpeed'), value: 'up_speed' },
{ text: this.$i18n.t('modals.detail.pagePeers.uploaded'), value: 'uploaded' },
@ -97,9 +85,12 @@ export default {
},
created() {
this.getTorrentPeers()
this.refreshTimer = setInterval(function () {
this.getTorrentPeers()
}.bind(this), 2000)
this.refreshTimer = setInterval(
function () {
this.getTorrentPeers()
}.bind(this),
2000
)
},
beforeDestroy() {
clearTimeout(this.refreshTimer)
@ -112,10 +103,7 @@ export default {
return isWindows()
},
async getTorrentPeers() {
const { data } = await qbit.getTorrentPeers(
this.hash,
this.rid + 1 || undefined
)
const { data } = await qbit.getTorrentPeers(this.hash, this.rid + 1 || undefined)
this.rid = data.rid
@ -137,7 +125,7 @@ export default {
}
</style>
<style lang="scss" scoped>
@import "~@/styles/colors.scss";
@import '@/styles/colors.scss';
:deep(.v-data-table thead th),
:deep(.v-data-table tbody td) {

View file

@ -110,8 +110,7 @@
{{ $t('modals.detail.pageInfo.peers') }}
</td>
<td>
{{ torrent.num_leechs
}}<span :class="commonStyle">/{{ torrent.available_peers }}</span>
{{ torrent.num_leechs }}<span :class="commonStyle">/{{ torrent.available_peers }}</span>
</td>
</tr>
<tr>
@ -119,8 +118,7 @@
{{ $t('modals.detail.pageInfo.seeds') }}
</td>
<td>
{{ torrent.num_seeds
}}<span :class="commonStyle">/{{ torrent.available_seeds }}</span>
{{ torrent.num_seeds }}<span :class="commonStyle">/{{ torrent.available_seeds }}</span>
</td>
</tr>
<tr>
@ -136,10 +134,7 @@
{{ $t('modals.detail.pageInfo.status') }}
</td>
<td>
<v-chip
small
:class="`${torrent.state.toLowerCase()} white--text caption`"
>
<v-chip small :class="`${torrent.state.toLowerCase()} white--text caption`">
{{ torrent.state }}
</v-chip>
</td>
@ -149,7 +144,7 @@
{{ $t('modals.detail.pageInfo.trackers') }}
</td>
<td>
<span v-for="trackersPart in splitString(torrent.tracker)">
<span v-for="trackersPart in splitString(torrent.tracker)" :key="trackersPart">
<a v-if="stringContainsUrl(trackersPart)" _target="blank" :href="trackersPart">{{ trackersPart }}</a>
<span v-else>{{ trackersPart }}</span>
</span>
@ -160,7 +155,7 @@
{{ $t('modals.detail.pageInfo.createdBy') }}
</td>
<td>
<span v-for="createdByPart in splitString(createdBy)">
<span v-for="createdByPart in splitString(createdBy)" :key="createdByPart">
<a v-if="stringContainsUrl(createdByPart)" _target="blank" :href="createdByPart">{{ createdByPart }}</a>
<span v-else>{{ createdByPart }}</span>
</span>
@ -171,7 +166,7 @@
{{ $t('torrent.comments') | titleCase }}
</td>
<td>
<span v-for="commentPart in splitString(comment)">
<span v-for="commentPart in splitString(comment)" :key="commentPart">
<a v-if="stringContainsUrl(commentPart)" _target="blank" :href="commentPart">{{ commentPart }}</a>
<span v-else>{{ commentPart }}</span>
</span>
@ -222,23 +217,15 @@
<td :class="commonStyle">
{{ $t('modals.detail.pageInfo.downloadLimit') }}
</td>
<td v-if="torrent.dl_limit > 0">
{{ torrent.dl_limit | getDataValue }} {{ torrent.dl_limit | getDataUnit }}<span>/s </span>
</td>
<td v-else>
</td>
<td v-if="torrent.dl_limit > 0">{{ torrent.dl_limit | getDataValue }} {{ torrent.dl_limit | getDataUnit }}<span>/s </span></td>
<td v-else></td>
</tr>
<tr>
<td :class="commonStyle">
{{ $t('modals.detail.pageInfo.uploadLimit') }}
</td>
<td v-if="torrent.up_limit > 0">
{{ torrent.up_limit | getDataValue }} {{ torrent.up_limit | getDataUnit }}<span>/s </span>
</td>
<td v-else>
</td>
<td v-if="torrent.up_limit > 0">{{ torrent.up_limit | getDataValue }} {{ torrent.up_limit | getDataUnit }}<span>/s </span></td>
<td v-else></td>
</tr>
<tr>
<td :class="commonStyle">
@ -300,9 +287,11 @@ export default {
const status = data[i]
let newColor = ''
if (status === 1) // requested / downloading
if (status === 1)
// requested / downloading
newColor = this.$vuetify.theme.currentTheme['torrent-downloading']
else if (status === 2) // already downloaded
else if (status === 2)
// already downloaded
newColor = this.$vuetify.theme.currentTheme['torrent-done']
if (newColor === color) {
@ -312,7 +301,7 @@ export default {
if (color !== '') {
ctx.fillStyle = color
ctx.fillRect((i - rectWidth), 0, rectWidth, canvas.height)
ctx.fillRect(i - rectWidth, 0, rectWidth, canvas.height)
}
rectWidth = 1
@ -322,7 +311,7 @@ export default {
// Fill a rect at the end of the canvas if one is needed
if (color !== '') {
ctx.fillStyle = color
ctx.fillRect((data.length - rectWidth), 0, rectWidth, canvas.height)
ctx.fillRect(data.length - rectWidth, 0, rectWidth, canvas.height)
}
}
},

View file

@ -3,31 +3,21 @@
<v-row dense class="ma-0 pa-0">
<v-col cols="12" md="6">
<v-subheader>{{ $t('modals.detail.pageTagsAndCategories.subHeaderTag') }}</v-subheader>
<v-list-item-group
:value="activeTags"
active-class="accent--text"
multiple
>
<v-list-item-group :value="activeTags" active-class="accent--text" multiple>
<template v-for="(item, index) in availableTags">
<v-list-item :key="item.title" @click="addTag(item)">
<v-list-item-content>
<v-list-item-title v-text="item" />
</v-list-item-content>
</v-list-item>
<v-divider
v-if="index < availableTags.length - 1"
:key="index"
/>
<v-divider v-if="index < availableTags.length - 1" :key="index" />
</template>
</v-list-item-group>
</v-col>
<v-col cols="12" md="6">
<v-subheader>{{ $t('modals.detail.pageTagsAndCategories.subHeaderCategories') }}</v-subheader>
<v-list-item-group
:value="activeCategory"
active-class="accent--text"
>
<v-list-item-group :value="activeCategory" active-class="accent--text">
<template v-for="(item, index) in availableCategories">
<v-list-item :key="item.title" @click="setCategory(item)">
<v-list-item-content>
@ -35,10 +25,7 @@
</v-list-item-content>
</v-list-item>
<v-divider
v-if="index < availableCategories.length - 1"
:key="index"
/>
<v-divider v-if="index < availableCategories.length - 1" :key="index" />
</template>
</v-list-item-group>
</v-col>
@ -81,7 +68,7 @@ export default {
if (index !== -1) active.push(index)
})
}
return active
}
},

View file

@ -1,29 +1,12 @@
<template>
<v-card flat>
<v-card-text class="pa-0">
<v-data-table
v-if="trackers"
v-model="selectedTrackers"
dense
show-select
:headers="headers"
:items="trackers"
:items-per-page="-1"
item-key="url"
mobile-breakpoint="0"
>
<v-data-table v-if="trackers" v-model="selectedTrackers" dense show-select :headers="headers" :items="trackers" :items-per-page="-1" item-key="url" mobile-breakpoint="0">
<template #body="{ items }">
<tbody>
<tr v-for="item in items" :key="item.url">
<td>
<v-checkbox
v-if="typeof item.tier === 'number'"
v-model="selectedTrackers"
:value="item"
hide-details
class="pa-0 ma-0"
color="accent"
/>
<v-checkbox v-if="typeof item.tier === 'number'" v-model="selectedTrackers" :value="item" hide-details class="pa-0 ma-0" color="accent" />
</td>
<td>{{ item.tier }}</td>
<td>{{ item.url }}</td>
@ -39,51 +22,22 @@
</v-data-table>
</v-card-text>
<v-card-actions class="justify-center">
<v-btn
class="error white--text elevation-0 px-4 mx-2"
@click="DeleteTrackers"
>
Delete
</v-btn>
<v-dialog
v-model="trackerDialog"
content-class="rounded-form"
persistent
max-width="290"
>
<v-btn class="error white--text elevation-0 px-4 mx-2" @click="DeleteTrackers"> Delete </v-btn>
<v-dialog v-model="trackerDialog" content-class="rounded-form" persistent max-width="290">
<template #activator="{ on, attrs }">
<v-btn
class="accent white--text elevation-0 px-4 mx-2"
v-bind="attrs"
v-on="on"
>
Add
</v-btn>
<v-btn class="accent white--text elevation-0 px-4 mx-2" v-bind="attrs" v-on="on"> Add </v-btn>
</template>
<v-card>
<v-card-title class="justify-center">
<h3>Add Trackers</h3>
</v-card-title>
<v-card-text>
<v-textarea
v-model="newTrackers"
label="Trackers"
rows="1"
required
autofocus
auto-grow
clearable
hint="One link per line"
/>
<v-textarea v-model="newTrackers" label="Trackers" rows="1" required autofocus auto-grow clearable hint="One link per line" />
</v-card-text>
<v-card-actions>
<v-spacer />
<v-btn color="red darken-1" text @click="closeAddTrackers">
Cancel
</v-btn>
<v-btn color="green darken-1" text @click="addTrackers">
Add
</v-btn>
<v-btn color="red darken-1" text @click="closeAddTrackers"> Cancel </v-btn>
<v-btn color="green darken-1" text @click="addTrackers"> Add </v-btn>
</v-card-actions>
</v-card>
</v-dialog>
@ -98,13 +52,7 @@ export default {
name: 'Trackers',
filters: {
formatTrackerStatus(status) {
const map = [
'Disabled',
'Not contacted',
'Working',
'Updating',
'Not working'
]
const map = ['Disabled', 'Not contacted', 'Working', 'Updating', 'Not working']
return map[status]
},
@ -126,7 +74,10 @@ export default {
}),
computed: {
trackers() {
return this.tempTrackers.map(x => ({ ...x, isSelectable: typeof x.tier === 'number' }))
return this.tempTrackers.map(x => ({
...x,
isSelectable: typeof x.tier === 'number'
}))
},
headers() {
return [
@ -135,8 +86,14 @@ export default {
{ text: this.$i18n.t('modals.detail.pageTrackers.status'), value: 'status' },
{ text: this.$i18n.t('modals.detail.pageTrackers.peers'), value: 'num_peers' },
{ text: this.$i18n.t('modals.detail.pageTrackers.seeds'), value: 'num_seeds' },
{ text: this.$i18n.t('modals.detail.pageTrackers.leeches'), value: 'num_leeches' },
{ text: this.$i18n.t('modals.detail.pageTrackers.downloaded'), value: 'num_downloaded' },
{
text: this.$i18n.t('modals.detail.pageTrackers.leeches'),
value: 'num_leeches'
},
{
text: this.$i18n.t('modals.detail.pageTrackers.downloaded'),
value: 'num_downloaded'
},
{ text: this.$i18n.t('modals.detail.pageTrackers.message'), value: 'msg' }
]
}
@ -169,8 +126,11 @@ export default {
this.trackerDialog = false
},
async DeleteTrackers() {
if (!this.selectedTrackers.length) return
qbit.removeTorrentTrackers(this.hash, this.selectedTrackers.map(t => t.url))
if (!this.selectedTrackers.length) return
qbit.removeTorrentTrackers(
this.hash,
this.selectedTrackers.map(t => t.url)
)
this.selectedTrackers = []
await this.getTorrentTrackers()
}
@ -179,7 +139,7 @@ export default {
</script>
<style lang="scss" scoped>
@import "~@/styles/colors.scss";
@import '@/styles/colors.scss';
:deep(.v-data-table thead th),
:deep(.v-data-table tbody td) {
@ -200,4 +160,3 @@ export default {
white-space: nowrap;
}
</style>

View file

@ -1,7 +1,7 @@
import Content from './Content'
import Info from './Info'
import Peers from './Peers'
import Trackers from './Trackers'
import TagsAndCategories from './TorrentTagsAndCategories'
import Content from './Content.vue'
import Info from './Info.vue'
import Peers from './DetailPeers.vue'
import Trackers from './Trackers.vue'
import TagsAndCategories from './TorrentTagsAndCategories.vue'
export { Content, Info, Peers, Trackers, TagsAndCategories }

View file

@ -108,11 +108,11 @@ export function getDataValue(a, b) {
Vue.filter('getDataValue', getDataValue)
export function titleCase(str) {
if (!str) return
return str.split(' ')
return str
.split(' ')
.map(w => w[0].toUpperCase() + w.substr(1).toLowerCase())
.join(' ')
}
@ -130,4 +130,4 @@ export function limitToValue(value) {
return value
}
Vue.filter('limitToValue', limitToValue)
Vue.filter('limitToValue', limitToValue)

View file

@ -5,15 +5,11 @@ export function formatBytes(a, b) {
const d = b || 2
const e = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
const f = Math.floor(Math.log(a) / Math.log(c))
return `${parseFloat((a / Math.pow(c, f)).toFixed(d))} ${e[f]}`
}
import {
mdiLanguageHtml5, mdiFileDocumentOutline,
mdiNodejs, mdiFilePdf, mdiFileExcel,
mdiCodeJson, mdiFileImage, mdiMovie,
mdiLanguageMarkdown, mdiFile } from '@mdi/js'
import { mdiLanguageHtml5, mdiFileDocumentOutline, mdiNodejs, mdiFilePdf, mdiFileExcel, mdiCodeJson, mdiFileImage, mdiMovie, mdiLanguageMarkdown, mdiFile } from '@mdi/js'
export function getIconForFileType(type) {
const types = {
@ -43,12 +39,10 @@ export function codeToFlag(code) {
const magicNumber = 0x1f1a5
// eslint-disable-next-line
code = code.toUpperCase()
code = code.toUpperCase()
const codePoints = [...code].map(c => magicNumber + c.charCodeAt(0))
const char = String.fromCodePoint(...codePoints)
const url =
'https://cdn.jsdelivr.net/npm/twemoji/2/svg/' +
`${codePoints[0].toString(16)}-${codePoints[1].toString(16)}.svg`
const url = 'https://cdn.jsdelivr.net/npm/twemoji/2/svg/' + `${codePoints[0].toString(16)}-${codePoints[1].toString(16)}.svg`
return {
char,
@ -78,10 +72,10 @@ export function treeify(paths) {
if (el.children.length !== 0) {
const folder = createFolder(el.name, el.children)
folder.children = folder.children.map(el => parseFolder(el))
return folder
}
return el
}
@ -112,17 +106,16 @@ function createFolder(name, children) {
export function getHostName(url) {
const match = url.match(/:\/\/(www[0-9]?\.)?(.[^/:]+)/i)
if (match != null &&
match.length > 2 &&
typeof match[2] === 'string' &&
match[2].length > 0) {
if (match != null && match.length > 2 && typeof match[2] === 'string' && match[2].length > 0) {
return match[2]
} else {
return ''
}
}
const urlRegExp = new RegExp(/(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/gi)
const urlRegExp = new RegExp(
/(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/gi
)
export function splitByUrl(string) {
const urls = string.match(urlRegExp)
@ -154,4 +147,20 @@ export function splitByUrl(string) {
export function stringContainsUrl(string) {
return urlRegExp.test(string)
}
}
export function getVersion() {
if (process.env.NODE_ENV === 'production') {
return 'import.meta.env.VITE_PACKAGE_VERSION'
}
return import.meta.env['VITE_PACKAGE_VERSION']
}
export function getBaseURL() {
if (process.env.NODE_ENV === 'production') {
return 'import.meta.env.BASE_URL'
}
return import.meta.env['BASE_URL']
}

View file

@ -120,7 +120,7 @@ const locale = {
speedGraph: 'Afficher le graphique de vitesse',
sessionStats: 'Afficher les statistiques de la session',
allTimeStats: 'Afficher les statistiques de tous les temps',
freeSpace: 'Afficher l\'espace libre',
freeSpace: "Afficher l'espace libre",
trackerFilter: 'Afficher le filtre de Tracker',
rightDrawer: 'Menu à droite',
language: 'Langue:',
@ -135,15 +135,15 @@ const locale = {
}
},
pageDownloads: {
subHeaderWhenAddTorrent: 'Lors de l\'ajout d\'un torrent',
subHeaderWhenAddTorrent: "Lors de l'ajout d'un torrent",
whenAddTorrent: {
createSubFolder: 'Créer un sous-dossier pour les torrents avec plusieurs fichiers',
donotAutoStart: 'Ne pas lancer le téléchargement automatiquement'
},
subHeaderPublicSettings: 'Paramètres publics',
publicSettings: {
preAllocateDisk: 'Pré-allouer de l\'espace disque pour tous les fichiers',
appendQBExtension: 'Ajouter l\'extension .!qB aux fichiers incomplets'
preAllocateDisk: "Pré-allouer de l'espace disque pour tous les fichiers",
appendQBExtension: "Ajouter l'extension .!qB aux fichiers incomplets"
},
subHeaderSaveManagement: 'Saving Management',
saveManagement: {
@ -152,12 +152,12 @@ const locale = {
defaultSavePath: 'Chemin de sauvegarde par défaut',
keepIncompleteIn: 'Gardez les torrents incomplets dans :',
autoEnabled: 'Autorun activé:',
autorunProgram: 'Programme d\'exécution automatique',
autorunProgram: "Programme d'exécution automatique",
supportParamTitle: 'Paramètres pris en charge (sensibles à la casse):',
supportParamN: '%N: Nom du torrent ',
supportParamL: '%L: Catégorie',
supportParamG: '%G: Tags (séparés par une virgule)',
supportParamF: '%F: Chemin d\'accès au contenu (identique au chemin d\'accès racine pour les torrents multi-fichiers)',
supportParamF: "%F: Chemin d'accès au contenu (identique au chemin d'accès racine pour les torrents multi-fichiers)",
supportParamR: '%R: Chemin racine (chemin du premier sous-répertoire de torrent)',
supportParamD: '%D: Chemin de sauvegarde',
supportParamC: '%C: Nombre de fichiers',
@ -176,17 +176,17 @@ const locale = {
pageBittorrent: {
subHeaderPrivacy: 'Vie privée',
enableDHT: 'Permettre au DHT (réseau décentralisé) de trouver plus de peers.',
enablePeX: 'Activez l\'échange de peers (PeX) pour trouver d\'autres peers.',
enablePeX: "Activez l'échange de peers (PeX) pour trouver d'autres peers.",
enableLPD: 'Activez la découverte de peers locaux pour trouver plus de peers.',
enableAnonymous: 'Activer le mode anonyme',
torrentQueue: 'Mise en file d\'attente des torrents',
torrentQueue: "Mise en file d'attente des torrents",
maxActiveDownload: 'Téléchargements actifs maximums',
maxActiveUpload: 'Chargements actifs maximums',
maxActiveTorrent: 'Maximum de torrents actifs',
excludeSlowTorrent: 'Ne pas compter les torrents lents dans ces limites.',
downloadRateLimit: 'Seuil du taux de téléchargement KiB/s',
uploadRateLimit: 'Seuil du débit de chargement KiB/s',
torrentInactivityTimer: 'Délai d\'inactivité du torrent',
torrentInactivityTimer: "Délai d'inactivité du torrent",
subHeaderSeedLimits: 'Seed Limites',
whenRatioReaches: 'Lorsque le ratio atteint',
whenSeedingTimeReaches: 'Lorsque le temps de seeding atteint'
@ -198,13 +198,13 @@ const locale = {
ipAddress: 'Adresse IP:',
port: 'Port',
authentication: 'Authentification',
username: 'Nom d\'utilisateur :',
username: "Nom d'utilisateur :",
password: 'mot de passe',
maxAttempts: 'Tentatives maximales',
banDuration: 'Durée de ban (secondes)',
sessionTimeout: 'Délai d\'expiration de la session (secondes)',
bypassAuthenticationForClientsOnLocalhost: 'Contourner l\'authentification pour les clients sur localhost',
bypassAuthenticationForClientsInWhitelisted: 'Contournement de l\'authentification pour les clients dans les sous-réseaux IP de la liste blanche.',
sessionTimeout: "Délai d'expiration de la session (secondes)",
bypassAuthenticationForClientsOnLocalhost: "Contourner l'authentification pour les clients sur localhost",
bypassAuthenticationForClientsInWhitelisted: "Contournement de l'authentification pour les clients dans les sous-réseaux IP de la liste blanche.",
whiteListExample: 'Exemple: 172.17.32.0/24, fdff:ffff:c8::/40'
},
pageTagsAndCategories: {
@ -224,11 +224,11 @@ const locale = {
},
newCategory: {
categoryName: 'Nom de la catégorie',
Path: 'Chemin d\'accès',
Path: "Chemin d'accès",
tipOnNoName: 'Le nom de la catégorie est obligatoire',
tipOnNameTooLong: 'Le nom de la catégorie doit comporter moins de 15 caractères',
tipOnNoPath: 'Le chemin d\'accès est requis',
TipOnPathTooLong: 'Le chemin d\'accès doit comporter moins de 40 caractères'
tipOnNoPath: "Le chemin d'accès est requis",
TipOnPathTooLong: "Le chemin d'accès doit comporter moins de 40 caractères"
},
newTag: {
createNewTag: 'Créer un nouveau tag',
@ -247,7 +247,7 @@ const locale = {
hash: 'hash',
ratio: 'Ratio',
downloadSpeed: 'Vitesse de DL',
uploadSpeed: 'Vitesse d\'UP',
uploadSpeed: "Vitesse d'UP",
eta: 'ETA',
peers: 'Peers',
seeds: 'Seeds',
@ -260,7 +260,7 @@ const locale = {
shareRatioLimit: 'Share Ratio Limit',
shareTimeLimit: 'Limite de temps de partage (minutes)',
downloadLimit: 'Limite de téléchargement',
uploadLimit: 'Limite d\'envoi'
uploadLimit: "Limite d'envoi"
},
pagePeers: {
ip: 'IP',
@ -270,7 +270,7 @@ const locale = {
progress: 'Progrès',
downloadSpeed: 'Vitesse de DL',
downloaded: 'Téléchargé',
upSpeed: 'Vitesse d\'UP',
upSpeed: "Vitesse d'UP",
uploaded: 'Uploaded',
relevance: 'Pertinence',
files: 'Fichiers'
@ -302,7 +302,7 @@ const locale = {
oneOrMoreFilesInvalidTorrent: 'Un ou plusieurs fichiers ne sont pas des torrents valides.'
},
changeLocation: {
title: 'Changement d\'emplacement',
title: "Changement d'emplacement",
torrentName: 'Nom du torrent'
},
rename: {
@ -329,7 +329,7 @@ const locale = {
addedOn: 'Ajouté le',
downloadSpeed: 'Vitesse de téléchargement',
timeActive: 'Temps actif',
uploadSpeed: 'Vitesse d\'upload'
uploadSpeed: "Vitesse d'upload"
}
},
speedLimit: {

View file

@ -1,48 +0,0 @@
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import messages from '@/lang/en'
import axios from 'axios'
Vue.use(VueI18n)
export const i18n = new VueI18n({
locale: 'en', // set locale
fallbackLocale: 'en',
messages: {
en: messages
}
})
const loadedLanguages = ['en'] // our default language that is preloaded
export const availableLanguages = ['en', 'es', 'fr', 'id', 'it', 'ja', 'nl', 'pt-br', 'ru', 'ua', 'vi', 'zh-hans', 'zh-hant']
function setI18nLanguage(lang) {
i18n.locale = lang
axios.defaults.headers.common['Accept-Language'] = lang
document.querySelector('html').setAttribute('lang', lang)
return lang
}
export function loadLanguageAsync(lang) {
// If the same language
if (i18n.locale === lang) {
return Promise.resolve(setI18nLanguage(lang))
}
// If the language was already loaded
if (loadedLanguages.includes(lang)) {
return Promise.resolve(setI18nLanguage(lang))
}
// If the language hasn't been loaded yet
return import(/* webpackChunkName: "lang-[request]" */ `./${lang}.js`).then(
messages => {
i18n.setLocaleMessage(lang, messages.default)
loadedLanguages.push(lang)
return setI18nLanguage(lang)
}
)
}

15
src/lang/index.ts Normal file
View file

@ -0,0 +1,15 @@
import en from './en'
import es from './es'
import fr from './fr'
import id from './id'
import it from './it'
import ja from './ja'
import nl from './nl'
import pt_br from './pt-br'
import ru from './ru'
import ua from './ua'
import vi from './vi'
import zh_hans from './zh-hans'
import zh_hant from './zh-hant'
export const messages = { en, es, fr, id, it, ja, nl, pt_br, ru, ua, vi, zh_hans, zh_hant }

View file

@ -8,7 +8,6 @@ const locale = {
cancel: 'annuleren',
confirm: 'bevestig',
/** Torrent */
torrent: {
title: 'titel',

View file

@ -37,7 +37,7 @@ const locale = {
seeds: 'Сіди',
tags: 'Теги',
share: 'Поділитися',
name: 'Ім\'я',
name: "Ім'я",
hash: 'Хеш',
magnet: 'Магнет',
@ -54,7 +54,7 @@ const locale = {
created: 'Створено',
comments: 'примітки',
uploadedSession: 'Завантажено за сесію',
torrentTitle: 'Ім\'я'
torrentTitle: "Ім'я"
},
/** Navbar */
navbar: {
@ -92,7 +92,7 @@ const locale = {
btnStartSearch: 'Пошук',
btnStopSearch: 'Стоп',
columnTitle: {
name: 'Ім\'я',
name: "Ім'я",
size: 'Розмір',
seeds: 'Сіди',
peers: 'Піри',
@ -104,7 +104,7 @@ const locale = {
tabName: {
VueTorrent: 'Vuetorrent',
downloads: 'Завантаження',
connection: 'Зв\'язок',
connection: "Зв'язок",
bittorrent: 'Bittorrent',
webUI: 'Bеб-інтерфейс',
tagsAndCategories: 'Теги та категорії'
@ -147,7 +147,6 @@ const locale = {
},
subHeaderSaveManagement: 'Управління збереженням',
saveManagement: {
autoManagement: 'Автоматичне керування торрентами',
relocate: 'Переміщення торенту при зміні категорії',
defaultSavePath: 'Шлях збереження за замовчуванням',
@ -169,8 +168,8 @@ const locale = {
},
pageConnection: {
subHeader: 'Обмеження підключення',
globalMaxConnection: 'Глобальна максимальна кількість з\'єднань',
perTorrentMaxConnection: 'Максимальна кількість з\'єднань на торрент',
globalMaxConnection: "Глобальна максимальна кількість з'єднань",
perTorrentMaxConnection: "Максимальна кількість з'єднань на торрент",
globalMaxUploadSlots: 'Глобальна максимальна кількість слотів для завантаження',
perTorrentMaxUploadSlots: 'Максимальна кількість слотів для завантаження на торрент'
},
@ -199,7 +198,7 @@ const locale = {
ipAddress: 'IP-адреса:',
port: 'Порт',
authentication: 'Аутентифікація',
username: 'Ім\'я користувача',
username: "Ім'я користувача",
password: 'пароль',
maxAttempts: 'Максимальна кількість спроб',
banDuration: 'Тривалість бану (секунди)',
@ -318,7 +317,7 @@ const locale = {
completed: 'Завершено',
downloaded: 'Завантажено',
ETA: 'ОЧЗ',
name: 'Ім\'я',
name: "Ім'я",
peers: 'Піри',
priority: 'Пріоритет',
progress: 'Прогрес',

View file

@ -39,7 +39,7 @@ const locale = {
share: '分享',
name: '名稱',
hash: '雜湊值',
magnet: '磁力連結',
magnet: '磁力連結',
feed: '訂閱源',
rule: '規則',
then: '然後',
@ -212,7 +212,7 @@ const locale = {
maxRatioPauseTorrent: '暫停種子',
maxRatioRemoveTorrent: '移除種子',
maxRatioRemoveTorrentAndFiles: '移除種子與其檔案',
maxRatioTorrentSuperseeding: '為種子啟用超級做種'
maxRatioTorrentSuperseeding: '為種子啟用超級做種'
},
pageRss: {
tabName: {
@ -410,7 +410,7 @@ const locale = {
forceReannounce: '強制重新發佈',
sequentialDownload: '順序下載',
firstLastPriority: '首末優先',
automaticTorrentManagement: '自動種子管理 (ATM)'
automaticTorrentManagement: '自動種子管理 (ATM)'
},
prio: {
prio: '設置優先級',

View file

@ -1,37 +1,18 @@
import Vue from 'vue'
import App from '@/App.vue'
import '@/registerServiceWorker'
import router from '@/router'
import store from '@/store'
import vuetify from './plugins/vuetify'
import 'typeface-roboto'
import 'typeface-roboto-mono'
import { i18n } from './lang/index'
/* eslint-disable no-unused-vars */
import filters from '@/filters'
import styles from '@/styles/styles.scss'
/* eslint-enable no-unused-vars */
import '@/filters.js'
import '@/styles/styles.scss'
import Toast, { POSITION } from 'vue-toastification'
import 'vue-toastification/dist/index.css'
Vue.use(Toast, {
maxToasts: 5,
timeout: 2000,
position: POSITION.BOTTOM_RIGHT
})
import './registerServiceWorker'
Vue.config.productionTip = false
// register modals
const files = require.context('@/components/Modals', true, /\.vue$/i)
files
.keys()
.map(key =>
Vue.component(key.split('/').pop().split('.')[0], files(key).default)
)
import vuetify from './plugins/vuetify'
import i18n from './plugins/i18n'
import { toast, config } from './plugins/toast'
Vue.use(toast, config)
import './plugins/components'
new Vue({
router,

View file

@ -14,21 +14,23 @@ export default {
},
set(val) {
this.hndlDialog = val
if (!val)
this.deleteModal()
if (!val) this.deleteModal()
}
}
},
methods: {
deleteModal() {
//this.hndlDialog = false
setTimeout(function () {
this.$store.commit('DELETE_MODAL', this.guid)
}.bind(this), 300)
setTimeout(
function () {
this.$store.commit('DELETE_MODAL', this.guid)
}.bind(this),
300
)
}
},
beforeDestroy() {
this.deleteModal()
}
}
}

View file

@ -6,11 +6,4 @@ import General from './General'
import TorrentSelect from './TorrentSelect'
import TorrentDashboardItem from './TorrentDashboardItem'
export { FullScreenModal,
Modal,
SettingsTab,
Tab,
General,
TorrentSelect,
TorrentDashboardItem
}
export { FullScreenModal, Modal, SettingsTab, Tab, General, TorrentSelect, TorrentDashboardItem }

Some files were not shown because too many files have changed in this diff Show more