1
0
mirror of https://github.com/Radarr/Radarr.git synced 2026-03-18 16:24:34 -04:00

Compare commits

..

390 Commits

Author SHA1 Message Date
ta264
c49fb9ec07 Fixed: Speed up RSS sync 2020-10-08 21:25:01 +01:00
ta264
5c248c02dc To revert: ignore failing test 2020-10-08 21:25:01 +01:00
ta264
0b8ff7907a To revert: timestamps in console logs 2020-10-08 21:25:01 +01:00
ta264
6af1289640 To tidy: speed up movie module 2020-10-08 21:25:01 +01:00
ta264
bd7780196c Add FileInfo utility functions to DiskProvider 2020-10-07 21:06:03 +01:00
Qstick
71b126024b Remove unused mac startup script 2020-10-07 23:07:47 -04:00
Qstick
76565d4ab5 Fixed: Old Icon being used on Console App 2020-10-07 23:06:43 -04:00
ta264
28c15bc425 Log out SQL trace on error
Fixes #4910

Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2020-10-07 22:55:54 -04:00
Qstick
aeda4cba32 Fixed: Render CustomFormats under profile option for Large Screens 2020-10-07 22:01:58 -04:00
Qstick
a826c1dc25 New: MultiSelect input control for provider settings
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2020-10-07 21:27:17 -04:00
Csaba
00022fd206 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 32.3% (272 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-10-08 00:48:53 +00:00
Will Segatto
0647663f46 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-10-07 05:48:57 +00:00
Csaba
b83bfb045b Translated using Weblate (Hungarian) [skip ci]
Currently translated at 25.1% (211 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-10-07 05:48:57 +00:00
memnos
cfbac482e5 Translated using Weblate (Italian) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-10-07 05:48:53 +00:00
foXaCe
b43b35a295 Translated using Weblate (French) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-07 05:48:50 +00:00
reloxx
e75d52de0e Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (840 of 840 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-10-07 05:48:49 +00:00
nitsua
f850e75d4e Fix issue with push missing the URL base 2020-10-06 11:05:43 -04:00
nitsua
6c9e4994d8 Fix broken translations on index 2020-10-06 09:35:08 -04:00
Qstick
708a2e31d5 Improve load speeds by being more efficient with config language 2020-10-06 07:48:58 -04:00
Qstick
37c1b5b28c New: Add Bulgarian Language
Fixes #4111
2020-10-06 00:33:33 -04:00
Qstick
e28bea14b3 New: Add Thai Language 2020-10-06 00:33:33 -04:00
Qstick
2823099237 New: Add Hindi and Romanian Languages
Fixes #3597
2020-10-06 00:33:33 -04:00
Qstick
53eeee8b91 New: Allow Selection Original Movie Languge in Profile 2020-10-06 00:33:33 -04:00
nitsua
e880eb0e00 More translations 2020-10-06 00:29:45 -04:00
Qstick
561f84adff Added translation using Weblate (Thai) [skip ci] 2020-10-06 04:09:34 +00:00
Qstick
4fc6a14d1b Added translation using Weblate (Bulgarian) [skip ci] 2020-10-06 04:09:24 +00:00
foXaCe
b8d5a0b6a2 Translated using Weblate (French) [skip ci]
Currently translated at 99.5% (822 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-05 08:48:49 +00:00
Mark McDowall
73b0a461d3 Fix tooltip max width on larger screens
(cherry picked from commit f4f2a6f5fc14244f9acf8186cbacda7f9c1e0481)
2020-10-05 00:14:28 -04:00
Qstick
d86402efb1 Fixed: formatTimeSpan shows incorrect when over 1 month 2020-10-04 23:38:10 -04:00
Qstick
1c892d7357 Fixed: Sorting of Queue time left 2020-10-04 23:37:39 -04:00
Qstick
f7e21ec2a4 Fixed: Tooltip jumping around
Fixes: #5136
Fixes: #4966
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-04 23:34:27 -04:00
Qstick
1d0771c9a4 New: Add size to movie files in Webhook payload
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-04 22:31:49 -04:00
Qstick
cc384d9297 Remove unused popper 2 package 2020-10-04 22:29:21 -04:00
Qstick
7898100d95 Revert "Pull Sonarr commit 'Import lists in settings overview' (#5138)"
This reverts commit 4b279e87cf.
2020-10-04 22:28:46 -04:00
servarr[bot]
4b279e87cf Pull Sonarr commit 'Import lists in settings overview' (#5138)
* Import lists in settings overview

(cherry picked from commit f45b27f507953724e9469ce16c4e555985312150)

* fixup! Sonarr wording

Co-authored-by: Mark McDowall <mark@mcdowall.ca>
Co-authored-by: Qstick <qstick@gmail.com>
2020-10-04 22:26:14 -04:00
Qstick
3d5570dfd9 Update frontend packages
Fixes: #5115
Fixes: #5116
Fixes: #5117
Fixes: #5118
Fixes: #5119
Fixes: #5120
Fixes: #5121
Fixes: #5122
Fixes: #5123
Fixes: #5124
Fixes: #5125
Fixes: #5126
Fixes: #5127
Fixes: #5128
Fixes: #5129
Fixes: #5130
Fixes: #5131
Fixes: #5132
Fixes: #5133
Fixes: #5134
Fixes: #5139
Fixes: #5140
2020-10-04 21:49:16 -04:00
Qstick
269462e0a2 Update stalebot exempt labels [skip ci] 2020-10-04 02:45:56 -04:00
bakerboy448
5799b3dc47 Fixed: Parser Detecting DTS-Audio formats and Blu-Ray as groups (#5090)
* Fix DTS-XXX Audio & Blu-ray false Group Positives

* Add test cases

* fixup! spaces

Co-authored-by: Qstick <qstick@gmail.com>
2020-10-04 01:59:31 -04:00
Qstick
dfbbb7d9bd Fixup Filelist test to use new url 2020-10-04 01:57:37 -04:00
Qstick
6faa484d4e Change Discord invite to point to Welcome page 2020-10-04 01:20:18 -04:00
Qstick
86363d5bf1 Fixed: Change Filelist default URL 2020-10-04 01:20:18 -04:00
Qstick
30c51ec4f3 Fixed: Handle obfuscated files using abc.xyz pattern
Fixes #5105

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-04 01:20:17 -04:00
Qstick
a66b2cf416 New: Add more information to Webhook payload
Fixes #5104

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-04 01:20:17 -04:00
Qstick
37197150be Some cleanup of things marked for removal in v3
Fixes #5102

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-10-04 01:20:17 -04:00
Qstick
c8bbd21615 Cleanup TaskManager.cs 2020-10-04 01:20:17 -04:00
Florian
fdf2d1c9b3 Translated using Weblate (French) [skip ci]
Currently translated at 99.5% (822 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-04 04:48:54 +00:00
foXaCe
eb4cd9633a Translated using Weblate (French) [skip ci]
Currently translated at 99.5% (822 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-04 04:48:54 +00:00
reloxx
3fa17bf7f6 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (826 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-10-04 04:48:48 +00:00
Qstick
22e9dff76b Don't check for updates every 30 minutes on nightly 2020-10-03 23:49:06 -04:00
Qstick
7d31eb1f55 Fixed: Test for empty strings using isNullOrEmpty 2020-10-03 21:58:31 -04:00
Qstick
4ec71538b9 Fixed: Avoid zero-length array memory allocations 2020-10-03 21:58:31 -04:00
Qstick
295b975046 Fixed: Do not use Count/LongCount when Any can be used 2020-10-03 21:58:31 -04:00
Qstick
0198c7a3b1 Fixed: Use Length/Count property instead of Enumerable.Count method 2020-10-03 21:58:31 -04:00
Qstick
088ffc34df Fixed: Use Append(Char) for single character Stringbuilder additions 2020-10-03 21:58:31 -04:00
bakerboy448
1740ad337c Clarify Branches/ Release Channels [skip ci] (#5100) 2020-10-03 09:26:37 -04:00
nitsua
a6758e4bf4 Ongoing updates to api docs (#5082) [skip ci] 2020-10-03 09:25:35 -04:00
memnos
2161f08140 Translated using Weblate (Italian) [skip ci]
Currently translated at 100.0% (826 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-10-03 06:48:53 +00:00
foXaCe
1a92372506 Translated using Weblate (French) [skip ci]
Currently translated at 70.8% (585 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-10-03 06:48:52 +00:00
bakerboy448
5bd23be133 Update v3 binaries links [skip ci] (#5099)
* Update README.md

* Update Nightly Binary Links

* Fix table formatting
2020-10-01 23:39:15 -04:00
nitsua
eca816db86 Fix movie title stretching the add window
Fixes: #5096
2020-10-01 18:12:19 -04:00
bakerboy448
c4f19a813d Minor Branch Updates/Clarifcation [Skip Ci] 2020-10-01 11:20:13 -04:00
bakerboy448
24cee7e4fe Correct Contributing (don't have forums or IRC) [skip ci] 2020-10-01 11:15:11 -04:00
Qstick
22531294be Remove duplicate translation key 2020-09-30 21:44:08 -04:00
Qstick
464d92bb70 Calendar status fixes
Fixes #4747

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-09-30 21:43:52 -04:00
Qstick
8ee16b81ec Fixed: Indexer being disabled due to download client rejecting it
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-09-30 21:25:12 -04:00
Qstick
a7a1d48e0d Fixed: Log path when import fails for movie import
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-09-30 21:24:18 -04:00
Qstick
a070279993 New: Allow naming with original Movie title (in original language) 2020-09-30 16:10:56 -04:00
Qstick
95918c4053 Fixed: Speed up Unmapped Folder fetch for large number of root folders 2020-09-30 07:41:56 -04:00
Will Segatto
646b86f8c9 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (826 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-29 05:59:11 +00:00
jpalenz77
28835a1857 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (826 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-29 05:59:10 +00:00
nitsua
6b22481a00 Fix the sorting on the agenda to respect using all dates instead of only cinema date to sort 2020-09-28 23:55:50 -04:00
Qstick
aef8a8fd04 Fixed: Fetch blacklist by Movie instead of all
Fixes #5066
2020-09-28 23:39:15 -04:00
Qstick
a1e69c3c2b Lodash replacements: take 2 2020-09-28 22:02:02 -04:00
hotio
995d257d3d Fix docker tag (#5081) [skip ci] 2020-09-28 21:51:26 -04:00
nitsua
cf804f7dac Fix issue with arrow keys switching movie when using them inside a textbox (or any element really) 2020-09-28 17:28:09 +01:00
ta264
081fe64bff Revert "Convert some instances (filter, find, pick) to native from lodash"
This reverts commit d8a0aac9c3.
2020-09-28 06:26:23 +01:00
ta264
9075fdc1c1 Revert "Fix find error on movie details"
This reverts commit 6bdd24e62d.
2020-09-28 06:26:13 +01:00
foXaCe
5db1faad0b Translated using Weblate (French) [skip ci]
Currently translated at 62.5% (517 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-09-28 06:00:42 +00:00
reloxx
57f3805763 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (826 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-09-28 06:00:38 +00:00
nitsua
6bdd24e62d Fix find error on movie details 2020-09-28 06:51:03 +01:00
Qstick
d5ec2914e2 New: Support existing 'keyart' in Kodi Metadata
Fixes #5059
2020-09-27 22:44:12 -04:00
Qstick
d8a0aac9c3 Convert some instances (filter, find, pick) to native from lodash 2020-09-27 22:33:21 -04:00
nitsua
987ed357d5 Add a link to the github issue if it is added to the change notes 2020-09-27 22:14:08 -04:00
Qstick
9044976393 Update StaleBot config exempt labels [skip ci] 2020-09-27 09:30:48 -04:00
nitsua
b53def3da5 Fixed: Issue with arrow navigation from details working outside of the details page (#5071) 2020-09-26 23:36:36 -04:00
Qstick
2ecb988c6a Remove aphrodite links from Readme [skip ci] 2020-09-26 22:19:17 -04:00
Qstick
41cf722ab5 Change over aphrodite references 2020-09-26 22:03:14 -04:00
LSL1337
dbaccc5f91 Translated using Weblate (Hungarian) [skip ci]
Currently translated at 2.6% (22 of 826 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/hu/
2020-09-27 01:30:56 +00:00
nitsua
9864d555f2 Fixed: Grouping of movies on the same date in the calendar agenda view (#5068) 2020-09-26 12:18:35 -04:00
foXaCe
b4abfaa695 Translated using Weblate (French) [skip ci]
Currently translated at 59.6% (487 of 817 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-09-26 14:49:51 +00:00
nitsua
7f814a3cb9 New: Add support for left/right arrows on the movie details to navigate through movies
New: Add support for ctrl+home and ctrl+end to jump to the top and bottom of the movie index
New: Add redirect to previous movie instead of index when deleting one
2020-09-26 10:49:47 -04:00
nitsua
870a39278c Handle ratelimit api response for newznab caps endpoint on certain newznab indexers that have caps behind the apikey 2020-09-26 10:45:35 -04:00
Qstick
7e5d5fe29e New: Avoid cache on IMDb user lists 2020-09-25 22:05:39 -04:00
Will Segatto
6d4543f1df Translated using Weblate (Portuguese) [skip ci]
Currently translated at 99.8% (816 of 817 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-25 22:05:42 +00:00
jpalenz77
98ebc8ff97 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (817 of 817 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-25 22:05:42 +00:00
reloxx
b8743bd73e Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (817 of 817 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-09-25 22:05:41 +00:00
Qstick
4ea9ded0de New: Add icons for search results to indicate if it has been previously grabbed, failed or is in the blacklist. 2020-09-25 10:56:46 -04:00
Taloth Saldono
2ee77aa0a4 Fixed: Ignore files in subfolders during a manual import 2020-09-24 20:54:56 -04:00
Will Segatto
c7c97e508d Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-24 23:59:10 +00:00
jpalenz77
283c26222b Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-24 23:59:09 +00:00
Qstick
fb0fa53304 Fixed: Code block for Release name on import Discord notification 2020-09-23 22:04:27 -04:00
Qstick
ca27a80b15 New: Show year with manual import Movie selection 2020-09-23 21:32:56 -04:00
Will Segatto
ed289ddbdd Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-24 00:59:06 +00:00
memnos
5a36980996 Translated using Weblate (Italian) [skip ci]
Currently translated at 99.7% (814 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-09-24 00:59:06 +00:00
Will Segatto
de28266071 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-23 02:59:06 +00:00
angrycuban13
599263f998 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-23 02:59:05 +00:00
jpalenz77
fd711a9bf3 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-23 02:59:05 +00:00
Qstick
ad5a90f034 New: Customizable Discord Notifications (Thanks @hotio) 2020-09-22 16:23:27 -04:00
Qstick
2ad1cfec42 Bump ImageSharp to stable package 1.0.1 [Common] 2020-09-22 16:23:01 -04:00
nitsua
6fdf06a882 Fix issue with the disk space label percents overlapping on small screens. 2020-09-21 22:40:19 -04:00
jpalenz77
4e0f027a91 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-21 20:59:05 +00:00
Qstick
e56a784e4c Null Check firstQueueItem 2020-09-20 23:02:18 -04:00
Qstick
1898114d8c Remove empty space 2020-09-20 20:01:23 -04:00
Qstick
d6d740a0d2 Replace for loop with find for QueueStatus 2020-09-20 19:47:23 -04:00
Will Segatto
9472af8f83 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-20 18:59:04 +00:00
Qstick
01f0f9d3bb Fixed: Translate Movie Info in Discover View 2020-09-19 23:01:02 -04:00
Qstick
9e79e91d39 Fixed: Populate OriginalTitle in DB for ListMovies 2020-09-19 22:54:43 -04:00
Qstick
db05f0464a Fixed: Return existing item props on lookup with IMDBId or TMDBId
Fixes #5037
2020-09-19 22:41:07 -04:00
nitsua
ff3fd0bb1e Fix: Address issue with incorrect dates showing on the calendar agenda and add icons for which date type it is 2020-09-19 14:09:20 -04:00
Mark McDowall
0100819ae4 Fixed: Removing torrents from Vuze
(cherry picked from commit d0c0720578abcc02d9abca24f60d73d32491cd2f)
2020-09-19 11:02:42 -04:00
Mark McDowall
dd3218588f Fixed: Spelling in Edit List modal
(cherry picked from commit 068d9eef8d8ac9eb8c43ef6283e8a6426b767cb1)
2020-09-19 11:00:54 -04:00
hotio
e086b760c1 Fix docker org/user names 2020-09-19 11:00:03 -04:00
Will Segatto
f883f96325 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-19 14:59:09 +00:00
angrycuban13
5abffcab54 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-19 14:59:04 +00:00
Will Segatto
116a3b2de1 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 82.1% (670 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-17 15:59:09 +00:00
memnos
9521b6883d Translated using Weblate (Italian) [skip ci]
Currently translated at 99.7% (814 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-09-17 15:59:07 +00:00
angrycuban13
affebb3552 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-17 15:59:04 +00:00
foXaCe
65b0fcffbe Translated using Weblate (French) [skip ci]
Currently translated at 59.5% (486 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-09-17 15:59:04 +00:00
Qstick
4c0a906bfa Update Settings.js 2020-09-16 12:14:17 -04:00
Will Segatto
7e0815b3b4 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 68.6% (560 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-15 01:59:07 +00:00
hotio
73cc67f71e Translated using Weblate (Dutch) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-15 01:59:07 +00:00
memnos
f089d11001 Translated using Weblate (Italian) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-09-15 01:59:06 +00:00
jpalenz77
7791b4038e Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-15 01:59:03 +00:00
reloxx
77b2945e84 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (816 of 816 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-09-15 01:59:02 +00:00
nitsua
02845c72d3 Add tooltip to path & movie title on the movie index table view 2020-09-12 23:38:09 -04:00
hotio
587e6b570c Translated using Weblate (Dutch) [skip ci]
Currently translated at 100.0% (808 of 808 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-12 06:25:42 +00:00
memnos
7d9f625080 Translated using Weblate (Italian) [skip ci]
Currently translated at 100.0% (808 of 808 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-09-12 06:25:42 +00:00
jpalenz77
480722df71 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (808 of 808 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-12 06:25:42 +00:00
foXaCe
07596a6f8d Translated using Weblate (French) [skip ci]
Currently translated at 58.0% (469 of 808 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-09-12 06:25:42 +00:00
reloxx
3fbf591eb9 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (808 of 808 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-09-12 06:25:42 +00:00
nitsua
9a46d5165c New: Add support for prioritizing indexers (#5000) 2020-09-12 02:25:32 -04:00
nitsua
4fafdcabb7 Fix: Addressed issue with status color not showing on Movie > Details (only purple was working) 2020-09-11 22:59:57 -04:00
Qstick
69071768de Fixed: Import movie spinning forever when error is returned
Fixes #4993

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-09-11 22:44:45 -04:00
Qstick
4be83a3367 Mark completed imports based on history as imported to remove from queue
Fixes #4994
2020-09-11 22:27:29 -04:00
Qstick
7ddaca06a6 Fixed: HDBits Categories, Codecs, Mediums Select Requiring Numbers 2020-09-11 22:23:46 -04:00
angrycuban13
54dc22a763 Translated using Weblate (Spanish) [skip ci]
Currently translated at 99.8% (807 of 808 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-11 08:35:25 +00:00
Qstick
29bc38423b Fixed: Correct Tooltips for Clone Format and Export
Fixes #4991
2020-09-10 22:25:34 -04:00
Qstick
da720fdf4c Fixed: Tooltips not working for Icon Buttons, Revert title pullout in Link.js 2020-09-10 22:15:19 -04:00
Qstick
2f311452da Fixed: Deleting CF Specification deletes all 2020-09-10 21:25:16 -04:00
Will Segatto
d615007ff1 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 66.5% (535 of 804 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-11 01:07:24 +00:00
memnos
d9ed97f63a Translated using Weblate (Italian) [skip ci]
Currently translated at 100.0% (804 of 804 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-09-11 01:07:24 +00:00
Qstick
ecf6dccb35 New: Option to not prefer repacks/propers (for use with Custom Formats)
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-09-10 21:07:14 -04:00
Mark McDowall
d31b1e1e9b New: Don't forcibly retest indexers/download clients/connections on save if previously enabled
(cherry picked from commit b2b1600ebe7f022a3248ea12b69553e2d51a3a7c)
2020-09-10 19:47:41 -04:00
nitsua
7019c8587b Fix an issue with the language on status labels for inCinemas and added translation to the movieStatus variable (#4986)
Fix issue where status text was not consistent across all 3 index views and the details
2020-09-10 11:04:52 -04:00
nitsua
df96203914 Update API Docs (#4985) [skip ci] 2020-09-10 00:28:35 -04:00
memnos
bee8da5c8a Translated using Weblate (Italian) [skip ci]
Currently translated at 83.3% (670 of 804 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-09-10 04:03:55 +00:00
Jorman
c42b1d6265 Translated using Weblate (Italian) [skip ci]
Currently translated at 83.3% (670 of 804 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-09-10 04:03:55 +00:00
foXaCe
5aa45dbc85 Translated using Weblate (French) [skip ci]
Currently translated at 57.0% (459 of 804 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-09-10 04:03:55 +00:00
reloxx
5d64417b7b Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (804 of 804 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-09-10 04:03:55 +00:00
Austin Best
c51b08e26c Fixed: Address issues with the status being wrong color on the index and movie details (not tracking anything queued/downloading)
Fixed: Updated fetchQueueDetails() to not pass movie ids since the store doesn't use them anyways
New: Added text to index poster progress bar showing status

#4525
#4526
#4982
2020-09-10 00:03:44 -04:00
Qstick
a2e8d1d5d6 Additional Logging for rTorrent 2020-09-10 00:02:45 -04:00
nitsua
ea37bc2cb7 New: Add support for Discord Notifier connect type (#4611) 2020-09-09 23:46:24 -04:00
Qstick
bba2b01980 Don't parse subtitle language as language
Fixes #4972
2020-09-09 21:58:37 -04:00
Qstick
b43732b343 Fixed: Validate TMDb ListId is a valid integer 2020-09-09 21:54:16 -04:00
Qstick
764d456d49 Fixed: Handle UHDRemux as Remux instead of Webdl 2020-09-09 21:54:16 -04:00
Qstick
9a2cee3104 New: Handle missingFiles status from qBit [common] 2020-09-09 21:54:16 -04:00
Qstick
4311048c08 Update LocalizationServiceFixture.cs 2020-09-08 23:25:55 -04:00
Qstick
5b3a09716b Fixed: Invalid Translate Key call for CouldNotFindResults 2020-09-08 22:55:50 -04:00
Qstick
ecbdd58f42 New: Separate UI Language into two settings for Movie Info and Main UI 2020-09-08 21:38:05 -04:00
Jorman
2014ff6610 Translated using Weblate (Italian) [skip ci]
Currently translated at 47.6% (379 of 796 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-09-08 18:17:28 +00:00
ta264
c3a89c46f5 New: Import and export custom formats 2020-09-08 19:17:21 +01:00
ta264
e014826b17 New TEXT_AREA input type 2020-09-08 19:17:21 +01:00
ta264
f8c3947bad ClipboardButton improvements
Allow overriding CSS, make it work in modals
2020-09-08 19:17:21 +01:00
Mark McDowall
8598cfcac9 Fixed: Replace : with _ when getting output path from Transmission
(cherry picked from commit 0f792f9eb9517a4165a54d7c4551f4f68822d18e)
2020-09-08 08:51:00 -04:00
hotio
18982cd054 Translated using Weblate (Dutch) [skip ci]
Currently translated at 100.0% (796 of 796 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-08 08:59:06 +00:00
angrycuban13
03715d9b6a Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (796 of 796 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-08 08:59:05 +00:00
elChapoSing
fea479e7e7 Translated using Weblate (French) [skip ci]
Currently translated at 57.6% (459 of 796 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-09-08 08:59:04 +00:00
reloxx
acd4e9b8aa Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (796 of 796 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-09-08 08:59:04 +00:00
Qstick
2a84c4737b Fixed: NullRef on RootFolder add from ModelEvent Broadcast 2020-09-07 21:39:29 -04:00
Qstick
bc4bb772ec Add Translations reminder to PR template 2020-09-07 11:08:31 -04:00
rg9400
6179540d27 add more audio codecs for Trakt connection
Just updated on production at Trakt's end. They are still discussing adding a new format for TV
2020-09-07 10:12:56 -04:00
nitsua
f7e208afe1 Fix issue where options button gets into a state of disabled with no way to re-enable it unless you add a list with movies in it 2020-09-07 10:10:41 -04:00
nitsua
bc83e902cc Adjust the width of runtime & added since they are to wide 2020-09-07 10:09:17 -04:00
nitsua
2b7af5d99d Fix a type in the translation of UI 2020-09-06 21:58:28 -04:00
jpalenz77
1971a9dd05 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (796 of 796 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-06 22:32:25 +00:00
angrycuban13
328c3de7c1 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (796 of 796 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-06 22:32:23 +00:00
nitsua
7c8ac30077 New: Add label to disk usage progress bar (#4958) [common] 2020-09-06 17:22:58 -04:00
nitsua
f286f99bb6 Translation update, updating inline div tags and placeHolder attributes 2020-09-06 13:50:55 -04:00
Qstick
914d8f9937 Translated using Weblate (Italian) [skip ci]
Currently translated at 50.6% (365 of 720 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-09-06 13:26:15 +00:00
Qstick
b787f3b2d1 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 71.9% (518 of 720 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-06 07:05:44 +00:00
Qstick
7ec043afde Fixed: Don't Show two loading indicators on Movie Detail Tabs 2020-09-06 02:51:04 -04:00
Qstick
c3223ea8e7 Fixed: Links and already added icons overflowing on add movie search results
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-09-06 02:51:04 -04:00
Qstick
87bf6b5977 Fixed: Manual Import adding empty rows after selecting movie
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-09-06 02:51:04 -04:00
Qstick
7ddb8ecc37 Add Test for Non-Parsable Search 2020-09-06 02:51:04 -04:00
Qstick
9b1dc2d21d New: Handle BDMux Releases in Quality Parser
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-09-06 02:51:04 -04:00
Taloth Saldono
ff3e53a71b Fixed: Failing file copy when running in docker on synology with btrfs 2020-09-06 02:51:04 -04:00
Taloth Saldono
35532b6789 Fixed: Refreshing Plex Server series in high volume systems 2020-09-06 02:51:04 -04:00
Taloth Saldono
026c34c3ba Remove stacktrace if hardlink resulted in EXDEV. 2020-09-06 02:51:04 -04:00
Taloth Saldono
7b60612ef3 Fixed: Performance of symbolic link detection and infinite recursion 2020-09-06 02:51:04 -04:00
Taloth Saldono
38855967d6 New: Fast copy using reflink on btrfs volumes 2020-09-06 02:51:04 -04:00
Taloth Saldono
67d2765d0c Fixed: Removed hardlink-based transactional file transfer logic (instead relying on explicit copy+delete for cifs) 2020-09-06 02:51:04 -04:00
Qstick
c1b6917afe Moved Windows-only Permission function to Radarr.Windows
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2020-09-06 02:51:04 -04:00
Qstick
95a30b50fa Fixed: Generating Kodi movie file metadata files when scanning folder
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2020-09-06 02:51:04 -04:00
Qstick
17b93bcc57 Fixed: Representation of episode start time when not starting at the full hour in am/pm notation
Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2020-09-06 02:51:04 -04:00
Qstick
16321377fc Fixed: Filter direct excluded subfolders of the selected directory during manual import
Fixes #4734

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-09-06 02:51:04 -04:00
hotio
e6368c3095 Translated using Weblate (Dutch) [skip ci]
Currently translated at 100.0% (720 of 720 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-06 06:33:26 +00:00
reloxx
a4869db050 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (720 of 720 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-09-06 06:33:25 +00:00
Qstick
bdecc48e34 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 47.3% (341 of 720 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-09-05 14:33:42 +00:00
jpalenz77
916c10197e Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (720 of 720 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-05 14:33:41 +00:00
reloxx
3fe06ab3ac Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (720 of 720 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-09-05 14:33:38 +00:00
hotio
4f52a3e10f Translated using Weblate (Dutch) [skip ci]
Currently translated at 100.0% (720 of 720 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-05 14:31:37 +00:00
Qstick
b466530e08 Remove Dotnet Framework Version Checks [common] 2020-09-05 01:13:17 -04:00
Qstick
f1727b0960 Bump lodash 4.17.20 2020-09-05 00:52:13 -04:00
Qstick
579a86a708 Don't Camel Case Localization Endpoint 2020-09-05 00:38:22 -04:00
geogolem
b6f2afb212 Fixed: IsAvailable not Right for minAvailability = InCinemas (#4921)
* if minimumAvailability is set to InCinemas
InCinemas has no value but physical/digital release dates
are known and passed, movie would be marked as Not Available
When it should be Missing.

This resolves https://github.com/Radarr/Radarr/issues/4920

remove comment

* add the tests
2020-09-05 00:16:31 -04:00
nitsua
3a7b48825d Another translation update 2020-09-04 23:04:00 -04:00
Qstick
0d7bf98efb Translated using Weblate (Italian) [skip ci]
Currently translated at 41.2% (270 of 654 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-09-05 02:20:17 +00:00
Florian
ded8c9ea3e Translated using Weblate (French) [skip ci]
Currently translated at 68.6% (449 of 654 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-09-05 02:20:16 +00:00
elChapoSing
aeb7d79101 Translated using Weblate (French) [skip ci]
Currently translated at 68.6% (449 of 654 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-09-05 02:20:16 +00:00
Qstick
e45f0ad5fc Fixed: Don't Fail if User Tries Adding Existing Movie from Discovery 2020-09-04 22:09:26 -04:00
Qstick
87bf010c67 Fixed: Discovery overview description not hidden on mobile 2020-09-04 21:37:23 -04:00
bakerboy448
50142eea64 Readme Updates Part 1 (#4949) [skip ci]
* Update README.md

Add: Note that v0.2 is critical break/fix only
Fix: Clearify Docker Table
Remove: Feathub
Comment: Feature "* Scanning PreDB to know when a new release is available" Probably needs to be replaced
Add: Feature -  Importing movies from various online sources... "Trakt"
Remove: Planned Features
Change: Feature Request Link

* Update README.md
2020-09-04 18:04:28 -04:00
hotio
c26d25fdfb Translated using Weblate (Dutch) [skip ci]
Currently translated at 100.0% (654 of 654 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-04 10:45:47 +00:00
Qstick
bd85f78994 Translated using Weblate (Greek) [skip ci]
Currently translated at 12.2% (80 of 654 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/el/
2020-09-04 10:45:46 +00:00
Qstick
1ddb593ddd Translated using Weblate (Italian) [skip ci]
Currently translated at 33.6% (220 of 654 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/it/
2020-09-04 10:45:46 +00:00
jpalenz77
21899e7a43 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (654 of 654 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-04 10:45:45 +00:00
elChapoSing
04ea182abb Translated using Weblate (French) [skip ci]
Currently translated at 67.8% (444 of 654 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-09-04 10:45:45 +00:00
geogolem
e033ce1eff New: Add OnDelete Notification to TraktConnection
to remove movies from Trakt Collection when they are removed from Radarr

Add OnDelete Notification to TraktConnection to remove movies from Trakt Collection when they are removed from Radarr

skip the deleteHandler if the delete Event was triggered for reason: Upgrade

change migration from 180 to 182 since 180 and 181 are already in plan
to be used

address comments regarding helpText for OnDelete
and move check for OnUpgrade deletion reason into trakt connection OnDelete handler

reuse TraktCollectMoviesResource for OnDelete
trakt api should just ignore the other properties anyway

add WithDefaultValue to migration

add unit test case for onDelete to

fix unit testcase for onDelete
2020-09-04 00:19:06 -04:00
Qstick
261e598c99 Translated using Weblate (Spanish) [skip ci]
Currently translated at 99.5% (651 of 654 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-09-04 03:55:29 +00:00
Qstick
38c7c60ad7 Translated using Weblate (French) [skip ci]
Currently translated at 55.9% (366 of 654 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-09-04 03:55:23 +00:00
nitsua
3548433a10 New: Add runtime format option in Settings > UI so users can choose between a mins view and h/m view 2020-09-03 22:51:33 -04:00
Qstick
361ffe353d New: Browse Lists from Discover Movies Page 2020-09-03 22:50:56 -04:00
faxity
54bcf9eed3 Translated using Weblate (Dutch) [skip ci]
Currently translated at 100.0% (653 of 653 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-03 07:57:16 +00:00
hotio
f6364fec1c Translated using Weblate (Dutch) [skip ci]
Currently translated at 100.0% (653 of 653 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-03 07:57:07 +00:00
ta264
7f8ebf41d6 Fixed: Error fetching paged records from API without a sort key
(cherry picked from commit 53f1857e6349fc4c674dbaec50b0dda681f073ae)
2020-09-02 16:40:17 +01:00
Mark McDowall
a9ee3d5bc5 Fixed: Importing completed downloads from NZBGet with post processing script failing
Fixes #2919
2020-09-02 06:35:53 +01:00
Mark McDowall
1dfe6eb6ed Fixed: Importing of completed download when not a child of the download client output path 2020-09-02 06:35:53 +01:00
Mark McDowall
92a0305740 Another path test fix 2020-09-02 06:35:53 +01:00
Mark McDowall
e610b74745 Fixed: Getting parent of UNC paths 2020-09-02 06:35:53 +01:00
reloxx
3f0903d8ab Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (653 of 653 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-09-01 21:02:39 +00:00
faxity
d474b487ec Translated using Weblate (Dutch) [skip ci]
Currently translated at 77.3% (505 of 653 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-01 14:25:31 +00:00
hotio
cdf1501cbd Translated using Weblate (Dutch) [skip ci]
Currently translated at 77.3% (505 of 653 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-01 14:25:31 +00:00
faxity
613f9a9cd8 Translated using Weblate (Dutch) [skip ci]
Currently translated at 69.0% (451 of 653 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-01 12:04:39 +00:00
hotio
eee75f630e Translated using Weblate (Dutch) [skip ci]
Currently translated at 69.0% (451 of 653 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-01 12:04:35 +00:00
TRaSH
cae169f4b8 Translated using Weblate (Dutch) [skip ci]
Currently translated at 69.0% (451 of 653 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-09-01 12:04:33 +00:00
angrycuban13
4f3948d36a Translated using Weblate (Spanish) [skip ci]
Currently translated at 64.0% (418 of 653 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-31 07:11:49 +00:00
Qstick
df18be2a4d Fixed: Don't fail if ldd doesn't exist 2020-08-30 14:37:55 -04:00
nitsua
be38ca4728 More Language string migration 2020-08-30 03:12:39 -04:00
nitsua
84e769b14e Fix: Remove title requirement in the API for adding movies when the TMDb is provided since that will over-ride the given title. 2020-08-29 17:06:16 -04:00
Qstick
0800029713 Fixed: Quality Profile group order no longer used when ordering results 2020-08-29 01:12:43 -04:00
Qstick
ab7bb610a6 Fixed: Fix Instances where DB MovieFileId Relationship is Screwy 2020-08-28 19:16:57 -04:00
Erick Ferreira
9a0f6cf931 Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (323 of 323 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-08-28 15:33:23 +00:00
Qstick
658f6922c2 Fixed: Use Proxy for MediaCovers and Metadata (#4916)
[common]

Co-authored-by: Soroush <soroush@falahati.net>
2020-08-26 23:01:34 -04:00
Taleoo
30fe718dcf Translated using Weblate (French) [skip ci]
Currently translated at 97.5% (315 of 323 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-08-26 18:35:31 +00:00
Qstick
5f8b953f6a Bump to FxCop 3.3.0 stable 2020-08-25 23:12:09 -04:00
nitsua
a28c5675ef Fix: Address issue when runtime is under 1 hour and it falls back to 12h.
New: Update time column on Movie > Index > Table to show hour minutes instead of only minutes
2020-08-25 00:22:12 -04:00
Qstick
df197d2e16 New: Movie Collection naming token 2020-08-24 20:57:45 -04:00
Qstick
4d193b2279 Fixed: Fix Movies, Lists with Invalid Profile on Migration 2020-08-23 21:51:15 -04:00
Qstick
eff03a7d2c Fixed: Don't blow up if a tmdbid not in DB is asked for on AllMovie Endpoint 2020-08-23 21:10:25 -04:00
Qstick
2cbeefba6e Update Donate Link in MoreInfo.js 2020-08-23 17:04:49 -04:00
jpalenz77
0d7b48d48a Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (323 of 323 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-23 17:33:21 +00:00
Erick Ferreira
70c057f20f Translated using Weblate (Portuguese) [skip ci]
Currently translated at 100.0% (323 of 323 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/pt/
2020-08-22 16:33:28 +00:00
jpalenz77
b342dc7ca0 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (323 of 323 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-22 16:33:24 +00:00
reloxx
d8ff3a62ea Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (323 of 323 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-08-22 16:33:24 +00:00
Qstick
363ff7df3c Remove Mono 5.8 from Build Tests [skip ci] 2020-08-22 00:50:57 -04:00
Qstick
fa3914c36a Switch Automation to Chrome for Test Speed 2020-08-22 00:47:07 -04:00
angrycuban13
aba9cedb78 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (323 of 323 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-21 08:42:40 +00:00
Qstick
197f064fd5 Cache Yarn on Azure 2020-08-20 23:11:13 -04:00
Qstick
acd167e3ff Disable stylecop for backend build on azure
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2020-08-20 23:11:13 -04:00
Qstick
60ff140e7f Change GeckDriver Package 2020-08-20 23:11:13 -04:00
ta264
fcea6d23b0 Add omnisharp.json to enable analyzers and editorconfig support 2020-08-20 23:11:13 -04:00
ta264
1250c3db92 Remove duplicate settings from root .editorconfig 2020-08-20 23:11:13 -04:00
Qstick
ee225d9d85 Remove Unused Usings 2020-08-20 23:11:13 -04:00
Qstick
ec752f8ab3 New: Ruleset to Editorconfig 2020-08-20 23:11:13 -04:00
hotio
a8e31896e3 Translated using Weblate (Dutch) [skip ci]
Currently translated at 100.0% (323 of 323 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-08-21 00:39:36 +00:00
angrycuban13
1daa1f9daf Translated using Weblate (Spanish) [skip ci]
Currently translated at 99.6% (322 of 323 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-21 00:38:27 +00:00
jpalenz77
9d79a28655 Translated using Weblate (Spanish) [skip ci]
Currently translated at 99.6% (322 of 323 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-21 00:38:26 +00:00
Qstick
665a5c89c2 Try to fix windows automation tests 2020-08-20 20:11:56 -04:00
angrycuban13
f7bebbaaeb Translated using Weblate (Spanish) [skip ci]
Currently translated at 86.0% (278 of 323 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-20 07:48:15 +00:00
Qstick
04b84e4931 More Translations 2020-08-19 23:32:49 -04:00
Qstick
e4d033d0a7 New: Reprocess Language in Manual Import after Movie Selection 2020-08-19 22:35:30 -04:00
Qstick
9c85482b9c Bump to dotnet 3.1.7 2020-08-19 22:26:09 -04:00
Qstick
ac7f6f8868 fixup! New: Allow Radarr List Sync by Source Tag 2020-08-19 21:37:15 -04:00
Qstick
56184905a9 New: Allow Radarr List Sync by Source Tag
Fixes #4826
2020-08-19 21:37:15 -04:00
ta264
5a1b82e195 Disable single instance check for integration tests
Causes a SIGABRT on mono 6.10 and 6.12 - double free or corruption
2020-08-19 19:01:24 +01:00
ta264
d92895381c Print log file on fail 2020-08-19 19:01:24 +01:00
ta264
f9f243a814 Actually fix musl integration tests 2020-08-19 19:01:24 +01:00
ta264
3c5e56919f Run integration tests in parallel 2020-08-19 19:01:24 +01:00
ta264
05e8de2b0a Revert "Cache integration test DB to avoid repeated migrations"
This reverts commit 456169b8d2.
2020-08-19 19:01:24 +01:00
Dtaggart
e2c0d83f20 New: Added silent notification option to telegram 2020-08-18 21:31:18 -04:00
ta264
c96f29f1e8 Swap from dotnet vstest to dotnet test
(cherry picked from commit c40f87ce2f3fc03acb9a3d73498e7861f5750b4b)
2020-08-18 11:38:47 +01:00
Qstick
c8de61df19 Fixed: Don't parse .ts files as Telesync
Fixes #4891
2020-08-17 22:51:10 -04:00
Qstick
7c5b2a299d Fixed: Allow fallback lanugages in tokens
Fixes #4889
2020-08-17 22:40:42 -04:00
Qstick
76804dfefb Fixed: Format Errors from AudioChannel formatter
Fixes RADARR-8
2020-08-16 23:43:21 -04:00
ta264
ed2568187e Fixed: Shared serializer in ProviderRepository
Some caching happens in the serializer settings so best not to
recreate each time

(cherry picked from commit d2dcc45492)
2020-08-16 21:11:29 -04:00
Mark McDowall
f1bb8eeb8e Fixed: Long relative path when selecting episodes in Manual Import hiding buttons
(cherry picked from commit a206a5714e393b32e9a921f8d2413518f17d2b00)
2020-08-16 14:46:07 -04:00
Qstick
547c044dc6 Fix namespace for StringConverter 2020-08-16 01:19:23 -04:00
Qstick
0ef9d28a73 Fixed: Possible nullRef when setting IndexerFlags in TorznabParser 2020-08-16 01:14:47 -04:00
Qstick
ed76709b7f Simplify FindDownloadId to remove inaccessable code paths 2020-08-16 01:09:33 -04:00
nitsua
154092b921 Fix issue with the table stretching on the Movie > Details > Search when the Title is extremely long 2020-08-16 00:49:33 -04:00
Qstick
28177eb042 New: Use release quality source if not in downloaded file and resolution matches
Co-Authored-By: taloth <taloth@users.noreply.github.com>
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-08-16 00:49:16 -04:00
Qstick
a6d509c871 Fixed: Possible Null Ref in Old API 2020-08-16 00:33:49 -04:00
Qstick
69f4f1c168 Fxed: Manual Import Movie filter error due to Fuse Worker updates 2020-08-15 22:38:19 -04:00
Qstick
79a96bb43f Lazy Loading fuse-worker and fixed some potential timing issues
Fixes #4765
Fixes #4766

Co-Authored-By: taloth <taloth@users.noreply.github.com>
2020-08-15 12:25:28 -04:00
Qstick
39a1dbf1d1 Used ReflectionOnly and/or public types where possible to avoid loading related assemblies unnecessarily
Fixes #4763

Co-Authored-By: taloth <taloth@users.noreply.github.com>
2020-08-15 12:25:28 -04:00
Qstick
71ad2ec794 jsconfig for a bit of autocompletion and intellisense
Fixes #4762

Co-Authored-By: taloth <taloth@users.noreply.github.com>
2020-08-15 12:25:28 -04:00
Qstick
77036ac3ef Fixed: Posters not always showing when searching for movie
Fixes #4729
Fixes #4704
2020-08-15 12:25:28 -04:00
Taloth Saldono
863252d7e9 Allow inline markdown in the changelog for linking to wiki
(cherry picked from commit c73649b19b76b9032f9b5340590dbae783ae259f)
2020-08-12 23:10:40 -04:00
Qstick
00f631c623 New: Trakt connection for adding movies to collection 2020-08-12 23:06:03 -04:00
angrycuban13
431a3f6f8f Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-13 02:34:32 +00:00
Qstick
3aafc02687 Added update check early in startup if package requested
Fixes #4723
2020-08-12 22:28:57 -04:00
Qstick
c96ffafe50 Bump minimum Mono version to 5.18
Fixes #4722
2020-08-12 22:07:23 -04:00
nitsua
487546d6f3 Cherry pick from PR 4784 to disable autofocus on table scroller 2020-08-11 23:29:00 -04:00
Qstick
9f925a5dbd Additional logging when we have to callback on language parse 2020-08-11 20:38:21 -04:00
necrobear
d6a51f875c Translated using Weblate (Danish) [skip ci]
Currently translated at 41.9% (114 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/da/
2020-08-11 03:10:07 +00:00
jpalenz77
2575e7d96a Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-11 03:10:07 +00:00
angrycuban13
50b3a83cda Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-11 03:10:07 +00:00
reloxx
0f33c9b3bd Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-08-11 03:10:07 +00:00
Addison Babcock
814283cfc3 Fix typo in English localization. 2020-08-10 23:09:57 -04:00
angrycuban13
23e1341ef3 Translated using Weblate (Spanish) [skip ci]
Currently translated at 99.6% (271 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-10 02:11:11 +00:00
jpalenz77
5413c9357c Translated using Weblate (Spanish) [skip ci]
Currently translated at 99.6% (271 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-10 02:11:10 +00:00
Qstick
eb299bfb1f Fixed: Don't show other movies files in details UI on import/refresh 2020-08-09 21:55:06 -04:00
angrycuban13
d3697c0339 Translated using Weblate (Spanish) [skip ci]
Currently translated at 98.5% (268 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-09 19:42:20 +00:00
angrycuban13
9201b8e329 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-09 18:08:00 +00:00
jpalenz77
f34ff4515a Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-09 18:08:00 +00:00
Qstick
5eeb42c3f6 New: Tooltip for Links on AddNew 2020-08-08 22:09:56 -04:00
Qstick
2d121e9857 Fixed: Entire row Link on Calendar Agenda Page 2020-08-08 22:09:56 -04:00
Qstick
3d25b99f63 Fixed: Unreleased color not showing in Calendar Agenda view 2020-08-08 22:09:56 -04:00
Qstick
30956edf52 Fixed: Don't Show Year in Discovery Overview if 0 2020-08-08 22:09:56 -04:00
Qstick
c940a03847 Fixed: Minor CSS Tweaks to Logo and Actions Buttons 2020-08-08 22:09:56 -04:00
Mark McDowall
21bc18dd2a Fixed: Long paths overflowing in movie history 2020-08-08 22:08:32 -04:00
nameproof
52da43aac4 Translated using Weblate (Swedish) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-08-09 01:59:00 +00:00
foXaCe
29ea7aab9d Translated using Weblate (French) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-08-09 01:59:00 +00:00
nitsua
236cdc9c2a Fix issue where updating a movie during a refresh would reset the saved changes
#4807
2020-08-08 16:02:45 -04:00
reloxx
4726d9daad Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-08-07 06:33:14 +00:00
Qstick
74c144b9c6 Added translation using Weblate (Hindi) 2020-08-06 21:48:00 +00:00
Mark McDowall
ff52b15154 Don't process queue item without details
(cherry picked from commit dffdd3377e198ca1ce511ec2752eb53c18c92cb3)

# Conflicts:
#	frontend/src/Store/Selectors/createQueueItemSelector.js
2020-08-06 17:40:42 -04:00
GigiPompieru
18607c8b7b Translated using Weblate (Romanian) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ro/
2020-08-06 12:34:06 +00:00
Qstick
d41eed2e79 Fixed: Migration 170 setting incorrect trakt auth values 2020-08-05 16:54:14 -04:00
GigiPompieru
7f1761bec5 Translated using Weblate (Romanian) [skip ci]
Currently translated at 68.7% (187 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ro/
2020-08-05 17:33:17 +00:00
Micky
cff8dd5856 Translated using Weblate (Turkish) [skip ci]
Currently translated at 63.9% (174 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/tr/
2020-08-05 17:33:17 +00:00
nameproof
17cbeb7cab Translated using Weblate (Swedish) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-08-05 17:33:16 +00:00
hotio
f952b7188d Translated using Weblate (Dutch) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/nl/
2020-08-05 17:33:16 +00:00
jpalenz77
16cd7dd836 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-05 17:33:15 +00:00
foXaCe
1412125dfd Translated using Weblate (French) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-08-05 17:33:14 +00:00
reloxx
6455117dbb Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (272 of 272 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-08-05 17:33:14 +00:00
Qstick
a29de48e64 Fixed: Block Video Extras from Overriding Movie File 2020-08-05 02:21:16 -04:00
Qstick
43d6b404f5 Fixed: Don't automatic import if year mismatch
Fixes #3006
2020-08-05 02:21:16 -04:00
Qstick
e3fb000226 Fixed: Use Translations in Search Criteria Map
Fixes #4794
2020-08-05 02:21:16 -04:00
nitsua
9cb3ff238b New: Added new custom filters for Not in Last/Next for date filters (#4816)
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-08-04 08:11:32 -04:00
Qstick
97980fe139 Fixed: LogLevel not persisting on v0.2 > 3 migration 2020-08-03 16:55:26 -04:00
Qstick
ec15885680 Fixed: Deleting empty folders on upgrade
Fixes #4787
Fixes SENTRY RADARR-1F
2020-08-03 02:51:10 -04:00
Qstick
695297435e Fix SystemTime Fixture Failure 2020-08-03 02:38:49 -04:00
Qstick
1a9d7c3c28 Fixed: IOE when multiple movies have same ExtraFile relative paths
Fixes RADARR-15
2020-08-03 02:09:57 -04:00
GigiPompieru
94ec28ac1e Translated using Weblate (Romanian) [skip ci]
Currently translated at 64.9% (176 of 271 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ro/
2020-08-03 05:29:44 +00:00
nameproof
a4155e0416 Translated using Weblate (Swedish) [skip ci]
Currently translated at 100.0% (271 of 271 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/sv/
2020-08-03 05:29:44 +00:00
jpalenz77
0884361df2 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (271 of 271 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-03 05:29:44 +00:00
Florian
09bea395ac Translated using Weblate (French) [skip ci]
Currently translated at 100.0% (271 of 271 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-08-03 05:29:44 +00:00
foXaCe
25d4704e6d Translated using Weblate (French) [skip ci]
Currently translated at 100.0% (271 of 271 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/fr/
2020-08-03 05:29:44 +00:00
reloxx
f0d8c7c187 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (271 of 271 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-08-03 05:29:44 +00:00
Mark McDowall
3766e0eba9 New: Show health warning if system time is off expected time
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-08-03 01:26:30 -04:00
nitsua
f39824cb9c Add changes related to lint & importing movies
Fixes #4768
2020-08-02 20:10:12 -04:00
reloxx
ef80314219 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (271 of 271 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-08-02 21:56:56 +00:00
nitsua
e232fa2c9c Fix issue with headers on movie index table view not being aligned
Fixes: #4800
2020-08-02 12:08:07 -04:00
Qstick
41fc244bda Don't even call update if list cleaning disabled 2020-08-02 02:03:47 -04:00
Jorgen1040
0bb5dfc3d2 Update default Jackett torznab link to api v2.0 2020-08-02 01:50:16 -04:00
nitsua
67b4182f4d Fixed: OriginalTitle in the API using the Title
New: Change tooltip (title) on movie details to original title
2020-08-02 01:48:32 -04:00
Qstick
27844d9f5c Fixed: Don't create empty movie folder if delete empty folders is enabled
Fixes #4782
2020-08-02 01:47:18 -04:00
Qstick
9b052101ab Fix broken build due to NetImportSearchService tests 2020-08-02 01:06:35 -04:00
Qstick
b2b0efe4ed Fixed: Single Item Exclude Broken on Discovery View 2020-08-02 01:02:36 -04:00
Qstick
b25e42c456 New: Redo Notification Triggers UI (From Lidarr) 2020-08-02 00:43:42 -04:00
Qstick
5c7e28a280 Fixed: Typo in Mapping Message 2020-08-02 00:31:42 -04:00
Qstick
bd9a93eceb Fixed: Don't blow up on batch list add if validation failure 2020-08-01 23:32:23 -04:00
Qstick
df75027e3c Bypass older mpeg-4 encoders 2020-08-01 23:12:06 -04:00
nitsua
c950006db5 Fixed: Spacing for the external links icon and width when search showing (#4797) 2020-08-01 18:23:54 -04:00
Juan
fabf9ba0e8 Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (271 of 271 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-01 10:42:30 +00:00
nitsua
c07b370569 Fixed: Issue with link/tags icon to drop a line on movie details mobile (#4667)
#4523
2020-08-01 02:47:34 -04:00
Qstick
ff7e929387 Fixed: Return correct language for French and Portuguese
Fixes #4612
2020-08-01 01:07:39 -04:00
Mark McDowall
da1210c6a6 Fixed: Show more information in UI when testing SAB fails in some cases 2020-08-01 00:36:06 -04:00
Qstick
2a1ebe54b3 Fixed: Quality Sorting in Manual Import
Fixes #4713

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-08-01 00:09:53 -04:00
Qstick
65b8be16dd Fixed: Details for episode history flashing on mobile devices
Fixes #4699

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-07-31 23:50:57 -04:00
Qstick
84c79924b7 New: Improve Chinese language detection
Fixes #4697

Co-Authored-By: taloth <taloth@users.noreply.github.com>
2020-07-31 23:48:46 -04:00
Qstick
62d2c8e1f3 Fixed: Update deleted movie health after refreshing movies
Fixes #4694

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-07-31 23:39:53 -04:00
Qstick
e6c92c05ec Improved some log messages
Fixes #4693

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2020-07-31 23:39:53 -04:00
GigiPompieru
bb02b9d83a Translated using Weblate (Romanian) [skip ci]
Currently translated at 44.1% (94 of 213 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/ro/
2020-08-01 03:07:01 +00:00
Micky
7cf7baf637 Translated using Weblate (Turkish) [skip ci]
Currently translated at 81.6% (174 of 213 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/tr/
2020-08-01 03:07:01 +00:00
Marketos Damigos
f8908936d3 Translated using Weblate (Greek) [skip ci]
Currently translated at 31.9% (68 of 213 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/el/
2020-08-01 03:07:01 +00:00
Juan
c3307570cc Translated using Weblate (Spanish) [skip ci]
Currently translated at 100.0% (213 of 213 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/es/
2020-08-01 03:07:01 +00:00
reloxx
011a80b237 Translated using Weblate (German) [skip ci]
Currently translated at 100.0% (213 of 213 strings)

Translation: Servarr/Radarr
Translate-URL: https://translate.servarr.com/projects/radarr/radarr/de/
2020-08-01 03:07:01 +00:00
Qstick
82b546999a More Frontend Translation 2020-07-31 23:05:21 -04:00
967 changed files with 25430 additions and 9561 deletions

View File

@@ -2,6 +2,12 @@
# editorconfig.org
root = true
# NOTE: Requires **VS2019 16.3** or later
# Stylecop.ruleset
# Description: Rules for Radarr
# Code files
[*.cs]
charset = utf-8
trim_trailing_whitespace = true
@@ -38,6 +44,213 @@ csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion
# Stylecop Rules
dotnet_diagnostic.SA0001.severity = none
dotnet_diagnostic.SA1005.severity = none
dotnet_diagnostic.SA1025.severity = none
dotnet_diagnostic.SA1101.severity = none
dotnet_diagnostic.SA1116.severity = none
dotnet_diagnostic.SA1118.severity = none
dotnet_diagnostic.SA1122.severity = none
dotnet_diagnostic.SA1201.severity = suggestion
dotnet_diagnostic.SA1202.severity = suggestion
dotnet_diagnostic.SA1204.severity = suggestion
dotnet_diagnostic.SA1300.severity = none
dotnet_diagnostic.SA1303.severity = none
dotnet_diagnostic.SA1304.severity = none
dotnet_diagnostic.SA1306.severity = none
dotnet_diagnostic.SA1309.severity = none
dotnet_diagnostic.SA1310.severity = none
dotnet_diagnostic.SA1401.severity = none
dotnet_diagnostic.SA1402.severity = none
dotnet_diagnostic.SA1404.severity = suggestion
dotnet_diagnostic.SA1405.severity = suggestion
dotnet_diagnostic.SA1406.severity = suggestion
dotnet_diagnostic.SA1410.severity = suggestion
dotnet_diagnostic.SA1411.severity = suggestion
dotnet_diagnostic.SA1413.severity = none
dotnet_diagnostic.SA1516.severity = none
dotnet_diagnostic.SA1600.severity = none
dotnet_diagnostic.SA1601.severity = none
dotnet_diagnostic.SA1602.severity = none
dotnet_diagnostic.SA1604.severity = none
dotnet_diagnostic.SA1605.severity = none
dotnet_diagnostic.SA1606.severity = none
dotnet_diagnostic.SA1607.severity = none
dotnet_diagnostic.SA1608.severity = none
dotnet_diagnostic.SA1610.severity = none
dotnet_diagnostic.SA1611.severity = none
dotnet_diagnostic.SA1612.severity = none
dotnet_diagnostic.SA1613.severity = none
dotnet_diagnostic.SA1614.severity = none
dotnet_diagnostic.SA1615.severity = none
dotnet_diagnostic.SA1616.severity = none
dotnet_diagnostic.SA1617.severity = none
dotnet_diagnostic.SA1618.severity = none
dotnet_diagnostic.SA1619.severity = none
dotnet_diagnostic.SA1620.severity = none
dotnet_diagnostic.SA1621.severity = none
dotnet_diagnostic.SA1622.severity = none
dotnet_diagnostic.SA1623.severity = none
dotnet_diagnostic.SA1624.severity = none
dotnet_diagnostic.SA1625.severity = none
dotnet_diagnostic.SA1626.severity = none
dotnet_diagnostic.SA1627.severity = none
dotnet_diagnostic.SA1629.severity = none
dotnet_diagnostic.SA1633.severity = none
dotnet_diagnostic.SA1634.severity = none
dotnet_diagnostic.SA1635.severity = none
dotnet_diagnostic.SA1636.severity = none
dotnet_diagnostic.SA1637.severity = none
dotnet_diagnostic.SA1638.severity = none
dotnet_diagnostic.SA1640.severity = none
dotnet_diagnostic.SA1641.severity = none
dotnet_diagnostic.SA1642.severity = none
dotnet_diagnostic.SA1643.severity = none
dotnet_diagnostic.SA1648.severity = none
dotnet_diagnostic.SA1649.severity = none
dotnet_diagnostic.SA1651.severity = none
dotnet_diagnostic.SX1101.severity = warning
dotnet_diagnostic.SX1309.severity = warning
# Microsoft Analyzers that fail and need to be sorted thru
dotnet_diagnostic.ASP0000.severity = suggestion
dotnet_diagnostic.CA1000.severity = suggestion
dotnet_diagnostic.CA1001.severity = suggestion
dotnet_diagnostic.CA1003.severity = suggestion
dotnet_diagnostic.CA1008.severity = suggestion
dotnet_diagnostic.CA1010.severity = suggestion
dotnet_diagnostic.CA1012.severity = suggestion
dotnet_diagnostic.CA1014.severity = suggestion
dotnet_diagnostic.CA1016.severity = suggestion
dotnet_diagnostic.CA1017.severity = suggestion
dotnet_diagnostic.CA1018.severity = suggestion
dotnet_diagnostic.CA1019.severity = suggestion
dotnet_diagnostic.CA1021.severity = suggestion
dotnet_diagnostic.CA1024.severity = suggestion
dotnet_diagnostic.CA1027.severity = suggestion
dotnet_diagnostic.CA1028.severity = suggestion
dotnet_diagnostic.CA1030.severity = suggestion
dotnet_diagnostic.CA1031.severity = suggestion
dotnet_diagnostic.CA1032.severity = suggestion
dotnet_diagnostic.CA1033.severity = suggestion
dotnet_diagnostic.CA1034.severity = suggestion
dotnet_diagnostic.CA1036.severity = suggestion
dotnet_diagnostic.CA1040.severity = suggestion
dotnet_diagnostic.CA1041.severity = suggestion
dotnet_diagnostic.CA1043.severity = suggestion
dotnet_diagnostic.CA1044.severity = suggestion
dotnet_diagnostic.CA1050.severity = suggestion
dotnet_diagnostic.CA1051.severity = suggestion
dotnet_diagnostic.CA1052.severity = suggestion
dotnet_diagnostic.CA1054.severity = suggestion
dotnet_diagnostic.CA1055.severity = suggestion
dotnet_diagnostic.CA1056.severity = suggestion
dotnet_diagnostic.CA1058.severity = suggestion
dotnet_diagnostic.CA1060.severity = suggestion
dotnet_diagnostic.CA1061.severity = suggestion
dotnet_diagnostic.CA1062.severity = suggestion
dotnet_diagnostic.CA1063.severity = suggestion
dotnet_diagnostic.CA1064.severity = suggestion
dotnet_diagnostic.CA1065.severity = suggestion
dotnet_diagnostic.CA1066.severity = suggestion
dotnet_diagnostic.CA1067.severity = suggestion
dotnet_diagnostic.CA1068.severity = suggestion
dotnet_diagnostic.CA1069.severity = suggestion
dotnet_diagnostic.CA1200.severity = suggestion
dotnet_diagnostic.CA1303.severity = suggestion
dotnet_diagnostic.CA1304.severity = suggestion
dotnet_diagnostic.CA1305.severity = suggestion
dotnet_diagnostic.CA1307.severity = suggestion
dotnet_diagnostic.CA1308.severity = suggestion
dotnet_diagnostic.CA1401.severity = suggestion
dotnet_diagnostic.CA1507.severity = suggestion
dotnet_diagnostic.CA1707.severity = suggestion
dotnet_diagnostic.CA1710.severity = suggestion
dotnet_diagnostic.CA1712.severity = suggestion
dotnet_diagnostic.CA1714.severity = suggestion
dotnet_diagnostic.CA1715.severity = suggestion
dotnet_diagnostic.CA1716.severity = suggestion
dotnet_diagnostic.CA1717.severity = suggestion
dotnet_diagnostic.CA1720.severity = suggestion
dotnet_diagnostic.CA1721.severity = suggestion
dotnet_diagnostic.CA1724.severity = suggestion
dotnet_diagnostic.CA1801.severity = suggestion
dotnet_diagnostic.CA1802.severity = suggestion
dotnet_diagnostic.CA1805.severity = suggestion
dotnet_diagnostic.CA1806.severity = suggestion
dotnet_diagnostic.CA1810.severity = suggestion
dotnet_diagnostic.CA1812.severity = suggestion
dotnet_diagnostic.CA1814.severity = suggestion
dotnet_diagnostic.CA1815.severity = suggestion
dotnet_diagnostic.CA1816.severity = suggestion
dotnet_diagnostic.CA1819.severity = suggestion
dotnet_diagnostic.CA1822.severity = suggestion
dotnet_diagnostic.CA1823.severity = suggestion
dotnet_diagnostic.CA1824.severity = suggestion
dotnet_diagnostic.CA2000.severity = suggestion
dotnet_diagnostic.CA2002.severity = suggestion
dotnet_diagnostic.CA2007.severity = suggestion
dotnet_diagnostic.CA2008.severity = suggestion
dotnet_diagnostic.CA2009.severity = suggestion
dotnet_diagnostic.CA2010.severity = suggestion
dotnet_diagnostic.CA2011.severity = suggestion
dotnet_diagnostic.CA2012.severity = suggestion
dotnet_diagnostic.CA2013.severity = suggestion
dotnet_diagnostic.CA2100.severity = suggestion
dotnet_diagnostic.CA2101.severity = suggestion
dotnet_diagnostic.CA2119.severity = suggestion
dotnet_diagnostic.CA2153.severity = suggestion
dotnet_diagnostic.CA2200.severity = suggestion
dotnet_diagnostic.CA2207.severity = suggestion
dotnet_diagnostic.CA2208.severity = suggestion
dotnet_diagnostic.CA2211.severity = suggestion
dotnet_diagnostic.CA2213.severity = suggestion
dotnet_diagnostic.CA2214.severity = suggestion
dotnet_diagnostic.CA2215.severity = suggestion
dotnet_diagnostic.CA2216.severity = suggestion
dotnet_diagnostic.CA2219.severity = suggestion
dotnet_diagnostic.CA2225.severity = suggestion
dotnet_diagnostic.CA2226.severity = suggestion
dotnet_diagnostic.CA2227.severity = suggestion
dotnet_diagnostic.CA2229.severity = suggestion
dotnet_diagnostic.CA2231.severity = suggestion
dotnet_diagnostic.CA2234.severity = suggestion
dotnet_diagnostic.CA2235.severity = suggestion
dotnet_diagnostic.CA2237.severity = suggestion
dotnet_diagnostic.CA2241.severity = suggestion
dotnet_diagnostic.CA2242.severity = suggestion
dotnet_diagnostic.CA2243.severity = suggestion
dotnet_diagnostic.CA2244.severity = suggestion
dotnet_diagnostic.CA2245.severity = suggestion
dotnet_diagnostic.CA2246.severity = suggestion
dotnet_diagnostic.CA3061.severity = suggestion
dotnet_diagnostic.CA3075.severity = suggestion
dotnet_diagnostic.CA3076.severity = suggestion
dotnet_diagnostic.CA3077.severity = suggestion
dotnet_diagnostic.CA3147.severity = suggestion
dotnet_diagnostic.CA5350.severity = suggestion
dotnet_diagnostic.CA5351.severity = suggestion
dotnet_diagnostic.CA5359.severity = suggestion
dotnet_diagnostic.CA5360.severity = suggestion
dotnet_diagnostic.CA5363.severity = suggestion
dotnet_diagnostic.CA5364.severity = suggestion
dotnet_diagnostic.CA5365.severity = suggestion
dotnet_diagnostic.CA5366.severity = suggestion
dotnet_diagnostic.CA5368.severity = suggestion
dotnet_diagnostic.CA5369.severity = suggestion
dotnet_diagnostic.CA5370.severity = suggestion
dotnet_diagnostic.CA5371.severity = suggestion
dotnet_diagnostic.CA5372.severity = suggestion
dotnet_diagnostic.CA5373.severity = suggestion
dotnet_diagnostic.CA5374.severity = suggestion
dotnet_diagnostic.CA5379.severity = suggestion
dotnet_diagnostic.CA5384.severity = suggestion
dotnet_diagnostic.CA5385.severity = suggestion
dotnet_diagnostic.CA5397.severity = suggestion
[*.{js,html,js,hbs,less,css}]
charset = utf-8
trim_trailing_whitespace = true

View File

@@ -6,7 +6,7 @@
**Just because you receive an exception in your logs, doesn't mean it's a bug and should be reported here. Often it's something else, such as a permission error. If you are unsure ask on the Discord or Subreddit first.**
Visit our [Discord server](https://discord.gg/NWYch8M) or [Subreddit](https://reddit.com/r/radarr) for support or longer discussions. Support questions posed on here will be closed immediately.
Visit our [Discord server](https://discord.gg/r5wJPt9) or [Subreddit](https://reddit.com/r/radarr) for support or longer discussions. Support questions posed on here will be closed immediately.
Provide a description of the feature request or bug here, the more details the better.
Please also include the following if you are reporting a bug. If you do not include it, the issue will probably be closed as we cannot help you. -->

View File

@@ -1,7 +1,7 @@
blank_issues_enabled: false
contact_links:
- name: Support via Discord
url: https://discord.gg/AD3UP37
url: https://discord.gg/r5wJPt9
about: Chat with users and devs on support and setup related topics.
- name: Support via Reddit
url: https://reddit.com/r/radarr

View File

@@ -6,6 +6,7 @@ YES | NO
#### Todos
- [ ] Tests
- [ ] Translation Keys
#### Issues Fixed or Closed by this PR

5
.github/stale.yml vendored
View File

@@ -7,7 +7,10 @@ exemptLabels:
- feature request
- parser
- confirmed
- aphrodite
- sonarr-pull
- lidarr-pull
- readarr-pull
- v3
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable

2
.github/support.yml vendored
View File

@@ -6,7 +6,7 @@ supportLabel: support
# to a support page, or set to `false` to disable
supportComment: >
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://discord.gg/ZDmT7qb) or [Subreddit](https://reddit.com/r/radarr)
However, this issue appears to be a support request. Please hop over onto our [Discord](https://discord.gg/r5wJPt9) or [Subreddit](https://reddit.com/r/radarr)
# Whether to close issues marked as support requests
close: true
# Whether to lock issues marked as support requests

View File

@@ -14,7 +14,7 @@ See the readme for information on setting up your development environment.
- Rebase from Radarr's develop branch, don't merge
- Make meaningful commits, or squash them
- Feel free to make a pull request before work is complete, this will let us see where its at and make comments/suggest improvements
- Reach out to us on the forums or on IRC if you have any questions
- Reach out to us on the discord if you have any questions
- Add tests (unit/integration)
- Commit with *nix line endings for consistency (We checkout Windows and commit *nix)
- One feature/bug fix per pull request to keep things clean and easy to understand

View File

@@ -13,28 +13,34 @@ The project was inspired by other Usenet/BitTorrent movie downloaders such as Co
## Getting Started
[![Installation](https://img.shields.io/badge/wiki-installation-brightgreen.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/wiki/Installation)
[![Docker](https://img.shields.io/badge/wiki-docker-1488C6.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/wiki/Docker)
[![Docker](https://img.shields.io/badge/wiki-docker-1488C6.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/wiki/Docker)
[![Setup Guide](https://img.shields.io/badge/wiki-setup_guide-orange.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/wiki/Setup-Guide)
[![FAQ](https://img.shields.io/badge/wiki-FAQ-BF55EC.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/wiki/FAQ)
If you are using Docker please ensure your Docker paths are setup correctly using [this guide to facilitate](https://old.reddit.com/r/usenet/wiki/docker) hardlinks and minimize permissions issues.
* [Install Radarr for your desired OS](https://github.com/Radarr/Radarr/wiki/Installation) *or* use [Docker](https://github.com/Radarr/Radarr/wiki/Docker)
* *For Linux users*, run `radarr` and *optionally* have [Radarr start automatically](https://github.com/Radarr/Radarr/wiki/Autostart-on-Linux)
* Connect to the UI through <http://localhost:7878> or <http://your-ip:7878> in your web browser
* See the [Setup Guide](https://github.com/Radarr/Radarr/wiki/Setup-Guide) for further configuration
## Downloads
Please note that v0.2 will only have critical bugs resolved as of August 2020. Any additional development or features will be soley in V3.
| Release Type | Branch: develop (stable) | Branch: nightly (semi-unstable) | Branch: aphrodite (very-unstable) |
|-----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Binary Releases | [![GitHub Releases](https://img.shields.io/badge/downloads-releases-brightgreen.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/releases) | [![AppVeyor Builds](https://img.shields.io/badge/downloads-nightly-green.svg?maxAge=60&style=flat-square)](https://ci.appveyor.com/project/galli-leo/radarr-usby1/branch/develop/artifacts) | |
| Docker | [![Docker release](https://img.shields.io/badge/linuxserver-radarr:latest-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/radarr) | [![Docker nightly](https://img.shields.io/badge/linuxserver-radarr:nightly-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/radarr) | [![Docker aphrodite](https://img.shields.io/badge/linuxserver-radarr:preview-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/radarr) |
| Docker | [![Docker release](https://img.shields.io/badge/hotio-radarr:latest-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/hotio/radarr) | [![Docker nightly](https://img.shields.io/badge/hotio-radarr:unstable-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/hotio/radarr) | [![Docker aphrodite](https://img.shields.io/badge/hotio-radarr:aphrodite-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/hotio/radarr) |
Each push to the "develop" branch creates a build on "nightly" release channel (release channel is the "branch" within radarr's settings), once we push a build to Github it will show up on "develop" release channel.
| Release Channel Type | Branch: develop (stable) (v0.2) | Branch: nightly (semi-unstable) (v3.0) |
|-----------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Binary Releases | [![GitHub Releases](https://img.shields.io/badge/downloads-releases-brightgreen.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/releases) | [![Azure Build](https://img.shields.io/badge/downloads-Windows_X64-green.svg?maxAge=60&style=flat-square)](https://radarr.servarr.com/v1/update/nightly/updatefile?os=windows&runtime=netcore&arch=x64) <br> [![Azure Build](https://img.shields.io/badge/downloads-Linux_X64-green.svg?maxAge=60&style=flat-square)](https://radarr.servarr.com/v1/update/nightly/updatefile?os=linux&runtime=netcore&arch=x64) <br> [![Azure Build](https://img.shields.io/badge/downloads-Linux_ARM64-green.svg?maxAge=60&style=flat-square)](https://radarr.servarr.com/v1/update/nightly/updatefile?os=linux&runtime=netcore&arch=arm64) [![Azure Build](https://img.shields.io/badge/downloads-Linux_ARM-green.svg?maxAge=60&style=flat-square)](https://radarr.servarr.com/v1/update/nightly/updatefile?os=linux&runtime=netcore&arch=arm) <br> [![Azure Build](https://img.shields.io/badge/downloads-macOS-green.svg?maxAge=60&style=flat-square)](https://radarr.servarr.com/v1/update/nightly/updatefile?os=osx&runtime=netcore&arch=x64)
| Docker - lsio | [![Docker release](https://img.shields.io/badge/linuxserver-radarr:latest-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/radarr) | [![Docker nightly](https://img.shields.io/badge/linuxserver-radarr:nightly-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/linuxserver/radarr) |
| Docker - hotio | [![Docker release](https://img.shields.io/badge/hotio-radarr:latest-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/hotio/radarr) | [![Docker nightly](https://img.shields.io/badge/hotio-radarr:nightly-blue.svg?colorB=1488C6&maxAge=60&style=flat-square)](https://hub.docker.com/r/hotio/radarr) |
## Support
[![Discord](https://img.shields.io/badge/discord-chat-7289DA.svg?maxAge=60&style=flat-square)](https://discord.gg/AD3UP37)
[![Discord](https://img.shields.io/badge/discord-chat-r5wJPt9.svg?maxAge=60&style=flat-square)](https://discord.gg/r5wJPt9)
[![Reddit](https://img.shields.io/badge/reddit-discussion-FF4500.svg?maxAge=60&style=flat-square)](https://www.reddit.com/r/radarr)
[![Feathub](https://img.shields.io/badge/feathub-requests-lightgrey.svg?maxAge=60&style=flat-square)](http://feathub.com/Radarr/Radarr)
[![GitHub](https://img.shields.io/badge/github-issues-red.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/issues)
[![GitHub Wiki](https://img.shields.io/badge/github-wiki-181717.svg?maxAge=60&style=flat-square)](https://github.com/Radarr/Radarr/wiki)
@@ -72,18 +78,14 @@ Radarr is currently undergoing rapid development and pull requests are actively
* New TorrentPotato Indexer
* Torznab Indexer now supports Movies (Works well with [Jackett](https://github.com/Jackett/Jackett))
* Scanning PreDB to know when a new release is available
* Importing movies from various online sources, such as IMDb Watchlists (A complete list can be found [here](https://github.com/Radarr/Radarr/issues/114))
* Importing movies from various online sources, such as IMDb Watchlists or Trakt (v3) (A complete list can be found [here](https://github.com/Radarr/Radarr/issues/114))
* Full integration with Kodi, Plex (notification, library update)
* And a beautiful UI
* And a new beautiful UI (v3)
* Importing Metadata such as trailers or subtitles
* Adding metadata such as posters and information for Kodi and others to use
* Advanced customization for profiles, such that Radarr will always download the copy you want
### Planned Features
See the [Roadmap blogpost](https://blog.radarr.video/development/update/2018/11/11/roadmap-update.html) for an overview of planned features.
#### [Feature Requests](http://feathub.com/Radarr/Radarr)
#### [Feature Requests](https://github.com/Radarr/Radarr/issues/new?assignees=&labels=feature+request&template=feature_request.md&title=)
## Configuring the Development Environment

View File

@@ -13,17 +13,17 @@ variables:
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
sentryOrg: 'servarr'
sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '3.1.302'
dotnetVersion: '3.1.401'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
trigger:
branches:
include:
- develop
- aphrodite
- master
pr:
- develop
- aphrodite
stages:
- stage: Setup
@@ -39,7 +39,7 @@ stages:
displayName: Set Build Name
- bash: |
if [[ $BUILD_REASON == "PullRequest" ]]; then
git diff origin/aphrodite...HEAD --name-only | grep -E "^(src/|azure-pipelines.yml)"
git diff origin/develop...HEAD --name-only | grep -E "^(src/|azure-pipelines.yml)"
echo $? > not_backend_update
else
echo 0 > not_backend_update
@@ -68,6 +68,9 @@ stages:
pool:
vmImage: $(imageName)
variables:
# Disable stylecop here - linting errors get caught by the analyze task
EnableAnalyzers: 'false'
steps:
- checkout: self
submodules: true
@@ -136,10 +139,19 @@ stages:
- checkout: self
submodules: true
fetchDepth: 1
- task: Cache@2
inputs:
key: 'yarn | "$(osName)" | yarn.lock'
restoreKeys: |
yarn | "$(osName)"
yarn
path: $(yarnCacheFolder)
displayName: Cache Yarn packages
- bash: ./build.sh --frontend
displayName: Build Radarr Frontend
env:
FORCE_COLOR: 0
YARN_CACHE_FOLDER: $(yarnCacheFolder)
- publish: $(outputFolder)
artifact: '$(osName)Frontend'
displayName: Publish Frontend
@@ -289,14 +301,22 @@ stages:
sentry-cli releases new --finalize -p radarr -p radarr-ui -p radarr-update "${RELEASENAME}"
sentry-cli releases -p radarr-ui files "${RELEASENAME}" upload-sourcemaps _output/UI/ --rewrite
sentry-cli releases set-commits --auto "${RELEASENAME}"
sentry-cli releases deploys "${RELEASENAME}" new -e aphrodite
if [[ ${BUILD_SOURCEBRANCH} == "refs/heads/develop" ]]; then
sentry-cli releases deploys "${RELEASENAME}" new -e nightly
else
sentry-cli releases deploys "${RELEASENAME}" new -e production
fi
if [ $? -gt 0 ]; then
echo "##vso[task.logissue type=warning]Error uploading source maps."
fi
exit 0
displayName: Publish Sentry Source Maps
continueOnError: true
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/aphrodite'))
condition: |
or
(
and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop')),
and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master'))
)
env:
SENTRY_AUTH_TOKEN: $(sentryAuthTokenServarr)
SENTRY_ORG: $(sentryOrg)
@@ -402,10 +422,6 @@ stages:
condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0'))
strategy:
matrix:
mono508:
testName: 'Mono 5.8'
artifactName: LinuxTests
containerImage: servarr/testimages:mono-5.8
mono520:
testName: 'Mono 5.20'
artifactName: LinuxTests
@@ -555,11 +571,6 @@ stages:
condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0'))
strategy:
matrix:
mono508:
testName: 'Mono 5.8'
artifactName: LinuxTests
containerImage: servarr/testimages:mono-5.8
pattern: 'Radarr.**.linux.tar.gz'
mono520:
testName: 'Mono 5.20'
artifactName: LinuxTests
@@ -577,7 +588,7 @@ stages:
pattern: 'Radarr.**.linux.tar.gz'
alpine:
testName: 'Musl Net Core'
artifactName: LinuxCoreTests
artifactName: LinuxMuslCoreTests
containerImage: servarr/testimages:alpine
pattern: 'Radarr.**.linux-musl-core-x64.tar.gz'
pool:
@@ -642,14 +653,14 @@ stages:
failBuild: true
Mac:
osName: 'Mac'
imageName: 'macos-10.14' # Fails due to firefox not being installed on image
imageName: 'macos-10.14'
pattern: 'Radarr.**.osx-core-x64.tar.gz'
failBuild: false
failBuild: true
Windows:
osName: 'Windows'
imageName: 'windows-2019'
pattern: 'Radarr.**.windows-core-x64.zip'
failBuild: $(failOnAutomationFailure)
failBuild: true
pool:
vmImage: $(imageName)
@@ -684,9 +695,9 @@ stages:
displayName: Move Package Contents
- bash: |
if [[ $OSNAME == "Mac" ]]; then
url=https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-macos.tar.gz
url=https://github.com/mozilla/geckodriver/releases/download/v0.27.0/geckodriver-v0.27.0-macos.tar.gz
elif [[ $OSNAME == "Linux" ]]; then
url=https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-linux64.tar.gz
url=https://github.com/mozilla/geckodriver/releases/download/v0.27.0/geckodriver-v0.27.0-linux64.tar.gz
else
echo "Unhandled OS"
exit 1
@@ -699,7 +710,7 @@ stages:
- bash: |
chmod a+x ${TESTSFOLDER}/test.sh
${TESTSFOLDER}/test.sh ${OSNAME} Automation Test
displayName: Run Integration Tests
displayName: Run Automation Tests
- task: PublishTestResults@2
inputs:
testResultsFormat: 'NUnit'
@@ -747,10 +758,19 @@ stages:
- checkout: self
submodules: true
fetchDepth: 1
- task: Cache@2
inputs:
key: 'yarn | "$(osName)" | yarn.lock'
restoreKeys: |
yarn | "$(osName)"
yarn
path: $(yarnCacheFolder)
displayName: Cache Yarn packages
- bash: ./build.sh --lint
displayName: Lint Radarr Frontend
env:
FORCE_COLOR: 0
YARN_CACHE_FOLDER: $(yarnCacheFolder)
- job: Analyze_Frontend
displayName: Frontend

View File

@@ -235,7 +235,7 @@ PackageTests()
# geckodriver.exe isn't copied by dotnet publish
if [ "$runtime" = "win-x64" ];
then
curl -Lso gecko.zip "https://github.com/mozilla/geckodriver/releases/download/v0.26.0/geckodriver-v0.26.0-win64.zip"
curl -Lso gecko.zip "https://github.com/mozilla/geckodriver/releases/download/v0.27.0/geckodriver-v0.27.0-win64.zip"
unzip -o gecko.zip
cp geckodriver.exe "$testPackageFolder/$framework/win-x64/publish"
fi

View File

@@ -75,7 +75,7 @@
"function-parentheses-newline-inside": "never-multi-line",
"function-parentheses-space-inside": "never",
"function-url-quotes": "always",
"function-url-scheme-blacklist": [
"function-url-scheme-disallowed-list": [
"data"
],
"function-whitespace-after": "always",

View File

@@ -7,6 +7,7 @@ const errorHandler = require('./helpers/errorHandler');
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const HtmlWebpackPluginHtmlTags = require('html-webpack-plugin/lib/html-tags');
const TerserPlugin = require('terser-webpack-plugin');
const uiFolder = 'UI';
@@ -14,7 +15,7 @@ const frontendFolder = path.join(__dirname, '..');
const srcFolder = path.join(frontendFolder, 'src');
const isProduction = process.argv.indexOf('--production') > -1;
const isProfiling = isProduction && process.argv.indexOf('--profile') > -1;
const inlineWebWorkers = true;
const inlineWebWorkers = 'no-fallback';
const distFolder = path.resolve(frontendFolder, '..', '_output', uiFolder);
@@ -32,14 +33,19 @@ const cssVarsFiles = [
].map(require.resolve);
// Override the way HtmlWebpackPlugin injects the scripts
// TODO: Find a better way to get these paths without
HtmlWebpackPlugin.prototype.injectAssetsIntoHtml = function(html, assets, assetTags) {
const head = assetTags.head.map((v) => {
v.attributes = { rel: 'stylesheet', type: 'text/css', href: `/${v.attributes.href.replace('\\', '/')}` };
return this.createHtmlTag(v);
const head = assetTags.headTags.map((v) => {
const href = v.attributes.href
.replace('\\', '/')
.replace('%5C', '/');
v.attributes = { rel: 'stylesheet', type: 'text/css', href: `/${href}` };
return HtmlWebpackPluginHtmlTags.htmlTagObjectToString(v, this.options.xhtml);
});
const body = assetTags.body.map((v) => {
const body = assetTags.bodyTags.map((v) => {
v.attributes = { src: `/${v.attributes.src}` };
return this.createHtmlTag(v);
return HtmlWebpackPluginHtmlTags.htmlTagObjectToString(v, this.options.xhtml);
});
return html
@@ -125,9 +131,8 @@ const config = {
use: {
loader: 'worker-loader',
options: {
name: '[name].js',
inline: inlineWebWorkers,
fallback: !inlineWebWorkers
filename: '[name].js',
inline: inlineWebWorkers
}
}
},

20
frontend/jsconfig.json Normal file
View File

@@ -0,0 +1,20 @@
{
"compilerOptions": {
"target": "es6",
"checkJs": false,
"baseUrl": "src",
"jsx": "react",
"module": "commonjs",
"moduleResolution": "node",
"paths": {
"*": [
"*"
]
}
},
"include": [
"./src/**/*"
],
"exclude": [
]
}

View File

@@ -33,7 +33,7 @@ class Blacklist extends Component {
} = this.props;
return (
<PageContent title="Blacklist">
<PageContent title={translate('Blacklist')}>
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
@@ -65,13 +65,15 @@ class Blacklist extends Component {
{
!isFetching && !!error &&
<div>Unable to load blacklist</div>
<div>
{translate('UnableToLoadBlacklist')}
</div>
}
{
isPopulated && !error && !items.length &&
<div>
No history blacklist
{translate('NoHistory')}
</div>
}

View File

@@ -8,6 +8,7 @@ import ModalBody from 'Components/Modal/ModalBody';
import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import translate from 'Utilities/String/translate';
class BlacklistDetailsModal extends Component {
@@ -39,19 +40,19 @@ class BlacklistDetailsModal extends Component {
<ModalBody>
<DescriptionList>
<DescriptionListItem
title="Name"
title={translate('Name')}
data={sourceTitle}
/>
<DescriptionListItem
title="Protocol"
title={translate('Protocol')}
data={protocol}
/>
{
!!message &&
<DescriptionListItem
title="Indexer"
title={translate('Indexer')}
data={indexer}
/>
}
@@ -59,7 +60,7 @@ class BlacklistDetailsModal extends Component {
{
!!message &&
<DescriptionListItem
title="Message"
title={translate('Message')}
data={message}
/>
}
@@ -68,7 +69,7 @@ class BlacklistDetailsModal extends Component {
<ModalFooter>
<Button onPress={onModalClose}>
Close
{translate('Close')}
</Button>
</ModalFooter>
</ModalContent>

View File

@@ -9,6 +9,7 @@ import MovieFormats from 'Movie/MovieFormats';
import MovieLanguage from 'Movie/MovieLanguage';
import MovieQuality from 'Movie/MovieQuality';
import MovieTitleLink from 'Movie/MovieTitleLink';
import translate from 'Utilities/String/translate';
import BlacklistDetailsModal from './BlacklistDetailsModal';
import styles from './BlacklistRow.css';
@@ -155,7 +156,7 @@ class BlacklistRow extends Component {
/>
<IconButton
title="Remove from blacklist"
title={translate('RemoveFromBlacklist')}
name={icons.REMOVE}
kind={kinds.DANGER}
onPress={onRemovePress}

View File

@@ -7,6 +7,7 @@ import DescriptionListItemTitle from 'Components/DescriptionList/DescriptionList
import Link from 'Components/Link/Link';
import formatDateTime from 'Utilities/Date/formatDateTime';
import formatAge from 'Utilities/Number/formatAge';
import translate from 'Utilities/String/translate';
import styles from './HistoryDetails.css';
function HistoryDetails(props) {
@@ -35,14 +36,14 @@ function HistoryDetails(props) {
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
title={translate('Name')}
data={sourceTitle}
/>
{
!!indexer &&
<DescriptionListItem
title="Indexer"
title={translate('Indexer')}
data={indexer}
/>
}
@@ -51,7 +52,7 @@ function HistoryDetails(props) {
!!releaseGroup &&
<DescriptionListItem
descriptionClassName={styles.description}
title="Release Group"
title={translate('ReleaseGroup')}
data={releaseGroup}
/>
}
@@ -72,7 +73,7 @@ function HistoryDetails(props) {
{
!!downloadClient &&
<DescriptionListItem
title="Download Client"
title={translate('DownloadClient')}
data={downloadClient}
/>
}
@@ -80,7 +81,7 @@ function HistoryDetails(props) {
{
!!downloadId &&
<DescriptionListItem
title="Grab ID"
title={translate('GrabID')}
data={downloadId}
/>
}
@@ -88,7 +89,7 @@ function HistoryDetails(props) {
{
!!indexer &&
<DescriptionListItem
title="Age (when grabbed)"
title={translate('AgeWhenGrabbed')}
data={formatAge(age, ageHours, ageMinutes)}
/>
}
@@ -96,7 +97,7 @@ function HistoryDetails(props) {
{
!!publishedDate &&
<DescriptionListItem
title="Published Date"
title={translate('PublishedDate')}
data={formatDateTime(publishedDate, shortDateFormat, timeFormat, { includeSeconds: true })}
/>
}
@@ -113,14 +114,14 @@ function HistoryDetails(props) {
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
title={translate('Name')}
data={sourceTitle}
/>
{
!!message &&
<DescriptionListItem
title="Message"
title={translate('Message')}
data={message}
/>
}
@@ -138,7 +139,7 @@ function HistoryDetails(props) {
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
title={translate('Name')}
data={sourceTitle}
/>
@@ -146,7 +147,7 @@ function HistoryDetails(props) {
!!droppedPath &&
<DescriptionListItem
descriptionClassName={styles.description}
title="Source"
title={translate('Source')}
data={droppedPath}
/>
}
@@ -155,7 +156,7 @@ function HistoryDetails(props) {
!!importedPath &&
<DescriptionListItem
descriptionClassName={styles.description}
title="Imported To"
title={translate('ImportedTo')}
data={importedPath}
/>
}
@@ -187,12 +188,12 @@ function HistoryDetails(props) {
return (
<DescriptionList>
<DescriptionListItem
title="Name"
title={translate('Name')}
data={sourceTitle}
/>
<DescriptionListItem
title="Reason"
title={translate('Reason')}
data={reasonMessage}
/>
</DescriptionList>
@@ -210,22 +211,22 @@ function HistoryDetails(props) {
return (
<DescriptionList>
<DescriptionListItem
title="Source Path"
title={translate('SourcePath')}
data={sourcePath}
/>
<DescriptionListItem
title="Source Relative Path"
title={translate('SourceRelativePath')}
data={sourceRelativePath}
/>
<DescriptionListItem
title="Destination Path"
title={translate('DestinationPath')}
data={path}
/>
<DescriptionListItem
title="Destination Relative Path"
title={translate('DestinationRelativePath')}
data={relativePath}
/>
</DescriptionList>
@@ -241,14 +242,14 @@ function HistoryDetails(props) {
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
title={translate('Name')}
data={sourceTitle}
/>
{
!!message &&
<DescriptionListItem
title="Message"
title={translate('Message')}
data={message}
/>
}
@@ -260,7 +261,7 @@ function HistoryDetails(props) {
<DescriptionList>
<DescriptionListItem
descriptionClassName={styles.description}
title="Name"
title={translate('Name')}
data={sourceTitle}
/>
</DescriptionList>

View File

@@ -1,4 +1,3 @@
import _ from 'lodash';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
@@ -8,10 +7,10 @@ function createMapStateToProps() {
return createSelector(
createUISettingsSelector(),
(uiSettings) => {
return _.pick(uiSettings, [
'shortDateFormat',
'timeFormat'
]);
return {
shortDateFormat: uiSettings.shortDateFormat,
timeFormat: uiSettings.timeFormat
};
}
);
}

View File

@@ -8,6 +8,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import HistoryDetails from './HistoryDetails';
import styles from './HistoryDetailsModal.css';
@@ -79,7 +80,7 @@ function HistoryDetailsModal(props) {
<Button
onPress={onModalClose}
>
Close
{translate('Close')}
</Button>
</ModalFooter>
</ModalContent>

View File

@@ -43,7 +43,7 @@ class History extends Component {
const hasError = error || moviesError;
return (
<PageContent title="History">
<PageContent title={translate('History')}>
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
@@ -83,7 +83,9 @@ class History extends Component {
{
!isFetchingAny && hasError &&
<div>Unable to load history</div>
<div>
{translate('UnableToLoadHistory')}
</div>
}
{

View File

@@ -149,7 +149,7 @@ class Queue extends Component {
const disableSelectedActions = selectedCount === 0;
return (
<PageContent title="Queue">
<PageContent title={translate('Queue')}>
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
@@ -162,7 +162,7 @@ class Queue extends Component {
<PageToolbarSeparator />
<PageToolbarButton
label="Grab Selected"
label={translate('GrabSelected')}
iconName={icons.DOWNLOAD}
isDisabled={disableSelectedActions || !isPendingSelected}
isSpinning={isGrabbing}
@@ -170,7 +170,7 @@ class Queue extends Component {
/>
<PageToolbarButton
label="Remove Selected"
label={translate('RemoveSelected')}
iconName={icons.REMOVE}
isDisabled={disableSelectedActions}
isSpinning={isRemoving}

View File

@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
import React from 'react';
import Icon from 'Components/Icon';
import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function QueueDetails(props) {
const {
@@ -10,20 +11,20 @@ function QueueDetails(props) {
size,
sizeleft,
estimatedCompletionTime,
status: queueStatus,
status,
trackedDownloadState,
trackedDownloadStatus,
errorMessage,
progressBar
} = props;
const status = queueStatus.toLowerCase();
const progress = (100 - sizeleft / size * 100);
const progress = size ? (100 - sizeleft / size * 100) : 0;
if (status === 'pending') {
return (
<Icon
name={icons.PENDING}
title={`Release will be processed ${moment(estimatedCompletionTime).fromNow()}`}
title={translate('ReleaseWillBeProcessedInterp', [moment(estimatedCompletionTime).fromNow()])}
/>
);
}
@@ -34,12 +35,40 @@ function QueueDetails(props) {
<Icon
name={icons.DOWNLOAD}
kind={kinds.DANGER}
title={`Import failed: ${errorMessage}`}
title={translate('ImportFailedInterp', [errorMessage])}
/>
);
}
// TODO: show an icon when download is complete, but not imported yet?
if (trackedDownloadStatus === 'warning') {
return (
<Icon
name={icons.DOWNLOAD}
kind={kinds.WARNING}
title={'Downloaded - Unable to Import: check logs for details'}
/>
);
}
if (trackedDownloadState === 'importPending') {
return (
<Icon
name={icons.DOWNLOAD}
kind={kinds.PURPLE}
title={`${translate('Downloaded')} - ${translate('WaitingToImport')}`}
/>
);
}
if (trackedDownloadState === 'importing') {
return (
<Icon
name={icons.DOWNLOAD}
kind={kinds.PURPLE}
title={`${translate('Downloaded')} - ${translate('Importing')}`}
/>
);
}
}
if (errorMessage) {
@@ -47,7 +76,7 @@ function QueueDetails(props) {
<Icon
name={icons.DOWNLOADING}
kind={kinds.DANGER}
title={`Download failed: ${errorMessage}`}
title={translate('DownloadFailedInterp', [errorMessage])}
/>
);
}
@@ -57,7 +86,7 @@ function QueueDetails(props) {
<Icon
name={icons.DOWNLOADING}
kind={kinds.DANGER}
title="Download failed: check download client for more details"
title={translate('DownloadFailedCheckDownloadClientForMoreDetails')}
/>
);
}
@@ -67,7 +96,7 @@ function QueueDetails(props) {
<Icon
name={icons.DOWNLOADING}
kind={kinds.WARNING}
title="Download warning: check download client for more details"
title={translate('DownloadWarningCheckDownloadClientForMoreDetails')}
/>
);
}
@@ -76,7 +105,7 @@ function QueueDetails(props) {
return (
<Icon
name={icons.DOWNLOADING}
title={`Movie is downloading - ${progress.toFixed(1)}% ${title}`}
title={translate('MovieIsDownloadingInterp', [progress.toFixed(1), title])}
/>
);
}
@@ -90,6 +119,8 @@ QueueDetails.propTypes = {
sizeleft: PropTypes.number.isRequired,
estimatedCompletionTime: PropTypes.string,
status: PropTypes.string.isRequired,
trackedDownloadState: PropTypes.string.isRequired,
trackedDownloadStatus: PropTypes.string.isRequired,
errorMessage: PropTypes.string,
progressBar: PropTypes.node.isRequired
};

View File

@@ -4,6 +4,7 @@ import FormGroup from 'Components/Form/FormGroup';
import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
class QueueOptions extends Component {
@@ -54,13 +55,13 @@ class QueueOptions extends Component {
return (
<Fragment>
<FormGroup>
<FormLabel>Show Unknown Movie Items</FormLabel>
<FormLabel>{translate('ShowUnknownMovieItems')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="includeUnknownMovieItems"
value={includeUnknownMovieItems}
helpText="Show items without a movie in the queue, this could include removed movie, movies or anything else in Radarr's category"
helpText={translate('IncludeUnknownMovieItemsHelpText')}
onChange={this.onOptionChange}
/>
</FormGroup>

View File

@@ -15,6 +15,7 @@ import MovieLanguage from 'Movie/MovieLanguage';
import MovieQuality from 'Movie/MovieQuality';
import MovieTitleLink from 'Movie/MovieTitleLink';
import formatBytes from 'Utilities/Number/formatBytes';
import translate from 'Utilities/String/translate';
import QueueStatusCell from './QueueStatusCell';
import RemoveQueueItemModal from './RemoveQueueItemModal';
import TimeleftCell from './TimeleftCell';
@@ -294,7 +295,7 @@ class QueueRow extends Component {
}
<SpinnerIconButton
title="Remove from queue"
title={translate('RemoveFromQueue')}
name={icons.REMOVE}
isSpinning={isRemoving}
onPress={this.onRemoveQueueItemPress}

View File

@@ -4,6 +4,7 @@ import Icon from 'Components/Icon';
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import Popover from 'Components/Tooltip/Popover';
import { icons, kinds, tooltipPositions } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './QueueStatusCell.css';
function getDetailedPopoverBody(statusMessages) {
@@ -49,34 +50,34 @@ function QueueStatusCell(props) {
// status === 'downloading'
let iconName = icons.DOWNLOADING;
let iconKind = kinds.DEFAULT;
let title = 'Downloading';
let title = translate('Downloading');
if (status === 'paused') {
iconName = icons.PAUSED;
title = 'Paused';
title = translate('Paused');
}
if (status === 'queued') {
iconName = icons.QUEUED;
title = 'Queued';
title = translate('Queued');
}
if (status === 'completed') {
iconName = icons.DOWNLOADED;
title = 'Downloaded';
title = translate('Downloaded');
if (trackedDownloadState === 'importPending') {
title += ' - Waiting to Import';
title += ` - ${translate('WaitingToImport')}`;
iconKind = kinds.PURPLE;
}
if (trackedDownloadState === 'importing') {
title += ' - Importing';
title += ` - ${translate('Importing')}`;
iconKind = kinds.PURPLE;
}
if (trackedDownloadState === 'failedPending') {
title += ' - Waiting to Process';
title += ` - ${translate('WaitingToProcess')}`;
iconKind = kinds.DANGER;
}
}
@@ -87,36 +88,37 @@ function QueueStatusCell(props) {
if (status === 'delay') {
iconName = icons.PENDING;
title = 'Pending';
title = translate('Pending');
}
if (status === 'DownloadClientUnavailable') {
iconName = icons.PENDING;
iconKind = kinds.WARNING;
title = 'Pending - Download client is unavailable';
title = `${translate('Pending')} - ${translate('DownloadClientUnavailable')}`;
}
if (status === 'failed') {
iconName = icons.DOWNLOADING;
iconKind = kinds.DANGER;
title = 'Download failed';
title = translate('DownloadFailed');
}
if (status === 'warning') {
iconName = icons.DOWNLOADING;
iconKind = kinds.WARNING;
title = `Download warning: ${errorMessage || 'check download client for more details'}`;
const warningMessage = errorMessage || translate('CheckDownloadClientForDetails');
title = translate('DownloadWarning', [warningMessage]);
}
if (hasError) {
if (status === 'completed') {
iconName = icons.DOWNLOAD;
iconKind = kinds.DANGER;
title = `Import failed: ${sourceTitle}`;
title = translate('ImportFailed', [sourceTitle]);
} else {
iconName = icons.DOWNLOADING;
iconKind = kinds.DANGER;
title = 'Download failed';
title = translate('DownloadFailed');
}
}
@@ -148,8 +150,8 @@ QueueStatusCell.propTypes = {
};
QueueStatusCell.defaultProps = {
trackedDownloadStatus: 'Ok',
trackedDownloadState: 'Downloading'
trackedDownloadStatus: translate('Ok'),
trackedDownloadState: translate('Downloading')
};
export default QueueStatusCell;

View File

@@ -10,6 +10,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
class RemoveQueueItemModal extends Component {
@@ -89,25 +90,25 @@ class RemoveQueueItemModal extends Component {
</div>
<FormGroup>
<FormLabel>Remove From Download Client</FormLabel>
<FormLabel>{translate('RemoveFromDownloadClient')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="remove"
value={remove}
helpTextWarning="Removing will remove the download and the file(s) from the download client."
helpTextWarning={translate('RemoveHelpTextWarning')}
isDisabled={!canIgnore}
onChange={this.onRemoveChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>Blacklist Release</FormLabel>
<FormLabel>{translate('BlacklistRelease')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="blacklist"
value={blacklist}
helpText="Starts a search for this movie again and prevents this release from being grabbed again"
helpText={translate('BlacklistHelpText')}
onChange={this.onBlacklistChange}
/>
</FormGroup>
@@ -116,7 +117,7 @@ class RemoveQueueItemModal extends Component {
<ModalFooter>
<Button onPress={this.onModalClose}>
Close
{translate('Close')}
</Button>
<Button

View File

@@ -10,6 +10,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './RemoveQueueItemsModal.css';
class RemoveQueueItemsModal extends Component {
@@ -90,13 +91,13 @@ class RemoveQueueItemsModal extends Component {
</div>
<FormGroup>
<FormLabel>Remove From Download Client</FormLabel>
<FormLabel>{translate('RemoveFromDownloadClient')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="remove"
value={remove}
helpTextWarning="Removing will remove the download and the file(s) from the download client."
helpTextWarning={translate('RemoveHelpTextWarning')}
isDisabled={!canIgnore}
onChange={this.onRemoveChange}
/>
@@ -111,7 +112,7 @@ class RemoveQueueItemsModal extends Component {
type={inputTypes.CHECK}
name="blacklist"
value={blacklist}
helpText="Prevents Radarr from automatically grabbing this movie again"
helpText={translate('BlacklistHelpText')}
onChange={this.onBlacklistChange}
/>
</FormGroup>
@@ -120,7 +121,7 @@ class RemoveQueueItemsModal extends Component {
<ModalFooter>
<Button onPress={this.onModalClose}>
Close
{translate('Close')}
</Button>
<Button

View File

@@ -5,6 +5,7 @@ import formatTime from 'Utilities/Date/formatTime';
import formatTimeSpan from 'Utilities/Date/formatTimeSpan';
import getRelativeDate from 'Utilities/Date/getRelativeDate';
import formatBytes from 'Utilities/Number/formatBytes';
import translate from 'Utilities/String/translate';
import styles from './TimeleftCell.css';
function TimeleftCell(props) {
@@ -26,7 +27,7 @@ function TimeleftCell(props) {
return (
<TableRowCell
className={styles.timeleft}
title={`Delaying download until ${date} at ${time}`}
title={translate('DelayingDownloadUntilInterp', [date, time])}
>
-
</TableRowCell>
@@ -40,7 +41,7 @@ function TimeleftCell(props) {
return (
<TableRowCell
className={styles.timeleft}
title={`Retrying download ${date} at ${time}`}
title={translate('RetryingDownloadInterp', [date, time])}
>
-
</TableRowCell>

View File

@@ -88,7 +88,7 @@ class AddNewMovie extends Component {
const isFetching = this.state.isFetching;
return (
<PageContent title="Add New Movie">
<PageContent title={translate('AddNewMovie')}>
<PageContentBody>
<div className={styles.searchContainer}>
<div className={styles.searchIconContainer}>
@@ -127,7 +127,7 @@ class AddNewMovie extends Component {
!isFetching && !!error ?
<div className={styles.message}>
<div className={styles.helpText}>
Failed to load search results, please try again.
{translate('FailedLoadingSearchResults')}
</div>
<div>{getErrorMessage(error)}</div>
</div> : null
@@ -152,11 +152,15 @@ class AddNewMovie extends Component {
{
!isFetching && !error && !items.length && !!term &&
<div className={styles.message}>
<div className={styles.noResults}>Couldn't find any results for '{term}'</div>
<div>You can also search using TMDB ID or IMDB ID of a movie. eg. tmdb:71663</div>
<div className={styles.noResults}>
{translate('CouldNotFindResults', [term])}
</div>
<div>
{translate('YouCanAlsoSearch')}
</div>
<div>
<Link to="https://github.com/Radarr/Radarr/wiki/FAQ#why-cant-i-add-a-new-movie-when-i-know-the-tmdb-id">
Why can't I find my movie?
{translate('CantFindMovie')}
</Link>
</div>
</div>
@@ -169,7 +173,9 @@ class AddNewMovie extends Component {
<div className={styles.helpText}>
{translate('AddNewMessage')}
</div>
<div>{translate('AddNewTmdbIdMessage')}</div>
<div>
{translate('AddNewTmdbIdMessage')}
</div>
</div>
}
@@ -177,14 +183,14 @@ class AddNewMovie extends Component {
!term && !hasExistingMovies ?
<div className={styles.message}>
<div className={styles.noMoviesText}>
You haven't added any movies yet, do you want to import some or all of your movies first?
{translate('HaveNotAddedMovies')}
</div>
<div>
<Button
to="/add/import"
kind={kinds.PRIMARY}
>
Import Existing Movies
{translate('ImportExistingMovies')}
</Button>
</div>
</div> :

View File

@@ -4,7 +4,7 @@ import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { clearAddMovie, lookupMovie } from 'Store/Actions/addMovieActions';
import { fetchRootFolders } from 'Store/Actions/rootFolderActions';
import { fetchNetImportExclusions } from 'Store/Actions/Settings/netImportExclusions';
import { fetchImportExclusions } from 'Store/Actions/Settings/importExclusions';
import parseUrl from 'Utilities/String/parseUrl';
import AddNewMovie from './AddNewMovie';
@@ -29,7 +29,7 @@ const mapDispatchToProps = {
lookupMovie,
clearAddMovie,
fetchRootFolders,
fetchNetImportExclusions
fetchImportExclusions
};
class AddNewMovieConnector extends Component {
@@ -45,7 +45,7 @@ class AddNewMovieConnector extends Component {
componentDidMount() {
this.props.fetchRootFolders();
this.props.fetchNetImportExclusions();
this.props.fetchImportExclusions();
}
componentWillUnmount() {
@@ -102,7 +102,7 @@ AddNewMovieConnector.propTypes = {
lookupMovie: PropTypes.func.isRequired,
clearAddMovie: PropTypes.func.isRequired,
fetchRootFolders: PropTypes.func.isRequired,
fetchNetImportExclusions: PropTypes.func.isRequired
fetchImportExclusions: PropTypes.func.isRequired
};
export default connect(createMapStateToProps, mapDispatchToProps)(AddNewMovieConnector);

View File

@@ -12,6 +12,7 @@ import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes, kinds } from 'Helpers/Props';
import MoviePoster from 'Movie/MoviePoster';
import translate from 'Utilities/String/translate';
import styles from './AddNewMovieModalContent.css';
class AddNewMovieModalContent extends Component {
@@ -95,7 +96,7 @@ class AddNewMovieModalContent extends Component {
<Form>
<FormGroup>
<FormLabel>Root Folder</FormLabel>
<FormLabel>{translate('RootFolder')}</FormLabel>
<FormInputGroup
type={inputTypes.ROOT_FOLDER_SELECT}
@@ -108,7 +109,7 @@ class AddNewMovieModalContent extends Component {
movieFolder: folder,
isWindows
}}
helpText={`'${folder}' subfolder will be created automatically`}
helpText={translate('SubfolderWillBeCreatedAutomaticallyInterp', [folder])}
onChange={onInputChange}
{...rootFolderPath}
/>
@@ -116,7 +117,7 @@ class AddNewMovieModalContent extends Component {
<FormGroup>
<FormLabel>
Monitor
{translate('Monitor')}
</FormLabel>
<FormInputGroup
@@ -128,7 +129,7 @@ class AddNewMovieModalContent extends Component {
</FormGroup>
<FormGroup>
<FormLabel>Minimum Availability</FormLabel>
<FormLabel>{translate('MinimumAvailability')}</FormLabel>
<FormInputGroup
type={inputTypes.AVAILABILITY_SELECT}
@@ -139,7 +140,7 @@ class AddNewMovieModalContent extends Component {
</FormGroup>
<FormGroup>
<FormLabel>Quality Profile</FormLabel>
<FormLabel>{translate('QualityProfile')}</FormLabel>
<FormInputGroup
type={inputTypes.QUALITY_PROFILE_SELECT}
@@ -150,7 +151,7 @@ class AddNewMovieModalContent extends Component {
</FormGroup>
<FormGroup>
<FormLabel>Tags</FormLabel>
<FormLabel>{translate('Tags')}</FormLabel>
<FormInputGroup
type={inputTypes.TAG}
@@ -167,7 +168,7 @@ class AddNewMovieModalContent extends Component {
<ModalFooter className={styles.modalFooter}>
<label className={styles.searchForMissingMovieLabelContainer}>
<span className={styles.searchForMissingMovieLabel}>
Start search for missing movie
{translate('StartSearchForMissingMovie')}
</span>
<CheckInput
@@ -185,7 +186,7 @@ class AddNewMovieModalContent extends Component {
isSpinning={isAdding}
onPress={this.onAddMoviePress}
>
Add {title}
{translate('AddMovie')}
</SpinnerButton>
</ModalFooter>
</ModalContent>

View File

@@ -34,10 +34,20 @@
.content {
flex: 0 1 100%;
overflow: hidden;
}
.titleRow {
display: flex;
}
.titleContainer {
display: flex;
align-items: flex-end;
flex: 0 1 auto;
}
.title {
display: flex;
font-weight: 300;
font-size: 36px;
}
@@ -47,10 +57,12 @@
color: $disabledColor;
}
.externalLink {
margin-top: 5px;
margin-left: auto;
color: $textColor;
.icons {
display: flex;
align-items: center;
justify-content: space-between;
flex: 1 0 auto;
height: 55px;
}
.alreadyExistsIcon {
@@ -68,3 +80,15 @@
.overview {
margin-top: 20px;
}
.links {
margin-left: 8px;
pointer-events: all;
}
@media only screen and (max-width: $breakpointMedium) {
.titleRow {
justify-content: space-between;
overflow: hidden;
}
}

View File

@@ -4,8 +4,11 @@ import HeartRating from 'Components/HeartRating';
import Icon from 'Components/Icon';
import Label from 'Components/Label';
import Link from 'Components/Link/Link';
import { icons, kinds, sizes } from 'Helpers/Props';
import Tooltip from 'Components/Tooltip/Tooltip';
import { icons, kinds, sizes, tooltipPositions } from 'Helpers/Props';
import MovieDetailsLinks from 'Movie/Details/MovieDetailsLinks';
import MoviePoster from 'Movie/MoviePoster';
import translate from 'Utilities/String/translate';
import AddNewMovieModal from './AddNewMovieModal';
import styles from './AddNewMovieSearchResult.css';
@@ -50,6 +53,7 @@ class AddNewMovieSearchResult extends Component {
const {
tmdbId,
imdbId,
youTubeTrailerId,
title,
titleSlug,
year,
@@ -90,69 +94,43 @@ class AddNewMovieSearchResult extends Component {
}
<div className={styles.content}>
<div className={styles.title}>
{title}
<div className={styles.titleRow}>
<div className={styles.titleContainer}>
<div className={styles.title}>
{title}
{
!title.contains(year) && !!year &&
<span className={styles.year}>({year})</span>
}
{
!title.contains(year) && !!year ?
<span className={styles.year}>
({year})
</span> :
null
}
</div>
</div>
{
isExistingMovie &&
<Icon
className={styles.alreadyExistsIcon}
name={icons.CHECK_CIRCLE}
size={36}
title="Already in your library"
/>
}
<div className={styles.icons}>
{
isExclusionMovie &&
<Icon
className={styles.exclusionIcon}
name={icons.DANGER}
size={36}
title="Movie is on Net Import Exclusion List"
/>
}
{
isExistingMovie &&
<Icon
className={styles.alreadyExistsIcon}
name={icons.CHECK_CIRCLE}
size={36}
title={translate('AlreadyInYourLibrary')}
/>
}
{
isSmallScreen ?
null :
<div className={styles.externalLink}>
<Link
to={`https://www.themoviedb.org/movie/${tmdbId}`}
onPress={this.onExternalLinkPress}
>
<Label size={sizes.LARGE}>
TMDb
</Label>
</Link>
{
imdbId &&
<Link
to={`https://www.imdb.com/title/${imdbId}`}
onPress={this.onExternalLinkPress}
>
<Label size={sizes.LARGE}>
IMDb
</Label>
</Link>
}
<Link
to={`https://trakt.tv/search/tmdb/${tmdbId}?id_type=movie`}
onPress={this.onExternalLinkPress}
>
<Label size={sizes.LARGE}>
Trakt
</Label>
</Link>
</div>
}
{
isExclusionMovie &&
<Icon
className={styles.exclusionIcon}
name={icons.DANGER}
size={36}
title={translate('MovieIsOnImportExclusionList')}
/>
}
</div>
</div>
<div>
@@ -170,6 +148,33 @@ class AddNewMovieSearchResult extends Component {
</Label>
}
<Tooltip
anchor={
<Label
size={sizes.LARGE}
>
<Icon
name={icons.EXTERNAL_LINK}
size={13}
/>
<span className={styles.links}>
Links
</span>
</Label>
}
tooltip={
<MovieDetailsLinks
tmdbId={tmdbId}
youTubeTrailerId={youTubeTrailerId}
imdbId={imdbId}
/>
}
canFlip={true}
kind={kinds.INVERSE}
position={tooltipPositions.BOTTOM}
/>
{
status === 'ended' &&
<Label
@@ -181,42 +186,6 @@ class AddNewMovieSearchResult extends Component {
}
</div>
{
isSmallScreen ?
<div className={styles.externalLink}>
<Link
to={`https://www.themoviedb.org/movie/${tmdbId}`}
onPress={this.onExternalLinkPress}
>
<Label size={sizes.LARGE}>
TMDb
</Label>
</Link>
{
imdbId &&
<Link
to={`https://www.imdb.com/title/${imdbId}`}
onPress={this.onExternalLinkPress}
>
<Label size={sizes.LARGE}>
IMDb
</Label>
</Link>
}
<Link
to={`https://trakt.tv/search/tmdb/${tmdbId}?id_type=movie`}
onPress={this.onExternalLinkPress}
>
<Label size={sizes.LARGE}>
Trakt
</Label>
</Link>
</div> :
null
}
<div className={styles.overview}>
{overview}
</div>
@@ -241,6 +210,7 @@ class AddNewMovieSearchResult extends Component {
AddNewMovieSearchResult.propTypes = {
tmdbId: PropTypes.number.isRequired,
imdbId: PropTypes.string,
youTubeTrailerId: PropTypes.string,
title: PropTypes.string.isRequired,
titleSlug: PropTypes.string.isRequired,
year: PropTypes.number.isRequired,

View File

@@ -3,6 +3,7 @@ import React, { Component } from 'react';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContent from 'Components/Page/PageContent';
import PageContentBody from 'Components/Page/PageContentBody';
import translate from 'Utilities/String/translate';
import getSelectedIds from 'Utilities/Table/getSelectedIds';
import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected';
@@ -80,6 +81,7 @@ class ImportMovie extends Component {
path,
rootFoldersFetching,
rootFoldersError,
rootFoldersPopulated,
unmappedFolders
} = this.props;
@@ -91,7 +93,7 @@ class ImportMovie extends Component {
} = this.state;
return (
<PageContent title="Import Movies">
<PageContent title={translate('ImportMovies')}>
<PageContentBody
registerScroller={this.setScrollerRef}
onScroll={this.onScroll}
@@ -102,13 +104,16 @@ class ImportMovie extends Component {
{
!rootFoldersFetching && !!rootFoldersError ?
<div>Unable to load root folders</div> :
<div>
{translate('UnableToLoadRootFolders')}
</div> :
null
}
{
!rootFoldersError &&
!rootFoldersFetching &&
rootFoldersPopulated &&
!unmappedFolders.length ?
<div>
All movies in {path} have been imported
@@ -119,6 +124,7 @@ class ImportMovie extends Component {
{
!rootFoldersError &&
!rootFoldersFetching &&
rootFoldersPopulated &&
!!unmappedFolders.length &&
scroller ?
<ImportMovieTableConnector

View File

@@ -31,3 +31,7 @@
margin: 0 10px 0 12px;
text-align: left;
}
.importError {
margin-left: 10px;
}

View File

@@ -3,11 +3,14 @@ import PropTypes from 'prop-types';
import React, { Component } from 'react';
// import CheckInput from 'Components/Form/CheckInput';
import FormInputGroup from 'Components/Form/FormInputGroup';
import Icon from 'Components/Icon';
import Button from 'Components/Link/Button';
import SpinnerButton from 'Components/Link/SpinnerButton';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import PageContentFooter from 'Components/Page/PageContentFooter';
import { inputTypes, kinds } from 'Helpers/Props';
import Popover from 'Components/Tooltip/Popover';
import { icons, inputTypes, kinds, tooltipPositions } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './ImportMovieFooter.css';
const MIXED = 'mixed';
@@ -93,7 +96,10 @@ class ImportMovieFooter extends Component {
isMonitorMixed,
isQualityProfileIdMixed,
isMinimumAvailabilityMixed,
hasUnsearchedItems,
importError,
onImportPress,
onLookupPress,
onCancelLookupPress
} = this.props;
@@ -107,7 +113,7 @@ class ImportMovieFooter extends Component {
<PageContentFooter>
<div className={styles.inputContainer}>
<div className={styles.label}>
Monitor
{translate('Monitor')}
</div>
<FormInputGroup
@@ -122,7 +128,7 @@ class ImportMovieFooter extends Component {
<div className={styles.inputContainer}>
<div className={styles.label}>
Minimum Availability
{translate('MinimumAvailability')}
</div>
<FormInputGroup
@@ -137,7 +143,7 @@ class ImportMovieFooter extends Component {
<div className={styles.inputContainer}>
<div className={styles.label}>
Quality Profile
{translate('QualityProfile')}
</div>
<FormInputGroup
@@ -163,31 +169,75 @@ class ImportMovieFooter extends Component {
isDisabled={!selectedCount || isLookingUpMovie}
onPress={onImportPress}
>
Import {selectedCount} {selectedCount > 1 ? 'Movies' : 'Movie'}
{translate('Import')} {selectedCount} {selectedCount > 1 ? translate('Movies') : translate('Movie')}
</SpinnerButton>
{
isLookingUpMovie &&
isLookingUpMovie ?
<Button
className={styles.loadingButton}
kind={kinds.WARNING}
onPress={onCancelLookupPress}
>
Cancel Processing
</Button>
{translate('CancelProcessing')}
</Button> :
null
}
{
isLookingUpMovie &&
hasUnsearchedItems ?
<Button
className={styles.loadingButton}
kind={kinds.SUCCESS}
onPress={onLookupPress}
>
{translate('StartProcessing')}
</Button> :
null
}
{
isLookingUpMovie ?
<LoadingIndicator
className={styles.loading}
size={24}
/>
/> :
null
}
{
isLookingUpMovie &&
'Processing Folders'
isLookingUpMovie ?
translate('ProcessingFolders') :
null
}
{
importError ?
<Popover
anchor={
<Icon
className={styles.importError}
name={icons.WARNING}
kind={kinds.WARNING}
/>
}
title={translate('ImportErrors')}
body={
<ul>
{
importError.responseJSON.map((error, index) => {
return (
<li key={index}>
{error.errorMessage}
</li>
);
})
}
</ul>
}
position={tooltipPositions.RIGHT}
/> :
null
}
</div>
</div>
@@ -206,8 +256,11 @@ ImportMovieFooter.propTypes = {
isMonitorMixed: PropTypes.bool.isRequired,
isQualityProfileIdMixed: PropTypes.bool.isRequired,
isMinimumAvailabilityMixed: PropTypes.bool.isRequired,
hasUnsearchedItems: PropTypes.bool.isRequired,
importError: PropTypes.object,
onInputChange: PropTypes.func.isRequired,
onImportPress: PropTypes.func.isRequired,
onLookupPress: PropTypes.func.isRequired,
onCancelLookupPress: PropTypes.func.isRequired
};

View File

@@ -1,7 +1,7 @@
import _ from 'lodash';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import { cancelLookupMovie } from 'Store/Actions/importMovieActions';
import { cancelLookupMovie, lookupUnsearchedMovies } from 'Store/Actions/importMovieActions';
import ImportMovieFooter from './ImportMovieFooter';
function isMixed(items, selectedIds, defaultValue, key) {
@@ -25,12 +25,14 @@ function createMapStateToProps() {
const {
isLookingUpMovie,
isImporting,
items
items,
importError
} = importMovie;
const isMonitorMixed = isMixed(items, selectedIds, defaultMonitor, 'monitor');
const isQualityProfileIdMixed = isMixed(items, selectedIds, defaultQualityProfileId, 'qualityProfileId');
const isMinimumAvailabilityMixed = isMixed(items, selectedIds, defaultMinimumAvailability, 'minimumAvailability');
const hasUnsearchedItems = !isLookingUpMovie && items.some((item) => !item.isPopulated);
return {
selectedCount: selectedIds.length,
@@ -41,13 +43,16 @@ function createMapStateToProps() {
defaultMinimumAvailability,
isMonitorMixed,
isQualityProfileIdMixed,
isMinimumAvailabilityMixed
isMinimumAvailabilityMixed,
importError,
hasUnsearchedItems
};
}
);
}
const mapDispatchToProps = {
onLookupPress: lookupUnsearchedMovies,
onCancelLookupPress: cancelLookupMovie
};

View File

@@ -3,6 +3,7 @@ import React from 'react';
import VirtualTableHeader from 'Components/Table/VirtualTableHeader';
import VirtualTableHeaderCell from 'Components/Table/VirtualTableHeaderCell';
import VirtualTableSelectAllHeaderCell from 'Components/Table/VirtualTableSelectAllHeaderCell';
import translate from 'Utilities/String/translate';
import styles from './ImportMovieHeader.css';
function ImportMovieHeader(props) {
@@ -24,35 +25,35 @@ function ImportMovieHeader(props) {
className={styles.folder}
name="folder"
>
Folder
{translate('Folder')}
</VirtualTableHeaderCell>
<VirtualTableHeaderCell
className={styles.monitor}
name="monitor"
>
Monitor
{translate('Monitor')}
</VirtualTableHeaderCell>
<VirtualTableHeaderCell
className={styles.minimumAvailability}
name="minimumAvailability"
>
Min Availability
{translate('MinAvailability')}
</VirtualTableHeaderCell>
<VirtualTableHeaderCell
className={styles.qualityProfile}
name="qualityProfileId"
>
Quality Profile
{translate('QualityProfile')}
</VirtualTableHeaderCell>
<VirtualTableHeaderCell
className={styles.movie}
name="movie"
>
Movie
{translate('Movie')}
</VirtualTableHeaderCell>
</VirtualTableHeader>
);

View File

@@ -9,6 +9,7 @@ import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import Portal from 'Components/Portal';
import { icons, kinds } from 'Helpers/Props';
import getUniqueElememtId from 'Utilities/getUniqueElementId';
import translate from 'Utilities/String/translate';
import ImportMovieSearchResultConnector from './ImportMovieSearchResultConnector';
import ImportMovieTitle from './ImportMovieTitle';
import styles from './ImportMovieSelectMovie.css';
@@ -174,7 +175,7 @@ class ImportMovieSelectMovie extends Component {
kind={kinds.WARNING}
/>
No match found!
{translate('NoMatchFound')}
</div> :
null
}
@@ -189,7 +190,7 @@ class ImportMovieSelectMovie extends Component {
kind={kinds.WARNING}
/>
Search failed, please try again later.
{translate('SearchFailedPleaseTryAgainLater')}
</div> :
null
}

View File

@@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
import React from 'react';
import Label from 'Components/Label';
import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './ImportMovieTitle.css';
function ImportMovieTitle(props) {
@@ -33,7 +34,7 @@ function ImportMovieTitle(props) {
<Label
kind={kinds.WARNING}
>
Existing
{translate('Existing')}
</Label>
}
</div>

View File

@@ -6,6 +6,7 @@ import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow';
import { icons } from 'Helpers/Props';
import formatBytes from 'Utilities/Number/formatBytes';
import translate from 'Utilities/String/translate';
import styles from './ImportMovieRootFolderRow.css';
function ImportMovieRootFolderRow(props) {
@@ -40,7 +41,7 @@ function ImportMovieRootFolderRow(props) {
<TableRowCell className={styles.actions}>
<IconButton
title="Remove root folder"
title={translate('RemoveRootFolder')}
name={icons.REMOVE}
onPress={onDeletePress}
/>

View File

@@ -17,17 +17,17 @@ import styles from './ImportMovieSelectFolder.css';
const rootFolderColumns = [
{
name: 'path',
label: 'Path',
label: translate('Path'),
isVisible: true
},
{
name: 'freeSpace',
label: 'Free Space',
label: translate('FreeSpace'),
isVisible: true
},
{
name: 'unmappedFolders',
label: 'Unmapped Folders',
label: translate('UnmappedFolders'),
isVisible: true
},
{
@@ -77,7 +77,7 @@ class ImportMovieSelectFolder extends Component {
} = this.props;
return (
<PageContent title="Import Movies">
<PageContent title={translate('ImportMovies')}>
<PageContentBody>
{
isFetching && !isPopulated &&
@@ -86,7 +86,9 @@ class ImportMovieSelectFolder extends Component {
{
!isFetching && !!error &&
<div>Unable to load root folders</div>
<div>
{translate('UnableToLoadRootFolders')}
</div>
}
{
@@ -99,19 +101,15 @@ class ImportMovieSelectFolder extends Component {
<div className={styles.tips}>
{translate('ImportTipsMessage')}
<ul>
<li className={styles.tip}>
Make sure that your files include the quality in their filenames. eg. <span className={styles.code}>movie.2008.bluray.mkv</span>
</li>
<li className={styles.tip}>
Point Radarr to the folder containing all of your movies, not a specific one. eg. <span className={styles.code}>"{isWindows ? 'C:\\movies' : '/movies'}"</span> and not <span className={styles.code}>"{isWindows ? 'C:\\movies\\the matrix' : '/movies/the matrix'}"</span>
</li>
<li className={styles.tip} dangerouslySetInnerHTML={{ __html: translate('ImportIncludeQuality', ['<code>movie.2008.bluray.mkv</code>']) }} />
<li className={styles.tip} dangerouslySetInnerHTML={{ __html: translate('ImportRootPath', [`<code>${isWindows ? 'C:\\movies' : '/movies'}</code>`, `<code>${isWindows ? 'C:\\movies\\the matrix' : '/movies/the matrix'}</code>`]) }} />
</ul>
</div>
{
items.length > 0 ?
<div className={styles.recentFolders}>
<FieldSet legend="Recent Folders">
<FieldSet legend={translate('RecentFolders')}>
<Table
columns={rootFolderColumns}
>
@@ -156,7 +154,7 @@ class ImportMovieSelectFolder extends Component {
className={styles.importButtonIcon}
name={icons.DRIVE}
/>
Start Import
{translate('StartImport')}
</Button>
</div>
}

View File

@@ -15,10 +15,10 @@ import MovieIndexConnector from 'Movie/Index/MovieIndexConnector';
import CustomFormatSettingsConnector from 'Settings/CustomFormats/CustomFormatSettingsConnector';
import DownloadClientSettingsConnector from 'Settings/DownloadClients/DownloadClientSettingsConnector';
import GeneralSettingsConnector from 'Settings/General/GeneralSettingsConnector';
import ImportListSettingsConnector from 'Settings/ImportLists/ImportListSettingsConnector';
import IndexerSettingsConnector from 'Settings/Indexers/IndexerSettingsConnector';
import MediaManagementConnector from 'Settings/MediaManagement/MediaManagementConnector';
import MetadataSettings from 'Settings/Metadata/MetadataSettings';
import NetImportSettingsConnector from 'Settings/NetImport/NetImportSettingsConnector';
import NotificationSettings from 'Settings/Notifications/NotificationSettings';
import Profiles from 'Settings/Profiles/Profiles';
import Quality from 'Settings/Quality/Quality';
@@ -156,8 +156,8 @@ function AppRoutes(props) {
/>
<Route
path="/settings/netimports"
component={NetImportSettingsConnector}
path="/settings/importlists"
component={ImportListSettingsConnector}
/>
<Route

View File

@@ -8,6 +8,7 @@ import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { kinds } from 'Helpers/Props';
import UpdateChanges from 'System/Updates/UpdateChanges';
import translate from 'Utilities/String/translate';
import styles from './AppUpdatedModalContent.css';
function AppUpdatedModalContent(props) {
@@ -49,12 +50,12 @@ function AppUpdatedModalContent(props) {
</div>
<UpdateChanges
title="New"
title={translate('New')}
changes={update.changes.new}
/>
<UpdateChanges
title="Fixed"
title={translate('Fixed')}
changes={update.changes.fixed}
/>
</div>

View File

@@ -7,6 +7,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './ConnectionLostModal.css';
function ConnectionLostModal(props) {
@@ -22,16 +23,16 @@ function ConnectionLostModal(props) {
>
<ModalContent onModalClose={onModalClose}>
<ModalHeader>
Connnection Lost
{translate('ConnectionLost')}
</ModalHeader>
<ModalBody>
<div>
Radarr has lost it's connection to the backend and will need to be reloaded to restore functionality.
{translate('ConnectionLostMessage')}
</div>
<div className={styles.automatic}>
Radarr will try to connect automatically, or you can click reload below.
{translate('ConnectionLostAutomaticMessage')}
</div>
</ModalBody>
<ModalFooter>
@@ -39,7 +40,7 @@ function ConnectionLostModal(props) {
kind={kinds.PRIMARY}
onPress={onModalClose}
>
Reload
{translate('Reload')}
</Button>
</ModalFooter>
</ModalContent>

View File

@@ -6,9 +6,38 @@ import styles from './Agenda.css';
function Agenda(props) {
const {
items
items,
start,
end
} = props;
const startDateParsed = Date.parse(start);
const endDateParsed = Date.parse(end);
items.forEach((item) => {
const cinemaDateParsed = Date.parse(item.inCinemas);
const digitalDateParsed = Date.parse(item.digitalRelease);
const physicalDateParsed = Date.parse(item.physicalRelease);
const dates = [];
if (cinemaDateParsed > 0 && cinemaDateParsed >= startDateParsed && cinemaDateParsed <= endDateParsed) {
dates.push(cinemaDateParsed);
}
if (digitalDateParsed > 0 && digitalDateParsed >= startDateParsed && digitalDateParsed <= endDateParsed) {
dates.push(digitalDateParsed);
}
if (physicalDateParsed > 0 && physicalDateParsed >= startDateParsed && physicalDateParsed <= endDateParsed) {
dates.push(physicalDateParsed);
}
item.sortDate = Math.min(...dates);
item.cinemaDateParsed = cinemaDateParsed;
item.digitalDateParsed = digitalDateParsed;
item.physicalDateParsed = physicalDateParsed;
});
items.sort((a, b) => ((a.sortDate > b.sortDate) ? 1 : -1));
return (
<div className={styles.agenda}>
{
@@ -32,7 +61,9 @@ function Agenda(props) {
}
Agenda.propTypes = {
items: PropTypes.arrayOf(PropTypes.object).isRequired
items: PropTypes.arrayOf(PropTypes.object).isRequired,
start: PropTypes.string.isRequired,
end: PropTypes.string.isRequired
};
export default Agenda;

View File

@@ -10,6 +10,10 @@
}
}
.link {
composes: link from '~Calendar/Events/CalendarEvent.css';
}
.eventWrapper {
display: flex;
flex: 1 0 1px;
@@ -30,7 +34,8 @@
border: none !important;
}
.movieTitle {
.movieTitle,
.genres {
@add-mixin truncate;
flex: 0 1 300px;
@@ -61,6 +66,10 @@
composes: missing from '~Calendar/Events/CalendarEvent.css';
}
.unreleased {
composes: unreleased from '~Calendar/Events/CalendarEvent.css';
}
@media only screen and (max-width: $breakpointSmall) {
.event {
flex-direction: column;
@@ -81,3 +90,7 @@
flex: 0 0 100%;
}
}
.dateIcon {
width: 25px;
}

View File

@@ -7,7 +7,7 @@ import getStatusStyle from 'Calendar/getStatusStyle';
import Icon from 'Components/Icon';
import Link from 'Components/Link/Link';
import { icons, kinds } from 'Helpers/Props';
import MovieTitleLink from 'Movie/MovieTitleLink';
import translate from 'Utilities/String/translate';
import styles from './AgendaEvent.css';
class AgendaEvent extends Component {
@@ -41,35 +41,69 @@ class AgendaEvent extends Component {
movieFile,
title,
titleSlug,
genres,
isAvailable,
inCinemas,
digitalRelease,
physicalRelease,
monitored,
hasFile,
grabbed,
queueItem,
showDate,
showMovieInformation,
showCutoffUnmetIcon,
longDateFormat,
colorImpairedMode
colorImpairedMode,
cinemaDateParsed,
digitalDateParsed,
physicalDateParsed,
sortDate
} = this.props;
const startTime = moment(inCinemas);
let startTime = null;
let releaseIcon = null;
if (physicalDateParsed === sortDate) {
startTime = physicalRelease;
releaseIcon = icons.DISC;
}
if (digitalDateParsed === sortDate) {
startTime = digitalRelease;
releaseIcon = icons.MOVIE_FILE;
}
if (cinemaDateParsed === sortDate) {
startTime = inCinemas;
releaseIcon = icons.IN_CINEMAS;
}
startTime = moment(startTime);
const downloading = !!(queueItem || grabbed);
const isMonitored = monitored;
const statusStyle = getStatusStyle(hasFile, downloading, isAvailable, isMonitored);
const joinedGenres = genres.slice(0, 2).join(', ');
const link = `/movie/${titleSlug}`;
return (
<div>
<Link
className={styles.event}
component="div"
onPress={this.onPress}
className={classNames(
styles.event,
styles.link
)}
to={link}
>
<div className={styles.dateIcon}>
<Icon
name={releaseIcon}
kind={kinds.DEFAULT}
/>
</div>
<div className={styles.date}>
{
showDate &&
startTime.format(longDateFormat)
}
{(showDate) ? startTime.format(longDateFormat) : null}
</div>
<div
@@ -80,12 +114,16 @@ class AgendaEvent extends Component {
)}
>
<div className={styles.movieTitle}>
<MovieTitleLink
titleSlug={titleSlug}
title={title}
/>
{title}
</div>
{
showMovieInformation &&
<div className={styles.genres}>
{joinedGenres}
</div>
}
{
!!queueItem &&
<span className={styles.statusIcon}>
@@ -100,7 +138,7 @@ class AgendaEvent extends Component {
<Icon
className={styles.statusIcon}
name={icons.DOWNLOADING}
title="Movie is downloading"
title={translate('MovieIsDownloading')}
/>
}
@@ -112,7 +150,7 @@ class AgendaEvent extends Component {
className={styles.statusIcon}
name={icons.MOVIE_FILE}
kind={kinds.WARNING}
title="Quality cutoff has not been met"
title={translate('QualityCutoffHasNotBeenMet')}
/>
}
</div>
@@ -127,17 +165,29 @@ AgendaEvent.propTypes = {
movieFile: PropTypes.object,
title: PropTypes.string.isRequired,
titleSlug: PropTypes.string.isRequired,
genres: PropTypes.arrayOf(PropTypes.string).isRequired,
isAvailable: PropTypes.bool.isRequired,
inCinemas: PropTypes.string,
digitalRelease: PropTypes.string,
physicalRelease: PropTypes.string,
monitored: PropTypes.bool.isRequired,
hasFile: PropTypes.bool.isRequired,
grabbed: PropTypes.bool,
queueItem: PropTypes.object,
showDate: PropTypes.bool.isRequired,
showMovieInformation: PropTypes.bool.isRequired,
showCutoffUnmetIcon: PropTypes.bool.isRequired,
timeFormat: PropTypes.string.isRequired,
longDateFormat: PropTypes.string.isRequired,
colorImpairedMode: PropTypes.bool.isRequired
colorImpairedMode: PropTypes.bool.isRequired,
cinemaDateParsed: PropTypes.number,
digitalDateParsed: PropTypes.number,
physicalDateParsed: PropTypes.number,
sortDate: PropTypes.number
};
AgendaEvent.defaultProps = {
genres: []
};
export default AgendaEvent;

View File

@@ -1,6 +1,7 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
import translate from 'Utilities/String/translate';
import AgendaConnector from './Agenda/AgendaConnector';
import * as calendarViews from './calendarViews';
import CalendarDaysConnector from './Day/CalendarDaysConnector';
@@ -30,7 +31,9 @@ class Calendar extends Component {
{
!isFetching && !!error &&
<div>Unable to load the calendar</div>
<div>
{translate('UnableToLoadTheCalendar')}
</div>
}
{

View File

@@ -76,16 +76,15 @@ class CalendarConnector extends Component {
} = this.props;
if (hasDifferentItems(prevProps.items, items)) {
const movieIds = selectUniqueIds(items, 'id');
const movieFileIds = selectUniqueIds(items, 'movieFileId');
if (items.length) {
this.props.fetchQueueDetails({ movieIds });
}
if (movieFileIds.length) {
this.props.fetchMovieFiles({ movieFileIds });
}
if (items.length) {
this.props.fetchQueueDetails();
}
}
if (prevProps.time !== time) {

View File

@@ -98,7 +98,7 @@ class CalendarPage extends Component {
const isMeasured = this.state.width > 0;
return (
<PageContent title="Calendar">
<PageContent title={translate('Calendar')}>
<PageToolbar>
<PageToolbarSection>
<PageToolbarButton
@@ -110,7 +110,7 @@ class CalendarPage extends Component {
<PageToolbarSeparator />
<PageToolbarButton
label={translate('RssSync')}
label={translate('RSSSync')}
iconName={icons.RSS}
isSpinning={isRssSyncExecuting}
onPress={onRssSyncPress}

View File

@@ -6,6 +6,7 @@ import getStatusStyle from 'Calendar/getStatusStyle';
import Icon from 'Components/Icon';
import Link from 'Components/Link/Link';
import { icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import CalendarEventQueueDetails from './CalendarEventQueueDetails';
import styles from './CalendarEvent.css';
@@ -85,7 +86,7 @@ class CalendarEvent extends Component {
<Icon
className={styles.statusIcon}
name={icons.DOWNLOADING}
title="movie is downloading"
title={translate('MovieIsDownloading')}
/>
}
@@ -97,7 +98,7 @@ class CalendarEvent extends Component {
className={styles.statusIcon}
name={icons.MOVIE_FILE}
kind={kinds.WARNING}
title="Quality cutoff has not been met"
title={translate('QualityCutoffHasNotBeenMet')}
/>
}
</div>

View File

@@ -3,6 +3,7 @@ import React from 'react';
import QueueDetails from 'Activity/Queue/QueueDetails';
import CircularProgressBar from 'Components/CircularProgressBar';
import colors from 'Styles/Variables/colors';
import translate from 'Utilities/String/translate';
function CalendarEventQueueDetails(props) {
const {
@@ -11,10 +12,12 @@ function CalendarEventQueueDetails(props) {
sizeleft,
estimatedCompletionTime,
status,
trackedDownloadState,
trackedDownloadStatus,
errorMessage
} = props;
const progress = (100 - sizeleft / size * 100);
const progress = size ? (100 - sizeleft / size * 100) : 0;
return (
<QueueDetails
@@ -23,9 +26,11 @@ function CalendarEventQueueDetails(props) {
sizeleft={sizeleft}
estimatedCompletionTime={estimatedCompletionTime}
status={status}
trackedDownloadState={trackedDownloadState}
trackedDownloadStatus={trackedDownloadStatus}
errorMessage={errorMessage}
progressBar={
<div title={`Movie is downloading - ${progress.toFixed(1)}% ${title}`}>
<div title={translate('MovieIsDownloadingInterp', [progress.toFixed(1), title])}>
<CircularProgressBar
progress={progress}
size={20}
@@ -44,6 +49,8 @@ CalendarEventQueueDetails.propTypes = {
sizeleft: PropTypes.number.isRequired,
estimatedCompletionTime: PropTypes.string,
status: PropTypes.string.isRequired,
trackedDownloadState: PropTypes.string.isRequired,
trackedDownloadStatus: PropTypes.string.isRequired,
errorMessage: PropTypes.string
};

View File

@@ -24,7 +24,7 @@ function getTitle(time, start, end, view, longDateFormat) {
} else if (view === 'month') {
return timeMoment.format('MMMM YYYY');
} else if (view === 'agenda') {
return 'Agenda';
return `Agenda: ${startMoment.format('MMM D')} - ${endMoment.format('MMM D')}`;
}
let startFormat = 'MMM D YYYY';

View File

@@ -1,4 +1,3 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import { connect } from 'react-redux';
@@ -14,19 +13,16 @@ function createMapStateToProps() {
createDimensionsSelector(),
createUISettingsSelector(),
(calendar, dimensions, uiSettings) => {
const result = _.pick(calendar, [
'isFetching',
'view',
'time',
'start',
'end'
]);
result.isSmallScreen = dimensions.isSmallScreen;
result.collapseViewButtons = dimensions.isLargeScreen;
result.longDateFormat = uiSettings.longDateFormat;
return result;
return {
isFetching: calendar.isFetching,
view: calendar.view,
time: calendar.time,
start: calendar.start,
end: calendar.end,
isSmallScreen: dimensions.isSmallScreen,
collapseViewButtons: dimensions.isLargeScreen,
longDateFormat: uiSettings.longDateFormat
};
}
);
}

View File

@@ -12,6 +12,7 @@ import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes } from 'Helpers/Props';
import { firstDayOfWeekOptions, timeFormatOptions, weekColumnOptions } from 'Settings/UI/UISettings';
import translate from 'Utilities/String/translate';
class CalendarOptionsModalContent extends Component {
@@ -110,38 +111,38 @@ class CalendarOptionsModalContent extends Component {
</ModalHeader>
<ModalBody>
<FieldSet legend="Local">
<FieldSet legend={translate('Local')}>
<Form>
<FormGroup>
<FormLabel>Show Movie Information</FormLabel>
<FormLabel>{translate('ShowMovieInformation')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="showMovieInformation"
value={showMovieInformation}
helpText="Show movie genres and certification"
helpText={translate('ShowMovieInformationHelpText')}
onChange={this.onOptionInputChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>Icon for Cutoff Unmet</FormLabel>
<FormLabel>{translate('IconForCutoffUnmet')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="showCutoffUnmetIcon"
value={showCutoffUnmetIcon}
helpText="Show icon for files when the cutoff hasn't been met"
helpText={translate('ShowCutoffUnmetIconHelpText')}
onChange={this.onOptionInputChange}
/>
</FormGroup>
</Form>
</FieldSet>
<FieldSet legend="Global">
<FieldSet legend={translate('Global')}>
<Form>
<FormGroup>
<FormLabel>First Day of Week</FormLabel>
<FormLabel>{translate('FirstDayOfWeek')}</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
@@ -153,7 +154,7 @@ class CalendarOptionsModalContent extends Component {
</FormGroup>
<FormGroup>
<FormLabel>Week Column Header</FormLabel>
<FormLabel>{translate('WeekColumnHeader')}</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
@@ -161,12 +162,12 @@ class CalendarOptionsModalContent extends Component {
values={weekColumnOptions}
value={calendarWeekColumnHeader}
onChange={this.onGlobalInputChange}
helpText="Shown above each column when week is the active view"
helpText={translate('HelpText')}
/>
</FormGroup>
<FormGroup>
<FormLabel>Time Format</FormLabel>
<FormLabel>{translate('TimeFormat')}</FormLabel>
<FormInputGroup
type={inputTypes.SELECT}
@@ -176,13 +177,13 @@ class CalendarOptionsModalContent extends Component {
onChange={this.onGlobalInputChange}
/>
</FormGroup><FormGroup>
<FormLabel>Enable Color-Impaired Mode</FormLabel>
<FormLabel>{translate('EnableColorImpairedMode')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="enableColorImpairedMode"
value={enableColorImpairedMode}
helpText="Altered style to allow color-impaired users to better distinguish color coded information"
helpText={translate('EnableColorImpairedModeHelpText')}
onChange={this.onGlobalInputChange}
/>
</FormGroup>
@@ -193,7 +194,7 @@ class CalendarOptionsModalContent extends Component {
<ModalFooter>
<Button onPress={onModalClose}>
Close
{translate('Close')}
</Button>
</ModalFooter>
</ModalContent>

View File

@@ -13,6 +13,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { icons, inputTypes, kinds, sizes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
function getUrls(state) {
const {
@@ -114,37 +115,37 @@ class CalendarLinkModalContent extends Component {
<ModalBody>
<Form>
<FormGroup>
<FormLabel>Include Unmonitored</FormLabel>
<FormLabel>{translate('IncludeUnmonitored')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="unmonitored"
value={unmonitored}
helpText="Include unmonitored movies in the iCal feed"
helpText={translate('UnmonitoredHelpText')}
onChange={this.onInputChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>Show as All-Day Events</FormLabel>
<FormLabel>{translate('ShowAsAllDayEvents')}</FormLabel>
<FormInputGroup
type={inputTypes.CHECK}
name="asAllDay"
value={asAllDay}
helpText="Events will appear as all-day events in your calendar"
helpText={translate('AsAllDayHelpText')}
onChange={this.onInputChange}
/>
</FormGroup>
<FormGroup>
<FormLabel>Tags</FormLabel>
<FormLabel>{translate('Tags')}</FormLabel>
<FormInputGroup
type={inputTypes.TAG}
name="tags"
value={tags}
helpText="Feed will only contain movies with at least one matching tag"
helpText={translate('TagsHelpText')}
onChange={this.onInputChange}
/>
</FormGroup>
@@ -152,14 +153,14 @@ class CalendarLinkModalContent extends Component {
<FormGroup
size={sizes.LARGE}
>
<FormLabel>iCal Feed</FormLabel>
<FormLabel>{translate('ICalFeed')}</FormLabel>
<FormInputGroup
type={inputTypes.TEXT}
name="iCalHttpUrl"
value={iCalHttpUrl}
readOnly={true}
helpText="Copy this URL to your client(s) or click to subscribe if your browser supports webcal"
helpText={translate('ICalHttpUrlHelpText')}
buttons={[
<ClipboardButton
key="copy"
@@ -186,7 +187,7 @@ class CalendarLinkModalContent extends Component {
<ModalFooter>
<Button onPress={onModalClose}>
Close
{translate('Close')}
</Button>
</ModalFooter>
</ModalContent>

View File

@@ -16,3 +16,4 @@ export const RENAME_MOVIE = 'RenameMovie';
export const RESET_API_KEY = 'ResetApiKey';
export const RSS_SYNC = 'RssSync';
export const MOVIE_SEARCH = 'MoviesSearch';
export const IMPORT_LIST_SYNC = 'ImportListSync';

View File

@@ -14,18 +14,19 @@ import Scroller from 'Components/Scroller/Scroller';
import Table from 'Components/Table/Table';
import TableBody from 'Components/Table/TableBody';
import { kinds, scrollDirections } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import FileBrowserRow from './FileBrowserRow';
import styles from './FileBrowserModalContent.css';
const columns = [
{
name: 'type',
label: 'Type',
label: translate('Type'),
isVisible: true
},
{
name: 'name',
label: 'Name',
label: translate('Name'),
isVisible: true
}
];
@@ -134,7 +135,7 @@ class FileBrowserModalContent extends Component {
<PathInput
className={styles.pathInput}
placeholder="Start typing or select a path below"
placeholder={translate('StartTypingOrSelectAPathBelow')}
hasFileBrowser={false}
{...otherProps}
value={this.state.currentPath}
@@ -148,7 +149,9 @@ class FileBrowserModalContent extends Component {
>
{
!!error &&
<div>Error loading contents</div>
<div>
{translate('ErrorLoadingContents')}
</div>
}
{
@@ -223,13 +226,13 @@ class FileBrowserModalContent extends Component {
<Button
onPress={onModalClose}
>
Cancel
{translate('Cancel')}
</Button>
<Button
onPress={this.onOkPress}
>
Ok
{translate('Ok')}
</Button>
</ModalFooter>
</ModalContent>

View File

@@ -3,7 +3,7 @@ import React, { Component } from 'react';
import NumberInput from 'Components/Form/NumberInput';
import SelectInput from 'Components/Form/SelectInput';
import TextInput from 'Components/Form/TextInput';
import { IN_LAST, IN_NEXT } from 'Helpers/Props/filterTypes';
import { IN_LAST, IN_NEXT, NOT_IN_LAST, NOT_IN_NEXT } from 'Helpers/Props/filterTypes';
import isString from 'Utilities/String/isString';
import { NAME } from './FilterBuilderRowValue';
import styles from './DateFilterBuilderRowValue.css';
@@ -18,7 +18,12 @@ const timeOptions = [
];
function isInFilter(filterType) {
return filterType === IN_LAST || filterType === IN_NEXT;
return (
filterType === IN_LAST ||
filterType === NOT_IN_LAST ||
filterType === IN_NEXT ||
filterType === NOT_IN_NEXT
);
}
class DateFilterBuilderRowValue extends Component {

View File

@@ -8,6 +8,7 @@ import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import { inputTypes } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import FilterBuilderRow from './FilterBuilderRow';
import styles from './FilterBuilderModalContent.css';
@@ -192,7 +193,7 @@ class FilterBuilderModalContent extends Component {
<ModalFooter>
<Button onPress={onCancelPress}>
Cancel
{translate('Cancel')}
</Button>
<SpinnerErrorButton
@@ -200,7 +201,7 @@ class FilterBuilderModalContent extends Component {
error={saveError}
onPress={this.onSaveFilterPress}
>
Save
{translate('Save')}
</SpinnerErrorButton>
</ModalFooter>
</ModalContent>

View File

@@ -6,6 +6,7 @@ import { filterBuilderTypes, filterBuilderValueTypes, icons } from 'Helpers/Prop
import BoolFilterBuilderRowValue from './BoolFilterBuilderRowValue';
import DateFilterBuilderRowValue from './DateFilterBuilderRowValue';
import FilterBuilderRowValueConnector from './FilterBuilderRowValueConnector';
import ImportListFilterBuilderRowValueConnector from './ImportListFilterBuilderRowValueConnector';
import IndexerFilterBuilderRowValueConnector from './IndexerFilterBuilderRowValueConnector';
import MovieStatusFilterBuilderRowValue from './MovieStatusFilterBuilderRowValue';
import ProtocolFilterBuilderRowValue from './ProtocolFilterBuilderRowValue';
@@ -74,6 +75,9 @@ function getRowValueConnector(selectedFilterBuilderProp) {
case filterBuilderValueTypes.TAG:
return TagFilterBuilderRowValueConnector;
case filterBuilderValueTypes.IMPORTLIST:
return ImportListFilterBuilderRowValueConnector;
default:
return FilterBuilderRowValueConnector;
}

View File

@@ -0,0 +1,27 @@
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createImportListSelector from 'Store/Selectors/createImportListSelector';
import FilterBuilderRowValue from './FilterBuilderRowValue';
function createMapStateToProps() {
return createSelector(
createImportListSelector(),
(importLists) => {
return {
tagList: importLists.map((importList) => {
const {
id,
name
} = importList;
return {
id,
name
};
})
};
}
);
}
export default connect(createMapStateToProps)(FilterBuilderRowValue);

View File

@@ -3,6 +3,7 @@ import React, { Component } from 'react';
import IconButton from 'Components/Link/IconButton';
import SpinnerIconButton from 'Components/Link/SpinnerIconButton';
import { icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './CustomFilter.css';
class CustomFilter extends Component {
@@ -89,7 +90,7 @@ class CustomFilter extends Component {
/>
<SpinnerIconButton
title="Remove filter"
title={translate('RemoveFilter')}
name={icons.REMOVE}
isSpinning={this.state.isDeleting}
onPress={this.onRemovePress}

View File

@@ -59,7 +59,7 @@ function CustomFiltersModalContent(props) {
<Button
onPress={onModalClose}
>
Close
{translate('Close')}
</Button>
</ModalFooter>
</ModalContent>

View File

@@ -8,16 +8,28 @@ import DeviceInput from './DeviceInput';
function createMapStateToProps() {
return createSelector(
(state, { value }) => value,
(state, { name }) => name,
(state) => state.providerOptions,
(value, devices) => {
(value, name, devices) => {
const {
isFetching,
isPopulated,
error,
items
} = devices;
return {
...devices,
isFetching,
isPopulated,
error,
items: items[name] || [],
selectedDevices: value.map((valueDevice) => {
const sectionItems = items[name] || [];
// Disable equality ESLint rule so we don't need to worry about
// a type mismatch between the value items and the device ID.
// eslint-disable-next-line eqeqeq
const device = devices.items.find((d) => d.id == valueDevice);
const device = sectionItems.find((d) => d.id == valueDevice);
if (device) {
return {
@@ -61,11 +73,14 @@ class DeviceInputConnector extends Component {
const {
provider,
providerData,
dispatchFetchOptions
dispatchFetchOptions,
requestAction,
name
} = this.props;
dispatchFetchOptions({
action: 'getDevices',
action: requestAction,
itemSection: name,
provider,
providerData
});
@@ -94,6 +109,7 @@ class DeviceInputConnector extends Component {
DeviceInputConnector.propTypes = {
provider: PropTypes.string.isRequired,
providerData: PropTypes.object.isRequired,
requestAction: PropTypes.string.isRequired,
name: PropTypes.string.isRequired,
onChange: PropTypes.func.isRequired,
dispatchFetchOptions: PropTypes.func.isRequired,

View File

@@ -58,11 +58,30 @@ function getSelectedIndex(props) {
values
} = props;
if (Array.isArray(value)) {
return values.findIndex((v) => {
return value.size && v.key === value[0];
});
}
return values.findIndex((v) => {
return v.key === value;
});
}
function isSelectedItem(index, props) {
const {
value,
values
} = props;
if (Array.isArray(value)) {
return value.includes(values[index].key);
}
return values[index].key === value;
}
function getKey(selectedIndex, values) {
return values[selectedIndex].key;
}
@@ -92,7 +111,7 @@ class EnhancedSelectInput extends Component {
this._scheduleUpdate();
}
if (prevProps.value !== this.props.value) {
if (!Array.isArray(this.props.value) && prevProps.value !== this.props.value) {
this.setState({
selectedIndex: getSelectedIndex(this.props)
});
@@ -134,7 +153,7 @@ class EnhancedSelectInput extends Component {
const button = document.getElementById(this._buttonId);
const options = document.getElementById(this._optionsId);
if (!button || this.state.isMobile) {
if (!button || !event.target.isConnected || this.state.isMobile) {
return;
}
@@ -177,7 +196,7 @@ class EnhancedSelectInput extends Component {
}
if (
selectedIndex == null ||
selectedIndex == null || selectedIndex === -1 ||
getSelectedOption(selectedIndex, values).isDisabled
) {
if (keyCode === keyCodes.UP_ARROW) {
@@ -235,12 +254,27 @@ class EnhancedSelectInput extends Component {
}
onSelect = (value) => {
this.setState({ isOpen: false });
if (Array.isArray(this.props.value)) {
let newValue = null;
const index = this.props.value.indexOf(value);
if (index === -1) {
newValue = this.props.values.map((v) => v.key).filter((v) => (v === value) || this.props.value.includes(v));
} else {
newValue = [...this.props.value];
newValue.splice(index, 1);
}
this.props.onChange({
name: this.props.name,
value: newValue
});
} else {
this.setState({ isOpen: false });
this.props.onChange({
name: this.props.name,
value
});
this.props.onChange({
name: this.props.name,
value
});
}
}
onMeasure = ({ width }) => {
@@ -258,6 +292,7 @@ class EnhancedSelectInput extends Component {
const {
className,
disabledClassName,
value,
values,
isDisabled,
hasError,
@@ -275,6 +310,7 @@ class EnhancedSelectInput extends Component {
isMobile
} = this.state;
const isMultiSelect = Array.isArray(value);
const selectedOption = getSelectedOption(selectedIndex, values);
return (
@@ -303,9 +339,12 @@ class EnhancedSelectInput extends Component {
onPress={this.onPress}
>
<SelectedValueComponent
value={value}
values={values}
{...selectedValueOptions}
{...selectedOption}
isDisabled={isDisabled}
isMultiSelect={isMultiSelect}
>
{selectedOption ? selectedOption.value : null}
</SelectedValueComponent>
@@ -359,11 +398,17 @@ class EnhancedSelectInput extends Component {
>
{
values.map((v, index) => {
const hasParent = v.parentKey !== undefined;
const depth = hasParent ? 1 : 0;
const parentSelected = hasParent && value.includes(v.parentKey);
return (
<OptionComponent
key={v.key}
id={v.key}
isSelected={index === selectedIndex}
depth={depth}
isSelected={isSelectedItem(index, this.props)}
isDisabled={parentSelected}
isMultiSelect={isMultiSelect}
{...valueOptions}
{...v}
isMobile={false}
@@ -401,11 +446,17 @@ class EnhancedSelectInput extends Component {
<Scroller className={styles.optionsModalScroller}>
{
values.map((v, index) => {
const hasParent = v.parentKey !== undefined;
const depth = hasParent ? 1 : 0;
const parentSelected = hasParent && value.includes(v.parentKey);
return (
<OptionComponent
key={v.key}
id={v.key}
isSelected={index === selectedIndex}
depth={depth}
isSelected={isSelectedItem(index, this.props)}
isMultiSelect={isMultiSelect}
isDisabled={parentSelected}
{...valueOptions}
{...v}
isMobile={true}
@@ -429,9 +480,9 @@ EnhancedSelectInput.propTypes = {
className: PropTypes.string,
disabledClassName: PropTypes.string,
name: PropTypes.string.isRequired,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.arrayOf(PropTypes.number)]).isRequired,
values: PropTypes.arrayOf(PropTypes.object).isRequired,
isDisabled: PropTypes.bool,
isDisabled: PropTypes.bool.isRequired,
hasError: PropTypes.bool,
hasWarning: PropTypes.bool,
valueOptions: PropTypes.object.isRequired,

View File

@@ -11,6 +11,18 @@
}
}
.optionCheck {
composes: container from '~./CheckInput.css';
flex: 0 0 0;
}
.optionCheckInput {
composes: input from '~./CheckInput.css';
margin-top: 0;
}
.isSelected {
background-color: #e2e2e2;

View File

@@ -4,6 +4,7 @@ import React, { Component } from 'react';
import Icon from 'Components/Icon';
import Link from 'Components/Link/Link';
import { icons } from 'Helpers/Props';
import CheckInput from './CheckInput';
import styles from './EnhancedSelectInputOption.css';
class EnhancedSelectInputOption extends Component {
@@ -20,15 +21,21 @@ class EnhancedSelectInputOption extends Component {
onSelect(id);
}
onCheckPress = () => {
// CheckInput requires a handler. Swallow the change event because onPress will already handle it via event propagation.
}
//
// Render
render() {
const {
className,
id,
isSelected,
isDisabled,
isHidden,
isMultiSelect,
isMobile,
children
} = this.props;
@@ -37,8 +44,8 @@ class EnhancedSelectInputOption extends Component {
<Link
className={classNames(
className,
isSelected && styles.isSelected,
isDisabled && styles.isDisabled,
isSelected && !isMultiSelect && styles.isSelected,
isDisabled && !isMultiSelect && styles.isDisabled,
isHidden && styles.isHidden,
isMobile && styles.isMobile
)}
@@ -46,6 +53,19 @@ class EnhancedSelectInputOption extends Component {
isDisabled={isDisabled}
onPress={this.onPress}
>
{
isMultiSelect &&
<CheckInput
className={styles.optionCheckInput}
containerClassName={styles.optionCheck}
name={`select-${id}`}
value={isSelected}
isDisabled={isDisabled}
onChange={this.onCheckPress}
/>
}
{children}
{
@@ -67,6 +87,7 @@ EnhancedSelectInputOption.propTypes = {
isSelected: PropTypes.bool.isRequired,
isDisabled: PropTypes.bool.isRequired,
isHidden: PropTypes.bool.isRequired,
isMultiSelect: PropTypes.bool.isRequired,
isMobile: PropTypes.bool.isRequired,
children: PropTypes.node.isRequired,
onSelect: PropTypes.func.isRequired
@@ -75,7 +96,8 @@ EnhancedSelectInputOption.propTypes = {
EnhancedSelectInputOption.defaultProps = {
className: styles.option,
isDisabled: false,
isHidden: false
isHidden: false,
isMultiSelect: false
};
export default EnhancedSelectInputOption;

View File

@@ -20,6 +20,7 @@ import QualityProfileSelectInputConnector from './QualityProfileSelectInputConne
import RootFolderSelectInputConnector from './RootFolderSelectInputConnector';
import TagInputConnector from './TagInputConnector';
import TagSelectInputConnector from './TagSelectInputConnector';
import TextArea from './TextArea';
import TextInput from './TextInput';
import TextTagInputConnector from './TextTagInputConnector';
import styles from './FormInputGroup.css';
@@ -71,6 +72,9 @@ function getComponent(type) {
case inputTypes.TAG:
return TagInputConnector;
case inputTypes.TEXT_AREA:
return TextArea;
case inputTypes.TEXT_TAG:
return TextTagInputConnector;
@@ -153,7 +157,7 @@ function FormInputGroup(props) {
<Icon
name={icons.UNSAVED_SETTING}
className={styles.pendingChangesIcon}
title="Change has not been saved yet"
title={translate('ChangeHasNotBeenSavedYet')}
/>
}
</div> */}
@@ -207,7 +211,7 @@ function FormInputGroup(props) {
key={index}
text={error.message}
link={error.link}
linkTooltip={error.detailedMessage}
tooltip={error.detailedMessage}
isError={true}
isCheckInput={checkInput}
/>
@@ -222,7 +226,7 @@ function FormInputGroup(props) {
key={index}
text={warning.message}
link={warning.link}
linkTooltip={warning.detailedMessage}
tooltip={warning.detailedMessage}
isWarning={true}
isCheckInput={checkInput}
/>

View File

@@ -37,3 +37,7 @@
margin-left: 5px;
}
.details {
margin-left: 5px;
}

View File

@@ -11,7 +11,7 @@ function FormInputHelpText(props) {
className,
text,
link,
linkTooltip,
tooltip,
isError,
isWarning,
isCheckInput
@@ -28,16 +28,27 @@ function FormInputHelpText(props) {
{text}
{
!!link &&
link ?
<Link
className={styles.link}
to={link}
title={linkTooltip}
title={tooltip}
>
<Icon
name={icons.EXTERNAL_LINK}
/>
</Link>
</Link> :
null
}
{
!link && tooltip ?
<Icon
containerClassName={styles.details}
name={icons.INFO}
title={tooltip}
/> :
null
}
</div>
);
@@ -47,7 +58,7 @@ FormInputHelpText.propTypes = {
className: PropTypes.string.isRequired,
text: PropTypes.string.isRequired,
link: PropTypes.string,
linkTooltip: PropTypes.string,
tooltip: PropTypes.string,
isError: PropTypes.bool,
isWarning: PropTypes.bool,
isCheckInput: PropTypes.bool

View File

@@ -6,14 +6,23 @@ import styles from './HintedSelectInputOption.css';
function HintedSelectInputOption(props) {
const {
id,
value,
hint,
isSelected,
isDisabled,
isMultiSelect,
isMobile,
...otherProps
} = props;
return (
<EnhancedSelectInputOption
id={id}
isSelected={isSelected}
isDisabled={isDisabled}
isHidden={isDisabled}
isMultiSelect={isMultiSelect}
isMobile={isMobile}
{...otherProps}
>
@@ -36,9 +45,19 @@ function HintedSelectInputOption(props) {
}
HintedSelectInputOption.propTypes = {
id: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
value: PropTypes.string.isRequired,
hint: PropTypes.node,
isSelected: PropTypes.bool.isRequired,
isDisabled: PropTypes.bool.isRequired,
isMultiSelect: PropTypes.bool.isRequired,
isMobile: PropTypes.bool.isRequired
};
HintedSelectInputOption.defaultProps = {
isDisabled: false,
isHidden: false,
isMultiSelect: false
};
export default HintedSelectInputOption;

View File

@@ -1,23 +1,43 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React from 'react';
import Label from 'Components/Label';
import EnhancedSelectInputSelectedValue from './EnhancedSelectInputSelectedValue';
import styles from './HintedSelectInputSelectedValue.css';
function HintedSelectInputSelectedValue(props) {
const {
value,
values,
hint,
isMultiSelect,
includeHint,
...otherProps
} = props;
const valuesMap = isMultiSelect && _.keyBy(values, 'key');
return (
<EnhancedSelectInputSelectedValue
className={styles.selectedValue}
{...otherProps}
>
<div className={styles.valueText}>
{value}
{
isMultiSelect &&
value.map((key, index) => {
const v = valuesMap[key];
return (
<Label key={key}>
{v ? v.value : key}
</Label>
);
})
}
{
!isMultiSelect && value
}
</div>
{
@@ -31,12 +51,15 @@ function HintedSelectInputSelectedValue(props) {
}
HintedSelectInputSelectedValue.propTypes = {
value: PropTypes.string,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.string, PropTypes.number]))]).isRequired,
values: PropTypes.arrayOf(PropTypes.object).isRequired,
hint: PropTypes.string,
isMultiSelect: PropTypes.bool.isRequired,
includeHint: PropTypes.bool.isRequired
};
HintedSelectInputSelectedValue.defaultProps = {
isMultiSelect: false,
includeHint: true
};

View File

@@ -6,7 +6,7 @@ import FormInputGroup from 'Components/Form/FormInputGroup';
import FormLabel from 'Components/Form/FormLabel';
import { inputTypes } from 'Helpers/Props';
function getType(type) {
function getType(type, value) {
switch (type) {
case 'captcha':
return inputTypes.CAPTCHA;
@@ -45,7 +45,8 @@ function getSelectValues(selectOptions) {
return _.reduce(selectOptions, (result, option) => {
result.push({
key: option.value,
value: option.name
value: option.name,
hint: option.hint
});
return result;
@@ -62,6 +63,7 @@ function ProviderFieldFormGroup(props) {
value,
type,
advanced,
requestAction,
hidden,
pending,
errors,
@@ -86,7 +88,7 @@ function ProviderFieldFormGroup(props) {
<FormLabel>{label}</FormLabel>
<FormInputGroup
type={getType(type)}
type={getType(type, value)}
name={name}
label={label}
helpText={helpText}
@@ -98,6 +100,7 @@ function ProviderFieldFormGroup(props) {
pending={pending}
includeFiles={type === 'filePath' ? true : undefined}
onChange={onChange}
requestAction={requestAction}
{...otherProps}
/>
</FormGroup>
@@ -118,6 +121,7 @@ ProviderFieldFormGroup.propTypes = {
value: PropTypes.any,
type: PropTypes.string.isRequired,
advanced: PropTypes.bool.isRequired,
requestAction: PropTypes.string,
hidden: PropTypes.string,
pending: PropTypes.bool.isRequired,
errors: PropTypes.arrayOf(PropTypes.object).isRequired,

View File

@@ -15,10 +15,12 @@
.value {
display: flex;
max-width: 500px;
}
.movieFolder {
flex: 0 0 auto;
@add-mixin truncate;
color: $disabledColor;
}

View File

@@ -0,0 +1,19 @@
.input {
composes: input from '~Components/Form/Input.css';
flex-grow: 1;
min-height: 200px;
resize: vertical;
}
.readOnly {
background-color: #eee;
}
.hasError {
composes: hasError from '~Components/Form/Input.css';
}
.hasWarning {
composes: hasWarning from '~Components/Form/Input.css';
}

View File

@@ -0,0 +1,172 @@
import classNames from 'classnames';
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import styles from './TextArea.css';
class TextArea extends Component {
//
// Lifecycle
constructor(props, context) {
super(props, context);
this._input = null;
this._selectionStart = null;
this._selectionEnd = null;
this._selectionTimeout = null;
this._isMouseTarget = false;
}
componentDidMount() {
window.addEventListener('mouseup', this.onDocumentMouseUp);
}
componentWillUnmount() {
window.removeEventListener('mouseup', this.onDocumentMouseUp);
if (this._selectionTimeout) {
this._selectionTimeout = clearTimeout(this._selectionTimeout);
}
}
//
// Control
setInputRef = (ref) => {
this._input = ref;
}
selectionChange() {
if (this._selectionTimeout) {
this._selectionTimeout = clearTimeout(this._selectionTimeout);
}
this._selectionTimeout = setTimeout(() => {
const selectionStart = this._input.selectionStart;
const selectionEnd = this._input.selectionEnd;
const selectionChanged = (
this._selectionStart !== selectionStart ||
this._selectionEnd !== selectionEnd
);
this._selectionStart = selectionStart;
this._selectionEnd = selectionEnd;
if (this.props.onSelectionChange && selectionChanged) {
this.props.onSelectionChange(selectionStart, selectionEnd);
}
}, 10);
}
//
// Listeners
onChange = (event) => {
const {
name,
onChange
} = this.props;
const payload = {
name,
value: event.target.value
};
onChange(payload);
}
onFocus = (event) => {
if (this.props.onFocus) {
this.props.onFocus(event);
}
this.selectionChange();
}
onKeyUp = () => {
this.selectionChange();
}
onMouseDown = () => {
this._isMouseTarget = true;
}
onMouseUp = () => {
this.selectionChange();
}
onDocumentMouseUp = () => {
if (this._isMouseTarget) {
this.selectionChange();
}
this._isMouseTarget = false;
}
//
// Render
render() {
const {
className,
readOnly,
autoFocus,
placeholder,
name,
value,
hasError,
hasWarning,
onBlur
} = this.props;
return (
<textarea
ref={this.setInputRef}
readOnly={readOnly}
autoFocus={autoFocus}
placeholder={placeholder}
className={classNames(
className,
readOnly && styles.readOnly,
hasError && styles.hasError,
hasWarning && styles.hasWarning
)}
name={name}
value={value}
onChange={this.onChange}
onFocus={this.onFocus}
onBlur={onBlur}
onKeyUp={this.onKeyUp}
onMouseDown={this.onMouseDown}
onMouseUp={this.onMouseUp}
/>
);
}
}
TextArea.propTypes = {
className: PropTypes.string.isRequired,
readOnly: PropTypes.bool,
autoFocus: PropTypes.bool,
placeholder: PropTypes.string,
name: PropTypes.string.isRequired,
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number, PropTypes.array]).isRequired,
hasError: PropTypes.bool,
hasWarning: PropTypes.bool,
onChange: PropTypes.func.isRequired,
onFocus: PropTypes.func,
onBlur: PropTypes.func,
onSelectionChange: PropTypes.func
};
TextArea.defaultProps = {
className: styles.input,
type: 'text',
readOnly: false,
autoFocus: false,
value: ''
};
export default TextArea;

View File

@@ -4,14 +4,17 @@ import Icon from 'Components/Icon';
import { icons } from 'Helpers/Props';
import styles from './HeartRating.css';
function HeartRating({ rating, iconSize }) {
function HeartRating({ rating, iconSize, hideHeart }) {
return (
<span>
<Icon
className={styles.heart}
name={icons.HEART}
size={iconSize}
/>
{
!hideHeart &&
<Icon
className={styles.heart}
name={icons.HEART}
size={iconSize}
/>
}
{rating * 10}%
</span>
@@ -20,7 +23,8 @@ function HeartRating({ rating, iconSize }) {
HeartRating.propTypes = {
rating: PropTypes.number.isRequired,
iconSize: PropTypes.number.isRequired
iconSize: PropTypes.number.isRequired,
hideHeart: PropTypes.bool
};
HeartRating.defaultProps = {

View File

@@ -0,0 +1,3 @@
.lists {
flex: 1 0 auto;
}

View File

@@ -0,0 +1,43 @@
import _ from 'lodash';
import PropTypes from 'prop-types';
import React from 'react';
import { kinds, sizes } from 'Helpers/Props';
import Label from './Label';
import styles from './ImportListList.css';
function ImportListList({ lists, importListList }) {
return (
<div className={styles.lists}>
{
lists.map((t) => {
const list = _.find(importListList, { id: t });
if (!list) {
return null;
}
return (
<Label
key={list.id}
kind={kinds.INFO}
size={sizes.MEDIUM}
>
{list.name}
</Label>
);
})
}
</div>
);
}
ImportListList.propTypes = {
lists: PropTypes.arrayOf(PropTypes.number).isRequired,
importListList: PropTypes.arrayOf(PropTypes.object).isRequired
};
ImportListList.defaultProps = {
lists: []
};
export default ImportListList;

View File

@@ -0,0 +1,17 @@
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createImportListSelector from 'Store/Selectors/createImportListSelector';
import ImportListList from './ImportListList';
function createMapStateToProps() {
return createSelector(
createImportListSelector(),
(importListList) => {
return {
importListList
};
}
);
}
export default connect(createMapStateToProps)(ImportListList);

View File

@@ -87,6 +87,15 @@
}
}
.queue {
border-color: $queueColor;
background-color: $queueColor;
&.outline {
color: $queueColor;
}
}
/** Sizes **/
.small {

View File

@@ -17,6 +17,7 @@ class ClipboardButton extends Component {
this._id = getUniqueElememtId();
this._successTimeout = null;
this._testResultTimeout = null;
this.state = {
showSuccess: false,
@@ -26,7 +27,8 @@ class ClipboardButton extends Component {
componentDidMount() {
this._clipboard = new Clipboard(`#${this._id}`, {
text: () => this.props.value
text: () => this.props.value,
container: document.getElementById(this._id)
});
this._clipboard.on('success', this.onSuccess);
@@ -47,6 +49,10 @@ class ClipboardButton extends Component {
if (this._clipboard) {
this._clipboard.destroy();
}
if (this._testResultTimeout) {
clearTimeout(this._testResultTimeout);
}
}
//
@@ -80,6 +86,7 @@ class ClipboardButton extends Component {
render() {
const {
value,
className,
...otherProps
} = this.props;
@@ -95,7 +102,7 @@ class ClipboardButton extends Component {
return (
<FormInputButton
id={this._id}
className={styles.button}
className={className}
{...otherProps}
>
<span className={showStateIcon ? styles.showStateIcon : undefined}>
@@ -121,7 +128,12 @@ class ClipboardButton extends Component {
}
ClipboardButton.propTypes = {
className: PropTypes.string.isRequired,
value: PropTypes.string.isRequired
};
ClipboardButton.defaultProps = {
className: styles.button
};
export default ClipboardButton;

View File

@@ -1,3 +1,4 @@
import classNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react';
import styles from './LoadingIndicator.css';
@@ -13,7 +14,7 @@ function LoadingIndicator({ className, rippleClassName, size }) {
style={{ height }}
>
<div
className={styles.rippleContainer}
className={classNames(styles.rippleContainer, 'followingBalls')}
style={{ width, height }}
>
<div

View File

@@ -2,8 +2,24 @@ import React from 'react';
import styles from './LoadingMessage.css';
const messages = [
'Welcome to Radarr Aphrodite Preview. Enjoy'
// TODO Add some messages here
'Downloading more RAM',
'Now in Technicolor',
'Previously on Radarr...',
'Bleep Bloop.',
'Locating the required gigapixels to render...',
'Spinning up the hamster wheel...',
'At least you\'re not on hold',
'Hum something loud while others stare',
'Loading humorous message... Please Wait',
'I could\'ve been faster in Python',
'Don\'t forget to rewind your tracks',
'Congratulations! you are the 1000th visitor.',
'HELP! I\'m being held hostage and forced to write these stupid lines!',
'RE-calibrating the internet...',
'I\'ll be here all week',
'Don\'t forget to tip your waitress',
'Apply directly to the forehead',
'Loading Battlestation'
];
let message = null;

View File

@@ -9,6 +9,7 @@ class Marquee extends Component {
static propTypes = {
text: PropTypes.string,
title: PropTypes.string,
hoverToStop: PropTypes.bool,
loop: PropTypes.bool,
className: PropTypes.string
@@ -16,6 +17,7 @@ class Marquee extends Component {
static defaultProps = {
text: '',
title: '',
hoverToStop: true,
loop: false
};
@@ -144,7 +146,7 @@ class Marquee extends Component {
this.text = el;
}}
style={style}
title={this.props.text}
title={(this.props.title && (this.props.text !== this.props.title)) ? `Original Title: ${this.props.title}` : this.props.text}
>
{this.props.text}
</span>
@@ -167,7 +169,7 @@ class Marquee extends Component {
this.text = el;
}}
style={style}
title={this.props.text}
title={(this.props.title && (this.props.text !== this.props.title)) ? `Original Title: ${this.props.title}` : this.props.text}
>
{this.props.text}
</span>

View File

@@ -6,6 +6,7 @@ import ModalBody from 'Components/Modal/ModalBody';
import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import translate from 'Utilities/String/translate';
import styles from './ModalError.css';
function ModalError(props) {
@@ -33,7 +34,7 @@ function ModalError(props) {
<Button
onPress={onModalClose}
>
Close
{translate('Close')}
</Button>
</ModalFooter>
</ModalContent>);

View File

@@ -1,11 +1,12 @@
import PropTypes from 'prop-types';
import React from 'react';
import PageContent from 'Components/Page/PageContent';
import translate from 'Utilities/String/translate';
import styles from './NotFound.css';
function NotFound({ message }) {
return (
<PageContent title="MIA">
<PageContent title={translate('MIA')}>
<div className={styles.container}>
<div className={styles.message}>
{message}

View File

@@ -6,6 +6,7 @@ import ModalBody from 'Components/Modal/ModalBody';
import ModalContent from 'Components/Modal/ModalContent';
import ModalFooter from 'Components/Modal/ModalFooter';
import ModalHeader from 'Components/Modal/ModalHeader';
import translate from 'Utilities/String/translate';
import styles from './KeyboardShortcutsModalContent.css';
function getShortcuts() {
@@ -19,18 +20,26 @@ function getShortcuts() {
}
function getShortcutKey(combo, isOsx) {
const comboMatch = combo.match(/(.+?)\+(.)/);
const comboMatch = combo.match(/(.+?)\+(.*)/);
if (!comboMatch) {
return combo;
}
const modifier = comboMatch[1];
const key = comboMatch[2];
let key = comboMatch[2];
let osModifier = modifier;
if (modifier === 'mod') {
osModifier = isOsx ? 'cmd' : 'ctrl';
osModifier = isOsx ? 'cmd' : 'Ctrl';
}
if (key === 'home') {
key = isOsx ? '↑' : 'Home';
}
if (key === 'end') {
key = isOsx ? '↓' : 'End';
}
return `${osModifier} + ${key}`;
@@ -75,7 +84,7 @@ function KeyboardShortcutsModalContent(props) {
<Button
onPress={onModalClose}
>
Close
{translate('Close')}
</Button>
</ModalFooter>
</ModalContent>

View File

@@ -4,15 +4,15 @@
}
.loading {
margin-top: 18px;
margin-bottom: 18px;
text-align: center;
position: absolute;
display: inline-block;
margin-left: 5px;
}
.ripple {
composes: ripple from '~Components/Loading/LoadingIndicator.css';
border: 2px solid $toolbarColor;
border: 1px solid $toolbarColor;
}
.input {

View File

@@ -11,9 +11,7 @@ import FuseWorker from './fuse.worker';
import MovieSearchResult from './MovieSearchResult';
import styles from './MovieSearchInput.css';
const LOADING_TYPE = 'suggestionsLoading';
const ADD_NEW_TYPE = 'addNew';
const workerInstance = new FuseWorker();
class MovieSearchInput extends Component {
@@ -24,6 +22,7 @@ class MovieSearchInput extends Component {
super(props, context);
this._autosuggest = null;
this._worker = null;
this.state = {
value: '',
@@ -33,7 +32,23 @@ class MovieSearchInput extends Component {
componentDidMount() {
this.props.bindShortcut(shortcuts.MOVIE_SEARCH_INPUT.key, this.focusInput);
workerInstance.addEventListener('message', this.onSuggestionsReceived, false);
}
componentWillUnmount() {
if (this._worker) {
this._worker.removeEventListener('message', this.onSuggestionsReceived, false);
this._worker.terminate();
this._worker = null;
}
}
getWorker() {
if (!this._worker) {
this._worker = new FuseWorker();
this._worker.addEventListener('message', this.onSuggestionsReceived, false);
}
return this._worker;
}
//
@@ -56,6 +71,15 @@ class MovieSearchInput extends Component {
return (
<div className={styles.sectionTitle}>
{section.title}
{
section.loading &&
<LoadingIndicator
className={styles.loading}
rippleClassName={styles.ripple}
size={20}
/>
}
</div>
);
}
@@ -73,16 +97,6 @@ class MovieSearchInput extends Component {
);
}
if (item.type === LOADING_TYPE) {
return (
<LoadingIndicator
className={styles.loading}
rippleClassName={styles.ripple}
size={30}
/>
);
}
return (
<MovieSearchResult
{...item.item}
@@ -99,7 +113,8 @@ class MovieSearchInput extends Component {
reset() {
this.setState({
value: '',
suggestions: []
suggestions: [],
loading: false
});
}
@@ -115,6 +130,15 @@ class MovieSearchInput extends Component {
}
onKeyDown = (event) => {
if (event.shiftKey || event.altKey || event.ctrlKey) {
return;
}
if (event.key === 'Escape') {
this.reset();
return;
}
if (event.key !== 'Tab' && event.key !== 'Enter') {
return;
}
@@ -155,35 +179,74 @@ class MovieSearchInput extends Component {
}
onSuggestionsFetchRequested = ({ value }) => {
this.setState({
suggestions: [
{
type: LOADING_TYPE,
title: value
}
]
});
if (!this.state.loading) {
this.setState({
loading: true
});
}
this.requestSuggestions(value);
};
requestSuggestions = _.debounce((value) => {
const payload = {
value,
movies: this.props.movies
};
if (!this.state.loading) {
return;
}
workerInstance.postMessage(payload);
const requestLoading = this.state.requestLoading;
this.setState({
requestValue: value,
requestLoading: true
});
if (!requestLoading) {
const payload = {
value,
movies: this.props.movies
};
this.getWorker().postMessage(payload);
}
}, 250);
onSuggestionsReceived = (message) => {
this.setState({
suggestions: message.data
});
const {
value,
suggestions
} = message.data;
if (!this.state.loading) {
this.setState({
requestValue: null,
requestLoading: false
});
} else if (value === this.state.requestValue) {
this.setState({
suggestions,
requestValue: null,
requestLoading: false,
loading: false
});
} else {
this.setState({
suggestions,
requestLoading: true
});
const payload = {
value: this.state.requestValue,
movies: this.props.movies
};
this.getWorker().postMessage(payload);
}
}
onSuggestionsClearRequested = () => {
this.setState({
suggestions: []
suggestions: [],
loading: false
});
}
@@ -201,20 +264,22 @@ class MovieSearchInput extends Component {
render() {
const {
value,
loading,
suggestions
} = this.state;
const suggestionGroups = [];
if (suggestions.length) {
if (suggestions.length || loading) {
suggestionGroups.push({
title: 'Existing Movie',
title: translate('ExistingMovies'),
loading,
suggestions
});
}
suggestionGroups.push({
title: 'Add New Movie',
title: translate('AddNewMovie'),
suggestions: [
{
type: ADD_NEW_TYPE,

View File

@@ -21,8 +21,9 @@
}
.logoFull {
width: 144px;
height: 48px;
margin-left: 15px;
width: 120px;
height: 40px;
}
.logo {

View File

@@ -4,6 +4,7 @@ import keyboardShortcuts, { shortcuts } from 'Components/keyboardShortcuts';
import IconButton from 'Components/Link/IconButton';
import Link from 'Components/Link/Link';
import { icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import KeyboardShortcutsModal from './KeyboardShortcutsModal';
import MovieSearchInputConnector from './MovieSearchInputConnector';
import PageHeaderActionsMenuConnector from './PageHeaderActionsMenuConnector';
@@ -79,7 +80,7 @@ class PageHeader extends Component {
/>
<IconButton
className={styles.translate}
title="Suggest translation change"
title={translate('SuggestTranslationChange')}
name={icons.TRANSLATE}
to="https://translate.servarr.com/projects/radarr/radarr/"
size={24}

View File

@@ -7,6 +7,7 @@ import MenuContent from 'Components/Menu/MenuContent';
import MenuItem from 'Components/Menu/MenuItem';
import MenuItemSeparator from 'Components/Menu/MenuItemSeparator';
import { align, icons, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate';
import styles from './PageHeaderActionsMenu.css';
function PageHeaderActionsMenu(props) {
@@ -32,7 +33,7 @@ function PageHeaderActionsMenu(props) {
className={styles.itemIcon}
name={icons.KEYBOARD}
/>
Keyboard Shortcuts
{translate('KeyboardShortcuts')}
</MenuItem>
<MenuItemSeparator />
@@ -42,7 +43,7 @@ function PageHeaderActionsMenu(props) {
className={styles.itemIcon}
name={icons.RESTART}
/>
Restart
{translate('Restart')}
</MenuItem>
<MenuItem onPress={onShutdownPress}>
@@ -51,7 +52,7 @@ function PageHeaderActionsMenu(props) {
name={icons.SHUTDOWN}
kind={kinds.DANGER}
/>
Shutdown
{translate('Shutdown')}
</MenuItem>
{

View File

@@ -47,7 +47,7 @@ function getSuggestions(movies, value) {
return suggestions;
}
self.addEventListener('message', (e) => {
onmessage = function(e) {
if (!e) {
return;
}
@@ -57,5 +57,12 @@ self.addEventListener('message', (e) => {
value
} = e.data;
self.postMessage(getSuggestions(movies, value));
});
const suggestions = getSuggestions(movies, value);
const results = {
value,
suggestions
};
self.postMessage(results);
};

View File

@@ -6,7 +6,7 @@ import { createSelector } from 'reselect';
import { saveDimensions, setIsSidebarVisible } from 'Store/Actions/appActions';
import { fetchCustomFilters } from 'Store/Actions/customFilterActions';
import { fetchMovies } from 'Store/Actions/movieActions';
import { fetchLanguages, fetchNetImports, fetchQualityProfiles, fetchUISettings } from 'Store/Actions/settingsActions';
import { fetchImportLists, fetchLanguages, fetchQualityProfiles, fetchUISettings } from 'Store/Actions/settingsActions';
import { fetchStatus } from 'Store/Actions/systemActions';
import { fetchTags } from 'Store/Actions/tagActions';
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
@@ -48,7 +48,7 @@ const selectIsPopulated = createSelector(
(state) => state.settings.ui.isPopulated,
(state) => state.settings.qualityProfiles.isPopulated,
(state) => state.settings.languages.isPopulated,
(state) => state.settings.netImports.isPopulated,
(state) => state.settings.importLists.isPopulated,
(state) => state.system.status.isPopulated,
(
customFiltersIsPopulated,
@@ -56,7 +56,7 @@ const selectIsPopulated = createSelector(
uiSettingsIsPopulated,
qualityProfilesIsPopulated,
languagesIsPopulated,
netImportsIsPopulated,
importListsIsPopulated,
systemStatusIsPopulated
) => {
return (
@@ -65,7 +65,7 @@ const selectIsPopulated = createSelector(
uiSettingsIsPopulated &&
qualityProfilesIsPopulated &&
languagesIsPopulated &&
netImportsIsPopulated &&
importListsIsPopulated &&
systemStatusIsPopulated
);
}
@@ -77,7 +77,7 @@ const selectErrors = createSelector(
(state) => state.settings.ui.error,
(state) => state.settings.qualityProfiles.error,
(state) => state.settings.languages.error,
(state) => state.settings.netImports.error,
(state) => state.settings.importLists.error,
(state) => state.system.status.error,
(
customFiltersError,
@@ -85,7 +85,7 @@ const selectErrors = createSelector(
uiSettingsError,
qualityProfilesError,
languagesError,
netImportsError,
importListsError,
systemStatusError
) => {
const hasError = !!(
@@ -94,7 +94,7 @@ const selectErrors = createSelector(
uiSettingsError ||
qualityProfilesError ||
languagesError ||
netImportsError ||
importListsError ||
systemStatusError
);
@@ -105,7 +105,7 @@ const selectErrors = createSelector(
uiSettingsError,
qualityProfilesError,
languagesError,
netImportsError,
importListsError,
systemStatusError
};
}
@@ -153,8 +153,8 @@ function createMapDispatchToProps(dispatch, props) {
dispatchFetchLanguages() {
dispatch(fetchLanguages());
},
dispatchFetchNetImports() {
dispatch(fetchNetImports());
dispatchFetchImportLists() {
dispatch(fetchImportLists());
},
dispatchFetchUISettings() {
dispatch(fetchUISettings());
@@ -191,7 +191,7 @@ class PageConnector extends Component {
this.props.dispatchFetchTags();
this.props.dispatchFetchQualityProfiles();
this.props.dispatchFetchLanguages();
this.props.dispatchFetchNetImports();
this.props.dispatchFetchImportLists();
this.props.dispatchFetchUISettings();
this.props.dispatchFetchStatus();
}
@@ -215,7 +215,7 @@ class PageConnector extends Component {
dispatchFetchTags,
dispatchFetchQualityProfiles,
dispatchFetchLanguages,
dispatchFetchNetImports,
dispatchFetchImportLists,
dispatchFetchUISettings,
dispatchFetchStatus,
...otherProps
@@ -254,7 +254,7 @@ PageConnector.propTypes = {
dispatchFetchTags: PropTypes.func.isRequired,
dispatchFetchQualityProfiles: PropTypes.func.isRequired,
dispatchFetchLanguages: PropTypes.func.isRequired,
dispatchFetchNetImports: PropTypes.func.isRequired,
dispatchFetchImportLists: PropTypes.func.isRequired,
dispatchFetchUISettings: PropTypes.func.isRequired,
dispatchFetchStatus: PropTypes.func.isRequired,
onSidebarVisibleChange: PropTypes.func.isRequired

View File

@@ -98,7 +98,7 @@ const links = [
},
{
title: translate('Lists'),
to: '/settings/netimports'
to: '/settings/importlists'
},
{
title: translate('Connect'),
@@ -117,7 +117,7 @@ const links = [
to: '/settings/general'
},
{
title: translate('Ui'),
title: translate('UI'),
to: '/settings/ui'
}
]

View File

@@ -73,6 +73,10 @@
background-color: $infoColor;
}
.queue {
background-color: $queueColor;
}
.small {
height: $progressBarSmallHeight;

View File

@@ -1,4 +1,3 @@
import _ from 'lodash';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector';
@@ -8,12 +7,12 @@ function createMapStateToProps() {
return createSelector(
createUISettingsSelector(),
(uiSettings) => {
return _.pick(uiSettings, [
'showRelativeDates',
'shortDateFormat',
'longDateFormat',
'timeFormat'
]);
return {
showRelativeDates: uiSettings.showRelativeDates,
shortDateFormat: uiSettings.shortDateFormat,
longDateFormat: uiSettings.longDateFormat,
timeFormat: uiSettings.timeFormat
};
}
);
}

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