mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-04-18 21:55:12 -04:00
Compare commits
507 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 24f6c937da | |||
| e94aa7c499 | |||
| 201bc1944b | |||
| 09e40e0060 | |||
| 348d90a37e | |||
| 726dc34424 | |||
| 2e9f6cd94b | |||
| 495f61f412 | |||
| 0f11f414b6 | |||
| d397cdf5fb | |||
| 888b514dd8 | |||
| caab337379 | |||
| 26bea14137 | |||
| 5f26287234 | |||
| 6ec761c217 | |||
| b85679de56 | |||
| 71775b97a3 | |||
| 5bb3dbfbf5 | |||
| b608a7a904 | |||
| 4ad992f76a | |||
| 95497480a2 | |||
| cc57866ab0 | |||
| dbc4989a95 | |||
| af4961e3e6 | |||
| 0ec54906c6 | |||
| 35f85fc986 | |||
| 0aedafb278 | |||
| 54dce448a8 | |||
| 3c915002c6 | |||
| e32f8f4330 | |||
| 5abb5ada49 | |||
| 6579385110 | |||
| 1c6e5543df | |||
| 85737aacbe | |||
| 30c3aedeb1 | |||
| 1640980e2b | |||
| 99bc56efb6 | |||
| 04276eb587 | |||
| 34c560fd3a | |||
| caa8bb05a7 | |||
| 773e8ff1f4 | |||
| 0984976378 | |||
| fcb3c96455 | |||
| acf7a425b5 | |||
| da898fe958 | |||
| 5bb3ea0806 | |||
| b41cb80e33 | |||
| a39341be4b | |||
| 27b3d8618a | |||
| 550b9b58df | |||
| 035ad33b72 | |||
| 85f8e0c451 | |||
| ea2061a7d3 | |||
| ea6d01a49b | |||
| 252cd97e35 | |||
| a8ea05af07 | |||
| 24d6a0cb06 | |||
| 8e1771b5a9 | |||
| d767a82e84 | |||
| 76bfd29f23 | |||
| c923982711 | |||
| f03a64f9ac | |||
| e713e58e83 | |||
| 4fb5d3432b | |||
| a31b107a90 | |||
| f91ffb8328 | |||
| a3ba070296 | |||
| bccb0bd5c8 | |||
| 4517f271c4 | |||
| 2ae2a0b184 | |||
| b5e43e7a1a | |||
| 3a52048dc2 | |||
| 8b898733ab | |||
| f99a2e1164 | |||
| 306209fcc2 | |||
| 5d09c2b5fa | |||
| 41a9d2d732 | |||
| 49b120ba55 | |||
| a88fc34a78 | |||
| c46b7c5e4b | |||
| 94c45541ae | |||
| f8082047a5 | |||
| 011fd57f7d | |||
| 6c35c3fc6f | |||
| 5da02c49eb | |||
| 1a339b9ab2 | |||
| 94edd7538e | |||
| 9b2274805e | |||
| dbf86efb0a | |||
| 529fbfd9bd | |||
| 0ed5bfe0d0 | |||
| 6a43eb0031 | |||
| a12001a5ef | |||
| b57014762d | |||
| a51a8bf921 | |||
| e8dc5b3206 | |||
| d4f22f3596 | |||
| b6018a4cd7 | |||
| ec389987df | |||
| 6b62504916 | |||
| 626d777d3c | |||
| 234707b291 | |||
| 15734ca0da | |||
| 19913e5b01 | |||
| 156f6505be | |||
| e383287972 | |||
| 0c0cbdac2f | |||
| 0685c2eb04 | |||
| e8c132e908 | |||
| bea9bd39ff | |||
| 077e4727f2 | |||
| 5f7bc82eb5 | |||
| 0dd5c56175 | |||
| 409a218379 | |||
| 07cc1e03c8 | |||
| 560cda8ba0 | |||
| 934f566359 | |||
| 89ae5ceaa6 | |||
| c7d5889e59 | |||
| bea3c051b9 | |||
| c0b1675627 | |||
| 906d09e162 | |||
| 8cd9ad01c2 | |||
| ce2f322478 | |||
| 0487309ee8 | |||
| 9862584611 | |||
| 6a00e0db90 | |||
| c93831dd8b | |||
| 6546ba773c | |||
| 4c3484a898 | |||
| 8561b862f9 | |||
| e1032fb0f5 | |||
| 4063219430 | |||
| e008be8581 | |||
| d6b379df64 | |||
| 27094ccf62 | |||
| edf9473e9a | |||
| a0d11e7e33 | |||
| 7729eb398a | |||
| 989564dbce | |||
| c1f917f1ac | |||
| 4b7e47c397 | |||
| 1529527af9 | |||
| a11bd1c3c7 | |||
| 915b320a4a | |||
| 155f72cc45 | |||
| 3f73fec5c3 | |||
| 8515623ceb | |||
| 963cddb582 | |||
| ede323b8ed | |||
| 07d7fc98b0 | |||
| 1b78fd38db | |||
| 5a9d4d6280 | |||
| 70685de5d2 | |||
| 9860183433 | |||
| 50331c61ae | |||
| bd3408f170 | |||
| c043bf8da9 | |||
| ea3fa6f28d | |||
| 8917347c0b | |||
| 2cebdf4a06 | |||
| 985110cfb9 | |||
| de876247a3 | |||
| bad6c301f8 | |||
| fc3b23394a | |||
| 92c3656bad | |||
| 1acbee2a57 | |||
| c28f9b6bcd | |||
| aa8048968c | |||
| 6646734510 | |||
| 71dd8b6d04 | |||
| 6d87bd9f8c | |||
| 551d969680 | |||
| 57dac6afdd | |||
| 3dfbfd07dd | |||
| 842df6913c | |||
| 599eeb4c61 | |||
| da371dd921 | |||
| fc25ba7ac0 | |||
| 6e1bef13e2 | |||
| 72ee413411 | |||
| e87b45b47e | |||
| cc841fe3d1 | |||
| 264ffdcc26 | |||
| 5cc044aa8f | |||
| de2fd92b6f | |||
| eff09c1f72 | |||
| 9db888c9a3 | |||
| bf78396164 | |||
| 0e7eaa9221 | |||
| 5b82decc31 | |||
| 38ab533272 | |||
| 4914fcd5df | |||
| 858415b037 | |||
| 43f4899324 | |||
| c60a94adfb | |||
| f386ddb806 | |||
| 4175c2577e | |||
| 6ce9e5ceb9 | |||
| c15643be39 | |||
| a58380031d | |||
| 73af5c9a72 | |||
| d556545e7f | |||
| affde5d7b7 | |||
| 518c85dee2 | |||
| ba3a240707 | |||
| 587a73f3d6 | |||
| ae8f017ca8 | |||
| d9098b612e | |||
| 29e7cc06a1 | |||
| 387fb0bd15 | |||
| 2d33560d89 | |||
| 94a797fc1e | |||
| 2e851b0588 | |||
| 7303cdf555 | |||
| 6636cbc4ae | |||
| a5a4f62f25 | |||
| 05a7465a07 | |||
| c35f1212fb | |||
| ad95d73e9d | |||
| 30f53c20ed | |||
| 0199a37a0c | |||
| e9764820c0 | |||
| d285cbb021 | |||
| 8afaa3386d | |||
| c94beb6814 | |||
| c7eb08a0f0 | |||
| 2a2e859420 | |||
| 31f0e8212e | |||
| 1cbb9b1724 | |||
| 45dbcc6b89 | |||
| 3b26613394 | |||
| 6bb8c09fcf | |||
| 810b3612aa | |||
| 57dcd861a9 | |||
| dfe132cda2 | |||
| a635820b48 | |||
| d959e81efb | |||
| ac89cd636f | |||
| 50616f5c9e | |||
| 3f9cb2c6ea | |||
| b5aa85a548 | |||
| 0fa5127c83 | |||
| 4d137886bc | |||
| 9dde041c99 | |||
| a8234c9ce0 | |||
| 9227efdb65 | |||
| fa923e658f | |||
| 364a5564ae | |||
| 9efd0b391e | |||
| 320161e051 | |||
| 38ba810ae8 | |||
| 4e3f460a24 | |||
| 0d918a0aa9 | |||
| a110412665 | |||
| 6c97f1b6ee | |||
| 470779ead2 | |||
| b371f2d913 | |||
| 3ff3452e2d | |||
| df13537e29 | |||
| 5d2fefde8f | |||
| ffb3f83324 | |||
| 1c125733b2 | |||
| 2af7fac15e | |||
| f172d17ecc | |||
| c69843931e | |||
| cd3e99ad87 | |||
| 1cce39b404 | |||
| 9b46ab73e4 | |||
| a352c053ab | |||
| b33e45d266 | |||
| 817d61de91 | |||
| c7e5cc6462 | |||
| 25596fc2e8 | |||
| 9ff0b90626 | |||
| 4f4c011436 | |||
| bd0115931f | |||
| a0d18c546e | |||
| d935b0df82 | |||
| 9e37f69224 | |||
| 2805c4f18b | |||
| dae21f22b9 | |||
| 7ddbe09eca | |||
| 90e3c809c3 | |||
| ec8cf5f57a | |||
| f4bbf2f8af | |||
| ea98d41472 | |||
| b8cb0fd291 | |||
| d3dfa620ac | |||
| 049668f307 | |||
| c400575aac | |||
| 6f122fb2e4 | |||
| a9c210f8e7 | |||
| 1068ba8915 | |||
| 635335d876 | |||
| 2ed51cd933 | |||
| b74c46c554 | |||
| 7029e0d6ee | |||
| 438ea380f5 | |||
| 4eec675d61 | |||
| 0a9bd8287f | |||
| b583ac3a97 | |||
| 4be41ff3fb | |||
| b911f8cc08 | |||
| 22face385f | |||
| 3e700b63c2 | |||
| df0b8fc660 | |||
| f96dbbfc21 | |||
| 4a75f92cb5 | |||
| dd05a9dbd4 | |||
| e78b8d5346 | |||
| 74a1d95ab7 | |||
| f929a7e62f | |||
| e9e4248af4 | |||
| 9e3b43ef12 | |||
| 738a690aac | |||
| 3b7c59e9bb | |||
| b8ca28d955 | |||
| 8797bb7d1c | |||
| be430732f5 | |||
| e7b1380b85 | |||
| c29735741c | |||
| f56a13a375 | |||
| 148d8ee249 | |||
| 3547028b96 | |||
| e4ffa1873e | |||
| 2e85a21576 | |||
| 0a111e7572 | |||
| 25217c0ee8 | |||
| 791592927c | |||
| 4137193a60 | |||
| 99816bfd36 | |||
| 59e5b5bd52 | |||
| 7fa0a2b33c | |||
| 0593ca6b9e | |||
| 06a26b5c87 | |||
| dcae6dc151 | |||
| 04e3ed0ffe | |||
| 1ed5ed9179 | |||
| d292d086ee | |||
| f68915c5dd | |||
| 01e970e1a7 | |||
| 68df439498 | |||
| 33de7ca7ab | |||
| ae2d9b795b | |||
| eadea745f8 | |||
| f958c4aefa | |||
| 4cf9fb0e79 | |||
| bfa68347e6 | |||
| f97b35403d | |||
| bf2e057247 | |||
| 5a278f4e9d | |||
| 232a6efd0d | |||
| 7e01c93b2c | |||
| d58f6551e6 | |||
| 6446528022 | |||
| 7f63757e06 | |||
| b5d789df3a | |||
| 4473551182 | |||
| fd88f44865 | |||
| 69b8be5b67 | |||
| fbde3fe2cd | |||
| f9e2c5b673 | |||
| 5c5dfbb66b | |||
| 2db24d454e | |||
| cb35a3948e | |||
| 8c314439cd | |||
| ee6467073f | |||
| 6412048eb9 | |||
| efffeebe7c | |||
| 1d25a643f9 | |||
| 60f48e3a94 | |||
| 60f8778305 | |||
| d5088cf472 | |||
| 215c87a099 | |||
| 32ca2d1720 | |||
| 8baf1b533b | |||
| 970f80b155 | |||
| b8dd8b1880 | |||
| f607347bd7 | |||
| 9959a1b5ed | |||
| 8c10f8b55c | |||
| cad4f3740b | |||
| f26b0474f5 | |||
| 8b8d0b24ae | |||
| 4dee1d65d1 | |||
| 09ed132fe6 | |||
| e85ccd5808 | |||
| 37914fb90e | |||
| f2f6a82cf0 | |||
| 812cf8135a | |||
| e4284d47b0 | |||
| c53e0054ee | |||
| ddcef3a99c | |||
| b7b5a6e7e1 | |||
| 593a649045 | |||
| cec304a0be | |||
| 06f3c8e151 | |||
| 91eb65bd6c | |||
| 832080cb36 | |||
| f9c731627f | |||
| 83344fb6f4 | |||
| 59b7435820 | |||
| d2c1ffa761 | |||
| 5436d4f800 | |||
| 86fe19a5dd | |||
| 473405ceeb | |||
| cac2729230 | |||
| 9b1f9abfac | |||
| 76285a8ccd | |||
| a6b499e4a5 | |||
| 5ee95e3cc2 | |||
| 654d2dbad3 | |||
| 67ae7e32df | |||
| d52516b700 | |||
| 326a7b5e16 | |||
| 313a0b459a | |||
| 2ffe88bf6a | |||
| a311d13805 | |||
| 0e2d15cb73 | |||
| d1949d24e0 | |||
| cdb1f163f8 | |||
| 580fc528e5 | |||
| dfed229a1d | |||
| e76a255229 | |||
| a0b650e7a5 | |||
| 7cf9fc6a4f | |||
| 86f5768461 | |||
| 479e29dde7 | |||
| 761e15a476 | |||
| d3ffb7b490 | |||
| 0db804b647 | |||
| 4334e7eef1 | |||
| fbfb70a1bb | |||
| 59e990227d | |||
| f0abfae978 | |||
| 40e7f80be9 | |||
| 3c913eac24 | |||
| 95a2bd3d03 | |||
| d5abde98e1 | |||
| 5d14d2c134 | |||
| ed46c5c86d | |||
| a3a8f1417d | |||
| 86f2f074e7 | |||
| 2b58f3131e | |||
| 8d39d5c6bb | |||
| beabd10f06 | |||
| d56dc313b4 | |||
| a738cfb23a | |||
| adf38f256b | |||
| ba2d1b3e68 | |||
| 96d64afcca | |||
| fc55aa4bd8 | |||
| 9d5d92b74c | |||
| 6783514525 | |||
| bc50fd937d | |||
| 166038a3b8 | |||
| 5207527716 | |||
| bb9969feb5 | |||
| f5685c1ca6 | |||
| ac7896b67b | |||
| 452f32d46b | |||
| e90a796b27 | |||
| af50a1d3a8 | |||
| 1a71375c3f | |||
| f87aa820c7 | |||
| 8e4082a60d | |||
| 57996666a3 | |||
| d0803bc51b | |||
| a0f7d5e309 | |||
| bbc3e6df13 | |||
| b0376c07f5 | |||
| dc3fa51d88 | |||
| 88ddb373cc | |||
| 895c7c200b | |||
| 4002cb764b | |||
| 2820ef9375 | |||
| 70fd9b4e30 | |||
| f9bd842d41 | |||
| 9d3ee4af6d | |||
| 20cc6e3bfb | |||
| d11e043270 | |||
| 71e42dafa7 | |||
| 51e73205ba | |||
| 302ed91d05 | |||
| cf01c52c34 | |||
| 16f0486da2 | |||
| 7e3dcb338c | |||
| 828aea14a9 | |||
| b31e27a7ae | |||
| 0f3559e556 | |||
| 9a1bf54c14 | |||
| a6eb1bf546 | |||
| 35e561e2c0 | |||
| 1af5beff31 | |||
| 18189d086b | |||
| 1b83459927 | |||
| bb6c068d91 | |||
| b85cd92cca | |||
| 9f5d8517e5 | |||
| ce78f91657 | |||
| e1b924ab08 | |||
| 3b7bafb78e | |||
| ca0de18413 | |||
| fb8b65a91b | |||
| b4e0608b3b | |||
| 60d9f02830 |
+11
-15
@@ -19,10 +19,10 @@ indent_size = 4
|
|||||||
dotnet_sort_system_directives_first = true
|
dotnet_sort_system_directives_first = true
|
||||||
|
|
||||||
# Avoid "this." and "Me." if not necessary
|
# Avoid "this." and "Me." if not necessary
|
||||||
dotnet_style_qualification_for_field = false:refactoring
|
dotnet_style_qualification_for_field = false:warning
|
||||||
dotnet_style_qualification_for_property = false:refactoring
|
dotnet_style_qualification_for_property = false:warning
|
||||||
dotnet_style_qualification_for_method = false:refactoring
|
dotnet_style_qualification_for_method = false:warning
|
||||||
dotnet_style_qualification_for_event = false:refactoring
|
dotnet_style_qualification_for_event = false:warning
|
||||||
|
|
||||||
# Indentation preferences
|
# Indentation preferences
|
||||||
csharp_indent_block_contents = true
|
csharp_indent_block_contents = true
|
||||||
@@ -32,10 +32,6 @@ csharp_indent_case_contents_when_block = true
|
|||||||
csharp_indent_switch_labels = true
|
csharp_indent_switch_labels = true
|
||||||
csharp_indent_labels = flush_left
|
csharp_indent_labels = flush_left
|
||||||
|
|
||||||
dotnet_style_qualification_for_field = false:suggestion
|
|
||||||
dotnet_style_qualification_for_property = false:suggestion
|
|
||||||
dotnet_style_qualification_for_method = false:suggestion
|
|
||||||
dotnet_style_qualification_for_event = false:suggestion
|
|
||||||
dotnet_naming_style.instance_field_style.capitalization = camel_case
|
dotnet_naming_style.instance_field_style.capitalization = camel_case
|
||||||
dotnet_naming_style.instance_field_style.required_prefix = _
|
dotnet_naming_style.instance_field_style.required_prefix = _
|
||||||
|
|
||||||
@@ -121,7 +117,6 @@ dotnet_diagnostic.CA1003.severity = suggestion
|
|||||||
dotnet_diagnostic.CA1008.severity = suggestion
|
dotnet_diagnostic.CA1008.severity = suggestion
|
||||||
dotnet_diagnostic.CA1010.severity = suggestion
|
dotnet_diagnostic.CA1010.severity = suggestion
|
||||||
dotnet_diagnostic.CA1012.severity = suggestion
|
dotnet_diagnostic.CA1012.severity = suggestion
|
||||||
dotnet_diagnostic.CA1014.severity = suggestion
|
|
||||||
dotnet_diagnostic.CA1016.severity = suggestion
|
dotnet_diagnostic.CA1016.severity = suggestion
|
||||||
dotnet_diagnostic.CA1017.severity = suggestion
|
dotnet_diagnostic.CA1017.severity = suggestion
|
||||||
dotnet_diagnostic.CA1018.severity = suggestion
|
dotnet_diagnostic.CA1018.severity = suggestion
|
||||||
@@ -167,6 +162,7 @@ dotnet_diagnostic.CA1309.severity = suggestion
|
|||||||
dotnet_diagnostic.CA1310.severity = suggestion
|
dotnet_diagnostic.CA1310.severity = suggestion
|
||||||
dotnet_diagnostic.CA1401.severity = suggestion
|
dotnet_diagnostic.CA1401.severity = suggestion
|
||||||
dotnet_diagnostic.CA1416.severity = suggestion
|
dotnet_diagnostic.CA1416.severity = suggestion
|
||||||
|
dotnet_diagnostic.CA1419.severity = suggestion
|
||||||
dotnet_diagnostic.CA1507.severity = suggestion
|
dotnet_diagnostic.CA1507.severity = suggestion
|
||||||
dotnet_diagnostic.CA1508.severity = suggestion
|
dotnet_diagnostic.CA1508.severity = suggestion
|
||||||
dotnet_diagnostic.CA1707.severity = suggestion
|
dotnet_diagnostic.CA1707.severity = suggestion
|
||||||
@@ -182,9 +178,6 @@ dotnet_diagnostic.CA1720.severity = suggestion
|
|||||||
dotnet_diagnostic.CA1721.severity = suggestion
|
dotnet_diagnostic.CA1721.severity = suggestion
|
||||||
dotnet_diagnostic.CA1724.severity = suggestion
|
dotnet_diagnostic.CA1724.severity = suggestion
|
||||||
dotnet_diagnostic.CA1725.severity = suggestion
|
dotnet_diagnostic.CA1725.severity = suggestion
|
||||||
dotnet_diagnostic.CA1801.severity = suggestion
|
|
||||||
dotnet_diagnostic.CA1802.severity = suggestion
|
|
||||||
dotnet_diagnostic.CA1805.severity = suggestion
|
|
||||||
dotnet_diagnostic.CA1806.severity = suggestion
|
dotnet_diagnostic.CA1806.severity = suggestion
|
||||||
dotnet_diagnostic.CA1810.severity = suggestion
|
dotnet_diagnostic.CA1810.severity = suggestion
|
||||||
dotnet_diagnostic.CA1812.severity = suggestion
|
dotnet_diagnostic.CA1812.severity = suggestion
|
||||||
@@ -196,13 +189,14 @@ dotnet_diagnostic.CA1819.severity = suggestion
|
|||||||
dotnet_diagnostic.CA1822.severity = suggestion
|
dotnet_diagnostic.CA1822.severity = suggestion
|
||||||
dotnet_diagnostic.CA1823.severity = suggestion
|
dotnet_diagnostic.CA1823.severity = suggestion
|
||||||
dotnet_diagnostic.CA1824.severity = suggestion
|
dotnet_diagnostic.CA1824.severity = suggestion
|
||||||
|
dotnet_diagnostic.CA1835.severity = suggestion
|
||||||
|
dotnet_diagnostic.CA1845.severity = suggestion
|
||||||
|
dotnet_diagnostic.CA1848.severity = suggestion
|
||||||
|
dotnet_diagnostic.CA1849.severity = suggestion
|
||||||
dotnet_diagnostic.CA2000.severity = suggestion
|
dotnet_diagnostic.CA2000.severity = suggestion
|
||||||
dotnet_diagnostic.CA2002.severity = suggestion
|
dotnet_diagnostic.CA2002.severity = suggestion
|
||||||
dotnet_diagnostic.CA2007.severity = suggestion
|
dotnet_diagnostic.CA2007.severity = suggestion
|
||||||
dotnet_diagnostic.CA2008.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.CA2012.severity = suggestion
|
||||||
dotnet_diagnostic.CA2013.severity = suggestion
|
dotnet_diagnostic.CA2013.severity = suggestion
|
||||||
dotnet_diagnostic.CA2100.severity = suggestion
|
dotnet_diagnostic.CA2100.severity = suggestion
|
||||||
@@ -233,6 +227,7 @@ dotnet_diagnostic.CA2243.severity = suggestion
|
|||||||
dotnet_diagnostic.CA2244.severity = suggestion
|
dotnet_diagnostic.CA2244.severity = suggestion
|
||||||
dotnet_diagnostic.CA2245.severity = suggestion
|
dotnet_diagnostic.CA2245.severity = suggestion
|
||||||
dotnet_diagnostic.CA2246.severity = suggestion
|
dotnet_diagnostic.CA2246.severity = suggestion
|
||||||
|
dotnet_diagnostic.CA2254.severity = suggestion
|
||||||
dotnet_diagnostic.CA3061.severity = suggestion
|
dotnet_diagnostic.CA3061.severity = suggestion
|
||||||
dotnet_diagnostic.CA3075.severity = suggestion
|
dotnet_diagnostic.CA3075.severity = suggestion
|
||||||
dotnet_diagnostic.CA3076.severity = suggestion
|
dotnet_diagnostic.CA3076.severity = suggestion
|
||||||
@@ -259,6 +254,7 @@ dotnet_diagnostic.CA5385.severity = suggestion
|
|||||||
dotnet_diagnostic.CA5392.severity = suggestion
|
dotnet_diagnostic.CA5392.severity = suggestion
|
||||||
dotnet_diagnostic.CA5394.severity = suggestion
|
dotnet_diagnostic.CA5394.severity = suggestion
|
||||||
dotnet_diagnostic.CA5397.severity = suggestion
|
dotnet_diagnostic.CA5397.severity = suggestion
|
||||||
|
dotnet_diagnostic.CA5401.severity = suggestion
|
||||||
|
|
||||||
dotnet_diagnostic.SYSLIB0014.severity = none
|
dotnet_diagnostic.SYSLIB0014.severity = none
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ body:
|
|||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
attributes:
|
attributes:
|
||||||
label: Is there an existing issue for this?
|
label: Is there an existing issue for this?
|
||||||
description: Please search to see if an issue already exists for the bug you encountered.
|
description: Please search to see if an open or closed issue already exists for the bug you encountered. If a bug exists and is closed note that it may only be fixed in an unstable branch.
|
||||||
options:
|
options:
|
||||||
- label: I have searched the existing issues
|
- label: I have searched the existing open and closed issues
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ body:
|
|||||||
- type: checkboxes
|
- type: checkboxes
|
||||||
attributes:
|
attributes:
|
||||||
label: Is there an existing issue for this?
|
label: Is there an existing issue for this?
|
||||||
description: Please search to see if an issue already exists for the feature you are requesting.
|
description: Please search to see if an open or closed issue already exists for the feature you are requesting. If a request exists and is closed note that it may only be fixed in an unstable branch.
|
||||||
options:
|
options:
|
||||||
- label: I have searched the existing issues
|
- label: I have searched the existing open and closed issues
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
|
|||||||
@@ -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\\Prowlarr"
|
|
||||||
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\\Prowlarr"
|
|
||||||
ado_wit: "User Story"
|
|
||||||
ado_new_state: "New"
|
|
||||||
ado_active_state: "Active"
|
|
||||||
ado_close_state: "Closed"
|
|
||||||
ado_bypassrules: true
|
|
||||||
log_level: 100
|
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
We as members, contributors, and leaders pledge to make participation in our
|
||||||
|
community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||||
|
identity and expression, level of experience, education, socio-economic status,
|
||||||
|
nationality, personal appearance, race, caste, color, religion, or sexual
|
||||||
|
identity and orientation.
|
||||||
|
|
||||||
|
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||||
|
diverse, inclusive, and healthy community.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to a positive environment for our
|
||||||
|
community include:
|
||||||
|
|
||||||
|
* Demonstrating empathy and kindness toward other people
|
||||||
|
* Being respectful of differing opinions, viewpoints, and experiences
|
||||||
|
* Giving and gracefully accepting constructive feedback
|
||||||
|
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||||
|
and learning from the experience
|
||||||
|
* Focusing on what is best not just for us as individuals, but for the overall
|
||||||
|
community
|
||||||
|
|
||||||
|
Examples of unacceptable behavior include:
|
||||||
|
|
||||||
|
* The use of sexualized language or imagery, and sexual attention or advances of
|
||||||
|
any kind
|
||||||
|
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||||
|
* Public or private harassment
|
||||||
|
* Publishing others' private information, such as a physical or email address,
|
||||||
|
without their explicit permission
|
||||||
|
* Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Enforcement Responsibilities
|
||||||
|
|
||||||
|
Community leaders are responsible for clarifying and enforcing our standards of
|
||||||
|
acceptable behavior and will take appropriate and fair corrective action in
|
||||||
|
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||||
|
or harmful.
|
||||||
|
|
||||||
|
Community leaders have the right and responsibility to remove, edit, or reject
|
||||||
|
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||||
|
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||||
|
decisions when appropriate.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all community spaces, and also applies when
|
||||||
|
an individual is officially representing the community in public spaces.
|
||||||
|
Examples of representing our community include using an official e-mail address,
|
||||||
|
posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported to the community leaders responsible for enforcement at
|
||||||
|
<development@prowlarr.com>.
|
||||||
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
reporter of any incident.
|
||||||
|
|
||||||
|
## Enforcement Guidelines
|
||||||
|
|
||||||
|
Community leaders will follow these Community Impact Guidelines in determining
|
||||||
|
the consequences for any action they deem in violation of this Code of Conduct:
|
||||||
|
|
||||||
|
### 1. Correction
|
||||||
|
|
||||||
|
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||||
|
unprofessional or unwelcome in the community.
|
||||||
|
|
||||||
|
**Consequence**: A private, written warning from community leaders, providing
|
||||||
|
clarity around the nature of the violation and an explanation of why the
|
||||||
|
behavior was inappropriate. A public apology may be requested.
|
||||||
|
|
||||||
|
### 2. Warning
|
||||||
|
|
||||||
|
**Community Impact**: A violation through a single incident or series of
|
||||||
|
actions.
|
||||||
|
|
||||||
|
**Consequence**: A warning with consequences for continued behavior. No
|
||||||
|
interaction with the people involved, including unsolicited interaction with
|
||||||
|
those enforcing the Code of Conduct, for a specified period of time. This
|
||||||
|
includes avoiding interactions in community spaces as well as external channels
|
||||||
|
like social media. Violating these terms may lead to a temporary or permanent
|
||||||
|
ban.
|
||||||
|
|
||||||
|
### 3. Temporary Ban
|
||||||
|
|
||||||
|
**Community Impact**: A serious violation of community standards, including
|
||||||
|
sustained inappropriate behavior.
|
||||||
|
|
||||||
|
**Consequence**: A temporary ban from any sort of interaction or public
|
||||||
|
communication with the community for a specified period of time. No public or
|
||||||
|
private interaction with the people involved, including unsolicited interaction
|
||||||
|
with those enforcing the Code of Conduct, is allowed during this period.
|
||||||
|
Violating these terms may lead to a permanent ban.
|
||||||
|
|
||||||
|
### 4. Permanent Ban
|
||||||
|
|
||||||
|
**Community Impact**: Demonstrating a pattern of violation of community
|
||||||
|
standards, including sustained inappropriate behavior, harassment of an
|
||||||
|
individual, or aggression toward or disparagement of classes of individuals.
|
||||||
|
|
||||||
|
**Consequence**: A permanent ban from any sort of public interaction within the
|
||||||
|
community.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 2.1, available at
|
||||||
|
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
||||||
|
|
||||||
|
Community Impact Guidelines were inspired by
|
||||||
|
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see the FAQ at
|
||||||
|
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
|
||||||
|
[https://www.contributor-covenant.org/translations][translations].
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
||||||
|
[Mozilla CoC]: https://github.com/mozilla/diversity
|
||||||
|
[FAQ]: https://www.contributor-covenant.org/faq
|
||||||
|
[translations]: https://www.contributor-covenant.org/translations
|
||||||
@@ -27,10 +27,7 @@ Prowlarr is an indexer manager/proxy built on the popular \*arr .net/reactjs bas
|
|||||||
|
|
||||||
## Support
|
## Support
|
||||||
|
|
||||||
Note: Prowlarr is currently early in life, thus bugs should be expected
|
|
||||||
|
|
||||||
[](https://wiki.servarr.com/prowlarr)
|
[](https://wiki.servarr.com/prowlarr)
|
||||||
|
|
||||||
[](https://prowlarr.com/discord)
|
[](https://prowlarr.com/discord)
|
||||||
[](https://www.reddit.com/r/Prowlarr)
|
[](https://www.reddit.com/r/Prowlarr)
|
||||||
|
|
||||||
|
|||||||
+230
-78
@@ -7,16 +7,20 @@ variables:
|
|||||||
outputFolder: './_output'
|
outputFolder: './_output'
|
||||||
artifactsFolder: './_artifacts'
|
artifactsFolder: './_artifacts'
|
||||||
testsFolder: './_tests'
|
testsFolder: './_tests'
|
||||||
majorVersion: '0.2.0'
|
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||||
|
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||||
|
majorVersion: '1.3.1'
|
||||||
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.201'
|
dotnetVersion: '6.0.405'
|
||||||
innoVersion: '6.2.0'
|
innoVersion: '6.2.0'
|
||||||
nodeVersion: '16.x'
|
nodeVersion: '16.x'
|
||||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
windowsImage: 'windows-2022'
|
||||||
|
linuxImage: 'ubuntu-20.04'
|
||||||
|
macImage: 'macOS-11'
|
||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
branches:
|
branches:
|
||||||
@@ -40,7 +44,7 @@ stages:
|
|||||||
- job:
|
- job:
|
||||||
displayName: Build Variables
|
displayName: Build Variables
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'ubuntu-18.04'
|
vmImage: ${{ variables.linuxImage }}
|
||||||
steps:
|
steps:
|
||||||
# Set the build name properly. The 'name' property won't recursively expand so hack here:
|
# Set the build name properly. The 'name' property won't recursively expand so hack here:
|
||||||
- bash: echo "##vso[build.updatebuildnumber]$PROWLARRVERSION"
|
- bash: echo "##vso[build.updatebuildnumber]$PROWLARRVERSION"
|
||||||
@@ -66,15 +70,15 @@ stages:
|
|||||||
matrix:
|
matrix:
|
||||||
Linux:
|
Linux:
|
||||||
osName: 'Linux'
|
osName: 'Linux'
|
||||||
imageName: 'ubuntu-18.04'
|
imageName: ${{ variables.linuxImage }}
|
||||||
enableAnalysis: 'true'
|
enableAnalysis: 'true'
|
||||||
Mac:
|
Mac:
|
||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
imageName: 'macos-10.15'
|
imageName: ${{ variables.macImage }}
|
||||||
enableAnalysis: 'false'
|
enableAnalysis: 'false'
|
||||||
Windows:
|
Windows:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
imageName: 'windows-2019'
|
imageName: ${{ variables.windowsImage }}
|
||||||
enableAnalysis: 'false'
|
enableAnalysis: 'false'
|
||||||
|
|
||||||
pool:
|
pool:
|
||||||
@@ -93,15 +97,14 @@ stages:
|
|||||||
- bash: |
|
- bash: |
|
||||||
BUNDLEDVERSIONS=${AGENT_TOOLSDIRECTORY}/dotnet/sdk/${DOTNETVERSION}/Microsoft.NETCoreSdk.BundledVersions.props
|
BUNDLEDVERSIONS=${AGENT_TOOLSDIRECTORY}/dotnet/sdk/${DOTNETVERSION}/Microsoft.NETCoreSdk.BundledVersions.props
|
||||||
echo $BUNDLEDVERSIONS
|
echo $BUNDLEDVERSIONS
|
||||||
grep osx-x64 $BUNDLEDVERSIONS
|
|
||||||
if grep -q freebsd-x64 $BUNDLEDVERSIONS; then
|
if grep -q freebsd-x64 $BUNDLEDVERSIONS; then
|
||||||
echo "BSD already enabled"
|
echo "Extra platforms already enabled"
|
||||||
else
|
else
|
||||||
echo "Enabling BSD support"
|
echo "Enabling extra platform support"
|
||||||
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64/' $BUNDLEDVERSIONS
|
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64;linux-x86/' $BUNDLEDVERSIONS
|
||||||
fi
|
fi
|
||||||
displayName: Enable FreeBSD Support
|
displayName: Enable Extra Platform Support
|
||||||
- bash: ./build.sh --backend --enable-bsd
|
- bash: ./build.sh --backend --enable-extra-platforms
|
||||||
displayName: Build Prowlarr Backend
|
displayName: Build Prowlarr Backend
|
||||||
- bash: |
|
- bash: |
|
||||||
find ${OUTPUTFOLDER} -type f ! -path "*/publish/*" -exec rm -rf {} \;
|
find ${OUTPUTFOLDER} -type f ! -path "*/publish/*" -exec rm -rf {} \;
|
||||||
@@ -115,24 +118,28 @@ stages:
|
|||||||
displayName: Publish Backend
|
displayName: Publish Backend
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net6.0/win-x64/publish'
|
- publish: '$(testsFolder)/net6.0/win-x64/publish'
|
||||||
artifact: WindowsCoreTests
|
artifact: win-x64-tests
|
||||||
displayName: Publish Windows Test Package
|
displayName: Publish win-x64 Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net6.0/linux-x64/publish'
|
- publish: '$(testsFolder)/net6.0/linux-x64/publish'
|
||||||
artifact: LinuxCoreTests
|
artifact: linux-x64-tests
|
||||||
displayName: Publish Linux Test Package
|
displayName: Publish linux-x64 Test Package
|
||||||
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
|
- publish: '$(testsFolder)/net6.0/linux-x86/publish'
|
||||||
|
artifact: linux-x86-tests
|
||||||
|
displayName: Publish linux-x86 Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net6.0/linux-musl-x64/publish'
|
- publish: '$(testsFolder)/net6.0/linux-musl-x64/publish'
|
||||||
artifact: LinuxMuslCoreTests
|
artifact: linux-musl-x64-tests
|
||||||
displayName: Publish Linux Musl Test Package
|
displayName: Publish linux-musl-x64 Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net6.0/freebsd-x64/publish'
|
- publish: '$(testsFolder)/net6.0/freebsd-x64/publish'
|
||||||
artifact: FreebsdCoreTests
|
artifact: freebsd-x64-tests
|
||||||
displayName: Publish FreeBSD Test Package
|
displayName: Publish freebsd-x64 Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
- publish: '$(testsFolder)/net6.0/osx-x64/publish'
|
- publish: '$(testsFolder)/net6.0/osx-x64/publish'
|
||||||
artifact: MacCoreTests
|
artifact: osx-x64-tests
|
||||||
displayName: Publish MacOS Test Package
|
displayName: Publish osx-x64 Test Package
|
||||||
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
condition: and(succeeded(), eq(variables['osName'], 'Windows'))
|
||||||
|
|
||||||
- stage: Build_Frontend
|
- stage: Build_Frontend
|
||||||
@@ -144,13 +151,13 @@ stages:
|
|||||||
matrix:
|
matrix:
|
||||||
Linux:
|
Linux:
|
||||||
osName: 'Linux'
|
osName: 'Linux'
|
||||||
imageName: 'ubuntu-18.04'
|
imageName: ${{ variables.linuxImage }}
|
||||||
Mac:
|
Mac:
|
||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
imageName: 'macos-10.15'
|
imageName: ${{ variables.macImage }}
|
||||||
Windows:
|
Windows:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
imageName: 'windows-2019'
|
imageName: ${{ variables.windowsImage }}
|
||||||
pool:
|
pool:
|
||||||
vmImage: $(imageName)
|
vmImage: $(imageName)
|
||||||
steps:
|
steps:
|
||||||
@@ -186,7 +193,7 @@ stages:
|
|||||||
- job: Windows_Installer
|
- job: Windows_Installer
|
||||||
displayName: Create Installer
|
displayName: Create Installer
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'windows-2019'
|
vmImage: ${{ variables.windowsImage }}
|
||||||
steps:
|
steps:
|
||||||
- checkout: self
|
- checkout: self
|
||||||
fetchDepth: 1
|
fetchDepth: 1
|
||||||
@@ -219,7 +226,7 @@ stages:
|
|||||||
- job: Other_Packages
|
- job: Other_Packages
|
||||||
displayName: Create Standard Packages
|
displayName: Create Standard Packages
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'ubuntu-18.04'
|
vmImage: ${{ variables.linuxImage }}
|
||||||
steps:
|
steps:
|
||||||
- checkout: self
|
- checkout: self
|
||||||
fetchDepth: 1
|
fetchDepth: 1
|
||||||
@@ -235,35 +242,35 @@ stages:
|
|||||||
artifactName: WindowsFrontend
|
artifactName: WindowsFrontend
|
||||||
targetPath: _output
|
targetPath: _output
|
||||||
displayName: Fetch Frontend
|
displayName: Fetch Frontend
|
||||||
- bash: ./build.sh --packages --enable-bsd
|
- bash: ./build.sh --packages --enable-extra-platforms
|
||||||
displayName: Create Packages
|
displayName: Create Packages
|
||||||
- bash: |
|
- bash: |
|
||||||
find . -name "Prowlarr" -exec chmod a+x {} \;
|
find . -name "Prowlarr" -exec chmod a+x {} \;
|
||||||
find . -name "Prowlarr.Update" -exec chmod a+x {} \;
|
find . -name "Prowlarr.Update" -exec chmod a+x {} \;
|
||||||
displayName: Set executable bits
|
displayName: Set executable bits
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create Windows Core zip
|
displayName: Create win-x64 zip
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x64.zip'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x64.zip'
|
||||||
archiveType: 'zip'
|
archiveType: 'zip'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/win-x64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/win-x64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create Windows x86 Core zip
|
displayName: Create win-x86 zip
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x86.zip'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).windows-core-x86.zip'
|
||||||
archiveType: 'zip'
|
archiveType: 'zip'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/win-x86/net6.0
|
rootFolderOrFile: $(artifactsFolder)/win-x86/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create MacOS x64 Core app
|
displayName: Create osx-x64 app
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-x64.zip'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-x64.zip'
|
||||||
archiveType: 'zip'
|
archiveType: 'zip'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net6.0
|
rootFolderOrFile: $(artifactsFolder)/osx-x64-app/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create MacOS x64 Core tar
|
displayName: Create osx-x64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-core-x64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-core-x64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -271,14 +278,14 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/osx-x64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create MacOS arm64 Core app
|
displayName: Create osx-arm64 app
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-arm64.zip'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-app-core-arm64.zip'
|
||||||
archiveType: 'zip'
|
archiveType: 'zip'
|
||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net6.0
|
rootFolderOrFile: $(artifactsFolder)/osx-arm64-app/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create MacOS arm64 Core tar
|
displayName: Create osx-arm64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-core-arm64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).osx-core-arm64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -286,7 +293,7 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/osx-arm64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create Linux Core tar
|
displayName: Create linux-x64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-core-x64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-core-x64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -294,7 +301,7 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/linux-x64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create Linux Musl Core tar
|
displayName: Create linux-musl-x64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-musl-core-x64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-musl-core-x64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -302,7 +309,15 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/linux-musl-x64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create ARM32 Linux Core tar
|
displayName: Create linux-x86 tar
|
||||||
|
inputs:
|
||||||
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-core-x86.tar.gz'
|
||||||
|
archiveType: 'tar'
|
||||||
|
tarCompression: 'gz'
|
||||||
|
includeRootFolder: false
|
||||||
|
rootFolderOrFile: $(artifactsFolder)/linux-x86/net6.0
|
||||||
|
- task: ArchiveFiles@2
|
||||||
|
displayName: Create linux-arm tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-core-arm.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-core-arm.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -310,7 +325,7 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0
|
rootFolderOrFile: $(artifactsFolder)/linux-arm/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create ARM32 Linux Musl Core tar
|
displayName: Create linux-musl-arm tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-musl-core-arm.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-musl-core-arm.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -318,7 +333,7 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0
|
rootFolderOrFile: $(artifactsFolder)/linux-musl-arm/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create ARM64 Linux Core tar
|
displayName: Create linux-arm64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-core-arm64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-core-arm64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -326,7 +341,7 @@ stages:
|
|||||||
includeRootFolder: false
|
includeRootFolder: false
|
||||||
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0
|
rootFolderOrFile: $(artifactsFolder)/linux-arm64/net6.0
|
||||||
- task: ArchiveFiles@2
|
- task: ArchiveFiles@2
|
||||||
displayName: Create ARM64 Linux Musl Core tar
|
displayName: Create linux-musl-arm64 tar
|
||||||
inputs:
|
inputs:
|
||||||
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-musl-core-arm64.tar.gz'
|
archiveFile: '$(Build.ArtifactStagingDirectory)/Prowlarr.$(buildName).linux-musl-core-arm64.tar.gz'
|
||||||
archiveType: 'tar'
|
archiveType: 'tar'
|
||||||
@@ -379,7 +394,7 @@ stages:
|
|||||||
jobs:
|
jobs:
|
||||||
- job: Prepare
|
- job: Prepare
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'ubuntu-18.04'
|
vmImage: ${{ variables.linuxImage }}
|
||||||
steps:
|
steps:
|
||||||
- checkout: none
|
- checkout: none
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
@@ -401,22 +416,22 @@ stages:
|
|||||||
matrix:
|
matrix:
|
||||||
MacCore:
|
MacCore:
|
||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
testName: 'MacCore'
|
testName: 'osx-x64'
|
||||||
poolName: 'Azure Pipelines'
|
poolName: 'Azure Pipelines'
|
||||||
imageName: 'macos-10.15'
|
imageName: ${{ variables.macImage }}
|
||||||
WindowsCore:
|
WindowsCore:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
testName: 'WindowsCore'
|
testName: 'win-x64'
|
||||||
poolName: 'Azure Pipelines'
|
poolName: 'Azure Pipelines'
|
||||||
imageName: 'windows-2019'
|
imageName: ${{ variables.windowsImage }}
|
||||||
LinuxCore:
|
LinuxCore:
|
||||||
osName: 'Linux'
|
osName: 'Linux'
|
||||||
testName: 'LinuxCore'
|
testName: 'linux-x64'
|
||||||
poolName: 'Azure Pipelines'
|
poolName: 'Azure Pipelines'
|
||||||
imageName: 'ubuntu-18.04'
|
imageName: ${{ variables.linuxImage }}
|
||||||
FreebsdCore:
|
FreebsdCore:
|
||||||
osName: 'Linux'
|
osName: 'Linux'
|
||||||
testName: 'FreebsdCore'
|
testName: 'freebsd-x64'
|
||||||
poolName: 'FreeBSD'
|
poolName: 'FreeBSD'
|
||||||
imageName:
|
imageName:
|
||||||
|
|
||||||
@@ -435,7 +450,7 @@ stages:
|
|||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
inputs:
|
inputs:
|
||||||
buildType: 'current'
|
buildType: 'current'
|
||||||
artifactName: '$(testName)Tests'
|
artifactName: '$(testName)-tests'
|
||||||
targetPath: $(testsFolder)
|
targetPath: $(testsFolder)
|
||||||
- powershell: Set-Service SCardSvr -StartupType Manual
|
- powershell: Set-Service SCardSvr -StartupType Manual
|
||||||
displayName: Enable Windows Test Service
|
displayName: Enable Windows Test Service
|
||||||
@@ -465,11 +480,15 @@ stages:
|
|||||||
matrix:
|
matrix:
|
||||||
alpine:
|
alpine:
|
||||||
testName: 'Musl Net Core'
|
testName: 'Musl Net Core'
|
||||||
artifactName: LinuxMuslCoreTests
|
artifactName: linux-musl-x64-tests
|
||||||
containerImage: ghcr.io/servarr/testimages:alpine
|
containerImage: ghcr.io/servarr/testimages:alpine
|
||||||
|
linux-x86:
|
||||||
|
testName: 'linux-x86'
|
||||||
|
artifactName: linux-x86-tests
|
||||||
|
containerImage: ghcr.io/servarr/testimages:linux-x86
|
||||||
|
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'ubuntu-18.04'
|
vmImage: ${{ variables.linuxImage }}
|
||||||
|
|
||||||
container: $[ variables['containerImage'] ]
|
container: $[ variables['containerImage'] ]
|
||||||
|
|
||||||
@@ -477,9 +496,15 @@ stages:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- task: UseDotNet@2
|
- task: UseDotNet@2
|
||||||
displayName: 'Install .net core'
|
displayName: 'Install .NET'
|
||||||
inputs:
|
inputs:
|
||||||
version: $(dotnetVersion)
|
version: $(dotnetVersion)
|
||||||
|
condition: and(succeeded(), ne(variables['testName'], 'linux-x86'))
|
||||||
|
- bash: |
|
||||||
|
SDKURL=$(curl -s https://api.github.com/repos/Servarr/dotnet-linux-x86/releases | jq -rc '.[].assets[].browser_download_url' | grep sdk-${DOTNETVERSION}.*gz$)
|
||||||
|
curl -fsSL $SDKURL | tar xzf - -C /opt/dotnet
|
||||||
|
displayName: 'Install .NET'
|
||||||
|
condition: and(succeeded(), eq(variables['testName'], 'linux-x86'))
|
||||||
- checkout: none
|
- checkout: none
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
@@ -502,6 +527,58 @@ stages:
|
|||||||
testResultsFiles: '**/TestResult.xml'
|
testResultsFiles: '**/TestResult.xml'
|
||||||
testRunTitle: '$(testName) Unit Tests'
|
testRunTitle: '$(testName) Unit Tests'
|
||||||
failTaskOnFailedTests: true
|
failTaskOnFailedTests: true
|
||||||
|
|
||||||
|
- job: Unit_LinuxCore_Postgres
|
||||||
|
displayName: Unit Native LinuxCore with Postgres Database
|
||||||
|
dependsOn: Prepare
|
||||||
|
condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0'))
|
||||||
|
variables:
|
||||||
|
pattern: 'Prowlarr.*.linux-core-x64.tar.gz'
|
||||||
|
artifactName: linux-x64-tests
|
||||||
|
Prowlarr__Postgres__Host: 'localhost'
|
||||||
|
Prowlarr__Postgres__Port: '5432'
|
||||||
|
Prowlarr__Postgres__User: 'prowlarr'
|
||||||
|
Prowlarr__Postgres__Password: 'prowlarr'
|
||||||
|
|
||||||
|
pool:
|
||||||
|
vmImage: ${{ variables.linuxImage }}
|
||||||
|
|
||||||
|
timeoutInMinutes: 10
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- task: UseDotNet@2
|
||||||
|
displayName: 'Install .net core'
|
||||||
|
inputs:
|
||||||
|
version: $(dotnetVersion)
|
||||||
|
- checkout: none
|
||||||
|
- task: DownloadPipelineArtifact@2
|
||||||
|
displayName: Download Test Artifact
|
||||||
|
inputs:
|
||||||
|
buildType: 'current'
|
||||||
|
artifactName: $(artifactName)
|
||||||
|
targetPath: $(testsFolder)
|
||||||
|
- bash: find ${TESTSFOLDER} -name "Prowlarr.Test.Dummy" -exec chmod a+x {} \;
|
||||||
|
displayName: Make Test Dummy Executable
|
||||||
|
condition: and(succeeded(), ne(variables['osName'], 'Windows'))
|
||||||
|
- bash: |
|
||||||
|
docker run -d --name=postgres14 \
|
||||||
|
-e POSTGRES_PASSWORD=prowlarr \
|
||||||
|
-e POSTGRES_USER=prowlarr \
|
||||||
|
-p 5432:5432/tcp \
|
||||||
|
postgres:14
|
||||||
|
displayName: Start postgres
|
||||||
|
- bash: |
|
||||||
|
chmod a+x ${TESTSFOLDER}/test.sh
|
||||||
|
ls -lR ${TESTSFOLDER}
|
||||||
|
${TESTSFOLDER}/test.sh Linux Unit Test
|
||||||
|
displayName: Run Tests
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
displayName: Publish Test Results
|
||||||
|
inputs:
|
||||||
|
testResultsFormat: 'NUnit'
|
||||||
|
testResultsFiles: '**/TestResult.xml'
|
||||||
|
testRunTitle: 'LinuxCore Postgres Unit Tests'
|
||||||
|
failTaskOnFailedTests: true
|
||||||
|
|
||||||
- stage: Integration
|
- stage: Integration
|
||||||
displayName: Integration
|
displayName: Integration
|
||||||
@@ -510,7 +587,7 @@ stages:
|
|||||||
jobs:
|
jobs:
|
||||||
- job: Prepare
|
- job: Prepare
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'ubuntu-18.04'
|
vmImage: ${{ variables.linuxImage }}
|
||||||
steps:
|
steps:
|
||||||
- checkout: none
|
- checkout: none
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
@@ -529,18 +606,18 @@ stages:
|
|||||||
matrix:
|
matrix:
|
||||||
MacCore:
|
MacCore:
|
||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
testName: 'MacCore'
|
testName: 'osx-x64'
|
||||||
imageName: 'macos-10.15'
|
imageName: ${{ variables.macImage }}
|
||||||
pattern: 'Prowlarr.*.osx-core-x64.tar.gz'
|
pattern: 'Prowlarr.*.osx-core-x64.tar.gz'
|
||||||
WindowsCore:
|
WindowsCore:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
testName: 'WindowsCore'
|
testName: 'win-x64'
|
||||||
imageName: 'windows-2019'
|
imageName: ${{ variables.windowsImage }}
|
||||||
pattern: 'Prowlarr.*.windows-core-x64.zip'
|
pattern: 'Prowlarr.*.windows-core-x64.zip'
|
||||||
LinuxCore:
|
LinuxCore:
|
||||||
osName: 'Linux'
|
osName: 'Linux'
|
||||||
testName: 'LinuxCore'
|
testName: 'linux-x64'
|
||||||
imageName: 'ubuntu-18.04'
|
imageName: ${{ variables.linuxImage }}
|
||||||
pattern: 'Prowlarr.*.linux-core-x64.tar.gz'
|
pattern: 'Prowlarr.*.linux-core-x64.tar.gz'
|
||||||
|
|
||||||
pool:
|
pool:
|
||||||
@@ -556,7 +633,7 @@ stages:
|
|||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
inputs:
|
inputs:
|
||||||
buildType: 'current'
|
buildType: 'current'
|
||||||
artifactName: '$(testName)Tests'
|
artifactName: '$(testName)-tests'
|
||||||
targetPath: $(testsFolder)
|
targetPath: $(testsFolder)
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
displayName: Download Build Artifact
|
displayName: Download Build Artifact
|
||||||
@@ -586,6 +663,67 @@ stages:
|
|||||||
failTaskOnFailedTests: true
|
failTaskOnFailedTests: true
|
||||||
displayName: Publish Test Results
|
displayName: Publish Test Results
|
||||||
|
|
||||||
|
- job: Integration_LinuxCore_Postgres
|
||||||
|
displayName: Integration Native LinuxCore with Postgres Database
|
||||||
|
dependsOn: Prepare
|
||||||
|
condition: and(succeeded(), eq(dependencies.Prepare.outputs['setVar.backendNotUpdated'], '0'))
|
||||||
|
variables:
|
||||||
|
pattern: 'Prowlarr.*.linux-core-x64.tar.gz'
|
||||||
|
Prowlarr__Postgres__Host: 'localhost'
|
||||||
|
Prowlarr__Postgres__Port: '5432'
|
||||||
|
Prowlarr__Postgres__User: 'prowlarr'
|
||||||
|
Prowlarr__Postgres__Password: 'prowlarr'
|
||||||
|
|
||||||
|
pool:
|
||||||
|
vmImage: ${{ variables.linuxImage }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- task: UseDotNet@2
|
||||||
|
displayName: 'Install .net core'
|
||||||
|
inputs:
|
||||||
|
version: $(dotnetVersion)
|
||||||
|
- checkout: none
|
||||||
|
- task: DownloadPipelineArtifact@2
|
||||||
|
displayName: Download Test Artifact
|
||||||
|
inputs:
|
||||||
|
buildType: 'current'
|
||||||
|
artifactName: 'linux-x64-tests'
|
||||||
|
targetPath: $(testsFolder)
|
||||||
|
- task: DownloadPipelineArtifact@2
|
||||||
|
displayName: Download Build Artifact
|
||||||
|
inputs:
|
||||||
|
buildType: 'current'
|
||||||
|
artifactName: Packages
|
||||||
|
itemPattern: '**/$(pattern)'
|
||||||
|
targetPath: $(Build.ArtifactStagingDirectory)
|
||||||
|
- task: ExtractFiles@1
|
||||||
|
inputs:
|
||||||
|
archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/**/$(pattern)'
|
||||||
|
destinationFolder: '$(Build.ArtifactStagingDirectory)/bin'
|
||||||
|
displayName: Extract Package
|
||||||
|
- bash: |
|
||||||
|
mkdir -p ./bin/
|
||||||
|
cp -r -v ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin/Prowlarr/. ./bin/
|
||||||
|
displayName: Move Package Contents
|
||||||
|
- bash: |
|
||||||
|
docker run -d --name=postgres14 \
|
||||||
|
-e POSTGRES_PASSWORD=prowlarr \
|
||||||
|
-e POSTGRES_USER=prowlarr \
|
||||||
|
-p 5432:5432/tcp \
|
||||||
|
postgres:14
|
||||||
|
displayName: Start postgres
|
||||||
|
- bash: |
|
||||||
|
chmod a+x ${TESTSFOLDER}/test.sh
|
||||||
|
${TESTSFOLDER}/test.sh Linux Integration Test
|
||||||
|
displayName: Run Integration Tests
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
inputs:
|
||||||
|
testResultsFormat: 'NUnit'
|
||||||
|
testResultsFiles: '**/TestResult.xml'
|
||||||
|
testRunTitle: 'Integration LinuxCore Postgres Database Integration Tests'
|
||||||
|
failTaskOnFailedTests: true
|
||||||
|
displayName: Publish Test Results
|
||||||
|
|
||||||
- job: Integration_FreeBSD
|
- job: Integration_FreeBSD
|
||||||
displayName: Integration Native FreeBSD
|
displayName: Integration Native FreeBSD
|
||||||
dependsOn: Prepare
|
dependsOn: Prepare
|
||||||
@@ -603,14 +741,14 @@ stages:
|
|||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
inputs:
|
inputs:
|
||||||
buildType: 'current'
|
buildType: 'current'
|
||||||
artifactName: 'FreebsdCoreTests'
|
artifactName: 'freebsd-x64-tests'
|
||||||
targetPath: $(testsFolder)
|
targetPath: $(testsFolder)
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
displayName: Download Build Artifact
|
displayName: Download Build Artifact
|
||||||
inputs:
|
inputs:
|
||||||
buildType: 'current'
|
buildType: 'current'
|
||||||
artifactName: Packages
|
artifactName: Packages
|
||||||
itemPattern: '/$(pattern)'
|
itemPattern: '**/$(pattern)'
|
||||||
targetPath: $(Build.ArtifactStagingDirectory)
|
targetPath: $(Build.ArtifactStagingDirectory)
|
||||||
- bash: |
|
- bash: |
|
||||||
mkdir -p ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin
|
mkdir -p ${BUILD_ARTIFACTSTAGINGDIRECTORY}/bin
|
||||||
@@ -639,13 +777,17 @@ stages:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
alpine:
|
alpine:
|
||||||
testName: 'Musl Net Core'
|
testName: 'linux-musl-x64'
|
||||||
artifactName: LinuxMuslCoreTests
|
artifactName: linux-musl-x64-tests
|
||||||
containerImage: ghcr.io/servarr/testimages:alpine
|
containerImage: ghcr.io/servarr/testimages:alpine
|
||||||
pattern: 'Prowlarr.*.linux-musl-core-x64.tar.gz'
|
pattern: 'Prowlarr.*.linux-musl-core-x64.tar.gz'
|
||||||
|
linux-x86:
|
||||||
|
testName: 'linux-x86'
|
||||||
|
artifactName: linux-x86-tests
|
||||||
|
containerImage: ghcr.io/servarr/testimages:linux-x86
|
||||||
|
pattern: 'Prowlarr.*.linux-core-x86.tar.gz'
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'ubuntu-18.04'
|
vmImage: ${{ variables.linuxImage }}
|
||||||
|
|
||||||
container: $[ variables['containerImage'] ]
|
container: $[ variables['containerImage'] ]
|
||||||
|
|
||||||
@@ -653,9 +795,15 @@ stages:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- task: UseDotNet@2
|
- task: UseDotNet@2
|
||||||
displayName: 'Install .net core'
|
displayName: 'Install .NET'
|
||||||
inputs:
|
inputs:
|
||||||
version: $(dotnetVersion)
|
version: $(dotnetVersion)
|
||||||
|
condition: and(succeeded(), ne(variables['testName'], 'linux-x86'))
|
||||||
|
- bash: |
|
||||||
|
SDKURL=$(curl -s https://api.github.com/repos/Servarr/dotnet-linux-x86/releases | jq -rc '.[].assets[].browser_download_url' | grep sdk-${DOTNETVERSION}.*gz$)
|
||||||
|
curl -fsSL $SDKURL | tar xzf - -C /opt/dotnet
|
||||||
|
displayName: 'Install .NET'
|
||||||
|
condition: and(succeeded(), eq(variables['testName'], 'linux-x86'))
|
||||||
- checkout: none
|
- checkout: none
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
@@ -701,17 +849,20 @@ stages:
|
|||||||
matrix:
|
matrix:
|
||||||
Linux:
|
Linux:
|
||||||
osName: 'Linux'
|
osName: 'Linux'
|
||||||
imageName: 'ubuntu-18.04'
|
artifactName: 'linux-x64'
|
||||||
|
imageName: ${{ variables.linuxImage }}
|
||||||
pattern: 'Prowlarr.*.linux-core-x64.tar.gz'
|
pattern: 'Prowlarr.*.linux-core-x64.tar.gz'
|
||||||
failBuild: true
|
failBuild: true
|
||||||
Mac:
|
Mac:
|
||||||
osName: 'Mac'
|
osName: 'Mac'
|
||||||
imageName: 'macos-10.15'
|
artifactName: 'osx-x64'
|
||||||
|
imageName: ${{ variables.macImage }}
|
||||||
pattern: 'Prowlarr.*.osx-core-x64.tar.gz'
|
pattern: 'Prowlarr.*.osx-core-x64.tar.gz'
|
||||||
failBuild: true
|
failBuild: true
|
||||||
Windows:
|
Windows:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
imageName: 'windows-2019'
|
artifactName: 'win-x64'
|
||||||
|
imageName: ${{ variables.windowsImage }}
|
||||||
pattern: 'Prowlarr.*.windows-core-x64.zip'
|
pattern: 'Prowlarr.*.windows-core-x64.zip'
|
||||||
failBuild: true
|
failBuild: true
|
||||||
|
|
||||||
@@ -728,7 +879,7 @@ stages:
|
|||||||
displayName: Download Test Artifact
|
displayName: Download Test Artifact
|
||||||
inputs:
|
inputs:
|
||||||
buildType: 'current'
|
buildType: 'current'
|
||||||
artifactName: '$(osName)CoreTests'
|
artifactName: '$(artifactName)-tests'
|
||||||
targetPath: $(testsFolder)
|
targetPath: $(testsFolder)
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
displayName: Download Build Artifact
|
displayName: Download Build Artifact
|
||||||
@@ -777,7 +928,7 @@ stages:
|
|||||||
jobs:
|
jobs:
|
||||||
- job: Prepare
|
- job: Prepare
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'ubuntu-18.04'
|
vmImage: ${{ variables.linuxImage }}
|
||||||
steps:
|
steps:
|
||||||
- checkout: none
|
- checkout: none
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
@@ -794,10 +945,10 @@ stages:
|
|||||||
matrix:
|
matrix:
|
||||||
Linux:
|
Linux:
|
||||||
osName: 'Linux'
|
osName: 'Linux'
|
||||||
imageName: 'ubuntu-18.04'
|
imageName: ${{ variables.linuxImage }}
|
||||||
Windows:
|
Windows:
|
||||||
osName: 'Windows'
|
osName: 'Windows'
|
||||||
imageName: 'windows-2019'
|
imageName: ${{ variables.windowsImage }}
|
||||||
pool:
|
pool:
|
||||||
vmImage: $(imageName)
|
vmImage: $(imageName)
|
||||||
steps:
|
steps:
|
||||||
@@ -832,7 +983,7 @@ stages:
|
|||||||
)
|
)
|
||||||
|
|
||||||
pool:
|
pool:
|
||||||
vmImage: windows-2019
|
vmImage: ${{ variables.windowsImage }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- task: UseDotNet@2
|
- task: UseDotNet@2
|
||||||
@@ -884,7 +1035,7 @@ stages:
|
|||||||
EnableAnalyzers: 'false'
|
EnableAnalyzers: 'false'
|
||||||
|
|
||||||
pool:
|
pool:
|
||||||
vmImage: windows-2019
|
vmImage: ${{ variables.windowsImage }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- task: UseDotNet@2
|
- task: UseDotNet@2
|
||||||
@@ -941,7 +1092,7 @@ stages:
|
|||||||
- job:
|
- job:
|
||||||
displayName: Discord Notification
|
displayName: Discord Notification
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'ubuntu-18.04'
|
vmImage: ${{ variables.linuxImage }}
|
||||||
steps:
|
steps:
|
||||||
- task: DownloadPipelineArtifact@2
|
- task: DownloadPipelineArtifact@2
|
||||||
continueOnError: true
|
continueOnError: true
|
||||||
@@ -957,4 +1108,5 @@ stages:
|
|||||||
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
|
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
|
||||||
DISCORDCHANNELID: $(discordChannelId)
|
DISCORDCHANNELID: $(discordChannelId)
|
||||||
DISCORDWEBHOOKKEY: $(discordWebhookKey)
|
DISCORDWEBHOOKKEY: $(discordWebhookKey)
|
||||||
|
DISCORDTHREADID: $(discordThreadId)
|
||||||
|
|
||||||
|
|||||||
@@ -25,15 +25,22 @@ UpdateVersionNumber()
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
EnableBsdSupport()
|
EnableExtraPlatformsInSDK()
|
||||||
{
|
{
|
||||||
#todo enable sdk with
|
SDK_PATH=$(dotnet --list-sdks | grep -P '6\.\d\.\d+' | head -1 | sed 's/\(6\.[0-9]*\.[0-9]*\).*\[\(.*\)\]/\2\/\1/g')
|
||||||
#SDK_PATH=$(dotnet --list-sdks | grep -P '5\.\d\.\d+' | head -1 | sed 's/\(5\.[0-9]*\.[0-9]*\).*\[\(.*\)\]/\2\/\1/g')
|
BUNDLEDVERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props"
|
||||||
# BUNDLED_VERSIONS="${SDK_PATH}/Microsoft.NETCoreSdk.BundledVersions.props"
|
if grep -q freebsd-x64 $BUNDLEDVERSIONS; then
|
||||||
|
echo "Extra platforms already enabled"
|
||||||
|
else
|
||||||
|
echo "Enabling extra platform support"
|
||||||
|
sed -i.ORI 's/osx-x64/osx-x64;freebsd-x64;linux-x86/' $BUNDLEDVERSIONS
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
EnableExtraPlatforms()
|
||||||
|
{
|
||||||
if grep -qv freebsd-x64 src/Directory.Build.props; then
|
if grep -qv freebsd-x64 src/Directory.Build.props; then
|
||||||
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64</RuntimeIdentifiers>^g" src/Directory.Build.props
|
sed -i'' -e "s^<RuntimeIdentifiers>\(.*\)</RuntimeIdentifiers>^<RuntimeIdentifiers>\1;freebsd-x64;linux-x86</RuntimeIdentifiers>^g" src/Directory.Build.props
|
||||||
sed -i'' -e "s^<ExcludedRuntimeFrameworkPairs>\(.*\)</ExcludedRuntimeFrameworkPairs>^<ExcludedRuntimeFrameworkPairs>\1;freebsd-x64:net472</ExcludedRuntimeFrameworkPairs>^g" src/Directory.Build.props
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,7 +300,8 @@ if [ $# -eq 0 ]; then
|
|||||||
PACKAGES=YES
|
PACKAGES=YES
|
||||||
INSTALLER=NO
|
INSTALLER=NO
|
||||||
LINT=YES
|
LINT=YES
|
||||||
ENABLE_BSD=NO
|
ENABLE_EXTRA_PLATFORMS=NO
|
||||||
|
ENABLE_EXTRA_PLATFORMS_IN_SDK=NO
|
||||||
fi
|
fi
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]
|
while [[ $# -gt 0 ]]
|
||||||
@@ -305,8 +313,12 @@ case $key in
|
|||||||
BACKEND=YES
|
BACKEND=YES
|
||||||
shift # past argument
|
shift # past argument
|
||||||
;;
|
;;
|
||||||
--enable-bsd)
|
--enable-bsd|--enable-extra-platforms)
|
||||||
ENABLE_BSD=YES
|
ENABLE_EXTRA_PLATFORMS=YES
|
||||||
|
shift # past argument
|
||||||
|
;;
|
||||||
|
--enable-extra-platforms-in-sdk)
|
||||||
|
ENABLE_EXTRA_PLATFORMS_IN_SDK=YES
|
||||||
shift # past argument
|
shift # past argument
|
||||||
;;
|
;;
|
||||||
-r|--runtime)
|
-r|--runtime)
|
||||||
@@ -350,12 +362,17 @@ esac
|
|||||||
done
|
done
|
||||||
set -- "${POSITIONAL[@]}" # restore positional parameters
|
set -- "${POSITIONAL[@]}" # restore positional parameters
|
||||||
|
|
||||||
|
if [ "$ENABLE_EXTRA_PLATFORMS_IN_SDK" = "YES" ];
|
||||||
|
then
|
||||||
|
EnableExtraPlatformsInSDK
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$BACKEND" = "YES" ];
|
if [ "$BACKEND" = "YES" ];
|
||||||
then
|
then
|
||||||
UpdateVersionNumber
|
UpdateVersionNumber
|
||||||
if [ "$ENABLE_BSD" = "YES" ];
|
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
|
||||||
then
|
then
|
||||||
EnableBsdSupport
|
EnableExtraPlatforms
|
||||||
fi
|
fi
|
||||||
Build
|
Build
|
||||||
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
|
if [[ -z "$RID" || -z "$FRAMEWORK" ]];
|
||||||
@@ -365,9 +382,10 @@ then
|
|||||||
PackageTests "net6.0" "linux-x64"
|
PackageTests "net6.0" "linux-x64"
|
||||||
PackageTests "net6.0" "linux-musl-x64"
|
PackageTests "net6.0" "linux-musl-x64"
|
||||||
PackageTests "net6.0" "osx-x64"
|
PackageTests "net6.0" "osx-x64"
|
||||||
if [ "$ENABLE_BSD" = "YES" ];
|
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
|
||||||
then
|
then
|
||||||
PackageTests "net6.0" "freebsd-x64"
|
PackageTests "net6.0" "freebsd-x64"
|
||||||
|
PackageTests "net6.0" "linux-x86"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
PackageTests "$FRAMEWORK" "$RID"
|
PackageTests "$FRAMEWORK" "$RID"
|
||||||
@@ -406,9 +424,10 @@ then
|
|||||||
Package "net6.0" "linux-musl-arm"
|
Package "net6.0" "linux-musl-arm"
|
||||||
Package "net6.0" "osx-x64"
|
Package "net6.0" "osx-x64"
|
||||||
Package "net6.0" "osx-arm64"
|
Package "net6.0" "osx-arm64"
|
||||||
if [ "$ENABLE_BSD" = "YES" ];
|
if [ "$ENABLE_EXTRA_PLATFORMS" = "YES" ];
|
||||||
then
|
then
|
||||||
Package "net6.0" "freebsd-x64"
|
Package "net6.0" "freebsd-x64"
|
||||||
|
Package "net6.0" "linux-x86"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
Package "$FRAMEWORK" "$RID"
|
Package "$FRAMEWORK" "$RID"
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ module.exports = {
|
|||||||
plugins: [
|
plugins: [
|
||||||
'filenames',
|
'filenames',
|
||||||
'react',
|
'react',
|
||||||
|
'react-hooks',
|
||||||
'simple-import-sort',
|
'simple-import-sort',
|
||||||
'import'
|
'import'
|
||||||
],
|
],
|
||||||
@@ -308,7 +309,9 @@ module.exports = {
|
|||||||
'react/react-in-jsx-scope': 2,
|
'react/react-in-jsx-scope': 2,
|
||||||
'react/self-closing-comp': 2,
|
'react/self-closing-comp': 2,
|
||||||
'react/sort-comp': 2,
|
'react/sort-comp': 2,
|
||||||
'react/jsx-wrap-multilines': 2
|
'react/jsx-wrap-multilines': 2,
|
||||||
|
'react-hooks/rules-of-hooks': 'error',
|
||||||
|
'react-hooks/exhaustive-deps': 'error'
|
||||||
},
|
},
|
||||||
overrides: [
|
overrides: [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -142,8 +142,8 @@ module.exports = (env) => {
|
|||||||
module: {
|
module: {
|
||||||
rules: [
|
rules: [
|
||||||
{
|
{
|
||||||
test: /\.js?$/,
|
test: /\.jsx?$/,
|
||||||
exclude: /(node_modules|JsLibraries)/,
|
exclude: /[\\/]node_modules[\\/](?!(@sentry\/browser|@sentry\/integrations|chart.js|filesize|normalize.css)[\\/])/,
|
||||||
use: [
|
use: [
|
||||||
{
|
{
|
||||||
loader: 'babel-loader',
|
loader: 'babel-loader',
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
const reload = require('require-nocache')(module);
|
const reload = require('require-nocache')(module);
|
||||||
|
|
||||||
const cssVarsFiles = [
|
const cssVarsFiles = [
|
||||||
'./src/Styles/Variables/colors',
|
|
||||||
'./src/Styles/Variables/dimensions',
|
'./src/Styles/Variables/dimensions',
|
||||||
'./src/Styles/Variables/fonts',
|
'./src/Styles/Variables/fonts',
|
||||||
'./src/Styles/Variables/animations',
|
'./src/Styles/Variables/animations',
|
||||||
@@ -29,4 +28,4 @@ module.exports = {
|
|||||||
'postcss-color-function',
|
'postcss-color-function',
|
||||||
'postcss-nested'
|
'postcss-nested'
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,16 +4,19 @@ import React from 'react';
|
|||||||
import DocumentTitle from 'react-document-title';
|
import DocumentTitle from 'react-document-title';
|
||||||
import { Provider } from 'react-redux';
|
import { Provider } from 'react-redux';
|
||||||
import PageConnector from 'Components/Page/PageConnector';
|
import PageConnector from 'Components/Page/PageConnector';
|
||||||
|
import ApplyTheme from './ApplyTheme';
|
||||||
import AppRoutes from './AppRoutes';
|
import AppRoutes from './AppRoutes';
|
||||||
|
|
||||||
function App({ store, history }) {
|
function App({ store, history }) {
|
||||||
return (
|
return (
|
||||||
<DocumentTitle title="Prowlarr">
|
<DocumentTitle title={window.Prowlarr.instanceName}>
|
||||||
<Provider store={store}>
|
<Provider store={store}>
|
||||||
<ConnectedRouter history={history}>
|
<ConnectedRouter history={history}>
|
||||||
<PageConnector>
|
<ApplyTheme>
|
||||||
<AppRoutes app={App} />
|
<PageConnector>
|
||||||
</PageConnector>
|
<AppRoutes app={App} />
|
||||||
|
</PageConnector>
|
||||||
|
</ApplyTheme>
|
||||||
</ConnectedRouter>
|
</ConnectedRouter>
|
||||||
</Provider>
|
</Provider>
|
||||||
</DocumentTitle>
|
</DocumentTitle>
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
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.Prowlarr.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);
|
||||||
@@ -7,25 +7,25 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.danger {
|
.danger {
|
||||||
border-color: $alertDangerBorderColor;
|
border-color: var(--alertDangerBorderColor);
|
||||||
background-color: $alertDangerBackgroundColor;
|
background-color: var(--alertDangerBackgroundColor);
|
||||||
color: $alertDangerColor;
|
color: var(--alertDangerColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.info {
|
.info {
|
||||||
border-color: $alertInfoBorderColor;
|
border-color: var(--alertInfoBorderColor);
|
||||||
background-color: $alertInfoBackgroundColor;
|
background-color: var(--alertInfoBackgroundColor);
|
||||||
color: $alertInfoColor;
|
color: var(--alertInfoColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.success {
|
.success {
|
||||||
border-color: $alertSuccessBorderColor;
|
border-color: var(--alertSuccessBorderColor);
|
||||||
background-color: $alertSuccessBackgroundColor;
|
background-color: var(--alertSuccessBackgroundColor);
|
||||||
color: $alertSuccessColor;
|
color: var(--alertSuccessColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning {
|
.warning {
|
||||||
border-color: $alertWarningBorderColor;
|
border-color: var(--alertWarningBorderColor);
|
||||||
background-color: $alertWarningBackgroundColor;
|
background-color: var(--alertWarningBackgroundColor);
|
||||||
color: $alertWarningColor;
|
color: var(--alertWarningColor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
margin: 10px;
|
margin: 10px;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
background-color: $white;
|
background-color: var(--cardBackgroundColor);
|
||||||
box-shadow: 0 0 10px 1px $cardShadowColor;
|
box-shadow: 0 0 10px 1px var(--cardShadowColor);
|
||||||
color: $defaultColor;
|
color: var(--defaultColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.underlay {
|
.underlay {
|
||||||
|
|||||||
@@ -2,15 +2,16 @@ import Chart from 'chart.js/auto';
|
|||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import { kinds } from 'Helpers/Props';
|
import { kinds } from 'Helpers/Props';
|
||||||
import colors from 'Styles/Variables/colors';
|
|
||||||
|
|
||||||
function getColors(kind) {
|
function getColors(kind) {
|
||||||
|
|
||||||
|
const style = getComputedStyle(document.body);
|
||||||
|
|
||||||
if (kind === kinds.WARNING) {
|
if (kind === kinds.WARNING) {
|
||||||
return colors.failedColors.reverse();
|
return style.getPropertyValue('--failedColors').split(',');
|
||||||
}
|
}
|
||||||
|
|
||||||
return colors.chartColors;
|
return style.getPropertyValue('--chartColors').split(',');
|
||||||
}
|
}
|
||||||
|
|
||||||
class BarChart extends Component {
|
class BarChart extends Component {
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
import Chart from 'chart.js/auto';
|
import Chart from 'chart.js/auto';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import colors from 'Styles/Variables/colors';
|
|
||||||
|
function getColors(kind) {
|
||||||
|
|
||||||
|
const style = getComputedStyle(document.body);
|
||||||
|
return style.getPropertyValue('--chartColorsDiversified').split(',');
|
||||||
|
}
|
||||||
|
|
||||||
class DoughnutChart extends Component {
|
class DoughnutChart extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
@@ -29,7 +34,7 @@ class DoughnutChart extends Component {
|
|||||||
datasets: [{
|
datasets: [{
|
||||||
label: this.props.title,
|
label: this.props.title,
|
||||||
data: this.props.data.map((d) => d.value),
|
data: this.props.data.map((d) => d.value),
|
||||||
backgroundColor: colors.chartColors
|
backgroundColor: getColors()
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
import Chart from 'chart.js/auto';
|
import Chart from 'chart.js/auto';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import colors from 'Styles/Variables/colors';
|
|
||||||
|
function getColors(index) {
|
||||||
|
|
||||||
|
const style = getComputedStyle(document.body);
|
||||||
|
return style.getPropertyValue('--chartColorsDiversified').split(',')[index];
|
||||||
|
}
|
||||||
|
|
||||||
class StackedBarChart extends Component {
|
class StackedBarChart extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
@@ -41,7 +46,7 @@ class StackedBarChart extends Component {
|
|||||||
return {
|
return {
|
||||||
label: d.label,
|
label: d.label,
|
||||||
data: d.data,
|
data: d.data,
|
||||||
backgroundColor: colors.chartColors[index]
|
backgroundColor: getColors(index)
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -54,7 +59,7 @@ class StackedBarChart extends Component {
|
|||||||
return {
|
return {
|
||||||
label: d.label,
|
label: d.label,
|
||||||
data: d.data,
|
data: d.data,
|
||||||
backgroundColor: colors.chartColors[index]
|
backgroundColor: getColors(index)
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
this.myChart.update();
|
this.myChart.update();
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
border: 0;
|
border: 0;
|
||||||
border-bottom: 1px solid #e5e5e5;
|
border-bottom: 1px solid #e5e5e5;
|
||||||
color: #3a3f51;
|
color: var(--textColor);
|
||||||
font-size: 21px;
|
font-size: 21px;
|
||||||
line-height: inherit;
|
line-height: inherit;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.faqLink {
|
.faqLink {
|
||||||
color: $alertWarningColor;
|
color: var(--alertWarningColor);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ class DateFilterBuilderRowValue extends Component {
|
|||||||
<TextInput
|
<TextInput
|
||||||
name={NAME}
|
name={NAME}
|
||||||
value={filterValue}
|
value={filterValue}
|
||||||
|
type="date"
|
||||||
placeholder="yyyy-mm-dd"
|
placeholder="yyyy-mm-dd"
|
||||||
onChange={this.onValueChange}
|
onChange={this.onValueChange}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: $tableRowHoverBackgroundColor;
|
background-color: var(--tableRowHoverBackgroundColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,5 +17,5 @@
|
|||||||
|
|
||||||
.or {
|
.or {
|
||||||
margin: 0 3px;
|
margin: 0 3px;
|
||||||
color: $themeDarkColor;
|
color: var(--themeDarkColor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
padding: 5px;
|
padding: 5px;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: $tableRowHoverBackgroundColor;
|
background-color: var(--tableRowHoverBackgroundColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ function CustomFiltersModalContent(props) {
|
|||||||
|
|
||||||
<div className={styles.addButtonContainer}>
|
<div className={styles.addButtonContainer}>
|
||||||
<Button onPress={onAddCustomFilter}>
|
<Button onPress={onAddCustomFilter}>
|
||||||
Add Custom Filter
|
{translate('AddCustomFilter')}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</ModalBody>
|
</ModalBody>
|
||||||
|
|||||||
@@ -27,10 +27,10 @@
|
|||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
max-height: 200px;
|
max-height: 200px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border: 1px solid $inputBorderColor;
|
border: 1px solid var(--inputBorderColor);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background-color: $white;
|
background-color: var(--inputBackgroundColor);
|
||||||
box-shadow: inset 0 1px 1px $inputBoxShadowColor;
|
box-shadow: inset 0 1px 1px var(--inputBoxShadowColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,5 +46,5 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.suggestionHighlighted {
|
.suggestionHighlighted {
|
||||||
background-color: $menuItemHoverBackgroundColor;
|
background-color: var(--menuItemHoverBackgroundColor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,21 +32,21 @@
|
|||||||
height: 20px;
|
height: 20px;
|
||||||
border: 1px solid #ccc;
|
border: 1px solid #ccc;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
background-color: $white;
|
background-color: var(--white);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.checkbox:focus + .input {
|
.checkbox:focus + .input {
|
||||||
outline: 0;
|
outline: 0;
|
||||||
border-color: $inputFocusBorderColor;
|
border-color: var(--inputFocusBorderColor);
|
||||||
box-shadow: inset 0 1px 1px $inputBoxShadowColor, 0 0 8px $inputFocusBoxShadowColor;
|
box-shadow: inset 0 1px 1px var(--inputBoxShadowColor), 0 0 8px var(--inputFocusBoxShadowColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.dangerIsChecked {
|
.dangerIsChecked {
|
||||||
border-color: $dangerColor;
|
border-color: var(--dangerColor);
|
||||||
background-color: $dangerColor;
|
background-color: var(--dangerColor);
|
||||||
|
|
||||||
&.isDisabled {
|
&.isDisabled {
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
@@ -54,8 +54,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.primaryIsChecked {
|
.primaryIsChecked {
|
||||||
border-color: $primaryColor;
|
border-color: var(--primaryColor);
|
||||||
background-color: $primaryColor;
|
background-color: var(--primaryColor);
|
||||||
|
|
||||||
&.isDisabled {
|
&.isDisabled {
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
@@ -63,8 +63,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.successIsChecked {
|
.successIsChecked {
|
||||||
border-color: $successColor;
|
border-color: var(--successColor);
|
||||||
background-color: $successColor;
|
background-color: var(--successColor);
|
||||||
|
|
||||||
&.isDisabled {
|
&.isDisabled {
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
@@ -72,8 +72,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.warningIsChecked {
|
.warningIsChecked {
|
||||||
border-color: $warningColor;
|
border-color: var(--warningColor);
|
||||||
background-color: $warningColor;
|
background-color: var(--warningColor);
|
||||||
|
|
||||||
&.isDisabled {
|
&.isDisabled {
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
@@ -82,15 +82,15 @@
|
|||||||
|
|
||||||
.isNotChecked {
|
.isNotChecked {
|
||||||
&.isDisabled {
|
&.isDisabled {
|
||||||
border-color: $disabledCheckInputColor;
|
border-color: var(--disabledCheckInputColor);
|
||||||
background-color: $disabledCheckInputColor;
|
background-color: var(--disabledCheckInputColor);
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.isIndeterminate {
|
.isIndeterminate {
|
||||||
border-color: $gray;
|
border-color: var(--gray);
|
||||||
background-color: $gray;
|
background-color: var(--gray);
|
||||||
}
|
}
|
||||||
|
|
||||||
.helpText {
|
.helpText {
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
.dropdownArrowContainerDisabled {
|
.dropdownArrowContainerDisabled {
|
||||||
composes: dropdownArrowContainer;
|
composes: dropdownArrowContainer;
|
||||||
|
|
||||||
color: $disabledInputColor;
|
color: var(--disabledInputColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.optionsContainer {
|
.optionsContainer {
|
||||||
@@ -50,9 +50,9 @@
|
|||||||
.options {
|
.options {
|
||||||
composes: scroller from '~Components/Scroller/Scroller.css';
|
composes: scroller from '~Components/Scroller/Scroller.css';
|
||||||
|
|
||||||
border: 1px solid $inputBorderColor;
|
border: 1px solid var(--inputBorderColor);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background-color: $white;
|
background-color: var(--inputBackgroundColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.optionsModal {
|
.optionsModal {
|
||||||
@@ -76,9 +76,9 @@
|
|||||||
.optionsModalScroller {
|
.optionsModalScroller {
|
||||||
composes: scroller from '~Components/Scroller/Scroller.css';
|
composes: scroller from '~Components/Scroller/Scroller.css';
|
||||||
|
|
||||||
border: 1px solid $inputBorderColor;
|
border: 1px solid var(--inputBorderColor);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background-color: $white;
|
background-color: var(--inputBackgroundColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.loading {
|
.loading {
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
border-bottom: 1px solid $borderColor;
|
border-bottom: 1px solid var(--borderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.mobileCloseButton {
|
.mobileCloseButton {
|
||||||
@@ -100,6 +100,6 @@
|
|||||||
line-height: 40px;
|
line-height: 40px;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: $modalCloseButtonHoverColor;
|
color: var(--modalCloseButtonHoverColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
cursor: default;
|
cursor: default;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: #f8f8f8;
|
background-color: var(--inputHoverBackgroundColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,17 +24,17 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.isSelected {
|
.isSelected {
|
||||||
background-color: #e2e2e2;
|
background-color: var(--inputSelectedBackgroundColor);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: #e2e2e2;
|
background-color: var(--inputSelectedBackgroundColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.isMobile {
|
&.isMobile {
|
||||||
background-color: inherit;
|
background-color: inherit;
|
||||||
|
|
||||||
.iconContainer {
|
.iconContainer {
|
||||||
color: $primaryColor;
|
color: var(--primaryColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
|
|
||||||
.isMobile {
|
.isMobile {
|
||||||
height: 50px;
|
height: 50px;
|
||||||
border-bottom: 1px solid $borderColor;
|
border-bottom: 1px solid var(--borderColor);
|
||||||
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
border: none;
|
border: none;
|
||||||
|
|||||||
@@ -3,5 +3,5 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.isDisabled {
|
.isDisabled {
|
||||||
color: $disabledInputColor;
|
color: var(--disabledInputColor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.pendingChangesIcon {
|
.pendingChangesIcon {
|
||||||
color: $warningColor;
|
color: var(--warningColor);
|
||||||
font-size: 20px;
|
font-size: 20px;
|
||||||
line-height: 35px;
|
line-height: 35px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import FormInputHelpText from './FormInputHelpText';
|
|||||||
import IndexerFlagsSelectInputConnector from './IndexerFlagsSelectInputConnector';
|
import IndexerFlagsSelectInputConnector from './IndexerFlagsSelectInputConnector';
|
||||||
import InfoInput from './InfoInput';
|
import InfoInput from './InfoInput';
|
||||||
import KeyValueListInput from './KeyValueListInput';
|
import KeyValueListInput from './KeyValueListInput';
|
||||||
|
import NewznabCategorySelectInputConnector from './NewznabCategorySelectInputConnector';
|
||||||
import NumberInput from './NumberInput';
|
import NumberInput from './NumberInput';
|
||||||
import OAuthInputConnector from './OAuthInputConnector';
|
import OAuthInputConnector from './OAuthInputConnector';
|
||||||
import PasswordInput from './PasswordInput';
|
import PasswordInput from './PasswordInput';
|
||||||
@@ -68,6 +69,9 @@ function getComponent(type) {
|
|||||||
case inputTypes.PATH:
|
case inputTypes.PATH:
|
||||||
return PathInputConnector;
|
return PathInputConnector;
|
||||||
|
|
||||||
|
case inputTypes.CATEGORY_SELECT:
|
||||||
|
return NewznabCategorySelectInputConnector;
|
||||||
|
|
||||||
case inputTypes.INDEXER_FLAGS_SELECT:
|
case inputTypes.INDEXER_FLAGS_SELECT:
|
||||||
return IndexerFlagsSelectInputConnector;
|
return IndexerFlagsSelectInputConnector;
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
.helpText {
|
.helpText {
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
color: $helpTextColor;
|
color: var(--helpTextColor);
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.isError {
|
.isError {
|
||||||
color: $dangerColor;
|
color: var(--dangerColor);
|
||||||
|
|
||||||
.link {
|
.link {
|
||||||
color: $dangerColor;
|
color: var(--dangerColor);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: #e01313;
|
color: #e01313;
|
||||||
@@ -17,10 +17,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.isWarning {
|
.isWarning {
|
||||||
color: $warningColor;
|
color: var(--warningColor);
|
||||||
|
|
||||||
.link {
|
.link {
|
||||||
color: $warningColor;
|
color: var(--warningColor);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: #e36c00;
|
color: #e36c00;
|
||||||
|
|||||||
@@ -7,11 +7,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.hasError {
|
.hasError {
|
||||||
color: $dangerColor;
|
color: var(--dangerColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.isAdvanced {
|
.isAdvanced {
|
||||||
color: $advancedFormLabelColor;
|
color: var(--advancedFormLabelColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: $breakpointLarge) {
|
@media only screen and (max-width: $breakpointLarge) {
|
||||||
|
|||||||
@@ -18,6 +18,6 @@
|
|||||||
@add-mixin truncate;
|
@add-mixin truncate;
|
||||||
|
|
||||||
margin-left: 15px;
|
margin-left: 15px;
|
||||||
color: $darkGray;
|
color: var(--darkGray);
|
||||||
font-size: $smallFontSize;
|
font-size: $smallFontSize;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
flex: 1 10 0;
|
flex: 1 10 0;
|
||||||
margin-left: 15px;
|
margin-left: 15px;
|
||||||
color: $gray;
|
color: var(--gray);
|
||||||
text-align: right;
|
text-align: right;
|
||||||
font-size: $smallFontSize;
|
font-size: $smallFontSize;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,26 +2,27 @@
|
|||||||
padding: 6px 16px;
|
padding: 6px 16px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 35px;
|
height: 35px;
|
||||||
border: 1px solid $inputBorderColor;
|
border: 1px solid var(--inputBorderColor);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background-color: $white;
|
background-color: var(--inputBackgroundColor);
|
||||||
box-shadow: inset 0 1px 1px $inputBoxShadowColor;
|
box-shadow: inset 0 1px 1px var(--inputBoxShadowColor);
|
||||||
|
color: var(--textColor);
|
||||||
|
|
||||||
&:focus {
|
&:focus {
|
||||||
outline: 0;
|
outline: 0;
|
||||||
border-color: $inputFocusBorderColor;
|
border-color: var(--inputFocusBorderColor);
|
||||||
box-shadow: inset 0 1px 1px $inputBoxShadowColor, 0 0 8px $inputFocusBoxShadowColor;
|
box-shadow: inset 0 1px 1px var(--inputBoxShadowColor), 0 0 8px var(--inputFocusBoxShadowColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.hasError {
|
.hasError {
|
||||||
border-color: $inputErrorBorderColor;
|
border-color: var(--inputErrorBorderColor);
|
||||||
box-shadow: inset 0 1px 1px $inputBoxShadowColor, 0 0 8px $inputErrorBoxShadowColor;
|
box-shadow: inset 0 1px 1px var(--inputBoxShadowColor), 0 0 8px var(--inputErrorBoxShadowColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hasWarning {
|
.hasWarning {
|
||||||
border-color: $inputWarningBorderColor;
|
border-color: var(--inputWarningBorderColor);
|
||||||
box-shadow: inset 0 1px 1px $inputBoxShadowColor, 0 0 8px $inputWarningBoxShadowColor;
|
box-shadow: inset 0 1px 1px var(--inputBoxShadowColor), 0 0 8px var(--inputWarningBoxShadowColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hasButton {
|
.hasButton {
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
&.isFocused {
|
&.isFocused {
|
||||||
outline: 0;
|
outline: 0;
|
||||||
border-color: $inputFocusBorderColor;
|
border-color: var(--inputFocusBorderColor);
|
||||||
box-shadow: inset 0 1px 1px $inputBoxShadowColor, 0 0 8px $inputFocusBoxShadowColor;
|
box-shadow: inset 0 1px 1px var(--inputBoxShadowColor), 0 0 8px var(--inputFocusBoxShadowColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
.itemContainer {
|
.itemContainer {
|
||||||
display: flex;
|
display: flex;
|
||||||
margin-bottom: 3px;
|
margin-bottom: 3px;
|
||||||
border-bottom: 1px solid $inputBorderColor;
|
border-bottom: 1px solid var(--inputBorderColor);
|
||||||
|
|
||||||
&:last-child {
|
&:last-child {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ function createMapStateToProps() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
value,
|
value: value || [],
|
||||||
values
|
values
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
&.isFocused {
|
&.isFocused {
|
||||||
outline: 0;
|
outline: 0;
|
||||||
border-color: $inputFocusBorderColor;
|
border-color: var(--inputFocusBorderColor);
|
||||||
box-shadow: inset 0 1px 1px $inputBoxShadowColor, 0 0 8px $inputFocusBoxShadowColor;
|
box-shadow: inset 0 1px 1px var(--inputBoxShadowColor), 0 0 8px var(--inputFocusBoxShadowColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -20,4 +20,6 @@
|
|||||||
width: 0%;
|
width: 0%;
|
||||||
height: 31px;
|
height: 31px;
|
||||||
border: none;
|
border: none;
|
||||||
|
background-color: var(--inputBackground);
|
||||||
|
color: var(--textColor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ class TagInputInput extends Component {
|
|||||||
<div
|
<div
|
||||||
ref={forwardedRef}
|
ref={forwardedRef}
|
||||||
className={className}
|
className={className}
|
||||||
component="div"
|
|
||||||
onMouseDown={this.onMouseDown}
|
onMouseDown={this.onMouseDown}
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.readOnly {
|
.readOnly {
|
||||||
background-color: #eee;
|
background-color: var(--inputReadOnlyBackgroundColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hasError {
|
.hasError {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.readOnly {
|
.readOnly {
|
||||||
background-color: #eee;
|
background-color: var(--inputReadOnlyBackgroundColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hasError {
|
.hasError {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
.danger {
|
.danger {
|
||||||
color: $dangerColor;
|
color: var(--dangerColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.default {
|
.default {
|
||||||
@@ -7,25 +7,21 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.disabled {
|
.disabled {
|
||||||
color: $disabledColor;
|
color: var(--disabledColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.info {
|
.info {
|
||||||
color: $infoColor;
|
color: var(--infoColor);
|
||||||
}
|
|
||||||
|
|
||||||
.pink {
|
|
||||||
color: $pink;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.success {
|
.success {
|
||||||
color: $successColor;
|
color: var(--successColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning {
|
.warning {
|
||||||
color: $warningColor;
|
color: var(--warningColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.purple {
|
.purple {
|
||||||
color: $purple;
|
color: var(--purple);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
.label {
|
.label {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
margin: 2px;
|
margin: 2px;
|
||||||
color: $white;
|
color: var(--white);
|
||||||
/** text-align: center; **/
|
/** text-align: center; **/
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
.title {
|
.title {
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
color: $helpTextColor;
|
color: var(--helpTextColor);
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,5 +36,5 @@
|
|||||||
/** Outline **/
|
/** Outline **/
|
||||||
|
|
||||||
.outline {
|
.outline {
|
||||||
background-color: $white;
|
background-color: var(--cardBackgroundColor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
margin: 2px;
|
margin: 2px;
|
||||||
border: 1px solid;
|
border: 1px solid;
|
||||||
border-radius: 2px;
|
border-radius: 2px;
|
||||||
color: $white;
|
color: var(--white);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
@@ -13,86 +13,77 @@
|
|||||||
/** Kinds **/
|
/** Kinds **/
|
||||||
|
|
||||||
.danger {
|
.danger {
|
||||||
border-color: $dangerColor;
|
border-color: var(--dangerColor);
|
||||||
background-color: $dangerColor;
|
background-color: var(--dangerColor);
|
||||||
|
|
||||||
&.outline {
|
&.outline {
|
||||||
color: $dangerColor;
|
color: var(--dangerColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.default {
|
.default {
|
||||||
border-color: $themeLightColor;
|
border-color: var(--themeLightColor);
|
||||||
background-color: $themeLightColor;
|
background-color: var(--themeLightColor);
|
||||||
|
|
||||||
&.outline {
|
&.outline {
|
||||||
color: $themeLightColor;
|
color: var(--themeLightColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.disabled {
|
.disabled {
|
||||||
border-color: $disabledColor;
|
border-color: var(--disabledColor);
|
||||||
background-color: $disabledColor;
|
background-color: var(--disabledColor);
|
||||||
|
|
||||||
&.outline {
|
&.outline {
|
||||||
color: $disabledColor;
|
color: var(--disabledColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.info {
|
.info {
|
||||||
border-color: $infoColor;
|
border-color: var(--infoColor);
|
||||||
background-color: $infoColor;
|
background-color: var(--infoColor);
|
||||||
|
|
||||||
&.outline {
|
&.outline {
|
||||||
color: $infoColor;
|
color: var(--infoColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.inverse {
|
.inverse {
|
||||||
border-color: $lightGray;
|
border-color: var(--inverseLabelColor);
|
||||||
background-color: $lightGray;
|
background-color: var(--inverseLabelColor);
|
||||||
color: $defaultColor;
|
color: var(--inverseLabelTextColor);
|
||||||
|
|
||||||
&.outline {
|
&.outline {
|
||||||
background-color: $defaultColor !important;
|
background-color: var(--inverseLabelTextColor) !important;
|
||||||
color: $lightGray;
|
color: var(--inverseLabelColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.primary {
|
.primary {
|
||||||
border-color: $primaryColor;
|
border-color: var(--primaryColor);
|
||||||
background-color: $primaryColor;
|
background-color: var(--primaryColor);
|
||||||
|
|
||||||
&.outline {
|
&.outline {
|
||||||
color: $primaryColor;
|
color: var(--primaryColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.success {
|
.success {
|
||||||
border-color: $successColor;
|
border-color: var(--successColor);
|
||||||
background-color: $successColor;
|
background-color: var(--successColor);
|
||||||
color: #eee;
|
color: #eee;
|
||||||
|
|
||||||
&.outline {
|
&.outline {
|
||||||
color: $successColor;
|
color: var(--successColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning {
|
.warning {
|
||||||
border-color: $warningColor;
|
border-color: var(--warningColor);
|
||||||
background-color: $warningColor;
|
background-color: var(--warningColor);
|
||||||
|
|
||||||
&.outline {
|
&.outline {
|
||||||
color: $warningColor;
|
color: var(--warningColor);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.queue {
|
|
||||||
border-color: $queueColor;
|
|
||||||
background-color: $queueColor;
|
|
||||||
|
|
||||||
&.outline {
|
|
||||||
color: $queueColor;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,5 +108,5 @@
|
|||||||
/** Outline **/
|
/** Outline **/
|
||||||
|
|
||||||
.outline {
|
.outline {
|
||||||
background-color: $white;
|
background-color: var(--cardBackgroundColor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,62 +19,62 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.danger {
|
.danger {
|
||||||
border-color: $dangerBorderColor;
|
border-color: var(--dangerBorderColor);
|
||||||
background-color: $dangerBackgroundColor;
|
background-color: var(--dangerBackgroundColor);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
border-color: $dangerHoverBorderColor;
|
border-color: var(--dangerHoverBorderColor);
|
||||||
background-color: $dangerHoverBackgroundColor;
|
background-color: var(--dangerHoverBackgroundColor);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.default {
|
.default {
|
||||||
border-color: $defaultBorderColor;
|
border-color: var(--defaultBorderColor);
|
||||||
background-color: $defaultBackgroundColor;
|
background-color: var(--defaultButtonBackgroundColor);
|
||||||
color: $defaultColor;
|
color: var(--defaultButtonTextColor);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
border-color: $defaultHoverBorderColor;
|
border-color: var(--defaultHoverBorderColor);
|
||||||
background-color: $defaultHoverBackgroundColor;
|
background-color: var(--defaultHoverBackgroundColor);
|
||||||
color: $defaultColor;
|
color: var(--defaultButtonTextColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.primary {
|
.primary {
|
||||||
border-color: $primaryBorderColor;
|
border-color: var(--primaryBorderColor);
|
||||||
background-color: $primaryBackgroundColor;
|
background-color: var(--primaryBackgroundColor);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
border-color: $primaryHoverBorderColor;
|
border-color: var(--primaryHoverBorderColor);
|
||||||
background-color: $primaryHoverBackgroundColor;
|
background-color: var(--primaryHoverBackgroundColor);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.success {
|
.success {
|
||||||
border-color: $successBorderColor;
|
border-color: var(--successBorderColor);
|
||||||
background-color: $successBackgroundColor;
|
background-color: var(--successBackgroundColor);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
border-color: $successHoverBorderColor;
|
border-color: var(--successHoverBorderColor);
|
||||||
background-color: $successHoverBackgroundColor;
|
background-color: var(--successHoverBackgroundColor);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning {
|
.warning {
|
||||||
border-color: $warningBorderColor;
|
border-color: var(--warningBorderColor);
|
||||||
background-color: $warningBackgroundColor;
|
background-color: var(--warningBackgroundColor);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
border-color: $warningHoverBorderColor;
|
border-color: var(--warningHoverBorderColor);
|
||||||
background-color: $warningHoverBackgroundColor;
|
background-color: var(--warningHoverBackgroundColor);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,10 +12,10 @@
|
|||||||
&:hover {
|
&:hover {
|
||||||
border: none;
|
border: none;
|
||||||
background-color: inherit;
|
background-color: inherit;
|
||||||
color: $iconButtonHoverColor;
|
color: var(--iconButtonHoverColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.isDisabled {
|
&.isDisabled {
|
||||||
color: $iconButtonDisabledColor;
|
color: var(--iconButtonDisabledColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,10 +15,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.to {
|
.to {
|
||||||
color: $linkColor;
|
color: var(--linkColor);
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: $linkHoverColor;
|
color: var(--linkHoverColor);
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
.ripple {
|
.ripple {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
border: 2px solid #3a3f51;
|
border: 2px solid var(--themeDarkColor);
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
animation: rippleContainer 1.25s 0s infinite cubic-bezier(0.21, 0.53, 0.56, 0.8);
|
animation: rippleContainer 1.25s 0s infinite cubic-bezier(0.21, 0.53, 0.56, 0.8);
|
||||||
animation-fill-mode: both;
|
animation-fill-mode: both;
|
||||||
|
|||||||
@@ -10,12 +10,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: $toobarButtonHoverColor;
|
color: var(--toobarButtonHoverColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.isDisabled {
|
.isDisabled {
|
||||||
color: $disabledColor;
|
color: var(--disabledColor);
|
||||||
|
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
z-index: $popperZIndex;
|
z-index: $popperZIndex;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
background-color: $toolbarMenuItemBackgroundColor;
|
background-color: var(--toolbarMenuItemBackgroundColor);
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,19 +5,19 @@
|
|||||||
padding: 10px 20px;
|
padding: 10px 20px;
|
||||||
min-width: 150px;
|
min-width: 150px;
|
||||||
max-width: 250px;
|
max-width: 250px;
|
||||||
background-color: $toolbarMenuItemBackgroundColor;
|
background-color: var(--toolbarMenuItemBackgroundColor);
|
||||||
color: $menuItemColor;
|
color: var(--menuItemColor);
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
|
|
||||||
&:hover,
|
&:hover,
|
||||||
&:focus {
|
&:focus {
|
||||||
background-color: $toolbarMenuItemHoverBackgroundColor;
|
background-color: var(--toolbarMenuItemHoverBackgroundColor);
|
||||||
color: $menuItemHoverColor;
|
color: var(--menuItemHoverColor);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.isDisabled {
|
.isDisabled {
|
||||||
color: $disabledColor;
|
color: var(--disabledColor);
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,5 +2,5 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
min-height: 1px;
|
min-height: 1px;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
background-color: $themeDarkColor;
|
background-color: var(--themeDarkColor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,10 +30,10 @@ function ConfirmModal(props) {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (isOpen) {
|
if (isOpen) {
|
||||||
bindShortcut('enter', onConfirm);
|
bindShortcut('enter', onConfirm);
|
||||||
} else {
|
|
||||||
unbindShortcut('enter', onConfirm);
|
return () => unbindShortcut('enter', onConfirm);
|
||||||
}
|
}
|
||||||
}, [onConfirm]);
|
}, [bindShortcut, unbindShortcut, isOpen, onConfirm]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Modal
|
<Modal
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background-color: $modalBackdropBackgroundColor;
|
background-color: var(--modalBackdropBackgroundColor);
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
background-color: $modalBackgroundColor;
|
background-color: var(--modalBackgroundColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.closeButton {
|
.closeButton {
|
||||||
@@ -18,6 +18,6 @@
|
|||||||
line-height: 60px;
|
line-height: 60px;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: $modalCloseButtonHoverColor;
|
color: var(--modalCloseButtonHoverColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
padding: 15px 30px;
|
padding: 15px 30px;
|
||||||
border-top: 1px solid $borderColor;
|
border-top: 1px solid var(--borderColor);
|
||||||
|
|
||||||
a,
|
a,
|
||||||
button {
|
button {
|
||||||
|
|||||||
@@ -3,6 +3,6 @@
|
|||||||
|
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
padding: 15px 50px 15px 30px;
|
padding: 15px 50px 15px 30px;
|
||||||
border-bottom: 1px solid $borderColor;
|
border-bottom: 1px solid var(--borderColor);
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,22 +12,22 @@
|
|||||||
.ripple {
|
.ripple {
|
||||||
composes: ripple from '~Components/Loading/LoadingIndicator.css';
|
composes: ripple from '~Components/Loading/LoadingIndicator.css';
|
||||||
|
|
||||||
border: 1px solid $toolbarColor;
|
border: 1px solid var(--toolbarColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.input {
|
.input {
|
||||||
margin-left: 8px;
|
margin-left: 8px;
|
||||||
width: 200px;
|
width: 200px;
|
||||||
border: none;
|
border: none;
|
||||||
border-bottom: solid 1px $white;
|
border-bottom: solid 1px var(--white);
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
color: $white;
|
color: var(--white);
|
||||||
transition: border 0.3s ease-out;
|
transition: border 0.3s ease-out;
|
||||||
|
|
||||||
&::placeholder {
|
&::placeholder {
|
||||||
color: $white;
|
color: var(--white);
|
||||||
transition: color 0.3s ease-out;
|
transition: color 0.3s ease-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,13 +60,13 @@
|
|||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
min-width: 100%;
|
min-width: 100%;
|
||||||
max-height: 230px;
|
max-height: 230px;
|
||||||
border: 1px solid $themeDarkColor;
|
border: 1px solid var(--themeDarkColor);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
border-top-left-radius: 0;
|
border-top-left-radius: 0;
|
||||||
border-top-right-radius: 0;
|
border-top-right-radius: 0;
|
||||||
background-color: $themeDarkColor;
|
background-color: var(--themeDarkColor);
|
||||||
box-shadow: inset 0 1px 1px $inputBoxShadowColor;
|
box-shadow: inset 0 1px 1px var(--inputBoxShadowColor);
|
||||||
color: $menuItemColor;
|
color: var(--menuItemColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,12 +82,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.highlighted {
|
.highlighted {
|
||||||
background-color: $themeLightColor;
|
background-color: var(--themeLightColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.sectionTitle {
|
.sectionTitle {
|
||||||
padding: 5px 8px;
|
padding: 5px 8px;
|
||||||
color: $disabledColor;
|
color: var(--disabledColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.addNewMovieSuggestion {
|
.addNewMovieSuggestion {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
.alternateTitle {
|
.alternateTitle {
|
||||||
composes: title;
|
composes: title;
|
||||||
|
|
||||||
color: $disabledColor;
|
color: var(--disabledColor);
|
||||||
font-size: $smallFontSize;
|
font-size: $smallFontSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
.key {
|
.key {
|
||||||
padding: 2px 4px;
|
padding: 2px 4px;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
background-color: $defaultColor;
|
background-color: var(--defaultColor);
|
||||||
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
|
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
height: $headerHeight;
|
height: $headerHeight;
|
||||||
background-color: $prowlarrOrange;
|
background-color: var(--pageHeaderBackgroundColor);
|
||||||
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
|
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
}
|
}
|
||||||
|
|
||||||
.logoContainer {
|
.logoContainer {
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
width: 30px;
|
width: 30px;
|
||||||
color: $themeRed;
|
color: var(--themeRed);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
line-height: 60px;
|
line-height: 60px;
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ class PageHeader extends Component {
|
|||||||
<IconButton
|
<IconButton
|
||||||
className={styles.donate}
|
className={styles.donate}
|
||||||
name={icons.HEART}
|
name={icons.HEART}
|
||||||
to="https://opencollective.com/prowlarr"
|
to="https://prowlarr.com/donate"
|
||||||
size={14}
|
size={14}
|
||||||
/>
|
/>
|
||||||
<IconButton
|
<IconButton
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: $toobarButtonHoverColor;
|
color: #515253;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
.page {
|
.page {
|
||||||
composes: page from '~./Page.css';
|
composes: page from '~./Page.css';
|
||||||
|
|
||||||
|
background-color: var(--pageBackground);
|
||||||
}
|
}
|
||||||
|
|
||||||
.logoFull {
|
.logoFull {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import AppUpdatedModalConnector from 'App/AppUpdatedModalConnector';
|
|||||||
import ColorImpairedContext from 'App/ColorImpairedContext';
|
import ColorImpairedContext from 'App/ColorImpairedContext';
|
||||||
import ConnectionLostModalConnector from 'App/ConnectionLostModalConnector';
|
import ConnectionLostModalConnector from 'App/ConnectionLostModalConnector';
|
||||||
import SignalRConnector from 'Components/SignalRConnector';
|
import SignalRConnector from 'Components/SignalRConnector';
|
||||||
|
import AuthenticationRequiredModal from 'FirstRun/AuthenticationRequiredModal';
|
||||||
import locationShape from 'Helpers/Props/Shapes/locationShape';
|
import locationShape from 'Helpers/Props/Shapes/locationShape';
|
||||||
import PageHeader from './Header/PageHeader';
|
import PageHeader from './Header/PageHeader';
|
||||||
import PageSidebar from './Sidebar/PageSidebar';
|
import PageSidebar from './Sidebar/PageSidebar';
|
||||||
@@ -75,6 +76,7 @@ class Page extends Component {
|
|||||||
isSmallScreen,
|
isSmallScreen,
|
||||||
isSidebarVisible,
|
isSidebarVisible,
|
||||||
enableColorImpairedMode,
|
enableColorImpairedMode,
|
||||||
|
authenticationEnabled,
|
||||||
onSidebarToggle,
|
onSidebarToggle,
|
||||||
onSidebarVisibleChange
|
onSidebarVisibleChange
|
||||||
} = this.props;
|
} = this.props;
|
||||||
@@ -109,6 +111,10 @@ class Page extends Component {
|
|||||||
isOpen={this.state.isConnectionLostModalOpen}
|
isOpen={this.state.isConnectionLostModalOpen}
|
||||||
onModalClose={this.onConnectionLostModalClose}
|
onModalClose={this.onConnectionLostModalClose}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<AuthenticationRequiredModal
|
||||||
|
isOpen={!authenticationEnabled}
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</ColorImpairedContext.Provider>
|
</ColorImpairedContext.Provider>
|
||||||
);
|
);
|
||||||
@@ -124,6 +130,7 @@ Page.propTypes = {
|
|||||||
isUpdated: PropTypes.bool.isRequired,
|
isUpdated: PropTypes.bool.isRequired,
|
||||||
isDisconnected: PropTypes.bool.isRequired,
|
isDisconnected: PropTypes.bool.isRequired,
|
||||||
enableColorImpairedMode: PropTypes.bool.isRequired,
|
enableColorImpairedMode: PropTypes.bool.isRequired,
|
||||||
|
authenticationEnabled: PropTypes.bool.isRequired,
|
||||||
onResize: PropTypes.func.isRequired,
|
onResize: PropTypes.func.isRequired,
|
||||||
onSidebarToggle: PropTypes.func.isRequired,
|
onSidebarToggle: PropTypes.func.isRequired,
|
||||||
onSidebarVisibleChange: PropTypes.func.isRequired
|
onSidebarVisibleChange: PropTypes.func.isRequired
|
||||||
|
|||||||
@@ -7,10 +7,11 @@ import { saveDimensions, setIsSidebarVisible } from 'Store/Actions/appActions';
|
|||||||
import { fetchCustomFilters } from 'Store/Actions/customFilterActions';
|
import { fetchCustomFilters } from 'Store/Actions/customFilterActions';
|
||||||
import { fetchIndexers } from 'Store/Actions/indexerActions';
|
import { fetchIndexers } from 'Store/Actions/indexerActions';
|
||||||
import { fetchIndexerStatus } from 'Store/Actions/indexerStatusActions';
|
import { fetchIndexerStatus } from 'Store/Actions/indexerStatusActions';
|
||||||
import { fetchAppProfiles, fetchGeneralSettings, fetchIndexerCategories, fetchLanguages, fetchUISettings } from 'Store/Actions/settingsActions';
|
import { fetchAppProfiles, fetchGeneralSettings, fetchIndexerCategories, fetchUISettings } from 'Store/Actions/settingsActions';
|
||||||
import { fetchStatus } from 'Store/Actions/systemActions';
|
import { fetchStatus } from 'Store/Actions/systemActions';
|
||||||
import { fetchTags } from 'Store/Actions/tagActions';
|
import { fetchTags } from 'Store/Actions/tagActions';
|
||||||
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
|
import createDimensionsSelector from 'Store/Selectors/createDimensionsSelector';
|
||||||
|
import createSystemStatusSelector from 'Store/Selectors/createSystemStatusSelector';
|
||||||
import ErrorPage from './ErrorPage';
|
import ErrorPage from './ErrorPage';
|
||||||
import LoadingPage from './LoadingPage';
|
import LoadingPage from './LoadingPage';
|
||||||
import Page from './Page';
|
import Page from './Page';
|
||||||
@@ -48,7 +49,6 @@ const selectIsPopulated = createSelector(
|
|||||||
(state) => state.tags.isPopulated,
|
(state) => state.tags.isPopulated,
|
||||||
(state) => state.settings.ui.isPopulated,
|
(state) => state.settings.ui.isPopulated,
|
||||||
(state) => state.settings.general.isPopulated,
|
(state) => state.settings.general.isPopulated,
|
||||||
(state) => state.settings.languages.isPopulated,
|
|
||||||
(state) => state.settings.appProfiles.isPopulated,
|
(state) => state.settings.appProfiles.isPopulated,
|
||||||
(state) => state.indexers.isPopulated,
|
(state) => state.indexers.isPopulated,
|
||||||
(state) => state.indexerStatus.isPopulated,
|
(state) => state.indexerStatus.isPopulated,
|
||||||
@@ -59,7 +59,6 @@ const selectIsPopulated = createSelector(
|
|||||||
tagsIsPopulated,
|
tagsIsPopulated,
|
||||||
uiSettingsIsPopulated,
|
uiSettingsIsPopulated,
|
||||||
generalSettingsIsPopulated,
|
generalSettingsIsPopulated,
|
||||||
languagesIsPopulated,
|
|
||||||
appProfilesIsPopulated,
|
appProfilesIsPopulated,
|
||||||
indexersIsPopulated,
|
indexersIsPopulated,
|
||||||
indexerStatusIsPopulated,
|
indexerStatusIsPopulated,
|
||||||
@@ -71,7 +70,6 @@ const selectIsPopulated = createSelector(
|
|||||||
tagsIsPopulated &&
|
tagsIsPopulated &&
|
||||||
uiSettingsIsPopulated &&
|
uiSettingsIsPopulated &&
|
||||||
generalSettingsIsPopulated &&
|
generalSettingsIsPopulated &&
|
||||||
languagesIsPopulated &&
|
|
||||||
appProfilesIsPopulated &&
|
appProfilesIsPopulated &&
|
||||||
indexersIsPopulated &&
|
indexersIsPopulated &&
|
||||||
indexerStatusIsPopulated &&
|
indexerStatusIsPopulated &&
|
||||||
@@ -86,7 +84,6 @@ const selectErrors = createSelector(
|
|||||||
(state) => state.tags.error,
|
(state) => state.tags.error,
|
||||||
(state) => state.settings.ui.error,
|
(state) => state.settings.ui.error,
|
||||||
(state) => state.settings.general.error,
|
(state) => state.settings.general.error,
|
||||||
(state) => state.settings.languages.error,
|
|
||||||
(state) => state.settings.appProfiles.error,
|
(state) => state.settings.appProfiles.error,
|
||||||
(state) => state.indexers.error,
|
(state) => state.indexers.error,
|
||||||
(state) => state.indexerStatus.error,
|
(state) => state.indexerStatus.error,
|
||||||
@@ -97,7 +94,6 @@ const selectErrors = createSelector(
|
|||||||
tagsError,
|
tagsError,
|
||||||
uiSettingsError,
|
uiSettingsError,
|
||||||
generalSettingsError,
|
generalSettingsError,
|
||||||
languagesError,
|
|
||||||
appProfilesError,
|
appProfilesError,
|
||||||
indexersError,
|
indexersError,
|
||||||
indexerStatusError,
|
indexerStatusError,
|
||||||
@@ -109,7 +105,6 @@ const selectErrors = createSelector(
|
|||||||
tagsError ||
|
tagsError ||
|
||||||
uiSettingsError ||
|
uiSettingsError ||
|
||||||
generalSettingsError ||
|
generalSettingsError ||
|
||||||
languagesError ||
|
|
||||||
appProfilesError ||
|
appProfilesError ||
|
||||||
indexersError ||
|
indexersError ||
|
||||||
indexerStatusError ||
|
indexerStatusError ||
|
||||||
@@ -123,7 +118,6 @@ const selectErrors = createSelector(
|
|||||||
tagsError,
|
tagsError,
|
||||||
uiSettingsError,
|
uiSettingsError,
|
||||||
generalSettingsError,
|
generalSettingsError,
|
||||||
languagesError,
|
|
||||||
appProfilesError,
|
appProfilesError,
|
||||||
indexersError,
|
indexersError,
|
||||||
indexerStatusError,
|
indexerStatusError,
|
||||||
@@ -140,18 +134,21 @@ function createMapStateToProps() {
|
|||||||
selectErrors,
|
selectErrors,
|
||||||
selectAppProps,
|
selectAppProps,
|
||||||
createDimensionsSelector(),
|
createDimensionsSelector(),
|
||||||
|
createSystemStatusSelector(),
|
||||||
(
|
(
|
||||||
enableColorImpairedMode,
|
enableColorImpairedMode,
|
||||||
isPopulated,
|
isPopulated,
|
||||||
errors,
|
errors,
|
||||||
app,
|
app,
|
||||||
dimensions
|
dimensions,
|
||||||
|
systemStatus
|
||||||
) => {
|
) => {
|
||||||
return {
|
return {
|
||||||
...app,
|
...app,
|
||||||
...errors,
|
...errors,
|
||||||
isPopulated,
|
isPopulated,
|
||||||
isSmallScreen: dimensions.isSmallScreen,
|
isSmallScreen: dimensions.isSmallScreen,
|
||||||
|
authenticationEnabled: systemStatus.authentication !== 'none',
|
||||||
enableColorImpairedMode
|
enableColorImpairedMode
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -166,9 +163,6 @@ function createMapDispatchToProps(dispatch, props) {
|
|||||||
dispatchFetchTags() {
|
dispatchFetchTags() {
|
||||||
dispatch(fetchTags());
|
dispatch(fetchTags());
|
||||||
},
|
},
|
||||||
dispatchFetchLanguages() {
|
|
||||||
dispatch(fetchLanguages());
|
|
||||||
},
|
|
||||||
dispatchFetchIndexers() {
|
dispatchFetchIndexers() {
|
||||||
dispatch(fetchIndexers());
|
dispatch(fetchIndexers());
|
||||||
},
|
},
|
||||||
@@ -216,7 +210,6 @@ class PageConnector extends Component {
|
|||||||
if (!this.props.isPopulated) {
|
if (!this.props.isPopulated) {
|
||||||
this.props.dispatchFetchCustomFilters();
|
this.props.dispatchFetchCustomFilters();
|
||||||
this.props.dispatchFetchTags();
|
this.props.dispatchFetchTags();
|
||||||
this.props.dispatchFetchLanguages();
|
|
||||||
this.props.dispatchFetchAppProfiles();
|
this.props.dispatchFetchAppProfiles();
|
||||||
this.props.dispatchFetchIndexers();
|
this.props.dispatchFetchIndexers();
|
||||||
this.props.dispatchFetchIndexerStatus();
|
this.props.dispatchFetchIndexerStatus();
|
||||||
@@ -242,7 +235,6 @@ class PageConnector extends Component {
|
|||||||
isPopulated,
|
isPopulated,
|
||||||
hasError,
|
hasError,
|
||||||
dispatchFetchTags,
|
dispatchFetchTags,
|
||||||
dispatchFetchLanguages,
|
|
||||||
dispatchFetchAppProfiles,
|
dispatchFetchAppProfiles,
|
||||||
dispatchFetchIndexers,
|
dispatchFetchIndexers,
|
||||||
dispatchFetchIndexerStatus,
|
dispatchFetchIndexerStatus,
|
||||||
@@ -283,7 +275,6 @@ PageConnector.propTypes = {
|
|||||||
isSidebarVisible: PropTypes.bool.isRequired,
|
isSidebarVisible: PropTypes.bool.isRequired,
|
||||||
dispatchFetchCustomFilters: PropTypes.func.isRequired,
|
dispatchFetchCustomFilters: PropTypes.func.isRequired,
|
||||||
dispatchFetchTags: PropTypes.func.isRequired,
|
dispatchFetchTags: PropTypes.func.isRequired,
|
||||||
dispatchFetchLanguages: PropTypes.func.isRequired,
|
|
||||||
dispatchFetchAppProfiles: PropTypes.func.isRequired,
|
dispatchFetchAppProfiles: PropTypes.func.isRequired,
|
||||||
dispatchFetchIndexers: PropTypes.func.isRequired,
|
dispatchFetchIndexers: PropTypes.func.isRequired,
|
||||||
dispatchFetchIndexerStatus: PropTypes.func.isRequired,
|
dispatchFetchIndexerStatus: PropTypes.func.isRequired,
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ function PageContent(props) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<ErrorBoundary errorComponent={PageContentError}>
|
<ErrorBoundary errorComponent={PageContentError}>
|
||||||
<DocumentTitle title={title ? `${title} - Prowlarr` : 'Prowlarr'}>
|
<DocumentTitle title={title ? `${title} - ${window.Prowlarr.instanceName}` : window.Prowlarr.instanceName}>
|
||||||
<div className={className}>
|
<div className={className}>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
background-color: #f1f1f1;
|
background-color: var(--pageFooterBackground);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: $breakpointSmall) {
|
@media only screen and (max-width: $breakpointSmall) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.jumpBarItem {
|
.jumpBarItem {
|
||||||
flex: 1 1 $jumpBarItemHeight;
|
flex: 1 1 $jumpBarItemHeight;
|
||||||
border-bottom: 1px solid $borderColor;
|
border-bottom: 1px solid var(--borderColor);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
.message {
|
.message {
|
||||||
display: flex;
|
display: flex;
|
||||||
border-left: 3px solid $infoColor;
|
border-left: 3px solid var(--infoColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.iconContainer,
|
.iconContainer,
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
padding: 2px 0;
|
padding: 2px 0;
|
||||||
color: $sidebarColor;
|
color: var(--sidebarColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.iconContainer {
|
.iconContainer {
|
||||||
@@ -26,17 +26,17 @@
|
|||||||
/* Types */
|
/* Types */
|
||||||
|
|
||||||
.error {
|
.error {
|
||||||
border-left-color: $dangerColor;
|
border-left-color: var(--dangerColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.info {
|
.info {
|
||||||
border-left-color: $infoColor;
|
border-left-color: var(--infoColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.success {
|
.success {
|
||||||
border-left-color: $successColor;
|
border-left-color: var(--successColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning {
|
.warning {
|
||||||
border-left-color: $warningColor;
|
border-left-color: var(--warningColor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
flex: 0 0 $sidebarWidth;
|
flex: 0 0 $sidebarWidth;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
width: $sidebarWidth;
|
width: $sidebarWidth;
|
||||||
background-color: $sidebarBackgroundColor;
|
background-color: var(--sidebarBackgroundColor);
|
||||||
transition: transform 300ms ease-in-out;
|
transition: transform 300ms ease-in-out;
|
||||||
transform: translateX(0);
|
transform: translateX(0);
|
||||||
}
|
}
|
||||||
@@ -11,8 +11,8 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background-color: $sidebarBackgroundColor;
|
background-color: var(--sidebarBackgroundColor);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: $breakpointSmall) {
|
@media only screen and (max-width: $breakpointSmall) {
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ const SIDEBAR_WIDTH = parseInt(dimensions.sidebarWidth);
|
|||||||
const links = [
|
const links = [
|
||||||
{
|
{
|
||||||
iconName: icons.MOVIE_CONTINUING,
|
iconName: icons.MOVIE_CONTINUING,
|
||||||
title: 'Indexers',
|
title: translate('Indexers'),
|
||||||
to: '/',
|
to: '/',
|
||||||
alias: '/movies',
|
alias: '/indexers',
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
title: translate('Stats'),
|
title: translate('Stats'),
|
||||||
@@ -33,13 +33,13 @@ const links = [
|
|||||||
|
|
||||||
{
|
{
|
||||||
iconName: icons.SEARCH,
|
iconName: icons.SEARCH,
|
||||||
title: 'Search',
|
title: translate('Search'),
|
||||||
to: '/search'
|
to: '/search'
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
iconName: icons.ACTIVITY,
|
iconName: icons.ACTIVITY,
|
||||||
title: 'History',
|
title: translate('History'),
|
||||||
to: '/history'
|
to: '/history'
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
.item {
|
.item {
|
||||||
border-left: 3px solid transparent;
|
border-left: 3px solid transparent;
|
||||||
color: $sidebarColor;
|
color: var(--sidebarColor);
|
||||||
transition: border-left 0.3s ease-in-out;
|
transition: border-left 0.3s ease-in-out;
|
||||||
}
|
}
|
||||||
|
|
||||||
.isActiveItem {
|
.isActiveItem {
|
||||||
border-left: 3px solid $themeBlue;
|
border-left: 3px solid var(--themeBlue);
|
||||||
}
|
}
|
||||||
|
|
||||||
.link {
|
.link {
|
||||||
display: block;
|
display: block;
|
||||||
padding: 12px 24px;
|
padding: 12px 24px;
|
||||||
color: $sidebarColor;
|
color: var(--sidebarColor);
|
||||||
|
|
||||||
&:hover,
|
&:hover,
|
||||||
&:focus {
|
&:focus {
|
||||||
color: $themeBlue;
|
color: var(--themeBlue);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -27,11 +27,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.isActiveLink {
|
.isActiveLink {
|
||||||
color: $themeBlue;
|
color: var(--themeBlue);
|
||||||
}
|
}
|
||||||
|
|
||||||
.isActiveParentLink {
|
.isActiveParentLink {
|
||||||
background-color: $sidebarActiveBackgroundColor;
|
background-color: var(--sidebarActiveBackgroundColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.iconContainer {
|
.iconContainer {
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
padding: 0 20px;
|
padding: 0 20px;
|
||||||
height: $toolbarHeight;
|
height: $toolbarHeight;
|
||||||
background-color: $toolbarBackgroundColor;
|
background-color: var(--toolbarBackgroundColor);
|
||||||
color: $toolbarColor;
|
color: var(--toolbarColor);
|
||||||
line-height: 60px;
|
line-height: 60px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,16 +6,16 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
color: $toobarButtonHoverColor;
|
color: var(--toobarButtonHoverColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.isDisabled {
|
&.isDisabled {
|
||||||
color: $disabledColor;
|
color: var(--disabledColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.isDisabled {
|
.isDisabled {
|
||||||
color: $disabledColor;
|
color: var(--disabledColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.labelContainer {
|
.labelContainer {
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
.label {
|
.label {
|
||||||
padding: 0 3px;
|
padding: 0 3px;
|
||||||
color: $toolbarLabelColor;
|
color: var(--toolbarLabelColor);
|
||||||
font-size: $extraSmallFontSize;
|
font-size: $extraSmallFontSize;
|
||||||
line-height: calc($extraSmallFontSize + 1px);
|
line-height: calc($extraSmallFontSize + 1px);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,13 +14,13 @@
|
|||||||
width: 0;
|
width: 0;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
|
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
|
||||||
color: $white;
|
color: var(--white);
|
||||||
transition: width 0.6s ease;
|
transition: width 0.6s ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
.frontTextContainer {
|
.frontTextContainer {
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
color: $white;
|
color: var(--white);
|
||||||
}
|
}
|
||||||
|
|
||||||
.backTextContainer,
|
.backTextContainer,
|
||||||
@@ -42,39 +42,35 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.primary {
|
.primary {
|
||||||
background-color: $primaryColor;
|
background-color: var(--primaryColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.danger {
|
.danger {
|
||||||
background-color: $dangerColor;
|
background-color: var(--dangerColor);
|
||||||
|
|
||||||
&:global(.colorImpaired) {
|
&: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(var(--dangerColor) shade(5%)), color(var(--dangerColor) shade(5%)) 5px, color(var(--dangerColor) shade(15%)) 5px, color(var(--dangerColor) shade(15%)) 10px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.success {
|
.success {
|
||||||
background-color: $successColor;
|
background-color: var(--successColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.purple {
|
.purple {
|
||||||
background-color: $purple;
|
background-color: var(--purple);
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning {
|
.warning {
|
||||||
background-color: $warningColor;
|
background-color: var(--warningColor);
|
||||||
|
|
||||||
&:global(.colorImpaired) {
|
&: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, var(--warningColor), var(--warningColor) 5px, color(var(--warningColor) tint(15%)) 5px, color(var(--warningColor) tint(15%)) 10px);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.info {
|
.info {
|
||||||
background-color: $infoColor;
|
background-color: var(--infoColor);
|
||||||
}
|
|
||||||
|
|
||||||
.queue {
|
|
||||||
background-color: $queueColor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.small {
|
.small {
|
||||||
|
|||||||
@@ -10,10 +10,10 @@
|
|||||||
min-height: 100px;
|
min-height: 100px;
|
||||||
border: 1px solid transparent;
|
border: 1px solid transparent;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
background-color: $scrollbarBackgroundColor;
|
background-color: var(--scrollbarBackgroundColor);
|
||||||
background-clip: padding-box;
|
background-clip: padding-box;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: $scrollbarHoverBackgroundColor;
|
background-color: var(--scrollbarHoverBackgroundColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
border: 1px solid #aaa;
|
border: 1px solid #aaa;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: #fafafa;
|
background: var(--inputBackgroundColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.checkContainer {
|
.checkContainer {
|
||||||
|
|||||||
@@ -46,11 +46,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.records {
|
.records {
|
||||||
color: $disabledColor;
|
color: var(--disabledColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.disabledPageButton {
|
.disabledPageButton {
|
||||||
color: $disabledColor;
|
color: var(--disabledColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
.pageSelect {
|
.pageSelect {
|
||||||
|
|||||||
@@ -2,6 +2,6 @@
|
|||||||
transition: background-color 500ms;
|
transition: background-color 500ms;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: $tableRowHoverBackgroundColor;
|
background-color: var(--tableRowHoverBackgroundColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
transition: background-color 500ms;
|
transition: background-color 500ms;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: #fafbfc;
|
background-color: var(--tableRowHoverBackgroundColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
.title {
|
.title {
|
||||||
padding: 10px 20px;
|
padding: 10px 20px;
|
||||||
border-bottom: 1px solid $popoverTitleBorderColor;
|
border-bottom: 1px solid var(--popoverTitleBorderColor);
|
||||||
background-color: $popoverTitleBackgroundColor;
|
background-color: var(--popoverTitleBackgroundColor);
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,13 +7,13 @@
|
|||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
&.default {
|
&.default {
|
||||||
background-color: $white;
|
background-color: var(--popoverBodyBackgroundColor);
|
||||||
box-shadow: 0 5px 10px $popoverShadowColor;
|
box-shadow: 0 5px 10px var(--popoverShadowColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.inverse {
|
&.inverse {
|
||||||
background-color: $themeDarkColor;
|
background-color: var(--themeDarkColor);
|
||||||
box-shadow: 0 5px 10px $popoverShadowInverseColor;
|
box-shadow: 0 5px 10px var(--popoverShadowInverseColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,20 +49,20 @@
|
|||||||
content: ' ';
|
content: ' ';
|
||||||
|
|
||||||
&.default {
|
&.default {
|
||||||
border-top-color: $popoverArrowBorderColor;
|
border-top-color: var(--popoverArrowBorderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.inverse {
|
&.inverse {
|
||||||
border-top-color: $popoverArrowBorderInverseColor;
|
border-top-color: var(--popoverArrowBorderInverseColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.default {
|
&.default {
|
||||||
border-top-color: $popoverArrowBorderColor;
|
border-top-color: var(--popoverArrowBorderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.inverse {
|
&.inverse {
|
||||||
border-top-color: $popoverArrowBorderInverseColor;
|
border-top-color: var(--popoverArrowBorderInverseColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,20 +78,20 @@
|
|||||||
content: ' ';
|
content: ' ';
|
||||||
|
|
||||||
&.default {
|
&.default {
|
||||||
border-right-color: $popoverArrowBorderColor;
|
border-right-color: var(--popoverArrowBorderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.inverse {
|
&.inverse {
|
||||||
border-right-color: $popoverArrowBorderInverseColor;
|
border-right-color: var(--popoverArrowBorderInverseColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.default {
|
&.default {
|
||||||
border-right-color: $popoverArrowBorderColor;
|
border-right-color: var(--popoverArrowBorderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.inverse {
|
&.inverse {
|
||||||
border-right-color: $popoverArrowBorderInverseColor;
|
border-right-color: var(--popoverArrowBorderInverseColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,20 +107,20 @@
|
|||||||
content: ' ';
|
content: ' ';
|
||||||
|
|
||||||
&.default {
|
&.default {
|
||||||
border-bottom-color: $popoverArrowBorderColor;
|
border-bottom-color: var(--popoverArrowBorderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.inverse {
|
&.inverse {
|
||||||
border-bottom-color: $popoverArrowBorderInverseColor;
|
border-bottom-color: var(--popoverArrowBorderInverseColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.default {
|
&.default {
|
||||||
border-bottom-color: $popoverArrowBorderColor;
|
border-bottom-color: var(--popoverArrowBorderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.inverse {
|
&.inverse {
|
||||||
border-bottom-color: $popoverArrowBorderInverseColor;
|
border-bottom-color: var(--popoverArrowBorderInverseColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,20 +136,20 @@
|
|||||||
content: ' ';
|
content: ' ';
|
||||||
|
|
||||||
&.default {
|
&.default {
|
||||||
border-left-color: $popoverArrowBorderColor;
|
border-left-color: var(--popoverArrowBorderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.inverse {
|
&.inverse {
|
||||||
border-left-color: $popoverArrowBorderInverseColor;
|
border-left-color: var(--popoverArrowBorderInverseColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.default {
|
&.default {
|
||||||
border-left-color: $popoverArrowBorderColor;
|
border-left-color: var(--popoverArrowBorderColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
&.inverse {
|
&.inverse {
|
||||||
border-left-color: $popoverArrowBorderInverseColor;
|
border-left-color: var(--popoverArrowBorderInverseColor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React from 'react';
|
||||||
|
import Modal from 'Components/Modal/Modal';
|
||||||
|
import { sizes } from 'Helpers/Props';
|
||||||
|
import AuthenticationRequiredModalContentConnector from './AuthenticationRequiredModalContentConnector';
|
||||||
|
|
||||||
|
function onModalClose() {
|
||||||
|
// No-op
|
||||||
|
}
|
||||||
|
|
||||||
|
function AuthenticationRequiredModal(props) {
|
||||||
|
const {
|
||||||
|
isOpen
|
||||||
|
} = props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Modal
|
||||||
|
size={sizes.MEDIUM}
|
||||||
|
isOpen={isOpen}
|
||||||
|
closeOnBackgroundClick={false}
|
||||||
|
onModalClose={onModalClose}
|
||||||
|
>
|
||||||
|
<AuthenticationRequiredModalContentConnector
|
||||||
|
onModalClose={onModalClose}
|
||||||
|
/>
|
||||||
|
</Modal>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
AuthenticationRequiredModal.propTypes = {
|
||||||
|
isOpen: PropTypes.bool.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AuthenticationRequiredModal;
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
.authRequiredAlert {
|
||||||
|
composes: alert from '~Components/Alert.css';
|
||||||
|
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
@@ -0,0 +1,165 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { useEffect, useRef } from 'react';
|
||||||
|
import Alert from 'Components/Alert';
|
||||||
|
import FormGroup from 'Components/Form/FormGroup';
|
||||||
|
import FormInputGroup from 'Components/Form/FormInputGroup';
|
||||||
|
import FormLabel from 'Components/Form/FormLabel';
|
||||||
|
import SpinnerButton from 'Components/Link/SpinnerButton';
|
||||||
|
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||||
|
import ModalBody from 'Components/Modal/ModalBody';
|
||||||
|
import ModalContent from 'Components/Modal/ModalContent';
|
||||||
|
import ModalFooter from 'Components/Modal/ModalFooter';
|
||||||
|
import ModalHeader from 'Components/Modal/ModalHeader';
|
||||||
|
import { inputTypes, kinds } from 'Helpers/Props';
|
||||||
|
import { authenticationMethodOptions, authenticationRequiredOptions, authenticationRequiredWarning } from 'Settings/General/SecuritySettings';
|
||||||
|
import translate from 'Utilities/String/translate';
|
||||||
|
import styles from './AuthenticationRequiredModalContent.css';
|
||||||
|
|
||||||
|
function onModalClose() {
|
||||||
|
// No-op
|
||||||
|
}
|
||||||
|
|
||||||
|
function AuthenticationRequiredModalContent(props) {
|
||||||
|
const {
|
||||||
|
isPopulated,
|
||||||
|
error,
|
||||||
|
isSaving,
|
||||||
|
settings,
|
||||||
|
onInputChange,
|
||||||
|
onSavePress,
|
||||||
|
dispatchFetchStatus
|
||||||
|
} = props;
|
||||||
|
|
||||||
|
const {
|
||||||
|
authenticationMethod,
|
||||||
|
authenticationRequired,
|
||||||
|
username,
|
||||||
|
password
|
||||||
|
} = settings;
|
||||||
|
|
||||||
|
const authenticationEnabled = authenticationMethod && authenticationMethod.value !== 'none';
|
||||||
|
|
||||||
|
const didMount = useRef(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!isSaving && didMount.current) {
|
||||||
|
dispatchFetchStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
didMount.current = true;
|
||||||
|
}, [isSaving, dispatchFetchStatus]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ModalContent
|
||||||
|
showCloseButton={false}
|
||||||
|
onModalClose={onModalClose}
|
||||||
|
>
|
||||||
|
<ModalHeader>
|
||||||
|
{translate('AuthenticationRequired')}
|
||||||
|
</ModalHeader>
|
||||||
|
|
||||||
|
<ModalBody>
|
||||||
|
<Alert
|
||||||
|
className={styles.authRequiredAlert}
|
||||||
|
kind={kinds.WARNING}
|
||||||
|
>
|
||||||
|
{authenticationRequiredWarning}
|
||||||
|
</Alert>
|
||||||
|
|
||||||
|
{
|
||||||
|
isPopulated && !error ?
|
||||||
|
<div>
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>{translate('Authentication')}</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.SELECT}
|
||||||
|
name="authenticationMethod"
|
||||||
|
values={authenticationMethodOptions}
|
||||||
|
helpText={translate('AuthenticationMethodHelpText')}
|
||||||
|
onChange={onInputChange}
|
||||||
|
{...authenticationMethod}
|
||||||
|
/>
|
||||||
|
</FormGroup>
|
||||||
|
|
||||||
|
{
|
||||||
|
authenticationEnabled ?
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>{translate('AuthenticationRequired')}</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.SELECT}
|
||||||
|
name="authenticationRequired"
|
||||||
|
values={authenticationRequiredOptions}
|
||||||
|
helpText={translate('AuthenticationRequiredHelpText')}
|
||||||
|
onChange={onInputChange}
|
||||||
|
{...authenticationRequired}
|
||||||
|
/>
|
||||||
|
</FormGroup> :
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
authenticationEnabled ?
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>{translate('Username')}</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.TEXT}
|
||||||
|
name="username"
|
||||||
|
onChange={onInputChange}
|
||||||
|
{...username}
|
||||||
|
/>
|
||||||
|
</FormGroup> :
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
authenticationEnabled ?
|
||||||
|
<FormGroup>
|
||||||
|
<FormLabel>{translate('Password')}</FormLabel>
|
||||||
|
|
||||||
|
<FormInputGroup
|
||||||
|
type={inputTypes.PASSWORD}
|
||||||
|
name="password"
|
||||||
|
onChange={onInputChange}
|
||||||
|
{...password}
|
||||||
|
/>
|
||||||
|
</FormGroup> :
|
||||||
|
null
|
||||||
|
}
|
||||||
|
</div> :
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
!isPopulated && !error ? <LoadingIndicator /> : null
|
||||||
|
}
|
||||||
|
</ModalBody>
|
||||||
|
|
||||||
|
<ModalFooter>
|
||||||
|
<SpinnerButton
|
||||||
|
kind={kinds.PRIMARY}
|
||||||
|
isSpinning={isSaving}
|
||||||
|
isDisabled={!authenticationEnabled}
|
||||||
|
onPress={onSavePress}
|
||||||
|
>
|
||||||
|
{translate('Save')}
|
||||||
|
</SpinnerButton>
|
||||||
|
</ModalFooter>
|
||||||
|
</ModalContent>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
AuthenticationRequiredModalContent.propTypes = {
|
||||||
|
isPopulated: PropTypes.bool.isRequired,
|
||||||
|
error: PropTypes.object,
|
||||||
|
isSaving: PropTypes.bool.isRequired,
|
||||||
|
saveError: PropTypes.object,
|
||||||
|
settings: PropTypes.object.isRequired,
|
||||||
|
onInputChange: PropTypes.func.isRequired,
|
||||||
|
onSavePress: PropTypes.func.isRequired,
|
||||||
|
dispatchFetchStatus: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AuthenticationRequiredModalContent;
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import React, { Component } from 'react';
|
||||||
|
import { connect } from 'react-redux';
|
||||||
|
import { createSelector } from 'reselect';
|
||||||
|
import { clearPendingChanges } from 'Store/Actions/baseActions';
|
||||||
|
import { fetchGeneralSettings, saveGeneralSettings, setGeneralSettingsValue } from 'Store/Actions/settingsActions';
|
||||||
|
import { fetchStatus } from 'Store/Actions/systemActions';
|
||||||
|
import createSettingsSectionSelector from 'Store/Selectors/createSettingsSectionSelector';
|
||||||
|
import AuthenticationRequiredModalContent from './AuthenticationRequiredModalContent';
|
||||||
|
|
||||||
|
const SECTION = 'general';
|
||||||
|
|
||||||
|
function createMapStateToProps() {
|
||||||
|
return createSelector(
|
||||||
|
createSettingsSectionSelector(SECTION),
|
||||||
|
(sectionSettings) => {
|
||||||
|
return {
|
||||||
|
...sectionSettings
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const mapDispatchToProps = {
|
||||||
|
dispatchClearPendingChanges: clearPendingChanges,
|
||||||
|
dispatchSetGeneralSettingsValue: setGeneralSettingsValue,
|
||||||
|
dispatchSaveGeneralSettings: saveGeneralSettings,
|
||||||
|
dispatchFetchGeneralSettings: fetchGeneralSettings,
|
||||||
|
dispatchFetchStatus: fetchStatus
|
||||||
|
};
|
||||||
|
|
||||||
|
class AuthenticationRequiredModalContentConnector extends Component {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Lifecycle
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
this.props.dispatchFetchGeneralSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
this.props.dispatchClearPendingChanges({ section: `settings.${SECTION}` });
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Listeners
|
||||||
|
|
||||||
|
onInputChange = ({ name, value }) => {
|
||||||
|
this.props.dispatchSetGeneralSettingsValue({ name, value });
|
||||||
|
};
|
||||||
|
|
||||||
|
onSavePress = () => {
|
||||||
|
this.props.dispatchSaveGeneralSettings();
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Render
|
||||||
|
|
||||||
|
render() {
|
||||||
|
const {
|
||||||
|
dispatchClearPendingChanges,
|
||||||
|
dispatchFetchGeneralSettings,
|
||||||
|
dispatchSetGeneralSettingsValue,
|
||||||
|
dispatchSaveGeneralSettings,
|
||||||
|
...otherProps
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<AuthenticationRequiredModalContent
|
||||||
|
{...otherProps}
|
||||||
|
onInputChange={this.onInputChange}
|
||||||
|
onSavePress={this.onSavePress}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AuthenticationRequiredModalContentConnector.propTypes = {
|
||||||
|
dispatchClearPendingChanges: PropTypes.func.isRequired,
|
||||||
|
dispatchFetchGeneralSettings: PropTypes.func.isRequired,
|
||||||
|
dispatchSetGeneralSettingsValue: PropTypes.func.isRequired,
|
||||||
|
dispatchSaveGeneralSettings: PropTypes.func.isRequired,
|
||||||
|
dispatchFetchStatus: PropTypes.func.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default connect(createMapStateToProps, mapDispatchToProps)(AuthenticationRequiredModalContentConnector);
|
||||||
@@ -8,6 +8,7 @@ export const DEVICE = 'device';
|
|||||||
export const KEY_VALUE_LIST = 'keyValueList';
|
export const KEY_VALUE_LIST = 'keyValueList';
|
||||||
export const INFO = 'info';
|
export const INFO = 'info';
|
||||||
export const MOVIE_MONITORED_SELECT = 'movieMonitoredSelect';
|
export const MOVIE_MONITORED_SELECT = 'movieMonitoredSelect';
|
||||||
|
export const CATEGORY_SELECT = 'newznabCategorySelect';
|
||||||
export const NUMBER = 'number';
|
export const NUMBER = 'number';
|
||||||
export const OAUTH = 'oauth';
|
export const OAUTH = 'oauth';
|
||||||
export const PASSWORD = 'password';
|
export const PASSWORD = 'password';
|
||||||
@@ -32,6 +33,7 @@ export const all = [
|
|||||||
KEY_VALUE_LIST,
|
KEY_VALUE_LIST,
|
||||||
INFO,
|
INFO,
|
||||||
MOVIE_MONITORED_SELECT,
|
MOVIE_MONITORED_SELECT,
|
||||||
|
CATEGORY_SELECT,
|
||||||
NUMBER,
|
NUMBER,
|
||||||
OAUTH,
|
OAUTH,
|
||||||
PASSWORD,
|
PASSWORD,
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ export const DEFAULT = 'default';
|
|||||||
export const DISABLED = 'disabled';
|
export const DISABLED = 'disabled';
|
||||||
export const INFO = 'info';
|
export const INFO = 'info';
|
||||||
export const INVERSE = 'inverse';
|
export const INVERSE = 'inverse';
|
||||||
export const PINK = 'pink';
|
|
||||||
export const PRIMARY = 'primary';
|
export const PRIMARY = 'primary';
|
||||||
export const PURPLE = 'purple';
|
export const PURPLE = 'purple';
|
||||||
export const SUCCESS = 'success';
|
export const SUCCESS = 'success';
|
||||||
@@ -16,7 +15,6 @@ export const all = [
|
|||||||
DISABLED,
|
DISABLED,
|
||||||
INFO,
|
INFO,
|
||||||
INVERSE,
|
INVERSE,
|
||||||
PINK,
|
|
||||||
PRIMARY,
|
PRIMARY,
|
||||||
PURPLE,
|
PURPLE,
|
||||||
SUCCESS,
|
SUCCESS,
|
||||||
|
|||||||
@@ -226,6 +226,42 @@ class HistoryRow extends Component {
|
|||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
data.label ?
|
||||||
|
<HistoryRowParameter
|
||||||
|
title='Label'
|
||||||
|
value={data.label}
|
||||||
|
/> :
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
data.track ?
|
||||||
|
<HistoryRowParameter
|
||||||
|
title='Track'
|
||||||
|
value={data.track}
|
||||||
|
/> :
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
data.year ?
|
||||||
|
<HistoryRowParameter
|
||||||
|
title='Year'
|
||||||
|
value={data.year}
|
||||||
|
/> :
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
data.genre ?
|
||||||
|
<HistoryRowParameter
|
||||||
|
title='Genre'
|
||||||
|
value={data.genre}
|
||||||
|
/> :
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
data.author ?
|
data.author ?
|
||||||
<HistoryRowParameter
|
<HistoryRowParameter
|
||||||
@@ -243,6 +279,15 @@ class HistoryRow extends Component {
|
|||||||
/> :
|
/> :
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
data.publisher ?
|
||||||
|
<HistoryRowParameter
|
||||||
|
title='Publisher'
|
||||||
|
value={data.publisher}
|
||||||
|
/> :
|
||||||
|
null
|
||||||
|
}
|
||||||
</TableRowCell>
|
</TableRowCell>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
margin: 2px 4px;
|
margin: 2px 4px;
|
||||||
border: 1px solid $borderColor;
|
border: 1px solid var(--borderColor);
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background-color: #eee;
|
background-color: var(--defaultHoverBackgroundColor);
|
||||||
cursor: default;
|
cursor: default;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
.value {
|
.value {
|
||||||
padding: 0 4px;
|
padding: 0 4px;
|
||||||
background-color: $white;
|
background-color: var(--defaultButtonBackgroundColor);
|
||||||
color: $defaultColor;
|
color: var(--defaultColor);
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ class AddIndexerModalContent extends Component {
|
|||||||
const filteredIndexers = indexers.filter((indexer) => {
|
const filteredIndexers = indexers.filter((indexer) => {
|
||||||
const { filter, filterProtocols, filterLanguages, filterPrivacyLevels } = this.state;
|
const { filter, filterProtocols, filterLanguages, filterPrivacyLevels } = this.state;
|
||||||
|
|
||||||
if (!indexer.name.toLowerCase().includes(filter.toLocaleLowerCase())) {
|
if (!indexer.name.toLowerCase().includes(filter.toLocaleLowerCase()) && !indexer.description.toLowerCase().includes(filter.toLocaleLowerCase())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ function EditIndexerModalContent(props) {
|
|||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
<FormGroup>
|
<FormGroup>
|
||||||
<FormLabel>{translate('AppProfile')}</FormLabel>
|
<FormLabel>{translate('SyncProfile')}</FormLabel>
|
||||||
|
|
||||||
<FormInputGroup
|
<FormInputGroup
|
||||||
type={inputTypes.APP_PROFILE_SELECT}
|
type={inputTypes.APP_PROFILE_SELECT}
|
||||||
|
|||||||
@@ -9,5 +9,5 @@
|
|||||||
|
|
||||||
.path {
|
.path {
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
color: $dangerColor;
|
color: var(--dangerColor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -133,7 +133,7 @@ class IndexerEditorFooter extends Component {
|
|||||||
|
|
||||||
<div className={styles.inputContainer}>
|
<div className={styles.inputContainer}>
|
||||||
<IndexerEditorFooterLabel
|
<IndexerEditorFooterLabel
|
||||||
label={translate('AppProfile')}
|
label={translate('SyncProfile')}
|
||||||
isSaving={isSaving && appProfileId !== NO_CHANGE}
|
isSaving={isSaving && appProfileId !== NO_CHANGE}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|||||||
@@ -61,15 +61,15 @@ class TagsModalContent extends Component {
|
|||||||
} = this.state;
|
} = this.state;
|
||||||
|
|
||||||
const applyTagsOptions = [
|
const applyTagsOptions = [
|
||||||
{ key: 'add', value: 'Add' },
|
{ key: 'add', value: translate('Add') },
|
||||||
{ key: 'remove', value: 'Remove' },
|
{ key: 'remove', value: translate('Remove') },
|
||||||
{ key: 'replace', value: 'Replace' }
|
{ key: 'replace', value: translate('Replace') }
|
||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ModalContent onModalClose={onModalClose}>
|
<ModalContent onModalClose={onModalClose}>
|
||||||
<ModalHeader>
|
<ModalHeader>
|
||||||
Tags
|
{translate('Tags')}
|
||||||
</ModalHeader>
|
</ModalHeader>
|
||||||
|
|
||||||
<ModalBody>
|
<ModalBody>
|
||||||
|
|||||||
@@ -221,7 +221,7 @@ class IndexerIndex extends Component {
|
|||||||
|
|
||||||
onKeyUp = (event) => {
|
onKeyUp = (event) => {
|
||||||
const jumpBarItems = this.state.jumpBarItems.order;
|
const jumpBarItems = this.state.jumpBarItems.order;
|
||||||
if (event.path.length === 4) {
|
if (event.composedPath && event.composedPath().length === 4) {
|
||||||
if (event.keyCode === keyCodes.HOME && event.ctrlKey) {
|
if (event.keyCode === keyCodes.HOME && event.ctrlKey) {
|
||||||
this.setState({ jumpToCharacter: jumpBarItems[0] });
|
this.setState({ jumpToCharacter: jumpBarItems[0] });
|
||||||
}
|
}
|
||||||
@@ -272,6 +272,7 @@ class IndexerIndex extends Component {
|
|||||||
saveError,
|
saveError,
|
||||||
isDeleting,
|
isDeleting,
|
||||||
isTestingAll,
|
isTestingAll,
|
||||||
|
isSyncingIndexers,
|
||||||
deleteError,
|
deleteError,
|
||||||
onScroll,
|
onScroll,
|
||||||
onSortSelect,
|
onSortSelect,
|
||||||
@@ -309,6 +310,15 @@ class IndexerIndex extends Component {
|
|||||||
onPress={this.onAddIndexerPress}
|
onPress={this.onAddIndexerPress}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<PageToolbarSeparator />
|
||||||
|
|
||||||
|
<PageToolbarButton
|
||||||
|
label={translate('SyncAppIndexers')}
|
||||||
|
iconName={icons.REFRESH}
|
||||||
|
isSpinning={isSyncingIndexers}
|
||||||
|
onPress={this.props.onAppIndexerSyncPress}
|
||||||
|
/>
|
||||||
|
|
||||||
<PageToolbarButton
|
<PageToolbarButton
|
||||||
label={translate('TestAllIndexers')}
|
label={translate('TestAllIndexers')}
|
||||||
iconName={icons.TEST}
|
iconName={icons.TEST}
|
||||||
@@ -493,10 +503,12 @@ IndexerIndex.propTypes = {
|
|||||||
saveError: PropTypes.object,
|
saveError: PropTypes.object,
|
||||||
isDeleting: PropTypes.bool.isRequired,
|
isDeleting: PropTypes.bool.isRequired,
|
||||||
isTestingAll: PropTypes.bool.isRequired,
|
isTestingAll: PropTypes.bool.isRequired,
|
||||||
|
isSyncingIndexers: PropTypes.bool.isRequired,
|
||||||
deleteError: PropTypes.object,
|
deleteError: PropTypes.object,
|
||||||
onSortSelect: PropTypes.func.isRequired,
|
onSortSelect: PropTypes.func.isRequired,
|
||||||
onFilterSelect: PropTypes.func.isRequired,
|
onFilterSelect: PropTypes.func.isRequired,
|
||||||
onTestAllPress: PropTypes.func.isRequired,
|
onTestAllPress: PropTypes.func.isRequired,
|
||||||
|
onAppIndexerSyncPress: PropTypes.func.isRequired,
|
||||||
onScroll: PropTypes.func.isRequired,
|
onScroll: PropTypes.func.isRequired,
|
||||||
onSaveSelected: PropTypes.func.isRequired
|
onSaveSelected: PropTypes.func.isRequired
|
||||||
};
|
};
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user