Compare commits

...

86 Commits

Author SHA1 Message Date
Qstick
edc522e412 Remove Non-Failing Rules
(cherry picked from commit e8b862a38059da4fcb5ab1ab51cf838fe5424f47)
2023-03-16 00:33:19 +00:00
santschi
d77aa82961 Fix: Stop ImageUrl from being overwritten 2023-03-12 16:45:44 -05:00
cicomalieran
c7a4060c4c Fixed: Processing very long ETA from Transmission
(cherry picked from commit 9800bd6b439257e73e3545e125cd03900a3036bb)
2023-03-12 16:13:18 -05:00
Qstick
64e6f98683 Bump version to 0.1.5 2023-02-25 20:58:09 -06:00
Qstick
dcc2a14c60 Only send monitored edition in webhook payload. 2023-02-25 13:08:13 -06:00
Qstick
22781b62e6 New: Add Editions to Webhook Payloads 2023-02-25 12:51:23 -06:00
Qstick
d93329a3fd Fixed: Installer hangs during service removal
Fixes #2223
2023-02-25 10:30:22 -06:00
Qstick
ef20abba7a New: Additional custom filter predicates for strings
(cherry picked from commit 6082253166b67d59d7907d83c362116d47bcdaeb)
2023-02-25 10:15:54 -06:00
Qstick
d647b47e88 New: Add GoodreadsId to book object in webhook events 2023-02-22 22:19:36 -06:00
Qstick
e22f284a14 New: Differentiate webhook delete event types 2023-02-22 22:19:16 -06:00
Qstick
7ac8b5600e Bump version to 0.1.4 2023-02-12 21:28:25 -06:00
Qstick
5039ba823c Make migration 027 Postgres friendly 2023-02-11 14:39:59 -06:00
Weblate
427176d7d2 Translated using Weblate (Greek) [skip ci]
Currently translated at 100.0% (901 of 901 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 100.0% (901 of 901 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 75.4% (680 of 901 strings)

Co-authored-by: KevoM <lilmarsu@gmail.com>
Co-authored-by: Qstick <qstick@gmail.com>
Co-authored-by: Vasilis Ieropoulos <kirav96@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fr/
Translation: Servarr/Readarr
2023-02-11 11:35:54 -06:00
Mark McDowall
6a2fd3a4e6 Fixed: Creating new Delay Profile
(cherry picked from commit 81435dabc7a46e82c34101b4a8fe9120c875d913)
2023-02-11 11:31:18 -06:00
Qstick
e03390c8d4 Delete azuresync.yml 2023-02-11 10:37:00 -06:00
Qstick
4081f3efc2 Fixed: Settings fail to save for some auth setups
(cherry picked from commit a379d0c403449b2623f84aa6851c850971528ff8)
2023-02-07 20:28:34 -06:00
Qstick
9cec9ac428 Fixed: Remove old OMG implementation and Rarbg
Fixes #1809
Fixes #1102
Closes #2169
2023-02-05 11:05:05 -06:00
Weblate
8bd7194121 Translated using Weblate (Portuguese (Brazil)) [skip ci]
Currently translated at 100.0% (901 of 901 strings)

Translated using Weblate (Ukrainian) [skip ci]

Currently translated at 66.2% (590 of 890 strings)

Translated using Weblate (Slovak) [skip ci]

Currently translated at 14.8% (132 of 890 strings)

Translated using Weblate (Norwegian Bokmål) [skip ci]

Currently translated at 15.0% (134 of 890 strings)

Translated using Weblate (Catalan) [skip ci]

Currently translated at 67.0% (597 of 890 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]

Currently translated at 99.8% (889 of 890 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (890 of 890 strings)

Translated using Weblate (Portuguese) [skip ci]

Currently translated at 76.8% (684 of 890 strings)

Translated using Weblate (Vietnamese) [skip ci]

Currently translated at 61.9% (551 of 890 strings)

Translated using Weblate (Turkish) [skip ci]

Currently translated at 62.0% (552 of 890 strings)

Translated using Weblate (Thai) [skip ci]

Currently translated at 61.9% (551 of 890 strings)

Translated using Weblate (Swedish) [skip ci]

Currently translated at 88.9% (792 of 890 strings)

Translated using Weblate (Russian) [skip ci]

Currently translated at 67.4% (600 of 890 strings)

Translated using Weblate (Romanian) [skip ci]

Currently translated at 60.3% (537 of 890 strings)

Translated using Weblate (Polish) [skip ci]

Currently translated at 65.7% (585 of 890 strings)

Translated using Weblate (Korean) [skip ci]

Currently translated at 62.1% (553 of 890 strings)

Translated using Weblate (Japanese) [skip ci]

Currently translated at 61.9% (551 of 890 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 73.3% (653 of 890 strings)

Translated using Weblate (Icelandic) [skip ci]

Currently translated at 61.9% (551 of 890 strings)

Translated using Weblate (Hungarian) [skip ci]

Currently translated at 99.8% (889 of 890 strings)

Translated using Weblate (Hindi) [skip ci]

Currently translated at 61.9% (551 of 890 strings)

Translated using Weblate (Hebrew) [skip ci]

Currently translated at 63.7% (567 of 890 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 75.9% (676 of 890 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 89.3% (795 of 890 strings)

Translated using Weblate (German) [skip ci]

Currently translated at 99.8% (889 of 890 strings)

Translated using Weblate (Danish) [skip ci]

Currently translated at 62.3% (555 of 890 strings)

Translated using Weblate (Czech) [skip ci]

Currently translated at 62.0% (552 of 890 strings)

Translated using Weblate (Bulgarian) [skip ci]

Currently translated at 61.9% (551 of 890 strings)

Translated using Weblate (Arabic) [skip ci]

Currently translated at 62.0% (552 of 890 strings)

Translated using Weblate (Spanish) [skip ci]

Currently translated at 67.1% (598 of 890 strings)

Translated using Weblate (Dutch) [skip ci]

Currently translated at 67.4% (600 of 890 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 100.0% (890 of 890 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 100.0% (890 of 890 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 66.0% (588 of 890 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 66.0% (588 of 890 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (884 of 884 strings)

Translated using Weblate (Danish) [skip ci]

Currently translated at 62.2% (550 of 884 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 64.0% (564 of 881 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 89.2% (786 of 881 strings)

Translated using Weblate (Ukrainian) [skip ci]

Currently translated at 65.9% (581 of 881 strings)

Translated using Weblate (Slovak) [skip ci]

Currently translated at 14.7% (130 of 881 strings)

Translated using Weblate (Norwegian Bokmål) [skip ci]

Currently translated at 15.0% (133 of 881 strings)

Translated using Weblate (Catalan) [skip ci]

Currently translated at 67.0% (591 of 881 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Portuguese) [skip ci]

Currently translated at 76.9% (678 of 881 strings)

Translated using Weblate (Vietnamese) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Turkish) [skip ci]

Currently translated at 62.4% (550 of 881 strings)

Translated using Weblate (Thai) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Swedish) [skip ci]

Currently translated at 89.6% (790 of 881 strings)

Translated using Weblate (Russian) [skip ci]

Currently translated at 67.1% (592 of 881 strings)

Translated using Weblate (Romanian) [skip ci]

Currently translated at 60.7% (535 of 881 strings)

Translated using Weblate (Polish) [skip ci]

Currently translated at 65.8% (580 of 881 strings)

Translated using Weblate (Korean) [skip ci]

Currently translated at 62.5% (551 of 881 strings)

Translated using Weblate (Japanese) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 73.4% (647 of 881 strings)

Translated using Weblate (Icelandic) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Hindi) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Hebrew) [skip ci]

Currently translated at 63.7% (562 of 881 strings)

Translated using Weblate (French) [skip ci]

Currently translated at 76.1% (671 of 881 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 88.6% (781 of 881 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 63.1% (556 of 881 strings)

Translated using Weblate (Danish) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Czech) [skip ci]

Currently translated at 62.4% (550 of 881 strings)

Translated using Weblate (Bulgarian) [skip ci]

Currently translated at 62.3% (549 of 881 strings)

Translated using Weblate (Arabic) [skip ci]

Currently translated at 62.4% (550 of 881 strings)

Translated using Weblate (Spanish) [skip ci]

Currently translated at 67.1% (592 of 881 strings)

Translated using Weblate (Dutch) [skip ci]

Currently translated at 67.5% (595 of 881 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]

Currently translated at 99.8% (880 of 881 strings)

Co-authored-by: Anonymous <noreply@weblate.org>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Vasilis Ieropoulos <kirav96@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: hhjuhl <hans@kopula.dk>
Co-authored-by: zhuzhe1983 <zhuzhe1983@gmail.com>
Co-authored-by: 無情天 <kofzhanganguo@126.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ar/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/bg/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ca/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/cs/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/da/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/es/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/he/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/hi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/is/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ja/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ko/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/nb_NO/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ro/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/sk/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/sv/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/th/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/tr/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/uk/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/vi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translation: Servarr/Readarr
2023-02-05 10:52:58 -06:00
Qstick
8c97df1be6 Fixed: Book status always green on Book Index page 2023-02-04 23:23:24 -06:00
Qstick
d556b77f9d Fixed: Readarr to Readarr import list adds random results 2023-02-04 22:25:44 -06:00
Mark McDowall
8b9cada59e Don't return early after re-running checks after startup grace period
Closes #1600

(cherry picked from commit 06464d720c0d31c22865629062d6da0911d2a01f)
2023-02-04 21:28:45 -06:00
Mark McDowall
a18bbeee5a Fixed: Delay health check notifications on startup
Closes #1598

(cherry picked from commit 07f0db477a91b39c1f4b884775c08a55ada487cf)
2023-02-04 21:28:45 -06:00
Qstick
6f17057f31 Fixed: Queue conflicts with the same download in multiple clients
Closes #1220
2023-02-04 21:28:45 -06:00
Qstick
4d3e83ec15 Fixed: Download client name in history details
Closes #1413
2023-02-04 21:28:45 -06:00
Zack Eckersley Pallett
4034250a33 New: Add backup size information
Closes #1533
2023-02-04 21:28:45 -06:00
Qstick
d83c02fe9f New: Notifiarr and Webhook Updates 2023-02-04 19:30:54 -06:00
Qstick
b4112dc4bb Fixed: Correctly handle Content-Encoding headers 2023-02-04 19:30:54 -06:00
Mark McDowall
a463166bb6 Fixed: Clearing logs not updating UI once complete
Closes #1566

(cherry picked from commit 56b3acddc9f50f59c78c03ca072fe802752b88a7)
2023-02-04 19:30:54 -06:00
Qstick
d7d57f0162 Updated some JS dependencies
Closes #2083
2023-02-04 19:30:54 -06:00
Qstick
8258323307 Add Volta node config
Closes #1848
Closes #1849
Closes #1935
2023-02-04 19:30:54 -06:00
Qstick
d15c42957a New: Add import date to upgrads in CustomScript and Webhook connections
Closes #1827
2023-02-04 19:30:54 -06:00
Qstick
df0a5f004d Fixed: Improve moving file to location where another one exists
Closes #1762
2023-02-04 19:30:54 -06:00
Qstick
d8f11bc3cb Replace unicode brackets 2023-02-04 19:30:54 -06:00
Qstick
71c2b1aeec Fixed: Migrating case-sensitive Preferred Word REGEX to Custom Formats
Closes #2162
2023-02-04 19:30:54 -06:00
Mark McDowall
6f7c6721db Fixed: Ping endpoint no longer requires authentication
(cherry picked from commit ad42d4a14c814d5911dafb5e78e97ec09b4b13a5)
2023-02-04 18:15:15 -06:00
Mark McDowall
388fb52644 Fixed cutoff unmet integration tests
Closes #1692

(cherry picked from commit c1e5b7f642d03414f7c5587d4db377ef979f2067)
2023-02-03 21:11:54 -06:00
Qstick
de46816cdb Fixed: Cutoff Unmet showing items above lowest accepted quality when upgrades are disabled
Closes #1688
2023-02-03 21:11:54 -06:00
Qstick
dbb6ef7664 New: Custom Formats
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2023-02-03 21:11:54 -06:00
Qstick
4a3062deae Bump version to 0.1.3 2023-02-03 20:50:27 -06:00
Qstick
bc7bf6b269 Fixed: Ignore deleted books won't save
Fixes #1505
2023-02-02 22:11:58 -06:00
Qstick
01b4ee1a02 Fixed: Search selected searches all
Fixes #2155
2023-02-02 21:35:01 -06:00
Qstick
3825ecd393 Fixed: Manual Import Reprocessing 2023-01-24 11:51:34 -06:00
Qstick
bc63587428 New: Add support for Simplepush notifications
Closes #1989
Closes #1990

Co-Authored-By: Timm Schäuble <Timm.Schaeuble@gmail.com>
(cherry picked from commit 4c7df31070fbd370b26dbcc07131f21eb88d35fc)
2023-01-24 11:51:34 -06:00
Qstick
1caa49c895 Update UI Packages
Align with Lidarr
2023-01-24 11:51:34 -06:00
Qstick
fbdc9f3a13 New: OnApplicationUpdate Notifications
Fixes #1422

(cherry picked from commit 9e175e28efcfc6ac3e414649b955a10fb0e951e7)
2023-01-24 11:51:34 -06:00
Qstick
f5847e9e5b New: Show previously installed version in Updates UI
Closes #308
Closes #309
Closes #313
Closes #319
Closes #460
Closes #608

Co-Authored-By: Taloth <Taloth@users.noreply.github.com>
2023-01-24 11:51:34 -06:00
Qstick
874b4fc401 New: Ignore #recycle folders (Synology Recycle bin folder)
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-01-24 11:51:34 -06:00
Qstick
ec75aa6378 Bump Npgsql to 6.0.8 2023-01-23 21:37:27 -06:00
Qstick
31aaec4b10 Don't block task queue for queued update task when long running tasks queued
Fixes #1818

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-01-23 21:28:05 -06:00
Qstick
6199cb2999 Fixed: Schedule refresh and process monitored download tasks at high priority
Fixes #1542
Fixes #1553
Fixes #1537
2023-01-23 21:27:36 -06:00
Qstick
adb22868b6 New: Description for indexer RSS setting
Fixes #2098
2023-01-23 21:21:22 -06:00
Qstick
20cf7c1ffc Fix RootFolder logs in DiskScanService 2023-01-23 21:17:35 -06:00
Mark McDowall
13fd31b67d New: Improved messaging when qBittorrent fails due to host header rejection
Closes #2099
Closes #2100

(cherry picked from commit 48b4cc5f3ffa0cb8eea6748db9091267216cef4f)
2023-01-23 21:14:35 -06:00
Zak Saunders
95dbfb6e4a Fixed: Progress bar text colour in Dark theme
Closes #2091

(cherry picked from commit ca61efa57fc04a7f6753aedb4b8044d17e345429)
2023-01-23 21:13:18 -06:00
Qstick
31c8092960 New: Author name first character renaming token
Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-01-23 21:11:04 -06:00
Qstick
06fbd5f93d New: Reset Quality Definitions to default
Closes #1719

(cherry picked from commit d5fff15f32fdb49768dcadd94c760678e650c884)
2023-01-23 21:04:51 -06:00
Qstick
44c37b3f47 Update DeploymentInfoProvider.cs 2023-01-23 21:02:07 -06:00
Qstick
5726df841c Fixed: Logging when series folder is moved successfully
Closes #1764

Co-Authored-By: David Newhall <2402929+davidnewhall@users.noreply.github.com>
2023-01-23 20:42:11 -06:00
Alan Collins
590b203bb6 Adjusted the Windows LongPath support check for valid segment lengths
Closes #1512

(cherry picked from commit 52c6bc5549ab998ccc018d138c55f8f924eed6d3)
2023-01-23 20:40:03 -06:00
Qstick
9982df9d2b Bump Sentry to 3.25.0
Closes #1978
2023-01-23 20:37:47 -06:00
Qstick
d1741c8b75 API Updates
Fixes #2011
Fixes #1376
Fixes #1379

Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>
2023-01-23 20:33:02 -06:00
Mark McDowall
20a477f95d Fixed: Only log /proc/mounts exception once per process
Closes #2080

(cherry picked from commit ce0388ca99b7f89bd9e8971777a7995c4361d268)
2023-01-23 20:28:27 -06:00
Qstick
e346eb6c64 Update coverlet.runsettings 2023-01-23 20:27:01 -06:00
Lewis England
49710b8863 fix: add end date to calendar events 2023-01-23 20:24:56 -06:00
Qstick
2699f7c0d7 Fixed: Use route Id for PUT requests if not passed in body
Closes #1994
2023-01-23 20:16:38 -06:00
Zak Saunders
ed1b29f8e4 New: Auto theme option to match OS theme
Closes #2022

Co-authored-by: Qstick <qstick@gmail.com>
(cherry picked from commit 4ca5a213fa0fc29ed93e7e31b080728d6fa7f1f3)
2023-01-23 20:15:38 -06:00
Mark McDowall
8a4d309d57 New: IPv6 support for connections/indexers/download clients
Closes #2026

(cherry picked from commit 1b90fbcf7df2c1086da4791c6491771924b1b7aa)
2023-01-23 20:12:49 -06:00
Mark McDowall
7dc061cc8a Fixed: Improve Bind Address validation and help text
Closes #2025

(cherry picked from commit 6bdeafcf8c78e145595f52e885356be1210abe91)
2023-01-23 20:12:49 -06:00
Qstick
cef06d11a5 Bump Newtonsoft to 13.0.2 2023-01-23 20:12:49 -06:00
bakerboy448
9235ae85bc Fixed: Improve RarBG Error Handling
Closes #1883
Closes #1884

(cherry picked from commit 7cd38bba841659a595fe4a0e14c478fc4e4047b1)
2023-01-23 20:12:33 -06:00
Mark McDowall
b123952010 Fixed: Grab/remove queue actions not showing spinner
Closes #2002

(cherry picked from commit 51b1ba13c1b9dc9e26469c728e3871d4b7da0788)
2023-01-23 20:11:29 -06:00
Qstick
e62d00103d Simplify X-Forwarded-For handling
This happens in asp.net middleware now

Closes #2033
Closes #2034

(cherry picked from commit 16e2d130e6a2e7239bcfe92187a7f990f93eff00)
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2023-01-23 20:11:29 -06:00
Qstick
13dad33e31 New: Improve IPAddress.IsLocal method
Closes #2032

(cherry picked from commit fd98a179ab6fed8037c99344b34593aac24a0ac0)
Co-Authored-By: ta264 <ta264@users.noreply.github.com>
2023-01-23 20:11:12 -06:00
Qstick
be8e50a41f Fixed: Avoid Sqlite Error when all profiles have lowest quality cutoff
Closes #2147
Fixes #1911

(cherry picked from commit f05e109b50cca496e7b42e2833eff161a43e12f4)
2023-01-22 23:14:27 -06:00
Zak Saunders
6e38df366f New: Darkmode
* New: Native Theme Engine

Co-Authored-By: Zak Saunders <thezak48@users.noreply.github.com>
(cherry picked from commit 2291f3e00eb2ff9268a0b2f49da8dde82ee13c04)

* Update CSS for themes

* Fixup CSS values

* Fixup remove duped Color-Impaired setting

* Fixup Link Colors

Co-Authored-By: Qstick <qstick@gmail.com>
2023-01-21 18:18:48 -06:00
PearsonFlyer
91b8565629 Fix notifiation in Ntfy on test from Radarr to Readarr (#2141) 2023-01-21 17:35:49 -06:00
Qstick
7d02c00ca8 Bump version to 0.1.2 2023-01-21 13:45:45 -06:00
Qstick
b83ccc19b0 Bump MonoTorrent to 2.0.7 2023-01-21 13:41:04 -06:00
Mark McDowall
93086abf58 Fixed: Multiple pushed releases will be processed sequentially
(cherry picked from commit 1f8e1cf582f59fe1e8dcc0fad15afeed6d9cd9d1)
2023-01-21 13:39:06 -06:00
Qstick
f68dc04273 Fixed: RemotePathMappingCheck Improvements 2023-01-21 13:25:12 -06:00
Qstick
5664054f95 Fixed: DownloadClientRootFolderCheck Improvements 2023-01-21 13:25:11 -06:00
Qstick
f16bd435db Fixed: Catch InvalidDataException during initial config to prevent boot loop
[Common]
2023-01-21 13:25:11 -06:00
Qstick
2bde9d13dd Fixed: Restore old Sqlite version compatibility 2023-01-16 19:46:15 -06:00
ta264
f448481460 New: Respect 429 Retry-After responses from BookInfo 2023-01-13 13:07:21 +00:00
ta264
70856c217c Fixed: Adding book by edition id 2023-01-13 13:07:21 +00:00
Weblate
4db158e0c9 Translated using Weblate (Swedish) [skip ci]
Currently translated at 89.5% (789 of 881 strings)

Translated using Weblate (Dutch) [skip ci]

Currently translated at 66.9% (590 of 881 strings)

Translated using Weblate (Ukrainian) [skip ci]

Currently translated at 53.0% (467 of 881 strings)

Translated using Weblate (Russian) [skip ci]

Currently translated at 66.8% (589 of 881 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 72.4% (638 of 881 strings)

Translated using Weblate (Greek) [skip ci]

Currently translated at 62.6% (552 of 881 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Ukrainian) [skip ci]

Currently translated at 50.3% (444 of 881 strings)

Translated using Weblate (Chinese (Simplified) (zh_CN)) [skip ci]

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Bengali) [skip ci]

Currently translated at 0.2% (2 of 881 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 85.9% (757 of 881 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (German) [skip ci]

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 72.4% (638 of 881 strings)

Translated using Weblate (Finnish) [skip ci]

Currently translated at 80.0% (705 of 881 strings)

Translated using Weblate (German) [skip ci]

Currently translated at 99.7% (879 of 881 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 70.8% (624 of 881 strings)

Translated using Weblate (Italian) [skip ci]

Currently translated at 70.0% (617 of 881 strings)

Translated using Weblate (Russian) [skip ci]

Currently translated at 66.6% (587 of 881 strings)

Translated using Weblate (Hungarian) [skip ci]

Currently translated at 100.0% (881 of 881 strings)

Translated using Weblate (Dutch) [skip ci]

Currently translated at 66.0% (582 of 881 strings)

Translated using Weblate (Portuguese (Brazil)) [skip ci]

Currently translated at 100.0% (881 of 881 strings)

Co-authored-by: AlexR-sf <omg.portal.supp@gmail.com>
Co-authored-by: Anthony Veaudry <anthonyveaudry@gmail.com>
Co-authored-by: Casselluu <jack10193@163.com>
Co-authored-by: Csaba <csab0825@gmail.com>
Co-authored-by: Davide Palma <github@davidepalma.it>
Co-authored-by: Havok Dan <havokdan@yahoo.com.br>
Co-authored-by: Iagocds <cdsiago@gmail.com>
Co-authored-by: Luc Timmerman <timmerman.luc1999@gmail.com>
Co-authored-by: Mipiaceanutella <remix-polity-0l@icloud.com>
Co-authored-by: Oskari Lavinto <olavinto@protonmail.com>
Co-authored-by: Robin Flikkema <robin@robinflikkema.nl>
Co-authored-by: Tanreon <tanreon@outlook.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: andrey4korop <andrey999@i.ua>
Co-authored-by: benniblot <ben2004engler@gmail.com>
Co-authored-by: deepserket <deepserket@gmail.com>
Co-authored-by: hidaba <nag@hidaba.com>
Co-authored-by: lhquark <lhquark@gmail.com>
Co-authored-by: oskhel <oskar.hellgren@gmail.com>
Co-authored-by: qing zhang <fzeehom@126.com>
Co-authored-by: reloxx <reloxx@interia.pl>
Co-authored-by: saambd <me@salimrahman.com>
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/bn/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/de/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/el/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/fi/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/hu/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/it/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/nl/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/pt_BR/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/ru/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/sv/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/uk/
Translate-URL: https://translate.servarr.com/projects/servarr/readarr/zh_CN/
Translation: Servarr/Readarr
2023-01-10 22:22:38 -06:00
863 changed files with 16166 additions and 6987 deletions

View File

@@ -204,9 +204,6 @@ 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

View File

@@ -1,41 +0,0 @@
name: Sync issue to Azure DevOps work item
on:
issues:
types:
[opened, edited, deleted, closed, reopened, labeled, unlabeled, assigned]
concurrency: azuresync-${{ github.event.issue.number }}
jobs:
alert:
runs-on: ubuntu-latest
steps:
- uses: danhellem/github-actions-issue-to-work-item@master
if: "${{ contains(github.event.issue.labels.*.name, 'Type: Bug') == true }}"
env:
ado_token: "${{ secrets.ADO_PERSONAL_ACCESS_TOKEN }}"
github_token: "${{ github.token }}"
ado_organization: "Servarr"
ado_project: "Servarr"
ado_area_path: "Servarr\\Readarr"
ado_wit: "Bug"
ado_new_state: "New"
ado_active_state: "Active"
ado_close_state: "Closed"
ado_bypassrules: true
log_level: 100
- uses: danhellem/github-actions-issue-to-work-item@master
if: "${{ contains(github.event.issue.labels.*.name, 'Type: Bug') == false }}"
env:
ado_token: "${{ secrets.ADO_PERSONAL_ACCESS_TOKEN }}"
github_token: "${{ github.token }}"
ado_organization: "Servarr"
ado_project: "Servarr"
ado_area_path: "Servarr\\Readarr"
ado_wit: "User Story"
ado_new_state: "New"
ado_active_state: "Active"
ado_close_state: "Closed"
ado_bypassrules: true
log_level: 100

View File

@@ -9,7 +9,7 @@ variables:
testsFolder: './_tests'
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
majorVersion: '0.1.1'
majorVersion: '0.1.5'
minorVersion: $[counter('minorVersion', 1)]
readarrVersion: '$(majorVersion).$(minorVersion)'
buildName: '$(Build.SourceBranchName).$(readarrVersion)'

View File

@@ -44,7 +44,8 @@ module.exports = (env) => {
'node_modules'
],
alias: {
jquery: 'jquery/src/jquery'
jquery: 'jquery/src/jquery',
'react-middle-truncate': 'react-middle-truncate/lib/react-middle-truncate'
},
fallback: {
buffer: false,

View File

@@ -1,7 +1,6 @@
const reload = require('require-nocache')(module);
const cssVarsFiles = [
'./src/Styles/Variables/colors',
'./src/Styles/Variables/dimensions',
'./src/Styles/Variables/fonts',
'./src/Styles/Variables/animations',

View File

@@ -61,33 +61,33 @@ class Blocklist extends Component {
getSelectedIds = () => {
return getSelectedIds(this.state.selectedState);
}
};
//
// Listeners
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
}
};
onSelectedChange = ({ id, value, shiftKey = false }) => {
this.setState((state) => {
return toggleSelected(state, this.props.items, id, value, shiftKey);
});
}
};
onRemoveSelectedPress = () => {
this.setState({ isConfirmRemoveModalOpen: true });
}
};
onRemoveSelectedConfirmed = () => {
this.props.onRemoveSelected(this.getSelectedIds());
this.setState({ isConfirmRemoveModalOpen: false });
}
};
onConfirmRemoveModalClose = () => {
this.setState({ isConfirmRemoveModalOpen: false });
}
};
//
// Render

View File

@@ -68,37 +68,37 @@ class BlocklistConnector extends Component {
repopulate = () => {
this.props.fetchBlocklist();
}
};
//
// Listeners
onFirstPagePress = () => {
this.props.gotoBlocklistFirstPage();
}
};
onPreviousPagePress = () => {
this.props.gotoBlocklistPreviousPage();
}
};
onNextPagePress = () => {
this.props.gotoBlocklistNextPage();
}
};
onLastPagePress = () => {
this.props.gotoBlocklistLastPage();
}
};
onPageSelect = (page) => {
this.props.gotoBlocklistPage({ page });
}
};
onRemoveSelected = (ids) => {
this.props.removeBlocklistItems({ ids });
}
};
onSortPress = (sortKey) => {
this.props.setBlocklistSort({ sortKey });
}
};
onTableOptionChange = (payload) => {
this.props.setBlocklistTableOption(payload);
@@ -106,11 +106,11 @@ class BlocklistConnector extends Component {
if (payload.pageSize) {
this.props.gotoBlocklistFirstPage();
}
}
};
onClearBlocklistPress = () => {
this.props.executeCommand({ name: commandNames.CLEAR_BLOCKLIST });
}
};
//
// Render

View File

@@ -1,6 +1,7 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import AuthorNameLink from 'Author/AuthorNameLink';
import BookFormats from 'Book/BookFormats';
import BookQuality from 'Book/BookQuality';
import IconButton from 'Components/Link/IconButton';
import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellConnector';
@@ -30,11 +31,11 @@ class BlocklistRow extends Component {
onDetailsPress = () => {
this.setState({ isDetailsModalOpen: true });
}
};
onDetailsModalClose = () => {
this.setState({ isDetailsModalOpen: false });
}
};
//
// Render
@@ -45,6 +46,7 @@ class BlocklistRow extends Component {
author,
sourceTitle,
quality,
customFormats,
date,
protocol,
indexer,
@@ -110,6 +112,16 @@ class BlocklistRow extends Component {
);
}
if (name === 'customFormats') {
return (
<TableRowCell key={name}>
<BookFormats
formats={customFormats}
/>
</TableRowCell>
);
}
if (name === 'date') {
return (
<RelativeDateCellConnector
@@ -174,6 +186,7 @@ BlocklistRow.propTypes = {
author: PropTypes.object.isRequired,
sourceTitle: PropTypes.string.isRequired,
quality: PropTypes.object.isRequired,
customFormats: PropTypes.arrayOf(PropTypes.object).isRequired,
date: PropTypes.string.isRequired,
protocol: PropTypes.string.isRequired,
indexer: PropTypes.string,

View File

@@ -9,6 +9,7 @@ import Link from 'Components/Link/Link';
import { icons } from 'Helpers/Props';
import formatDateTime from 'Utilities/Date/formatDateTime';
import formatAge from 'Utilities/Number/formatAge';
import formatPreferredWordScore from 'Utilities/Number/formatPreferredWordScore';
import translate from 'Utilities/String/translate';
import styles from './HistoryDetails.css';
@@ -65,8 +66,10 @@ function HistoryDetails(props) {
const {
indexer,
releaseGroup,
customFormatScore,
nzbInfoUrl,
downloadClient,
downloadClientName,
downloadId,
age,
ageHours,
@@ -74,6 +77,8 @@ function HistoryDetails(props) {
publishedDate
} = data;
const downloadClientNameInfo = downloadClientName ?? downloadClient;
return (
<DescriptionList>
<DescriptionListItem
@@ -100,7 +105,16 @@ function HistoryDetails(props) {
}
{
!!nzbInfoUrl &&
customFormatScore && customFormatScore !== '0' ?
<DescriptionListItem
title="Custom Format Score"
data={formatPreferredWordScore(customFormatScore)}
/> :
null
}
{
nzbInfoUrl ?
<span>
<DescriptionListItemTitle>
Info URL
@@ -109,15 +123,17 @@ function HistoryDetails(props) {
<DescriptionListItemDescription>
<Link to={nzbInfoUrl}>{nzbInfoUrl}</Link>
</DescriptionListItemDescription>
</span>
</span> :
null
}
{
!!downloadClient &&
downloadClientNameInfo ?
<DescriptionListItem
title={translate('DownloadClient')}
data={downloadClient}
/>
data={downloadClientNameInfo}
/> :
null
}
{
@@ -173,6 +189,7 @@ function HistoryDetails(props) {
if (eventType === 'bookFileImported') {
const {
customFormatScore,
droppedPath,
importedPath
} = data;
@@ -195,12 +212,22 @@ function HistoryDetails(props) {
}
{
!!importedPath &&
importedPath ?
<DescriptionListItem
descriptionClassName={styles.description}
title={translate('ImportedTo')}
data={importedPath}
/>
/> :
null
}
{
customFormatScore && customFormatScore !== '0' ?
<DescriptionListItem
title="Custom Format Score"
data={formatPreferredWordScore(customFormatScore)}
/> :
null
}
</DescriptionList>
);
@@ -208,7 +235,8 @@ function HistoryDetails(props) {
if (eventType === 'bookFileDeleted') {
const {
reason
reason,
customFormatScore
} = data;
let reasonMessage = '';
@@ -238,6 +266,15 @@ function HistoryDetails(props) {
title={translate('Reason')}
data={reasonMessage}
/>
{
customFormatScore && customFormatScore !== '0' ?
<DescriptionListItem
title="Custom Format Score"
data={formatPreferredWordScore(customFormatScore)}
/> :
null
}
</DescriptionList>
);
}

View File

@@ -60,38 +60,38 @@ class HistoryConnector extends Component {
repopulate = () => {
this.props.fetchHistory();
}
};
//
// Listeners
onFirstPagePress = () => {
this.props.gotoHistoryFirstPage();
}
};
onPreviousPagePress = () => {
this.props.gotoHistoryPreviousPage();
}
};
onNextPagePress = () => {
this.props.gotoHistoryNextPage();
}
};
onLastPagePress = () => {
this.props.gotoHistoryLastPage();
}
};
onPageSelect = (page) => {
this.props.gotoHistoryPage({ page });
}
};
onSortPress = (sortKey) => {
this.props.setHistorySort({ sortKey });
}
};
onFilterSelect = (selectedFilterKey) => {
this.props.setHistoryFilter({ selectedFilterKey });
}
};
onTableOptionChange = (payload) => {
this.props.setHistoryTableOption(payload);
@@ -99,7 +99,7 @@ class HistoryConnector extends Component {
if (payload.pageSize) {
this.props.gotoHistoryFirstPage();
}
}
};
//
// Render

View File

@@ -10,6 +10,12 @@
width: 80px;
}
.customFormatScore {
composes: cell from '~Components/Table/Cells/TableRowCell.css';
width: 55px;
}
.releaseGroup {
composes: cell from '~Components/Table/Cells/TableRowCell.css';

View File

@@ -1,6 +1,7 @@
import PropTypes from 'prop-types';
import React, { Component } from 'react';
import AuthorNameLink from 'Author/AuthorNameLink';
import BookFormats from 'Book/BookFormats';
import BookQuality from 'Book/BookQuality';
import BookTitleLink from 'Book/BookTitleLink';
import IconButton from 'Components/Link/IconButton';
@@ -8,6 +9,7 @@ import RelativeDateCellConnector from 'Components/Table/Cells/RelativeDateCellCo
import TableRowCell from 'Components/Table/Cells/TableRowCell';
import TableRow from 'Components/Table/TableRow';
import { icons } from 'Helpers/Props';
import formatPreferredWordScore from 'Utilities/Number/formatPreferredWordScore';
import HistoryDetailsModal from './Details/HistoryDetailsModal';
import HistoryEventTypeCell from './HistoryEventTypeCell';
import styles from './HistoryRow.css';
@@ -40,11 +42,11 @@ class HistoryRow extends Component {
onDetailsPress = () => {
this.setState({ isDetailsModalOpen: true });
}
};
onDetailsModalClose = () => {
this.setState({ isDetailsModalOpen: false });
}
};
//
// Render
@@ -54,6 +56,7 @@ class HistoryRow extends Component {
author,
book,
quality,
customFormats,
qualityCutoffNotMet,
eventType,
sourceTitle,
@@ -127,6 +130,16 @@ class HistoryRow extends Component {
);
}
if (name === 'customFormats') {
return (
<TableRowCell key={name}>
<BookFormats
formats={customFormats}
/>
</TableRowCell>
);
}
if (name === 'date') {
return (
<RelativeDateCellConnector
@@ -158,6 +171,17 @@ class HistoryRow extends Component {
);
}
if (name === 'customFormatScore') {
return (
<TableRowCell
key={name}
className={styles.customFormatScore}
>
{formatPreferredWordScore(data.customFormatScore)}
</TableRowCell>
);
}
if (name === 'releaseGroup') {
return (
<TableRowCell
@@ -219,6 +243,7 @@ HistoryRow.propTypes = {
author: PropTypes.object.isRequired,
book: PropTypes.object,
quality: PropTypes.object.isRequired,
customFormats: PropTypes.arrayOf(PropTypes.object),
qualityCutoffNotMet: PropTypes.bool.isRequired,
eventType: PropTypes.string.isRequired,
sourceTitle: PropTypes.string.isRequired,

View File

@@ -49,7 +49,7 @@ class HistoryRowConnector extends Component {
onMarkAsFailedPress = () => {
this.props.markAsFailed({ id: this.props.id });
}
};
//
// Render

View File

@@ -1,13 +1,13 @@
.torrent {
composes: label from '~Components/Label.css';
border-color: $torrentColor;
background-color: $torrentColor;
border-color: var(--torrentColor);
background-color: var(--torrentColor);
}
.usenet {
composes: label from '~Components/Label.css';
border-color: $usenetColor;
background-color: $usenetColor;
border-color: var(--usenetColor);
background-color: var(--usenetColor);
}

View File

@@ -75,13 +75,23 @@ class Queue extends Component {
return;
}
const nextState = {};
if (prevProps.items !== items) {
nextState.items = items;
}
const selectedIds = this.getSelectedIds();
const isPendingSelected = _.some(this.props.items, (item) => {
return selectedIds.indexOf(item.id) > -1 && item.status === 'delay';
});
if (isPendingSelected !== this.state.isPendingSelected) {
this.setState({ isPendingSelected });
nextState.isPendingSelected = isPendingSelected;
}
if (!_.isEmpty(nextState)) {
this.setState(nextState);
}
}
@@ -90,45 +100,45 @@ class Queue extends Component {
getSelectedIds = () => {
return getSelectedIds(this.state.selectedState);
}
};
//
// Listeners
onQueueRowModalOpenOrClose = (isOpen) => {
this._shouldBlockRefresh = isOpen;
}
};
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
}
};
onSelectedChange = ({ id, value, shiftKey = false }) => {
this.setState((state) => {
return toggleSelected(state, this.props.items, id, value, shiftKey);
});
}
};
onGrabSelectedPress = () => {
this.props.onGrabSelectedPress(this.getSelectedIds());
}
};
onRemoveSelectedPress = () => {
this.setState({ isConfirmRemoveModalOpen: true }, () => {
this._shouldBlockRefresh = true;
});
}
};
onRemoveSelectedConfirmed = (payload) => {
this._shouldBlockRefresh = false;
this.props.onRemoveSelectedPress({ ids: this.getSelectedIds(), ...payload });
this.setState({ isConfirmRemoveModalOpen: false });
}
};
onConfirmRemoveModalClose = () => {
this._shouldBlockRefresh = false;
this.setState({ isConfirmRemoveModalOpen: false });
}
};
//
// Render
@@ -216,26 +226,29 @@ class Queue extends Component {
<PageContentBody>
{
isRefreshing && !isAllPopulated &&
<LoadingIndicator />
isRefreshing && !isAllPopulated ?
<LoadingIndicator /> :
null
}
{
!isRefreshing && hasError &&
!isRefreshing && hasError ?
<div>
{translate('FailedToLoadQueue')}
</div>
</div> :
null
}
{
isAllPopulated && !hasError && !items.length &&
isAllPopulated && !hasError && !items.length ?
<div>
{translate('QueueIsEmpty')}
</div>
</div> :
null
}
{
isAllPopulated && !hasError && !!items.length &&
isAllPopulated && !hasError && !!items.length ?
<div>
<Table
columns={columns}
@@ -270,7 +283,8 @@ class Queue extends Component {
isFetching={isRefreshing}
{...otherProps}
/>
</div>
</div> :
null
}
</PageContentBody>

View File

@@ -79,34 +79,34 @@ class QueueConnector extends Component {
repopulate = () => {
this.props.fetchQueue();
}
};
//
// Listeners
onFirstPagePress = () => {
this.props.gotoQueueFirstPage();
}
};
onPreviousPagePress = () => {
this.props.gotoQueuePreviousPage();
}
};
onNextPagePress = () => {
this.props.gotoQueueNextPage();
}
};
onLastPagePress = () => {
this.props.gotoQueueLastPage();
}
};
onPageSelect = (page) => {
this.props.gotoQueuePage({ page });
}
};
onSortPress = (sortKey) => {
this.props.setQueueSort({ sortKey });
}
};
onTableOptionChange = (payload) => {
this.props.setQueueTableOption(payload);
@@ -114,21 +114,21 @@ class QueueConnector extends Component {
if (payload.pageSize) {
this.props.gotoQueueFirstPage();
}
}
};
onRefreshPress = () => {
this.props.executeCommand({
name: commandNames.REFRESH_MONITORED_DOWNLOADS
});
}
};
onGrabSelectedPress = (ids) => {
this.props.grabQueueItems({ ids });
}
};
onRemoveSelectedPress = (payload) => {
this.props.removeQueueItems(payload);
}
};
//
// Render

