Compare commits

..

191 Commits

Author SHA1 Message Date
Bogdan 1fd188fe7a Add wiki fragment and translation to UpdateCheck 2023-05-06 19:06:43 +03:00
Lars 5e5699fbbe New: Option to use Telegram topics for notifications
(cherry picked from commit c8933d812490ba375c6f7e07cd4355921dc513ac)

Closes #1640
2023-05-06 16:33:49 +03:00
Mark McDowall d61275e6db New: Improve path validation when handling paths from different OSes
(cherry picked from commit 0321368cc392d7a0a488409bf6bd586ba45497af)
2023-05-06 16:30:20 +03:00
Benjamin Staneck dca3e939f0 Update webpack and webpack-cli
(cherry picked from commit 8bcaa17e25161aeedd9ca8488a4bb6f4c423de2b)
2023-05-06 11:00:01 +03:00
Benjamin Staneck 26ac66c0e1 Fixed some aria violations
(cherry picked from commit 7aa846343815105e3576e6aa20eac64fcb0edf8d)
2023-05-06 10:50:05 +03:00
Benjamin Staneck 649b301444 New: Updated button and calendar outline colors for dark theme
(cherry picked from commit 5d873fafec07c9d67ad8d2c16eecea195a78eecf)
2023-05-06 10:47:58 +03:00
Benjamin Staneck 78ed2a1af0 Update core-js and use defaults for browserlist
(cherry picked from commit de4cfefde4d00aba829356541b02e8f9a7729977)
2023-05-06 10:44:51 +03:00
Benjamin Staneck a4854b7b5f Use minified jquery
(cherry picked from commit bb77bb640c0529ca3e6386ec657e64ebafad02f4)
2023-05-06 10:41:55 +03:00
Weblate 97edf495bd Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (508 of 508 strings)

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translation: Servarr/Prowlarr
2023-05-05 15:26:39 +03:00
Mark McDowall d10bdf4676 New style scrollbar in Firefox
(cherry picked from commit 9bd783d49c91600d6575fc86e7bdd56858c213f1)
2023-05-05 04:21:09 +03:00
Bogdan 03647143e3 Remove unused ReactDOM import 2023-05-05 04:14:51 +03:00
Mark McDowall 8090dc9983 Fixed: File browser
(cherry picked from commit f7ce5c7b115ea0d12ab63f19960c473e09e30f3d)
2023-05-05 04:04:58 +03:00
Qstick 5bc1f345c0 Auto-reply for Log Label
(cherry picked from commit d851ecdf2f826f25b9d2d67d3b7e9e3642bc5299)
2023-05-04 20:24:26 +03:00
Weblate 4ef01f5640 Translated using Weblate (Chinese (Simplified) (zh_CN))
Currently translated at 96.6% (489 of 506 strings)

Translated using Weblate (French)

Currently translated at 100.0% (506 of 506 strings)

Co-authored-by: Remy <remy@mrbk.fr>
Co-authored-by: hellojuly <pangcheinug@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2023-05-03 22:47:30 +03:00
Bogdan f13d5c5a14 Fix typo in ShowSearchHelpText 2023-05-03 21:24:22 +03:00
Bogdan dc8773cf79 Update and sort translations 2023-05-03 20:25:04 +03:00
Weblate cad774e250 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (506 of 506 strings)

Translated using Weblate (Dutch)

Currently translated at 83.0% (420 of 506 strings)

Translated using Weblate (French)

Currently translated at 100.0% (506 of 506 strings)

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: R00T99 <ddaa5e30-3d20-41f9-8ed8-bba67e8acf80@anonaddy.me>
Co-authored-by: foXaCe <foxace66@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translation: Servarr/Prowlarr
2023-05-02 13:05:17 +03:00
Bogdan b28eee578a Log apps sync not having intersecting tags as debug 2023-05-02 10:23:13 +03:00
Bogdan 5b8c7d0b79 New: (Rarbg) Add caching results 2023-05-02 08:08:51 +03:00
Bogdan 8bdc7a6db7 Check response status code in classes that extend RssParser 2023-05-02 08:06:21 +03:00
Tebowy Seba cb189b8f61 Fixed: (BrokenStones) Restored, site moved domains 2023-05-02 01:47:17 +03:00
Bogdan 24468db376 Fixed: (AudioBookBay) New indexer url 2023-05-01 00:52:12 +03:00
Bakerboy448 9b10cea556 Fixed: Improve Rarbg Rate Limit Messaging 2023-04-30 20:03:56 +03:00
Weblate d8fb71d501 Update translation files
Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/
Translation: Servarr/Prowlarr
2023-04-29 23:31:37 +03:00
Bogdan fc39a11ece (Apprise) Change BaseUrl to ServerUrl 2023-04-29 23:30:49 +03:00
Bakerboy448 40dc4de47d Fixed: Missing Translates 2023-04-29 15:29:46 -05:00
Bogdan a0e2f3324c Fixed: (AnimeBytes) Cache result releases 2023-04-29 19:29:38 +03:00
Qstick 1bcc3b426e Bump version to 1.5.0 2023-04-29 11:27:02 -05:00
Bogdan 66f5fd2a26 Fixed: (BroadcastheNet) Add tests & prefer TvdbId 2023-04-29 19:00:26 +03:00
Bogdan b5e5701791 Trim search term 2023-04-29 19:00:26 +03:00
Bakerboy448 1a9b202afe Fixed: Clarify App Sync-Indexer Logging for tags 2023-04-29 09:12:31 -05:00
Qstick 309f42bac5 Fixed: Normalize ImdbId for incoming requests
Fixes #1631
2023-04-28 22:38:19 -05:00
Weblate ed330ea657 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (484 of 484 strings)

Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translation: Servarr/Prowlarr
2023-04-26 07:11:28 +03:00
Bogdan fc6a31ea78 Fixed: (AnimeBytes) Parsing season improvements 2023-04-25 15:20:55 +03:00
Bogdan 25ba9195cf Fixed: (XSpeeds) Update category mappings 2023-04-25 15:18:35 +03:00
Bogdan 681f06e321 Fixed: Disable checking for updates when in debug runtime
Same as a8e2b1520a

Closes #1626
2023-04-24 17:08:02 +03:00
Bogdan af7fb442d2 New: Add PixelHD 2023-04-24 14:38:34 +03:00
Bogdan 2061b9142f Fixed: (XSpeeds) Update category mappings 2023-04-24 06:10:15 +03:00
Bogdan b97f6f8ddf Fixed: (UI) Add New Indexer button to open the Add Indexer modal
Fixes #1625
Closes #1389
2023-04-24 04:31:11 +03:00
Qstick f31c0bb1de Bump version to 1.4.1 2023-04-23 13:18:30 -05:00
Qstick 65e6aa05c3 Bump version to 1.4.0 2023-04-23 12:15:23 -05:00
Bogdan fb20b3e61b Fixed: (AnimeBytes) Add tests for season parsing 2023-04-23 14:55:50 +03:00
Bogdan b8a77830aa Fixed: (AnimeBytes) Parse response with STJson 2023-04-23 07:44:46 +03:00
Bogdan d2ba52cdce Fixed: (Indexers) Hide errors with SuppressHttpErrorStatusCodes 2023-04-23 07:44:16 +03:00
Bogdan 43f881c442 Fixed: (Nebulance) Don't parse invalid response as JSON 2023-04-23 06:40:26 +03:00
Bogdan 4a5e923999 Fixed: (AnimeBytes) Parse season only for category Anime 2023-04-22 20:37:09 +03:00
Bogdan 57e1b6b4a0 Fixed: (AnimeBytes) Improve season/episode detection 2023-04-22 20:19:44 +03:00
Bogdan 9cc60760c3 Fixed: (AnimeBytes) Exclude RAW only for category Anime 2023-04-22 20:17:36 +03:00
Weblate 2811feb14e Translated using Weblate (Chinese (Simplified) (zh_CN))
Currently translated at 99.7% (483 of 484 strings)

Translated using Weblate (Portuguese)

Currently translated at 78.3% (379 of 484 strings)

