mirror of
https://github.com/Radarr/Radarr.git
synced 2026-04-18 21:35:51 -04:00
Compare commits
287 Commits
zeus-oidc
...
v4.5.1.728
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
976712d6d7 | ||
|
|
b32d168742 | ||
|
|
20301bdb78 | ||
|
|
64e524633c | ||
|
|
d8b724346c | ||
|
|
de010ce536 | ||
|
|
c9b09faae9 | ||
|
|
8a49463053 | ||
|
|
0a89c4d110 | ||
|
|
401edeabba | ||
|
|
abddce1cfa | ||
|
|
3350071a83 | ||
|
|
223eddeb0b | ||
|
|
a953d1a6c5 | ||
|
|
38d946ed79 | ||
|
|
e0389ca08c | ||
|
|
d021517f4b | ||
|
|
7bbf7d2461 | ||
|
|
a1e622a363 | ||
|
|
8563ed0a20 | ||
|
|
164f9ca868 | ||
|
|
782a257779 | ||
|
|
b7419c31df | ||
|
|
8b958708da | ||
|
|
07f0e89f11 | ||
|
|
ae63b85753 | ||
|
|
a38b28f4df | ||
|
|
b0cd7ae356 | ||
|
|
fe164c1def | ||
|
|
06a214e901 | ||
|
|
51901dbb37 | ||
|
|
850fef5c43 | ||
|
|
ff1449c01e | ||
|
|
51a583b59b | ||
|
|
2a72a32d28 | ||
|
|
836017c01b | ||
|
|
85aac789f4 | ||
|
|
9ec1235b62 | ||
|
|
b5bf5eae26 | ||
|
|
e7ff79f48d | ||
|
|
41fb0eb7c6 | ||
|
|
eeb997430c | ||
|
|
d2112f2bdc | ||
|
|
d5e61c3450 | ||
|
|
b3037248a2 | ||
|
|
39271eb33c | ||
|
|
cc28519d6d | ||
|
|
7b8c21fc76 | ||
|
|
f68fd9c2d9 | ||
|
|
116db9701b | ||
|
|
6ec12d71dc | ||
|
|
6dc558cbf6 | ||
|
|
d2787d8181 | ||
|
|
89fd3e4671 | ||
|
|
1807ccfc48 | ||
|
|
7c67382f6f | ||
|
|
3738750fa1 | ||
|
|
6086b0d4e4 | ||
|
|
66b7b3b7d6 | ||
|
|
5e338c93a3 | ||
|
|
554ab21d38 | ||
|
|
0858f6732a | ||
|
|
4c2bf285fc | ||
|
|
cba4850769 | ||
|
|
f1fcab75f5 | ||
|
|
44bec71752 | ||
|
|
b44f050246 | ||
|
|
a0068a3ed9 | ||
|
|
8e1bf785c3 | ||
|
|
cc63c3f3cd | ||
|
|
d3e6d7cd05 | ||
|
|
066d9dd1d4 | ||
|
|
dc2759ddcb | ||
|
|
cc4a80947f | ||
|
|
3e643644cd | ||
|
|
1336743aca | ||
|
|
bf3e23cc3b | ||
|
|
a41999f9c2 | ||
|
|
80d7bdb834 | ||
|
|
efd4abfa3e | ||
|
|
9bef430635 | ||
|
|
a03323703a | ||
|
|
c3f30fb237 | ||
|
|
91f1fd9dd0 | ||
|
|
ba7551ec65 | ||
|
|
5d061a8729 | ||
|
|
875bf0c59e | ||
|
|
7527eff268 | ||
|
|
e32383e763 | ||
|
|
84e0f5bfcf | ||
|
|
138b1e1c9d | ||
|
|
adee52d8c2 | ||
|
|
c61735cde2 | ||
|
|
7f71caaf7f | ||
|
|
e139e7330e | ||
|
|
e88c44915f | ||
|
|
7501fe095e | ||
|
|
1bc299fd35 | ||
|
|
c2736bbe27 | ||
|
|
2d96c308f0 | ||
|
|
e85c010bf2 | ||
|
|
ee5fed8522 | ||
|
|
df26229e4d | ||
|
|
e0b91c6406 | ||
|
|
68832a136e | ||
|
|
b18cd2f33a | ||
|
|
36b055d372 | ||
|
|
3a8f1f5e58 | ||
|
|
55770d3f17 | ||
|
|
ff185c6111 | ||
|
|
e2445a61b6 | ||
|
|
ac8085fb59 | ||
|
|
c6bb5024bc | ||
|
|
d32582fa7c | ||
|
|
223f04ef46 | ||
|
|
85112e7fbd | ||
|
|
014079cf37 | ||
|
|
d4a347b2ba | ||
|
|
2ac72d1588 | ||
|
|
a77cb25513 | ||
|
|
fddea0543c | ||
|
|
fffa373384 | ||
|
|
91ff76c0c8 | ||
|
|
6f5bac7eed | ||
|
|
b34a7c6e2e | ||
|
|
a6ce314db5 | ||
|
|
b8ce140abc | ||
|
|
d851ecdf2f | ||
|
|
7e37615ec1 | ||
|
|
204a8bab79 | ||
|
|
0158c84a98 | ||
|
|
ac51a943fb | ||
|
|
78edc9aa43 | ||
|
|
f2bf494cef | ||
|
|
5727e7c43b | ||
|
|
a7ba1a6454 | ||
|
|
cc285fab45 | ||
|
|
e0ad573e7f | ||
|
|
9a23b7f0fc | ||
|
|
85aecbe67e | ||
|
|
bbb20e95af | ||
|
|
3fb337e20b | ||
|
|
5e63da418e | ||
|
|
890f9d6fe4 | ||
|
|
8a496cbdae | ||
|
|
f54a5388a0 | ||
|
|
6961633cc9 | ||
|
|
1be450a9d0 | ||
|
|
2b4d6464e2 | ||
|
|
ee4c34bd6c | ||
|
|
07d41f7902 | ||
|
|
bb573594d9 | ||
|
|
12e360ab4f | ||
|
|
bae555f63e | ||
|
|
31abb93d8c | ||
|
|
75035035e1 | ||
|
|
c1e5990a58 | ||
|
|
4a42ebe44c | ||
|
|
c82aa5c2c7 | ||
|
|
d1bae32e1c | ||
|
|
c514c7cac0 | ||
|
|
3d244057b5 | ||
|
|
323510300c | ||
|
|
669d87b7ef | ||
|
|
ec7f7b085a | ||
|
|
ecc906a754 | ||
|
|
d0fcac389c | ||
|
|
621acbef9a | ||
|
|
7fb1163b23 | ||
|
|
b48eda95dd | ||
|
|
4627093616 | ||
|
|
a006984d5e | ||
|
|
7d9183ef12 | ||
|
|
d35c6683e9 | ||
|
|
ac26bcddd9 | ||
|
|
15bafce8cc | ||
|
|
2167da87ce | ||
|
|
926d37a572 | ||
|
|
42c9e4e3e5 | ||
|
|
89b609a221 | ||
|
|
dfc9f74116 | ||
|
|
189603c756 | ||
|
|
a78693a2f7 | ||
|
|
cea0c5033a | ||
|
|
1e3a42bf42 | ||
|
|
030744ab7b | ||
|
|
17fda02d8c | ||
|
|
aabf6b9ff8 | ||
|
|
7b2fd5140b | ||
|
|
b6b10d7c6f | ||
|
|
16fcf0b56b | ||
|
|
c222a1a434 | ||
|
|
c6e91e028b | ||
|
|
fcf5984944 | ||
|
|
fdfe8ca656 | ||
|
|
150a5c1fc6 | ||
|
|
9ea0957351 | ||
|
|
8befa436cc | ||
|
|
53fdb6f07f | ||
|
|
0697dbff96 | ||
|
|
34924859aa | ||
|
|
9c86598b54 | ||
|
|
0fe2262162 | ||
|
|
47353aea75 | ||
|
|
af43cb2aca | ||
|
|
bc838b74c7 | ||
|
|
cbcf3d1058 | ||
|
|
c72e64f081 | ||
|
|
e09607edb0 | ||
|
|
d91578aee3 | ||
|
|
affedd7f9d | ||
|
|
c3665e9fea | ||
|
|
364d8bd7c5 | ||
|
|
7142d1f224 | ||
|
|
86777e021b | ||
|
|
9d2dacea97 | ||
|
|
d98c86c3d9 | ||
|
|
df681d82be | ||
|
|
daf81c5b26 | ||
|
|
78f929c60b | ||
|
|
87d59d12a4 | ||
|
|
ce031124c7 | ||
|
|
d4ce08a044 | ||
|
|
871e78b314 | ||
|
|
eeee682f6c | ||
|
|
9c594c3e53 | ||
|
|
0b1b19a165 | ||
|
|
f1ff7b3b61 | ||
|
|
165c588557 | ||
|
|
327e18bc7a | ||
|
|
f61f2c89dc | ||
|
|
2327b72558 | ||
|
|
66ddd08684 | ||
|
|
4d2143e9b2 | ||
|
|
7906ea2a0c | ||
|
|
9d1956794e | ||
|
|
4956ff7914 | ||
|
|
f22a589cb8 | ||
|
|
04185d6839 | ||
|
|
fb25e5d577 | ||
|
|
6845eaa9b2 | ||
|
|
c1e65874bc | ||
|
|
226a5da0c9 | ||
|
|
685a24e476 | ||
|
|
cae4faae61 | ||
|
|
5dac6badf2 | ||
|
|
5948f56482 | ||
|
|
98ddd0386b | ||
|
|
2947b244e4 | ||
|
|
72552b8084 | ||
|
|
09642444d7 | ||
|
|
d1080b825c | ||
|
|
001421de10 | ||
|
|
bab9b8b36a | ||
|
|
0fb738aa2e | ||
|
|
4963920a46 | ||
|
|
f0d10fe1cd | ||
|
|
386b33b624 | ||
|
|
98201508f2 | ||
|
|
9723c569a1 | ||
|
|
0584d7676c | ||
|
|
09c42530ec | ||
|
|
0697d694e0 | ||
|
|
e085f6af8a | ||
|
|
7feda1c446 | ||
|
|
e1f83c205d | ||
|
|
db00edd266 | ||
|
|
d699f61f5d | ||
|
|
dc1b478f2c | ||
|
|
0ca665c903 | ||
|
|
111c6a743f | ||
|
|
d3517532a4 | ||
|
|
5790ebc558 | ||
|
|
c11f72c098 | ||
|
|
3617bef54b | ||
|
|
a5fb01f1e6 | ||
|
|
fa6acb7497 | ||
|
|
904259df92 | ||
|
|
65c316bd6d | ||
|
|
3b46a08606 | ||
|
|
6ad49373d4 | ||
|
|
2a1f57c085 | ||
|
|
9d9065fbcd | ||
|
|
694940452c | ||
|
|
f5d6a79998 | ||
|
|
4cc98a10a0 | ||
|
|
1751bd1a58 |
@@ -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:warning
|
dotnet_style_qualification_for_field = false:refactoring
|
||||||
dotnet_style_qualification_for_property = false:warning
|
dotnet_style_qualification_for_property = false:refactoring
|
||||||
dotnet_style_qualification_for_method = false:warning
|
dotnet_style_qualification_for_method = false:refactoring
|
||||||
dotnet_style_qualification_for_event = false:warning
|
dotnet_style_qualification_for_event = false:refactoring
|
||||||
|
|
||||||
# Indentation preferences
|
# Indentation preferences
|
||||||
csharp_indent_block_contents = true
|
csharp_indent_block_contents = true
|
||||||
@@ -32,6 +32,10 @@ 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 = _
|
||||||
|
|
||||||
@@ -64,6 +68,7 @@ dotnet_diagnostic.SA1406.severity = suggestion
|
|||||||
dotnet_diagnostic.SA1410.severity = suggestion
|
dotnet_diagnostic.SA1410.severity = suggestion
|
||||||
dotnet_diagnostic.SA1411.severity = suggestion
|
dotnet_diagnostic.SA1411.severity = suggestion
|
||||||
dotnet_diagnostic.SA1413.severity = none
|
dotnet_diagnostic.SA1413.severity = none
|
||||||
|
dotnet_diagnostic.SA1512.severity = none
|
||||||
dotnet_diagnostic.SA1516.severity = none
|
dotnet_diagnostic.SA1516.severity = none
|
||||||
dotnet_diagnostic.SA1600.severity = none
|
dotnet_diagnostic.SA1600.severity = none
|
||||||
dotnet_diagnostic.SA1601.severity = none
|
dotnet_diagnostic.SA1601.severity = none
|
||||||
@@ -162,6 +167,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
|
||||||
@@ -177,9 +183,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
|
||||||
@@ -191,13 +194,11 @@ 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.CA1848.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
|
||||||
@@ -228,6 +229,9 @@ 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.CA2249.severity = suggestion
|
||||||
|
dotnet_diagnostic.CA2251.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
|
||||||
@@ -255,7 +259,7 @@ dotnet_diagnostic.CA5392.severity = suggestion
|
|||||||
dotnet_diagnostic.CA5394.severity = suggestion
|
dotnet_diagnostic.CA5394.severity = suggestion
|
||||||
dotnet_diagnostic.CA5397.severity = suggestion
|
dotnet_diagnostic.CA5397.severity = suggestion
|
||||||
|
|
||||||
|
dotnet_diagnostic.SYSLIB0006.severity = none
|
||||||
|
|
||||||
[*.{js,html,js,hbs,less,css}]
|
[*.{js,html,js,hbs,less,css}]
|
||||||
charset = utf-8
|
charset = utf-8
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"paths": [
|
|
||||||
"frontend/src/**/*.js"
|
|
||||||
],
|
|
||||||
"ignored": [
|
|
||||||
"**/node_modules/**/*"
|
|
||||||
],
|
|
||||||
"port": 5004
|
|
||||||
}
|
|
||||||
7
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
7
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -73,3 +73,10 @@ body:
|
|||||||
Additionally, any additional info? Screenshots? References? Anything that will give us more context about the issue you are encountering!
|
Additionally, any additional info? Screenshots? References? Anything that will give us more context about the issue you are encountering!
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Trace Logs have been provided as applicable. Reports may be closed if the required logs are not provided.
|
||||||
|
description: Trace logs are generally required for all bug reports
|
||||||
|
options:
|
||||||
|
- label: I have followed the steps in the wiki link above and provided the required trace logs that are relevant and show this issue.
|
||||||
|
required: true
|
||||||
|
|||||||
28
.github/labeler.yml
vendored
Normal file
28
.github/labeler.yml
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
'Area: API':
|
||||||
|
- src/Radarr.Api.V3/**/*
|
||||||
|
|
||||||
|
'Area: Db-migration':
|
||||||
|
- src/NzbDrone.Core/Datastore/Migration/*
|
||||||
|
|
||||||
|
'Area: Download Clients':
|
||||||
|
- src/NzbDrone.Core/Download/Clients/**/*
|
||||||
|
|
||||||
|
'Area: Import Lists':
|
||||||
|
- src/NzbDrone.Core/ImportLists/**/*
|
||||||
|
|
||||||
|
'Area: Indexer':
|
||||||
|
- src/NzbDrone.Core/Indexers/**/*
|
||||||
|
|
||||||
|
'Area: Notifications':
|
||||||
|
- src/NzbDrone.Core/Notifications/**/*
|
||||||
|
|
||||||
|
'Area: Organizer':
|
||||||
|
- src/NzbDrone.Core/Organizer/**/*
|
||||||
|
|
||||||
|
'Area: Parser':
|
||||||
|
- src/NzbDrone.Core/Parser/**/*
|
||||||
|
|
||||||
|
'Area: UI':
|
||||||
|
- frontend/**/*
|
||||||
|
- package.json
|
||||||
|
- yarn.lock
|
||||||
45
.github/workflows/azuresync.yml
vendored
45
.github/workflows/azuresync.yml
vendored
@@ -1,45 +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 }}
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
jobs:
|
|
||||||
alert:
|
|
||||||
permissions:
|
|
||||||
issues: write # to update issue body
|
|
||||||
|
|
||||||
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\\Radarr"
|
|
||||||
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\\Radarr"
|
|
||||||
ado_wit: "User Story"
|
|
||||||
ado_new_state: "New"
|
|
||||||
ado_active_state: "Active"
|
|
||||||
ado_close_state: "Closed"
|
|
||||||
ado_bypassrules: true
|
|
||||||
log_level: 100
|
|
||||||
12
.github/workflows/labeler.yml
vendored
Normal file
12
.github/workflows/labeler.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
name: "Pull Request Labeler"
|
||||||
|
on:
|
||||||
|
- pull_request_target
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
triage:
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/labeler@v4
|
||||||
12
.github/workflows/lock.yml
vendored
12
.github/workflows/lock.yml
vendored
@@ -14,13 +14,13 @@ jobs:
|
|||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: dessant/lock-threads@v2
|
- uses: dessant/lock-threads@v4
|
||||||
with:
|
with:
|
||||||
github-token: ${{ github.token }}
|
github-token: ${{ github.token }}
|
||||||
issue-lock-inactive-days: '90'
|
issue-inactive-days: '90'
|
||||||
issue-exclude-created-before: ''
|
exclude-issue-created-before: ''
|
||||||
issue-exclude-labels: ''
|
exclude-any-issue-labels: ''
|
||||||
issue-lock-labels: ''
|
add-issue-labels: ''
|
||||||
issue-lock-comment: ''
|
issue-comment: ''
|
||||||
issue-lock-reason: 'resolved'
|
issue-lock-reason: 'resolved'
|
||||||
process-only: ''
|
process-only: ''
|
||||||
|
|||||||
15
.github/workflows/support.yml
vendored
15
.github/workflows/support.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
|||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: dessant/support-requests@v2
|
- uses: dessant/support-requests@v3
|
||||||
with:
|
with:
|
||||||
github-token: ${{ github.token }}
|
github-token: ${{ github.token }}
|
||||||
support-label: 'Type: Support'
|
support-label: 'Type: Support'
|
||||||
@@ -22,4 +22,15 @@ jobs:
|
|||||||
to be a support request. Please hop over onto our [Discord](https://radarr.video/discord)
|
to be a support request. Please hop over onto our [Discord](https://radarr.video/discord)
|
||||||
or [Subreddit](https://reddit.com/r/radarr)
|
or [Subreddit](https://reddit.com/r/radarr)
|
||||||
close-issue: true
|
close-issue: true
|
||||||
lock-issue: false
|
lock-issue: false
|
||||||
|
- uses: dessant/support-requests@v3
|
||||||
|
with:
|
||||||
|
github-token: ${{ github.token }}
|
||||||
|
support-label: 'Status: Logs Needed'
|
||||||
|
issue-comment: >
|
||||||
|
:wave: @{issue-author}, In order to help you further we'll need to see logs.
|
||||||
|
You'll need to enable trace logging and replicate the problem that you encountered.
|
||||||
|
Guidance on how to enable trace logging can be found in
|
||||||
|
our [troubleshooting guide](https://wiki.servarr.com/radarr/troubleshooting#logging-and-log-files).
|
||||||
|
close-issue: false
|
||||||
|
lock-issue: false
|
||||||
|
|||||||
23
.gitignore
vendored
23
.gitignore
vendored
@@ -166,27 +166,8 @@ packages.config.md5sum
|
|||||||
|
|
||||||
# Common IntelliJ Platform excludes
|
# Common IntelliJ Platform excludes
|
||||||
|
|
||||||
# User specific
|
# Ignore Rider projects completely for now
|
||||||
**/.idea/**/workspace.xml
|
.idea/
|
||||||
**/.idea/**/tasks.xml
|
|
||||||
**/.idea/shelf/*
|
|
||||||
**/.idea/dictionaries
|
|
||||||
**/.idea/.idea.Radarr.Posix
|
|
||||||
**/.idea/.idea.Radarr.Windows
|
|
||||||
|
|
||||||
# Sensitive or high-churn files
|
|
||||||
**/.idea/**/dataSources/
|
|
||||||
**/.idea/**/dataSources.ids
|
|
||||||
**/.idea/**/dataSources.xml
|
|
||||||
**/.idea/**/dataSources.local.xml
|
|
||||||
**/.idea/**/sqlDataSources.xml
|
|
||||||
**/.idea/**/dynamic.xml
|
|
||||||
|
|
||||||
# Rider
|
|
||||||
# Rider auto-generates .iml files, and contentModel.xml
|
|
||||||
**/.idea/**/*.iml
|
|
||||||
**/.idea/**/contentModel.xml
|
|
||||||
**/.idea/**/modules.xml
|
|
||||||
|
|
||||||
# ignore node_modules symlink
|
# ignore node_modules symlink
|
||||||
node_modules
|
node_modules
|
||||||
|
|||||||
@@ -76,6 +76,15 @@ Thank you to [<img src="/Logo/jetbrains.svg" alt="JetBrains" width="32"> JetBrai
|
|||||||
* [<img src="/Logo/rider.svg" alt="Rider" width="32"> Rider](http://www.jetbrains.com/rider/)
|
* [<img src="/Logo/rider.svg" alt="Rider" width="32"> Rider](http://www.jetbrains.com/rider/)
|
||||||
* [<img src="/Logo/dottrace.svg" alt="dotTrace" width="32"> dotTrace](http://www.jetbrains.com/dottrace/)
|
* [<img src="/Logo/dottrace.svg" alt="dotTrace" width="32"> dotTrace](http://www.jetbrains.com/dottrace/)
|
||||||
|
|
||||||
|
## DigitalOcean
|
||||||
|
|
||||||
|
This project is also supported by DigitalOcean
|
||||||
|
<p>
|
||||||
|
<a href="https://www.digitalocean.com/">
|
||||||
|
<img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_blue.svg" width="201px">
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
### License
|
### License
|
||||||
|
|
||||||
* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
|
* [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
|
||||||
|
|||||||
@@ -9,13 +9,13 @@ variables:
|
|||||||
testsFolder: './_tests'
|
testsFolder: './_tests'
|
||||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||||
majorVersion: '4.3.1'
|
majorVersion: '4.5.1'
|
||||||
minorVersion: $[counter('minorVersion', 2000)]
|
minorVersion: $[counter('minorVersion', 2000)]
|
||||||
radarrVersion: '$(majorVersion).$(minorVersion)'
|
radarrVersion: '$(majorVersion).$(minorVersion)'
|
||||||
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
|
buildName: '$(Build.SourceBranchName).$(radarrVersion)'
|
||||||
sentryOrg: 'servarr'
|
sentryOrg: 'servarr'
|
||||||
sentryUrl: 'https://sentry.servarr.com'
|
sentryUrl: 'https://sentry.servarr.com'
|
||||||
dotnetVersion: '6.0.400'
|
dotnetVersion: '6.0.408'
|
||||||
nodeVersion: '16.X'
|
nodeVersion: '16.X'
|
||||||
innoVersion: '6.2.0'
|
innoVersion: '6.2.0'
|
||||||
windowsImage: 'windows-2022'
|
windowsImage: 'windows-2022'
|
||||||
|
|||||||
8
docs.sh
8
docs.sh
@@ -3,9 +3,9 @@ PLATFORM=$1
|
|||||||
if [ "$PLATFORM" = "Windows" ]; then
|
if [ "$PLATFORM" = "Windows" ]; then
|
||||||
RUNTIME="win-x64"
|
RUNTIME="win-x64"
|
||||||
elif [ "$PLATFORM" = "Linux" ]; then
|
elif [ "$PLATFORM" = "Linux" ]; then
|
||||||
WHERE="linux-x64"
|
RUNTIME="linux-x64"
|
||||||
elif [ "$PLATFORM" = "Mac" ]; then
|
elif [ "$PLATFORM" = "Mac" ]; then
|
||||||
WHERE="osx-x64"
|
RUNTIME="osx-x64"
|
||||||
else
|
else
|
||||||
echo "Platform must be provided as first arguement: Windows, Linux or Mac"
|
echo "Platform must be provided as first arguement: Windows, Linux or Mac"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -27,7 +27,7 @@ dotnet clean $slnFile -c Release
|
|||||||
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
|
dotnet msbuild -restore $slnFile -p:Configuration=Debug -p:Platform=$platform -p:RuntimeIdentifiers=$RUNTIME -t:PublishAllRids
|
||||||
|
|
||||||
dotnet new tool-manifest
|
dotnet new tool-manifest
|
||||||
dotnet tool install --version 6.3.0 Swashbuckle.AspNetCore.Cli
|
dotnet tool install --version 6.5.0 Swashbuckle.AspNetCore.Cli
|
||||||
|
|
||||||
dotnet tool run swagger tofile --output ./src/Radarr.Api.V3/openapi.json "$outputFolder/net6.0/$RUNTIME/radarr.console.dll" v3 &
|
dotnet tool run swagger tofile --output ./src/Radarr.Api.V3/openapi.json "$outputFolder/net6.0/$RUNTIME/radarr.console.dll" v3 &
|
||||||
|
|
||||||
@@ -35,4 +35,4 @@ sleep 45
|
|||||||
|
|
||||||
kill %1
|
kill %1
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"remove-empty-rulesets": true,
|
|
||||||
"always-semicolon": true,
|
|
||||||
"color-case": "lower",
|
|
||||||
"block-indent": " ",
|
|
||||||
"color-shorthand": false,
|
|
||||||
"element-case": "lower",
|
|
||||||
"eof-newline": true,
|
|
||||||
"leading-zero": true,
|
|
||||||
"quotes": "double",
|
|
||||||
"sort-order-fallback": "abc",
|
|
||||||
"space-before-colon": "",
|
|
||||||
"space-after-colon": " ",
|
|
||||||
"space-before-combinator": " ",
|
|
||||||
"space-after-combinator": " ",
|
|
||||||
"space-between-declarations": "\n",
|
|
||||||
"space-before-opening-brace": " ",
|
|
||||||
"space-after-opening-brace": "\n",
|
|
||||||
"space-after-selector-delimiter": " ",
|
|
||||||
"space-before-selector-delimiter": "",
|
|
||||||
"space-before-closing-brace": "\n",
|
|
||||||
"strip-spaces": true,
|
|
||||||
"tab-size": true,
|
|
||||||
"unitless-zero": false
|
|
||||||
}
|
|
||||||
@@ -1,335 +0,0 @@
|
|||||||
{
|
|
||||||
"indent": {
|
|
||||||
"value": " ",
|
|
||||||
"FunctionExpression": 1,
|
|
||||||
"ArrayExpression": 1,
|
|
||||||
"ObjectExpression": 1
|
|
||||||
},
|
|
||||||
"lineBreak": {
|
|
||||||
"value": "\n",
|
|
||||||
|
|
||||||
"before": {
|
|
||||||
"ArrayPatternClosing": 0,
|
|
||||||
"ArrayPatternComma": 0,
|
|
||||||
"ArrayPatternOpening": 0,
|
|
||||||
"ArrowFunctionExpressionArrow": 0,
|
|
||||||
"ArrowFunctionExpressionClosingBrace": ">=1",
|
|
||||||
"ArrowFunctionExpressionOpeningBrace": 0,
|
|
||||||
"AssignmentExpression": ">=1",
|
|
||||||
"AssignmentOperator": 0,
|
|
||||||
"BlockStatement": 0,
|
|
||||||
"BreakKeyword": ">=1",
|
|
||||||
"CallExpression": -1,
|
|
||||||
"CallExpressionClosingParentheses": -1,
|
|
||||||
"CallExpressionOpeningParentheses": 0,
|
|
||||||
"CatchClosingBrace": ">=1",
|
|
||||||
"CatchKeyword": 0,
|
|
||||||
"CatchOpeningBrace": 0,
|
|
||||||
"ClassDeclaration": ">=1",
|
|
||||||
"ClassDeclarationClosingBrace": ">=1",
|
|
||||||
"ClassDeclarationOpeningBrace": 0,
|
|
||||||
"ConditionalExpression": ">=1",
|
|
||||||
"DeleteOperator": ">=1",
|
|
||||||
"DoWhileStatement": ">=1",
|
|
||||||
"DoWhileStatementClosingBrace": ">=1",
|
|
||||||
"DoWhileStatementOpeningBrace": 0,
|
|
||||||
"ElseIfStatement": 0,
|
|
||||||
"ElseIfStatementClosingBrace": ">=1",
|
|
||||||
"ElseIfStatementOpeningBrace": 0,
|
|
||||||
"ElseStatement": 0,
|
|
||||||
"ElseStatementClosingBrace": ">=1",
|
|
||||||
"ElseStatementOpeningBrace": 0,
|
|
||||||
"EmptyStatement": -1,
|
|
||||||
"EndOfFile": -1,
|
|
||||||
"FinallyClosingBrace": ">=1",
|
|
||||||
"FinallyKeyword": -1,
|
|
||||||
"FinallyOpeningBrace": 0,
|
|
||||||
"ForInStatement": ">=1",
|
|
||||||
"ForInStatementClosingBrace": ">=1",
|
|
||||||
"ForInStatementExpressionClosing": 0,
|
|
||||||
"ForInStatementExpressionOpening": 0,
|
|
||||||
"ForInStatementOpeningBrace": 0,
|
|
||||||
"ForStatement": ">=1",
|
|
||||||
"ForStatementClosingBrace": ">=1",
|
|
||||||
"ForStatementExpressionClosing": "<2",
|
|
||||||
"ForStatementExpressionOpening": 0,
|
|
||||||
"ForStatementOpeningBrace": 0,
|
|
||||||
"FunctionDeclaration": ">=1",
|
|
||||||
"FunctionDeclarationClosingBrace": ">=1",
|
|
||||||
"FunctionDeclarationOpeningBrace": 0,
|
|
||||||
"FunctionExpression": 0,
|
|
||||||
"FunctionExpressionClosingBrace": 1,
|
|
||||||
"FunctionExpressionOpeningBrace":0,
|
|
||||||
"IIFEClosingParentheses": 0,
|
|
||||||
"IfStatement": ">=1",
|
|
||||||
"IfStatementClosingBrace": ">=1",
|
|
||||||
"IfStatementOpeningBrace": 0,
|
|
||||||
"LogicalExpression": -1,
|
|
||||||
"MemberExpressionClosing": 0,
|
|
||||||
"MemberExpressionOpening": 0,
|
|
||||||
"MemberExpressionPeriod": -1,
|
|
||||||
"MethodDefinition": ">=1",
|
|
||||||
"ObjectExpressionClosingBrace": "<=1",
|
|
||||||
"ObjectPatternClosingBrace": 0,
|
|
||||||
"ObjectPatternComma": 0,
|
|
||||||
"ObjectPatternOpeningBrace": 0,
|
|
||||||
"ParameterDefault": 0,
|
|
||||||
"Property": "<=2",
|
|
||||||
"PropertyValue": 0,
|
|
||||||
"ReturnStatement": -1,
|
|
||||||
"SwitchClosingBrace": ">=1",
|
|
||||||
"SwitchOpeningBrace": 0,
|
|
||||||
"ThisExpression": -1,
|
|
||||||
"ThrowStatement": ">=1",
|
|
||||||
"TryClosingBrace": ">=1",
|
|
||||||
"TryKeyword": -1,
|
|
||||||
"TryOpeningBrace": 0,
|
|
||||||
"VariableDeclaration": ">=1",
|
|
||||||
"VariableDeclarationSemiColon": 0,
|
|
||||||
"VariableDeclarationWithoutInit": ">=1",
|
|
||||||
"VariableName": ">=1",
|
|
||||||
"VariableValue": 0,
|
|
||||||
"WhileStatement": ">=1",
|
|
||||||
"WhileStatementClosingBrace": ">=1",
|
|
||||||
"WhileStatementOpeningBrace": 0
|
|
||||||
},
|
|
||||||
|
|
||||||
"after": {
|
|
||||||
"ArrayPatternClosing": 0,
|
|
||||||
"ArrayPatternComma": 0,
|
|
||||||
"ArrayPatternOpening": 0,
|
|
||||||
"ArrowFunctionExpressionArrow": 0,
|
|
||||||
"ArrowFunctionExpressionClosingBrace": -1,
|
|
||||||
"ArrowFunctionExpressionOpeningBrace": ">=1",
|
|
||||||
"AssignmentExpression": ">=1",
|
|
||||||
"AssignmentOperator": 0,
|
|
||||||
"BlockStatement": 0,
|
|
||||||
"BreakKeyword": -1,
|
|
||||||
"CallExpression": -1,
|
|
||||||
"CallExpressionClosingParentheses": -1,
|
|
||||||
"CallExpressionOpeningParentheses": -1,
|
|
||||||
"CatchClosingBrace": ">=0",
|
|
||||||
"CatchKeyword": 0,
|
|
||||||
"CatchOpeningBrace": ">=1",
|
|
||||||
"ClassDeclaration": ">=1",
|
|
||||||
"ClassDeclarationClosingBrace": ">=1",
|
|
||||||
"ClassDeclarationOpeningBrace": ">=1",
|
|
||||||
"ConditionalExpression": ">=1",
|
|
||||||
"DeleteOperator": ">=1",
|
|
||||||
"DoWhileStatement": ">=1",
|
|
||||||
"DoWhileStatementClosingBrace": 0,
|
|
||||||
"DoWhileStatementOpeningBrace": ">=1",
|
|
||||||
"ElseIfStatement": ">=1",
|
|
||||||
"ElseIfStatementClosingBrace": ">=1",
|
|
||||||
"ElseIfStatementOpeningBrace": ">=1",
|
|
||||||
"ElseStatement": ">=1",
|
|
||||||
"ElseStatementClosingBrace": ">=1",
|
|
||||||
"ElseStatementOpeningBrace": ">=1",
|
|
||||||
"EmptyStatement": -1,
|
|
||||||
"FinallyClosingBrace": ">=1",
|
|
||||||
"FinallyKeyword": -1,
|
|
||||||
"FinallyOpeningBrace": ">=1",
|
|
||||||
"ForInStatement": ">=1",
|
|
||||||
"ForInStatementClosingBrace": ">=1",
|
|
||||||
"ForInStatementExpressionClosing": -1,
|
|
||||||
"ForInStatementExpressionOpening": "<2",
|
|
||||||
"ForInStatementOpeningBrace": ">=1",
|
|
||||||
"ForStatement": ">=1",
|
|
||||||
"ForStatementClosingBrace": ">=1",
|
|
||||||
"ForStatementExpressionClosing": -1,
|
|
||||||
"ForStatementExpressionOpening": "<2",
|
|
||||||
"ForStatementOpeningBrace": ">=1",
|
|
||||||
"FunctionDeclaration": ">=1",
|
|
||||||
"FunctionDeclarationClosingBrace": ">=1",
|
|
||||||
"FunctionDeclarationOpeningBrace": ">=1",
|
|
||||||
"FunctionExpression": 0,
|
|
||||||
"FunctionExpressionClosingBrace": -1,
|
|
||||||
"FunctionExpressionOpeningBrace": 1,
|
|
||||||
"IIFEOpeningParentheses": 0,
|
|
||||||
"IfStatement": ">=1",
|
|
||||||
"IfStatementClosingBrace": ">=1",
|
|
||||||
"IfStatementOpeningBrace": ">=1",
|
|
||||||
"LogicalExpression": -1,
|
|
||||||
"MemberExpressionClosing": 0,
|
|
||||||
"MemberExpressionOpening": 0,
|
|
||||||
"MemberExpressionPeriod": 0,
|
|
||||||
"MethodDefinition": ">=1",
|
|
||||||
"ObjectExpressionOpeningBrace": "<=1",
|
|
||||||
"ObjectPatternClosingBrace": 0,
|
|
||||||
"ObjectPatternComma": 0,
|
|
||||||
"ObjectPatternOpeningBrace": 0,
|
|
||||||
"ParameterDefault": 0,
|
|
||||||
"Property": -1,
|
|
||||||
"PropertyName": 0,
|
|
||||||
"ReturnStatement": -1,
|
|
||||||
"SwitchCaseColon": ">=1",
|
|
||||||
"SwitchClosingBrace": ">=1",
|
|
||||||
"SwitchOpeningBrace": ">=1",
|
|
||||||
"ThisExpression": 0,
|
|
||||||
"ThrowStatement": ">=1",
|
|
||||||
"TryClosingBrace": 0,
|
|
||||||
"TryKeyword": -1,
|
|
||||||
"TryOpeningBrace": ">=1",
|
|
||||||
"VariableDeclaration": ">=1",
|
|
||||||
"VariableDeclarationSemiColon": ">=1",
|
|
||||||
"VariableValue": -1,
|
|
||||||
"WhileStatement": ">=1",
|
|
||||||
"WhileStatementClosingBrace": ">=1",
|
|
||||||
"WhileStatementOpeningBrace": ">=1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"whiteSpace": {
|
|
||||||
"value": " ",
|
|
||||||
"removeTrailing": 1,
|
|
||||||
"before": {
|
|
||||||
"ArgumentComma": 0,
|
|
||||||
"ArgumentList": 0,
|
|
||||||
"ArgumentListArrayExpression": 0,
|
|
||||||
"ArgumentListFunctionExpression": 1,
|
|
||||||
"ArgumentListObjectExpression": 0,
|
|
||||||
"ArrayExpressionClosing": 0,
|
|
||||||
"ArrayExpressionComma": 0,
|
|
||||||
"ArrayExpressionOpening": 1,
|
|
||||||
"AssignmentOperator": 1,
|
|
||||||
"BinaryExpression": 0,
|
|
||||||
"BinaryExpressionOperator": 1,
|
|
||||||
"BlockComment": 1,
|
|
||||||
"CallExpression": 1,
|
|
||||||
"CatchClosingBrace": 1,
|
|
||||||
"CatchKeyword": 1,
|
|
||||||
"CatchOpeningBrace": 1,
|
|
||||||
"CatchParameterList": 0,
|
|
||||||
"CommaOperator": 0,
|
|
||||||
"ConditionalExpressionAlternate": 1,
|
|
||||||
"ConditionalExpressionConsequent": 1,
|
|
||||||
"DoWhileStatementClosingBrace": 1,
|
|
||||||
"DoWhileStatementConditional": 1,
|
|
||||||
"DoWhileStatementOpeningBrace": 1,
|
|
||||||
"ElseIfStatementClosingBrace": 1,
|
|
||||||
"ElseIfStatementOpeningBrace": 1,
|
|
||||||
"ElseStatementClosingBrace": 1,
|
|
||||||
"ElseStatementOpeningBrace": 1,
|
|
||||||
"EmptyStatement": 0,
|
|
||||||
"ExpressionClosingParentheses": 0,
|
|
||||||
"FinallyClosingBrace": 1,
|
|
||||||
"FinallyKeyword": -1,
|
|
||||||
"FinallyOpeningBrace": 1,
|
|
||||||
"ForInStatement": 1,
|
|
||||||
"ForInStatementClosingBrace": 1,
|
|
||||||
"ForInStatementExpressionClosing": 0,
|
|
||||||
"ForInStatementExpressionOpening": 1,
|
|
||||||
"ForInStatementOpeningBrace": 1,
|
|
||||||
"ForStatement": 1,
|
|
||||||
"ForStatementClosingBrace": 1,
|
|
||||||
"ForStatementExpressionClosing": 0,
|
|
||||||
"ForStatementExpressionOpening": 1,
|
|
||||||
"ForStatementOpeningBrace": 1,
|
|
||||||
"ForStatementSemicolon": 0,
|
|
||||||
"FunctionDeclarationClosingBrace": 1,
|
|
||||||
"FunctionDeclarationOpeningBrace": 1,
|
|
||||||
"FunctionExpressionClosingBrace": 1,
|
|
||||||
"FunctionExpressionOpeningBrace": 1,
|
|
||||||
"IfStatementClosingBrace": 1,
|
|
||||||
"IfStatementConditionalClosing": 0,
|
|
||||||
"IfStatementConditionalOpening": 1,
|
|
||||||
"IfStatementOpeningBrace": 1,
|
|
||||||
"LineComment": 1,
|
|
||||||
"LogicalExpressionOperator": 1,
|
|
||||||
"MemberExpressionClosing": 0,
|
|
||||||
"ObjectExpressionClosingBrace": 1,
|
|
||||||
"ParameterComma": 0,
|
|
||||||
"ParameterList": 0,
|
|
||||||
"Property": 1,
|
|
||||||
"PropertyName": 1,
|
|
||||||
"PropertyValue": 1,
|
|
||||||
"SwitchDiscriminantClosing": 0,
|
|
||||||
"SwitchDiscriminantOpening": 1,
|
|
||||||
"ThrowKeyword": 1,
|
|
||||||
"TryClosingBrace": 1,
|
|
||||||
"TryKeyword": -1,
|
|
||||||
"TryOpeningBrace": 1,
|
|
||||||
"UnaryExpressionOperator": 0,
|
|
||||||
"VariableName": 1,
|
|
||||||
"VariableValue": 1,
|
|
||||||
"WhileStatementClosingBrace": 1,
|
|
||||||
"WhileStatementConditionalClosing": 0,
|
|
||||||
"WhileStatementConditionalOpening": 1,
|
|
||||||
"WhileStatementOpeningBrace": 1
|
|
||||||
},
|
|
||||||
"after": {
|
|
||||||
"ArgumentComma": 1,
|
|
||||||
"ArgumentList": 0,
|
|
||||||
"ArgumentListArrayExpression": 1,
|
|
||||||
"ArgumentListFunctionExpression": 1,
|
|
||||||
"ArgumentListObjectExpression": 0,
|
|
||||||
"ArrayExpressionClosing": 0,
|
|
||||||
"ArrayExpressionComma": 1,
|
|
||||||
"ArrayExpressionOpening": 0,
|
|
||||||
"AssignmentOperator": 1,
|
|
||||||
"BinaryExpression": 0,
|
|
||||||
"BinaryExpressionOperator": 1,
|
|
||||||
"BlockComment": 1,
|
|
||||||
"CallExpression": 0,
|
|
||||||
"CatchClosingBrace": 1,
|
|
||||||
"CatchKeyword": 1,
|
|
||||||
"CatchOpeningBrace": 1,
|
|
||||||
"CatchParameterList": 0,
|
|
||||||
"CommaOperator": 1,
|
|
||||||
"ConditionalExpressionConsequent": 1,
|
|
||||||
"ConditionalExpressionTest": 1,
|
|
||||||
"DoWhileStatementBody": 1,
|
|
||||||
"DoWhileStatementClosingBrace": 1,
|
|
||||||
"DoWhileStatementOpeningBrace": 1,
|
|
||||||
"ElseIfStatementClosingBrace": 1,
|
|
||||||
"ElseIfStatementOpeningBrace": 1,
|
|
||||||
"ElseStatementClosingBrace": 1,
|
|
||||||
"ElseStatementOpeningBrace": 1,
|
|
||||||
"EmptyStatement": 0,
|
|
||||||
"ExpressionOpeningParentheses": 0,
|
|
||||||
"FinallyClosingBrace": 1,
|
|
||||||
"FinallyKeyword": -1,
|
|
||||||
"FinallyOpeningBrace": 1,
|
|
||||||
"ForInStatement": 1,
|
|
||||||
"ForInStatementClosingBrace": 1,
|
|
||||||
"ForInStatementExpressionClosing": 1,
|
|
||||||
"ForInStatementExpressionOpening": 0,
|
|
||||||
"ForInStatementOpeningBrace": 1,
|
|
||||||
"ForStatement": 1,
|
|
||||||
"ForStatementClosingBrace": 1,
|
|
||||||
"ForStatementExpressionClosing": 1,
|
|
||||||
"ForStatementExpressionOpening": 0,
|
|
||||||
"ForStatementOpeningBrace": 1,
|
|
||||||
"ForStatementSemicolon": 1,
|
|
||||||
"FunctionDeclarationClosingBrace": 0,
|
|
||||||
"FunctionDeclarationOpeningBrace": 0,
|
|
||||||
"FunctionExpressionClosingBrace": 0,
|
|
||||||
"FunctionExpressionOpeningBrace": 0,
|
|
||||||
"FunctionName": 0,
|
|
||||||
"FunctionReservedWord": 0,
|
|
||||||
"IfStatementClosingBrace": 1,
|
|
||||||
"IfStatementConditionalClosing": 0,
|
|
||||||
"IfStatementConditionalOpening": 0,
|
|
||||||
"IfStatementOpeningBrace": 1,
|
|
||||||
"LogicalExpressionOperator": 1,
|
|
||||||
"MemberExpressionOpening": 0,
|
|
||||||
"ObjectExpressionClosingBrace": 0,
|
|
||||||
"ObjectExpressionOpeningBrace": 1,
|
|
||||||
"ParameterComma": 1,
|
|
||||||
"ParameterList": 0,
|
|
||||||
"PropertyName": 0,
|
|
||||||
"PropertyValue": 0,
|
|
||||||
"SwitchDiscriminantClosing": 1,
|
|
||||||
"SwitchDiscriminantOpening": 0,
|
|
||||||
"ThrowKeyword": 1,
|
|
||||||
"TryClosingBrace": 1,
|
|
||||||
"TryKeyword": -1,
|
|
||||||
"TryOpeningBrace": 1,
|
|
||||||
"UnaryExpressionOperator": 0,
|
|
||||||
"VariableName": 1,
|
|
||||||
"WhileStatementClosingBrace": 1,
|
|
||||||
"WhileStatementConditionalClosing": 1,
|
|
||||||
"WhileStatementConditionalOpening": 0,
|
|
||||||
"WhileStatementOpeningBrace": 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +1,2 @@
|
|||||||
**/JsLibraries/**
|
**/JsLibraries/**
|
||||||
|
**/*.css.d.ts
|
||||||
|
|||||||
@@ -1,14 +1,21 @@
|
|||||||
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||||
|
const path = require('path');
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||||
|
const typescriptEslintRecommended = require('@typescript-eslint/eslint-plugin').configs.recommended;
|
||||||
|
|
||||||
|
const frontendFolder = __dirname;
|
||||||
|
|
||||||
const dirs = fs
|
const dirs = fs
|
||||||
.readdirSync('frontend/src', { withFileTypes: true })
|
.readdirSync(path.join(frontendFolder, 'src'), { withFileTypes: true })
|
||||||
.filter((dirent) => dirent.isDirectory())
|
.filter((dirent) => dirent.isDirectory())
|
||||||
.map((dirent) => dirent.name)
|
.map((dirent) => dirent.name)
|
||||||
.join('|');
|
.join('|');
|
||||||
|
|
||||||
const frontendFolder = __dirname;
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
root: true,
|
||||||
|
|
||||||
parser: '@babel/eslint-parser',
|
parser: '@babel/eslint-parser',
|
||||||
|
|
||||||
env: {
|
env: {
|
||||||
@@ -21,7 +28,8 @@ module.exports = {
|
|||||||
globals: {
|
globals: {
|
||||||
expect: false,
|
expect: false,
|
||||||
chai: false,
|
chai: false,
|
||||||
sinon: false
|
sinon: false,
|
||||||
|
JSX: true
|
||||||
},
|
},
|
||||||
|
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
@@ -41,7 +49,9 @@ module.exports = {
|
|||||||
'react',
|
'react',
|
||||||
'react-hooks',
|
'react-hooks',
|
||||||
'simple-import-sort',
|
'simple-import-sort',
|
||||||
'import'
|
'import',
|
||||||
|
'@typescript-eslint',
|
||||||
|
'prettier'
|
||||||
],
|
],
|
||||||
|
|
||||||
settings: {
|
settings: {
|
||||||
@@ -224,7 +234,7 @@ module.exports = {
|
|||||||
'consistent-this': ['error', 'self'],
|
'consistent-this': ['error', 'self'],
|
||||||
'eol-last': 'error',
|
'eol-last': 'error',
|
||||||
'func-names': 'off',
|
'func-names': 'off',
|
||||||
'func-style': ['error', 'declaration'],
|
'func-style': ['error', 'declaration', { allowArrowFunctions: true }],
|
||||||
indent: ['error', 2, { SwitchCase: 1 }],
|
indent: ['error', 2, { SwitchCase: 1 }],
|
||||||
'key-spacing': ['error', { beforeColon: false, afterColon: true }],
|
'key-spacing': ['error', { beforeColon: false, afterColon: true }],
|
||||||
'keyword-spacing': ['error', { before: true, after: true }],
|
'keyword-spacing': ['error', { before: true, after: true }],
|
||||||
@@ -315,7 +325,9 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
overrides: [
|
overrides: [
|
||||||
{
|
{
|
||||||
files: ['*.js'],
|
files: [
|
||||||
|
'*.js'
|
||||||
|
],
|
||||||
rules: {
|
rules: {
|
||||||
'simple-import-sort/imports': [
|
'simple-import-sort/imports': [
|
||||||
'error',
|
'error',
|
||||||
@@ -330,6 +342,52 @@ module.exports = {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
files: [
|
||||||
|
'*.ts',
|
||||||
|
'*.tsx'
|
||||||
|
],
|
||||||
|
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
parserOptions: {
|
||||||
|
project: './tsconfig.json'
|
||||||
|
},
|
||||||
|
|
||||||
|
extends: [
|
||||||
|
'prettier'
|
||||||
|
],
|
||||||
|
|
||||||
|
rules: Object.assign(typescriptEslintRecommended.rules, {
|
||||||
|
'no-shadow': 'off',
|
||||||
|
// These should be enabled after cleaning things up
|
||||||
|
'@typescript-eslint/no-unused-vars': 'warn',
|
||||||
|
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||||
|
'react/prop-types': 'off',
|
||||||
|
'prettier/prettier': 'error',
|
||||||
|
'simple-import-sort/imports': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
groups: [
|
||||||
|
// Packages
|
||||||
|
// Absolute Paths
|
||||||
|
// Relative Paths
|
||||||
|
// Css
|
||||||
|
['^@?\\w', `^(${dirs})(/.*|$)`, '^\\.', '^\\..*css$']
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
},
|
||||||
|
{
|
||||||
|
files: [
|
||||||
|
'*.css.d.ts'
|
||||||
|
],
|
||||||
|
rules: {
|
||||||
|
'filenames/match-exported': 'off',
|
||||||
|
'init-declarations': 'off',
|
||||||
|
'prettier/prettier': 'off'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"js": {
|
|
||||||
"indent_size": 2,
|
|
||||||
"indent_char": " ",
|
|
||||||
"indent_level": 2,
|
|
||||||
"indent_with_tabs": false,
|
|
||||||
"preserve_newlines": true,
|
|
||||||
"brace_style": "collapse",
|
|
||||||
"max_preserve_newlines": 2,
|
|
||||||
"jslint_happy": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
10
frontend/.prettierignore
Normal file
10
frontend/.prettierignore
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Ignore everything recursively
|
||||||
|
*
|
||||||
|
|
||||||
|
# But not the .ts files
|
||||||
|
!*.ts*
|
||||||
|
|
||||||
|
*css.d.ts
|
||||||
|
|
||||||
|
# Check subdirectories too
|
||||||
|
!*/
|
||||||
6
frontend/.prettierrc.json
Normal file
6
frontend/.prettierrc.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"arrowParens": "always",
|
||||||
|
"endOfLine": "auto",
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "es5"
|
||||||
|
}
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"stylelint-order"
|
"stylelint-order"
|
||||||
],
|
],
|
||||||
"ignoreFiles": [
|
"ignoreFiles": [
|
||||||
"frontend/src/Styles/scaffolding.css",
|
"frontend/src/Styles/scaffolding.css",
|
||||||
"**/*.js"
|
"**/*.js"
|
||||||
],
|
],
|
||||||
"rules": {
|
"rules": {
|
||||||
"at-rule-empty-line-before": [
|
"at-rule-empty-line-before": [
|
||||||
"always",
|
"always",
|
||||||
{
|
{
|
||||||
@@ -15,9 +15,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"at-rule-name-case": "lower",
|
|
||||||
"at-rule-name-newline-after": "always-multi-line",
|
|
||||||
"at-rule-name-space-after": "always",
|
|
||||||
"at-rule-no-unknown": [
|
"at-rule-no-unknown": [
|
||||||
true,
|
true,
|
||||||
{
|
{
|
||||||
@@ -28,83 +25,36 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"at-rule-no-vendor-prefix": true,
|
"at-rule-no-vendor-prefix": true,
|
||||||
"at-rule-semicolon-newline-after": "always",
|
|
||||||
"at-rule-semicolon-space-before": "never",
|
|
||||||
"block-closing-brace-empty-line-before": "never",
|
|
||||||
"block-closing-brace-newline-after": "always",
|
|
||||||
"block-closing-brace-newline-before": "always",
|
|
||||||
"block-closing-brace-space-after": "always-single-line",
|
|
||||||
"block-closing-brace-space-before": "always-single-line",
|
|
||||||
"block-no-empty": true,
|
"block-no-empty": true,
|
||||||
"block-opening-brace-newline-after": "always",
|
|
||||||
"block-opening-brace-newline-before": "never-single-line",
|
|
||||||
"block-opening-brace-space-after": "always-single-line",
|
|
||||||
"block-opening-brace-space-before": "always",
|
|
||||||
"color-hex-case": "lower",
|
|
||||||
"color-hex-length": "short",
|
"color-hex-length": "short",
|
||||||
"color-named": "never",
|
"color-named": "never",
|
||||||
"color-no-invalid-hex": true,
|
"color-no-invalid-hex": true,
|
||||||
"comment-whitespace-inside": "always",
|
"comment-whitespace-inside": "always",
|
||||||
"declaration-bang-space-after": "never",
|
|
||||||
"declaration-bang-space-before": "always",
|
|
||||||
"declaration-block-no-duplicate-properties": [
|
"declaration-block-no-duplicate-properties": [
|
||||||
true,
|
true,
|
||||||
{
|
{
|
||||||
"ignoreProperties": [
|
"ignoreProperties": [
|
||||||
"composes"
|
"composes"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"declaration-block-no-redundant-longhand-properties": true,
|
"declaration-block-no-redundant-longhand-properties": true,
|
||||||
"declaration-block-no-shorthand-property-overrides": true,
|
"declaration-block-no-shorthand-property-overrides": true,
|
||||||
"declaration-block-semicolon-newline-after": "always",
|
|
||||||
"declaration-block-semicolon-newline-before": "never-multi-line",
|
|
||||||
"declaration-block-semicolon-space-before": "never",
|
|
||||||
"declaration-block-single-line-max-declarations": 1,
|
"declaration-block-single-line-max-declarations": 1,
|
||||||
"declaration-block-trailing-semicolon": "always",
|
|
||||||
"declaration-colon-space-after": "always",
|
|
||||||
"declaration-colon-space-before": "never",
|
|
||||||
"font-family-name-quotes": "always-unless-keyword",
|
"font-family-name-quotes": "always-unless-keyword",
|
||||||
"function-calc-no-unspaced-operator": true,
|
"function-calc-no-unspaced-operator": true,
|
||||||
"function-comma-newline-after": "never-multi-line",
|
|
||||||
"function-comma-newline-before": "never-multi-line",
|
|
||||||
"function-comma-space-after": "always",
|
|
||||||
"function-comma-space-before": "never",
|
|
||||||
"function-linear-gradient-no-nonstandard-direction": true,
|
"function-linear-gradient-no-nonstandard-direction": true,
|
||||||
"function-name-case": "lower",
|
"function-name-case": "lower",
|
||||||
"function-parentheses-newline-inside": "never-multi-line",
|
|
||||||
"function-parentheses-space-inside": "never",
|
|
||||||
"function-url-quotes": "always",
|
"function-url-quotes": "always",
|
||||||
"function-url-scheme-disallowed-list": [
|
"function-url-scheme-disallowed-list": [
|
||||||
"data"
|
"data"
|
||||||
],
|
],
|
||||||
"function-whitespace-after": "always",
|
|
||||||
"indentation": 2,
|
|
||||||
"keyframe-declaration-no-important": true,
|
"keyframe-declaration-no-important": true,
|
||||||
"length-zero-no-unit": true,
|
"length-zero-no-unit": true,
|
||||||
"max-empty-lines": 1,
|
|
||||||
"max-line-length": [
|
|
||||||
100,
|
|
||||||
{
|
|
||||||
"ignore": [
|
|
||||||
"non-comments"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"max-nesting-depth": 2,
|
"max-nesting-depth": 2,
|
||||||
"media-feature-colon-space-after": "always",
|
|
||||||
"media-feature-colon-space-before": "never",
|
|
||||||
"media-feature-name-case": "lower",
|
|
||||||
"media-feature-name-no-vendor-prefix": true,
|
"media-feature-name-no-vendor-prefix": true,
|
||||||
"media-feature-range-operator-space-after": "always",
|
|
||||||
"media-feature-range-operator-space-before": "always",
|
|
||||||
"no-empty-source": true,
|
"no-empty-source": true,
|
||||||
"no-eol-whitespace": true,
|
|
||||||
"no-extra-semicolons": true,
|
|
||||||
"no-invalid-double-slash-comments": true,
|
"no-invalid-double-slash-comments": true,
|
||||||
"no-missing-end-of-source-newline": true,
|
|
||||||
"number-leading-zero": "always",
|
|
||||||
"number-no-trailing-zeros": true,
|
|
||||||
"order/order": [
|
"order/order": [
|
||||||
"custom-properties",
|
"custom-properties",
|
||||||
"dollar-variables",
|
"dollar-variables",
|
||||||
@@ -132,6 +82,7 @@
|
|||||||
"right",
|
"right",
|
||||||
"bottom",
|
"bottom",
|
||||||
"left",
|
"left",
|
||||||
|
"inset",
|
||||||
"z-index",
|
"z-index",
|
||||||
"display",
|
"display",
|
||||||
"visibility",
|
"visibility",
|
||||||
@@ -343,54 +294,33 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"property-case": "lower",
|
|
||||||
"property-no-vendor-prefix": true,
|
"property-no-vendor-prefix": true,
|
||||||
"rule-empty-line-before": [
|
"rule-empty-line-before": [
|
||||||
"always",
|
"always",
|
||||||
{
|
{
|
||||||
"except": [
|
"except": [
|
||||||
"first-nested"
|
"first-nested"
|
||||||
],
|
],
|
||||||
"ignore": [
|
"ignore": [
|
||||||
"after-comment"
|
"after-comment"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"selector-attribute-brackets-space-inside": "never",
|
|
||||||
"selector-attribute-operator-space-after": "never",
|
|
||||||
"selector-attribute-operator-space-before": "never",
|
|
||||||
"selector-attribute-quotes": "never",
|
"selector-attribute-quotes": "never",
|
||||||
"selector-class-pattern": "^[A-Za-z0-9]+$",
|
"selector-class-pattern": "^[A-Za-z0-9]+$",
|
||||||
"selector-combinator-space-after": "always",
|
|
||||||
"selector-combinator-space-before": "always",
|
|
||||||
"selector-descendant-combinator-no-non-space": true,
|
|
||||||
"selector-list-comma-newline-after": "always",
|
|
||||||
"selector-list-comma-newline-before": "never-multi-line",
|
|
||||||
"selector-list-comma-space-before": "never",
|
|
||||||
"selector-max-attribute": 0,
|
"selector-max-attribute": 0,
|
||||||
"selector-max-class": 3,
|
"selector-max-class": 3,
|
||||||
"selector-max-compound-selectors": 3,
|
"selector-max-compound-selectors": 3,
|
||||||
"selector-max-empty-lines": 0,
|
|
||||||
"selector-max-id": 0,
|
"selector-max-id": 0,
|
||||||
"selector-max-universal": 0,
|
"selector-max-universal": 0,
|
||||||
"selector-pseudo-class-case": "lower",
|
|
||||||
"selector-pseudo-class-parentheses-space-inside": "never",
|
|
||||||
"selector-pseudo-element-case": "lower",
|
|
||||||
"selector-pseudo-element-colon-notation": "double",
|
"selector-pseudo-element-colon-notation": "double",
|
||||||
"selector-pseudo-element-no-unknown": true,
|
"selector-pseudo-element-no-unknown": true,
|
||||||
"selector-type-case": "lower",
|
"selector-type-case": "lower",
|
||||||
"selector-type-no-unknown": true,
|
"selector-type-no-unknown": true,
|
||||||
"shorthand-property-no-redundant-values": true,
|
"shorthand-property-no-redundant-values": true,
|
||||||
"string-no-newline": true,
|
"string-no-newline": true,
|
||||||
"string-quotes": "single",
|
|
||||||
"time-min-milliseconds": 100,
|
"time-min-milliseconds": 100,
|
||||||
"unit-case": "lower",
|
|
||||||
"unit-no-unknown": true,
|
"unit-no-unknown": true,
|
||||||
"value-list-comma-newline-after": "never-multi-line",
|
|
||||||
"value-list-comma-newline-before": "never-multi-line",
|
|
||||||
"value-list-comma-space-after": "always",
|
|
||||||
"value-list-comma-space-before": "never",
|
|
||||||
"value-list-max-empty-lines": 0,
|
|
||||||
"value-no-vendor-prefix": true
|
"value-no-vendor-prefix": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
7
frontend/.vscode/extensions.json
vendored
Normal file
7
frontend/.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"stylelint.vscode-stylelint",
|
||||||
|
"dbaeumer.vscode-eslint",
|
||||||
|
"esbenp.prettier-vscode"
|
||||||
|
]
|
||||||
|
}
|
||||||
23
frontend/.vscode/settings.json
vendored
Normal file
23
frontend/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
// Place your settings in this file to overwrite default and user settings.
|
||||||
|
{
|
||||||
|
"files.insertFinalNewline": true,
|
||||||
|
|
||||||
|
"files.exclude": {
|
||||||
|
"**/node_modules": true,
|
||||||
|
"**/*.d.css": true
|
||||||
|
},
|
||||||
|
|
||||||
|
"editor.formatOnSave": false,
|
||||||
|
"editor.codeActionsOnSave": {
|
||||||
|
"source.fixAll": true
|
||||||
|
},
|
||||||
|
|
||||||
|
"typescript.preferences.quoteStyle": "single",
|
||||||
|
|
||||||
|
"eslint.validate": [
|
||||||
|
"javascript",
|
||||||
|
"javascriptreact",
|
||||||
|
"typescript",
|
||||||
|
"typescriptreact"
|
||||||
|
],
|
||||||
|
}
|
||||||
@@ -17,7 +17,8 @@ module.exports = {
|
|||||||
env: {
|
env: {
|
||||||
development: {
|
development: {
|
||||||
presets: [
|
presets: [
|
||||||
['@babel/preset-react', { development: true }]
|
['@babel/preset-react', { development: true }],
|
||||||
|
'@babel/preset-typescript'
|
||||||
],
|
],
|
||||||
plugins: [
|
plugins: [
|
||||||
'babel-plugin-inline-classnames'
|
'babel-plugin-inline-classnames'
|
||||||
@@ -25,7 +26,8 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
production: {
|
production: {
|
||||||
presets: [
|
presets: [
|
||||||
'@babel/preset-react'
|
'@babel/preset-react',
|
||||||
|
'@babel/preset-typescript'
|
||||||
],
|
],
|
||||||
plugins: [
|
plugins: [
|
||||||
'babel-plugin-transform-react-remove-prop-types'
|
'babel-plugin-transform-react-remove-prop-types'
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const webpack = require('webpack');
|
const webpack = require('webpack');
|
||||||
const FileManagerPlugin = require('filemanager-webpack-plugin');
|
const FileManagerPlugin = require('filemanager-webpack-plugin');
|
||||||
@@ -5,6 +6,7 @@ const HtmlWebpackPlugin = require('html-webpack-plugin');
|
|||||||
const LiveReloadPlugin = require('webpack-livereload-plugin');
|
const LiveReloadPlugin = require('webpack-livereload-plugin');
|
||||||
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
|
||||||
const TerserPlugin = require('terser-webpack-plugin');
|
const TerserPlugin = require('terser-webpack-plugin');
|
||||||
|
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
|
||||||
|
|
||||||
module.exports = (env) => {
|
module.exports = (env) => {
|
||||||
const uiFolder = 'UI';
|
const uiFolder = 'UI';
|
||||||
@@ -38,13 +40,18 @@ module.exports = (env) => {
|
|||||||
},
|
},
|
||||||
|
|
||||||
resolve: {
|
resolve: {
|
||||||
|
extensions: [
|
||||||
|
'.ts',
|
||||||
|
'.tsx',
|
||||||
|
'.js'
|
||||||
|
],
|
||||||
modules: [
|
modules: [
|
||||||
srcFolder,
|
srcFolder,
|
||||||
path.join(srcFolder, 'Shims'),
|
path.join(srcFolder, 'Shims'),
|
||||||
'node_modules'
|
'node_modules'
|
||||||
],
|
],
|
||||||
alias: {
|
alias: {
|
||||||
jquery: 'jquery/src/jquery'
|
jquery: 'jquery/dist/jquery.min'
|
||||||
},
|
},
|
||||||
fallback: {
|
fallback: {
|
||||||
buffer: false,
|
buffer: false,
|
||||||
@@ -130,6 +137,8 @@ module.exports = (env) => {
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
|
new ForkTsCheckerWebpackPlugin(),
|
||||||
|
|
||||||
new LiveReloadPlugin()
|
new LiveReloadPlugin()
|
||||||
],
|
],
|
||||||
|
|
||||||
@@ -153,7 +162,7 @@ module.exports = (env) => {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
test: /\.js?$/,
|
test: [/\.jsx?$/, /\.tsx?$/],
|
||||||
exclude: /(node_modules|JsLibraries)/,
|
exclude: /(node_modules|JsLibraries)/,
|
||||||
use: [
|
use: [
|
||||||
{
|
{
|
||||||
@@ -184,6 +193,7 @@ module.exports = (env) => {
|
|||||||
exclude: /(node_modules|globals.css)/,
|
exclude: /(node_modules|globals.css)/,
|
||||||
use: [
|
use: [
|
||||||
{ loader: MiniCssExtractPlugin.loader },
|
{ loader: MiniCssExtractPlugin.loader },
|
||||||
|
{ loader: 'css-modules-typescript-loader' },
|
||||||
{
|
{
|
||||||
loader: 'css-loader',
|
loader: 'css-loader',
|
||||||
options: {
|
options: {
|
||||||
@@ -251,18 +261,19 @@ module.exports = (env) => {
|
|||||||
config.resolve.alias['react-dom$'] = 'react-dom/profiling';
|
config.resolve.alias['react-dom$'] = 'react-dom/profiling';
|
||||||
config.resolve.alias['scheduler/tracing'] = 'scheduler/tracing-profiling';
|
config.resolve.alias['scheduler/tracing'] = 'scheduler/tracing-profiling';
|
||||||
|
|
||||||
config.optimization.minimizer = [
|
config.optimization = {
|
||||||
new TerserPlugin({
|
minimize: true,
|
||||||
cache: true,
|
minimizer: [
|
||||||
parallel: true,
|
new TerserPlugin({
|
||||||
sourceMap: true, // Must be set to true if using source-maps in production
|
terserOptions: {
|
||||||
terserOptions: {
|
sourceMap: true, // Must be set to true if using source-maps in production
|
||||||
mangle: false,
|
mangle: false,
|
||||||
keep_classnames: true,
|
keep_classnames: true,
|
||||||
keep_fnames: true
|
keep_fnames: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
];
|
]
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// eslint-disable-next-line filenames/match-exported
|
||||||
const loaderUtils = require('loader-utils');
|
const loaderUtils = require('loader-utils');
|
||||||
|
|
||||||
module.exports = function cssVariablesLoader(source) {
|
module.exports = function cssVariablesLoader(source) {
|
||||||
|
|||||||
4
frontend/src/.vscode/settings.json
vendored
4
frontend/src/.vscode/settings.json
vendored
@@ -1,4 +0,0 @@
|
|||||||
// Place your settings in this file to overwrite default and user settings.
|
|
||||||
{
|
|
||||||
"files.insertFinalNewline": true
|
|
||||||
}
|
|
||||||
10
frontend/src/Activity/Blocklist/BlocklistRow.css.d.ts
vendored
Normal file
10
frontend/src/Activity/Blocklist/BlocklistRow.css.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'actions': string;
|
||||||
|
'indexer': string;
|
||||||
|
'language': string;
|
||||||
|
'quality': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
7
frontend/src/Activity/History/Details/HistoryDetails.css.d.ts
vendored
Normal file
7
frontend/src/Activity/History/Details/HistoryDetails.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'description': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -27,6 +27,7 @@ function HistoryDetails(props) {
|
|||||||
downloadClient,
|
downloadClient,
|
||||||
downloadClientName,
|
downloadClientName,
|
||||||
downloadId,
|
downloadId,
|
||||||
|
movieMatchType,
|
||||||
age,
|
age,
|
||||||
ageHours,
|
ageHours,
|
||||||
ageMinutes,
|
ageMinutes,
|
||||||
@@ -73,6 +74,16 @@ function HistoryDetails(props) {
|
|||||||
</span>
|
</span>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
movieMatchType ?
|
||||||
|
<DescriptionListItem
|
||||||
|
descriptionClassName={styles.description}
|
||||||
|
title={translate('MovieMatchType')}
|
||||||
|
data={movieMatchType}
|
||||||
|
/> :
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
downloadClientNameInfo ?
|
downloadClientNameInfo ?
|
||||||
<DescriptionListItem
|
<DescriptionListItem
|
||||||
|
|||||||
7
frontend/src/Activity/History/Details/HistoryDetailsModal.css.d.ts
vendored
Normal file
7
frontend/src/Activity/History/Details/HistoryDetailsModal.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'markAsFailedButton': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
7
frontend/src/Activity/History/HistoryEventTypeCell.css.d.ts
vendored
Normal file
7
frontend/src/Activity/History/HistoryEventTypeCell.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'cell': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
11
frontend/src/Activity/History/HistoryRow.css.d.ts
vendored
Normal file
11
frontend/src/Activity/History/HistoryRow.css.d.ts
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'customFormatScore': string;
|
||||||
|
'details': string;
|
||||||
|
'downloadClient': string;
|
||||||
|
'indexer': string;
|
||||||
|
'releaseGroup': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -56,6 +56,7 @@ class HistoryRow extends Component {
|
|||||||
movie,
|
movie,
|
||||||
quality,
|
quality,
|
||||||
customFormats,
|
customFormats,
|
||||||
|
customFormatScore,
|
||||||
languages,
|
languages,
|
||||||
qualityCutoffNotMet,
|
qualityCutoffNotMet,
|
||||||
eventType,
|
eventType,
|
||||||
@@ -175,7 +176,7 @@ class HistoryRow extends Component {
|
|||||||
key={name}
|
key={name}
|
||||||
className={styles.customFormatScore}
|
className={styles.customFormatScore}
|
||||||
>
|
>
|
||||||
{formatCustomFormatScore(data.customFormatScore)}
|
{formatCustomFormatScore(customFormatScore)}
|
||||||
</TableRowCell>
|
</TableRowCell>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -241,8 +242,9 @@ HistoryRow.propTypes = {
|
|||||||
movie: PropTypes.object.isRequired,
|
movie: PropTypes.object.isRequired,
|
||||||
languages: PropTypes.arrayOf(PropTypes.object).isRequired,
|
languages: PropTypes.arrayOf(PropTypes.object).isRequired,
|
||||||
quality: PropTypes.object.isRequired,
|
quality: PropTypes.object.isRequired,
|
||||||
|
customFormats: PropTypes.arrayOf(PropTypes.object),
|
||||||
|
customFormatScore: PropTypes.number.isRequired,
|
||||||
qualityCutoffNotMet: PropTypes.bool.isRequired,
|
qualityCutoffNotMet: PropTypes.bool.isRequired,
|
||||||
customFormats: PropTypes.arrayOf(PropTypes.object).isRequired,
|
|
||||||
eventType: PropTypes.string.isRequired,
|
eventType: PropTypes.string.isRequired,
|
||||||
sourceTitle: PropTypes.string.isRequired,
|
sourceTitle: PropTypes.string.isRequired,
|
||||||
date: PropTypes.string.isRequired,
|
date: PropTypes.string.isRequired,
|
||||||
|
|||||||
8
frontend/src/Activity/Queue/ProtocolLabel.css.d.ts
vendored
Normal file
8
frontend/src/Activity/Queue/ProtocolLabel.css.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'torrent': string;
|
||||||
|
'usenet': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -75,13 +75,23 @@ class Queue extends Component {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const nextState = {};
|
||||||
|
|
||||||
|
if (prevProps.items !== items) {
|
||||||
|
nextState.items = items;
|
||||||
|
}
|
||||||
|
|
||||||
const selectedIds = this.getSelectedIds();
|
const selectedIds = this.getSelectedIds();
|
||||||
const isPendingSelected = _.some(this.props.items, (item) => {
|
const isPendingSelected = _.some(this.props.items, (item) => {
|
||||||
return selectedIds.indexOf(item.id) > -1 && item.status === 'delay';
|
return selectedIds.indexOf(item.id) > -1 && item.status === 'delay';
|
||||||
});
|
});
|
||||||
|
|
||||||
if (isPendingSelected !== this.state.isPendingSelected) {
|
if (isPendingSelected !== this.state.isPendingSelected) {
|
||||||
this.setState({ isPendingSelected });
|
nextState.isPendingSelected = isPendingSelected;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_.isEmpty(nextState)) {
|
||||||
|
this.setState(nextState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,26 +224,29 @@ class Queue extends Component {
|
|||||||
|
|
||||||
<PageContentBody>
|
<PageContentBody>
|
||||||
{
|
{
|
||||||
isRefreshing && !isAllPopulated &&
|
isRefreshing && !isAllPopulated ?
|
||||||
<LoadingIndicator />
|
<LoadingIndicator /> :
|
||||||
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
!isRefreshing && hasError &&
|
!isRefreshing && hasError ?
|
||||||
<div>
|
<div>
|
||||||
{translate('FailedToLoadQueue')}
|
{translate('FailedToLoadQueue')}
|
||||||
</div>
|
</div> :
|
||||||
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
isAllPopulated && !hasError && !items.length &&
|
isAllPopulated && !hasError && !items.length ?
|
||||||
<div>
|
<div>
|
||||||
{translate('QueueIsEmpty')}
|
{translate('QueueIsEmpty')}
|
||||||
</div>
|
</div> :
|
||||||
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
isAllPopulated && !hasError && !!items.length &&
|
isAllPopulated && !hasError && !!items.length ?
|
||||||
<div>
|
<div>
|
||||||
<Table
|
<Table
|
||||||
columns={columns}
|
columns={columns}
|
||||||
@@ -268,7 +281,8 @@ class Queue extends Component {
|
|||||||
isFetching={isRefreshing}
|
isFetching={isRefreshing}
|
||||||
{...otherProps}
|
{...otherProps}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div> :
|
||||||
|
null
|
||||||
}
|
}
|
||||||
</PageContentBody>
|
</PageContentBody>
|
||||||
|
|
||||||
|
|||||||
10
frontend/src/Activity/Queue/QueueRow.css.d.ts
vendored
Normal file
10
frontend/src/Activity/Queue/QueueRow.css.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'actions': string;
|
||||||
|
'progress': string;
|
||||||
|
'protocol': string;
|
||||||
|
'quality': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -128,6 +128,7 @@ class QueueRow extends Component {
|
|||||||
|
|
||||||
{
|
{
|
||||||
columns.map((column) => {
|
columns.map((column) => {
|
||||||
|
|
||||||
const {
|
const {
|
||||||
name,
|
name,
|
||||||
isVisible
|
isVisible
|
||||||
@@ -234,6 +235,16 @@ class QueueRow extends Component {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (name === 'year') {
|
||||||
|
return (
|
||||||
|
<TableRowCell key={name}>
|
||||||
|
{
|
||||||
|
movie ? movie.year : ''
|
||||||
|
}
|
||||||
|
</TableRowCell>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (name === 'title') {
|
if (name === 'title') {
|
||||||
return (
|
return (
|
||||||
<TableRowCell key={name}>
|
<TableRowCell key={name}>
|
||||||
@@ -362,6 +373,7 @@ QueueRow.propTypes = {
|
|||||||
estimatedCompletionTime: PropTypes.string,
|
estimatedCompletionTime: PropTypes.string,
|
||||||
timeleft: PropTypes.string,
|
timeleft: PropTypes.string,
|
||||||
size: PropTypes.number,
|
size: PropTypes.number,
|
||||||
|
year: PropTypes.number,
|
||||||
sizeleft: PropTypes.number,
|
sizeleft: PropTypes.number,
|
||||||
showRelativeDates: PropTypes.bool.isRequired,
|
showRelativeDates: PropTypes.bool.isRequired,
|
||||||
shortDateFormat: PropTypes.string.isRequired,
|
shortDateFormat: PropTypes.string.isRequired,
|
||||||
|
|||||||
7
frontend/src/Activity/Queue/QueueStatusCell.css.d.ts
vendored
Normal file
7
frontend/src/Activity/Queue/QueueStatusCell.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'status': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
7
frontend/src/Activity/Queue/RemoveQueueItemsModal.css.d.ts
vendored
Normal file
7
frontend/src/Activity/Queue/RemoveQueueItemsModal.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'message': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
7
frontend/src/Activity/Queue/TimeleftCell.css.d.ts
vendored
Normal file
7
frontend/src/Activity/Queue/TimeleftCell.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'timeleft': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
15
frontend/src/AddMovie/AddNewMovie/AddNewMovie.css.d.ts
vendored
Normal file
15
frontend/src/AddMovie/AddNewMovie/AddNewMovie.css.d.ts
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'clearLookupButton': string;
|
||||||
|
'helpText': string;
|
||||||
|
'message': string;
|
||||||
|
'noMoviesText': string;
|
||||||
|
'noResults': string;
|
||||||
|
'searchContainer': string;
|
||||||
|
'searchIconContainer': string;
|
||||||
|
'searchInput': string;
|
||||||
|
'searchResults': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
18
frontend/src/AddMovie/AddNewMovie/AddNewMovieModalContent.css.d.ts
vendored
Normal file
18
frontend/src/AddMovie/AddNewMovie/AddNewMovieModalContent.css.d.ts
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'addButton': string;
|
||||||
|
'container': string;
|
||||||
|
'info': string;
|
||||||
|
'labelIcon': string;
|
||||||
|
'modalFooter': string;
|
||||||
|
'overview': string;
|
||||||
|
'poster': string;
|
||||||
|
'searchForMissingMovieContainer': string;
|
||||||
|
'searchForMissingMovieInput': string;
|
||||||
|
'searchForMissingMovieLabel': string;
|
||||||
|
'searchForMissingMovieLabelContainer': string;
|
||||||
|
'year': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
24
frontend/src/AddMovie/AddNewMovie/AddNewMovieSearchResult.css.d.ts
vendored
Normal file
24
frontend/src/AddMovie/AddNewMovie/AddNewMovieSearchResult.css.d.ts
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'alreadyExistsIcon': string;
|
||||||
|
'certification': string;
|
||||||
|
'content': string;
|
||||||
|
'exclusionIcon': string;
|
||||||
|
'icons': string;
|
||||||
|
'links': string;
|
||||||
|
'overlay': string;
|
||||||
|
'overview': string;
|
||||||
|
'poster': string;
|
||||||
|
'posterContainer': string;
|
||||||
|
'runtime': string;
|
||||||
|
'searchResult': string;
|
||||||
|
'statusContainer': string;
|
||||||
|
'title': string;
|
||||||
|
'titleContainer': string;
|
||||||
|
'titleRow': string;
|
||||||
|
'underlay': string;
|
||||||
|
'year': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -113,6 +113,7 @@ class AddNewMovieSearchResult extends Component {
|
|||||||
images={images}
|
images={images}
|
||||||
size={250}
|
size={250}
|
||||||
overflow={true}
|
overflow={true}
|
||||||
|
lazy={false}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -122,7 +123,7 @@ class AddNewMovieSearchResult extends Component {
|
|||||||
monitored={monitored}
|
monitored={monitored}
|
||||||
hasFile={hasFile}
|
hasFile={hasFile}
|
||||||
status={status}
|
status={status}
|
||||||
posterWidth={posterWidth}
|
width={posterWidth}
|
||||||
detailedProgressBar={true}
|
detailedProgressBar={true}
|
||||||
queueStatus={queueStatus}
|
queueStatus={queueStatus}
|
||||||
queueState={queueState}
|
queueState={queueState}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
|
import { reduce } from 'lodash';
|
||||||
import PropTypes from 'prop-types';
|
import PropTypes from 'prop-types';
|
||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
import LoadingIndicator from 'Components/Loading/LoadingIndicator';
|
||||||
import PageContent from 'Components/Page/PageContent';
|
import PageContent from 'Components/Page/PageContent';
|
||||||
import PageContentBody from 'Components/Page/PageContentBody';
|
import PageContentBody from 'Components/Page/PageContentBody';
|
||||||
import translate from 'Utilities/String/translate';
|
import translate from 'Utilities/String/translate';
|
||||||
import getSelectedIds from 'Utilities/Table/getSelectedIds';
|
|
||||||
import selectAll from 'Utilities/Table/selectAll';
|
import selectAll from 'Utilities/Table/selectAll';
|
||||||
import toggleSelected from 'Utilities/Table/toggleSelected';
|
import toggleSelected from 'Utilities/Table/toggleSelected';
|
||||||
import ImportMovieFooterConnector from './ImportMovieFooterConnector';
|
import ImportMovieFooterConnector from './ImportMovieFooterConnector';
|
||||||
@@ -18,6 +18,8 @@ class ImportMovie extends Component {
|
|||||||
constructor(props, context) {
|
constructor(props, context) {
|
||||||
super(props, context);
|
super(props, context);
|
||||||
|
|
||||||
|
this.scrollerRef = React.createRef();
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
allSelected: false,
|
allSelected: false,
|
||||||
allUnselected: false,
|
allUnselected: false,
|
||||||
@@ -27,18 +29,21 @@ class ImportMovie extends Component {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Control
|
|
||||||
|
|
||||||
setScrollerRef = (ref) => {
|
|
||||||
this.setState({ scroller: ref });
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Listeners
|
// Listeners
|
||||||
|
|
||||||
getSelectedIds = () => {
|
getSelectedIds = () => {
|
||||||
return getSelectedIds(this.state.selectedState, { parseIds: false });
|
return reduce(
|
||||||
|
this.state.selectedState,
|
||||||
|
(result, value, id) => {
|
||||||
|
if (value) {
|
||||||
|
result.push(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
[]
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
onSelectAllChange = ({ value }) => {
|
onSelectAllChange = ({ value }) => {
|
||||||
@@ -88,16 +93,12 @@ class ImportMovie extends Component {
|
|||||||
const {
|
const {
|
||||||
allSelected,
|
allSelected,
|
||||||
allUnselected,
|
allUnselected,
|
||||||
selectedState,
|
selectedState
|
||||||
scroller
|
|
||||||
} = this.state;
|
} = this.state;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageContent title={translate('ImportMovies')}>
|
<PageContent title={translate('ImportMovies')}>
|
||||||
<PageContentBody
|
<PageContentBody ref={this.scrollerRef} >
|
||||||
registerScroller={this.setScrollerRef}
|
|
||||||
onScroll={this.onScroll}
|
|
||||||
>
|
|
||||||
{
|
{
|
||||||
rootFoldersFetching ? <LoadingIndicator /> : null
|
rootFoldersFetching ? <LoadingIndicator /> : null
|
||||||
}
|
}
|
||||||
@@ -126,14 +127,14 @@ class ImportMovie extends Component {
|
|||||||
!rootFoldersFetching &&
|
!rootFoldersFetching &&
|
||||||
rootFoldersPopulated &&
|
rootFoldersPopulated &&
|
||||||
!!unmappedFolders.length &&
|
!!unmappedFolders.length &&
|
||||||
scroller ?
|
this.scrollerRef.current ?
|
||||||
<ImportMovieTableConnector
|
<ImportMovieTableConnector
|
||||||
rootFolderId={rootFolderId}
|
rootFolderId={rootFolderId}
|
||||||
unmappedFolders={unmappedFolders}
|
unmappedFolders={unmappedFolders}
|
||||||
allSelected={allSelected}
|
allSelected={allSelected}
|
||||||
allUnselected={allUnselected}
|
allUnselected={allUnselected}
|
||||||
selectedState={selectedState}
|
selectedState={selectedState}
|
||||||
scroller={scroller}
|
scroller={this.scrollerRef.current}
|
||||||
onSelectAllChange={this.onSelectAllChange}
|
onSelectAllChange={this.onSelectAllChange}
|
||||||
onSelectedChange={this.onSelectedChange}
|
onSelectedChange={this.onSelectedChange}
|
||||||
onRemoveSelectedStateItem={this.onRemoveSelectedStateItem}
|
onRemoveSelectedStateItem={this.onRemoveSelectedStateItem}
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
.inputContainer {
|
.inputContainer {
|
||||||
margin-right: 20px;
|
margin-right: 20px;
|
||||||
min-width: 150px;
|
min-width: 150px;
|
||||||
|
|
||||||
|
div {
|
||||||
|
margin-top: 10px;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.label {
|
.label {
|
||||||
@@ -35,3 +43,17 @@
|
|||||||
.importError {
|
.importError {
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: $breakpointSmall) {
|
||||||
|
.inputContainer {
|
||||||
|
margin-top: 10px;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.importButtonContainer {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
13
frontend/src/AddMovie/ImportMovie/Import/ImportMovieFooter.css.d.ts
vendored
Normal file
13
frontend/src/AddMovie/ImportMovie/Import/ImportMovieFooter.css.d.ts
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'importButton': string;
|
||||||
|
'importButtonContainer': string;
|
||||||
|
'importError': string;
|
||||||
|
'inputContainer': string;
|
||||||
|
'label': string;
|
||||||
|
'loading': string;
|
||||||
|
'loadingButton': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -225,13 +225,19 @@ class ImportMovieFooter extends Component {
|
|||||||
body={
|
body={
|
||||||
<ul>
|
<ul>
|
||||||
{
|
{
|
||||||
importError.responseJSON.map((error, index) => {
|
Array.isArray(importError.responseJSON) ?
|
||||||
return (
|
importError.responseJSON.map((error, index) => {
|
||||||
<li key={index}>
|
return (
|
||||||
{error.errorMessage}
|
<li key={index}>
|
||||||
</li>
|
{error.errorMessage}
|
||||||
);
|
</li>
|
||||||
})
|
);
|
||||||
|
}) :
|
||||||
|
<li>
|
||||||
|
{
|
||||||
|
JSON.stringify(importError.responseJSON)
|
||||||
|
}
|
||||||
|
</li>
|
||||||
}
|
}
|
||||||
</ul>
|
</ul>
|
||||||
}
|
}
|
||||||
|
|||||||
12
frontend/src/AddMovie/ImportMovie/Import/ImportMovieHeader.css.d.ts
vendored
Normal file
12
frontend/src/AddMovie/ImportMovie/Import/ImportMovieHeader.css.d.ts
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'detailsIcon': string;
|
||||||
|
'folder': string;
|
||||||
|
'minimumAvailability': string;
|
||||||
|
'monitor': string;
|
||||||
|
'movie': string;
|
||||||
|
'qualityProfile': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
12
frontend/src/AddMovie/ImportMovie/Import/ImportMovieRow.css.d.ts
vendored
Normal file
12
frontend/src/AddMovie/ImportMovie/Import/ImportMovieRow.css.d.ts
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'folder': string;
|
||||||
|
'minimumAvailability': string;
|
||||||
|
'monitor': string;
|
||||||
|
'movie': string;
|
||||||
|
'qualityProfile': string;
|
||||||
|
'selectInput': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
10
frontend/src/AddMovie/ImportMovie/Import/SelectMovie/ImportMovieSearchResult.css.d.ts
vendored
Normal file
10
frontend/src/AddMovie/ImportMovie/Import/SelectMovie/ImportMovieSearchResult.css.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'container': string;
|
||||||
|
'movie': string;
|
||||||
|
'tmdbLink': string;
|
||||||
|
'tmdbLinkIcon': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
16
frontend/src/AddMovie/ImportMovie/Import/SelectMovie/ImportMovieSelectMovie.css.d.ts
vendored
Normal file
16
frontend/src/AddMovie/ImportMovie/Import/SelectMovie/ImportMovieSelectMovie.css.d.ts
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'button': string;
|
||||||
|
'content': string;
|
||||||
|
'contentContainer': string;
|
||||||
|
'dropdownArrowContainer': string;
|
||||||
|
'existing': string;
|
||||||
|
'loading': string;
|
||||||
|
'searchContainer': string;
|
||||||
|
'searchIconContainer': string;
|
||||||
|
'searchInput': string;
|
||||||
|
'warningIcon': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
10
frontend/src/AddMovie/ImportMovie/Import/SelectMovie/ImportMovieTitle.css.d.ts
vendored
Normal file
10
frontend/src/AddMovie/ImportMovie/Import/SelectMovie/ImportMovieTitle.css.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'existing': string;
|
||||||
|
'title': string;
|
||||||
|
'titleContainer': string;
|
||||||
|
'year': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
10
frontend/src/AddMovie/ImportMovie/SelectFolder/ImportMovieRootFolderRow.css.d.ts
vendored
Normal file
10
frontend/src/AddMovie/ImportMovie/SelectFolder/ImportMovieRootFolderRow.css.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'actions': string;
|
||||||
|
'freeSpace': string;
|
||||||
|
'link': string;
|
||||||
|
'unmappedFolders': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
14
frontend/src/AddMovie/ImportMovie/SelectFolder/ImportMovieSelectFolder.css.d.ts
vendored
Normal file
14
frontend/src/AddMovie/ImportMovie/SelectFolder/ImportMovieSelectFolder.css.d.ts
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'addErrorAlert': string;
|
||||||
|
'code': string;
|
||||||
|
'header': string;
|
||||||
|
'importButtonIcon': string;
|
||||||
|
'recentFolders': string;
|
||||||
|
'startImport': string;
|
||||||
|
'tip': string;
|
||||||
|
'tips': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -152,13 +152,19 @@ class ImportMovieSelectFolder extends Component {
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
{
|
{
|
||||||
saveError.responseJSON.map((e, index) => {
|
Array.isArray(saveError.responseJSON) ?
|
||||||
return (
|
saveError.responseJSON.map((e, index) => {
|
||||||
<li key={index}>
|
return (
|
||||||
{e.errorMessage}
|
<li key={index}>
|
||||||
</li>
|
{e.errorMessage}
|
||||||
);
|
</li>
|
||||||
})
|
);
|
||||||
|
}) :
|
||||||
|
<li>
|
||||||
|
{
|
||||||
|
JSON.stringify(saveError.responseJSON)
|
||||||
|
}
|
||||||
|
</li>
|
||||||
}
|
}
|
||||||
</ul>
|
</ul>
|
||||||
</Alert> :
|
</Alert> :
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import NotFound from 'Components/NotFound';
|
|||||||
import Switch from 'Components/Router/Switch';
|
import Switch from 'Components/Router/Switch';
|
||||||
import DiscoverMovieConnector from 'DiscoverMovie/DiscoverMovieConnector';
|
import DiscoverMovieConnector from 'DiscoverMovie/DiscoverMovieConnector';
|
||||||
import MovieDetailsPageConnector from 'Movie/Details/MovieDetailsPageConnector';
|
import MovieDetailsPageConnector from 'Movie/Details/MovieDetailsPageConnector';
|
||||||
import MovieIndexConnector from 'Movie/Index/MovieIndexConnector';
|
import MovieIndex from 'Movie/Index/MovieIndex';
|
||||||
import CustomFormatSettingsConnector from 'Settings/CustomFormats/CustomFormatSettingsConnector';
|
import CustomFormatSettingsConnector from 'Settings/CustomFormats/CustomFormatSettingsConnector';
|
||||||
import DownloadClientSettingsConnector from 'Settings/DownloadClients/DownloadClientSettingsConnector';
|
import DownloadClientSettingsConnector from 'Settings/DownloadClients/DownloadClientSettingsConnector';
|
||||||
import GeneralSettingsConnector from 'Settings/General/GeneralSettingsConnector';
|
import GeneralSettingsConnector from 'Settings/General/GeneralSettingsConnector';
|
||||||
@@ -48,7 +48,7 @@ function AppRoutes(props) {
|
|||||||
<Route
|
<Route
|
||||||
exact={true}
|
exact={true}
|
||||||
path="/"
|
path="/"
|
||||||
component={MovieIndexConnector}
|
component={MovieIndex}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
9
frontend/src/App/AppUpdatedModalContent.css.d.ts
vendored
Normal file
9
frontend/src/App/AppUpdatedModalContent.css.d.ts
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'changes': string;
|
||||||
|
'maintenance': string;
|
||||||
|
'version': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
7
frontend/src/App/ConnectionLostModal.css.d.ts
vendored
Normal file
7
frontend/src/App/ConnectionLostModal.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'automatic': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
5
frontend/src/App/ModelBase.ts
Normal file
5
frontend/src/App/ModelBase.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
interface ModelBase {
|
||||||
|
id: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ModelBase;
|
||||||
83
frontend/src/App/SelectContext.tsx
Normal file
83
frontend/src/App/SelectContext.tsx
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
import { cloneDeep } from 'lodash';
|
||||||
|
import React, { useCallback, useEffect } from 'react';
|
||||||
|
import useSelectState, { SelectState } from 'Helpers/Hooks/useSelectState';
|
||||||
|
import ModelBase from './ModelBase';
|
||||||
|
|
||||||
|
export type SelectContextAction =
|
||||||
|
| { type: 'reset' }
|
||||||
|
| { type: 'selectAll' }
|
||||||
|
| { type: 'unselectAll' }
|
||||||
|
| {
|
||||||
|
type: 'toggleSelected';
|
||||||
|
id: number;
|
||||||
|
isSelected: boolean;
|
||||||
|
shiftKey: boolean;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: 'removeItem';
|
||||||
|
id: number;
|
||||||
|
}
|
||||||
|
| {
|
||||||
|
type: 'updateItems';
|
||||||
|
items: ModelBase[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export type SelectDispatch = (action: SelectContextAction) => void;
|
||||||
|
|
||||||
|
interface SelectProviderOptions<T extends ModelBase> {
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
children: any;
|
||||||
|
items: Array<T>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SelectContext = React.createContext<
|
||||||
|
[SelectState, SelectDispatch] | undefined
|
||||||
|
>(cloneDeep(undefined));
|
||||||
|
|
||||||
|
export function SelectProvider<T extends ModelBase>(
|
||||||
|
props: SelectProviderOptions<T>
|
||||||
|
) {
|
||||||
|
const { items } = props;
|
||||||
|
const [state, dispatch] = useSelectState();
|
||||||
|
|
||||||
|
const dispatchWrapper = useCallback(
|
||||||
|
(action: SelectContextAction) => {
|
||||||
|
switch (action.type) {
|
||||||
|
case 'reset':
|
||||||
|
case 'removeItem':
|
||||||
|
dispatch(action);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
dispatch({
|
||||||
|
...action,
|
||||||
|
items,
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[items, dispatch]
|
||||||
|
);
|
||||||
|
|
||||||
|
const value: [SelectState, SelectDispatch] = [state, dispatchWrapper];
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
dispatch({ type: 'updateItems', items });
|
||||||
|
}, [items, dispatch]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<SelectContext.Provider value={value}>
|
||||||
|
{props.children}
|
||||||
|
</SelectContext.Provider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useSelect() {
|
||||||
|
const context = React.useContext(SelectContext);
|
||||||
|
|
||||||
|
if (context === undefined) {
|
||||||
|
throw new Error('useSelect must be used within a SelectProvider');
|
||||||
|
}
|
||||||
|
|
||||||
|
return context;
|
||||||
|
}
|
||||||
48
frontend/src/App/State/AppSectionState.ts
Normal file
48
frontend/src/App/State/AppSectionState.ts
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
import SortDirection from 'Helpers/Props/SortDirection';
|
||||||
|
|
||||||
|
export interface Error {
|
||||||
|
responseJSON: {
|
||||||
|
message: string;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AppSectionDeleteState {
|
||||||
|
isDeleting: boolean;
|
||||||
|
deleteError: Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AppSectionSaveState {
|
||||||
|
isSaving: boolean;
|
||||||
|
saveError: Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PagedAppSectionState {
|
||||||
|
pageSize: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AppSectionSchemaState<T> {
|
||||||
|
isSchemaFetching: boolean;
|
||||||
|
isSchemaPopulated: boolean;
|
||||||
|
schemaError: Error;
|
||||||
|
schema: {
|
||||||
|
items: T[];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AppSectionItemState<T> {
|
||||||
|
isFetching: boolean;
|
||||||
|
isPopulated: boolean;
|
||||||
|
error: Error;
|
||||||
|
item: T;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AppSectionState<T> {
|
||||||
|
isFetching: boolean;
|
||||||
|
isPopulated: boolean;
|
||||||
|
error: Error;
|
||||||
|
items: T[];
|
||||||
|
sortKey: string;
|
||||||
|
sortDirection: SortDirection;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default AppSectionState;
|
||||||
50
frontend/src/App/State/AppState.ts
Normal file
50
frontend/src/App/State/AppState.ts
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
import InteractiveImportAppState from 'App/State/InteractiveImportAppState';
|
||||||
|
import MovieFilesAppState from './MovieFilesAppState';
|
||||||
|
import MoviesAppState, { MovieIndexAppState } from './MoviesAppState';
|
||||||
|
import QueueAppState from './QueueAppState';
|
||||||
|
import SettingsAppState from './SettingsAppState';
|
||||||
|
import TagsAppState from './TagsAppState';
|
||||||
|
|
||||||
|
interface FilterBuilderPropOption {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FilterBuilderProp<T> {
|
||||||
|
name: string;
|
||||||
|
label: string;
|
||||||
|
type: string;
|
||||||
|
valueType?: string;
|
||||||
|
optionsSelector?: (items: T[]) => FilterBuilderPropOption[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PropertyFilter {
|
||||||
|
key: string;
|
||||||
|
value: boolean | string | number | string[] | number[];
|
||||||
|
type: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Filter {
|
||||||
|
key: string;
|
||||||
|
label: string;
|
||||||
|
filers: PropertyFilter[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CustomFilter {
|
||||||
|
id: number;
|
||||||
|
type: string;
|
||||||
|
label: string;
|
||||||
|
filers: PropertyFilter[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface AppState {
|
||||||
|
movieFiles: MovieFilesAppState;
|
||||||
|
interactiveImport: InteractiveImportAppState;
|
||||||
|
movieIndex: MovieIndexAppState;
|
||||||
|
settings: SettingsAppState;
|
||||||
|
movies: MoviesAppState;
|
||||||
|
tags: TagsAppState;
|
||||||
|
queue: QueueAppState;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default AppState;
|
||||||
8
frontend/src/App/State/ClientSideCollectionAppState.ts
Normal file
8
frontend/src/App/State/ClientSideCollectionAppState.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { CustomFilter } from './AppState';
|
||||||
|
|
||||||
|
interface ClientSideCollectionAppState {
|
||||||
|
totalItems: number;
|
||||||
|
customFilters: CustomFilter[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ClientSideCollectionAppState;
|
||||||
10
frontend/src/App/State/CustomFiltersAppState.ts
Normal file
10
frontend/src/App/State/CustomFiltersAppState.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import AppSectionState, {
|
||||||
|
AppSectionDeleteState,
|
||||||
|
} from 'App/State/AppSectionState';
|
||||||
|
import { CustomFilter } from './AppState';
|
||||||
|
|
||||||
|
interface CustomFiltersAppState
|
||||||
|
extends AppSectionState<CustomFilter>,
|
||||||
|
AppSectionDeleteState {}
|
||||||
|
|
||||||
|
export default CustomFiltersAppState;
|
||||||
12
frontend/src/App/State/InteractiveImportAppState.ts
Normal file
12
frontend/src/App/State/InteractiveImportAppState.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import AppSectionState from 'App/State/AppSectionState';
|
||||||
|
import RecentFolder from 'InteractiveImport/Folder/RecentFolder';
|
||||||
|
import ImportMode from '../../InteractiveImport/ImportMode';
|
||||||
|
import InteractiveImport from '../../InteractiveImport/InteractiveImport';
|
||||||
|
|
||||||
|
interface InteractiveImportAppState extends AppSectionState<InteractiveImport> {
|
||||||
|
originalItems: InteractiveImport[];
|
||||||
|
importMode: ImportMode;
|
||||||
|
recentFolders: RecentFolder[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export default InteractiveImportAppState;
|
||||||
10
frontend/src/App/State/MovieFilesAppState.ts
Normal file
10
frontend/src/App/State/MovieFilesAppState.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import AppSectionState, {
|
||||||
|
AppSectionDeleteState,
|
||||||
|
} from 'App/State/AppSectionState';
|
||||||
|
import { MovieFile } from 'MovieFile/MovieFile';
|
||||||
|
|
||||||
|
interface MovieFilesAppState
|
||||||
|
extends AppSectionState<MovieFile>,
|
||||||
|
AppSectionDeleteState {}
|
||||||
|
|
||||||
|
export default MovieFilesAppState;
|
||||||
61
frontend/src/App/State/MoviesAppState.ts
Normal file
61
frontend/src/App/State/MoviesAppState.ts
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
import AppSectionState, {
|
||||||
|
AppSectionDeleteState,
|
||||||
|
AppSectionSaveState,
|
||||||
|
} from 'App/State/AppSectionState';
|
||||||
|
import Column from 'Components/Table/Column';
|
||||||
|
import SortDirection from 'Helpers/Props/SortDirection';
|
||||||
|
import Movie from 'Movie/Movie';
|
||||||
|
import { Filter, FilterBuilderProp } from './AppState';
|
||||||
|
|
||||||
|
export interface MovieIndexAppState {
|
||||||
|
sortKey: string;
|
||||||
|
sortDirection: SortDirection;
|
||||||
|
secondarySortKey: string;
|
||||||
|
secondarySortDirection: SortDirection;
|
||||||
|
view: string;
|
||||||
|
|
||||||
|
posterOptions: {
|
||||||
|
detailedProgressBar: boolean;
|
||||||
|
size: string;
|
||||||
|
showTitle: boolean;
|
||||||
|
showMonitored: boolean;
|
||||||
|
showQualityProfile: boolean;
|
||||||
|
showReleaseDate: boolean;
|
||||||
|
showCinemaRelease: boolean;
|
||||||
|
showSearchAction: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
overviewOptions: {
|
||||||
|
detailedProgressBar: boolean;
|
||||||
|
size: string;
|
||||||
|
showMonitored: boolean;
|
||||||
|
showStudio: boolean;
|
||||||
|
showQualityProfile: boolean;
|
||||||
|
showAdded: boolean;
|
||||||
|
showPath: boolean;
|
||||||
|
showSizeOnDisk: boolean;
|
||||||
|
showSearchAction: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
tableOptions: {
|
||||||
|
showSearchAction: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
selectedFilterKey: string;
|
||||||
|
filterBuilderProps: FilterBuilderProp<Movie>[];
|
||||||
|
filters: Filter[];
|
||||||
|
columns: Column[];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface MoviesAppState
|
||||||
|
extends AppSectionState<Movie>,
|
||||||
|
AppSectionDeleteState,
|
||||||
|
AppSectionSaveState {
|
||||||
|
itemMap: Record<number, number>;
|
||||||
|
|
||||||
|
deleteOptions: {
|
||||||
|
addImportExclusion: boolean;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export default MoviesAppState;
|
||||||
51
frontend/src/App/State/QueueAppState.ts
Normal file
51
frontend/src/App/State/QueueAppState.ts
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
import ModelBase from 'App/ModelBase';
|
||||||
|
import Language from 'Language/Language';
|
||||||
|
import { QualityModel } from 'Quality/Quality';
|
||||||
|
import CustomFormat from 'typings/CustomFormat';
|
||||||
|
import AppSectionState, { AppSectionItemState, Error } from './AppSectionState';
|
||||||
|
|
||||||
|
export interface StatusMessage {
|
||||||
|
title: string;
|
||||||
|
messages: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Queue extends ModelBase {
|
||||||
|
languages: Language[];
|
||||||
|
quality: QualityModel;
|
||||||
|
customFormats: CustomFormat[];
|
||||||
|
size: number;
|
||||||
|
title: string;
|
||||||
|
sizeleft: number;
|
||||||
|
timeleft: string;
|
||||||
|
estimatedCompletionTime: string;
|
||||||
|
status: string;
|
||||||
|
trackedDownloadStatus: string;
|
||||||
|
trackedDownloadState: string;
|
||||||
|
statusMessages: StatusMessage[];
|
||||||
|
errorMessage: string;
|
||||||
|
downloadId: string;
|
||||||
|
protocol: string;
|
||||||
|
downloadClient: string;
|
||||||
|
outputPath: string;
|
||||||
|
movieHasFile: boolean;
|
||||||
|
movieId?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface QueueDetailsAppState extends AppSectionState<Queue> {
|
||||||
|
params: unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface QueuePagedAppState extends AppSectionState<Queue> {
|
||||||
|
isGrabbing: boolean;
|
||||||
|
grabError: Error;
|
||||||
|
isRemoving: boolean;
|
||||||
|
removeError: Error;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface QueueAppState {
|
||||||
|
status: AppSectionItemState<Queue>;
|
||||||
|
details: QueueDetailsAppState;
|
||||||
|
paged: QueuePagedAppState;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default QueueAppState;
|
||||||
28
frontend/src/App/State/SettingsAppState.ts
Normal file
28
frontend/src/App/State/SettingsAppState.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import AppSectionState, {
|
||||||
|
AppSectionDeleteState,
|
||||||
|
AppSectionSchemaState,
|
||||||
|
} from 'App/State/AppSectionState';
|
||||||
|
import Language from 'Language/Language';
|
||||||
|
import DownloadClient from 'typings/DownloadClient';
|
||||||
|
import QualityProfile from 'typings/QualityProfile';
|
||||||
|
import { UiSettings } from 'typings/UiSettings';
|
||||||
|
|
||||||
|
export interface DownloadClientAppState
|
||||||
|
extends AppSectionState<DownloadClient>,
|
||||||
|
AppSectionDeleteState {}
|
||||||
|
|
||||||
|
export interface QualityProfilesAppState
|
||||||
|
extends AppSectionState<QualityProfile>,
|
||||||
|
AppSectionSchemaState<QualityProfile> {}
|
||||||
|
|
||||||
|
export type LanguageSettingsAppState = AppSectionState<Language>;
|
||||||
|
export type UiSettingsAppState = AppSectionState<UiSettings>;
|
||||||
|
|
||||||
|
interface SettingsAppState {
|
||||||
|
downloadClients: DownloadClientAppState;
|
||||||
|
language: LanguageSettingsAppState;
|
||||||
|
uiSettings: UiSettingsAppState;
|
||||||
|
qualityProfiles: QualityProfilesAppState;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default SettingsAppState;
|
||||||
12
frontend/src/App/State/TagsAppState.ts
Normal file
12
frontend/src/App/State/TagsAppState.ts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import ModelBase from 'App/ModelBase';
|
||||||
|
import AppSectionState, {
|
||||||
|
AppSectionDeleteState,
|
||||||
|
} from 'App/State/AppSectionState';
|
||||||
|
|
||||||
|
export interface Tag extends ModelBase {
|
||||||
|
label: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface TagsAppState extends AppSectionState<Tag>, AppSectionDeleteState {}
|
||||||
|
|
||||||
|
export default TagsAppState;
|
||||||
7
frontend/src/Calendar/Agenda/Agenda.css.d.ts
vendored
Normal file
7
frontend/src/Calendar/Agenda/Agenda.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'agenda': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
21
frontend/src/Calendar/Agenda/AgendaEvent.css.d.ts
vendored
Normal file
21
frontend/src/Calendar/Agenda/AgendaEvent.css.d.ts
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'continuing': string;
|
||||||
|
'date': string;
|
||||||
|
'dateIcon': string;
|
||||||
|
'downloaded': string;
|
||||||
|
'event': string;
|
||||||
|
'eventWrapper': string;
|
||||||
|
'genres': string;
|
||||||
|
'link': string;
|
||||||
|
'missingMonitored': string;
|
||||||
|
'missingUnmonitored': string;
|
||||||
|
'movieTitle': string;
|
||||||
|
'queue': string;
|
||||||
|
'statusIcon': string;
|
||||||
|
'time': string;
|
||||||
|
'unmonitored': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
8
frontend/src/Calendar/Calendar.css.d.ts
vendored
Normal file
8
frontend/src/Calendar/Calendar.css.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'calendar': string;
|
||||||
|
'calendarContent': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
9
frontend/src/Calendar/CalendarPage.css.d.ts
vendored
Normal file
9
frontend/src/Calendar/CalendarPage.css.d.ts
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'calendarInnerPageBody': string;
|
||||||
|
'calendarPageBody': string;
|
||||||
|
'errorMessage': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
11
frontend/src/Calendar/Day/CalendarDay.css.d.ts
vendored
Normal file
11
frontend/src/Calendar/Day/CalendarDay.css.d.ts
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'day': string;
|
||||||
|
'dayOfMonth': string;
|
||||||
|
'isDifferentMonth': string;
|
||||||
|
'isSingleDay': string;
|
||||||
|
'isToday': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
11
frontend/src/Calendar/Day/CalendarDays.css.d.ts
vendored
Normal file
11
frontend/src/Calendar/Day/CalendarDays.css.d.ts
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'day': string;
|
||||||
|
'days': string;
|
||||||
|
'forecast': string;
|
||||||
|
'month': string;
|
||||||
|
'week': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
.dayOfWeek {
|
.dayOfWeek {
|
||||||
flex: 1 0 14.28%;
|
flex: 1 0 14.28%;
|
||||||
background-color: var(--calendarBackgroudColor);
|
background-color: var(--calendarBackgroundColor);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
9
frontend/src/Calendar/Day/DayOfWeek.css.d.ts
vendored
Normal file
9
frontend/src/Calendar/Day/DayOfWeek.css.d.ts
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'dayOfWeek': string;
|
||||||
|
'isSingleDay': string;
|
||||||
|
'isToday': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
7
frontend/src/Calendar/Day/DaysOfWeek.css.d.ts
vendored
Normal file
7
frontend/src/Calendar/Day/DaysOfWeek.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'daysOfWeek': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
19
frontend/src/Calendar/Events/CalendarEvent.css.d.ts
vendored
Normal file
19
frontend/src/Calendar/Events/CalendarEvent.css.d.ts
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'continuing': string;
|
||||||
|
'downloaded': string;
|
||||||
|
'event': string;
|
||||||
|
'genres': string;
|
||||||
|
'info': string;
|
||||||
|
'link': string;
|
||||||
|
'missingMonitored': string;
|
||||||
|
'missingUnmonitored': string;
|
||||||
|
'movieInfo': string;
|
||||||
|
'movieTitle': string;
|
||||||
|
'queue': string;
|
||||||
|
'statusIcon': string;
|
||||||
|
'unmonitored': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
14
frontend/src/Calendar/Header/CalendarHeader.css.d.ts
vendored
Normal file
14
frontend/src/Calendar/Header/CalendarHeader.css.d.ts
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'header': string;
|
||||||
|
'loading': string;
|
||||||
|
'navigationButtons': string;
|
||||||
|
'titleDesktop': string;
|
||||||
|
'titleMobile': string;
|
||||||
|
'todayButton': string;
|
||||||
|
'viewButtonsContainer': string;
|
||||||
|
'viewMenu': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
7
frontend/src/Calendar/Legend/Legend.css.d.ts
vendored
Normal file
7
frontend/src/Calendar/Legend/Legend.css.d.ts
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'legend': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
8
frontend/src/Calendar/Legend/LegendIconItem.css.d.ts
vendored
Normal file
8
frontend/src/Calendar/Legend/LegendIconItem.css.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'icon': string;
|
||||||
|
'legendIconItem': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
18
frontend/src/Calendar/Legend/LegendItem.css.d.ts
vendored
Normal file
18
frontend/src/Calendar/Legend/LegendItem.css.d.ts
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'availNotMonitored': string;
|
||||||
|
'continuing': string;
|
||||||
|
'ended': string;
|
||||||
|
'legendItem': string;
|
||||||
|
'legendItemColor': string;
|
||||||
|
'legendItemContainer': string;
|
||||||
|
'legendItemText': string;
|
||||||
|
'missingMonitored': string;
|
||||||
|
'missingMonitoredColorImpaired': string;
|
||||||
|
'missingUnmonitored': string;
|
||||||
|
'missingUnmonitoredColorImpaired': string;
|
||||||
|
'queue': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -162,7 +162,7 @@ class CalendarOptionsModalContent extends Component {
|
|||||||
values={weekColumnOptions}
|
values={weekColumnOptions}
|
||||||
value={calendarWeekColumnHeader}
|
value={calendarWeekColumnHeader}
|
||||||
onChange={this.onGlobalInputChange}
|
onChange={this.onGlobalInputChange}
|
||||||
helpText={translate('HelpText')}
|
helpText={translate('SettingsWeekColumnHeaderHelpText')}
|
||||||
/>
|
/>
|
||||||
</FormGroup>
|
</FormGroup>
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ function getUrls(state) {
|
|||||||
icalUrl += `tags=${tags.toString()}&`;
|
icalUrl += `tags=${tags.toString()}&`;
|
||||||
}
|
}
|
||||||
|
|
||||||
icalUrl += `apikey=${window.Radarr.apiKey}`;
|
icalUrl += `apikey=${encodeURIComponent(window.Radarr.apiKey)}`;
|
||||||
|
|
||||||
const iCalHttpUrl = `${window.location.protocol}//${icalUrl}`;
|
const iCalHttpUrl = `${window.location.protocol}//${icalUrl}`;
|
||||||
const iCalWebCalUrl = `webcal://${icalUrl}`;
|
const iCalWebCalUrl = `webcal://${icalUrl}`;
|
||||||
|
|||||||
18
frontend/src/Collection/AddNewCollectionMovieModalContent.css.d.ts
vendored
Normal file
18
frontend/src/Collection/AddNewCollectionMovieModalContent.css.d.ts
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'addButton': string;
|
||||||
|
'container': string;
|
||||||
|
'info': string;
|
||||||
|
'labelIcon': string;
|
||||||
|
'modalFooter': string;
|
||||||
|
'overview': string;
|
||||||
|
'poster': string;
|
||||||
|
'searchForMissingMovieContainer': string;
|
||||||
|
'searchForMissingMovieInput': string;
|
||||||
|
'searchForMissingMovieLabel': string;
|
||||||
|
'searchForMissingMovieLabelContainer': string;
|
||||||
|
'year': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -35,8 +35,9 @@ class Collection extends Component {
|
|||||||
constructor(props, context) {
|
constructor(props, context) {
|
||||||
super(props, context);
|
super(props, context);
|
||||||
|
|
||||||
|
this.scrollerRef = React.createRef();
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
scroller: null,
|
|
||||||
jumpBarItems: { order: [] },
|
jumpBarItems: { order: [] },
|
||||||
jumpToCharacter: null,
|
jumpToCharacter: null,
|
||||||
isPosterOptionsModalOpen: false,
|
isPosterOptionsModalOpen: false,
|
||||||
@@ -78,10 +79,6 @@ class Collection extends Component {
|
|||||||
//
|
//
|
||||||
// Control
|
// Control
|
||||||
|
|
||||||
setScrollerRef = (ref) => {
|
|
||||||
this.setState({ scroller: ref });
|
|
||||||
};
|
|
||||||
|
|
||||||
getSelectedIds = () => {
|
getSelectedIds = () => {
|
||||||
if (this.state.allUnselected) {
|
if (this.state.allUnselected) {
|
||||||
return [];
|
return [];
|
||||||
@@ -234,7 +231,6 @@ class Collection extends Component {
|
|||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
const {
|
const {
|
||||||
scroller,
|
|
||||||
jumpBarItems,
|
jumpBarItems,
|
||||||
jumpToCharacter,
|
jumpToCharacter,
|
||||||
isOverviewOptionsModalOpen,
|
isOverviewOptionsModalOpen,
|
||||||
@@ -246,7 +242,7 @@ class Collection extends Component {
|
|||||||
const selectedMovieIds = this.getSelectedIds();
|
const selectedMovieIds = this.getSelectedIds();
|
||||||
|
|
||||||
const ViewComponent = getViewComponent(view);
|
const ViewComponent = getViewComponent(view);
|
||||||
const isLoaded = !!(!error && isPopulated && items.length && scroller);
|
const isLoaded = !!(!error && isPopulated && items.length && this.scrollerRef.current);
|
||||||
const hasNoCollection = !totalItems;
|
const hasNoCollection = !totalItems;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -306,10 +302,9 @@ class Collection extends Component {
|
|||||||
|
|
||||||
<div className={styles.pageContentBodyWrapper}>
|
<div className={styles.pageContentBodyWrapper}>
|
||||||
<PageContentBody
|
<PageContentBody
|
||||||
registerScroller={this.setScrollerRef}
|
ref={this.scrollerRef}
|
||||||
className={styles.contentBody}
|
className={styles.contentBody}
|
||||||
innerClassName={styles[`${view}InnerContentBody`]}
|
innerClassName={styles[`${view}InnerContentBody`]}
|
||||||
onScroll={onScroll}
|
|
||||||
>
|
>
|
||||||
{
|
{
|
||||||
isFetching && !isPopulated &&
|
isFetching && !isPopulated &&
|
||||||
@@ -327,7 +322,7 @@ class Collection extends Component {
|
|||||||
isLoaded &&
|
isLoaded &&
|
||||||
<div className={styles.contentBodyContainer}>
|
<div className={styles.contentBodyContainer}>
|
||||||
<ViewComponent
|
<ViewComponent
|
||||||
scroller={scroller}
|
scroller={this.scrollerRef.current}
|
||||||
items={items}
|
items={items}
|
||||||
filters={filters}
|
filters={filters}
|
||||||
sortKey={sortKey}
|
sortKey={sortKey}
|
||||||
|
|||||||
13
frontend/src/Collection/CollectionFooter.css.d.ts
vendored
Normal file
13
frontend/src/Collection/CollectionFooter.css.d.ts
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'addSelectedButton': string;
|
||||||
|
'buttonContainer': string;
|
||||||
|
'buttonContainerContent': string;
|
||||||
|
'buttons': string;
|
||||||
|
'excludeSelectedButton': string;
|
||||||
|
'inputContainer': string;
|
||||||
|
'selectedMovieLabel': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
8
frontend/src/Collection/CollectionFooterLabel.css.d.ts
vendored
Normal file
8
frontend/src/Collection/CollectionFooterLabel.css.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'label': string;
|
||||||
|
'savingIcon': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
10
frontend/src/Collection/Edit/EditCollectionModalContent.css.d.ts
vendored
Normal file
10
frontend/src/Collection/Edit/EditCollectionModalContent.css.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'container': string;
|
||||||
|
'info': string;
|
||||||
|
'overview': string;
|
||||||
|
'poster': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
8
frontend/src/Collection/NoCollection.css.d.ts
vendored
Normal file
8
frontend/src/Collection/NoCollection.css.d.ts
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'buttonContainer': string;
|
||||||
|
'message': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
19
frontend/src/Collection/Overview/CollectionMovie.css.d.ts
vendored
Normal file
19
frontend/src/Collection/Overview/CollectionMovie.css.d.ts
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'action': string;
|
||||||
|
'container': string;
|
||||||
|
'content': string;
|
||||||
|
'controls': string;
|
||||||
|
'editorSelect': string;
|
||||||
|
'externalLinks': string;
|
||||||
|
'link': string;
|
||||||
|
'monitorToggleButton': string;
|
||||||
|
'overlay': string;
|
||||||
|
'overlayTitle': string;
|
||||||
|
'poster': string;
|
||||||
|
'posterContainer': string;
|
||||||
|
'title': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
@@ -134,7 +134,7 @@ class CollectionMovie extends Component {
|
|||||||
hasFile={hasFile}
|
hasFile={hasFile}
|
||||||
status={status}
|
status={status}
|
||||||
bottomRadius={true}
|
bottomRadius={true}
|
||||||
posterWidth={posterWidth}
|
width={posterWidth}
|
||||||
detailedProgressBar={detailedProgressBar}
|
detailedProgressBar={detailedProgressBar}
|
||||||
isAvailable={isAvailable}
|
isAvailable={isAvailable}
|
||||||
/>
|
/>
|
||||||
|
|||||||
16
frontend/src/Collection/Overview/CollectionMovieLabel.css.d.ts
vendored
Normal file
16
frontend/src/Collection/Overview/CollectionMovieLabel.css.d.ts
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'danger': string;
|
||||||
|
'info': string;
|
||||||
|
'movie': string;
|
||||||
|
'movieStatus': string;
|
||||||
|
'movieTitle': string;
|
||||||
|
'primary': string;
|
||||||
|
'purple': string;
|
||||||
|
'queue': string;
|
||||||
|
'success': string;
|
||||||
|
'warning': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
28
frontend/src/Collection/Overview/CollectionOverview.css.d.ts
vendored
Normal file
28
frontend/src/Collection/Overview/CollectionOverview.css.d.ts
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'actions': string;
|
||||||
|
'content': string;
|
||||||
|
'defaults': string;
|
||||||
|
'details': string;
|
||||||
|
'detailsLabel': string;
|
||||||
|
'editorSelect': string;
|
||||||
|
'genres': string;
|
||||||
|
'info': string;
|
||||||
|
'labelsContainer': string;
|
||||||
|
'monitorToggleButton': string;
|
||||||
|
'movie': string;
|
||||||
|
'moviesContainer': string;
|
||||||
|
'navigationButtons': string;
|
||||||
|
'overview': string;
|
||||||
|
'path': string;
|
||||||
|
'qualityProfileName': string;
|
||||||
|
'sliderContainer': string;
|
||||||
|
'status': string;
|
||||||
|
'title': string;
|
||||||
|
'titleContainer': string;
|
||||||
|
'titleRow': string;
|
||||||
|
'toggleMonitoredContainer': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
10
frontend/src/Collection/Overview/CollectionOverviews.css.d.ts
vendored
Normal file
10
frontend/src/Collection/Overview/CollectionOverviews.css.d.ts
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'container': string;
|
||||||
|
'content': string;
|
||||||
|
'externalLinks': string;
|
||||||
|
'grid': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
37
frontend/src/Commands/Command.ts
Normal file
37
frontend/src/Commands/Command.ts
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
import ModelBase from 'App/ModelBase';
|
||||||
|
|
||||||
|
export interface CommandBody {
|
||||||
|
sendUpdatesToClient: boolean;
|
||||||
|
updateScheduledTask: boolean;
|
||||||
|
completionMessage: string;
|
||||||
|
requiresDiskAccess: boolean;
|
||||||
|
isExclusive: boolean;
|
||||||
|
isLongRunning: boolean;
|
||||||
|
name: string;
|
||||||
|
lastExecutionTime: string;
|
||||||
|
lastStartTime: string;
|
||||||
|
trigger: string;
|
||||||
|
suppressMessages: boolean;
|
||||||
|
movieId?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Command extends ModelBase {
|
||||||
|
name: string;
|
||||||
|
commandName: string;
|
||||||
|
message: string;
|
||||||
|
body: CommandBody;
|
||||||
|
priority: string;
|
||||||
|
status: string;
|
||||||
|
result: string;
|
||||||
|
queued: string;
|
||||||
|
started: string;
|
||||||
|
ended: string;
|
||||||
|
duration: string;
|
||||||
|
trigger: string;
|
||||||
|
stateChangeTime: string;
|
||||||
|
sendUpdatesToClient: boolean;
|
||||||
|
updateScheduledTask: boolean;
|
||||||
|
lastExecutionTime: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Command;
|
||||||
11
frontend/src/Components/Alert.css.d.ts
vendored
Normal file
11
frontend/src/Components/Alert.css.d.ts
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
// This file is automatically generated.
|
||||||
|
// Please do not change this file!
|
||||||
|
interface CssExports {
|
||||||
|
'alert': string;
|
||||||
|
'danger': string;
|
||||||
|
'info': string;
|
||||||
|
'success': string;
|
||||||
|
'warning': string;
|
||||||
|
}
|
||||||
|
export const cssExports: CssExports;
|
||||||
|
export default cssExports;
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user