View File

@@ -42,7 +42,7 @@ class QueueOptions extends Component {
[name]: value
});
});
}
};
//
// Render

View File

@@ -2,6 +2,7 @@ import PropTypes from 'prop-types';
import React, { Component } from 'react';
import ProtocolLabel from 'Activity/Queue/ProtocolLabel';
import AuthorNameLink from 'Author/AuthorNameLink';
import BookFormats from 'Book/BookFormats';
import BookQuality from 'Book/BookQuality';
import BookTitleLink from 'Book/BookTitleLink';
import Icon from 'Components/Icon';
@@ -41,7 +42,7 @@ class QueueRow extends Component {
onRemoveQueueItemPress = () => {
this.setState({ isRemoveQueueItemModalOpen: true });
}
};
onRemoveQueueItemModalConfirmed = (blocklist, skipredownload) => {
const {
@@ -53,25 +54,25 @@ class QueueRow extends Component {
onRemoveQueueItemPress(blocklist, skipredownload);
this.setState({ isRemoveQueueItemModalOpen: false });
}
};
onRemoveQueueItemModalClose = () => {
this.props.onQueueRowModalOpenOrClose(false);
this.setState({ isRemoveQueueItemModalOpen: false });
}
};
onInteractiveImportPress = () => {
this.props.onQueueRowModalOpenOrClose(true);
this.setState({ isInteractiveImportModalOpen: true });
}
};
onInteractiveImportModalClose = () => {
this.props.onQueueRowModalOpenOrClose(false);
this.setState({ isInteractiveImportModalOpen: false });
}
};
//
// Render
@@ -89,6 +90,7 @@ class QueueRow extends Component {
author,
book,
quality,
customFormats,
protocol,
indexer,
outputPath,
@@ -210,6 +212,16 @@ class QueueRow extends Component {
);
}
if (name === 'customFormats') {
return (
<TableRowCell key={name}>
<BookFormats
formats={customFormats}
/>
</TableRowCell>
);
}
if (name === 'protocol') {
return (
<TableRowCell key={name}>
@@ -379,6 +391,7 @@ QueueRow.propTypes = {
author: PropTypes.object,
book: PropTypes.object,
quality: PropTypes.object.isRequired,
customFormats: PropTypes.arrayOf(PropTypes.object),
protocol: PropTypes.string.isRequired,
indexer: PropTypes.string,
outputPath: PropTypes.string,

View File

@@ -41,11 +41,11 @@ class QueueRowConnector extends Component {
onGrabPress = () => {
this.props.grabQueueItem({ id: this.props.id });
}
};
onRemoveQueueItemPress = (payload) => {
this.props.removeQueueItem({ id: this.props.id, ...payload });
}
};
//
// Render

View File

@@ -36,34 +36,34 @@ class RemoveQueueItemModal extends Component {
blocklist: false,
skipredownload: false
});
}
};
//
// Listeners
onRemoveChange = ({ value }) => {
this.setState({ remove: value });
}
};
onBlocklistChange = ({ value }) => {
this.setState({ blocklist: value });
}
};
onSkipReDownloadChange = ({ value }) => {
this.setState({ skipredownload: value });
}
};
onRemoveConfirmed = () => {
const state = this.state;
this.resetState();
this.props.onRemovePress(state);
}
};
onModalClose = () => {
this.resetState();
this.props.onModalClose();
}
};
//
// Render