Co-authored-by: PedroBuffon <henriquebuffon@gmail.com>
Co-authored-by: SHUAI.W <x@ousui.org>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2023-04-22 14:21:43 +03:00
Bogdan 46af9223bc Fixed: (BakaBT) Update check if logged in
Resolves #1617
2023-04-22 07:47:14 +03:00
Bogdan 025156978b Fixed: (AnimeBytes) Ignore useless extensions to improve single file names 2023-04-22 03:13:56 +03:00
Bogdan d3ca861aea Fixed: (AnimeBytes) Remove The Movie from search term 2023-04-21 07:36:52 +03:00
Bogdan c9249ed583 Fixed: (UI) Typo in hover border colors 2023-04-20 11:51:44 +03:00
Bogdan 94cc56d0f6 Fixed: (AnimeBytes) Improve season/episode detection 2023-04-20 10:39:15 +03:00
Bogdan c8addc0d62 Rearrange params in Apprise 2023-04-20 08:10:05 +03:00
Bogdan 2015156061 New: (Apprise) Add notification type
Closes #1619
2023-04-20 07:45:51 +03:00
Bogdan 742c680014 Fixed: (AnimeBytes) Add Remux to release titles when possible 2023-04-20 03:08:13 +03:00
Bogdan b1add3f649 Fixed: (AnimeBytes) Parse M2TS property as BR-DISK 2023-04-20 01:54:18 +03:00
bakerboy448 65d6d518d7 New: Improve applications error reporting for requests (#1618)
Co-authored-by: Bogdan <mynameisbogdan@users.noreply.github.com>
2023-04-19 03:44:22 +03:00
Cedric Lewe bc8ba5ca02 Fixed: (BakaBT) Update login check (#1617)
Co-authored-by: Bogdan <mynameisbogdan@users.noreply.github.com>
2023-04-18 22:43:17 +03:00
Bogdan 6aebc4ee01 Revert properties order in SonarrSettings 2023-04-18 04:47:09 +03:00
Bogdan 9bbe51253b New: Add default urls to applications 2023-04-18 04:42:08 +03:00
Mark McDowall 88fbc30be2 New: Improved messaging when qBittorrent fails due to host header rejection
(cherry picked from commit 48b4cc5f3ffa0cb8eea6748db9091267216cef4f)
2023-04-18 03:42:48 +03:00
bakerboy448 5fdc6ee25d Fixed: (BroadcasTheNet) Improve season/episode/daily episode searches 2023-04-17 23:44:37 +03:00
Bogdan 4eb5a2d613 Fixed: (Cardigann) Simplify creating CardigannRequest 2023-04-17 21:42:05 +03:00
Bogdan 122883053a Fixed: (Cardigann) Respect Followredirect for login forms
Fixes #526
2023-04-17 19:38:37 +03:00
Bogdan 28d09cd384 Fixed: (Rarbg) Simplify retry fetching for expired tokens 2023-04-17 06:21:07 +03:00
Bogdan 17be8bb68a Add SuppressHttpErrorStatusCodes to HttpRequestBuilder 2023-04-17 06:21:07 +03:00
Qstick c5baded3d6 Simplify DatabaseType logic 2023-04-16 20:09:04 -05:00
Bogdan 349cfacdca Rename CC to Cc 2023-04-17 04:06:29 +03:00
Bogdan 788fa6d96a Fixed: (Database) Improve Version detection 2023-04-17 04:04:01 +03:00
Bogdan fbea5bbc06 Fixed: (CookieUtil) Add tests 2023-04-16 05:13:30 +03:00
Bogdan d667c7d853 Fixed: Use Array.Empty and fix a few multiple enumerations
(cherry picked from commit 11d91faaada0e70910c832ce405ddeed52a24172)
2023-04-16 05:09:12 +03:00
Qstick a9e1204a9b Fixed: Validate if equals or child for startup folder
(cherry picked from commit 0991cfe27efd6ddb533227b25754661e18d7e9ad)
2023-04-16 05:07:50 +03:00
Bogdan 88e3f86262 Fixed: Migrate to FluentValidation 9 2023-04-16 05:07:50 +03:00
Bogdan 1c173fc984 Fixed: (Cardigann) Update namespace and use nameof() 2023-04-15 07:04:43 +03:00
Bogdan 6e8f3d814a Fixed: (Cardigann) Log requests as debug 2023-04-15 06:54:44 +03:00
Bogdan 14e105e37e Fixed: (Redacted) Add tests 2023-04-14 23:50:33 +03:00
Bogdan 9e0deb8f74 Fixed: (TorrentInfo) Cleanup redundant Freeleech property 2023-04-14 23:13:21 +03:00
Bogdan 245e573089 Fixed: (TorrentPotato) Update namespace 2023-04-14 23:11:03 +03:00
Bogdan 5e8bfa2ffb Fixed: (RuTracker) Add new indexer url
Fixes #1610
2023-04-14 09:06:41 +03:00
Bogdan 555c924e50 New: Add version and timestamp to backup archive
(cherry picked from commit ed3d880974ae6a1430866eebaf72533f35258f6f)

Fixes #662
Closes #1600
2023-04-14 06:06:15 +03:00
Bogdan 8404b85624 Fixed: (AnimeBytes) API responds now with size as integer 2023-04-14 05:58:23 +03:00
Bogdan dc5e6d29e1 Bump dotnet to 6.0.16 2023-04-14 03:21:01 +03:00
Bogdan 8c42b7a69b Update DryIoc, Newtonsoft.Json, Sentry, SharpZipLib, MailKit 2023-04-14 01:56:21 +03:00
Weblate 3a6ebdef8a Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (484 of 484 strings)

Translated using Weblate (Spanish)

Currently translated at 77.0% (373 of 484 strings)

Translated using Weblate (German)

Currently translated at 95.8% (464 of 484 strings)

Co-authored-by: Deflector8249 <lh2jwko5@gomail.me>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: xuko <jorge.xuko@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translation: Servarr/Prowlarr
2023-04-13 01:29:23 +03:00
Bogdan 5f57957462 Fixed: (AnimeBytes) Improve release group detection 2023-04-13 01:13:03 +03:00
Bogdan 12526c1bb3 Fixed: (AnimeBytes) Improve season detection 2023-04-12 23:01:24 +03:00
Bogdan 29f049f766 Fixed: (AnimeBytes) Fix tests for release title structure change 2023-04-12 04:19:37 +03:00
Bogdan 40f4e1b82a Fixed: (AnimeBytes) Change release title structure for movies 2023-04-12 03:35:28 +03:00
Bogdan 065fbb30bf Fixed: Support the old broken functionality in GetValueEnum
(cherry picked from commit 2c4e1be12ad5e3b8362f83b8185c143f8e66062b)

Fixes #1602
2023-04-11 21:42:20 +03:00
Bogdan ea24a81ef7 Fixed: (API) Log errors in Newznab response 2023-04-11 18:32:45 +03:00
Bogdan 451f60319f Fixed: (Cardigann) Add check for request.inputs, since are null when pathselector is used
Fixes #1158
2023-04-11 18:31:11 +03:00
Bogdan c6ed5d65e0 Fixed: (Core) Ensure default config file on starting app
Fixes #674
Fixes #1588
2023-04-11 17:22:48 +03:00
bakerboy448 4e5cd05bbd Fixed: Improve Indexer Tags Help Text 2023-04-10 22:47:27 +03:00
Bogdan 6b2b953686 Fixed: (Cardigann) Catch errors when search.rows.count is not present 2023-04-10 07:49:22 +03:00
Mark McDowall 31c05be9de Fixed: Prevent getting disk space from returning no information when it partially fails
(cherry picked from commit 2c65e4fa41418157d0d27b34c3bab80158cff219)
2023-04-09 22:16:51 -05:00
Mark McDowall bc852c0b55 Fixed: USB drives mounted to folders are treated as different mounts
(cherry picked from commit 75378f7bde90b9d3d9b72404c25c017da2cd147c)
2023-04-09 22:15:51 -05:00
Qstick 18651d8be1 Cleanup old Radarr parsing library conditional 2023-04-09 22:14:53 -05:00
Qstick 1608095345 Fixed: Cleanup TaskManager, add BackupInterval limits 2023-04-09 22:11:46 -05:00
Bogdan 7700014ceb Fixed: (PassThePopcorn) Disable grouping, add pagination and use STJson 2023-04-10 05:32:33 +03:00
Bogdan 3fbc2912f0 Fixed: (AnimeBytes) Add limit and refactor parser 2023-04-10 05:03:43 +03:00
Mark McDowall 3192990874 Fixed: Number input changing while scrolling
(cherry picked from commit cc46ed56b4b70fe1f1443c0a927383f19c989c47)
2023-04-09 20:19:02 -05:00
Bogdan fb908e8e19 Fixed: Use project name as relative path 2023-04-10 04:15:02 +03:00
Bogdan 8e60c707b2 Fixed: (Cardigann) Skip rows parsing on zero rows 2023-04-10 02:55:32 +03:00
Bogdan a184bb0784 Fixed: (Core) Use MinBy and MaxBy 2023-04-09 21:14:40 +03:00
bakerboy448 e5ccbaaf24 Update bug_report.yml - trace logs checkbox 2023-04-09 20:25:11 +03:00
Weblate 362e0acad1 Translated using Weblate (Czech)
Currently translated at 70.0% (339 of 484 strings)

Co-authored-by: tomas15420 <tomas15420@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/cs/
Translation: Servarr/Prowlarr
2023-04-09 20:23:39 +03:00
Bogdan 54d06460d0 Fixed: (Avistaz/SecretCinema) Fix tests 2023-04-09 16:49:56 +03:00
Bogdan c11bcf4c41 Fixed: (SecretCinema) Fix PublishDate timezone 2023-04-09 16:18:05 +03:00
Bogdan 2e58583263 Fixed: (Avistaz) Fix PublishDate timezone 2023-04-09 16:14:09 +03:00
Bogdan bf7f769f13 Fixed: (AvistaZ) Don't log http errors like 404 for imdb/tmdb/tvdb searches 2023-04-08 22:55:05 +03:00
Bogdan 7820a83a5d Fixed: (Indexers) Include exception message in ValidationFailure 2023-04-08 22:49:53 +03:00
Bogdan d937bdac69 Fixed: (NZBIndex) Request generator cleanup 2023-04-08 22:17:29 +03:00
Qstick ebca32af46 Fixed: (NzbIndex) Paging starts at 0
Fixes #1586
2023-04-08 09:52:17 -05:00
Bogdan 21bda07510 Fixed: (Toloka) Add authors.gif to check for FL
Co-authored-by: odayny <odayny@users.noreply.github.com>
2023-04-08 01:11:37 +03:00
Bogdan f638cf34d1 Fixed: (UI) Fix search sorting by empty categories 2023-04-08 00:52:30 +03:00
Bogdan b7fcdb5356 Fixed: (AnimeBytes) Add search by year 2023-04-06 17:23:54 +03:00
bakerboy448 2e4fa9d06d Fixed: (AnimeBytes) Change RateLimit to 4s (#1580) 2023-04-06 04:32:58 +03:00
bakerboy448 9b50fc40ca Fix: (MaM) Improve No results logic (#1578) 2023-04-05 22:21:25 +03:00
bakerboy448 3c60159df0 Fixed: (AnimeBytes) RateLimit 1req per 10s
Fixes #1572
2023-04-05 20:53:04 +03:00
Bogdan e075003c8b Fixed: (FileList) Change TZ to account DST 2023-04-05 06:28:07 +03:00
Servarr b19202d9f5 Automated API Docs update 2023-04-05 05:45:34 +03:00
Bogdan 2784ee8ce6 Fixed: (UI) Update frontend packages 2023-04-05 05:14:08 +03:00
Bogdan 5aa4a5faaa Fixed: (Tags) Show applications in tag details 2023-04-05 05:12:56 +03:00
Weblate 1d00b40f90 Translated using Weblate (Portuguese)
Currently translated at 77.6% (376 of 484 strings)

Translated using Weblate (Hebrew)

Currently translated at 80.3% (389 of 484 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN))

Currently translated at 100.0% (484 of 484 strings)

Co-authored-by: Cassio Rizzi <clrizzi@gmail.com>
Co-authored-by: Nir Israel Hen <nirisraelh@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: 雨 <625250353@qq.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2023-04-03 19:54:21 -05:00
Qstick 93dd378ade Bump version to 1.3.3 2023-04-02 15:14:06 -05:00
Bogdan 534ca73bf8 Fixed: (Toloka) Add FreeleechOnly setting 2023-04-01 21:12:23 +03:00
Bogdan bceebc34c1 New: (Cardigann) Bump to v9 (#1551)
* New: (Cardigann) Add MissingAttributeEqualsNoResults support

(cherry picked from commit 4e8bb37a5c)

* New: (Cardigann) Add AllowEmptyInputs

* New: (Cardigann) Bump to v9

* New: (Cardigann) Add default value for fields
2023-03-30 14:57:04 +03:00
Bogdan 26f700731b Fixed: Bump Swashbuckle to 6.5.0 2023-03-24 18:12:10 +02:00
Bogdan 1ac1c94b55 Fixed: (Indexers) Show validation errors for Cardigann 2023-03-19 21:04:34 +02:00
Bogdan a7a2ccd9b8 Fixed: (IndexerFactory) Changed definitions condition to AND 2023-03-19 17:31:53 +02:00
Bogdan b0e01fefdc Fixed: (Torznab) Overwrite description only if it's null 2023-03-19 17:31:53 +02:00
Bogdan b86a4fd670 Fixed: (Torznab) Add SupportsPagination 2023-03-18 17:49:30 +02:00
bakerboy448 3ea43d711a New: Display Parameters on History by default 2023-03-18 13:16:09 +02:00
Qstick 049b4ba4d8 Fixed: Use Flaresolverr if setup when adding new Indexers 2023-03-17 18:17:58 +02:00
Bogdan 8d39a7f315 Fixed: (AnimeTorrents) Set SupportsPagination 2023-03-16 04:03:14 +02:00
Servarr e94b0b8960 Automated API Docs update 2023-03-15 20:22:17 -05:00
Bogdan 538abcc47b Fixed: (AvistazBase) Add pagination and SupportsPagination 2023-03-16 02:47:21 +02:00
Bogdan ac3047f0cc Fixed: (SpeedCD) Add pagination and SupportsPagination 2023-03-16 02:47:21 +02:00
Bogdan 4348ebe187 Fixed: (Indexers) Add SupportsPagination to prevent fetching the first page multiple times 2023-03-16 02:47:21 +02:00
Bogdan d4c5e39c9c Fixed: (AnimeTorrents) Add DownloadableOnly/FreeleechOnly settings 2023-03-16 02:31:36 +02:00
Tawagot0 1a7b6aecf1 Fixed: (xthor) update details link (#1525) 2023-03-15 19:15:28 -05:00
Bogdan ab5b799ecf Fixed: (Cardigann) Use cookies from captcha response 2023-03-16 02:13:27 +02:00
bakerboy448 972ee8f6a9 Fixed: (PirateTheNet) Switch to HTTPS from HTTP
Fixes #1528
2023-03-13 21:25:33 +02:00
Qstick 7dfff0690a Fixed: (PornoLab) Update Categories 2023-03-12 21:44:03 -05:00
Selfhost Alt 0de1640e9c Fixed: (PornoLab) Use correct download URL
This indexer was previously using the infoUrl as the download URL, which
cases downloads to fail when validating the torrent.

This change updates the `DownloadUrl` property to actually point at the
torrent file, enabling search results from this indexer to be
downloaded.
2023-03-12 21:35:43 -05:00
Bogdan 4c52856999 New: Add DICMusic 2023-03-12 20:30:41 +02:00
Bogdan 88329ff104 Fixed: (UI) Use event.composedPath() 2023-03-12 18:55:28 +02:00
Bogdan f90d66376e Fixed: (Apps) Delete indexers from apps when are no longer handled by Prowlarr 2023-03-12 18:38:47 +02:00
Weblate 4c47955e3f Translated using Weblate (Norwegian Bokmål)
Currently translated at 23.3% (113 of 484 strings)

Translated using Weblate (Italian)

Currently translated at 97.1% (470 of 484 strings)

Translated using Weblate (French)

Currently translated at 100.0% (484 of 484 strings)

Translated using Weblate (French)

Currently translated at 97.7% (473 of 484 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (484 of 484 strings)

Translated using Weblate (Romanian)

Currently translated at 70.8% (343 of 484 strings)

Translated using Weblate (Croatian)

Currently translated at 20.4% (99 of 484 strings)

Co-authored-by: Bendik Remoy <Bendikremoy@hotmail.com>
Co-authored-by: David Abner Ciuhan <dciuhan@gmail.com>
Co-authored-by: Florian <sephrat.flo@gmail.com>
Co-authored-by: Lizandra Candido da Silva <lizandra.c.s@gmail.com>
Co-authored-by: Remy <remy@mrbk.fr>
Co-authored-by: TheHrle <Hpranjkovic@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: federicofortini <federico.fortini@yahoo.it>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/ro/
Translation: Servarr/Prowlarr
2023-03-12 11:21:24 -05:00
Scott Jasso 38d5739406 Fix search UI offset 2023-03-12 11:13:12 -05:00
Bogdan ebcb50619e Fixed: (BrokenStones) Removed, site unavailable 2023-03-11 20:15:07 +02:00
Bogdan 0576c6af03 Fixed: (UI) Include ES6 libs in babel on Windows builder 2023-03-11 18:43:14 +02:00
bakerboy448 7385e7281b bump lock.yml [skip ci] 2023-03-10 02:12:27 +02:00
bakerboy448 e22cb5c2c9 bump label-actions [skip ci] 2023-03-10 02:12:13 +02:00
Arthur Outhenin-Chalandre 2d216fac5d Fixed: (Flaresolverr) no longer pass userAgent to FlareSolverr
Specifying userAgent is no longer supported by Flaresolverr v2 (October
2021). It's been almost 1 year and half now and Flaresolverr is now in version 3.

Signed-off-by: Arthur Outhenin-Chalandre <arthur@cri.epita.fr>
2023-03-08 21:16:29 -06:00
Bogdan 88e5d34fcf Fixed: (IPTorrents) Check if logged in and UserAgent validation 2023-03-09 05:04:25 +02:00
Bogdan 22cab3a63f Fixed: (UI) Use empty object when capabilities are undefined 2023-03-09 05:03:49 +02:00
Bogdan 577477c42d Fixed: (SceneTime) Add search by imdbid 2023-03-09 05:03:24 +02:00
Bogdan e211436eb5 Fixed: (SceneTime) Don't crash when category link is empty 2023-03-04 01:10:22 +02:00
Bogdan bb1ebda753 Fixed: (UI) Add tags to modal info and sort by label 2023-02-28 04:10:26 +02:00
Bogdan 455511c854 Fixed: (Apps) Don't clear user defined tags 2023-02-28 03:49:14 +02:00
Weblate 8b09f5dd1f Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (484 of 484 strings)

Translated using Weblate (Croatian)

Currently translated at 19.4% (93 of 478 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN))

Currently translated at 99.5% (476 of 478 strings)

Translated using Weblate (Portuguese)

Currently translated at 78.6% (376 of 478 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (478 of 478 strings)

Translated using Weblate (French)

Currently translated at 99.1% (474 of 478 strings)

Translated using Weblate (Spanish)

Currently translated at 77.9% (371 of 476 strings)

Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Philippe Latouche <big_lat@hotmail.com>
Co-authored-by: RicardoVelaC <ricardovelac@gmail.com>
Co-authored-by: TheHrle <Hpranjkovic@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: libsu <libsu@qq.com>
Co-authored-by: pedrom20 <pedrom20@gmail.com>
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/hr/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/prowlarr/zh_CN/
Translation: Servarr/Prowlarr
2023-02-27 19:14:50 -06:00
Qstick 0b9b671849 Fixed: RSS Icon color in light theme 2023-02-27 18:52:10 -06:00
Bogdan 5dfaa0db4b Fixed: (API) Allow new indexer request not to contain empty tags array 2023-02-28 02:29:49 +02:00
Bogdan 65a954b831 Fixed: (UI) Replace api. only if it's a subdomain 2023-02-27 19:50:24 +02:00
Servarr db84e82779 Automated API Docs update 2023-02-26 23:10:43 -06:00
Qstick 05b477e9d1 Fixed: Better sorting of releases in manual search
Fixes #1472
2023-02-26 22:54:54 -06:00
Servarr ed8a979fc6 Automated API Docs update 2023-02-26 21:27:55 -06:00
Qstick 6482509a1d New: Improved Indexer disabled popover 2023-02-26 21:18:25 -06:00
Qstick 0e82899958 New: VIP Expiration column on indexer index
Fixes #456
Fixes #797
2023-02-26 19:56:56 -06:00
Qstick 02ad2379a5 Fixed: Duplicate capabilities cause JS error 2023-02-26 19:40:17 -06:00
Qstick 1bc000e912 Improve some localization strings 2023-02-26 19:27:29 -06:00
Qstick d9f2ad0a2b New: Edit and Delete Buttons in Indexer Info modal 2023-02-26 19:24:34 -06:00
Bogdan 0e2cc7851f Fixed: Prevent ProviderRepository to deserialize to a null config contract 2023-02-27 01:59:44 +02:00
Qstick b637733f68 New: Indexer RSS Link on Index
Fixes #182
2023-02-26 17:43:50 -06:00
Qstick aaaedf1cd7 Fixed: Semi-Private labels in indexer list 2023-02-26 17:36:39 -06:00
Bogdan a8e2b1520a Fixed: Disable HealthChecks when in debug runtime 2023-02-27 00:26:36 +02:00
Qstick dbeb725cda Cleanup StringUtil 2023-02-26 15:40:03 -06:00
Bogdan 7b244b022c Fixed: (Cardigann) Add field tvmazeid 2023-02-26 23:32:50 +02:00
Bogdan fa4534dcff Fixed: (Cardigann) Use GetValueOrDefault to prevent InvalidOperation 2023-02-26 23:32:50 +02:00
Bogdan 8323d13a1d Fixed: (Nebunlance) Enable RawSearch and strip non-word chars 2023-02-26 17:52:56 +02:00
Qstick 99d315979e New: Link Indexer name to info modal
#546
2023-02-26 01:06:13 -06:00
Qstick ff16043a06 New: Add noreferrer to external links 2023-02-26 01:06:13 -06:00
Servarr 13230dc36f Automated API Docs update 2023-02-26 00:57:36 -06:00
Mark McDowall c0383ad5f5 Refactor Indexer index to use react-window
(cherry picked from commit d022679b7dcbce3cec98e6a1fd0879e3c0d92523)
2023-02-25 22:17:31 -06:00
Mark McDowall c2599ef2e7 Switch to eslint for linting
(cherry picked from commit a18c3774661f466727ab46315211aecb43ef1def)
2023-02-25 22:17:31 -06:00
Mark McDowall 2cd1679918 Add Prettier to format TypeScript files
(cherry picked from commit de56862bb97b092c5fc44359caf3b2abdbcfdf96)
2023-02-25 22:17:31 -06:00
Mark McDowall 545d47b05c Add typescript 2023-02-25 22:17:31 -06:00
Qstick 1290d68f29 Bump version to 1.3.2 2023-02-25 22:16:53 -06:00
665 changed files with 15420 additions and 7441 deletions
+1 -1
View File
@@ -258,7 +258,7 @@ dotnet_diagnostic.CA5401.severity = suggestion
dotnet_diagnostic.SYSLIB0014.severity = none dotnet_diagnostic.SYSLIB0014.severity = none
[*.{js,html,js,hbs,less,css}] [*.{js,jsx,ts,tsx,html,hbs,less,css}]
charset = utf-8 charset = utf-8
trim_trailing_whitespace = true trim_trailing_whitespace = true
insert_final_newline = true insert_final_newline = true
-9
View File
@@ -1,9 +0,0 @@
{
"paths": [
"frontend/src/**/*.js"
],
"ignored": [
"**/node_modules/**/*"
],
"port": 5004
}
+7
View File
@@ -71,3 +71,10 @@ body:
Additionally, any additional info? Screenshots? References? Anything that will give us more context about the issue you are encountering! Additionally, any additional info? Screenshots? References? Anything that will give us more context about the issue you are encountering!
validations: validations:
required: true required: true
- type: checkboxes
attributes:
label: Trace Logs have been provided as applicable. Reports may be closed if the required logs are not provided.
description: Trace logs are generally required for all bug reports
options:
- label: I have followed the steps in the wiki link above and provided the required trace logs that are relevant and show this issue.
required: true
+8 -1
View File
@@ -13,4 +13,11 @@
:wave: @{issue-author}, we use the issue tracker exclusively :wave: @{issue-author}, we use the issue tracker exclusively
for bug reports and feature requests. However, this issue appears for bug reports and feature requests. However, this issue appears
to be a indexer request. Please use our Indexer request [site](https://requests.prowlarr.com/) to be a indexer request. Please use our Indexer request [site](https://requests.prowlarr.com/)
close: true close: true
'Status: Logs Needed':
comment: >
:wave: @{issue-author}, in order to help you further we'll need to see logs.
You'll need to enable trace logging and replicate the problem that you encountered.
Guidance on how to enable trace logging can be found in
our [troubleshooting guide](https://wiki.servarr.com/prowlarr/troubleshooting#logging-and-log-files).
+2 -2
View File
@@ -18,6 +18,6 @@ jobs:
action: action:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: dessant/label-actions@v2 - uses: dessant/label-actions@v3
with: with:
process-only: 'issues, prs' process-only: 'issues, prs'
+6 -6
View File
@@ -9,13 +9,13 @@ jobs:
lock: lock:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: dessant/lock-threads@v2 - uses: dessant/lock-threads@v4
with: with:
github-token: ${{ github.token }} github-token: ${{ github.token }}
issue-lock-inactive-days: '90' issue-inactive-days: '90'
issue-exclude-created-before: '' exclude-issue-created-before: ''
issue-exclude-labels: '' exclude-any-issue-labels: ''
issue-lock-labels: '' add-issue-labels: ''
issue-lock-comment: '' issue-comment: ''
issue-lock-reason: 'resolved' issue-lock-reason: 'resolved'
process-only: '' process-only: ''
+2 -2
View File
@@ -9,13 +9,13 @@ variables:
testsFolder: './_tests' testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '1.3.1' majorVersion: '1.5.0'
minorVersion: $[counter('minorVersion', 1)] minorVersion: $[counter('minorVersion', 1)]
prowlarrVersion: '$(majorVersion).$(minorVersion)' prowlarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)' buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
sentryOrg: 'servarr' sentryOrg: 'servarr'
sentryUrl: 'https://sentry.servarr.com' sentryUrl: 'https://sentry.servarr.com'
dotnetVersion: '6.0.405' dotnetVersion: '6.0.408'
innoVersion: '6.2.0' innoVersion: '6.2.0'
nodeVersion: '16.x' nodeVersion: '16.x'
windowsImage: 'windows-2022' windowsImage: 'windows-2022'
+4 -4
View File
@@ -3,9 +3,9 @@ PLATFORM=$1
if [ "$PLATFORM" = "Windows" ]; then if [ "$PLATFORM" = "Windows" ]; then
RUNTIME="win-x64" RUNTIME="win-x64"
elif [ "$PLATFORM" = "Linux" ]; then elif [ "$PLATFORM" = "Linux" ]; then
WHERE="linux-x64" RUNTIME="linux-x64"
elif [ "$PLATFORM" = "Mac" ]; then elif [ "$PLATFORM" = "Mac" ]; then
WHERE="osx-x64" RUNTIME="osx-x64"
else else
echo "Platform must be provided as first arguement: Windows, Linux or Mac" echo "Platform must be provided as first arguement: Windows, Linux or Mac"
exit 1 exit 1
@@ -27,7 +27,7 @@ dotnet clean $slnFile -c Release
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
dotnet new tool-manifest dotnet new tool-manifest
dotnet tool install --version 6.3.0 Swashbuckle.AspNetCore.Cli dotnet tool install --version 6.5.0 Swashbuckle.AspNetCore.Cli
dotnet tool run swagger tofile --output ./src/Prowlarr.Api.V1/openapi.json "$outputFolder/net6.0/$RUNTIME/prowlarr.console.dll" v1 & dotnet tool run swagger tofile --output ./src/Prowlarr.Api.V1/openapi.json "$outputFolder/net6.0/$RUNTIME/prowlarr.console.dll" v1 &
@@ -35,4 +35,4 @@ sleep 30
kill %1 kill %1
exit 0 exit 0
+1
View File
@@ -1 +1,2 @@
**/JsLibraries/** **/JsLibraries/**
**/*.css.d.ts
+59 -6
View File
@@ -1,13 +1,16 @@
// eslint-disable @typescript-eslint/no-var-requires
const fs = require('fs'); const fs = require('fs');
const path = require('path');
const typescriptEslintRecommended = require('@typescript-eslint/eslint-plugin').configs.recommended;
const frontendFolder = __dirname;
const dirs = fs const dirs = fs
.readdirSync('frontend/src', { withFileTypes: true }) .readdirSync(path.join(frontendFolder, 'src'), { withFileTypes: true })
.filter((dirent) => dirent.isDirectory()) .filter((dirent) => dirent.isDirectory())
.map((dirent) => dirent.name) .map((dirent) => dirent.name)
.join('|'); .join('|');
const frontendFolder = __dirname;
module.exports = { module.exports = {
parser: '@babel/eslint-parser', parser: '@babel/eslint-parser',
@@ -41,7 +44,9 @@ module.exports = {
'react', 'react',
'react-hooks', 'react-hooks',
'simple-import-sort', 'simple-import-sort',
'import' 'import',
'@typescript-eslint',
'prettier'
], ],
settings: { settings: {
@@ -224,7 +229,7 @@ module.exports = {
'consistent-this': ['error', 'self'], 'consistent-this': ['error', 'self'],
'eol-last': 'error', 'eol-last': 'error',
'func-names': 'off', 'func-names': 'off',
'func-style': ['error', 'declaration'], 'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
indent: ['error', 2, { SwitchCase: 1 }], indent: ['error', 2, { SwitchCase: 1 }],
'key-spacing': ['error', { beforeColon: false, afterColon: true }], 'key-spacing': ['error', { beforeColon: false, afterColon: true }],
'keyword-spacing': ['error', { before: true, after: true }], 'keyword-spacing': ['error', { before: true, after: true }],
@@ -315,7 +320,9 @@ module.exports = {
}, },
overrides: [ overrides: [
{ {
files: ['*.js'], files: [
'*.js'
],
rules: { rules: {
'simple-import-sort/imports': [ 'simple-import-sort/imports': [
'error', 'error',
@@ -330,6 +337,52 @@ module.exports = {
} }
] ]
} }
},
{
files: [
'*.ts',
'*.tsx'
],
parser: '@typescript-eslint/parser',
parserOptions: {
project: './tsconfig.json'
},
extends: [
'prettier'
],
rules: Object.assign(typescriptEslintRecommended.rules, {
'no-shadow': 'off',
// These should be enabled after cleaning things up
'@typescript-eslint/no-unused-vars': 'warn',
'@typescript-eslint/explicit-function-return-type': 'off',
'react/prop-types': 'off',
'prettier/prettier': 'error',
'simple-import-sort/imports': [
'error',
{
groups: [
// Packages
// Absolute Paths
// Relative Paths
// Css
['^@?\\w', `^(${dirs})(/.*|$)`, '^\\.', '^\\..*css$']
]
}
]
})
},
{
files: [
'*.css.d.ts'
],
rules: {
'filenames/match-exported': 'off',
'init-declarations': 'off',
'prettier/prettier': 'off'
}
} }
] ]
}; };
+10
View File
@@ -0,0 +1,10 @@
# Ignore everything recursively
*
# But not the .ts files
!*.ts*
*css.d.ts
# Check subdirectories too
!*/
+6
View File
@@ -0,0 +1,6 @@
{
"arrowParens": "always",
"endOfLine": "auto",
"singleQuote": true,
"trailingComma": "es5"
}
+4 -2
View File
@@ -17,7 +17,8 @@ module.exports = {
env: { env: {
development: { development: {
presets: [ presets: [
['@babel/preset-react', { development: true }] ['@babel/preset-react', { development: true }],
'@babel/preset-typescript'
], ],
plugins: [ plugins: [
'babel-plugin-inline-classnames' 'babel-plugin-inline-classnames'
@@ -25,7 +26,8 @@ module.exports = {
}, },
production: { production: {
presets: [ presets: [
'@babel/preset-react' '@babel/preset-react',
'@babel/preset-typescript'
], ],
plugins: [ plugins: [
'babel-plugin-transform-react-remove-prop-types' 'babel-plugin-transform-react-remove-prop-types'
+13 -3
View File
@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const path = require('path'); const path = require('path');
const webpack = require('webpack'); const webpack = require('webpack');
const FileManagerPlugin = require('filemanager-webpack-plugin'); const FileManagerPlugin = require('filemanager-webpack-plugin');
@@ -5,6 +6,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin');
const LiveReloadPlugin = require('webpack-livereload-plugin'); const LiveReloadPlugin = require('webpack-livereload-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const TerserPlugin = require('terser-webpack-plugin'); const TerserPlugin = require('terser-webpack-plugin');
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
module.exports = (env) => { module.exports = (env) => {
const uiFolder = 'UI'; const uiFolder = 'UI';
@@ -37,13 +39,18 @@ module.exports = (env) => {
}, },
resolve: { resolve: {
extensions: [
'.ts',
'.tsx',
'.js'
],
modules: [ modules: [
srcFolder, srcFolder,
path.join(srcFolder, 'Shims'), path.join(srcFolder, 'Shims'),
'node_modules' 'node_modules'
], ],
alias: { alias: {
jquery: 'jquery/src/jquery' jquery: 'jquery/dist/jquery.min'
}, },
fallback: { fallback: {
buffer: false, buffer: false,
@@ -129,6 +136,8 @@ module.exports = (env) => {
} }
}), }),
new ForkTsCheckerWebpackPlugin(),
new LiveReloadPlugin() new LiveReloadPlugin()
], ],
@@ -142,8 +151,8 @@ module.exports = (env) => {
module: { module: {
rules: [ rules: [
{ {
test: /\.jsx?$/, test: [/\.jsx?$/, /\.tsx?$/],
exclude: /[\\/]node_modules[\\/](?!(@sentry\/browser|@sentry\/integrations|chart.js|filesize|normalize.css)[\\/])/, exclude: /[\\/]node_modules[\\/](?!(@sentry|chart\.js|filesize)[\\/])/,
use: [ use: [
{ {
loader: 'babel-loader', loader: 'babel-loader',
@@ -173,6 +182,7 @@ module.exports = (env) => {
exclude: /(node_modules|globals.css)/, exclude: /(node_modules|globals.css)/,
use: [ use: [
{ loader: MiniCssExtractPlugin.loader }, { loader: MiniCssExtractPlugin.loader },
{ loader: 'css-modules-typescript-loader' },
{ {
loader: 'css-loader', loader: 'css-loader',
options: { options: {
@@ -1,3 +1,4 @@
// eslint-disable-next-line filenames/match-exported
const loaderUtils = require('loader-utils'); const loaderUtils = require('loader-utils');
module.exports = function cssVariablesLoader(source) { module.exports = function cssVariablesLoader(source) {
+21 -2
View File
@@ -1,4 +1,23 @@
// Place your settings in this file to overwrite default and user settings. // Place your settings in this file to overwrite default and user settings.
{ {
"files.insertFinalNewline": true "files.insertFinalNewline": true,
}
"files.exclude": {
"**/node_modules": true,
"**/*.d.css": true
},
"editor.formatOnSave": false,
"editor.codeActionsOnSave": {
"source.fixAll": true
},
"typescript.preferences.quoteStyle": "single",
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact"
],
}
+2 -2
View File
@@ -4,7 +4,7 @@ import { Redirect, Route } from 'react-router-dom';
import NotFound from 'Components/NotFound'; import NotFound from 'Components/NotFound';
import Switch from 'Components/Router/Switch'; import Switch from 'Components/Router/Switch';
import HistoryConnector from 'History/HistoryConnector'; import HistoryConnector from 'History/HistoryConnector';
import IndexerIndexConnector from 'Indexer/Index/IndexerIndexConnector'; import IndexerIndex from 'Indexer/Index/IndexerIndex';
import StatsConnector from 'Indexer/Stats/StatsConnector'; import StatsConnector from 'Indexer/Stats/StatsConnector';
import SearchIndexConnector from 'Search/SearchIndexConnector'; import SearchIndexConnector from 'Search/SearchIndexConnector';
import ApplicationSettingsConnector from 'Settings/Applications/ApplicationSettingsConnector'; import ApplicationSettingsConnector from 'Settings/Applications/ApplicationSettingsConnector';
@@ -38,7 +38,7 @@ function AppRoutes(props) {
<Route <Route
exact={true} exact={true}
path="/" path="/"
component={IndexerIndexConnector} component={IndexerIndex}
/> />
{ {
+9
View File
@@ -0,0 +1,9 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'changes': string;
'maintenance': string;
'version': string;
}
export const cssExports: CssExports;
export default cssExports;
+7
View File
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'automatic': string;
}
export const cssExports: CssExports;
export default cssExports;
+5
View File
@@ -0,0 +1,5 @@
interface ModelBase {
id: number;
}
export default ModelBase;
+163
View File
@@ -0,0 +1,163 @@
import { cloneDeep } from 'lodash';
import React, { useEffect } from 'react';
import areAllSelected from 'Utilities/Table/areAllSelected';
import selectAll from 'Utilities/Table/selectAll';
import toggleSelected from 'Utilities/Table/toggleSelected';
import ModelBase from './ModelBase';
export enum SelectActionType {
Reset,
SelectAll,
UnselectAll,
ToggleSelected,
RemoveItem,
UpdateItems,
}
type SelectedState = Record<number, boolean>;
interface SelectState {
selectedState: SelectedState;
lastToggled: number | null;
allSelected: boolean;
allUnselected: boolean;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
items: any[];
}
type SelectAction =
| { type: SelectActionType.Reset }
| { type: SelectActionType.SelectAll }
| { type: SelectActionType.UnselectAll }
| {
type: SelectActionType.ToggleSelected;
id: number;
isSelected: boolean;
shiftKey: boolean;
}
| {
type: SelectActionType.RemoveItem;
id: number;
}
| {
type: SelectActionType.UpdateItems;
items: ModelBase[];
};
type Dispatch = (action: SelectAction) => void;
const initialState = {
selectedState: {},
lastToggled: null,
allSelected: false,
allUnselected: true,
items: [],
};
interface SelectProviderOptions<T extends ModelBase> {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
children: any;
items: Array<T>;
}
function getSelectedState(items: ModelBase[], existingState: SelectedState) {
return items.reduce((acc: SelectedState, item) => {
const id = item.id;
acc[id] = existingState[id] ?? false;
return acc;
}, {});
}
// TODO: Can this be reused?
const SelectContext = React.createContext<[SelectState, Dispatch] | undefined>(
cloneDeep(undefined)
);
function selectReducer(state: SelectState, action: SelectAction): SelectState {
const { items, selectedState } = state;
switch (action.type) {
case SelectActionType.Reset: {
return cloneDeep(initialState);
}
case SelectActionType.SelectAll: {
return {
items,
...selectAll(selectedState, true),
};
}
case SelectActionType.UnselectAll: {
return {
items,
...selectAll(selectedState, false),
};
}
case SelectActionType.ToggleSelected: {
const result = {
items,
...toggleSelected(
state,
items,
action.id,
action.isSelected,
action.shiftKey
),
};
return result;
}
case SelectActionType.UpdateItems: {
const nextSelectedState = getSelectedState(action.items, selectedState);
return {
...state,
...areAllSelected(nextSelectedState),
selectedState: nextSelectedState,
items: action.items,
};
}
default: {
throw new Error(`Unhandled action type: ${action.type}`);
}
}
}
export function SelectProvider<T extends ModelBase>(
props: SelectProviderOptions<T>
) {
const { items } = props;
const selectedState = getSelectedState(items, {});
const [state, dispatch] = React.useReducer(selectReducer, {
selectedState,
lastToggled: null,
allSelected: false,
allUnselected: true,
items,
});
const value: [SelectState, Dispatch] = [state, dispatch];
useEffect(() => {
dispatch({ type: SelectActionType.UpdateItems, items });
}, [items]);
return (
<SelectContext.Provider value={value}>
{props.children}
</SelectContext.Provider>
);
}
export function useSelect() {
const context = React.useContext(SelectContext);
if (context === undefined) {
throw new Error('useSelect must be used within a SelectProvider');
}
return context;
}
+11
View File
@@ -0,0 +1,11 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'alert': string;
'danger': string;
'info': string;
'success': string;
'warning': string;
}
export const cssExports: CssExports;
export default cssExports;
+5 -3
View File
@@ -4,7 +4,9 @@ import React from 'react';
import { kinds } from 'Helpers/Props'; import { kinds } from 'Helpers/Props';
import styles from './Alert.css'; import styles from './Alert.css';
function Alert({ className, kind, children, ...otherProps }) { function Alert(props) {
const { className, kind, children, ...otherProps } = props;
return ( return (
<div <div
className={classNames( className={classNames(
@@ -19,8 +21,8 @@ function Alert({ className, kind, children, ...otherProps }) {
} }
Alert.propTypes = { Alert.propTypes = {
className: PropTypes.string.isRequired, className: PropTypes.string,
kind: PropTypes.oneOf(kinds.all).isRequired, kind: PropTypes.oneOf(kinds.all),
children: PropTypes.node.isRequired children: PropTypes.node.isRequired
}; };
+9
View File
@@ -0,0 +1,9 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'card': string;
'overlay': string;
'underlay': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'descriptionList': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -17,7 +17,7 @@ class DescriptionListItem extends Component {
} = this.props; } = this.props;
return ( return (
<span> <div>
<DescriptionListItemTitle <DescriptionListItemTitle
className={titleClassName} className={titleClassName}
> >
@@ -29,7 +29,7 @@ class DescriptionListItem extends Component {
> >
{data} {data}
</DescriptionListItemDescription> </DescriptionListItemDescription>
</span> </div>
); );
} }
} }
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'description': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'title': string;
}
export const cssExports: CssExports;
export default cssExports;
+7
View File
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'dragLayer': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -25,6 +25,10 @@
white-space: pre-wrap; white-space: pre-wrap;
} }
.version {
margin-top: 20px;
}
@media only screen and (max-width: $breakpointMedium) { @media only screen and (max-width: $breakpointMedium) {
.image { .image {
height: 250px; height: 250px;
@@ -0,0 +1,12 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'container': string;
'details': string;
'image': string;
'imageContainer': string;
'message': string;
'version': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -1,60 +0,0 @@
import PropTypes from 'prop-types';
import React from 'react';
import styles from './ErrorBoundaryError.css';
function ErrorBoundaryError(props) {
const {
className,
messageClassName,
detailsClassName,
message,
error,
info
} = props;
return (
<div className={className}>
<div className={messageClassName}>
{message}
</div>
<div className={styles.imageContainer}>
<img
className={styles.image}
src={`${window.Prowlarr.urlBase}/Content/Images/error.png`}
/>
</div>
<details className={detailsClassName}>
{
error &&
<div>
{error.toString()}
</div>
}
<div className={styles.info}>
{info.componentStack}
</div>
</details>
</div>
);
}
ErrorBoundaryError.propTypes = {
className: PropTypes.string.isRequired,
messageClassName: PropTypes.string.isRequired,
detailsClassName: PropTypes.string.isRequired,
message: PropTypes.string.isRequired,
error: PropTypes.object.isRequired,
info: PropTypes.object.isRequired
};
ErrorBoundaryError.defaultProps = {
className: styles.container,
messageClassName: styles.message,
detailsClassName: styles.details,
message: 'There was an error loading this content'
};
export default ErrorBoundaryError;
@@ -0,0 +1,74 @@
import React, { useEffect, useState } from 'react';
import StackTrace from 'stacktrace-js';
import styles from './ErrorBoundaryError.css';
interface ErrorBoundaryErrorProps {
className: string;
messageClassName: string;
detailsClassName: string;
message: string;
error: Error;
info: {
componentStack: string;
};
}
function ErrorBoundaryError(props: ErrorBoundaryErrorProps) {
const {
className = styles.container,
messageClassName = styles.message,
detailsClassName = styles.details,
message = 'There was an error loading this content',
error,
info,
} = props;
const [detailedError, setDetailedError] = useState(null);
useEffect(() => {
if (error) {
StackTrace.fromError(error).then((de) => {
setDetailedError(de);
});
} else {
setDetailedError(null);
}
}, [error, setDetailedError]);
return (
<div className={className}>
<div className={messageClassName}>{message}</div>
<div className={styles.imageContainer}>
<img
className={styles.image}
src={`${window.Prowlarr.urlBase}/Content/Images/error.png`}
/>
</div>
<details className={detailsClassName}>
{error ? <div>{error.message}</div> : null}
{detailedError ? (
detailedError.map((d, index) => {
return (
<div key={index}>
{` at ${d.functionName} (${d.fileName}:${d.lineNumber}:${d.columnNumber})`}
</div>
);
})
) : (
<div>{info.componentStack}</div>
)}
{
<div className={styles.version}>
Version: {window.Prowlarr.version}
</div>
}
</details>
</div>
);
}
export default ErrorBoundaryError;
+8
View File
@@ -0,0 +1,8 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'fieldSet': string;
'legend': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'modal': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,12 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'faqLink': string;
'loading': string;
'mappedDrivesWarning': string;
'modalBody': string;
'pathInput': string;
'scroller': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -1,6 +1,5 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React, { Component } from 'react'; import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import Alert from 'Components/Alert'; import Alert from 'Components/Alert';
import PathInput from 'Components/Form/PathInput'; import PathInput from 'Components/Form/PathInput';
import Button from 'Components/Link/Button'; import Button from 'Components/Link/Button';
@@ -39,7 +38,7 @@ class FileBrowserModalContent extends Component {
constructor(props, context) { constructor(props, context) {
super(props, context); super(props, context);
this._scrollerNode = null; this._scrollerRef = React.createRef();
this.state = { this.state = {
isFileBrowserModalOpen: false, isFileBrowserModalOpen: false,
@@ -57,21 +56,10 @@ class FileBrowserModalContent extends Component {
currentPath !== prevState.currentPath currentPath !== prevState.currentPath
) { ) {
this.setState({ currentPath }); this.setState({ currentPath });
this._scrollerNode.scrollTop = 0; this._scrollerRef.current.scrollTop = 0;
} }
} }
//
// Control
setScrollerRef = (ref) => {
if (ref) {
this._scrollerNode = ReactDOM.findDOMNode(ref);
} else {
this._scrollerNode = null;
}
};
// //
// Listeners // Listeners
@@ -145,7 +133,7 @@ class FileBrowserModalContent extends Component {
/> />
<Scroller <Scroller
ref={this.setScrollerRef} ref={this._scrollerRef}
className={styles.scroller} className={styles.scroller}
scrollDirection={scrollDirections.BOTH} scrollDirection={scrollDirections.BOTH}
> >
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'type': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,9 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'container': string;
'numberInput': string;
'selectInput': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,10 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'label': string;
'labelContainer': string;
'labelInputContainer': string;
'rows': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,10 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'actionsContainer': string;
'filterRow': string;
'inputContainer': string;
'valueInputContainer': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,10 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'isLastTag': string;
'label': string;
'or': string;
'tag': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,9 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'actions': string;
'customFilter': string;
'label': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'addButtonContainer': string;
}
export const cssExports: CssExports;
export default cssExports;
+15
View File
@@ -0,0 +1,15 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'hasError': string;
'hasWarning': string;
'input': string;
'inputContainer': string;
'suggestion': string;
'suggestionHighlighted': string;
'suggestionsContainer': string;
'suggestionsContainerOpen': string;
'suggestionsList': string;
}
export const cssExports: CssExports;
export default cssExports;
+12
View File
@@ -0,0 +1,12 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'captchaInputWrapper': string;
'hasButton': string;
'hasError': string;
'hasWarning': string;
'input': string;
'recaptchaWrapper': string;
}
export const cssExports: CssExports;
export default cssExports;
+18
View File
@@ -0,0 +1,18 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'checkbox': string;
'container': string;
'dangerIsChecked': string;
'helpText': string;
'input': string;
'isDisabled': string;
'isIndeterminate': string;
'isNotChecked': string;
'label': string;
'primaryIsChecked': string;
'successIsChecked': string;
'warningIsChecked': string;
}
export const cssExports: CssExports;
export default cssExports;
+8
View File
@@ -0,0 +1,8 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'deviceInputWrapper': string;
'input': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,22 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'dropdownArrowContainer': string;
'dropdownArrowContainerDisabled': string;
'dropdownArrowContainerEditable': string;
'editableContainer': string;
'enhancedSelect': string;
'hasError': string;
'hasWarning': string;
'isDisabled': string;
'loading': string;
'mobileCloseButton': string;
'mobileCloseButtonContainer': string;
'options': string;
'optionsContainer': string;
'optionsModal': string;
'optionsModalBody': string;
'optionsModalScroller': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -12,9 +12,9 @@ import ModalBody from 'Components/Modal/ModalBody';
import Portal from 'Components/Portal'; import Portal from 'Components/Portal';
import Scroller from 'Components/Scroller/Scroller'; import Scroller from 'Components/Scroller/Scroller';
import { icons, scrollDirections, sizes } from 'Helpers/Props'; import { icons, scrollDirections, sizes } from 'Helpers/Props';
import { isMobile as isMobileUtil } from 'Utilities/browser';
import * as keyCodes from 'Utilities/Constants/keyCodes'; import * as keyCodes from 'Utilities/Constants/keyCodes';
import getUniqueElememtId from 'Utilities/getUniqueElementId'; import getUniqueElememtId from 'Utilities/getUniqueElementId';
import { isMobile as isMobileUtil } from 'Utilities/mobile';
import HintedSelectInputOption from './HintedSelectInputOption'; import HintedSelectInputOption from './HintedSelectInputOption';
import HintedSelectInputSelectedValue from './HintedSelectInputSelectedValue'; import HintedSelectInputSelectedValue from './HintedSelectInputSelectedValue';
import TextInput from './TextInput'; import TextInput from './TextInput';
@@ -113,10 +113,12 @@ class EnhancedSelectInput extends Component {
this._scheduleUpdate(); this._scheduleUpdate();
} }
if (!Array.isArray(this.props.value) && prevProps.value !== this.props.value) { if (!Array.isArray(this.props.value)) {
this.setState({ if (prevProps.value !== this.props.value || prevProps.values !== this.props.values) {
selectedIndex: getSelectedIndex(this.props) this.setState({
}); selectedIndex: getSelectedIndex(this.props)
});
}
} }
} }
@@ -332,6 +334,11 @@ class EnhancedSelectInput extends Component {
const isMultiSelect = Array.isArray(value); const isMultiSelect = Array.isArray(value);
const selectedOption = getSelectedOption(selectedIndex, values); const selectedOption = getSelectedOption(selectedIndex, values);
let selectedValue = value;
if (!values.length) {
selectedValue = isMultiSelect ? [] : '';
}
return ( return (
<div> <div>
@@ -372,15 +379,17 @@ class EnhancedSelectInput extends Component {
onPress={this.onPress} onPress={this.onPress}
> >
{ {
isFetching && isFetching ?
<LoadingIndicator <LoadingIndicator
className={styles.loading} className={styles.loading}
size={20} size={20}
/> /> :
null
} }
{ {
!isFetching && isFetching ?
null :
<Icon <Icon
name={icons.CARET_DOWN} name={icons.CARET_DOWN}
/> />
@@ -400,7 +409,7 @@ class EnhancedSelectInput extends Component {
onPress={this.onPress} onPress={this.onPress}
> >
<SelectedValueComponent <SelectedValueComponent
value={value} value={selectedValue}
values={values} values={values}
{...selectedValueOptions} {...selectedValueOptions}
{...selectedOption} {...selectedOption}
@@ -418,15 +427,17 @@ class EnhancedSelectInput extends Component {
> >
{ {
isFetching && isFetching ?
<LoadingIndicator <LoadingIndicator
className={styles.loading} className={styles.loading}
size={20} size={20}
/> /> :
null
} }
{ {
!isFetching && isFetching ?
null :
<Icon <Icon
name={icons.CARET_DOWN} name={icons.CARET_DOWN}
/> />
@@ -505,7 +516,7 @@ class EnhancedSelectInput extends Component {
</Manager> </Manager>
{ {
isMobile && isMobile ?
<Modal <Modal
className={styles.optionsModal} className={styles.optionsModal}
size={sizes.EXTRA_SMALL} size={sizes.EXTRA_SMALL}
@@ -555,7 +566,8 @@ class EnhancedSelectInput extends Component {
} }
</Scroller> </Scroller>
</ModalBody> </ModalBody>
</Modal> </Modal> :
null
} }
</div> </div>
); );
@@ -0,0 +1,14 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'iconContainer': string;
'isDisabled': string;
'isHidden': string;
'isMobile': string;
'isSelected': string;
'option': string;
'optionCheck': string;
'optionCheckInput': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,8 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'isDisabled': string;
'selectedValue': string;
}
export const cssExports: CssExports;
export default cssExports;
+7
View File
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'validationFailures': string;
}
export const cssExports: CssExports;
export default cssExports;
+9 -1
View File
@@ -4,7 +4,15 @@ import Alert from 'Components/Alert';
import { kinds } from 'Helpers/Props'; import { kinds } from 'Helpers/Props';
import styles from './Form.css'; import styles from './Form.css';
function Form({ children, validationErrors, validationWarnings, ...otherProps }) { function Form(props) {
const {
children,
validationErrors,
validationWarnings,
// eslint-disable-next-line no-unused-vars
...otherProps
} = props;
return ( return (
<div> <div>
{ {
+11
View File
@@ -0,0 +1,11 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'extraSmall': string;
'group': string;
'large': string;
'medium': string;
'small': string;
}
export const cssExports: CssExports;
export default cssExports;
+8
View File
@@ -0,0 +1,8 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'button': string;
'middleButton': string;
}
export const cssExports: CssExports;
export default cssExports;
+14
View File
@@ -0,0 +1,14 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'helpLink': string;
'inputContainer': string;
'inputGroup': string;
'inputGroupContainer': string;
'inputUnit': string;
'inputUnitNumber': string;
'pendingChangesContainer': string;
'pendingChangesIcon': string;
}
export const cssExports: CssExports;
export default cssExports;
+10 -2
View File
@@ -1,7 +1,7 @@
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import Link from 'Components/Link/Link'; import Link from 'Components/Link/Link';
import { inputTypes } from 'Helpers/Props'; import { inputTypes, kinds } from 'Helpers/Props';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
import AppProfileSelectInputConnector from './AppProfileSelectInputConnector'; import AppProfileSelectInputConnector from './AppProfileSelectInputConnector';
import AutoCompleteInput from './AutoCompleteInput'; import AutoCompleteInput from './AutoCompleteInput';
@@ -253,16 +253,24 @@ FormInputGroup.propTypes = {
className: PropTypes.string.isRequired, className: PropTypes.string.isRequired,
containerClassName: PropTypes.string.isRequired, containerClassName: PropTypes.string.isRequired,
inputClassName: PropTypes.string, inputClassName: PropTypes.string,
name: PropTypes.string.isRequired,
value: PropTypes.any,
values: PropTypes.arrayOf(PropTypes.any),
type: PropTypes.string.isRequired, type: PropTypes.string.isRequired,
kind: PropTypes.oneOf(kinds.all),
unit: PropTypes.string, unit: PropTypes.string,
buttons: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]), buttons: PropTypes.oneOfType([PropTypes.node, PropTypes.arrayOf(PropTypes.node)]),
helpText: PropTypes.string, helpText: PropTypes.string,
helpTexts: PropTypes.arrayOf(PropTypes.string), helpTexts: PropTypes.arrayOf(PropTypes.string),
helpTextWarning: PropTypes.string, helpTextWarning: PropTypes.string,
helpLink: PropTypes.string, helpLink: PropTypes.string,
includeNoChange: PropTypes.bool,
includeNoChangeDisabled: PropTypes.bool,
selectedValueOptions: PropTypes.object,
pending: PropTypes.bool, pending: PropTypes.bool,
errors: PropTypes.arrayOf(PropTypes.object), errors: PropTypes.arrayOf(PropTypes.object),
warnings: PropTypes.arrayOf(PropTypes.object) warnings: PropTypes.arrayOf(PropTypes.object),
onChange: PropTypes.func.isRequired
}; };
FormInputGroup.defaultProps = { FormInputGroup.defaultProps = {
+12
View File
@@ -0,0 +1,12 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'details': string;
'helpText': string;
'isCheckInput': string;
'isError': string;
'isWarning': string;
'link': string;
}
export const cssExports: CssExports;
export default cssExports;
+11
View File
@@ -0,0 +1,11 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'hasError': string;
'isAdvanced': string;
'label': string;
'large': string;
'small': string;
}
export const cssExports: CssExports;
export default cssExports;
+14 -12
View File
@@ -4,16 +4,18 @@ import React from 'react';
import { sizes } from 'Helpers/Props'; import { sizes } from 'Helpers/Props';
import styles from './FormLabel.css'; import styles from './FormLabel.css';
function FormLabel({ function FormLabel(props) {
children, const {
className, children,
errorClassName, className,
size, errorClassName,
name, size,
hasError, name,
isAdvanced, hasError,
...otherProps isAdvanced,
}) { ...otherProps
} = props;
return ( return (
<label <label
{...otherProps} {...otherProps}
@@ -31,13 +33,13 @@ function FormLabel({
} }
FormLabel.propTypes = { FormLabel.propTypes = {
children: PropTypes.node.isRequired, children: PropTypes.oneOfType([PropTypes.node, PropTypes.string]).isRequired,
className: PropTypes.string, className: PropTypes.string,
errorClassName: PropTypes.string, errorClassName: PropTypes.string,
size: PropTypes.oneOf(sizes.all), size: PropTypes.oneOf(sizes.all),
name: PropTypes.string, name: PropTypes.string,
hasError: PropTypes.bool, hasError: PropTypes.bool,
isAdvanced: PropTypes.bool.isRequired isAdvanced: PropTypes.bool
}; };
FormLabel.defaultProps = { FormLabel.defaultProps = {
@@ -0,0 +1,9 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'hintText': string;
'isMobile': string;
'optionText': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,9 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'hintText': string;
'selectedValue': string;
'valueText': string;
}
export const cssExports: CssExports;
export default cssExports;
+10
View File
@@ -0,0 +1,10 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'hasError': string;
'hasWarning': string;
'inputContainer': string;
'isFocused': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,11 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'buttonWrapper': string;
'inputWrapper': string;
'itemContainer': string;
'keyInput': string;
'valueInput': string;
}
export const cssExports: CssExports;
export default cssExports;
+7
View File
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'input': string;
}
export const cssExports: CssExports;
export default cssExports;
+10
View File
@@ -0,0 +1,10 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'fileBrowserButton': string;
'hasFileBrowser': string;
'inputWrapper': string;
'pathMatch': string;
}
export const cssExports: CssExports;
export default cssExports;
+10
View File
@@ -0,0 +1,10 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'hasError': string;
'hasWarning': string;
'isDisabled': string;
'select': string;
}
export const cssExports: CssExports;
export default cssExports;
+9
View File
@@ -0,0 +1,9 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'input': string;
'internalInput': string;
'isFocused': string;
}
export const cssExports: CssExports;
export default cssExports;
+7
View File
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'inputContainer': string;
}
export const cssExports: CssExports;
export default cssExports;
+7
View File
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'tag': string;
}
export const cssExports: CssExports;
export default cssExports;
+10
View File
@@ -0,0 +1,10 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'hasError': string;
'hasWarning': string;
'input': string;
'readOnly': string;
}
export const cssExports: CssExports;
export default cssExports;
+11
View File
@@ -0,0 +1,11 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'hasButton': string;
'hasError': string;
'hasWarning': string;
'input': string;
'readOnly': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -112,6 +112,12 @@ class TextInput extends Component {
this._isMouseTarget = false; this._isMouseTarget = false;
}; };
onWheel = () => {
if (this.props.type === 'number') {
this._input.blur();
}
};
// //
// Render // Render
@@ -161,6 +167,7 @@ class TextInput extends Component {
onKeyUp={this.onKeyUp} onKeyUp={this.onKeyUp}
onMouseDown={this.onMouseDown} onMouseDown={this.onMouseDown}
onMouseUp={this.onMouseUp} onMouseUp={this.onMouseUp}
onWheel={this.onWheel}
/> />
); );
} }
+13
View File
@@ -0,0 +1,13 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'danger': string;
'default': string;
'disabled': string;
'info': string;
'purple': string;
'success': string;
'warning': string;
}
export const cssExports: CssExports;
export default cssExports;
+19
View File
@@ -0,0 +1,19 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'danger': string;
'default': string;
'disabled': string;
'info': string;
'inverse': string;
'label': string;
'large': string;
'medium': string;
'outline': string;
'primary': string;
'small': string;
'success': string;
'warning': string;
}
export const cssExports: CssExports;
export default cssExports;
+1
View File
@@ -31,6 +31,7 @@ function Label(props) {
Label.propTypes = { Label.propTypes = {
className: PropTypes.string.isRequired, className: PropTypes.string.isRequired,
title: PropTypes.string,
kind: PropTypes.oneOf(kinds.all).isRequired, kind: PropTypes.oneOf(kinds.all).isRequired,
size: PropTypes.oneOf(sizes.all).isRequired, size: PropTypes.oneOf(sizes.all).isRequired,
outline: PropTypes.bool.isRequired, outline: PropTypes.bool.isRequired,
+18
View File
@@ -0,0 +1,18 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'button': string;
'center': string;
'danger': string;
'default': string;
'large': string;
'left': string;
'medium': string;
'primary': string;
'right': string;
'small': string;
'success': string;
'warning': string;
}
export const cssExports: CssExports;
export default cssExports;
+10
View File
@@ -0,0 +1,10 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'button': string;
'clipboardIconContainer': string;
'showStateIcon': string;
'stateIconContainer': string;
}
export const cssExports: CssExports;
export default cssExports;
+8
View File
@@ -0,0 +1,8 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'button': string;
'isDisabled': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -23,6 +23,7 @@ function IconButton(props) {
className, className,
isDisabled && styles.isDisabled isDisabled && styles.isDisabled
)} )}
aria-label="Table Options Button"
isDisabled={isDisabled} isDisabled={isDisabled}
{...otherProps} {...otherProps}
> >
@@ -38,11 +39,13 @@ function IconButton(props) {
} }
IconButton.propTypes = { IconButton.propTypes = {
...Link.propTypes,
className: PropTypes.string.isRequired, className: PropTypes.string.isRequired,
iconClassName: PropTypes.string, iconClassName: PropTypes.string,
kind: PropTypes.string, kind: PropTypes.string,
name: PropTypes.object.isRequired, name: PropTypes.object.isRequired,
size: PropTypes.number, size: PropTypes.number,
title: PropTypes.string,
isSpinning: PropTypes.bool, isSpinning: PropTypes.bool,
isDisabled: PropTypes.bool isDisabled: PropTypes.bool
}; };
+8
View File
@@ -0,0 +1,8 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'link': string;
'to': string;
}
export const cssExports: CssExports;
export default cssExports;
+1
View File
@@ -43,6 +43,7 @@ class Link extends Component {
el = 'a'; el = 'a';
linkProps.href = to; linkProps.href = to;
linkProps.target = target || '_blank'; linkProps.target = target || '_blank';
linkProps.rel = 'noreferrer';
} else if (noRouter) { } else if (noRouter) {
el = 'a'; el = 'a';
linkProps.href = to; linkProps.href = to;
+11
View File
@@ -0,0 +1,11 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'button': string;
'isSpinning': string;
'label': string;
'spinner': string;
'spinnerContainer': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -42,6 +42,7 @@ function SpinnerButton(props) {
} }
SpinnerButton.propTypes = { SpinnerButton.propTypes = {
...Button.Props,
className: PropTypes.string.isRequired, className: PropTypes.string.isRequired,
isSpinning: PropTypes.bool.isRequired, isSpinning: PropTypes.bool.isRequired,
isDisabled: PropTypes.bool, isDisabled: PropTypes.bool,
@@ -0,0 +1,10 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'icon': string;
'iconContainer': string;
'label': string;
'showIcon': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -23,6 +23,8 @@ function SpinnerIconButton(props) {
} }
SpinnerIconButton.propTypes = { SpinnerIconButton.propTypes = {
...IconButton.propTypes,
className: PropTypes.string,
name: PropTypes.object.isRequired, name: PropTypes.object.isRequired,
spinningName: PropTypes.object.isRequired, spinningName: PropTypes.object.isRequired,
isDisabled: PropTypes.bool.isRequired, isDisabled: PropTypes.bool.isRequired,
@@ -0,0 +1,9 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'loading': string;
'ripple': string;
'rippleContainer': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'loadingMessage': string;
}
export const cssExports: CssExports;
export default cssExports;
+7
View File
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'filterMenu': string;
}
export const cssExports: CssExports;
export default cssExports;
+7
View File
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'menu': string;
}
export const cssExports: CssExports;
export default cssExports;
+8
View File
@@ -0,0 +1,8 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'isDisabled': string;
'menuButton': string;
}
export const cssExports: CssExports;
export default cssExports;
+8
View File
@@ -0,0 +1,8 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'menuContent': string;
'scroller': string;
}
export const cssExports: CssExports;
export default cssExports;
+8
View File
@@ -0,0 +1,8 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'isDisabled': string;
'menuItem': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,7 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'separator': string;
}
export const cssExports: CssExports;
export default cssExports;
@@ -0,0 +1,9 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'isNotSelected': string;
'isSelected': string;
'item': string;
}
export const cssExports: CssExports;
export default cssExports;
+3 -2
View File
@@ -2,7 +2,7 @@ import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import Menu from 'Components/Menu/Menu'; import Menu from 'Components/Menu/Menu';
import ToolbarMenuButton from 'Components/Menu/ToolbarMenuButton'; import ToolbarMenuButton from 'Components/Menu/ToolbarMenuButton';
import { icons } from 'Helpers/Props'; import { align, icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
function SortMenu(props) { function SortMenu(props) {
@@ -31,7 +31,8 @@ function SortMenu(props) {
SortMenu.propTypes = { SortMenu.propTypes = {
className: PropTypes.string, className: PropTypes.string,
children: PropTypes.node.isRequired, children: PropTypes.node.isRequired,
isDisabled: PropTypes.bool.isRequired isDisabled: PropTypes.bool.isRequired,
alignMenu: PropTypes.oneOf([align.LEFT, align.RIGHT])
}; };
SortMenu.defaultProps = { SortMenu.defaultProps = {
@@ -27,6 +27,7 @@ SortMenuItem.propTypes = {
name: PropTypes.string, name: PropTypes.string,
sortKey: PropTypes.string, sortKey: PropTypes.string,
sortDirection: PropTypes.oneOf(sortDirections.all), sortDirection: PropTypes.oneOf(sortDirections.all),
children: PropTypes.oneOfType([PropTypes.string, PropTypes.element]).isRequired,
onPress: PropTypes.func.isRequired onPress: PropTypes.func.isRequired
}; };
+10
View File
@@ -0,0 +1,10 @@
// This file is automatically generated.
// Please do not change this file!
interface CssExports {
'indicatorContainer': string;
'label': string;
'labelContainer': string;
'menuButton': string;
}
export const cssExports: CssExports;
export default cssExports;
+3 -2
View File
@@ -2,7 +2,7 @@ import PropTypes from 'prop-types';
import React from 'react'; import React from 'react';
import Menu from 'Components/Menu/Menu'; import Menu from 'Components/Menu/Menu';
import ToolbarMenuButton from 'Components/Menu/ToolbarMenuButton'; import ToolbarMenuButton from 'Components/Menu/ToolbarMenuButton';
import { icons } from 'Helpers/Props'; import { align, icons } from 'Helpers/Props';
import translate from 'Utilities/String/translate'; import translate from 'Utilities/String/translate';
function ViewMenu(props) { function ViewMenu(props) {
@@ -28,7 +28,8 @@ function ViewMenu(props) {
ViewMenu.propTypes = { ViewMenu.propTypes = {
children: PropTypes.node.isRequired, children: PropTypes.node.isRequired,
isDisabled: PropTypes.bool.isRequired isDisabled: PropTypes.bool.isRequired,
alignMenu: PropTypes.oneOf([align.LEFT, align.RIGHT])
}; };
ViewMenu.defaultProps = { ViewMenu.defaultProps = {

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