mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-04-18 21:55:12 -04:00
Compare commits
142 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d2cf060473 | |||
| 3b7b72d4e1 | |||
| 4e69b80a98 | |||
| 0f52258d53 | |||
| 4eadd4cb2f | |||
| 579b8a3d3b | |||
| 849b3de7d3 | |||
| 8855b2846d | |||
| c64addb976 | |||
| fab1304bcd | |||
| bd834fb4d7 | |||
| dcee9582bd | |||
| 89e500edfd | |||
| ea83020714 | |||
| 6d62744667 | |||
| 08c68e26c1 | |||
| 574568e71d | |||
| 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 |
+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,12 +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.***
|
***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.
|
|
||||||
|
|||||||
@@ -4,74 +4,84 @@
|
|||||||
[](https://translate.servarr.com/engage/prowlarr/?utm_source=widget)
|
[](https://translate.servarr.com/engage/prowlarr/?utm_source=widget)
|
||||||
[](https://wiki.servarr.com/prowlarr/installation#docker)
|
[](https://wiki.servarr.com/prowlarr/installation#docker)
|
||||||

|

|
||||||
[](#backers)
|
[](#backers)
|
||||||
[](#sponsors)
|
[](#sponsors)
|
||||||
|
[](#mega-sponsors)
|
||||||
|
|
||||||
Prowlarr is an indexer manager/proxy built on the popular arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports management of both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Lidarr, Mylar3, Radarr, Readarr, and Sonarr offering complete management of your indexers with no per app Indexer setup required (we do it all).
|
Prowlarr is an indexer manager/proxy built on the popular \*arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports management of both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Lidarr, Mylar3, Radarr, Readarr, and Sonarr offering complete management of your indexers with no per app Indexer setup required (we do it all).
|
||||||
|
|
||||||
## Major Features Include:
|
## Major Features Include
|
||||||
- Usenet support for 24 indexers natively, including Headphones VIP, and support for any Newznab compatible indexer via "Generic Newznab"
|
|
||||||
|
- Usenet support for 24 indexers natively, including Headphones VIP
|
||||||
|
- Usenet support for any Newznab compatible indexer via "Generic Newznab"
|
||||||
- Torrent support for over 500 trackers with more added all the time
|
- Torrent support for over 500 trackers with more added all the time
|
||||||
- Torrent support for any Torznab compatible tracker via "Generic Torznab"
|
- Torrent support for any Torznab compatible tracker via "Generic Torznab"
|
||||||
- Indexer Sync to Sonarr/Radarr/Readarr/Lidarr/Mylar3, so no manual configuration of the other applications are required
|
- Support for custom YML definitions via Cardigann that includes JSON and XML parsing
|
||||||
|
- Indexer Sync to Lidarr/Mylar3/Radarr/Readarr/Sonarr, so no manual configuration of the other applications are required
|
||||||
- Indexer history and statistics
|
- Indexer history and statistics
|
||||||
- Manual searching of Trackers & Indexers at a category level
|
- Manual searching of Trackers & Indexers at a category level
|
||||||
- Support for pushing releases directly to your download clients from Prowlarr
|
- Parameter based manual searching
|
||||||
|
- Support for pushing multiple releases at once directly to your download clients from Prowlarr
|
||||||
- Indexer health and status notifications
|
- Indexer health and status notifications
|
||||||
- Per Indexer proxy support (SOCKS4, SOCKS5, HTTP, Flaresolverr)
|
- Per Indexer proxy support (SOCKS4, SOCKS5, HTTP, Flaresolverr)
|
||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
Note: Prowlarr is currently early in life, thus bugs should be expected
|
Note: Prowlarr is currently early in life, thus bugs should be expected
|
||||||
|
|
||||||
|
[](https://wiki.servarr.com/prowlarr)
|
||||||
|
|
||||||
[](https://prowlarr.com/discord)
|
[](https://prowlarr.com/discord)
|
||||||
[](https://www.reddit.com/r/Prowlarr)
|
[](https://www.reddit.com/r/Prowlarr)
|
||||||
|
|
||||||
|
Note: GitHub Issues are for Bugs and Feature Requests Only
|
||||||
|
|
||||||
[](https://github.com/Prowlarr/Prowlarr/issues)
|
[](https://github.com/Prowlarr/Prowlarr/issues)
|
||||||
[](https://wiki.servarr.com/prowlarr)
|
|
||||||
|
|
||||||
## Indexers/Trackers
|
## Indexers & Trackers
|
||||||
|
|
||||||
[Supported Indexers](https://wiki.servarr.com/en/prowlarr/supported-indexers)
|
[](https://wiki.servarr.com/en/prowlarr/supported-indexers)
|
||||||
|
|
||||||
[Indexer Requests](https://requests.prowlarr.com)
|
[](https://requests.prowlarr.com)
|
||||||
- Request or vote on an existing request for a new tracker/indexer
|
|
||||||
|
|
||||||
## Contributors & Developers
|
## Contributors & Developers
|
||||||
|
|
||||||
|
[API Documentation](https://prowlarr.com/docs/api/)
|
||||||
|
|
||||||
|
This project exists thanks to all the people who contribute.
|
||||||
|
|
||||||
- [Contribute (GitHub)](CONTRIBUTING.md)
|
- [Contribute (GitHub)](CONTRIBUTING.md)
|
||||||
- [Contribution (Wiki Article)](https://wiki.servarr.com/prowlarr/contributing)
|
- [Contribution (Wiki Article)](https://wiki.servarr.com/prowlarr/contributing)
|
||||||
- [YML Indexer Defintion (Wiki Article)](https://wiki.servarr.com/prowlarr/cardigann-yml-definition)
|
- [YML Indexer Definition (Wiki Article)](https://wiki.servarr.com/prowlarr/cardigann-yml-definition)
|
||||||
|
|
||||||
This project exists thanks to all the people who contribute.
|
[](https://github.com/Prowlarr/Prowlarr/graphs/contributors)
|
||||||
<a href="https://github.com/Prowlarr/Prowlarr/graphs/contributors"><img src="https://opencollective.com/Prowlarr/contributors.svg?width=890&button=false" /></a>
|
|
||||||
|
|
||||||
## Backers
|
## Backers
|
||||||
|
|
||||||
Thank you to all our backers! 🙏 [Become a backer](https://opencollective.com/Prowlarr#backer)
|
Thank you to all our backers! 🙏 [Become a backer](https://opencollective.com/Prowlarr#backer)
|
||||||
|

|
||||||
<img src="https://opencollective.com/Prowlarr/backers.svg?width=890"></a>
|
|
||||||
|
|
||||||
## Sponsors
|
## Sponsors
|
||||||
|
|
||||||
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor](https://opencollective.com/Prowlarr#sponsor)
|
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor](https://opencollective.com/Prowlarr#sponsor)
|
||||||
|

|
||||||
<img src="https://opencollective.com/Prowlarr/sponsors.svg?width=890"></a>
|
|
||||||
|
|
||||||
## Mega Sponsors
|
## Mega Sponsors
|
||||||
|
|
||||||
<img src="https://opencollective.com/Prowlarr/tiers/mega-sponsor.svg?width=890"></a>
|

|
||||||
|
|
||||||
## JetBrains
|
## JetBrains
|
||||||
|
|
||||||
Thank you to [<img src="/Logo/jetbrains.svg" alt="JetBrains" width="32"> JetBrains](http://www.jetbrains.com/) for providing us with free licenses to their great tools.
|
Thank you to [<img src="/Logo/jetbrains.svg" alt="JetBrains" width="32"> JetBrains](http://www.jetbrains.com/) for providing us with free licenses to their great tools.
|
||||||
|
|
||||||
* [<img src="/Logo/resharper.svg" alt="ReSharper" width="32"> ReSharper](http://www.jetbrains.com/resharper/)
|
- [<img src="/Logo/resharper.svg" alt="ReSharper" width="32"> ReSharper](http://www.jetbrains.com/resharper/)
|
||||||
* [<img src="/Logo/webstorm.svg" alt="WebStorm" width="32"> WebStorm](http://www.jetbrains.com/webstorm/)
|
- [<img src="/Logo/webstorm.svg" alt="WebStorm" width="32"> WebStorm](http://www.jetbrains.com/webstorm/)
|
||||||
* [<img src="/Logo/rider.svg" alt="Rider" width="32"> Rider](http://www.jetbrains.com/rider/)
|
- [<img src="/Logo/rider.svg" alt="Rider" width="32"> Rider](http://www.jetbrains.com/rider/)
|
||||||
* [<img src="/Logo/dottrace.svg" alt="dotTrace" width="32"> dotTrace](http://www.jetbrains.com/dottrace/)
|
- [<img src="/Logo/dottrace.svg" alt="dotTrace" width="32"> dotTrace](http://www.jetbrains.com/dottrace/)
|
||||||
|
|
||||||
### License
|
### License
|
||||||
|
|
||||||
* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
|
- [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
|
||||||
* Copyright 2010-2021
|
- Copyright 2010-2022
|
||||||
|
|
||||||
Icon Credit:
|
Icon Credit - [Box vector created by freepik - www.freepik.com](https://www.freepik.com/vectors/box)
|
||||||
<a href="https://www.freepik.com/vectors/box">Box vector created by freepik - www.freepik.com</a>
|
|
||||||
|
|||||||
+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.7'
|
||||||
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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,15 +158,15 @@ 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();
|
||||||
}
|
};
|
||||||
|
|
||||||
handleIndexer = (body) => {
|
handleIndexer = (body) => {
|
||||||
const action = body.action;
|
const action = body.action;
|
||||||
@@ -177,17 +177,17 @@ class SignalRConnector extends Component {
|
|||||||
} 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
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class EditIndexerModalConnector extends Component {
|
|||||||
this.props.dispatchCancelTestIndexer();
|
this.props.dispatchCancelTestIndexer();
|
||||||
this.props.dispatchCancelSaveIndexer();
|
this.props.dispatchCancelSaveIndexer();
|
||||||
this.props.onModalClose();
|
this.props.onModalClose();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -44,23 +44,23 @@ class EditIndexerModalContentConnector extends Component {
|
|||||||
|
|
||||||
onInputChange = ({ name, value }) => {
|
onInputChange = ({ name, value }) => {
|
||||||
this.props.setIndexerValue({ name, value });
|
this.props.setIndexerValue({ name, value });
|
||||||
}
|
};
|
||||||
|
|
||||||
onFieldChange = ({ name, value }) => {
|
onFieldChange = ({ name, value }) => {
|
||||||
this.props.setIndexerFieldValue({ name, value });
|
this.props.setIndexerFieldValue({ name, value });
|
||||||
}
|
};
|
||||||
|
|
||||||
onSavePress = () => {
|
onSavePress = () => {
|
||||||
this.props.saveIndexer({ id: this.props.id });
|
this.props.saveIndexer({ id: this.props.id });
|
||||||
}
|
};
|
||||||
|
|
||||||
onTestPress = () => {
|
onTestPress = () => {
|
||||||
this.props.testIndexer({ id: this.props.id });
|
this.props.testIndexer({ id: this.props.id });
|
||||||
}
|
};
|
||||||
|
|
||||||
onAdvancedSettingsPress = () => {
|
onAdvancedSettingsPress = () => {
|
||||||
this.props.toggleAdvancedSettings();
|
this.props.toggleAdvancedSettings();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import styles from './DeleteIndexerModalContent.css';
|
|||||||
class DeleteIndexerModalContent extends Component {
|
class DeleteIndexerModalContent extends Component {
|
||||||
onDeleteMovieConfirmed = () => {
|
onDeleteMovieConfirmed = () => {
|
||||||
this.props.onDeleteSelectedPress();
|
this.props.onDeleteSelectedPress();
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// 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