View File

@@ -31,40 +31,40 @@ class RemoveQueueItemsModal extends Component {
//
// Control
resetState = function() {
this.setState({
remove: true,
blocklist: false,
skipredownload: false
});
}
resetState = function() {
this.setState({
remove: true,
blocklist: false,
skipredownload: false
});
};
//
// Listeners
//
// Listeners
onRemoveChange = ({ value }) => {
this.setState({ remove: value });
}
onRemoveChange = ({ value }) => {
this.setState({ remove: value });
};
onBlocklistChange = ({ value }) => {
this.setState({ blocklist: value });
}
};
onSkipReDownloadChange = ({ value }) => {
this.setState({ skipredownload: value });
}
};
onRemoveConfirmed = () => {
const state = this.state;
this.resetState();
this.props.onRemovePress(state);
}
};
onModalClose = () => {
this.resetState();
this.props.onModalClose();
}
};
//
// Render

View File

@@ -4,6 +4,7 @@ import React from 'react';
import DocumentTitle from 'react-document-title';
import { Provider } from 'react-redux';
import PageConnector from 'Components/Page/PageConnector';
import ApplyTheme from './ApplyTheme';
import AppRoutes from './AppRoutes';
function App({ store, history }) {
@@ -11,9 +12,11 @@ function App({ store, history }) {
<DocumentTitle title={window.Readarr.instanceName}>
<Provider store={store}>
<ConnectedRouter history={history}>
<PageConnector>
<AppRoutes app={App} />
</PageConnector>
<ApplyTheme>
<PageConnector>
<AppRoutes app={App} />
</PageConnector>
</ApplyTheme>
</ConnectedRouter>
</Provider>
</DocumentTitle>

View File

@@ -13,6 +13,7 @@ import CalendarPageConnector from 'Calendar/CalendarPageConnector';
import NotFound from 'Components/NotFound';
import Switch from 'Components/Router/Switch';
import AddNewItemConnector from 'Search/AddNewItemConnector';
import CustomFormatSettingsConnector from 'Settings/CustomFormats/CustomFormatSettingsConnector';
import DevelopmentSettingsConnector from 'Settings/Development/DevelopmentSettingsConnector';
import DownloadClientSettingsConnector from 'Settings/DownloadClients/DownloadClientSettingsConnector';
import GeneralSettingsConnector from 'Settings/General/GeneralSettingsConnector';
@@ -22,7 +23,7 @@ import MediaManagementConnector from 'Settings/MediaManagement/MediaManagementCo
import MetadataSettings from 'Settings/Metadata/MetadataSettings';
import NotificationSettings from 'Settings/Notifications/NotificationSettings';
import Profiles from 'Settings/Profiles/Profiles';
import Quality from 'Settings/Quality/Quality';
import QualityConnector from 'Settings/Quality/QualityConnector';
import Settings from 'Settings/Settings';
import TagSettings from 'Settings/Tags/TagSettings';
import UISettingsConnector from 'Settings/UI/UISettingsConnector';
@@ -172,7 +173,12 @@ function AppRoutes(props) {
<Route
path="/settings/quality"
component={Quality}
component={QualityConnector}
/>
<Route
path="/settings/customformats"
component={CustomFormatSettingsConnector}
/>
<Route

View File

@@ -11,9 +11,47 @@ import UpdateChanges from 'System/Updates/UpdateChanges';
import translate from 'Utilities/String/translate';
import styles from './AppUpdatedModalContent.css';
function mergeUpdates(items, version, prevVersion) {
let installedIndex = items.findIndex((u) => u.version === version);
let installedPreviouslyIndex = items.findIndex((u) => u.version === prevVersion);
if (installedIndex === -1) {
installedIndex = 0;
}
if (installedPreviouslyIndex === -1) {
installedPreviouslyIndex = items.length;
} else if (installedPreviouslyIndex === installedIndex && items.length) {
installedPreviouslyIndex += 1;
}
const appliedUpdates = items.slice(installedIndex, installedPreviouslyIndex);
if (!appliedUpdates.length) {
return null;
}
const appliedChanges = { new: [], fixed: [] };
appliedUpdates.forEach((u) => {
if (u.changes) {
appliedChanges.new.push(... u.changes.new);
appliedChanges.fixed.push(... u.changes.fixed);
}
});
const mergedUpdate = Object.assign({}, appliedUpdates[0], { changes: appliedChanges });
if (!appliedChanges.new.length && !appliedChanges.fixed.length) {
mergedUpdate.changes = null;
}
return mergedUpdate;
}
function AppUpdatedModalContent(props) {
const {
version,
prevVersion,
isPopulated,
error,
items,
@@ -21,7 +59,7 @@ function AppUpdatedModalContent(props) {
onModalClose
} = props;
const update = items[0];
const update = mergeUpdates(items, version, prevVersion);
return (
<ModalContent onModalClose={onModalClose}>
@@ -91,6 +129,7 @@ function AppUpdatedModalContent(props) {
AppUpdatedModalContent.propTypes = {
version: PropTypes.string.isRequired,
prevVersion: PropTypes.string,
isPopulated: PropTypes.bool.isRequired,
error: PropTypes.object,
items: PropTypes.arrayOf(PropTypes.object).isRequired,

View File

@@ -8,8 +8,9 @@ import AppUpdatedModalContent from './AppUpdatedModalContent';
function createMapStateToProps() {
return createSelector(
(state) => state.app.version,
(state) => state.app.prevVersion,
(state) => state.system.updates,
(version, updates) => {
(version, prevVersion, updates) => {
const {
isPopulated,
error,
@@ -18,6 +19,7 @@ function createMapStateToProps() {
return {
version,
prevVersion,
isPopulated,
error,
items

View File

@@ -0,0 +1,49 @@
import PropTypes from 'prop-types';
import React, { Fragment, useCallback, useEffect } from 'react';
import { connect } from 'react-redux';
import { createSelector } from 'reselect';
import themes from 'Styles/Themes';
function createMapStateToProps() {
return createSelector(
(state) => state.settings.ui.item.theme || window.Readarr.theme,
(
theme
) => {
return {
theme
};
}
);
}
function ApplyTheme({ theme, children }) {
// Update the CSS Variables
const updateCSSVariables = useCallback(() => {
const arrayOfVariableKeys = Object.keys(themes[theme]);
const arrayOfVariableValues = Object.values(themes[theme]);
// Loop through each array key and set the CSS Variables
arrayOfVariableKeys.forEach((cssVariableKey, index) => {
// Based on our snippet from MDN
document.documentElement.style.setProperty(
`--${cssVariableKey}`,
arrayOfVariableValues[index]
);
});
}, [theme]);
// On Component Mount and Component Update
useEffect(() => {
updateCSSVariables(theme);
}, [updateCSSVariables, theme]);
return <Fragment>{children}</Fragment>;
}
ApplyTheme.propTypes = {
theme: PropTypes.string.isRequired,
children: PropTypes.object.isRequired
};
export default connect(createMapStateToProps)(ApplyTheme);

View File

@@ -99,7 +99,7 @@ class AuthorImage extends Component {
if (this.props.onError) {
this.props.onError();
}
}
};
onLoad = () => {
this.setState({
@@ -110,7 +110,7 @@ class AuthorImage extends Component {
if (this.props.onLoad) {
this.props.onLoad();
}
}
};
//
// Render

View File

@@ -8,5 +8,5 @@
.deleteFilesMessage {
margin-top: 20px;
color: $dangerColor;
color: var(--dangerColor);
}

View File

@@ -33,11 +33,11 @@ class DeleteAuthorModalContent extends Component {
onDeleteFilesChange = ({ value }) => {
this.setState({ deleteFiles: value });
}
};
onAddImportListExclusionChange = ({ value }) => {
this.setState({ addImportListExclusion: value });
}
};
onDeleteAuthorConfirmed = () => {
const deleteFiles = this.state.deleteFiles;
@@ -46,7 +46,7 @@ class DeleteAuthorModalContent extends Component {
this.setState({ deleteFiles: false });
this.setState({ addImportListExclusion: false });
this.props.onDeletePress(deleteFiles, addImportListExclusion);
}
};
//
// Render

View File

@@ -32,7 +32,7 @@ class DeleteAuthorModalContentConnector extends Component {
});
this.props.onModalClose(true);
}
};
//
// Render

View File

@@ -9,7 +9,7 @@
}
.metadataMessage {
color: $helpTextColor;
color: var(--helpTextColor);
text-align: center;
font-weight: 300;
font-size: 20px;
@@ -22,7 +22,7 @@
.tabList {
margin: 0;
padding: 0;
border-bottom: 1px solid $lightGray;
border-bottom: 1px solid var(--lightGray);
}
.tab {
@@ -37,7 +37,7 @@
}
.selectedTab {
border-bottom: 4px solid $linkColor;
border-bottom: 4px solid var(--linkColor);
}
.tabContent {
@@ -63,7 +63,7 @@
white-space: nowrap;
&:hover {
color: $iconButtonHoverLightColor;
color: var(--iconButtonHoverLightColor);
}
}

View File

@@ -99,69 +99,69 @@ class AuthorDetails extends Component {
}
this.setState({ selectedState: newSelectedState, allSelected: isAllSelected, allUnselected: isAllUnselected });
}
};
getSelectedIds = () => {
return getSelectedIds(this.state.selectedState);
}
};
//
// Listeners
onOrganizePress = () => {
this.setState({ isOrganizeModalOpen: true });
}
};
onOrganizeModalClose = () => {
this.setState({ isOrganizeModalOpen: false });
}
};
onRetagPress = () => {
this.setState({ isRetagModalOpen: true });
}
};
onRetagModalClose = () => {
this.setState({ isRetagModalOpen: false });
}
};
onInteractiveImportPress = () => {
this.setState({ isInteractiveImportModalOpen: true });
}
};
onInteractiveImportModalClose = () => {
this.setState({ isInteractiveImportModalOpen: false });
}
};
onEditAuthorPress = () => {
this.setState({ isEditAuthorModalOpen: true });
}
};
onEditAuthorModalClose = () => {
this.setState({ isEditAuthorModalOpen: false });
}
};
onDeleteAuthorPress = () => {
this.setState({
isEditAuthorModalOpen: false,
isDeleteAuthorModalOpen: true
});
}
};
onDeleteAuthorModalClose = () => {
this.setState({ isDeleteAuthorModalOpen: false });
}
};
onMonitorOptionsPress = () => {
this.setState({ isMonitorOptionsModalOpen: true });
}
};
onMonitorOptionsClose = () => {
this.setState({ isMonitorOptionsModalOpen: false });
}
};
onBookEditorTogglePress = () => {
this.setState({ isEditorActive: !this.state.isEditorActive });
}
};
onExpandAllPress = () => {
const {
@@ -170,7 +170,7 @@ class AuthorDetails extends Component {
} = this.state;
this.setState(getExpandedState(selectAll(expandedState, !allExpanded)));
}
};
onExpandPress = (bookId, isExpanded) => {
this.setState((state) => {
@@ -184,32 +184,32 @@ class AuthorDetails extends Component {
return getExpandedState(newState);
});
}
};
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
}
};
onSelectAllPress = () => {
this.onSelectAllChange({ value: !this.state.allSelected });
}
};
onSelectedChange = (items, id, value, shiftKey = false) => {
this.setState((state) => {
return toggleSelected(state, items, id, value, shiftKey);
});
}
};
onSaveSelected = (changes) => {
this.props.onSaveSelected({
bookIds: this.getSelectedIds(),
...changes
});
}
};
onTabSelect = (index, lastIndex) => {
this.setState({ selectedTabIndex: index });
}
};
//
// Render

