mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-04-18 21:55:12 -04:00
Compare commits
158 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c83c818380 | |||
| a2df38b1ca | |||
| 89510c4a65 | |||
| b5a2f68bde | |||
| 1ffab661da | |||
| bf0a627a4e | |||
| df764ce8b4 | |||
| a61d4ab88c | |||
| 01e7e924c4 | |||
| 5f5df99dab | |||
| 77e40e8e53 | |||
| d3853c1a54 | |||
| 02ecc04526 | |||
| 2e103d6dba | |||
| 9b9d2f2798 | |||
| b80bfaeff0 | |||
| 80b6821e46 | |||
| dbf81a7c9e | |||
| cb2e5953d5 | |||
| f5d6fa9138 | |||
| 7ce5df63d4 | |||
| 10aa3e43a2 | |||
| 387f8df0ff | |||
| d61ce3f27c | |||
| eff8fdebf5 | |||
| 01fe990417 | |||
| 60f37de6af | |||
| cda373f195 | |||
| 510ccf4bce | |||
| 0fd411a37f | |||
| cd7c73bad3 | |||
| 44f12d9569 | |||
| 51f8b1b5c4 | |||
| 8bce43ac29 | |||
| 884aecf846 | |||
| 1183a0386d | |||
| 5979c5f8fe | |||
| 25bb5b6427 | |||
| 4d021fe8dc | |||
| 520d82ed20 | |||
| f19a81990b | |||
| 03cde56333 | |||
| 19862cda6c | |||
| 230a0e5aa0 | |||
| 4273f2d6f3 | |||
| a4c92fc629 | |||
| ce901ae8a3 | |||
| 5d32bcf8b9 | |||
| f69f96695b | |||
| 77fa113d77 | |||
| b8a42a7998 | |||
| a3fd37b27e | |||
| 29dcbadfca | |||
| d8c9225d09 | |||
| 17008ace5c | |||
| 470b751f44 | |||
| a31971472d | |||
| 4c4614cfab | |||
| f5cb81951a | |||
| c35e257a82 | |||
| cb7cbb74e0 | |||
| c263c6f365 | |||
| 701c7d349a | |||
| 4a8131e00f | |||
| 39fd9bea89 | |||
| 89a1b0f534 | |||
| 1aa9149866 | |||
| eccd72304c | |||
| 0fb19160f4 | |||
| 3e4ac89a4c | |||
| 9331d8e013 | |||
| e94c8839f6 | |||
| 1abd14ee86 | |||
| 6200c9e496 | |||
| 2c0c6aa158 | |||
| 93deb56e8e | |||
| 971c755738 | |||
| 51df1be144 | |||
| 11fad915d5 | |||
| 49793a3af0 | |||
| 87d6cbd813 | |||
| 5ca8148d3b | |||
| 8ebec7c7e1 | |||
| 61cff12206 | |||
| 22412981bb | |||
| 8e43ea4bbc | |||
| f38d6c5b42 | |||
| 2054dcc127 | |||
| 8d856b2edb | |||
| e07ad14e83 | |||
| d585ab5677 | |||
| 6a6697c2c2 | |||
| e859bedef1 | |||
| e688dac040 | |||
| b309582d91 | |||
| 998e214171 | |||
| 8b0760296a | |||
| 44aad1b943 | |||
| 9ec8990a21 | |||
| 8ac721a30b | |||
| 3bbadb516d | |||
| f5f0dd6fae | |||
| 0cfb7da411 | |||
| b65f4205fc | |||
| 3e243eafdd | |||
| 327fd08059 | |||
| 827741db17 | |||
| c21e323992 | |||
| e49d03ab7b | |||
| 4347e1cf7a | |||
| d7e1043b79 | |||
| d4bdb73b7c | |||
| eeebf3ecf0 | |||
| 76d73aa6a9 | |||
| 5dfe530cf3 | |||
| 8b8b5ba1c8 | |||
| c5caf22375 | |||
| 293b32ea0e | |||
| 25bb10d62b | |||
| 9eba50d9db | |||
| 234995cbaf | |||
| 918071903b | |||
| dcfa3ad48e | |||
| 5dd6cde61a | |||
| d18ddcaa50 | |||
| 0cca9525a1 | |||
| 3455f3c92a | |||
| af03c17892 | |||
| 6b39fa5ce6 | |||
| 1ee79f16fc | |||
| e73f2466cc | |||
| 2e56b7681e | |||
| 87650c83c6 | |||
| 34a09af01e | |||
| 5a3d429d52 | |||
| 40c49bce9b | |||
| 063083a1f1 | |||
| dbbc913809 | |||
| f0f2c88c4a | |||
| 1bfcb99f31 | |||
| 4ea0e6c016 | |||
| 1de845c8f5 | |||
| f3a33cf817 | |||
| 593a0e9658 | |||
| a854ce6f4e | |||
| 043b1a0e46 | |||
| 4c7c7e8a62 | |||
| 89a4c03dd2 | |||
| baed2960b6 | |||
| e4ef1c3af0 | |||
| b4f8fb733f | |||
| 1a6ea21b9f | |||
| 16834e0f24 | |||
| 658724b315 | |||
| a2c8cec27e | |||
| 3c9fbeabaa | |||
| 04e84f3a90 | |||
| 77a76fe5a1 |
+1
-1
@@ -260,7 +260,7 @@ dotnet_diagnostic.CA5392.severity = suggestion
|
|||||||
dotnet_diagnostic.CA5394.severity = suggestion
|
dotnet_diagnostic.CA5394.severity = suggestion
|
||||||
dotnet_diagnostic.CA5397.severity = suggestion
|
dotnet_diagnostic.CA5397.severity = suggestion
|
||||||
|
|
||||||
|
dotnet_diagnostic.SYSLIB0014.severity = none
|
||||||
|
|
||||||
[*.{js,html,js,hbs,less,css}]
|
[*.{js,html,js,hbs,less,css}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
name: Bug Report
|
name: Bug Report
|
||||||
title: "[BUG]: "
|
|
||||||
description: 'Report a new bug, if you are not 100% certain this is a bug please go to our Reddit or Discord first'
|
description: 'Report a new bug, if you are not 100% certain this is a bug please go to our Reddit or Discord first'
|
||||||
labels: ['Type: Bug', 'Status: Needs Triage']
|
labels: ['Type: Bug', 'Status: Needs Triage']
|
||||||
body:
|
body:
|
||||||
@@ -64,11 +63,11 @@ body:
|
|||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
label: Anything else?
|
label: Trace Logs?
|
||||||
description: |
|
description: |
|
||||||
Trace Logs (https://wiki.servarr.com/prowlarr/troubleshooting#logging-and-log-files)
|
Trace Logs (https://wiki.servarr.com/prowlarr/troubleshooting#logging-and-log-files)
|
||||||
Links? References? Anything that will give us more context about the issue you are encountering!
|
***Generally speaking, all bug reports must have trace logs provided.***
|
||||||
|
|
||||||
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
|
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
|
||||||
|
Additionally, any additional info? Screenshots? References? Anything that will give us more context about the issue you are encountering!
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
name: Feature Request
|
name: Feature Request
|
||||||
title: "[FEAT]: "
|
|
||||||
description: 'Suggest an idea for Prowlarr'
|
description: 'Suggest an idea for Prowlarr'
|
||||||
labels: ['Type: Feature Request', 'Status: Needs Triage']
|
labels: ['Type: Feature Request', 'Status: Needs Triage']
|
||||||
body:
|
body:
|
||||||
|
|||||||
+6
-48
@@ -1,55 +1,13 @@
|
|||||||
# How to Contribute #
|
# How to Contribute
|
||||||
|
|
||||||
We're always looking for people to help make Prowlarr even better, there are a number of ways to contribute.
|
We're always looking for people to help make Prowlarr even better, there are a number of ways to contribute.
|
||||||
|
|
||||||
This file is updated on an ad-hoc basis, for the latest details please see the [contributing wiki page](https://wiki.servarr.com/prowlarr/contributing).
|
This file has been moved to the wiki for the latest details please see the [contributing wiki page](https://wiki.servarr.com/prowlarr/contributing).
|
||||||
|
|
||||||
## Documentation ##
|
## Documentation
|
||||||
Setup guides, FAQ, the more information we have on the [wiki](https://wiki.servarr.com/prowlarr) the better.
|
|
||||||
|
|
||||||
## Development ##
|
Setup guides, [FAQ](https://wiki.servarr.com/prowlarr/faq), the more information we have on the [wiki](https://wiki.servarr.com/prowlarr) the better.
|
||||||
|
|
||||||
### Tools required ###
|
## Development
|
||||||
- Visual Studio 2019 or higher (https://www.visualstudio.com/vs/). The community version is free and works (https://www.visualstudio.com/downloads/).
|
|
||||||
- HTML/Javascript editor of choice (VS Code/Sublime Text/Webstorm/Atom/etc)
|
|
||||||
- [Git](https://git-scm.com/downloads)
|
|
||||||
- [NodeJS](https://nodejs.org/en/download/) (Node 12.X.X or higher)
|
|
||||||
- [Yarn](https://yarnpkg.com/)
|
|
||||||
- .NET Core 5.0.
|
|
||||||
|
|
||||||
### Getting started ###
|
See the [Wiki Page](https://wiki.servarr.com/prowlarr/contributing)
|
||||||
|
|
||||||
1. Fork Prowlarr
|
|
||||||
2. Clone the repository into your development machine. [*info*](https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/cloning-a-repository-from-github)
|
|
||||||
3. Install the required Node Packages `yarn install`
|
|
||||||
4. Start gulp to monitor your dev environment for any changes that need post processing using `yarn start` command.
|
|
||||||
5. Build the project in Visual Studio, Setting startup project to `Prowlarr.Console` and framework to `net5.0`
|
|
||||||
6. Debug the project in Visual Studio
|
|
||||||
7. Open http://localhost:9696
|
|
||||||
|
|
||||||
### Contributing Code ###
|
|
||||||
- If you're adding a new, already requested feature, please comment on [Github Issues](https://github.com/Prowlarr/Prowlarr/issues "Github Issues") so work is not duplicated (If you want to add something not already on there, please talk to us first)
|
|
||||||
- Rebase from Prowlarr's develop branch, don't merge
|
|
||||||
- Make meaningful commits, or squash them
|
|
||||||
- Feel free to make a pull request before work is complete, this will let us see where its at and make comments/suggest improvements
|
|
||||||
- Reach out to us on the discord if you have any questions
|
|
||||||
- Add tests (unit/integration)
|
|
||||||
- Commit with *nix line endings for consistency (We checkout Windows and commit *nix)
|
|
||||||
- One feature/bug fix per pull request to keep things clean and easy to understand
|
|
||||||
- Use 4 spaces instead of tabs, this is the default for VS 2019 and WebStorm (to my knowledge)
|
|
||||||
|
|
||||||
### Contributing Indexers ###
|
|
||||||
- If you're contributing an indexer please phrase your commit as something like: `New: (Indexer) {Indexer Name}`, `New: (Indexer) {Usenet|Torrent} {Indexer Name}`, `New: (Indexer) {Torznab|Newznab} {Indexer Name}`
|
|
||||||
- If you're updating an indexer please phrase your commit as something like: `Fixed: (Indexer) {Indexer Name} {changes}` e.g. `Fixed: (Indexer) Changed BHD to use API`
|
|
||||||
|
|
||||||
### Pull Requesting ###
|
|
||||||
- Only make pull requests to develop, never master, if you make a PR to master we'll comment on it and close it
|
|
||||||
- You're probably going to get some comments or questions from us, they will be to ensure consistency and maintainability
|
|
||||||
- We'll try to respond to pull requests as soon as possible, if its been a day or two, please reach out to us, we may have missed it
|
|
||||||
- Each PR should come from its own [feature branch](http://martinfowler.com/bliki/FeatureBranch.html) not develop in your fork, it should have a meaningful branch name (what is being added/fixed)
|
|
||||||
- new-feature (Good)
|
|
||||||
- fix-bug (Good)
|
|
||||||
- patch (Bad)
|
|
||||||
- develop (Bad)
|
|
||||||
|
|
||||||
If you have any questions about any of this, please let us know.
|
|
||||||
|
|||||||
+53
-32
@@ -7,13 +7,13 @@ variables:
|
|||||||
outputFolder: './_output'
|
outputFolder: './_output'
|
||||||
artifactsFolder: './_artifacts'
|
artifactsFolder: './_artifacts'
|
||||||
testsFolder: './_tests'
|
testsFolder: './_tests'
|
||||||
majorVersion: '0.1.1'
|
majorVersion: '0.1.6'
|
||||||
minorVersion: $[counter('minorVersion', 1)]
|
minorVersion: $[counter('minorVersion', 1)]
|
||||||
prowlarrVersion: '$(majorVersion).$(minorVersion)'
|
prowlarrVersion: '$(majorVersion).$(minorVersion)'
|
||||||
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
|
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
|
||||||
sentryOrg: 'servarr'
|
sentryOrg: 'servarr'
|
||||||
sentryUrl: 'https://sentry.servarr.com'
|
sentryUrl: 'https://sentry.servarr.com'
|
||||||
dotnetVersion: '5.0.400'
|
dotnetVersion: '6.0.100'
|
||||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
@@ -67,7 +67,7 @@ stages:
|
|||||||
enableAnalysis: 'true'
|
enableAnalysis: 'true'
|
||||||
Mac:
|
Mac:
|
||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
imageName: 'macos-10.14'
|
imageName: 'macos-10.15'
|
||||||
enableAnalysis: 'false'
|
enableAnalysis: 'false'
|
||||||
Windows:
|
Windows:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
@@ -111,23 +111,23 @@ stages:
|
|||||||
artifact: '$(osName)Backend'
|
artifact: '$(osName)Backend'
|
||||||
displayName: Publish Backend
|
displayName: Publish Backend
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net5.0/win-x64/publish'
|
- publish: '$(testsFolder)/net6.0/win-x64/publish'
|
||||||
artifact: WindowsCoreTests
|
artifact: WindowsCoreTests
|
||||||
displayName: Publish Windows Test Package
|
displayName: Publish Windows Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net5.0/linux-x64/publish'
|
- publish: '$(testsFolder)/net6.0/linux-x64/publish'
|
||||||
artifact: LinuxCoreTests
|
artifact: LinuxCoreTests
|
||||||
displayName: Publish Linux Test Package
|
displayName: Publish Linux Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net5.0/linux-musl-x64/publish'
|
- publish: '$(testsFolder)/net6.0/linux-musl-x64/publish'
|
||||||
artifact: LinuxMuslCoreTests
|
artifact: LinuxMuslCoreTests
|
||||||
displayName: Publish Linux Musl Test Package
|
displayName: Publish Linux Musl Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net5.0/freebsd-x64/publish'
|
- publish: '$(testsFolder)/net6.0/freebsd-x64/publish'
|
||||||
artifact: FreebsdCoreTests
|
artifact: FreebsdCoreTests
|
||||||
displayName: Publish FreeBSD Test Package
|
displayName: Publish FreeBSD Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net5.0/osx-x64/publish'
|
- publish: '$(testsFolder)/net6.0/osx-x64/publish'
|
||||||
artifact: MacCoreTests
|
artifact: MacCoreTests
|
||||||
displayName: Publish MacOS Test Package
|
displayName: Publish MacOS Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
@@ -144,7 +144,7 @@ stages:
|
|||||||
imageName: 'ubuntu-18.04'
|
imageName: 'ubuntu-18.04'
|
||||||
Mac:
|
Mac:
|
||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
imageName: 'macos-10.14'
|
imageName: 'macos-10.15'
|
||||||
Windows:
|
Windows:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
imageName: 'windows-2019'
|
imageName: 'windows-2019'
|
||||||
@@ -163,7 +163,6 @@ stages:
|
|||||||
key: 'yarn | "$(osName)" | yarn.lock'
|
key: 'yarn | "$(osName)" | yarn.lock'
|
||||||
restoreKeys: |
|
restoreKeys: |
|
||||||
yarn | "$(osName)"
|
yarn | "$(osName)"
|
||||||
yarn
|
|
||||||
path: $(yarnCacheFolder)
|
path: $(yarnCacheFolder)
|
||||||
displayName: Cache Yarn packages
|
displayName: Cache Yarn packages
|
||||||
- bash: ./build.sh --frontend
|
- bash: ./build.sh --frontend
|
||||||
@@ -203,12 +202,12 @@ stages:
|
|||||||
- bash: ./build.sh --packages
|
- bash: ./build.sh --packages
|
||||||
displayName: Create Packages
|
displayName: Create Packages
|
||||||
- bash: |
|
- bash: |
|
||||||
distribution/windows/setup/inno/ISCC.exe distribution/windows/setup/prowlarr.iss //DFramework=net5.0 //DRuntime=win-x86
|
distribution/windows/setup/inno/ISCC.exe distribution/windows/setup/prowlarr.iss //DFramework=net6.0 //DRuntime=win-x86
|
||||||
cp distribution/windows/setup/output/Prowlarr.*windows.net5.0.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Prowlarr.${BUILDNAME}.windows-core-x86-installer.exe
|
cp distribution/windows/setup/output/Prowlarr.*windows.net6.0.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Prowlarr.${BUILDNAME}.windows-core-x86-installer.exe
|
||||||
displayName: Create x86 .NET Core Windows installer
|
displayName: Create x86 .NET Core Windows installer
|
||||||
- bash: |
|
- bash: |
|
||||||
distribution/windows/setup/inno/ISCC.exe distribution/windows/setup/prowlarr.iss //DFramework=net5.0 //DRuntime=win-x64
|
distribution/windows/setup/inno/ISCC.exe distribution/windows/setup/prowlarr.iss //DFramework=net6.0 //DRuntime=win-x64
|
||||||
cp distribution/windows/setup/output/Prowlarr.*windows.net5.0.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Prowlarr.${BUILDNAME}.windows-core-x64-installer.exe
|
cp distribution/windows/setup/output/Prowlarr.*windows.net6.0.exe ${BUILD_ARTIFACTSTAGINGDIRECTORY}/Prowlarr.${BUILDNAME}.windows-core-x64-installer.exe
|
||||||
displayName: Create x64 .NET Core Windows installer
|
displayName: Create x64 .NET Core Windows installer
|
||||||
- publish: $(Build.ArtifactStagingDirectory)
|
- publish: $(Build.ArtifactStagingDirectory)
|
||||||
artifact: 'WindowsInstaller'
|
artifact: 'WindowsInstaller'
|
||||||
@@ -250,29 +249,44 @@ stages:
|
|||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x64.zip'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x64.zip'
|
||||||
archiveType: 'zip'
|
archiveType: 'zip'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/win-x64/net5.0
|
rootFolderOrFile: $(artifactsFolder)/win-x64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create Windows x86 Core zip
|
displayName: Create Windows x86 Core zip
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x86.zip'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x86.zip'
|
||||||
archiveType: 'zip'
|
archiveType: 'zip'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/win-x86/net5.0
|
rootFolderOrFile: $(artifactsFolder)/win-x86/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create MacOS Core app
|
displayName: Create MacOS x64 Core app
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-x64.zip'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-x64.zip'
|
||||||
archiveType: 'zip'
|
archiveType: 'zip'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/macos-app/net5.0
|
rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create MacOS Core tar
|
displayName: Create MacOS x64 Core tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-core-x64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-core-x64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
tarCompression: 'gz'
|
tarCompression: 'gz'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/macos/net5.0
|
rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0
|
||||||
|
- task: ArchiveFiles@2
|
||||||
|
displayName: Create MacOS arm64 Core app
|
||||||
|
inputs:
|
||||||
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-arm64.zip'
|
||||||
|
archiveType: 'zip'
|
||||||
|
includeRootFolder: false
|
||||||
|
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net6.0
|
||||||
|
- task: ArchiveFiles@2
|
||||||
|
displayName: Create MacOS arm64 Core tar
|
||||||
|
inputs:
|
||||||
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-core-arm64.tar.gz'
|
||||||
|
archiveType: 'tar'
|
||||||
|
tarCompression: 'gz'
|
||||||
|
includeRootFolder: false
|
||||||
|
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create Linux Core tar
|
displayName: Create Linux Core tar
|
||||||
inputs:
|
inputs:
|
||||||
@@ -280,7 +294,7 @@ stages:
|
|||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
tarCompression: 'gz'
|
tarCompression: 'gz'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-x64/net5.0
|
rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create Linux Musl Core tar
|
displayName: Create Linux Musl Core tar
|
||||||
inputs:
|
inputs:
|
||||||
@@ -288,7 +302,7 @@ stages:
|
|||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
tarCompression: 'gz'
|
tarCompression: 'gz'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net5.0
|
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create ARM32 Linux Core tar
|
displayName: Create ARM32 Linux Core tar
|
||||||
inputs:
|
inputs:
|
||||||
@@ -296,7 +310,15 @@ stages:
|
|||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
tarCompression: 'gz'
|
tarCompression: 'gz'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-arm/net5.0
|
rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0
|
||||||
|
- task: ArchiveFiles@2
|
||||||
|
displayName: Create ARM32 Linux Musl Core tar
|
||||||
|
inputs:
|
||||||
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-musl-core-arm.tar.gz'
|
||||||
|
archiveType: 'tar'
|
||||||
|
tarCompression: 'gz'
|
||||||
|
includeRootFolder: false
|
||||||
|
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create ARM64 Linux Core tar
|
displayName: Create ARM64 Linux Core tar
|
||||||
inputs:
|
inputs:
|
||||||
@@ -304,7 +326,7 @@ stages:
|
|||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
tarCompression: 'gz'
|
tarCompression: 'gz'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net5.0
|
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create ARM64 Linux Musl Core tar
|
displayName: Create ARM64 Linux Musl Core tar
|
||||||
inputs:
|
inputs:
|
||||||
@@ -312,7 +334,7 @@ stages:
|
|||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
tarCompression: 'gz'
|
tarCompression: 'gz'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net5.0
|
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create FreeBSD Core Core tar
|
displayName: Create FreeBSD Core Core tar
|
||||||
inputs:
|
inputs:
|
||||||
@@ -320,7 +342,7 @@ stages:
|
|||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
tarCompression: 'gz'
|
tarCompression: 'gz'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net5.0
|
rootFolderOrFile: $(artifactsFolder)/freebsd-x64/net6.0
|
||||||
- publish: $(Build.ArtifactStagingDirectory)
|
- publish: $(Build.ArtifactStagingDirectory)
|
||||||
artifact: 'Packages'
|
artifact: 'Packages'
|
||||||
displayName: Publish Packages
|
displayName: Publish Packages
|
||||||
@@ -383,7 +405,7 @@ stages:
|
|||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
testName: 'MacCore'
|
testName: 'MacCore'
|
||||||
poolName: 'Azure Pipelines'
|
poolName: 'Azure Pipelines'
|
||||||
imageName: 'macos-10.14'
|
imageName: 'macos-10.15'
|
||||||
WindowsCore:
|
WindowsCore:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
testName: 'WindowsCore'
|
testName: 'WindowsCore'
|
||||||
@@ -510,7 +532,7 @@ stages:
|
|||||||
MacCore:
|
MacCore:
|
||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
testName: 'MacCore'
|
testName: 'MacCore'
|
||||||
imageName: 'macos-10.14'
|
imageName: 'macos-10.15'
|
||||||
pattern: 'Prowlarr.*.osx-core-x64.tar.gz'
|
pattern: 'Prowlarr.*.osx-core-x64.tar.gz'
|
||||||
WindowsCore:
|
WindowsCore:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
@@ -686,7 +708,7 @@ stages:
|
|||||||
failBuild: false
|
failBuild: false
|
||||||
Mac:
|
Mac:
|
||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
imageName: 'macos-10.14'
|
imageName: 'macos-10.15'
|
||||||
pattern: 'Prowlarr.*.osx-core-x64.tar.gz'
|
pattern: 'Prowlarr.*.osx-core-x64.tar.gz'
|
||||||
failBuild: false
|
failBuild: false
|
||||||
Windows:
|
Windows:
|
||||||
@@ -793,7 +815,6 @@ stages:
|
|||||||
key: 'yarn | "$(osName)" | yarn.lock'
|
key: 'yarn | "$(osName)" | yarn.lock'
|
||||||
restoreKeys: |
|
restoreKeys: |
|
||||||
yarn | "$(osName)"
|
yarn | "$(osName)"
|
||||||
yarn
|
|
||||||
path: $(yarnCacheFolder)
|
path: $(yarnCacheFolder)
|
||||||
displayName: Cache Yarn packages
|
displayName: Cache Yarn packages
|
||||||
- bash: ./build.sh --lint
|
- bash: ./build.sh --lint
|
||||||
@@ -838,8 +859,8 @@ stages:
|
|||||||
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml
|
sonar.cs.opencover.reportsPaths=$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml
|
||||||
sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml
|
sonar.cs.nunit.reportsPaths=$(Build.SourcesDirectory)/TestResult.xml
|
||||||
- bash: |
|
- bash: |
|
||||||
./build.sh --backend -f net5.0 -r win-x64
|
./build.sh --backend -f net6.0 -r win-x64
|
||||||
TEST_DIR=_tests/net5.0/win-x64/publish/ ./test.sh Windows Unit Coverage
|
TEST_DIR=_tests/net6.0/win-x64/publish/ ./test.sh Windows Unit Coverage
|
||||||
displayName: Coverage Unit Tests
|
displayName: Coverage Unit Tests
|
||||||
- task: SonarCloudAnalyze@1
|
- task: SonarCloudAnalyze@1
|
||||||
condition: eq(variables['System.PullRequest.IsFork'], 'False')
|
condition: eq(variables['System.PullRequest.IsFork'], 'False')
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ PackageLinux()
|
|||||||
|
|
||||||
echo "Adding Prowlarr.Mono to UpdatePackage"
|
echo "Adding Prowlarr.Mono to UpdatePackage"
|
||||||
cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update
|
cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update
|
||||||
if [ "$framework" = "net5.0" ]; then
|
if [ "$framework" = "net6.0" ]; then
|
||||||
cp $folder/Mono.Posix.NETStandard.* $folder/Prowlarr.Update
|
cp $folder/Mono.Posix.NETStandard.* $folder/Prowlarr.Update
|
||||||
cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update
|
cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update
|
||||||
fi
|
fi
|
||||||
@@ -141,12 +141,13 @@ PackageLinux()
|
|||||||
PackageMacOS()
|
PackageMacOS()
|
||||||
{
|
{
|
||||||
local framework="$1"
|
local framework="$1"
|
||||||
|
local runtime="$2"
|
||||||
|
|
||||||
ProgressStart "Creating MacOS Package for $framework"
|
ProgressStart "Creating MacOS Package for $framework $runtime"
|
||||||
|
|
||||||
local folder=$artifactsFolder/macos/$framework/Prowlarr
|
local folder=$artifactsFolder/$runtime/$framework/Prowlarr
|
||||||
|
|
||||||
PackageFiles "$folder" "$framework" "osx-x64"
|
PackageFiles "$folder" "$framework" "$runtime"
|
||||||
|
|
||||||
echo "Removing Service helpers"
|
echo "Removing Service helpers"
|
||||||
rm -f $folder/ServiceUninstall.*
|
rm -f $folder/ServiceUninstall.*
|
||||||
@@ -157,7 +158,7 @@ PackageMacOS()
|
|||||||
|
|
||||||
echo "Adding Prowlarr.Mono to UpdatePackage"
|
echo "Adding Prowlarr.Mono to UpdatePackage"
|
||||||
cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update
|
cp $folder/Prowlarr.Mono.* $folder/Prowlarr.Update
|
||||||
if [ "$framework" = "net5.0" ]; then
|
if [ "$framework" = "net6.0" ]; then
|
||||||
cp $folder/Mono.Posix.NETStandard.* $folder/Prowlarr.Update
|
cp $folder/Mono.Posix.NETStandard.* $folder/Prowlarr.Update
|
||||||
cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update
|
cp $folder/libMonoPosixHelper.* $folder/Prowlarr.Update
|
||||||
fi
|
fi
|
||||||
@@ -168,10 +169,11 @@ PackageMacOS()
|
|||||||
PackageMacOSApp()
|
PackageMacOSApp()
|
||||||
{
|
{
|
||||||
local framework="$1"
|
local framework="$1"
|
||||||
|
local runtime="$2"
|
||||||
|
|
||||||
ProgressStart "Creating macOS App Package for $framework"
|
ProgressStart "Creating macOS App Package for $framework $runtime"
|
||||||
|
|
||||||
local folder=$artifactsFolder/macos-app/$framework
|
local folder="$artifactsFolder/$runtime-app/$framework"
|
||||||
|
|
||||||
rm -rf $folder
|
rm -rf $folder
|
||||||
mkdir -p $folder
|
mkdir -p $folder
|
||||||
@@ -179,7 +181,7 @@ PackageMacOSApp()
|
|||||||
mkdir -p $folder/Prowlarr.app/Contents/MacOS
|
mkdir -p $folder/Prowlarr.app/Contents/MacOS
|
||||||
|
|
||||||
echo "Copying Binaries"
|
echo "Copying Binaries"
|
||||||
cp -r $artifactsFolder/macos/$framework/Prowlarr/* $folder/Prowlarr.app/Contents/MacOS
|
cp -r $artifactsFolder/$runtime/$framework/Prowlarr/* $folder/Prowlarr.app/Contents/MacOS
|
||||||
|
|
||||||
echo "Removing Update Folder"
|
echo "Removing Update Folder"
|
||||||
rm -r $folder/Prowlarr.app/Contents/MacOS/Prowlarr.Update
|
rm -r $folder/Prowlarr.app/Contents/MacOS/Prowlarr.Update
|
||||||
@@ -226,8 +228,8 @@ Package()
|
|||||||
PackageWindows "$framework" "$runtime"
|
PackageWindows "$framework" "$runtime"
|
||||||
;;
|
;;
|
||||||
osx)
|
osx)
|
||||||
PackageMacOS "$framework"
|
PackageMacOS "$framework" "$runtime"
|
||||||
PackageMacOSApp "$framework"
|
PackageMacOSApp "$framework" "$runtime"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
@@ -327,14 +329,14 @@ then
|
|||||||
Build
|
Build
|
||||||
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
|
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
|
||||||
then
|
then
|
||||||
PackageTests "net5.0" "win-x64"
|
PackageTests "net6.0" "win-x64"
|
||||||
PackageTests "net5.0" "win-x86"
|
PackageTests "net6.0" "win-x86"
|
||||||
PackageTests "net5.0" "linux-x64"
|
PackageTests "net6.0" "linux-x64"
|
||||||
PackageTests "net5.0" "linux-musl-x64"
|
PackageTests "net6.0" "linux-musl-x64"
|
||||||
PackageTests "net5.0" "osx-x64"
|
PackageTests "net6.0" "osx-x64"
|
||||||
if [ "$ENABLE_BSD" = "YES" ];
|
if [ "$ENABLE_BSD" = "YES" ];
|
||||||
then
|
then
|
||||||
PackageTests "net5.0" "freebsd-x64"
|
PackageTests "net6.0" "freebsd-x64"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
PackageTests "$FRAMEWORK" "$RID"
|
PackageTests "$FRAMEWORK" "$RID"
|
||||||
@@ -363,17 +365,19 @@ then
|
|||||||
|
|
||||||
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
|
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
|
||||||
then
|
then
|
||||||
Package "net5.0" "win-x64"
|
Package "net6.0" "win-x64"
|
||||||
Package "net5.0" "win-x86"
|
Package "net6.0" "win-x86"
|
||||||
Package "net5.0" "linux-x64"
|
Package "net6.0" "linux-x64"
|
||||||
Package "net5.0" "linux-musl-x64"
|
Package "net6.0" "linux-musl-x64"
|
||||||
Package "net5.0" "linux-arm64"
|
Package "net6.0" "linux-arm64"
|
||||||
Package "net5.0" "linux-musl-arm64"
|
Package "net6.0" "linux-musl-arm64"
|
||||||
Package "net5.0" "linux-arm"
|
Package "net6.0" "linux-arm"
|
||||||
Package "net5.0" "osx-x64"
|
Package "net6.0" "linux-musl-arm"
|
||||||
|
Package "net6.0" "osx-x64"
|
||||||
|
Package "net6.0" "osx-arm64"
|
||||||
if [ "$ENABLE_BSD" = "YES" ];
|
if [ "$ENABLE_BSD" = "YES" ];
|
||||||
then
|
then
|
||||||
Package "net5.0" "freebsd-x64"
|
Package "net6.0" "freebsd-x64"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
Package "$FRAMEWORK" "$RID"
|
Package "$FRAMEWORK" "$RID"
|
||||||
|
|||||||
@@ -4,7 +4,5 @@ export const CLEAR_HISTORY = 'ClearHistory';
|
|||||||
export const CLEAR_LOGS = 'ClearLog';
|
export const CLEAR_LOGS = 'ClearLog';
|
||||||
export const DELETE_LOG_FILES = 'DeleteLogFiles';
|
export const DELETE_LOG_FILES = 'DeleteLogFiles';
|
||||||
export const DELETE_UPDATE_LOG_FILES = 'DeleteUpdateLogFiles';
|
export const DELETE_UPDATE_LOG_FILES = 'DeleteUpdateLogFiles';
|
||||||
export const INTERACTIVE_IMPORT = 'ManualImport';
|
|
||||||
export const RESET_API_KEY = 'ResetApiKey';
|
export const RESET_API_KEY = 'ResetApiKey';
|
||||||
export const RSS_SYNC = 'RssSync';
|
|
||||||
export const APP_INDEXER_SYNC = 'ApplicationIndexerSync';
|
export const APP_INDEXER_SYNC = 'ApplicationIndexerSync';
|
||||||
|
|||||||
@@ -70,18 +70,18 @@ class FileBrowserModalContent extends Component {
|
|||||||
} else {
|
} else {
|
||||||
this._scrollerNode = null;
|
this._scrollerNode = null;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
|
|
||||||
onPathInputChange = ({ value }) => {
|
onPathInputChange = ({ value }) => {
|
||||||
this.setState({ currentPath: value });
|
this.setState({ currentPath: value });
|
||||||
}
|
};
|
||||||
|
|
||||||
onRowPress = (path) => {
|
onRowPress = (path) => {
|
||||||
this.props.onFetchPaths(path);
|
this.props.onFetchPaths(path);
|
||||||
}
|
};
|
||||||
|
|
||||||
onOkPress = () => {
|
onOkPress = () => {
|
||||||
this.props.onChange({
|
this.props.onChange({
|
||||||
@@ -91,7 +91,7 @@ class FileBrowserModalContent extends Component {
|
|||||||
|
|
||||||
this.props.onClearPaths();
|
this.props.onClearPaths();
|
||||||
this.props.onModalClose();
|
this.props.onModalClose();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -78,16 +78,16 @@ class FileBrowserModalContentConnector extends Component {
|
|||||||
allowFoldersWithoutTrailingSlashes: true,
|
allowFoldersWithoutTrailingSlashes: true,
|
||||||
includeFiles
|
includeFiles
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onClearPaths = () => {
|
onClearPaths = () => {
|
||||||
// this.props.dispatchClearPaths();
|
// this.props.dispatchClearPaths();
|
||||||
}
|
};
|
||||||
|
|
||||||
onModalClose = () => {
|
onModalClose = () => {
|
||||||
this.props.dispatchClearPaths();
|
this.props.dispatchClearPaths();
|
||||||
this.props.onModalClose();
|
this.props.onModalClose();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class FileBrowserRow extends Component {
|
|||||||
|
|
||||||
onPress = () => {
|
onPress = () => {
|
||||||
this.props.onPress(this.props.path);
|
this.props.onPress(this.props.path);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ class DateFilterBuilderRowValue extends Component {
|
|||||||
name: NAME,
|
name: NAME,
|
||||||
value: newValue
|
value: newValue
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onTimeChange = ({ value }) => {
|
onTimeChange = ({ value }) => {
|
||||||
const {
|
const {
|
||||||
@@ -117,7 +117,7 @@ class DateFilterBuilderRowValue extends Component {
|
|||||||
value: filterValue.value
|
value: filterValue.value
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class FilterBuilderModalContent extends Component {
|
|||||||
|
|
||||||
onLabelChange = ({ value }) => {
|
onLabelChange = ({ value }) => {
|
||||||
this.setState({ label: value });
|
this.setState({ label: value });
|
||||||
}
|
};
|
||||||
|
|
||||||
onFilterChange = (index, filter) => {
|
onFilterChange = (index, filter) => {
|
||||||
const filters = [...this.state.filters];
|
const filters = [...this.state.filters];
|
||||||
@@ -72,7 +72,7 @@ class FilterBuilderModalContent extends Component {
|
|||||||
this.setState({
|
this.setState({
|
||||||
filters
|
filters
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onAddFilterPress = () => {
|
onAddFilterPress = () => {
|
||||||
const filters = [...this.state.filters];
|
const filters = [...this.state.filters];
|
||||||
@@ -81,7 +81,7 @@ class FilterBuilderModalContent extends Component {
|
|||||||
this.setState({
|
this.setState({
|
||||||
filters
|
filters
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onRemoveFilterPress = (index) => {
|
onRemoveFilterPress = (index) => {
|
||||||
const filters = [...this.state.filters];
|
const filters = [...this.state.filters];
|
||||||
@@ -90,7 +90,7 @@ class FilterBuilderModalContent extends Component {
|
|||||||
this.setState({
|
this.setState({
|
||||||
filters
|
filters
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onSaveFilterPress = () => {
|
onSaveFilterPress = () => {
|
||||||
const {
|
const {
|
||||||
@@ -122,7 +122,7 @@ class FilterBuilderModalContent extends Component {
|
|||||||
label,
|
label,
|
||||||
filters
|
filters
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ class FilterBuilderRow extends Component {
|
|||||||
|
|
||||||
this.selectedFilterBuilderProp = selectedFilterBuilderProp;
|
this.selectedFilterBuilderProp = selectedFilterBuilderProp;
|
||||||
onFilterChange(index, filter);
|
onFilterChange(index, filter);
|
||||||
}
|
};
|
||||||
|
|
||||||
onFilterChange = ({ name, value }) => {
|
onFilterChange = ({ name, value }) => {
|
||||||
const {
|
const {
|
||||||
@@ -158,7 +158,7 @@ class FilterBuilderRow extends Component {
|
|||||||
filter[name] = value;
|
filter[name] = value;
|
||||||
|
|
||||||
onFilterChange(index, filter);
|
onFilterChange(index, filter);
|
||||||
}
|
};
|
||||||
|
|
||||||
onAddPress = () => {
|
onAddPress = () => {
|
||||||
const {
|
const {
|
||||||
@@ -167,7 +167,7 @@ class FilterBuilderRow extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onAddPress(index);
|
onAddPress(index);
|
||||||
}
|
};
|
||||||
|
|
||||||
onRemovePress = () => {
|
onRemovePress = () => {
|
||||||
const {
|
const {
|
||||||
@@ -176,7 +176,7 @@ class FilterBuilderRow extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onRemovePress(index);
|
onRemovePress(index);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ class FilterBuilderRowValue extends Component {
|
|||||||
name: NAME,
|
name: NAME,
|
||||||
value: [...filterValue, value]
|
value: [...filterValue, value]
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onTagDelete = ({ index }) => {
|
onTagDelete = ({ index }) => {
|
||||||
const {
|
const {
|
||||||
@@ -98,7 +98,7 @@ class FilterBuilderRowValue extends Component {
|
|||||||
name: NAME,
|
name: NAME,
|
||||||
value
|
value
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ class IndexerFilterBuilderRowValueConnector extends Component {
|
|||||||
if (!this.props.isPopulated) {
|
if (!this.props.isPopulated) {
|
||||||
this.props.dispatchFetchIndexers();
|
this.props.dispatchFetchIndexers();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ class CustomFilter extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onEditPress(id);
|
onEditPress(id);
|
||||||
}
|
};
|
||||||
|
|
||||||
onRemovePress = () => {
|
onRemovePress = () => {
|
||||||
const {
|
const {
|
||||||
@@ -67,7 +67,7 @@ class CustomFilter extends Component {
|
|||||||
dispatchDeleteCustomFilter({ id });
|
dispatchDeleteCustomFilter({ id });
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -25,14 +25,14 @@ class FilterModal extends Component {
|
|||||||
this.setState({
|
this.setState({
|
||||||
filterBuilder: true
|
filterBuilder: true
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onEditCustomFilter = (id) => {
|
onEditCustomFilter = (id) => {
|
||||||
this.setState({
|
this.setState({
|
||||||
filterBuilder: true,
|
filterBuilder: true,
|
||||||
id
|
id
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onCancelPress = () => {
|
onCancelPress = () => {
|
||||||
if (this.state.filterBuilder) {
|
if (this.state.filterBuilder) {
|
||||||
@@ -43,7 +43,7 @@ class FilterModal extends Component {
|
|||||||
} else {
|
} else {
|
||||||
this.onModalClose();
|
this.onModalClose();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onModalClose = () => {
|
onModalClose = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
@@ -52,7 +52,7 @@ class FilterModal extends Component {
|
|||||||
}, () => {
|
}, () => {
|
||||||
this.props.onModalClose();
|
this.props.onModalClose();
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ class AppProfileSelectInputConnector extends Component {
|
|||||||
|
|
||||||
onChange = ({ name, value }) => {
|
onChange = ({ name, value }) => {
|
||||||
this.props.onChange({ name, value: parseInt(value) });
|
this.props.onChange({ name, value: parseInt(value) });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -35,11 +35,11 @@ class AutoCompleteInput extends Component {
|
|||||||
name: this.props.name,
|
name: this.props.name,
|
||||||
value: newValue
|
value: newValue
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onInputBlur = () => {
|
onInputBlur = () => {
|
||||||
this.setState({ suggestions: [] });
|
this.setState({ suggestions: [] });
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionsFetchRequested = ({ value }) => {
|
onSuggestionsFetchRequested = ({ value }) => {
|
||||||
const { values } = this.props;
|
const { values } = this.props;
|
||||||
@@ -50,11 +50,11 @@ class AutoCompleteInput extends Component {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.setState({ suggestions: filteredValues });
|
this.setState({ suggestions: filteredValues });
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionsClearRequested = () => {
|
onSuggestionsClearRequested = () => {
|
||||||
this.setState({ suggestions: [] });
|
this.setState({ suggestions: [] });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class AutoSuggestInput extends Component {
|
|||||||
}}
|
}}
|
||||||
</Reference>
|
</Reference>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
renderSuggestionsContainer = ({ containerProps, children }) => {
|
renderSuggestionsContainer = ({ containerProps, children }) => {
|
||||||
return (
|
return (
|
||||||
@@ -90,7 +90,7 @@ class AutoSuggestInput extends Component {
|
|||||||
</Popper>
|
</Popper>
|
||||||
</Portal>
|
</Portal>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
@@ -113,14 +113,14 @@ class AutoSuggestInput extends Component {
|
|||||||
data.styles.width = width;
|
data.styles.width = width;
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
};
|
||||||
|
|
||||||
onInputChange = (event, { newValue }) => {
|
onInputChange = (event, { newValue }) => {
|
||||||
this.props.onChange({
|
this.props.onChange({
|
||||||
name: this.props.name,
|
name: this.props.name,
|
||||||
value: newValue
|
value: newValue
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onInputKeyDown = (event) => {
|
onInputKeyDown = (event) => {
|
||||||
const {
|
const {
|
||||||
@@ -144,7 +144,7 @@ class AutoSuggestInput extends Component {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ class CaptchaInputConnector extends Component {
|
|||||||
|
|
||||||
componentWillUnmount = () => {
|
componentWillUnmount = () => {
|
||||||
this.props.resetCaptcha();
|
this.props.resetCaptcha();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
@@ -51,7 +51,7 @@ class CaptchaInputConnector extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
this.props.refreshCaptcha({ provider, providerData });
|
this.props.refreshCaptcha({ provider, providerData });
|
||||||
}
|
};
|
||||||
|
|
||||||
onCaptchaChange = (captchaResponse) => {
|
onCaptchaChange = (captchaResponse) => {
|
||||||
// If the captcha has expired `captchaResponse` will be null.
|
// If the captcha has expired `captchaResponse` will be null.
|
||||||
@@ -68,7 +68,7 @@ class CaptchaInputConnector extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
this.props.getCaptchaCookie({ provider, providerData, captchaResponse });
|
this.props.getCaptchaCookie({ provider, providerData, captchaResponse });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class CardigannCaptchaInputConnector extends Component {
|
|||||||
|
|
||||||
componentWillUnmount = () => {
|
componentWillUnmount = () => {
|
||||||
this.props.resetCaptcha();
|
this.props.resetCaptcha();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
@@ -48,7 +48,7 @@ class CardigannCaptchaInputConnector extends Component {
|
|||||||
this.props.resetCaptcha();
|
this.props.resetCaptcha();
|
||||||
this.props.refreshCaptcha({ provider, providerData });
|
this.props.refreshCaptcha({ provider, providerData });
|
||||||
|
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -59,14 +59,14 @@ class CheckInput extends Component {
|
|||||||
shiftKey
|
shiftKey
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
|
|
||||||
setRef = (ref) => {
|
setRef = (ref) => {
|
||||||
this._checkbox = ref;
|
this._checkbox = ref;
|
||||||
}
|
};
|
||||||
|
|
||||||
onClick = (event) => {
|
onClick = (event) => {
|
||||||
if (this.props.isDisabled) {
|
if (this.props.isDisabled) {
|
||||||
@@ -78,14 +78,14 @@ class CheckInput extends Component {
|
|||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
this.toggleChecked(checked, shiftKey);
|
this.toggleChecked(checked, shiftKey);
|
||||||
}
|
};
|
||||||
|
|
||||||
onChange = (event) => {
|
onChange = (event) => {
|
||||||
const checked = event.target.checked;
|
const checked = event.target.checked;
|
||||||
const shiftKey = event.nativeEvent.shiftKey;
|
const shiftKey = event.nativeEvent.shiftKey;
|
||||||
|
|
||||||
this.toggleChecked(checked, shiftKey);
|
this.toggleChecked(checked, shiftKey);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class DeviceInput extends Component {
|
|||||||
name,
|
name,
|
||||||
value: [...value, deviceId]
|
value: [...value, deviceId]
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onTagDelete = ({ index }) => {
|
onTagDelete = ({ index }) => {
|
||||||
const {
|
const {
|
||||||
@@ -39,7 +39,7 @@ class DeviceInput extends Component {
|
|||||||
name,
|
name,
|
||||||
value: newValue
|
value: newValue
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -48,11 +48,11 @@ class DeviceInputConnector extends Component {
|
|||||||
|
|
||||||
componentDidMount = () => {
|
componentDidMount = () => {
|
||||||
this._populate();
|
this._populate();
|
||||||
}
|
};
|
||||||
|
|
||||||
componentWillUnmount = () => {
|
componentWillUnmount = () => {
|
||||||
this.props.dispatchClearOptions({ section: 'devices' });
|
this.props.dispatchClearOptions({ section: 'devices' });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Control
|
// Control
|
||||||
@@ -77,7 +77,7 @@ class DeviceInputConnector extends Component {
|
|||||||
|
|
||||||
onRefreshPress = () => {
|
onRefreshPress = () => {
|
||||||
this._populate();
|
this._populate();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ class EnhancedSelectInput extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
};
|
||||||
|
|
||||||
onWindowClick = (event) => {
|
onWindowClick = (event) => {
|
||||||
const button = document.getElementById(this._buttonId);
|
const button = document.getElementById(this._buttonId);
|
||||||
@@ -168,14 +168,14 @@ class EnhancedSelectInput extends Component {
|
|||||||
this.setState({ isOpen: false });
|
this.setState({ isOpen: false });
|
||||||
this._removeListener();
|
this._removeListener();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onFocus = () => {
|
onFocus = () => {
|
||||||
if (this.state.isOpen) {
|
if (this.state.isOpen) {
|
||||||
this._removeListener();
|
this._removeListener();
|
||||||
this.setState({ isOpen: false });
|
this.setState({ isOpen: false });
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onBlur = () => {
|
onBlur = () => {
|
||||||
if (!this.props.isEditable) {
|
if (!this.props.isEditable) {
|
||||||
@@ -186,7 +186,7 @@ class EnhancedSelectInput extends Component {
|
|||||||
this.setState({ selectedIndex: origIndex });
|
this.setState({ selectedIndex: origIndex });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onKeyDown = (event) => {
|
onKeyDown = (event) => {
|
||||||
const {
|
const {
|
||||||
@@ -253,7 +253,7 @@ class EnhancedSelectInput extends Component {
|
|||||||
if (!_.isEmpty(newState)) {
|
if (!_.isEmpty(newState)) {
|
||||||
this.setState(newState);
|
this.setState(newState);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onPress = () => {
|
onPress = () => {
|
||||||
if (this.state.isOpen) {
|
if (this.state.isOpen) {
|
||||||
@@ -267,7 +267,7 @@ class EnhancedSelectInput extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.setState({ isOpen: !this.state.isOpen });
|
this.setState({ isOpen: !this.state.isOpen });
|
||||||
}
|
};
|
||||||
|
|
||||||
onSelect = (value) => {
|
onSelect = (value) => {
|
||||||
if (Array.isArray(this.props.value)) {
|
if (Array.isArray(this.props.value)) {
|
||||||
@@ -291,15 +291,15 @@ class EnhancedSelectInput extends Component {
|
|||||||
value
|
value
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onMeasure = ({ width }) => {
|
onMeasure = ({ width }) => {
|
||||||
this.setState({ width });
|
this.setState({ width });
|
||||||
}
|
};
|
||||||
|
|
||||||
onOptionsModalClose = () => {
|
onOptionsModalClose = () => {
|
||||||
this.setState({ isOpen: false });
|
this.setState({ isOpen: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ class EnhancedSelectInputConnector extends Component {
|
|||||||
|
|
||||||
componentDidMount = () => {
|
componentDidMount = () => {
|
||||||
this._populate();
|
this._populate();
|
||||||
}
|
};
|
||||||
|
|
||||||
componentDidUpdate = (prevProps) => {
|
componentDidUpdate = (prevProps) => {
|
||||||
const prevKey = getProviderDataKey(prevProps.providerData);
|
const prevKey = getProviderDataKey(prevProps.providerData);
|
||||||
@@ -82,11 +82,11 @@ class EnhancedSelectInputConnector extends Component {
|
|||||||
if (!_.isEqual(prevKey, nextKey)) {
|
if (!_.isEqual(prevKey, nextKey)) {
|
||||||
this.setState({ refetchRequired: true });
|
this.setState({ refetchRequired: true });
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
componentWillUnmount = () => {
|
componentWillUnmount = () => {
|
||||||
this._cleanup();
|
this._cleanup();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
@@ -95,7 +95,7 @@ class EnhancedSelectInputConnector extends Component {
|
|||||||
if (this.state.refetchRequired) {
|
if (this.state.refetchRequired) {
|
||||||
this._populate();
|
this._populate();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Control
|
// Control
|
||||||
|
|||||||
@@ -21,11 +21,11 @@ class EnhancedSelectInputOption extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onSelect(id);
|
onSelect(id);
|
||||||
}
|
};
|
||||||
|
|
||||||
onCheckPress = () => {
|
onCheckPress = () => {
|
||||||
// CheckInput requires a handler. Swallow the change event because onPress will already handle it via event propagation.
|
// CheckInput requires a handler. Swallow the change event because onPress will already handle it via event propagation.
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import FormInputHelpText from './FormInputHelpText';
|
|||||||
import IndexerFlagsSelectInputConnector from './IndexerFlagsSelectInputConnector';
|
import IndexerFlagsSelectInputConnector from './IndexerFlagsSelectInputConnector';
|
||||||
import InfoInput from './InfoInput';
|
import InfoInput from './InfoInput';
|
||||||
import KeyValueListInput from './KeyValueListInput';
|
import KeyValueListInput from './KeyValueListInput';
|
||||||
import MovieMonitoredSelectInput from './MovieMonitoredSelectInput';
|
|
||||||
import NumberInput from './NumberInput';
|
import NumberInput from './NumberInput';
|
||||||
import OAuthInputConnector from './OAuthInputConnector';
|
import OAuthInputConnector from './OAuthInputConnector';
|
||||||
import PasswordInput from './PasswordInput';
|
import PasswordInput from './PasswordInput';
|
||||||
@@ -69,9 +68,6 @@ function getComponent(type) {
|
|||||||
case inputTypes.PATH:
|
case inputTypes.PATH:
|
||||||
return PathInputConnector;
|
return PathInputConnector;
|
||||||
|
|
||||||
case inputTypes.MOVIE_MONITORED_SELECT:
|
|
||||||
return MovieMonitoredSelectInput;
|
|
||||||
|
|
||||||
case inputTypes.INDEXER_FLAGS_SELECT:
|
case inputTypes.INDEXER_FLAGS_SELECT:
|
||||||
return IndexerFlagsSelectInputConnector;
|
return IndexerFlagsSelectInputConnector;
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ class IndexerFlagsSelectInputConnector extends Component {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.props.onChange({ name, value: indexerFlags });
|
this.props.onChange({ name, value: indexerFlags });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ class IndexersSelectInputConnector extends Component {
|
|||||||
|
|
||||||
onChange = ({ name, value }) => {
|
onChange = ({ name, value }) => {
|
||||||
this.props.onChange({ name, value });
|
this.props.onChange({ name, value });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ class KeyValueListInput extends Component {
|
|||||||
name,
|
name,
|
||||||
value: newValue
|
value: newValue
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onRemoveItem = (index) => {
|
onRemoveItem = (index) => {
|
||||||
const {
|
const {
|
||||||
@@ -55,13 +55,13 @@ class KeyValueListInput extends Component {
|
|||||||
name,
|
name,
|
||||||
value: newValue
|
value: newValue
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onFocus = () => {
|
onFocus = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
isFocused: true
|
isFocused: true
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onBlur = () => {
|
onBlur = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
@@ -88,7 +88,7 @@ class KeyValueListInput extends Component {
|
|||||||
value: newValue
|
value: newValue
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class KeyValueListInputItem extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onChange(index, { key: keyValue, value });
|
onChange(index, { key: keyValue, value });
|
||||||
}
|
};
|
||||||
|
|
||||||
onValueChange = ({ value }) => {
|
onValueChange = ({ value }) => {
|
||||||
// TODO: Validate here or validate at a lower level component
|
// TODO: Validate here or validate at a lower level component
|
||||||
@@ -30,7 +30,7 @@ class KeyValueListInputItem extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onChange(index, { key: keyValue, value });
|
onChange(index, { key: keyValue, value });
|
||||||
}
|
};
|
||||||
|
|
||||||
onRemovePress = () => {
|
onRemovePress = () => {
|
||||||
const {
|
const {
|
||||||
@@ -39,15 +39,15 @@ class KeyValueListInputItem extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onRemove(index);
|
onRemove(index);
|
||||||
}
|
};
|
||||||
|
|
||||||
onFocus = () => {
|
onFocus = () => {
|
||||||
this.props.onFocus();
|
this.props.onFocus();
|
||||||
}
|
};
|
||||||
|
|
||||||
onBlur = () => {
|
onBlur = () => {
|
||||||
this.props.onBlur();
|
this.props.onBlur();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -1,52 +0,0 @@
|
|||||||
import PropTypes from 'prop-types';
|
|
||||||
import React from 'react';
|
|
||||||
import SelectInput from './SelectInput';
|
|
||||||
|
|
||||||
const monitorTypesOptions = [
|
|
||||||
{ key: 'true', value: 'True' },
|
|
||||||
{ key: 'false', value: 'False' }
|
|
||||||
];
|
|
||||||
|
|
||||||
function MovieMonitoredSelectInput(props) {
|
|
||||||
const values = [...monitorTypesOptions];
|
|
||||||
|
|
||||||
const {
|
|
||||||
includeNoChange,
|
|
||||||
includeMixed
|
|
||||||
} = props;
|
|
||||||
|
|
||||||
if (includeNoChange) {
|
|
||||||
values.unshift({
|
|
||||||
key: 'noChange',
|
|
||||||
value: 'No Change',
|
|
||||||
disabled: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (includeMixed) {
|
|
||||||
values.unshift({
|
|
||||||
key: 'mixed',
|
|
||||||
value: '(Mixed)',
|
|
||||||
disabled: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<SelectInput
|
|
||||||
{...props}
|
|
||||||
values={values}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
MovieMonitoredSelectInput.propTypes = {
|
|
||||||
includeNoChange: PropTypes.bool.isRequired,
|
|
||||||
includeMixed: PropTypes.bool.isRequired
|
|
||||||
};
|
|
||||||
|
|
||||||
MovieMonitoredSelectInput.defaultProps = {
|
|
||||||
includeNoChange: false,
|
|
||||||
includeMixed: false
|
|
||||||
};
|
|
||||||
|
|
||||||
export default MovieMonitoredSelectInput;
|
|
||||||
@@ -42,7 +42,7 @@ class IndexersSelectInputConnector extends Component {
|
|||||||
|
|
||||||
onChange = ({ name, value }) => {
|
onChange = ({ name, value }) => {
|
||||||
this.props.onChange({ name, value });
|
this.props.onChange({ name, value });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -59,11 +59,11 @@ class NumberInput extends Component {
|
|||||||
value: parseValue(this.props, value)
|
value: parseValue(this.props, value)
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
};
|
||||||
|
|
||||||
onFocus = () => {
|
onFocus = () => {
|
||||||
this.setState({ isFocused: true });
|
this.setState({ isFocused: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
onBlur = () => {
|
onBlur = () => {
|
||||||
const {
|
const {
|
||||||
@@ -88,7 +88,7 @@ class NumberInput extends Component {
|
|||||||
name,
|
name,
|
||||||
value: parsedValue
|
value: parsedValue
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class OAuthInputConnector extends Component {
|
|||||||
|
|
||||||
componentWillUnmount = () => {
|
componentWillUnmount = () => {
|
||||||
this.props.resetOAuth();
|
this.props.resetOAuth();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
@@ -60,7 +60,7 @@ class OAuthInputConnector extends Component {
|
|||||||
providerData,
|
providerData,
|
||||||
section
|
section
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ class PathInput extends Component {
|
|||||||
|
|
||||||
onInputChange = ({ value }) => {
|
onInputChange = ({ value }) => {
|
||||||
this.setState({ value });
|
this.setState({ value });
|
||||||
}
|
};
|
||||||
|
|
||||||
onInputKeyDown = (event) => {
|
onInputKeyDown = (event) => {
|
||||||
if (event.key === 'Tab') {
|
if (event.key === 'Tab') {
|
||||||
@@ -80,7 +80,7 @@ class PathInput extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onInputBlur = () => {
|
onInputBlur = () => {
|
||||||
this.props.onChange({
|
this.props.onChange({
|
||||||
@@ -89,28 +89,28 @@ class PathInput extends Component {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.props.onClearPaths();
|
this.props.onClearPaths();
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionsFetchRequested = ({ value }) => {
|
onSuggestionsFetchRequested = ({ value }) => {
|
||||||
this.props.onFetchPaths(value);
|
this.props.onFetchPaths(value);
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionsClearRequested = () => {
|
onSuggestionsClearRequested = () => {
|
||||||
// Required because props aren't always rendered, but no-op
|
// Required because props aren't always rendered, but no-op
|
||||||
// because we don't want to reset the paths after a path is selected.
|
// because we don't want to reset the paths after a path is selected.
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionSelected = (event, { suggestionValue }) => {
|
onSuggestionSelected = (event, { suggestionValue }) => {
|
||||||
this.props.onFetchPaths(suggestionValue);
|
this.props.onFetchPaths(suggestionValue);
|
||||||
}
|
};
|
||||||
|
|
||||||
onFileBrowserOpenPress = () => {
|
onFileBrowserOpenPress = () => {
|
||||||
this.setState({ isFileBrowserModalOpen: true });
|
this.setState({ isFileBrowserModalOpen: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
onFileBrowserModalClose = () => {
|
onFileBrowserModalClose = () => {
|
||||||
this.setState({ isFileBrowserModalOpen: false });
|
this.setState({ isFileBrowserModalOpen: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -47,11 +47,11 @@ class PathInputConnector extends Component {
|
|||||||
path,
|
path,
|
||||||
includeFiles
|
includeFiles
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onClearPaths = () => {
|
onClearPaths = () => {
|
||||||
this.props.dispatchClearPaths();
|
this.props.dispatchClearPaths();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -53,7 +53,8 @@ function getSelectValues(selectOptions) {
|
|||||||
result.push({
|
result.push({
|
||||||
key: option.value,
|
key: option.value,
|
||||||
value: option.name,
|
value: option.name,
|
||||||
hint: option.hint
|
hint: option.hint,
|
||||||
|
parentKey: option.parentValue
|
||||||
});
|
});
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class SelectInput extends Component {
|
|||||||
name: this.props.name,
|
name: this.props.name,
|
||||||
value: event.target.value
|
value: event.target.value
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class TagInput extends Component {
|
|||||||
|
|
||||||
_setAutosuggestRef = (ref) => {
|
_setAutosuggestRef = (ref) => {
|
||||||
this._autosuggestRef = ref;
|
this._autosuggestRef = ref;
|
||||||
}
|
};
|
||||||
|
|
||||||
getSuggestionValue({ name }) {
|
getSuggestionValue({ name }) {
|
||||||
return name;
|
return name;
|
||||||
@@ -57,7 +57,7 @@ class TagInput extends Component {
|
|||||||
|
|
||||||
shouldRenderSuggestions = (value) => {
|
shouldRenderSuggestions = (value) => {
|
||||||
return value.length >= this.props.minQueryLength;
|
return value.length >= this.props.minQueryLength;
|
||||||
}
|
};
|
||||||
|
|
||||||
renderSuggestion({ name }) {
|
renderSuggestion({ name }) {
|
||||||
return name;
|
return name;
|
||||||
@@ -70,14 +70,14 @@ class TagInput extends Component {
|
|||||||
value: '',
|
value: '',
|
||||||
suggestions: []
|
suggestions: []
|
||||||
});
|
});
|
||||||
}, 250, { leading: true, trailing: false })
|
}, 250, { leading: true, trailing: false });
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
|
|
||||||
onInputContainerPress = () => {
|
onInputContainerPress = () => {
|
||||||
this._autosuggestRef.input.focus();
|
this._autosuggestRef.input.focus();
|
||||||
}
|
};
|
||||||
|
|
||||||
onInputChange = (event, { newValue, method }) => {
|
onInputChange = (event, { newValue, method }) => {
|
||||||
const value = _.isObject(newValue) ? newValue.name : newValue;
|
const value = _.isObject(newValue) ? newValue.name : newValue;
|
||||||
@@ -85,7 +85,7 @@ class TagInput extends Component {
|
|||||||
if (method === 'type') {
|
if (method === 'type') {
|
||||||
this.setState({ value });
|
this.setState({ value });
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onInputKeyDown = (event) => {
|
onInputKeyDown = (event) => {
|
||||||
const {
|
const {
|
||||||
@@ -125,11 +125,11 @@ class TagInput extends Component {
|
|||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onInputFocus = () => {
|
onInputFocus = () => {
|
||||||
this.setState({ isFocused: true });
|
this.setState({ isFocused: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
onInputBlur = () => {
|
onInputBlur = () => {
|
||||||
this.setState({ isFocused: false });
|
this.setState({ isFocused: false });
|
||||||
@@ -153,7 +153,7 @@ class TagInput extends Component {
|
|||||||
if (tag) {
|
if (tag) {
|
||||||
this.addTag(tag);
|
this.addTag(tag);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionsFetchRequested = ({ value }) => {
|
onSuggestionsFetchRequested = ({ value }) => {
|
||||||
const lowerCaseValue = value.toLowerCase();
|
const lowerCaseValue = value.toLowerCase();
|
||||||
@@ -170,16 +170,16 @@ class TagInput extends Component {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.setState({ suggestions });
|
this.setState({ suggestions });
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionsClearRequested = () => {
|
onSuggestionsClearRequested = () => {
|
||||||
// Required because props aren't always rendered, but no-op
|
// Required because props aren't always rendered, but no-op
|
||||||
// because we don't want to reset the paths after a path is selected.
|
// because we don't want to reset the paths after a path is selected.
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionSelected = (event, { suggestion }) => {
|
onSuggestionSelected = (event, { suggestion }) => {
|
||||||
this.addTag(suggestion);
|
this.addTag(suggestion);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
@@ -204,7 +204,7 @@ class TagInput extends Component {
|
|||||||
onInputContainerPress={this.onInputContainerPress}
|
onInputContainerPress={this.onInputContainerPress}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {
|
const {
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ class TagInputConnector extends Component {
|
|||||||
newValue.push(tag.id);
|
newValue.push(tag.id);
|
||||||
|
|
||||||
this.props.onChange({ name, value: newValue });
|
this.props.onChange({ name, value: newValue });
|
||||||
}
|
};
|
||||||
|
|
||||||
onTagDelete = ({ index }) => {
|
onTagDelete = ({ index }) => {
|
||||||
const {
|
const {
|
||||||
@@ -116,7 +116,7 @@ class TagInputConnector extends Component {
|
|||||||
name,
|
name,
|
||||||
value: newValue
|
value: newValue
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onTagCreated = (tag) => {
|
onTagCreated = (tag) => {
|
||||||
const {
|
const {
|
||||||
@@ -128,7 +128,7 @@ class TagInputConnector extends Component {
|
|||||||
newValue.push(tag.id);
|
newValue.push(tag.id);
|
||||||
|
|
||||||
this.props.onChange({ name, value: newValue });
|
this.props.onChange({ name, value: newValue });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class TagInputInput extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onInputContainerPress();
|
onInputContainerPress();
|
||||||
}
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {
|
const {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class TagInputTag extends Component {
|
|||||||
index,
|
index,
|
||||||
id: tag.id
|
id: tag.id
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ class TagSelectInputConnector extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.props.onChange({ name, value: newValue });
|
this.props.onChange({ name, value: newValue });
|
||||||
}
|
};
|
||||||
|
|
||||||
onTagDelete = ({ index }) => {
|
onTagDelete = ({ index }) => {
|
||||||
const {
|
const {
|
||||||
@@ -75,7 +75,7 @@ class TagSelectInputConnector extends Component {
|
|||||||
name,
|
name,
|
||||||
value: newValue
|
value: newValue
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ class TextArea extends Component {
|
|||||||
|
|
||||||
setInputRef = (ref) => {
|
setInputRef = (ref) => {
|
||||||
this._input = ref;
|
this._input = ref;
|
||||||
}
|
};
|
||||||
|
|
||||||
selectionChange() {
|
selectionChange() {
|
||||||
if (this._selectionTimeout) {
|
if (this._selectionTimeout) {
|
||||||
@@ -75,7 +75,7 @@ class TextArea extends Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
onChange(payload);
|
onChange(payload);
|
||||||
}
|
};
|
||||||
|
|
||||||
onFocus = (event) => {
|
onFocus = (event) => {
|
||||||
if (this.props.onFocus) {
|
if (this.props.onFocus) {
|
||||||
@@ -83,19 +83,19 @@ class TextArea extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.selectionChange();
|
this.selectionChange();
|
||||||
}
|
};
|
||||||
|
|
||||||
onKeyUp = () => {
|
onKeyUp = () => {
|
||||||
this.selectionChange();
|
this.selectionChange();
|
||||||
}
|
};
|
||||||
|
|
||||||
onMouseDown = () => {
|
onMouseDown = () => {
|
||||||
this._isMouseTarget = true;
|
this._isMouseTarget = true;
|
||||||
}
|
};
|
||||||
|
|
||||||
onMouseUp = () => {
|
onMouseUp = () => {
|
||||||
this.selectionChange();
|
this.selectionChange();
|
||||||
}
|
};
|
||||||
|
|
||||||
onDocumentMouseUp = () => {
|
onDocumentMouseUp = () => {
|
||||||
if (this._isMouseTarget) {
|
if (this._isMouseTarget) {
|
||||||
@@ -103,7 +103,7 @@ class TextArea extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._isMouseTarget = false;
|
this._isMouseTarget = false;
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ class TextInput extends Component {
|
|||||||
|
|
||||||
setInputRef = (ref) => {
|
setInputRef = (ref) => {
|
||||||
this._input = ref;
|
this._input = ref;
|
||||||
}
|
};
|
||||||
|
|
||||||
selectionChange() {
|
selectionChange() {
|
||||||
if (this._selectionTimeout) {
|
if (this._selectionTimeout) {
|
||||||
@@ -82,7 +82,7 @@ class TextInput extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onChange(payload);
|
onChange(payload);
|
||||||
}
|
};
|
||||||
|
|
||||||
onFocus = (event) => {
|
onFocus = (event) => {
|
||||||
if (this.props.onFocus) {
|
if (this.props.onFocus) {
|
||||||
@@ -90,19 +90,19 @@ class TextInput extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.selectionChange();
|
this.selectionChange();
|
||||||
}
|
};
|
||||||
|
|
||||||
onKeyUp = () => {
|
onKeyUp = () => {
|
||||||
this.selectionChange();
|
this.selectionChange();
|
||||||
}
|
};
|
||||||
|
|
||||||
onMouseDown = () => {
|
onMouseDown = () => {
|
||||||
this._isMouseTarget = true;
|
this._isMouseTarget = true;
|
||||||
}
|
};
|
||||||
|
|
||||||
onMouseUp = () => {
|
onMouseUp = () => {
|
||||||
this.selectionChange();
|
this.selectionChange();
|
||||||
}
|
};
|
||||||
|
|
||||||
onDocumentMouseUp = () => {
|
onDocumentMouseUp = () => {
|
||||||
if (this._isMouseTarget) {
|
if (this._isMouseTarget) {
|
||||||
@@ -110,7 +110,7 @@ class TextInput extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._isMouseTarget = false;
|
this._isMouseTarget = false;
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class TextTagInputConnector extends Component {
|
|||||||
});
|
});
|
||||||
|
|
||||||
onChange({ name, value: newValue.join(',') });
|
onChange({ name, value: newValue.join(',') });
|
||||||
}
|
};
|
||||||
|
|
||||||
onTagDelete = ({ index }) => {
|
onTagDelete = ({ index }) => {
|
||||||
const {
|
const {
|
||||||
@@ -69,7 +69,7 @@ class TextTagInputConnector extends Component {
|
|||||||
name,
|
name,
|
||||||
value: newValue.join(',')
|
value: newValue.join(',')
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class ClipboardButton extends Component {
|
|||||||
showSuccess: false,
|
showSuccess: false,
|
||||||
showError: false
|
showError: false
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
@@ -72,13 +72,13 @@ class ClipboardButton extends Component {
|
|||||||
this.setState({
|
this.setState({
|
||||||
showSuccess: true
|
showSuccess: true
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onError = () => {
|
onError = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
showError: true
|
showError: true
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class Link extends Component {
|
|||||||
if (!isDisabled && onPress) {
|
if (!isDisabled && onPress) {
|
||||||
onPress(event);
|
onPress(event);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ class SpinnerErrorButton extends Component {
|
|||||||
hasWarning: false,
|
hasWarning: false,
|
||||||
hasError: false
|
hasError: false
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ class Measure extends Component {
|
|||||||
|
|
||||||
onMeasure = _.debounce((payload) => {
|
onMeasure = _.debounce((payload) => {
|
||||||
this.props.onMeasure(payload);
|
this.props.onMeasure(payload);
|
||||||
}, 250, { leading: true, trailing: false })
|
}, 250, { leading: true, trailing: false });
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -25,11 +25,11 @@ class FilterMenu extends Component {
|
|||||||
|
|
||||||
onCustomFiltersPress = () => {
|
onCustomFiltersPress = () => {
|
||||||
this.setState({ isFilterModalOpen: true });
|
this.setState({ isFilterModalOpen: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
onFiltersModalClose = () => {
|
onFiltersModalClose = () => {
|
||||||
this.setState({ isFilterModalOpen: false });
|
this.setState({ isFilterModalOpen: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class FilterMenuItem extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onPress(filterKey);
|
onPress(filterKey);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ class Menu extends Component {
|
|||||||
this.setState({ isMenuOpen: false });
|
this.setState({ isMenuOpen: false });
|
||||||
this._removeListener();
|
this._removeListener();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onTouchStart = (event) => {
|
onTouchStart = (event) => {
|
||||||
const menuButton = document.getElementById(this._menuButtonId);
|
const menuButton = document.getElementById(this._menuButtonId);
|
||||||
@@ -148,17 +148,17 @@ class Menu extends Component {
|
|||||||
this.setState({ isMenuOpen: false });
|
this.setState({ isMenuOpen: false });
|
||||||
this._removeListener();
|
this._removeListener();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onWindowResize = () => {
|
onWindowResize = () => {
|
||||||
this.setMaxHeight();
|
this.setMaxHeight();
|
||||||
}
|
};
|
||||||
|
|
||||||
onWindowScroll = (event) => {
|
onWindowScroll = (event) => {
|
||||||
if (this.state.isMenuOpen) {
|
if (this.state.isMenuOpen) {
|
||||||
this.setMaxHeight();
|
this.setMaxHeight();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onMenuButtonPress = () => {
|
onMenuButtonPress = () => {
|
||||||
const state = {
|
const state = {
|
||||||
@@ -173,7 +173,7 @@ class Menu extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.setState(state);
|
this.setState(state);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class SearchMenuItem extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onPress(name);
|
onPress(name);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ class SelectedMenuItem extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onPress(name);
|
onPress(name);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class Modal extends Component {
|
|||||||
|
|
||||||
_setBackgroundRef = (ref) => {
|
_setBackgroundRef = (ref) => {
|
||||||
this._backgroundRef = ref;
|
this._backgroundRef = ref;
|
||||||
}
|
};
|
||||||
|
|
||||||
_openModal() {
|
_openModal() {
|
||||||
openModals.push(this._modalId);
|
openModals.push(this._modalId);
|
||||||
@@ -131,7 +131,7 @@ class Modal extends Component {
|
|||||||
|
|
||||||
onBackdropBeginPress = (event) => {
|
onBackdropBeginPress = (event) => {
|
||||||
this._isBackdropPressed = this._isBackdropTarget(event);
|
this._isBackdropPressed = this._isBackdropTarget(event);
|
||||||
}
|
};
|
||||||
|
|
||||||
onBackdropEndPress = (event) => {
|
onBackdropEndPress = (event) => {
|
||||||
const {
|
const {
|
||||||
@@ -148,7 +148,7 @@ class Modal extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._isBackdropPressed = false;
|
this._isBackdropPressed = false;
|
||||||
}
|
};
|
||||||
|
|
||||||
onKeyDown = (event) => {
|
onKeyDown = (event) => {
|
||||||
const keyCode = event.keyCode;
|
const keyCode = event.keyCode;
|
||||||
@@ -161,7 +161,7 @@ class Modal extends Component {
|
|||||||
this.props.onModalClose();
|
this.props.onModalClose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -36,12 +36,12 @@ class IndexerSearchInput extends Component {
|
|||||||
|
|
||||||
setAutosuggestRef = (ref) => {
|
setAutosuggestRef = (ref) => {
|
||||||
this._autosuggest = ref;
|
this._autosuggest = ref;
|
||||||
}
|
};
|
||||||
|
|
||||||
focusInput = (event) => {
|
focusInput = (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
this._autosuggest.input.focus();
|
this._autosuggest.input.focus();
|
||||||
}
|
};
|
||||||
|
|
||||||
getSectionSuggestions(section) {
|
getSectionSuggestions(section) {
|
||||||
return section.suggestions;
|
return section.suggestions;
|
||||||
@@ -102,7 +102,7 @@ class IndexerSearchInput extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.setState({ value: newValue });
|
this.setState({ value: newValue });
|
||||||
}
|
};
|
||||||
|
|
||||||
onKeyDown = (event) => {
|
onKeyDown = (event) => {
|
||||||
if (event.shiftKey || event.altKey || event.ctrlKey) {
|
if (event.shiftKey || event.altKey || event.ctrlKey) {
|
||||||
@@ -137,31 +137,31 @@ class IndexerSearchInput extends Component {
|
|||||||
|
|
||||||
this._autosuggest.input.blur();
|
this._autosuggest.input.blur();
|
||||||
this.reset();
|
this.reset();
|
||||||
}
|
};
|
||||||
|
|
||||||
onBlur = () => {
|
onBlur = () => {
|
||||||
this.reset();
|
this.reset();
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionsClearRequested = () => {
|
onSuggestionsClearRequested = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
suggestions: [],
|
suggestions: [],
|
||||||
loading: false
|
loading: false
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionsFetchRequested = () => {
|
onSuggestionsFetchRequested = () => {
|
||||||
this.setState({
|
this.setState({
|
||||||
suggestions: [],
|
suggestions: [],
|
||||||
loading: false
|
loading: false
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionSelected = (event, { suggestion }) => {
|
onSuggestionSelected = (event, { suggestion }) => {
|
||||||
if (suggestion.type === ADD_NEW_TYPE) {
|
if (suggestion.type === ADD_NEW_TYPE) {
|
||||||
this.props.onGoToAddNewMovie(this.state.value);
|
this.props.onGoToAddNewMovie(this.state.value);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ function createMapStateToProps() {
|
|||||||
function createMapDispatchToProps(dispatch, props) {
|
function createMapDispatchToProps(dispatch, props) {
|
||||||
return {
|
return {
|
||||||
onGoToAddNewMovie(query) {
|
onGoToAddNewMovie(query) {
|
||||||
dispatch(setSearchDefault({ searchQuery: query, searchIndexerIds: [-1, -2] }));
|
dispatch(setSearchDefault({ searchQuery: query }));
|
||||||
dispatch(push(`${window.Prowlarr.urlBase}/search`));
|
dispatch(push(`${window.Prowlarr.urlBase}/search`));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -32,14 +32,14 @@ class PageHeader extends Component {
|
|||||||
|
|
||||||
onOpenKeyboardShortcutsModal = () => {
|
onOpenKeyboardShortcutsModal = () => {
|
||||||
this.setState({ isKeyboardShortcutsModalOpen: true });
|
this.setState({ isKeyboardShortcutsModalOpen: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
|
|
||||||
onKeyboardShortcutsModalClose = () => {
|
onKeyboardShortcutsModalClose = () => {
|
||||||
this.setState({ isKeyboardShortcutsModalOpen: false });
|
this.setState({ isKeyboardShortcutsModalOpen: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -28,11 +28,11 @@ class PageHeaderActionsMenuConnector extends Component {
|
|||||||
|
|
||||||
onRestartPress = () => {
|
onRestartPress = () => {
|
||||||
this.props.restart();
|
this.props.restart();
|
||||||
}
|
};
|
||||||
|
|
||||||
onShutdownPress = () => {
|
onShutdownPress = () => {
|
||||||
this.props.shutdown();
|
this.props.shutdown();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -54,15 +54,15 @@ class Page extends Component {
|
|||||||
width: window.innerWidth,
|
width: window.innerWidth,
|
||||||
height: window.innerHeight
|
height: window.innerHeight
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onUpdatedModalClose = () => {
|
onUpdatedModalClose = () => {
|
||||||
this.setState({ isUpdatedModalOpen: false });
|
this.setState({ isUpdatedModalOpen: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
onConnectionLostModalClose = () => {
|
onConnectionLostModalClose = () => {
|
||||||
this.setState({ isConnectionLostModalOpen: false });
|
this.setState({ isConnectionLostModalOpen: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -232,7 +232,7 @@ class PageConnector extends Component {
|
|||||||
|
|
||||||
onSidebarToggle = () => {
|
onSidebarToggle = () => {
|
||||||
this.props.onSidebarVisibleChange(!this.props.isSidebarVisible);
|
this.props.onSidebarVisibleChange(!this.props.isSidebarVisible);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class PageContentBody extends Component {
|
|||||||
if (this.props.onScroll && !isLocked()) {
|
if (this.props.onScroll && !isLocked()) {
|
||||||
onScroll(props);
|
onScroll(props);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ class PageJumpBar extends Component {
|
|||||||
|
|
||||||
onMeasure = ({ height }) => {
|
onMeasure = ({ height }) => {
|
||||||
this.setState({ height });
|
this.setState({ height });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ class PageJumpBarItem extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onItemPress(label);
|
onItemPress(label);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -13,20 +13,8 @@ function getIconName(name) {
|
|||||||
return icons.BACKUP;
|
return icons.BACKUP;
|
||||||
case 'CheckHealth':
|
case 'CheckHealth':
|
||||||
return icons.HEALTH;
|
return icons.HEALTH;
|
||||||
case 'EpisodeSearch':
|
|
||||||
return icons.SEARCH;
|
|
||||||
case 'Housekeeping':
|
case 'Housekeeping':
|
||||||
return icons.HOUSEKEEPING;
|
return icons.HOUSEKEEPING;
|
||||||
case 'RefreshMovie':
|
|
||||||
return icons.REFRESH;
|
|
||||||
case 'RssSync':
|
|
||||||
return icons.RSS;
|
|
||||||
case 'SeasonSearch':
|
|
||||||
return icons.SEARCH;
|
|
||||||
case 'MovieSearch':
|
|
||||||
return icons.SEARCH;
|
|
||||||
case 'UpdateSceneMapping':
|
|
||||||
return icons.REFRESH;
|
|
||||||
default:
|
default:
|
||||||
return icons.SPINNER;
|
return icons.SPINNER;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,11 +35,11 @@ class MessageConnector extends Component {
|
|||||||
if (hideAfter) {
|
if (hideAfter) {
|
||||||
this._hideTimeoutId = setTimeout(this.hideMessage, hideAfter * 1000);
|
this._hideTimeoutId = setTimeout(this.hideMessage, hideAfter * 1000);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
hideMessage = () => {
|
hideMessage = () => {
|
||||||
this.props.hideMessage({ id: this.props.id });
|
this.props.hideMessage({ id: this.props.id });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -234,7 +234,7 @@ class PageSidebar extends Component {
|
|||||||
|
|
||||||
_setSidebarRef = (ref) => {
|
_setSidebarRef = (ref) => {
|
||||||
this._sidebarRef = ref;
|
this._sidebarRef = ref;
|
||||||
}
|
};
|
||||||
|
|
||||||
_setSidebarTransform(isSidebarVisible, transition, callback) {
|
_setSidebarTransform(isSidebarVisible, transition, callback) {
|
||||||
this.setState({
|
this.setState({
|
||||||
@@ -263,11 +263,11 @@ class PageSidebar extends Component {
|
|||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
this.props.onSidebarVisibleChange(false);
|
this.props.onSidebarVisibleChange(false);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onWindowScroll = () => {
|
onWindowScroll = () => {
|
||||||
this.setState(getPositioning());
|
this.setState(getPositioning());
|
||||||
}
|
};
|
||||||
|
|
||||||
onTouchStart = (event) => {
|
onTouchStart = (event) => {
|
||||||
const touches = event.touches;
|
const touches = event.touches;
|
||||||
@@ -287,7 +287,7 @@ class PageSidebar extends Component {
|
|||||||
|
|
||||||
this._touchStartX = touchStartX;
|
this._touchStartX = touchStartX;
|
||||||
this._touchStartY = touchStartY;
|
this._touchStartY = touchStartY;
|
||||||
}
|
};
|
||||||
|
|
||||||
onTouchMove = (event) => {
|
onTouchMove = (event) => {
|
||||||
const touches = event.touches;
|
const touches = event.touches;
|
||||||
@@ -324,7 +324,7 @@ class PageSidebar extends Component {
|
|||||||
transition: 'none',
|
transition: 'none',
|
||||||
transform
|
transform
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onTouchEnd = (event) => {
|
onTouchEnd = (event) => {
|
||||||
const touches = event.changedTouches;
|
const touches = event.changedTouches;
|
||||||
@@ -344,16 +344,16 @@ class PageSidebar extends Component {
|
|||||||
|
|
||||||
this._touchStartX = null;
|
this._touchStartX = null;
|
||||||
this._touchStartY = null;
|
this._touchStartY = null;
|
||||||
}
|
};
|
||||||
|
|
||||||
onTouchCancel = (event) => {
|
onTouchCancel = (event) => {
|
||||||
this._touchStartX = null;
|
this._touchStartX = null;
|
||||||
this._touchStartY = null;
|
this._touchStartY = null;
|
||||||
}
|
};
|
||||||
|
|
||||||
onItemPress = () => {
|
onItemPress = () => {
|
||||||
this.props.onSidebarVisibleChange(false);
|
this.props.onSidebarVisibleChange(false);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class PageSidebarItem extends Component {
|
|||||||
if (isChildItem || !isParentItem) {
|
if (isChildItem || !isParentItem) {
|
||||||
onPress();
|
onPress();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ class PageToolbarSection extends Component {
|
|||||||
isMeasured: true,
|
isMeasured: true,
|
||||||
width
|
width
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class OverlayScroller extends Component {
|
|||||||
if (ref) {
|
if (ref) {
|
||||||
this.props.registerScroller(ref.view);
|
this.props.registerScroller(ref.view);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
_renderThumb = (props) => {
|
_renderThumb = (props) => {
|
||||||
return (
|
return (
|
||||||
@@ -50,7 +50,7 @@ class OverlayScroller extends Component {
|
|||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
_renderTrackHorizontal = ({ style, props }) => {
|
_renderTrackHorizontal = ({ style, props }) => {
|
||||||
const finalStyle = {
|
const finalStyle = {
|
||||||
@@ -69,7 +69,7 @@ class OverlayScroller extends Component {
|
|||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
_renderTrackVertical = ({ style, props }) => {
|
_renderTrackVertical = ({ style, props }) => {
|
||||||
const finalStyle = {
|
const finalStyle = {
|
||||||
@@ -88,7 +88,7 @@ class OverlayScroller extends Component {
|
|||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
_renderView = (props) => {
|
_renderView = (props) => {
|
||||||
return (
|
return (
|
||||||
@@ -97,18 +97,18 @@ class OverlayScroller extends Component {
|
|||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listers
|
// Listers
|
||||||
|
|
||||||
onScrollStart = () => {
|
onScrollStart = () => {
|
||||||
this._isScrolling = true;
|
this._isScrolling = true;
|
||||||
}
|
};
|
||||||
|
|
||||||
onScrollStop = () => {
|
onScrollStop = () => {
|
||||||
this._isScrolling = false;
|
this._isScrolling = false;
|
||||||
}
|
};
|
||||||
|
|
||||||
onScroll = (event) => {
|
onScroll = (event) => {
|
||||||
const {
|
const {
|
||||||
@@ -122,7 +122,7 @@ class OverlayScroller extends Component {
|
|||||||
if (onScroll) {
|
if (onScroll) {
|
||||||
onScroll({ scrollTop, scrollLeft });
|
onScroll({ scrollTop, scrollLeft });
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class Scroller extends Component {
|
|||||||
this._scroller = ref;
|
this._scroller = ref;
|
||||||
|
|
||||||
this.props.registerScroller(ref);
|
this.props.registerScroller(ref);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ class SignalRConnector extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
console.error(`signalR: Unable to find handler for ${name}`);
|
console.error(`signalR: Unable to find handler for ${name}`);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleCommand = (body) => {
|
handleCommand = (body) => {
|
||||||
if (body.action === 'sync') {
|
if (body.action === 'sync') {
|
||||||
@@ -158,36 +158,36 @@ class SignalRConnector extends Component {
|
|||||||
} else {
|
} else {
|
||||||
this.props.dispatchUpdateCommand(resource);
|
this.props.dispatchUpdateCommand(resource);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHealth = () => {
|
handleHealth = () => {
|
||||||
this.props.dispatchFetchHealth();
|
this.props.dispatchFetchHealth();
|
||||||
}
|
};
|
||||||
|
|
||||||
handleIndexerstatus = () => {
|
handleIndexerstatus = () => {
|
||||||
this.props.dispatchFetchIndexerStatus();
|
this.props.dispatchFetchIndexerStatus();
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMovie = (body) => {
|
handleIndexer = (body) => {
|
||||||
const action = body.action;
|
const action = body.action;
|
||||||
const section = 'movies';
|
const section = 'indexers';
|
||||||
|
|
||||||
if (action === 'updated') {
|
if (action === 'updated') {
|
||||||
this.props.dispatchUpdateItem({ section, ...body.resource });
|
this.props.dispatchUpdateItem({ section, ...body.resource });
|
||||||
} else if (action === 'deleted') {
|
} else if (action === 'deleted') {
|
||||||
this.props.dispatchRemoveItem({ section, id: body.resource.id });
|
this.props.dispatchRemoveItem({ section, id: body.resource.id });
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleVersion = (body) => {
|
handleVersion = (body) => {
|
||||||
const version = body.version;
|
const version = body.version;
|
||||||
|
|
||||||
this.props.dispatchSetVersion({ version });
|
this.props.dispatchSetVersion({ version });
|
||||||
}
|
};
|
||||||
|
|
||||||
handleSystemTask = () => {
|
handleSystemTask = () => {
|
||||||
this.props.dispatchFetchCommands();
|
this.props.dispatchFetchCommands();
|
||||||
}
|
};
|
||||||
|
|
||||||
handleTag = (body) => {
|
handleTag = (body) => {
|
||||||
if (body.action === 'sync') {
|
if (body.action === 'sync') {
|
||||||
@@ -195,7 +195,7 @@ class SignalRConnector extends Component {
|
|||||||
this.props.dispatchFetchTagDetails();
|
this.props.dispatchFetchTagDetails();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
@@ -210,7 +210,7 @@ class SignalRConnector extends Component {
|
|||||||
isDisconnected: false,
|
isDisconnected: false,
|
||||||
isRestarting: false
|
isRestarting: false
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onStart = () => {
|
onStart = () => {
|
||||||
console.debug('[signalR] connected');
|
console.debug('[signalR] connected');
|
||||||
@@ -221,11 +221,11 @@ class SignalRConnector extends Component {
|
|||||||
isDisconnected: false,
|
isDisconnected: false,
|
||||||
isRestarting: false
|
isRestarting: false
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onReconnecting = () => {
|
onReconnecting = () => {
|
||||||
this.props.dispatchSetAppValue({ isReconnecting: true });
|
this.props.dispatchSetAppValue({ isReconnecting: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
onReconnected = () => {
|
onReconnected = () => {
|
||||||
|
|
||||||
@@ -247,17 +247,17 @@ class SignalRConnector extends Component {
|
|||||||
dispatchFetchIndexers();
|
dispatchFetchIndexers();
|
||||||
dispatchFetchCommands();
|
dispatchFetchCommands();
|
||||||
repopulatePage();
|
repopulatePage();
|
||||||
}
|
};
|
||||||
|
|
||||||
onClose = () => {
|
onClose = () => {
|
||||||
console.debug('[signalR] connection closed');
|
console.debug('[signalR] connection closed');
|
||||||
}
|
};
|
||||||
|
|
||||||
onReceiveMessage = (message) => {
|
onReceiveMessage = (message) => {
|
||||||
console.debug('[signalR] received', message.name, message.body);
|
console.debug('[signalR] received', message.name, message.body);
|
||||||
|
|
||||||
this.handleMessage(message);
|
this.handleMessage(message);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class TableSelectCell extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onSelectedChange({ id, value, shiftKey });
|
onSelectedChange({ id, value, shiftKey });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ class VirtualTableSelectCell extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
onSelectedChange({ id, value, shiftKey });
|
onSelectedChange({ id, value, shiftKey });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class TableHeaderCell extends Component {
|
|||||||
} else {
|
} else {
|
||||||
this.props.onSortPress(name);
|
this.props.onSortPress(name);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ class TableOptionsModal extends Component {
|
|||||||
pageSize: value,
|
pageSize: value,
|
||||||
pageSizeError
|
pageSizeError
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
onVisibleChange = ({ name, value }) => {
|
onVisibleChange = ({ name, value }) => {
|
||||||
const columns = _.cloneDeep(this.props.columns);
|
const columns = _.cloneDeep(this.props.columns);
|
||||||
@@ -71,7 +71,7 @@ class TableOptionsModal extends Component {
|
|||||||
column.isVisible = value;
|
column.isVisible = value;
|
||||||
|
|
||||||
this.props.onTableOptionChange({ columns });
|
this.props.onTableOptionChange({ columns });
|
||||||
}
|
};
|
||||||
|
|
||||||
onColumnDragMove = (dragIndex, dropIndex) => {
|
onColumnDragMove = (dragIndex, dropIndex) => {
|
||||||
if (this.state.dragIndex !== dragIndex || this.state.dropIndex !== dropIndex) {
|
if (this.state.dragIndex !== dragIndex || this.state.dropIndex !== dropIndex) {
|
||||||
@@ -80,7 +80,7 @@ class TableOptionsModal extends Component {
|
|||||||
dropIndex
|
dropIndex
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onColumnDragEnd = ({ id }, didDrop) => {
|
onColumnDragEnd = ({ id }, didDrop) => {
|
||||||
const {
|
const {
|
||||||
@@ -100,7 +100,7 @@ class TableOptionsModal extends Component {
|
|||||||
dragIndex: null,
|
dragIndex: null,
|
||||||
dropIndex: null
|
dropIndex: null
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -20,11 +20,11 @@ class TableOptionsModalWrapper extends Component {
|
|||||||
|
|
||||||
onTableOptionsPress = () => {
|
onTableOptionsPress = () => {
|
||||||
this.setState({ isTableOptionsModalOpen: true });
|
this.setState({ isTableOptionsModalOpen: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
onTableOptionsModalClose = () => {
|
onTableOptionsModalClose = () => {
|
||||||
this.setState({ isTableOptionsModalOpen: false });
|
this.setState({ isTableOptionsModalOpen: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -26,16 +26,16 @@ class TablePager extends Component {
|
|||||||
|
|
||||||
onOpenPageSelectClick = () => {
|
onOpenPageSelectClick = () => {
|
||||||
this.setState({ isShowingPageSelect: true });
|
this.setState({ isShowingPageSelect: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
onPageSelect = ({ value: page }) => {
|
onPageSelect = ({ value: page }) => {
|
||||||
this.setState({ isShowingPageSelect: false });
|
this.setState({ isShowingPageSelect: false });
|
||||||
this.props.onPageSelect(parseInt(page));
|
this.props.onPageSelect(parseInt(page));
|
||||||
}
|
};
|
||||||
|
|
||||||
onPageSelectBlur = () => {
|
onPageSelectBlur = () => {
|
||||||
this.setState({ isShowingPageSelect: false });
|
this.setState({ isShowingPageSelect: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class VirtualTable extends Component {
|
|||||||
|
|
||||||
setGridRef = (ref) => {
|
setGridRef = (ref) => {
|
||||||
this._grid = ref;
|
this._grid = ref;
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
@@ -84,7 +84,7 @@ class VirtualTable extends Component {
|
|||||||
this.setState({
|
this.setState({
|
||||||
width
|
width
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class VirtualTableHeaderCell extends Component {
|
|||||||
} else {
|
} else {
|
||||||
this.props.onSortPress(name);
|
this.props.onSortPress(name);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -80,20 +80,20 @@ class Tooltip extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
|
|
||||||
onMeasure = ({ width }) => {
|
onMeasure = ({ width }) => {
|
||||||
this.setState({ width });
|
this.setState({ width });
|
||||||
}
|
};
|
||||||
|
|
||||||
onClick = () => {
|
onClick = () => {
|
||||||
if (isMobileUtil()) {
|
if (isMobileUtil()) {
|
||||||
this.setState({ isOpen: !this.state.isOpen });
|
this.setState({ isOpen: !this.state.isOpen });
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onMouseEnter = () => {
|
onMouseEnter = () => {
|
||||||
if (this._closeTimeout) {
|
if (this._closeTimeout) {
|
||||||
@@ -101,13 +101,13 @@ class Tooltip extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.setState({ isOpen: true });
|
this.setState({ isOpen: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
onMouseLeave = () => {
|
onMouseLeave = () => {
|
||||||
this._closeTimeout = setTimeout(() => {
|
this._closeTimeout = setTimeout(() => {
|
||||||
this.setState({ isOpen: false });
|
this.setState({ isOpen: false });
|
||||||
}, 100);
|
}, 100);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -64,12 +64,12 @@ function keyboardShortcuts(WrappedComponent) {
|
|||||||
bindShortcut = (key, callback, options = {}) => {
|
bindShortcut = (key, callback, options = {}) => {
|
||||||
this._mousetrap.bind(key, callback);
|
this._mousetrap.bind(key, callback);
|
||||||
this._mousetrapBindings[key] = options;
|
this._mousetrapBindings[key] = options;
|
||||||
}
|
};
|
||||||
|
|
||||||
unbindShortcut = (key) => {
|
unbindShortcut = (key) => {
|
||||||
delete this._mousetrapBindings[key];
|
delete this._mousetrapBindings[key];
|
||||||
this._mousetrap.unbind(key);
|
this._mousetrap.unbind(key);
|
||||||
}
|
};
|
||||||
|
|
||||||
unbindAllShortcuts = () => {
|
unbindAllShortcuts = () => {
|
||||||
const keys = Object.keys(this._mousetrapBindings);
|
const keys = Object.keys(this._mousetrapBindings);
|
||||||
@@ -83,7 +83,7 @@ function keyboardShortcuts(WrappedComponent) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this._mousetrapBindings = {};
|
this._mousetrapBindings = {};
|
||||||
}
|
};
|
||||||
|
|
||||||
stopCallback = (event, element, combo) => {
|
stopCallback = (event, element, combo) => {
|
||||||
const binding = this._mousetrapBindings[combo];
|
const binding = this._mousetrapBindings[combo];
|
||||||
@@ -98,7 +98,7 @@ function keyboardShortcuts(WrappedComponent) {
|
|||||||
element.tagName === 'TEXTAREA' ||
|
element.tagName === 'TEXTAREA' ||
|
||||||
(element.contentEditable && element.contentEditable === 'true')
|
(element.contentEditable && element.contentEditable === 'true')
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -22,10 +22,12 @@ import {
|
|||||||
import {
|
import {
|
||||||
faArrowCircleLeft as fasArrowCircleLeft,
|
faArrowCircleLeft as fasArrowCircleLeft,
|
||||||
faArrowCircleRight as fasArrowCircleRight,
|
faArrowCircleRight as fasArrowCircleRight,
|
||||||
|
faAsterisk as fasAsterisk,
|
||||||
faBackward as fasBackward,
|
faBackward as fasBackward,
|
||||||
faBan as fasBan,
|
faBan as fasBan,
|
||||||
faBars as fasBars,
|
faBars as fasBars,
|
||||||
faBolt as fasBolt,
|
faBolt as fasBolt,
|
||||||
|
faBook as fasBook,
|
||||||
faBookmark as fasBookmark,
|
faBookmark as fasBookmark,
|
||||||
faBookReader as fasBookReader,
|
faBookReader as fasBookReader,
|
||||||
faBroadcastTower as fasBroadcastTower,
|
faBroadcastTower as fasBroadcastTower,
|
||||||
@@ -74,6 +76,7 @@ import {
|
|||||||
faLock as fasLock,
|
faLock as fasLock,
|
||||||
faMedkit as fasMedkit,
|
faMedkit as fasMedkit,
|
||||||
faMinus as fasMinus,
|
faMinus as fasMinus,
|
||||||
|
faMusic as fasMusic,
|
||||||
faPause as fasPause,
|
faPause as fasPause,
|
||||||
faPlay as fasPlay,
|
faPlay as fasPlay,
|
||||||
faPlus as fasPlus,
|
faPlus as fasPlus,
|
||||||
@@ -104,6 +107,7 @@ import {
|
|||||||
faTimes as fasTimes,
|
faTimes as fasTimes,
|
||||||
faTimesCircle as fasTimesCircle,
|
faTimesCircle as fasTimesCircle,
|
||||||
faTrashAlt as fasTrashAlt,
|
faTrashAlt as fasTrashAlt,
|
||||||
|
faTv as fasTv,
|
||||||
faUser as fasUser,
|
faUser as fasUser,
|
||||||
faUserPlus as fasUserPlus,
|
faUserPlus as fasUserPlus,
|
||||||
faVial as fasVial,
|
faVial as fasVial,
|
||||||
@@ -121,7 +125,9 @@ export const ADVANCED_SETTINGS = fasCog;
|
|||||||
export const ANNOUNCED = fasBullhorn;
|
export const ANNOUNCED = fasBullhorn;
|
||||||
export const ARROW_LEFT = fasArrowCircleLeft;
|
export const ARROW_LEFT = fasArrowCircleLeft;
|
||||||
export const ARROW_RIGHT = fasArrowCircleRight;
|
export const ARROW_RIGHT = fasArrowCircleRight;
|
||||||
|
export const AUDIO = fasMusic;
|
||||||
export const BACKUP = farFileArchive;
|
export const BACKUP = farFileArchive;
|
||||||
|
export const BOOK = fasBook;
|
||||||
export const BUG = fasBug;
|
export const BUG = fasBug;
|
||||||
export const CALENDAR = fasCalendarAlt;
|
export const CALENDAR = fasCalendarAlt;
|
||||||
export const CALENDAR_O = farCalendar;
|
export const CALENDAR_O = farCalendar;
|
||||||
@@ -158,6 +164,7 @@ export const FILTER = fasFilter;
|
|||||||
export const FLAG = fasFlag;
|
export const FLAG = fasFlag;
|
||||||
export const FOLDER = farFolder;
|
export const FOLDER = farFolder;
|
||||||
export const FOLDER_OPEN = fasFolderOpen;
|
export const FOLDER_OPEN = fasFolderOpen;
|
||||||
|
export const FOOTNOTE = fasAsterisk;
|
||||||
export const GENRE = fasTheaterMasks;
|
export const GENRE = fasTheaterMasks;
|
||||||
export const GROUP = farObjectGroup;
|
export const GROUP = farObjectGroup;
|
||||||
export const HEALTH = fasMedkit;
|
export const HEALTH = fasMedkit;
|
||||||
@@ -220,6 +227,7 @@ export const TAGS = fasTags;
|
|||||||
export const TBA = fasQuestionCircle;
|
export const TBA = fasQuestionCircle;
|
||||||
export const TEST = fasVial;
|
export const TEST = fasVial;
|
||||||
export const TRANSLATE = fasLanguage;
|
export const TRANSLATE = fasLanguage;
|
||||||
|
export const TV = fasTv;
|
||||||
export const UNGROUP = farObjectUngroup;
|
export const UNGROUP = farObjectUngroup;
|
||||||
export const UNKNOWN = fasQuestion;
|
export const UNKNOWN = fasQuestion;
|
||||||
export const UNMONITORED = farBookmark;
|
export const UNMONITORED = farBookmark;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import DescriptionList from 'Components/DescriptionList/DescriptionList';
|
import DescriptionList from 'Components/DescriptionList/DescriptionList';
|
||||||
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
|
import DescriptionListItem from 'Components/DescriptionList/DescriptionListItem';
|
||||||
|
import Link from 'Components/Link/Link';
|
||||||
import translate from 'Utilities/String/translate';
|
import translate from 'Utilities/String/translate';
|
||||||
import styles from './HistoryDetails.css';
|
import styles from './HistoryDetails.css';
|
||||||
|
|
||||||
@@ -17,7 +18,8 @@ function HistoryDetails(props) {
|
|||||||
query,
|
query,
|
||||||
queryResults,
|
queryResults,
|
||||||
categories,
|
categories,
|
||||||
source
|
source,
|
||||||
|
url
|
||||||
} = data;
|
} = data;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -59,6 +61,14 @@ function HistoryDetails(props) {
|
|||||||
data={source}
|
data={source}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!!data &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title={'Url'}
|
||||||
|
data={url ? <Link to={url}>{translate('Link')}</Link> : '-'}
|
||||||
|
/>
|
||||||
|
}
|
||||||
</DescriptionList>
|
</DescriptionList>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -66,7 +76,8 @@ function HistoryDetails(props) {
|
|||||||
if (eventType === 'releaseGrabbed') {
|
if (eventType === 'releaseGrabbed') {
|
||||||
const {
|
const {
|
||||||
source,
|
source,
|
||||||
title
|
title,
|
||||||
|
url
|
||||||
} = data;
|
} = data;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -94,6 +105,14 @@ function HistoryDetails(props) {
|
|||||||
data={title ? title : '-'}
|
data={title ? title : '-'}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!!data &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title={'Url'}
|
||||||
|
data={url ? <Link to={url}>{translate('Link')}</Link> : '-'}
|
||||||
|
/>
|
||||||
|
}
|
||||||
</DescriptionList>
|
</DescriptionList>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,16 +35,16 @@ class History extends Component {
|
|||||||
|
|
||||||
onClearHistoryPress = () => {
|
onClearHistoryPress = () => {
|
||||||
this.setState({ isClearHistoryModalOpen: true });
|
this.setState({ isClearHistoryModalOpen: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
onClearHistoryModalClose = () => {
|
onClearHistoryModalClose = () => {
|
||||||
this.setState({ isClearHistoryModalOpen: false });
|
this.setState({ isClearHistoryModalOpen: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
onConfirmClearHistory = () => {
|
onConfirmClearHistory = () => {
|
||||||
this.setState({ isClearHistoryModalOpen: false });
|
this.setState({ isClearHistoryModalOpen: false });
|
||||||
this.props.onClearHistoryPress();
|
this.props.onClearHistoryPress();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -69,42 +69,42 @@ class HistoryConnector extends Component {
|
|||||||
|
|
||||||
repopulate = () => {
|
repopulate = () => {
|
||||||
this.props.fetchHistory();
|
this.props.fetchHistory();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
|
|
||||||
onFirstPagePress = () => {
|
onFirstPagePress = () => {
|
||||||
this.props.gotoHistoryFirstPage();
|
this.props.gotoHistoryFirstPage();
|
||||||
}
|
};
|
||||||
|
|
||||||
onPreviousPagePress = () => {
|
onPreviousPagePress = () => {
|
||||||
this.props.gotoHistoryPreviousPage();
|
this.props.gotoHistoryPreviousPage();
|
||||||
}
|
};
|
||||||
|
|
||||||
onNextPagePress = () => {
|
onNextPagePress = () => {
|
||||||
this.props.gotoHistoryNextPage();
|
this.props.gotoHistoryNextPage();
|
||||||
}
|
};
|
||||||
|
|
||||||
onLastPagePress = () => {
|
onLastPagePress = () => {
|
||||||
this.props.gotoHistoryLastPage();
|
this.props.gotoHistoryLastPage();
|
||||||
}
|
};
|
||||||
|
|
||||||
onPageSelect = (page) => {
|
onPageSelect = (page) => {
|
||||||
this.props.gotoHistoryPage({ page });
|
this.props.gotoHistoryPage({ page });
|
||||||
}
|
};
|
||||||
|
|
||||||
onSortPress = (sortKey) => {
|
onSortPress = (sortKey) => {
|
||||||
this.props.setHistorySort({ sortKey });
|
this.props.setHistorySort({ sortKey });
|
||||||
}
|
};
|
||||||
|
|
||||||
onFilterSelect = (selectedFilterKey) => {
|
onFilterSelect = (selectedFilterKey) => {
|
||||||
this.props.setHistoryFilter({ selectedFilterKey });
|
this.props.setHistoryFilter({ selectedFilterKey });
|
||||||
}
|
};
|
||||||
|
|
||||||
onClearHistoryPress = () => {
|
onClearHistoryPress = () => {
|
||||||
this.props.executeCommand({ name: commandNames.CLEAR_HISTORY });
|
this.props.executeCommand({ name: commandNames.CLEAR_HISTORY });
|
||||||
}
|
};
|
||||||
|
|
||||||
onTableOptionChange = (payload) => {
|
onTableOptionChange = (payload) => {
|
||||||
this.props.setHistoryTableOption(payload);
|
this.props.setHistoryTableOption(payload);
|
||||||
@@ -112,7 +112,7 @@ class HistoryConnector extends Component {
|
|||||||
if (payload.pageSize) {
|
if (payload.pageSize) {
|
||||||
this.props.gotoHistoryFirstPage();
|
this.props.gotoHistoryFirstPage();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ class HistoryOptions extends Component {
|
|||||||
this.setState(setting, () => {
|
this.setState(setting, () => {
|
||||||
dispatchSaveGeneralSettings(setting);
|
dispatchSaveGeneralSettings(setting);
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -52,15 +52,15 @@ class HistoryRow extends Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.props.onSearchPress(data.query, indexer.id, categories);
|
this.props.onSearchPress(data.query, indexer.id, categories);
|
||||||
}
|
};
|
||||||
|
|
||||||
onDetailsPress = () => {
|
onDetailsPress = () => {
|
||||||
this.setState({ isDetailsModalOpen: true });
|
this.setState({ isDetailsModalOpen: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
onDetailsModalClose = () => {
|
onDetailsModalClose = () => {
|
||||||
this.setState({ isDetailsModalOpen: false });
|
this.setState({ isDetailsModalOpen: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
@@ -247,6 +247,21 @@ class HistoryRow extends Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (name === 'grabTitle') {
|
||||||
|
return (
|
||||||
|
<TableRowCell
|
||||||
|
key={name}
|
||||||
|
className={styles.indexer}
|
||||||
|
>
|
||||||
|
{
|
||||||
|
data.title ?
|
||||||
|
data.title :
|
||||||
|
null
|
||||||
|
}
|
||||||
|
</TableRowCell>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (name === 'categories') {
|
if (name === 'categories') {
|
||||||
return (
|
return (
|
||||||
<TableRowCell
|
<TableRowCell
|
||||||
|
|||||||
@@ -51,11 +51,11 @@ class HistoryRowConnector extends Component {
|
|||||||
onSearchPress = (term, indexerId, categories) => {
|
onSearchPress = (term, indexerId, categories) => {
|
||||||
this.props.setSearchDefault({ searchQuery: term, searchIndexerIds: [indexerId], searchCategories: categories });
|
this.props.setSearchDefault({ searchQuery: term, searchIndexerIds: [indexerId], searchCategories: categories });
|
||||||
this.props.push(`${window.Prowlarr.urlBase}/search`);
|
this.props.push(`${window.Prowlarr.urlBase}/search`);
|
||||||
}
|
};
|
||||||
|
|
||||||
onMarkAsFailedPress = () => {
|
onMarkAsFailedPress = () => {
|
||||||
this.props.markAsFailed({ id: this.props.id });
|
this.props.markAsFailed({ id: this.props.id });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
composes: input from '~Components/Form/TextInput.css';
|
composes: input from '~Components/Form/TextInput.css';
|
||||||
|
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
margin-bottom: 20px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.alert {
|
.alert {
|
||||||
@@ -28,3 +28,46 @@
|
|||||||
.scroller {
|
.scroller {
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.filterRow {
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filterContainer {
|
||||||
|
display: flex;
|
||||||
|
align-items: stretch;
|
||||||
|
flex: 1;
|
||||||
|
flex-direction: column;
|
||||||
|
margin-right: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filterContainer:last-child {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filterLabel {
|
||||||
|
margin-bottom: 3px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: $breakpointSmall) {
|
||||||
|
.alert {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filterRow {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filterContainer {
|
||||||
|
margin-right: 0;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scroller {
|
||||||
|
margin-right: -30px;
|
||||||
|
margin-bottom: -30px;
|
||||||
|
margin-left: -30px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import Alert from 'Components/Alert';
|
import Alert from 'Components/Alert';
|
||||||
|
import EnhancedSelectInput from 'Components/Form/EnhancedSelectInput';
|
||||||
import TextInput from 'Components/Form/TextInput';
|
import TextInput from 'Components/Form/TextInput';
|
||||||
import Button from 'Components/Link/Button';
|
import Button from 'Components/Link/Button';
|
||||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||||
@@ -44,6 +45,17 @@ const columns = [
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const protocols = [
|
||||||
|
{
|
||||||
|
key: 'torrent',
|
||||||
|
value: 'torrent'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'usenet',
|
||||||
|
value: 'nzb'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
class AddIndexerModalContent extends Component {
|
class AddIndexerModalContent extends Component {
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -53,7 +65,10 @@ class AddIndexerModalContent extends Component {
|
|||||||
super(props, context);
|
super(props, context);
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
filter: ''
|
filter: '',
|
||||||
|
filterProtocols: [],
|
||||||
|
filterLanguages: [],
|
||||||
|
filterPrivacyLevels: []
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,7 +77,7 @@ class AddIndexerModalContent extends Component {
|
|||||||
|
|
||||||
onFilterChange = ({ value }) => {
|
onFilterChange = ({ value }) => {
|
||||||
this.setState({ filter: value });
|
this.setState({ filter: value });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
@@ -80,8 +95,35 @@ class AddIndexerModalContent extends Component {
|
|||||||
onModalClose
|
onModalClose
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
const filter = this.state.filter;
|
const languages = Array.from(new Set(indexers.map(({ language }) => language)))
|
||||||
const filterLower = filter.toLowerCase();
|
.sort((a, b) => a.localeCompare(b))
|
||||||
|
.map((language) => ({ key: language, value: language }));
|
||||||
|
|
||||||
|
const privacyLevels = Array.from(new Set(indexers.map(({ privacy }) => privacy)))
|
||||||
|
.sort((a, b) => a.localeCompare(b))
|
||||||
|
.map((privacy) => ({ key: privacy, value: privacy }));
|
||||||
|
|
||||||
|
const filteredIndexers = indexers.filter((indexer) => {
|
||||||
|
const { filter, filterProtocols, filterLanguages, filterPrivacyLevels } = this.state;
|
||||||
|
|
||||||
|
if (!indexer.name.toLowerCase().includes(filter.toLocaleLowerCase())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterProtocols.length && !filterProtocols.includes(indexer.protocol)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterLanguages.length && !filterLanguages.includes(indexer.language)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterPrivacyLevels.length && !filterPrivacyLevels.includes(indexer.privacy)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
const errorMessage = getErrorMessage(error, 'Unable to load indexers');
|
const errorMessage = getErrorMessage(error, 'Unable to load indexers');
|
||||||
|
|
||||||
@@ -99,11 +141,43 @@ class AddIndexerModalContent extends Component {
|
|||||||
className={styles.filterInput}
|
className={styles.filterInput}
|
||||||
placeholder={translate('FilterPlaceHolder')}
|
placeholder={translate('FilterPlaceHolder')}
|
||||||
name="filter"
|
name="filter"
|
||||||
value={filter}
|
value={this.state.filter}
|
||||||
autoFocus={true}
|
autoFocus={true}
|
||||||
onChange={this.onFilterChange}
|
onChange={this.onFilterChange}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<div className={styles.filterRow}>
|
||||||
|
<div className={styles.filterContainer}>
|
||||||
|
<label className={styles.filterLabel}>Protocol</label>
|
||||||
|
<EnhancedSelectInput
|
||||||
|
name="indexerProtocols"
|
||||||
|
value={this.state.filterProtocols}
|
||||||
|
values={protocols}
|
||||||
|
onChange={({ value }) => this.setState({ filterProtocols: value })}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.filterContainer}>
|
||||||
|
<label className={styles.filterLabel}>Language</label>
|
||||||
|
<EnhancedSelectInput
|
||||||
|
name="indexerLanguages"
|
||||||
|
value={this.state.filterLanguages}
|
||||||
|
values={languages}
|
||||||
|
onChange={({ value }) => this.setState({ filterLanguages: value })}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className={styles.filterContainer}>
|
||||||
|
<label className={styles.filterLabel}>Privacy</label>
|
||||||
|
<EnhancedSelectInput
|
||||||
|
name="indexerPrivacyLevels"
|
||||||
|
value={this.state.filterPrivacyLevels}
|
||||||
|
values={privacyLevels}
|
||||||
|
onChange={({ value }) => this.setState({ filterPrivacyLevels: value })}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<Alert
|
<Alert
|
||||||
kind={kinds.INFO}
|
kind={kinds.INFO}
|
||||||
className={styles.alert}
|
className={styles.alert}
|
||||||
@@ -133,18 +207,14 @@ class AddIndexerModalContent extends Component {
|
|||||||
>
|
>
|
||||||
<TableBody>
|
<TableBody>
|
||||||
{
|
{
|
||||||
indexers.map((indexer) => {
|
filteredIndexers.map((indexer) => (
|
||||||
return indexer.name.toLowerCase().includes(filterLower) ?
|
<SelectIndexerRow
|
||||||
(
|
key={indexer.name}
|
||||||
<SelectIndexerRow
|
implementation={indexer.implementation}
|
||||||
key={indexer.name}
|
{...indexer}
|
||||||
implementation={indexer.implementation}
|
onIndexerSelect={onIndexerSelect}
|
||||||
{...indexer}
|
/>
|
||||||
onIndexerSelect={onIndexerSelect}
|
))
|
||||||
/>
|
|
||||||
) :
|
|
||||||
null;
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
</TableBody>
|
</TableBody>
|
||||||
</Table> :
|
</Table> :
|
||||||
|
|||||||
@@ -52,11 +52,11 @@ class AddIndexerModalContentConnector extends Component {
|
|||||||
onIndexerSelect = ({ implementation, name }) => {
|
onIndexerSelect = ({ implementation, name }) => {
|
||||||
this.props.selectIndexerSchema({ implementation, name });
|
this.props.selectIndexerSchema({ implementation, name });
|
||||||
this.props.onModalClose({ indexerSelected: true });
|
this.props.onModalClose({ indexerSelected: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
onSortPress = (sortKey, sortDirection) => {
|
onSortPress = (sortKey, sortDirection) => {
|
||||||
this.props.setIndexerSchemaSort({ sortKey, sortDirection });
|
this.props.setIndexerSchemaSort({ sortKey, sortDirection });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ class AddIndexerPresetMenuItem extends Component {
|
|||||||
name,
|
name,
|
||||||
implementation
|
implementation
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ class SelectIndexerRow extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
this.props.onIndexerSelect({ implementation, name });
|
this.props.onIndexerSelect({ implementation, name });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ class DeleteIndexerModalContent extends Component {
|
|||||||
|
|
||||||
onDeleteFilesChange = ({ value }) => {
|
onDeleteFilesChange = ({ value }) => {
|
||||||
this.setState({ deleteFiles: value });
|
this.setState({ deleteFiles: value });
|
||||||
}
|
};
|
||||||
|
|
||||||
onAddImportExclusionChange = ({ value }) => {
|
onAddImportExclusionChange = ({ value }) => {
|
||||||
this.setState({ addImportExclusion: value });
|
this.setState({ addImportExclusion: value });
|
||||||
}
|
};
|
||||||
|
|
||||||
onDeleteMovieConfirmed = () => {
|
onDeleteMovieConfirmed = () => {
|
||||||
const deleteFiles = this.state.deleteFiles;
|
const deleteFiles = this.state.deleteFiles;
|
||||||
@@ -39,7 +39,7 @@ class DeleteIndexerModalContent extends Component {
|
|||||||
|
|
||||||
this.setState({ deleteFiles: false, addImportExclusion: false });
|
this.setState({ deleteFiles: false, addImportExclusion: false });
|
||||||
this.props.onDeletePress(deleteFiles, addImportExclusion);
|
this.props.onDeletePress(deleteFiles, addImportExclusion);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ class DeleteIndexerModalContentConnector extends Component {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.props.onModalClose(true);
|
this.props.onModalClose(true);
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user