mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-04-17 21:44:48 -04:00
Compare commits
169 Commits
v0.1.2.106
...
http2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa304dcaca | ||
|
|
e04133d34a | ||
|
|
07575ae239 | ||
|
|
8e7acd8946 | ||
|
|
3ecc926298 | ||
|
|
1e532624af | ||
|
|
8a5194e604 | ||
|
|
8a73cf72c2 | ||
|
|
76982c5988 | ||
|
|
b9dfe5e359 | ||
|
|
a5e13ca776 | ||
|
|
e2ddfbff9c | ||
|
|
66b4c7891d | ||
|
|
480a76c290 | ||
|
|
1373ab255d | ||
|
|
1dc00eb445 | ||
|
|
a366bec684 | ||
|
|
ecca6e9f49 | ||
|
|
03db7a9bbd | ||
|
|
9cb04466c1 | ||
|
|
2bae37d0c5 | ||
|
|
0dbd23c52b | ||
|
|
66a6311dcc | ||
|
|
c5b111530c | ||
|
|
77724a50a4 | ||
|
|
22cbd01c57 | ||
|
|
fd55a624a7 | ||
|
|
75984e954e | ||
|
|
3fce120578 | ||
|
|
6e8fb22c71 | ||
|
|
8ec7a4898d | ||
|
|
642848d331 | ||
|
|
c9e6a0339e | ||
|
|
25620e8670 | ||
|
|
5b804e8f3a | ||
|
|
548db6a5cd | ||
|
|
7f28f64cbe | ||
|
|
9bad31af84 | ||
|
|
01c7a05841 | ||
|
|
9859b4a3d9 | ||
|
|
177084fe8b | ||
|
|
c57a91bc64 | ||
|
|
ca67a40c72 | ||
|
|
de7505bbe6 | ||
|
|
97956ce951 | ||
|
|
8a38e124fd | ||
|
|
38fcffe871 | ||
|
|
4c7b5a47d3 | ||
|
|
34597e6ecb | ||
|
|
735be4f467 | ||
|
|
1c737d77fb | ||
|
|
55788ac04d | ||
|
|
d108ab0339 | ||
|
|
5928eea83e | ||
|
|
27898aa3b5 | ||
|
|
5e3322c538 | ||
|
|
80c31e8660 | ||
|
|
46401ee187 | ||
|
|
3610becc64 | ||
|
|
06d9c157d8 | ||
|
|
d0d1f40128 | ||
|
|
383d5464b7 | ||
|
|
62d15536df | ||
|
|
147cdf2cce | ||
|
|
dd27d69e97 | ||
|
|
32fd0911a2 | ||
|
|
0e6ec58a83 | ||
|
|
69f5963f6f | ||
|
|
6ca708f523 | ||
|
|
9e7af8369e | ||
|
|
b05d8c930d | ||
|
|
6b886b938c | ||
|
|
4a7bf39723 | ||
|
|
7fcd320e23 | ||
|
|
88677ce236 | ||
|
|
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 |
@@ -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
|
||||||
|
|||||||
5
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
5
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -63,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
|
||||||
|
|||||||
16
.github/label-actions.yml
vendored
Normal file
16
.github/label-actions.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Configuration for Label Actions - https://github.com/dessant/label-actions
|
||||||
|
|
||||||
|
'Type: Support':
|
||||||
|
comment: >
|
||||||
|
:wave: @{issue-author}, we use the issue tracker exclusively
|
||||||
|
for bug reports and feature requests. However, this issue appears
|
||||||
|
to be a support request. Please hop over onto our [Discord](https://prowlarr.com/discord)
|
||||||
|
or [Subreddit](https://reddit.com/r/prowlarr)
|
||||||
|
close: true
|
||||||
|
|
||||||
|
'Type: Indexer Request':
|
||||||
|
comment: >
|
||||||
|
:wave: @{issue-author}, we use the issue tracker exclusively
|
||||||
|
for bug reports and feature requests. However, this issue appears
|
||||||
|
to be a indexer request. Please use our Indexer request [site](https://requests.prowlarr.com/)
|
||||||
|
close: true
|
||||||
23
.github/workflows/label-actions.yml
vendored
Normal file
23
.github/workflows/label-actions.yml
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
name: 'Label Actions'
|
||||||
|
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [labeled, unlabeled]
|
||||||
|
pull_request:
|
||||||
|
types: [labeled, unlabeled]
|
||||||
|
discussion:
|
||||||
|
types: [labeled, unlabeled]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
discussions: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
action:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: dessant/label-actions@v2
|
||||||
|
with:
|
||||||
|
process-only: 'issues, prs'
|
||||||
21
.github/workflows/support.yml
vendored
21
.github/workflows/support.yml
vendored
@@ -1,21 +0,0 @@
|
|||||||
name: 'Support requests'
|
|
||||||
|
|
||||||
on:
|
|
||||||
issues:
|
|
||||||
types: [labeled, unlabeled, reopened]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
support:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: dessant/support-requests@v2
|
|
||||||
with:
|
|
||||||
github-token: ${{ github.token }}
|
|
||||||
support-label: 'Type: Support'
|
|
||||||
issue-comment: >
|
|
||||||
:wave: @{issue-author}, we use the issue tracker exclusively
|
|
||||||
for bug reports and feature requests. However, this issue appears
|
|
||||||
to be a support request. Please hop over onto our [Discord](https://prowlarr.com/discord)
|
|
||||||
or [Subreddit](https://reddit.com/r/prowlarr)
|
|
||||||
close-issue: true
|
|
||||||
lock-issue: false
|
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -188,6 +188,10 @@ packages.config.md5sum
|
|||||||
**/.idea/**/*.iml
|
**/.idea/**/*.iml
|
||||||
**/.idea/**/contentModel.xml
|
**/.idea/**/contentModel.xml
|
||||||
**/.idea/**/modules.xml
|
**/.idea/**/modules.xml
|
||||||
|
|
||||||
# ignore node_modules symlink
|
# ignore node_modules symlink
|
||||||
node_modules
|
node_modules
|
||||||
node_modules.nosync
|
node_modules.nosync
|
||||||
|
|
||||||
|
# API doc generation
|
||||||
|
.config/
|
||||||
|
|||||||
64
README.md
64
README.md
@@ -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>
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@ variables:
|
|||||||
outputFolder: './_output'
|
outputFolder: './_output'
|
||||||
artifactsFolder: './_artifacts'
|
artifactsFolder: './_artifacts'
|
||||||
testsFolder: './_tests'
|
testsFolder: './_tests'
|
||||||
majorVersion: '0.1.2'
|
majorVersion: '0.1.10'
|
||||||
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:
|
||||||
@@ -29,6 +29,7 @@ pr:
|
|||||||
paths:
|
paths:
|
||||||
exclude:
|
exclude:
|
||||||
- src/NzbDrone.Core/Localization/Core
|
- src/NzbDrone.Core/Localization/Core
|
||||||
|
- src/Prowlarr.API.*/openapi.json
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- stage: Setup
|
- stage: Setup
|
||||||
@@ -111,23 +112,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'))
|
||||||
@@ -163,7 +164,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 +203,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 +250,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 +295,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 +303,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 +311,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 +327,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 +335,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 +343,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
|
||||||
@@ -793,7 +816,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
|
||||||
@@ -802,6 +824,59 @@ stages:
|
|||||||
FORCE_COLOR: 0
|
FORCE_COLOR: 0
|
||||||
YARN_CACHE_FOLDER: $(yarnCacheFolder)
|
YARN_CACHE_FOLDER: $(yarnCacheFolder)
|
||||||
|
|
||||||
|
- job: Api_Docs
|
||||||
|
displayName: API Docs
|
||||||
|
dependsOn: Prepare
|
||||||
|
condition: |
|
||||||
|
and
|
||||||
|
(
|
||||||
|
and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop')),
|
||||||
|
and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0'))
|
||||||
|
)
|
||||||
|
|
||||||
|
pool:
|
||||||
|
vmImage: windows-2019
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- task: UseDotNet@2
|
||||||
|
displayName: 'Install .net core'
|
||||||
|
inputs:
|
||||||
|
version: $(dotnetVersion)
|
||||||
|
- checkout: self
|
||||||
|
submodules: true
|
||||||
|
persistCredentials: true
|
||||||
|
fetchDepth: 1
|
||||||
|
- bash: ./docs.sh Windows
|
||||||
|
displayName: Create openapi.json
|
||||||
|
- bash: |
|
||||||
|
git config --global user.email "development@lidarr.audio"
|
||||||
|
git config --global user.name "Servarr"
|
||||||
|
git checkout -b api-docs
|
||||||
|
git add .
|
||||||
|
if git status | grep -q modified
|
||||||
|
then
|
||||||
|
git commit -am 'Automated API Docs update'
|
||||||
|
git push -f --set-upstream origin api-docs
|
||||||
|
curl -X POST -H "Authorization: token ${GITHUBTOKEN}" -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/prowlarr/prowlarr/pulls -d '{"head":"api-docs","base":"develop","title":"Update API docs"}'
|
||||||
|
else
|
||||||
|
echo "No changes since last run"
|
||||||
|
fi
|
||||||
|
displayName: Commit API Doc Change
|
||||||
|
continueOnError: true
|
||||||
|
env:
|
||||||
|
GITHUBTOKEN: $(githubToken)
|
||||||
|
- task: CopyFiles@2
|
||||||
|
displayName: 'Copy openapi.json to: $(Build.ArtifactStagingDirectory)'
|
||||||
|
inputs:
|
||||||
|
SourceFolder: '$(Build.SourcesDirectory)'
|
||||||
|
Contents: |
|
||||||
|
**/*openapi.json
|
||||||
|
TargetFolder: '$(Build.ArtifactStagingDirectory)/api_docs'
|
||||||
|
- publish: $(Build.ArtifactStagingDirectory)/api_docs
|
||||||
|
artifact: 'APIDocs'
|
||||||
|
displayName: Publish API Docs Bundle
|
||||||
|
condition: and(succeeded(), eq(variables['System.JobAttempt'], '1'))
|
||||||
|
|
||||||
- job: Analyze_Backend
|
- job: Analyze_Backend
|
||||||
displayName: Backend
|
displayName: Backend
|
||||||
dependsOn: Prepare
|
dependsOn: Prepare
|
||||||
@@ -838,8 +913,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')
|
||||||
|
|||||||
54
build.sh
54
build.sh
@@ -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"
|
||||||
|
|||||||
38
docs.sh
Normal file
38
docs.sh
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
PLATFORM=$1
|
||||||
|
|
||||||
|
if [ "$PLATFORM" = "Windows" ]; then
|
||||||
|
RUNTIME="win-x64"
|
||||||
|
elif [ "$PLATFORM" = "Linux" ]; then
|
||||||
|
WHERE="linux-x64"
|
||||||
|
elif [ "$PLATFORM" = "Mac" ]; then
|
||||||
|
WHERE="osx-x64"
|
||||||
|
else
|
||||||
|
echo "Platform must be provided as first arguement: Windows, Linux or Mac"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
outputFolder='_output'
|
||||||
|
testPackageFolder='_tests'
|
||||||
|
|
||||||
|
rm -rf $outputFolder
|
||||||
|
rm -rf $testPackageFolder
|
||||||
|
|
||||||
|
slnFile=src/Prowlarr.sln
|
||||||
|
|
||||||
|
platform=Posix
|
||||||
|
|
||||||
|
dotnet clean $slnFile -c Debug
|
||||||
|
dotnet clean $slnFile -c Release
|
||||||
|
|
||||||
|
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
|
||||||
|
|
||||||
|
dotnet new tool-manifest
|
||||||
|
dotnet tool install --version 6.2.3 Swashbuckle.AspNetCore.Cli
|
||||||
|
|
||||||
|
dotnet tool run swagger tofile --output ./src/Prowlarr.Api.V1/openapi.json "$outputFolder/net6.0/$RUNTIME/prowlarr.console.dll" v1 &
|
||||||
|
|
||||||
|
sleep 10
|
||||||
|
|
||||||
|
kill %1
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -77,7 +77,9 @@ function AppUpdatedModalContent(props) {
|
|||||||
<div>
|
<div>
|
||||||
{
|
{
|
||||||
!update.changes &&
|
!update.changes &&
|
||||||
<div className={styles.maintenance}>Maintenance release</div>
|
<div className={styles.maintenance}>
|
||||||
|
{translate('MaintenanceRelease')}
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -166,7 +166,9 @@ class FilterBuilderModalContent extends Component {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className={styles.label}>Filters</div>
|
<div className={styles.label}>
|
||||||
|
{translate('Filters')}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className={styles.rows}>
|
<div className={styles.rows}>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ function ProviderFieldFormGroup(props) {
|
|||||||
label,
|
label,
|
||||||
helpText,
|
helpText,
|
||||||
helpLink,
|
helpLink,
|
||||||
|
placeholder,
|
||||||
value,
|
value,
|
||||||
type,
|
type,
|
||||||
advanced,
|
advanced,
|
||||||
@@ -100,6 +101,7 @@ function ProviderFieldFormGroup(props) {
|
|||||||
label={label}
|
label={label}
|
||||||
helpText={helpText}
|
helpText={helpText}
|
||||||
helpLink={helpLink}
|
helpLink={helpLink}
|
||||||
|
placeholder={placeholder}
|
||||||
value={value}
|
value={value}
|
||||||
values={getSelectValues(selectOptions)}
|
values={getSelectValues(selectOptions)}
|
||||||
errors={errors}
|
errors={errors}
|
||||||
@@ -125,6 +127,7 @@ ProviderFieldFormGroup.propTypes = {
|
|||||||
label: PropTypes.string,
|
label: PropTypes.string,
|
||||||
helpText: PropTypes.string,
|
helpText: PropTypes.string,
|
||||||
helpLink: PropTypes.string,
|
helpLink: PropTypes.string,
|
||||||
|
placeholder: PropTypes.string,
|
||||||
value: PropTypes.any,
|
value: PropTypes.any,
|
||||||
type: PropTypes.string.isRequired,
|
type: PropTypes.string.isRequired,
|
||||||
advanced: PropTypes.bool.isRequired,
|
advanced: PropTypes.bool.isRequired,
|
||||||
|
|||||||
@@ -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 (
|
||||||
@@ -39,7 +41,7 @@ function HistoryDetails(props) {
|
|||||||
{
|
{
|
||||||
!!data &&
|
!!data &&
|
||||||
<DescriptionListItem
|
<DescriptionListItem
|
||||||
title={'Query Results'}
|
title={translate('QueryResults')}
|
||||||
data={queryResults ? queryResults : '-'}
|
data={queryResults ? queryResults : '-'}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
@@ -47,7 +49,7 @@ function HistoryDetails(props) {
|
|||||||
{
|
{
|
||||||
!!data &&
|
!!data &&
|
||||||
<DescriptionListItem
|
<DescriptionListItem
|
||||||
title={'Categories'}
|
title={translate('Categories')}
|
||||||
data={categories ? categories : '-'}
|
data={categories ? categories : '-'}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
@@ -55,10 +57,18 @@ function HistoryDetails(props) {
|
|||||||
{
|
{
|
||||||
!!data &&
|
!!data &&
|
||||||
<DescriptionListItem
|
<DescriptionListItem
|
||||||
title={'Source'}
|
title={translate('Source')}
|
||||||
data={source}
|
data={source}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!!data &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title={translate('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 (
|
||||||
@@ -82,7 +93,7 @@ function HistoryDetails(props) {
|
|||||||
{
|
{
|
||||||
!!data &&
|
!!data &&
|
||||||
<DescriptionListItem
|
<DescriptionListItem
|
||||||
title={'Source'}
|
title={translate('Source')}
|
||||||
data={source ? source : '-'}
|
data={source ? source : '-'}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
@@ -90,10 +101,18 @@ function HistoryDetails(props) {
|
|||||||
{
|
{
|
||||||
!!data &&
|
!!data &&
|
||||||
<DescriptionListItem
|
<DescriptionListItem
|
||||||
title={'Title'}
|
title={translate('Title')}
|
||||||
data={title ? title : '-'}
|
data={title ? title : '-'}
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!!data &&
|
||||||
|
<DescriptionListItem
|
||||||
|
title={translate('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
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import FormGroup from 'Components/Form/FormGroup';
|
|||||||
import FormInputGroup from 'Components/Form/FormInputGroup';
|
import FormInputGroup from 'Components/Form/FormInputGroup';
|
||||||
import FormLabel from 'Components/Form/FormLabel';
|
import FormLabel from 'Components/Form/FormLabel';
|
||||||
import { inputTypes } from 'Helpers/Props';
|
import { inputTypes } from 'Helpers/Props';
|
||||||
|
import translate from 'Utilities/String/translate';
|
||||||
|
|
||||||
class HistoryOptions extends Component {
|
class HistoryOptions extends Component {
|
||||||
|
|
||||||
@@ -43,7 +44,7 @@ class HistoryOptions extends Component {
|
|||||||
this.setState(setting, () => {
|
this.setState(setting, () => {
|
||||||
dispatchSaveGeneralSettings(setting);
|
dispatchSaveGeneralSettings(setting);
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
@@ -56,14 +57,14 @@ class HistoryOptions extends Component {
|
|||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
<FormGroup>
|
<FormGroup>
|
||||||
<FormLabel>History Cleanup</FormLabel>
|
<FormLabel>{translate('HistoryCleanup')}</FormLabel>
|
||||||
|
|
||||||
<FormInputGroup
|
<FormInputGroup
|
||||||
type={inputTypes.NUMBER}
|
type={inputTypes.NUMBER}
|
||||||
name="historyCleanupDays"
|
name="historyCleanupDays"
|
||||||
value={historyCleanupDays}
|
value={historyCleanupDays}
|
||||||
helpText="Set to 0 to disable automatic cleanup"
|
helpText={translate('HistoryCleanupDaysHelpText')}
|
||||||
helpTextWarning="History items older than the selected number of days will be cleaned up automatically"
|
helpTextWarning={translate('HistoryCleanupDaysHelpTextWarning')}
|
||||||
onChange={this.onGlobalInputChange}
|
onChange={this.onGlobalInputChange}
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|||||||
@@ -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,32 @@ const columns = [
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const protocols = [
|
||||||
|
{
|
||||||
|
key: 'torrent',
|
||||||
|
value: 'torrent'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'usenet',
|
||||||
|
value: 'nzb'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
const privacyLevels = [
|
||||||
|
{
|
||||||
|
key: 'private',
|
||||||
|
value: translate('Private')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'semiPrivate',
|
||||||
|
value: translate('SemiPrivate')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'public',
|
||||||
|
value: translate('Public')
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
class AddIndexerModalContent extends Component {
|
class AddIndexerModalContent extends Component {
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -53,7 +80,10 @@ class AddIndexerModalContent extends Component {
|
|||||||
super(props, context);
|
super(props, context);
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
filter: ''
|
filter: '',
|
||||||
|
filterProtocols: [],
|
||||||
|
filterLanguages: [],
|
||||||
|
filterPrivacyLevels: []
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,7 +92,7 @@ class AddIndexerModalContent extends Component {
|
|||||||
|
|
||||||
onFilterChange = ({ value }) => {
|
onFilterChange = ({ value }) => {
|
||||||
this.setState({ filter: value });
|
this.setState({ filter: value });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
@@ -80,8 +110,31 @@ 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 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 +152,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 +218,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
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ import React, { Component } from 'react';
|
|||||||
import TableRowCell from 'Components/Table/Cells/TableRowCell';
|
import TableRowCell from 'Components/Table/Cells/TableRowCell';
|
||||||
import TableRowButton from 'Components/Table/TableRowButton';
|
import TableRowButton from 'Components/Table/TableRowButton';
|
||||||
import ProtocolLabel from 'Indexer/Index/Table/ProtocolLabel';
|
import ProtocolLabel from 'Indexer/Index/Table/ProtocolLabel';
|
||||||
|
import firstCharToUpper from 'Utilities/String/firstCharToUpper';
|
||||||
|
import translate from 'Utilities/String/translate';
|
||||||
import styles from './SelectIndexerRow.css';
|
import styles from './SelectIndexerRow.css';
|
||||||
|
|
||||||
class SelectIndexerRow extends Component {
|
class SelectIndexerRow extends Component {
|
||||||
@@ -17,7 +19,7 @@ class SelectIndexerRow extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
this.props.onIndexerSelect({ implementation, name });
|
this.props.onIndexerSelect({ implementation, name });
|
||||||
}
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Render
|
// Render
|
||||||
@@ -47,7 +49,7 @@ class SelectIndexerRow extends Component {
|
|||||||
</TableRowCell>
|
</TableRowCell>
|
||||||
|
|
||||||
<TableRowCell>
|
<TableRowCell>
|
||||||
{privacy}
|
{translate(firstCharToUpper(privacy))}
|
||||||
</TableRowCell>
|
</TableRowCell>
|
||||||
</TableRowButton>
|
</TableRowButton>
|
||||||
);
|
);
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user