View File

@@ -270,7 +270,7 @@ class AuthorDetailsConnector extends Component {
this.props.fetchSeries({ authorId });
this.props.fetchBookFiles({ authorId });
this.props.fetchQueueDetails({ authorId });
}
};
unpopulate = () => {
this.props.cancelFetchReleases();
@@ -278,7 +278,7 @@ class AuthorDetailsConnector extends Component {
this.props.clearBookFiles();
this.props.clearQueueDetails();
this.props.clearReleases();
}
};
//
// Listeners
@@ -288,25 +288,25 @@ class AuthorDetailsConnector extends Component {
authorId: this.props.id,
monitored
});
}
};
onRefreshPress = () => {
this.props.executeCommand({
name: commandNames.REFRESH_AUTHOR,
authorId: this.props.id
});
}
};
onSearchPress = () => {
this.props.executeCommand({
name: commandNames.AUTHOR_SEARCH,
authorId: this.props.id
});
}
};
onSaveSelected = (payload) => {
this.props.saveBookEditor(payload);
}
};
//
// Render

View File

@@ -16,7 +16,7 @@
position: absolute;
width: 100%;
height: 100%;
background: $black;
background: var(--black);
opacity: 0.7;
}
@@ -25,7 +25,7 @@
padding: 30px;
width: 100%;
height: 100%;
color: $white;
color: var(--white);
}
.poster {
@@ -69,7 +69,7 @@
width: 40px;
&:hover {
color: $iconButtonHoverLightColor;
color: var(--iconButtonHoverLightColor);
}
}
@@ -97,7 +97,7 @@
white-space: nowrap;
&:hover {
color: $iconButtonHoverLightColor;
color: var(--iconButtonHoverLightColor);
}
}

View File

@@ -52,11 +52,11 @@ class AuthorDetailsHeader extends Component {
onOverviewMeasure = ({ height }) => {
this.setState({ overviewHeight: height });
}
};
onTitleMeasure = ({ width }) => {
this.setState({ titleWidth: width });
}
};
//
// Render

View File

@@ -48,7 +48,7 @@ class AuthorDetailsHeaderConnector extends Component {
authorId: this.props.authorId,
monitored
});
}
};
//
// Render

View File

@@ -1,8 +1,8 @@
.bookType {
margin-bottom: 20px;
border: 1px solid $borderColor;
border: 1px solid var(--borderColor);
border-radius: 4px;
background-color: $white;
background-color: var(--cardBackgroundColor);
&:last-of-type {
margin-bottom: 0;
@@ -77,7 +77,7 @@
.books {
padding-top: 15px;
border-top: 1px solid $borderColor;
border-top: 1px solid var(--borderColor);
}
.collapseButtonContainer {
@@ -86,10 +86,10 @@
justify-content: center;
padding: 10px 15px;
width: 100%;
border-top: 1px solid $borderColor;
border-top: 1px solid var(--borderColor);
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
background-color: #fafafa;
background-color: var(--collapseButtonBackgroundColor);
}
.collapseButtonIcon {

View File

@@ -61,7 +61,7 @@ class AuthorDetailsSeason extends Component {
this.setState({ lastToggledBook: bookId });
this.props.onMonitorBookPress(_.uniq(bookIds), monitored);
}
};
onSelectedChange = ({ id, value, shiftKey = false }) => {
const {
@@ -70,7 +70,7 @@ class AuthorDetailsSeason extends Component {
} = this.props;
return onSelectedChange(items, id, value, shiftKey);
}
};
//
// Render

View File

@@ -66,18 +66,18 @@ class AuthorDetailsSeasonConnector extends Component {
onTableOptionChange = (payload) => {
this.props.setBooksTableOption(payload);
}
};
onSortPress = (sortKey) => {
this.props.setAuthorDetailsSort({ sortKey });
}
};
onMonitorBookPress = (bookIds, monitored) => {
this.props.toggleBooksMonitored({
bookIds,
monitored
});
}
};
//
// Render

View File

@@ -1,8 +1,8 @@
.bookType {
margin-bottom: 20px;
border: 1px solid $borderColor;
border: 1px solid var(--borderColor);
border-radius: 4px;
background-color: $white;
background-color: var(--cardBackgroundColor);
&:last-of-type {
margin-bottom: 0;
@@ -77,7 +77,7 @@
.books {
padding-top: 15px;
border-top: 1px solid $borderColor;
border-top: 1px solid var(--borderColor);
}
.collapseButtonContainer {
@@ -86,10 +86,10 @@
justify-content: center;
padding: 10px 15px;
width: 100%;
border-top: 1px solid $borderColor;
border-top: 1px solid var(--borderColor);
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
background-color: #fafafa;
background-color: var(--cardBackgroundColor);
}
.collapseButtonIcon {

View File

@@ -73,7 +73,7 @@ class AuthorDetailsSeries extends Component {
} = this.props;
this.props.onExpandPress(id, !isExpanded);
}
};
onMonitorBookPress = (bookId, monitored, { shiftKey }) => {
const lastToggled = this.state.lastToggledBook;
@@ -91,13 +91,13 @@ class AuthorDetailsSeries extends Component {
this.setState({ lastToggledBook: bookId });
this.props.onMonitorBookPress(_.uniq(bookIds), monitored);
}
};
onMonitorSeriesPress = (monitored, { shiftKey }) => {
const bookIds = this.props.items.map((book) => book.id);
this.props.onMonitorBookPress(_.uniq(bookIds), monitored);
}
};
//
// Render

View File

@@ -81,18 +81,18 @@ class AuthorDetailsSeasonConnector extends Component {
onTableOptionChange = (payload) => {
this.props.setSeriesTableOption(payload);
}
};
onSortPress = (sortKey) => {
this.props.dispatchSetSeriesSort({ sortKey });
}
};
onMonitorBookPress = (bookIds, monitored) => {
this.props.toggleBooksMonitored({
bookIds,
monitored
});
}
};
//
// Render

View File

@@ -30,23 +30,23 @@ class BookRow extends Component {
onManualSearchPress = () => {
this.setState({ isDetailsModalOpen: true });
}
};
onDetailsModalClose = () => {
this.setState({ isDetailsModalOpen: false });
}
};
onEditBookPress = () => {
this.setState({ isEditBookModalOpen: true });
}
};
onEditBookModalClose = () => {
this.setState({ isEditBookModalOpen: false });
}
};
onMonitorBookPress = (monitored, options) => {
this.props.onMonitorBookPress(this.props.id, monitored, options);
}
};
//
// Render

View File

@@ -16,7 +16,7 @@ class EditAuthorModalConnector extends Component {
onModalClose = () => {
this.props.clearPendingChanges({ section: 'author' });
this.props.onModalClose();
}
};
//
// Render

View File

@@ -48,13 +48,13 @@ class EditAuthorModalContent extends Component {
onSavePress(false);
}
}
};
onMoveAuthorPress = () => {
this.setState({ isConfirmMoveModalOpen: false });
this.props.onSavePress(true);
}
};
//
// Render

View File

@@ -83,14 +83,14 @@ class EditAuthorModalContentConnector extends Component {
onInputChange = ({ name, value }) => {
this.props.dispatchSetAuthorValue({ name, value });
}
};
onSavePress = (moveFiles) => {
this.props.dispatchSaveAuthor({
id: this.props.authorId,
moveFiles
});
}
};
//
// Render

View File

@@ -30,11 +30,11 @@ class RetagAuthorModalContent extends Component {
onCheckInputChange = ({ name, value }) => {
this.setState({ [name]: value });
}
};
onRetagAuthorPress = () => {
this.props.onRetagAuthorPress(this.state.updateCovers, this.state.embedMetadata);
}
};
//
// Render

View File

@@ -45,7 +45,7 @@ class RetagAuthorModalContentConnector extends Component {
});
this.props.onModalClose(true);
}
};
//
// Render

View File

@@ -80,7 +80,7 @@ class AuthorEditorFooter extends Component {
default:
this.props.onSaveSelected({ [name]: value });
}
}
};
onApplyTagsPress = (tags, applyTags) => {
this.setState({
@@ -92,23 +92,23 @@ class AuthorEditorFooter extends Component {
tags,
applyTags
});
}
};
onDeleteSelectedPress = () => {
this.setState({ isDeleteAuthorModalOpen: true });
}
};
onDeleteAuthorModalClose = () => {
this.setState({ isDeleteAuthorModalOpen: false });
}
};
onTagsPress = () => {
this.setState({ isTagsModalOpen: true });
}
};
onTagsModalClose = () => {
this.setState({ isTagsModalOpen: false });
}
};
onSaveRootFolderPress = () => {
this.setState({
@@ -117,7 +117,7 @@ class AuthorEditorFooter extends Component {
});
this.props.onSaveSelected({ rootFolderPath: this.state.destinationRootFolder });
}
};
onMoveAuthorPress = () => {
this.setState({
@@ -129,7 +129,7 @@ class AuthorEditorFooter extends Component {
rootFolderPath: this.state.destinationRootFolder,
moveFiles: true
});
}
};
//
// Render

View File

@@ -16,7 +16,7 @@ class AuthorEditorRow extends Component {
onBookFolderChange = () => {
// Mock handler to satisfy `onChange` being required for `CheckInput`.
//
}
};
//
// Render

View File

@@ -9,5 +9,5 @@
.path {
margin-left: 5px;
color: $dangerColor;
color: var(--dangerColor);
}

View File

@@ -29,14 +29,14 @@ class DeleteAuthorModalContent extends Component {
onDeleteFilesChange = ({ value }) => {
this.setState({ deleteFiles: value });
}
};
onDeleteAuthorConfirmed = () => {
const deleteFiles = this.state.deleteFiles;
this.setState({ deleteFiles: false });
this.props.onDeleteSelectedPress(deleteFiles);
}
};
//
// Render

View File

@@ -43,7 +43,7 @@ class OrganizeAuthorModalContentConnector extends Component {
});
this.props.onModalClose(true);
}
};
//
// Render

View File

@@ -34,7 +34,7 @@ class TagsModalContent extends Component {
onInputChange = ({ name, value }) => {
this.setState({ [name]: value });
}
};
onApplyTagsPress = () => {
const {
@@ -43,7 +43,7 @@ class TagsModalContent extends Component {
} = this.state;
this.props.onApplyTagsPress(tags, applyTags);
}
};
//
// Render

View File

@@ -54,7 +54,7 @@ class AuthorHistoryContentConnector extends Component {
authorId,
bookId
});
}
};
//
// Render

View File

@@ -55,16 +55,16 @@ class AuthorHistoryRow extends Component {
onMarkAsFailedPress = () => {
this.setState({ isMarkAsFailedModalOpen: true });
}
};
onConfirmMarkAsFailed = () => {
this.props.onMarkAsFailedPress(this.props.id);
this.setState({ isMarkAsFailedModalOpen: false });
}
};
onMarkAsFailedModalClose = () => {
this.setState({ isMarkAsFailedModalOpen: false });
}
};
//
// Render

View File

@@ -99,14 +99,14 @@ class AuthorIndex extends Component {
setScrollerRef = (ref) => {
this.setState({ scroller: ref });
}
};
getSelectedIds = () => {
if (this.state.allUnselected) {
return [];
}
return getSelectedIds(this.state.selectedState);
}
};
setSelectedState() {
const {
@@ -192,19 +192,19 @@ class AuthorIndex extends Component {
onPosterOptionsPress = () => {
this.setState({ isPosterOptionsModalOpen: true });
}
};
onPosterOptionsModalClose = () => {
this.setState({ isPosterOptionsModalOpen: false });
}
};
onOverviewOptionsPress = () => {
this.setState({ isOverviewOptionsModalOpen: true });
}
};
onOverviewOptionsModalClose = () => {
this.setState({ isOverviewOptionsModalOpen: false });
}
};
onEditorTogglePress = () => {
if (this.state.isEditorActive) {
@@ -214,36 +214,36 @@ class AuthorIndex extends Component {
newState.isEditorActive = true;
this.setState(newState);
}
}
};
onJumpBarItemPress = (jumpToCharacter) => {
this.setState({ jumpToCharacter });
}
};
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
}
};
onSelectAllPress = () => {
this.onSelectAllChange({ value: !this.state.allSelected });
}
};
onSelectedChange = ({ id, value, shiftKey = false }) => {
this.setState((state) => {
return toggleSelected(state, this.props.items, id, value, shiftKey);
});
}
};
onSaveSelected = (changes) => {
this.props.onSaveSelected({
authorIds: this.getSelectedIds(),
...changes
});
}
};
onOrganizeAuthorPress = () => {
this.setState({ isOrganizingAuthorModalOpen: true });
}
};
onOrganizeAuthorModalClose = (organized) => {
this.setState({ isOrganizingAuthorModalOpen: false });
@@ -251,11 +251,11 @@ class AuthorIndex extends Component {
if (organized === true) {
this.onSelectAllChange({ value: false });
}
}
};
onRetagAuthorPress = () => {
this.setState({ isRetaggingAuthorModalOpen: true });
}
};
onRetagAuthorModalClose = (organized) => {
this.setState({ isRetaggingAuthorModalOpen: false });
@@ -263,14 +263,14 @@ class AuthorIndex extends Component {
if (organized === true) {
this.onSelectAllChange({ value: false });
}
}
};
onRefreshAuthorPress = () => {
const selectedIds = this.getSelectedIds();
const refreshIds = this.state.isEditorActive && selectedIds.length > 0 ? selectedIds : [];
this.props.onRefreshAuthorPress(refreshIds);
}
};
//
// Render

View File

@@ -85,15 +85,15 @@ class AuthorIndexConnector extends Component {
onViewSelect = (view) => {
this.props.dispatchSetAuthorView(view);
}
};
onSaveSelected = (payload) => {
this.props.dispatchSaveAuthorEditor(payload);
}
};
onScroll = ({ scrollTop }) => {
scrollPositions.authorIndex = scrollTop;
}
};
//
// Render

View File

@@ -21,32 +21,32 @@
.continuing {
composes: legendItemColor;
background-color: $primaryColor;
background-color: var(--primaryColor);
}
.ended {
composes: legendItemColor;
background-color: $successColor;
background-color: var(--successColor);
}
.missingMonitored {
composes: legendItemColor;
background-color: $dangerColor;
background-color: var(--dangerColor);
&:global(.colorImpaired) {
background: repeating-linear-gradient(90deg, color($dangerColor shade(5%)), color($dangerColor shade(5%)) 5px, color($dangerColor shade(15%)) 5px, color($dangerColor shade(15%)) 10px);
background: repeating-linear-gradient(90deg, color(#f05050 shade(5%)), color(#f05050 shade(5%)) 5px, color(#f05050 shade(15%)) 5px, color(#f05050 shade(15%)) 10px);
}
}
.missingUnmonitored {
composes: legendItemColor;
background-color: $warningColor;
background-color: var(--warningColor);
&:global(.colorImpaired) {
background: repeating-linear-gradient(45deg, $warningColor, $warningColor 5px, color($warningColor tint(15%)) 5px, color($warningColor tint(15%)) 10px);
background: repeating-linear-gradient(45deg, #ffa500, #ffa500 5px, color(#ffa500 tint(15%)) 5px, color(#ffa500 tint(15%)) 10px);
}
}

View File

@@ -98,14 +98,14 @@ class AuthorIndexItemConnector extends Component {
name: commandNames.REFRESH_AUTHOR,
authorId: this.props.id
});
}
};
onSearchPress = () => {
this.props.dispatchExecuteCommand({
name: commandNames.AUTHOR_SEARCH,
authorId: this.props.id
});
}
};
//
// Render

View File

@@ -3,7 +3,7 @@ $hoverScale: 1.05;
.container {
&:hover {
.content {
background-color: $tableRowHoverBackgroundColor;
background-color: var(--tableRowHoverBackgroundColor);
}
}
}
@@ -35,10 +35,10 @@ $hoverScale: 1.05;
composes: link from '~Components/Link/Link.css';
display: block;
color: $defaultColor;
color: var(--defaultColor);
&:hover {
color: $defaultColor;
color: var(--defaultColor);
text-decoration: none;
}
}
@@ -52,8 +52,8 @@ $hoverScale: 1.05;
height: 0;
border-width: 0 25px 25px 0;
border-style: solid;
border-color: transparent $dangerColor transparent transparent;
color: $white;
border-color: transparent var(--dangerColor) transparent transparent;
color: var(--white);
}
.info {

View File

@@ -51,22 +51,22 @@ class AuthorIndexOverview extends Component {
onEditAuthorPress = () => {
this.setState({ isEditAuthorModalOpen: true });
}
};
onEditAuthorModalClose = () => {
this.setState({ isEditAuthorModalOpen: false });
}
};
onDeleteAuthorPress = () => {
this.setState({
isEditAuthorModalOpen: false,
isDeleteAuthorModalOpen: true
});
}
};
onDeleteAuthorModalClose = () => {
this.setState({ isDeleteAuthorModalOpen: false });
}
};
onChange = ({ value, shiftKey }) => {
const {
@@ -75,7 +75,7 @@ class AuthorIndexOverview extends Component {
} = this.props;
onSelectedChange({ id, value, shiftKey });
}
};
//
// Render

View File

@@ -123,7 +123,7 @@ class AuthorIndexOverviews extends Component {
setGridRef = (ref) => {
this._grid = ref;
}
};
calculateGrid = (width = this.state.width, isSmallScreen) => {
const {
@@ -141,7 +141,7 @@ class AuthorIndexOverviews extends Component {
posterHeight,
rowHeight
});
}
};
cellRenderer = ({ key, rowIndex, style }) => {
const {
@@ -197,14 +197,14 @@ class AuthorIndexOverviews extends Component {
/>
</div>
);
}
};
//
// Listeners
onMeasure = ({ width }) => {
this.calculateGrid(width, this.props.isSmallScreen);
}
};
//
// Render

View File

@@ -122,7 +122,7 @@ class AuthorIndexOverviewOptionsModalContent extends Component {
}, () => {
this.props.onChangeOverviewOption({ [name]: value });
});
}
};
//
// Render

View File

@@ -5,7 +5,7 @@ $hoverScale: 1.05;
&:hover {
z-index: 2;
box-shadow: 0 0 12px $black;
box-shadow: 0 0 12px var(--black);
transition: all 200ms ease-in;
.controls {
@@ -32,7 +32,7 @@ $hoverScale: 1.05;
position: relative;
display: block;
height: 70px;
background-color: $defaultColor;
background-color: var(--defaultColor);
}
.overlayTitle {
@@ -45,13 +45,13 @@ $hoverScale: 1.05;
padding: 5px;
width: 100%;
height: 100%;
color: $offWhite;
color: var(--offWhite);
text-align: center;
font-size: 20px;
}
.nextAiring {
background-color: #fafbfc;
background-color: var(--seriesBackgroundColor);
text-align: center;
font-size: $smallFontSize;
}
@@ -59,8 +59,7 @@ $hoverScale: 1.05;
.title {
@add-mixin truncate;
background-color: $defaultColor;
color: $white;
background-color: var(--seriesBackgroundColor);
text-align: center;
font-size: $smallFontSize;
}
@@ -74,8 +73,8 @@ $hoverScale: 1.05;
height: 0;
border-width: 0 25px 25px 0;
border-style: solid;
border-color: transparent $dangerColor transparent transparent;
color: $white;
border-color: transparent var(--dangerColor) transparent transparent;
color: var(--white);
}
.editorSelect {
@@ -91,8 +90,8 @@ $hoverScale: 1.05;
left: 10px;
z-index: 3;
border-radius: 4px;
background-color: $themeLightColor;
color: $white;
background-color: var(--readarrRed);
color: var(--white);
font-size: $smallFontSize;
opacity: 0;
transition: opacity 0;

View File

@@ -35,34 +35,34 @@ class AuthorIndexPoster extends Component {
onEditAuthorPress = () => {
this.setState({ isEditAuthorModalOpen: true });
}
};
onEditAuthorModalClose = () => {
this.setState({ isEditAuthorModalOpen: false });
}
};
onDeleteAuthorPress = () => {
this.setState({
isEditAuthorModalOpen: false,
isDeleteAuthorModalOpen: true
});
}
};
onDeleteAuthorModalClose = () => {
this.setState({ isDeleteAuthorModalOpen: false });
}
};
onPosterLoad = () => {
if (this.state.hasPosterError) {
this.setState({ hasPosterError: false });
}
}
};
onPosterLoadError = () => {
if (!this.state.hasPosterError) {
this.setState({ hasPosterError: true });
}
}
};
onChange = ({ value, shiftKey }) => {
const {
@@ -71,7 +71,7 @@ class AuthorIndexPoster extends Component {
} = this.props;
onSelectedChange({ id, value, shiftKey });
}
};
//
// Render

View File

@@ -1,5 +1,5 @@
.info {
background-color: #fafbfc;
background-color: var(--seriesBackgroundColor);
text-align: center;
font-size: $smallFontSize;
}

View File

@@ -171,7 +171,7 @@ class AuthorIndexPosters extends Component {
setGridRef = (ref) => {
this._grid = ref;
}
};
calculateGrid = (width = this.state.width, isSmallScreen) => {
const {
@@ -193,7 +193,7 @@ class AuthorIndexPosters extends Component {
posterHeight,
rowHeight
});
}
};
cellRenderer = ({ key, rowIndex, columnIndex, style }) => {
const {
@@ -259,14 +259,14 @@ class AuthorIndexPosters extends Component {
/>
</div>
);
}
};
//
// Listeners
onMeasure = ({ width }) => {
this.calculateGrid(width, this.props.isSmallScreen);
}
};
//
// Render

View File

@@ -93,7 +93,7 @@ class AuthorIndexPosterOptionsModalContent extends Component {
}, () => {
this.props.onChangePosterOption({ [name]: value });
});
}
};
//
// Render

View File

@@ -3,7 +3,7 @@
border-radius: 0;
background-color: #5b5b5b;
color: $white;
color: var(--white);
transition: width 200ms ease;
}

View File

@@ -27,22 +27,22 @@ class AuthorIndexActionsCell extends Component {
onEditAuthorPress = () => {
this.setState({ isEditAuthorModalOpen: true });
}
};
onEditAuthorModalClose = () => {
this.setState({ isEditAuthorModalOpen: false });
}
};
onDeleteAuthorPress = () => {
this.setState({
isEditAuthorModalOpen: false,
isDeleteAuthorModalOpen: true
});
}
};
onDeleteAuthorModalClose = () => {
this.setState({ isDeleteAuthorModalOpen: false });
}
};
//
// Render

View File

@@ -31,7 +31,7 @@
position: relative;
display: block;
height: 70px;
background-color: $defaultColor;
background-color: var(--defaultColor);
}
.bannerImage {
@@ -49,7 +49,7 @@
padding: 5px;
width: 100%;
height: 100%;
color: $offWhite;
color: var(--offWhite);
text-align: center;
font-size: 20px;
}
@@ -92,7 +92,7 @@
}
.ratings {
composes: headerCell from '~Components/Table/VirtualTableHeaderCell.css';
composes: cell from '~Components/Table/Cells/VirtualTableRowCell.css';
flex: 0 0 80px;
}

View File

@@ -40,39 +40,39 @@ class AuthorIndexRow extends Component {
onEditAuthorPress = () => {
this.setState({ isEditAuthorModalOpen: true });
}
};
onEditAuthorModalClose = () => {
this.setState({ isEditAuthorModalOpen: false });
}
};
onDeleteAuthorPress = () => {
this.setState({
isEditAuthorModalOpen: false,
isDeleteAuthorModalOpen: true
});
}
};
onDeleteAuthorModalClose = () => {
this.setState({ isDeleteAuthorModalOpen: false });
}
};
onUseSceneNumberingChange = () => {
// Mock handler to satisfy `onChange` being required for `CheckInput`.
//
}
};
onBannerLoad = () => {
if (this.state.hasBannerError) {
this.setState({ hasBannerError: false });
}
}
};
onBannerLoadError = () => {
if (!this.state.hasBannerError) {
this.setState({ hasBannerError: true });
}
}
};
//
// Render

View File

@@ -78,7 +78,7 @@ class AuthorIndexTable extends Component {
/>
</VirtualTableRow>
);
}
};
//
// Render

View File

@@ -60,7 +60,7 @@ class AuthorIndexTableOptions extends Component {
}
});
});
}
};
//
// Render

View File

@@ -16,7 +16,7 @@ class MonitoringOptionsModalConnector extends Component {
onModalClose = () => {
this.props.clearPendingChanges({ section: 'authors' });
this.props.onModalClose();
}
};
//
// Render

View File

@@ -44,7 +44,7 @@ class MonitoringOptionsModalContent extends Component {
onInputChange = ({ name, value }) => {
this.setState({ [name]: value });
}
};
//
// Listeners
@@ -65,11 +65,11 @@ class MonitoringOptionsModalContent extends Component {
if (!isSaving) {
this.onModalClose();
}
}
};
onModalClose = () => {
this.props.onModalClose();
}
};
//
// Render

View File

@@ -42,14 +42,14 @@ class MonitoringOptionsModalContentConnector extends Component {
onInputChange = ({ name, value }) => {
this.setState({ name, value });
}
};
onSavePress = ({ monitor }) => {
this.props.dispatchUpdateMonitoringOptions({
id: this.props.authorId,
monitor
});
}
};
//
// Render

View File

@@ -0,0 +1,33 @@
import PropTypes from 'prop-types';
import React from 'react';
import Label from 'Components/Label';
import { kinds } from 'Helpers/Props';
function BookFormats({ formats }) {
return (
<div>
{
formats.map((format) => {
return (
<Label
key={format.id}
kind={kinds.INFO}
>
{format.name}
</Label>
);
})
}
</div>
);
}
BookFormats.propTypes = {
formats: PropTypes.arrayOf(PropTypes.object).isRequired
};
BookFormats.defaultProps = {
formats: []
};
export default BookFormats;

View File

@@ -25,11 +25,11 @@ class BookSearchCell extends Component {
onManualSearchPress = () => {
this.setState({ isDetailsModalOpen: true });
}
};
onDetailsModalClose = () => {
this.setState({ isDetailsModalOpen: false });
}
};
//
// Render

View File

@@ -2,7 +2,7 @@
composes: link from '~Components/Link/Link.css';
&:hover {
color: $linkHoverColor;
color: var(--linkHoverColor);
text-decoration: underline;
}
}

View File

@@ -8,5 +8,5 @@
.deleteFilesMessage {
margin-top: 20px;
color: $dangerColor;
color: var(--dangerColor);
}

View File

@@ -32,11 +32,11 @@ class DeleteBookModalContent extends Component {
onDeleteFilesChange = ({ value }) => {
this.setState({ deleteFiles: value });
}
};
onAddImportListExclusionChange = ({ value }) => {
this.setState({ addImportListExclusion: value });
}
};
onDeleteBookConfirmed = () => {
const deleteFiles = this.state.deleteFiles;
@@ -45,7 +45,7 @@ class DeleteBookModalContent extends Component {
this.setState({ deleteFiles: false });
this.setState({ addImportListExclusion: false });
this.props.onDeletePress(deleteFiles, addImportListExclusion);
}
};
//
// Render

View File

@@ -36,7 +36,7 @@ class DeleteBookModalContentConnector extends Component {
this.props.onModalClose(true);
this.props.push(`${window.Readarr.urlBase}/author/${this.props.authorSlug}`);
}
};
//
// Render

View File

@@ -9,7 +9,7 @@
.tabList {
margin: 0;
padding: 0;
border-bottom: 1px solid $lightGray;
border-bottom: 1px solid var(--lightGray);
}
.tab {
@@ -24,7 +24,7 @@
}
.selectedTab {
border-bottom: 4px solid $linkColor;
border-bottom: 4px solid var(--linkColor);
}
.tabContent {
@@ -54,7 +54,7 @@
white-space: nowrap;
&:hover {
color: $iconButtonHoverLightColor;
color: var(--iconButtonHoverLightColor);
}
}

View File

@@ -45,42 +45,42 @@ class BookDetails extends Component {
onOrganizePress = () => {
this.setState({ isOrganizeModalOpen: true });
}
};
onOrganizeModalClose = () => {
this.setState({ isOrganizeModalOpen: false });
}
};
onRetagPress = () => {
this.setState({ isRetagModalOpen: true });
}
};
onRetagModalClose = () => {
this.setState({ isRetagModalOpen: false });
}
};
onEditBookPress = () => {
this.setState({ isEditBookModalOpen: true });
}
};
onEditBookModalClose = () => {
this.setState({ isEditBookModalOpen: false });
}
};
onDeleteBookPress = () => {
this.setState({
isEditBookModalOpen: false,
isDeleteBookModalOpen: true
});
}
};
onDeleteBookModalClose = () => {
this.setState({ isDeleteBookModalOpen: false });
}
};
onTabSelect = (index, lastIndex) => {
this.setState({ selectedTabIndex: index });
}
};
//
// Render

View File

@@ -146,14 +146,14 @@ class BookDetailsConnector extends Component {
this.props.fetchBookFiles({ bookId });
this.props.fetchEditions({ bookId });
}
};
unpopulate = () => {
this.props.cancelFetchReleases();
this.props.clearReleases();
this.props.clearBookFiles();
this.props.clearEditions();
}
};
//
// Listeners
@@ -163,21 +163,21 @@ class BookDetailsConnector extends Component {
bookIds: [this.props.id],
monitored
});
}
};
onRefreshPress = () => {
this.props.executeCommand({
name: commandNames.REFRESH_BOOK,
bookId: this.props.id
});
}
};
onSearchPress = () => {
this.props.executeCommand({
name: commandNames.BOOK_SEARCH,
bookIds: [this.props.id]
});
}
};
//
// Render

View File

@@ -16,7 +16,7 @@
position: absolute;
width: 100%;
height: 100%;
background: $black;
background: var(--black);
opacity: 0.7;
}
@@ -25,7 +25,7 @@
padding: 30px;
width: 100%;
height: 100%;
color: $white;
color: var(--white);
}
.cover {
@@ -69,7 +69,7 @@
width: 40px;
&:hover {
color: $iconButtonHoverLightColor;
color: var(--iconButtonHoverLightColor);
}
}

View File

@@ -48,11 +48,11 @@ class BookDetailsHeader extends Component {
onOverviewMeasure = ({ height }) => {
this.setState({ overviewHeight: height });
}
};
onTitleMeasure = ({ width }) => {
this.setState({ titleWidth: width });
}
};
//
// Render

View File

@@ -48,7 +48,7 @@ class BookDetailsHeaderConnector extends Component {
bookIds: [this.props.bookId],
monitored
});
}
};
//
// Render

View File

@@ -64,7 +64,7 @@ class BookDetailsPageConnector extends Component {
populate = () => {
this.setState({ hasMounted: true });
}
};
//
// Render

View File

@@ -16,7 +16,7 @@ class EditBookModalConnector extends Component {
onModalClose = () => {
this.props.clearPendingChanges({ section: 'books' });
this.props.onModalClose();
}
};
//
// Render

View File

@@ -27,7 +27,7 @@ class EditBookModalContent extends Component {
onSavePress(false);
}
};
//
// Render

View File

@@ -76,7 +76,7 @@ class EditBookModalContentConnector extends Component {
onInputChange = ({ name, value }) => {
this.props.dispatchSetBookValue({ name, value });
}
};
onSavePress = () => {
this.props.dispatchSaveBook({
@@ -85,7 +85,7 @@ class EditBookModalContentConnector extends Component {
this.props.dispatchSaveEditions({
id: this.props.bookId
});
}
};
//
// Render

View File

@@ -62,15 +62,15 @@ class BookEditorFooter extends Component {
default:
this.props.onSaveSelected({ [name]: value });
}
}
};
onDeleteSelectedPress = () => {
this.setState({ isDeleteBookModalOpen: true });
}
};
onDeleteBookModalClose = () => {
this.setState({ isDeleteBookModalOpen: false });
}
};
//
// Render

View File

@@ -5,5 +5,5 @@
.deleteFilesMessage {
margin-top: 20px;
color: $dangerColor;
color: var(--dangerColor);
}

View File

@@ -31,11 +31,11 @@ class DeleteBookModalContent extends Component {
onDeleteFilesChange = ({ value }) => {
this.setState({ deleteFiles: value });
}
};
onAddImportListExclusionChange = ({ value }) => {
this.setState({ addImportListExclusion: value });
}
};
onDeleteBookConfirmed = () => {
const {
@@ -45,7 +45,7 @@ class DeleteBookModalContent extends Component {
this.setState({ deleteFiles: false });
this.props.onDeleteSelectedPress(deleteFiles, addImportListExclusion);
}
};
//
// Render

View File

@@ -97,14 +97,14 @@ class BookIndex extends Component {
setScrollerRef = (ref) => {
this.setState({ scroller: ref });
}
};
getSelectedIds = () => {
if (this.state.allUnselected) {
return [];
}
return getSelectedIds(this.state.selectedState);
}
};
setSelectedState() {
const {
@@ -191,19 +191,19 @@ class BookIndex extends Component {
onPosterOptionsPress = () => {
this.setState({ isPosterOptionsModalOpen: true });
}
};
onPosterOptionsModalClose = () => {
this.setState({ isPosterOptionsModalOpen: false });
}
};
onOverviewOptionsPress = () => {
this.setState({ isOverviewOptionsModalOpen: true });
}
};
onOverviewOptionsModalClose = () => {
this.setState({ isOverviewOptionsModalOpen: false });
}
};
onEditorTogglePress = () => {
if (this.state.isEditorActive) {
@@ -213,55 +213,55 @@ class BookIndex extends Component {
newState.isEditorActive = true;
this.setState(newState);
}
}
};
onJumpBarItemPress = (jumpToCharacter) => {
this.setState({ jumpToCharacter });
}
};
onSelectAllChange = ({ value }) => {
this.setState(selectAll(this.state.selectedState, value));
}
};
onSelectAllPress = () => {
this.onSelectAllChange({ value: !this.state.allSelected });
}
};
onSelectedChange = ({ id, value, shiftKey = false }) => {
this.setState((state) => {
return toggleSelected(state, this.props.items, id, value, shiftKey);
});
}
};
onSaveSelected = (changes) => {
this.props.onSaveSelected({
bookIds: this.getSelectedIds(),
...changes
});
}
};
onSearchPress = () => {
this.setState({ isConfirmSearchModalOpen: true });
}
};
onRefreshBookPress = () => {
const selectedIds = this.getSelectedIds();
const refreshIds = this.state.isEditorActive && selectedIds.length > 0 ? selectedIds : [];
this.props.onRefreshBookPress(refreshIds);
}
};
onSearchConfirmed = () => {
const selectedMovieIds = this.getSelectedIds();
const searchIds = this.state.isMovieEditorActive && selectedMovieIds.length > 0 ? selectedMovieIds : this.props.items.map((m) => m.id);
const selectedBookIds = this.getSelectedIds();
const searchIds = this.state.isEditorActive && selectedBookIds.length > 0 ? selectedBookIds : this.props.items.map((m) => m.id);
this.props.onSearchPress(searchIds);
this.setState({ isConfirmSearchModalOpen: false });
}
};
onConfirmSearchModalClose = () => {
this.setState({ isConfirmSearchModalOpen: false });
}
};
//
// Render

View File

@@ -94,15 +94,15 @@ class BookIndexConnector extends Component {
onViewSelect = (view) => {
this.props.dispatchSetBookView(view);
}
};
onSaveSelected = (payload) => {
this.props.dispatchSaveBookEditor(payload);
}
};
onScroll = ({ scrollTop }) => {
scrollPositions.bookIndex = scrollTop;
}
};
//
// Render

View File

@@ -21,32 +21,32 @@
.continuing {
composes: legendItemColor;
background-color: $primaryColor;
background-color: var(--primaryColor);
}
.ended {
composes: legendItemColor;
background-color: $successColor;
background-color: var(--successColor);
}
.missingMonitored {
composes: legendItemColor;
background-color: $dangerColor;
background-color: var(--dangerColor);
&:global(.colorImpaired) {
background: repeating-linear-gradient(90deg, color($dangerColor shade(5%)), color($dangerColor shade(5%)) 5px, color($dangerColor shade(15%)) 5px, color($dangerColor shade(15%)) 10px);
background: repeating-linear-gradient(90deg, color(#f05050 shade(5%)), color(#f05050 shade(5%)) 5px, color(#f05050 shade(15%)) 5px, color(#f05050 shade(15%)) 10px);
}
}
.missingUnmonitored {
composes: legendItemColor;
background-color: $warningColor;
background-color: var(--warningColor);
&:global(.colorImpaired) {
background: repeating-linear-gradient(45deg, $warningColor, $warningColor 5px, color($warningColor tint(15%)) 5px, color($warningColor tint(15%)) 10px);
background: repeating-linear-gradient(45deg, #ffa500, #ffa500 5px, color(#ffa500 tint(15%)) 5px, color(#ffa500 tint(15%)) 10px);
}
}

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