mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 01:54:15 +00:00
Compare commits
454 Commits
dspace-9.0
...
dependabot
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c82f17dcb7 | ||
![]() |
27a1bfc6b1 | ||
![]() |
2b0cc82b12 | ||
![]() |
eef6d953e3 | ||
![]() |
0bcef2afa1 | ||
![]() |
a46e378ab6 | ||
![]() |
053d8e29b1 | ||
![]() |
e3ccaa3ee0 | ||
![]() |
951c5f69d4 | ||
![]() |
dba2d7a1e2 | ||
![]() |
3a9eb87914 | ||
![]() |
80865efc2b | ||
![]() |
c7f2248e89 | ||
![]() |
5e4e9841d7 | ||
![]() |
7de87330d8 | ||
![]() |
8314661691 | ||
![]() |
26cf965560 | ||
![]() |
c33bdaaad2 | ||
![]() |
dc57a59e01 | ||
![]() |
dc9137b998 | ||
![]() |
64e9f86741 | ||
![]() |
280b7660f2 | ||
![]() |
11ca474634 | ||
![]() |
1193413ac2 | ||
![]() |
b78b7c953e | ||
![]() |
15d9cb0ea8 | ||
![]() |
a26c718db4 | ||
![]() |
93d43bcbd7 | ||
![]() |
26c0b5b842 | ||
![]() |
5562ee1780 | ||
![]() |
4e059862d0 | ||
![]() |
e41c1d088d | ||
![]() |
a96ba40f48 | ||
![]() |
f07f0481fd | ||
![]() |
9eadcea48a | ||
![]() |
265c08eaec | ||
![]() |
38b55006f5 | ||
![]() |
bf24baf630 | ||
![]() |
31a31b247d | ||
![]() |
c48c4ad6c7 | ||
![]() |
7c8486af57 | ||
![]() |
98fc76d867 | ||
![]() |
f313b4a8fd | ||
![]() |
20cef9ceff | ||
![]() |
287347b764 | ||
![]() |
0bdb8ec7f2 | ||
![]() |
d9d43ef9c1 | ||
![]() |
e6f9e8ca4b | ||
![]() |
f58ba039a2 | ||
![]() |
59e477aa79 | ||
![]() |
1761500330 | ||
![]() |
4d803a58d4 | ||
![]() |
e4dfcda009 | ||
![]() |
643836addc | ||
![]() |
3333ee4fbb | ||
![]() |
5aab53e064 | ||
![]() |
d9e8fea5bf | ||
![]() |
b5fe301209 | ||
![]() |
a877cbe284 | ||
![]() |
6c09677510 | ||
![]() |
f622d58917 | ||
![]() |
4d7051007b | ||
![]() |
2d31afb92f | ||
![]() |
af71c152c1 | ||
![]() |
77731af50d | ||
![]() |
22baef689a | ||
![]() |
14de56279f | ||
![]() |
b6bf862542 | ||
![]() |
67a17e4ea1 | ||
![]() |
b0d5430a4c | ||
![]() |
18aafea9bc | ||
![]() |
46e291d767 | ||
![]() |
24ca6442f6 | ||
![]() |
41282f064c | ||
![]() |
eaf11d5ffe | ||
![]() |
4fa0c57e02 | ||
![]() |
c0ba94836f | ||
![]() |
4f8724bb3e | ||
![]() |
85066ac595 | ||
![]() |
fa58bc5da7 | ||
![]() |
9f8fd506f0 | ||
![]() |
5015e68901 | ||
![]() |
45f7ea8f03 | ||
![]() |
a1fb28a03f | ||
![]() |
c1bd789180 | ||
![]() |
2ee68323d5 | ||
![]() |
3fc4cedb44 | ||
![]() |
69655a5217 | ||
![]() |
7fafa8602c | ||
![]() |
eddbe0eea5 | ||
![]() |
a85f5c5d5c | ||
![]() |
c20de9eddf | ||
![]() |
4cfbe00dd1 | ||
![]() |
9bae9e2659 | ||
![]() |
813f9ba23f | ||
![]() |
9555630ae0 | ||
![]() |
4cd8544a43 | ||
![]() |
460cef44c1 | ||
![]() |
5c0580201f | ||
![]() |
1e4ee4fb0b | ||
![]() |
38b641e577 | ||
![]() |
45953931d9 | ||
![]() |
0435802002 | ||
![]() |
b751b103b1 | ||
![]() |
11fdc4ab39 | ||
![]() |
44fcc7221b | ||
![]() |
841a46c9a9 | ||
![]() |
6967b84ddb | ||
![]() |
9497decf07 | ||
![]() |
d4edbf2e25 | ||
![]() |
8c4e8f38bc | ||
![]() |
f80992f1fc | ||
![]() |
4179519953 | ||
![]() |
bb3af14b6c | ||
![]() |
dc6b317425 | ||
![]() |
3a5f4565a5 | ||
![]() |
fc43e2473d | ||
![]() |
ae15b2fa73 | ||
![]() |
003a5f5ee8 | ||
![]() |
16da9855fc | ||
![]() |
821f16ea1d | ||
![]() |
a1aaf906ca | ||
![]() |
6f6cdc545f | ||
![]() |
f9fb6d06f1 | ||
![]() |
4fa71b801c | ||
![]() |
acf4a25eb2 | ||
![]() |
9c37858cfe | ||
![]() |
3e6b8c0529 | ||
![]() |
c7c1c0fc17 | ||
![]() |
7a7e468492 | ||
![]() |
34fc08766d | ||
![]() |
5b808ff432 | ||
![]() |
a078807fc0 | ||
![]() |
13d6acaf76 | ||
![]() |
addd1b04b1 | ||
![]() |
032381008e | ||
![]() |
69c33d7bca | ||
![]() |
d9c0401bdd | ||
![]() |
5a2702c797 | ||
![]() |
cfd6780b3d | ||
![]() |
f85042e0d6 | ||
![]() |
a048e98f03 | ||
![]() |
2b9aea3798 | ||
![]() |
c51fc63fbc | ||
![]() |
57bed93f16 | ||
![]() |
a59dc5adb0 | ||
![]() |
e3b5405698 | ||
![]() |
1085c9812f | ||
![]() |
b4d694e0c0 | ||
![]() |
cf34198d54 | ||
![]() |
321a05dbef | ||
![]() |
dabc3b400b | ||
![]() |
5b19ebe48c | ||
![]() |
32511b0f50 | ||
![]() |
17e58ae5e3 | ||
![]() |
0d87a72f41 | ||
![]() |
a17d58acc5 | ||
![]() |
277154b4ed | ||
![]() |
d17f0a2a3d | ||
![]() |
9c6bb828e8 | ||
![]() |
44f2ad7f4f | ||
![]() |
c7f8ed1f42 | ||
![]() |
0b14bbcc0c | ||
![]() |
c6ef2467bc | ||
![]() |
9f09c33a83 | ||
![]() |
d5103bb16a | ||
![]() |
1a80e2ea87 | ||
![]() |
c07bc3c379 | ||
![]() |
b44f74a20a | ||
![]() |
50757247ab | ||
![]() |
1883d93198 | ||
![]() |
d9ab4bca65 | ||
![]() |
9b72b1c36e | ||
![]() |
edeb2d2e3a | ||
![]() |
f807f5ae77 | ||
![]() |
c2257ebc81 | ||
![]() |
cf2407ba90 | ||
![]() |
45934e31f2 | ||
![]() |
e0af01ff43 | ||
![]() |
b201661ce1 | ||
![]() |
7afe49d2b0 | ||
![]() |
c89ad9f22a | ||
![]() |
391e87a11f | ||
![]() |
b6ee8dff9f | ||
![]() |
a864260d00 | ||
![]() |
417f835b56 | ||
![]() |
fdb747537e | ||
![]() |
abfdf63482 | ||
![]() |
ed2095a275 | ||
![]() |
7beac7d568 | ||
![]() |
54f8dddc8c | ||
![]() |
44e248d1df | ||
![]() |
03d7c5284e | ||
![]() |
7f3b3370d9 | ||
![]() |
d56119793f | ||
![]() |
aecfabbf93 | ||
![]() |
20510591e4 | ||
![]() |
55d2f0ce38 | ||
![]() |
137bbc35bd | ||
![]() |
57bf254bec | ||
![]() |
d72a02137a | ||
![]() |
7677f2941d | ||
![]() |
db81d5ec42 | ||
![]() |
7ef44c5e35 | ||
![]() |
7c27392cda | ||
![]() |
6c3bbf617c | ||
![]() |
a77f98e29e | ||
![]() |
c147354ee1 | ||
![]() |
343718d07b | ||
![]() |
5c66bb9d2b | ||
![]() |
37bd0fd904 | ||
![]() |
d9a9f0d837 | ||
![]() |
7cc17a5544 | ||
![]() |
b7b1e368d6 | ||
![]() |
00fc2a21f7 | ||
![]() |
d218e22944 | ||
![]() |
e2159709f5 | ||
![]() |
5e8dd3480f | ||
![]() |
469c715751 | ||
![]() |
f2131ec757 | ||
![]() |
c52c7e778a | ||
![]() |
bc3d8399dd | ||
![]() |
b870c54c83 | ||
![]() |
c838b4298c | ||
![]() |
0ec98a576a | ||
![]() |
f58ab77d5d | ||
![]() |
3d16975020 | ||
![]() |
406b46ba3f | ||
![]() |
aa9c8bab1d | ||
![]() |
b6448a7caf | ||
![]() |
df6f52f85c | ||
![]() |
8a1daa5cf9 | ||
![]() |
fa9ddefb59 | ||
![]() |
22c7662506 | ||
![]() |
8a1ca84d91 | ||
![]() |
366d0e1aad | ||
![]() |
06e30050a4 | ||
![]() |
ce2b52ba43 | ||
![]() |
ffda0d6521 | ||
![]() |
a2c53c6b8a | ||
![]() |
a692a6762d | ||
![]() |
2687ded0df | ||
![]() |
e387be1e10 | ||
![]() |
a9c50c19e3 | ||
![]() |
cea455e316 | ||
![]() |
b0e56c4129 | ||
![]() |
9a11618d11 | ||
![]() |
5b47170b6d | ||
![]() |
7d1cf1d01c | ||
![]() |
c9aef54eeb | ||
![]() |
983551aea8 | ||
![]() |
51d1a558fa | ||
![]() |
9d48aab127 | ||
![]() |
1727acab33 | ||
![]() |
e24fd0eea0 | ||
![]() |
ee95cbfaef | ||
![]() |
bf585e77c3 | ||
![]() |
a226502c72 | ||
![]() |
4f79574a76 | ||
![]() |
3fb1e77001 | ||
![]() |
cb0ac0c9e5 | ||
![]() |
d3876c7c0a | ||
![]() |
36ca66c09a | ||
![]() |
5530ba9a0d | ||
![]() |
db119e4118 | ||
![]() |
0c9f8c02f6 | ||
![]() |
5ac8dc13ac | ||
![]() |
ce34bd271d | ||
![]() |
81152ef506 | ||
![]() |
e42d4228ed | ||
![]() |
4f7dfbe5ff | ||
![]() |
c15831191f | ||
![]() |
0a2db167ff | ||
![]() |
38812a3e04 | ||
![]() |
d87b83f9e9 | ||
![]() |
e28f24ff15 | ||
![]() |
43e6b3b54a | ||
![]() |
1af8be2bdb | ||
![]() |
8a10866dce | ||
![]() |
27a1dfff6d | ||
![]() |
c2b7e7b0b8 | ||
![]() |
1aaa20ec73 | ||
![]() |
e7709b8091 | ||
![]() |
b1a2008873 | ||
![]() |
dade46ca79 | ||
![]() |
6971ac98c2 | ||
![]() |
280866a58f | ||
![]() |
c8b375d238 | ||
![]() |
37383acb6b | ||
![]() |
277eca837e | ||
![]() |
160f33f98a | ||
![]() |
2dd870ea7e | ||
![]() |
ca92b4cf0e | ||
![]() |
46b58c369e | ||
![]() |
a0ebf4af63 | ||
![]() |
c58b398e43 | ||
![]() |
492023ce22 | ||
![]() |
df2d18b5f1 | ||
![]() |
1e8c55faf4 | ||
![]() |
9273c83179 | ||
![]() |
e06caab25c | ||
![]() |
a21db5b887 | ||
![]() |
cae435a5c7 | ||
![]() |
974e3bf3f3 | ||
![]() |
f0ce4b2170 | ||
![]() |
206df7781e | ||
![]() |
2301a8fd52 | ||
![]() |
f9aa721ec8 | ||
![]() |
d47baab3a1 | ||
![]() |
c0e71a0e68 | ||
![]() |
21ac024423 | ||
![]() |
ce0f6153b9 | ||
![]() |
cafcee110e | ||
![]() |
a8fcad7b6a | ||
![]() |
5c446d18f7 | ||
![]() |
cd0aa134f8 | ||
![]() |
9aed649160 | ||
![]() |
fbbf16f387 | ||
![]() |
283b345cdc | ||
![]() |
aaa4b910e2 | ||
![]() |
926abe6241 | ||
![]() |
97fd42a2e1 | ||
![]() |
3cff971297 | ||
![]() |
49b27b5bc0 | ||
![]() |
f9f3d186c5 | ||
![]() |
05e1fc3505 | ||
![]() |
3635bf40fe | ||
![]() |
70d1e499c1 | ||
![]() |
e40a44c5ac | ||
![]() |
498fad9e76 | ||
![]() |
a1d391576e | ||
![]() |
d985bfa091 | ||
![]() |
bcbbaabc76 | ||
![]() |
a2dd3d185d | ||
![]() |
4eb827c089 | ||
![]() |
43db1731ec | ||
![]() |
e2b72201b2 | ||
![]() |
34248186e8 | ||
![]() |
9dca838f25 | ||
![]() |
ae23e68d12 | ||
![]() |
501ccfea1b | ||
![]() |
02be3e0ad5 | ||
![]() |
d34dafd838 | ||
![]() |
85610d4eb6 | ||
![]() |
da12147043 | ||
![]() |
15a8008869 | ||
![]() |
e35adee7f8 | ||
![]() |
ee3154c069 | ||
![]() |
b491ed3c27 | ||
![]() |
b184db7a99 | ||
![]() |
eac787f1f4 | ||
![]() |
8dbdb27c67 | ||
![]() |
02f30ab331 | ||
![]() |
523c13ff3d | ||
![]() |
1ddd248d0e | ||
![]() |
7b25b1d63c | ||
![]() |
d43730a542 | ||
![]() |
1c1b129068 | ||
![]() |
ae563442e7 | ||
![]() |
08d56407ff | ||
![]() |
8bc2c8768f | ||
![]() |
9a0e4ec107 | ||
![]() |
3a04ea8f79 | ||
![]() |
c272e51aeb | ||
![]() |
c6a1401f34 | ||
![]() |
19c680ebf0 | ||
![]() |
9a025f6610 | ||
![]() |
ac940c1bb2 | ||
![]() |
1c4f650ef9 | ||
![]() |
6ef781822d | ||
![]() |
0115edaa07 | ||
![]() |
faebbbe680 | ||
![]() |
0ff0b5298a | ||
![]() |
87bb0d4e5a | ||
![]() |
eee9897312 | ||
![]() |
fdc23a3350 | ||
![]() |
c4104be75b | ||
![]() |
08a707477c | ||
![]() |
d4efd6a8ef | ||
![]() |
04516fad5a | ||
![]() |
28eb709ef5 | ||
![]() |
cc202b7adb | ||
![]() |
f5df726a18 | ||
![]() |
077467efa2 | ||
![]() |
dc3e842747 | ||
![]() |
828648aa7e | ||
![]() |
7063c49072 | ||
![]() |
036fd1c871 | ||
![]() |
22db6745b8 | ||
![]() |
4f42c1e95f | ||
![]() |
b37a7a1456 | ||
![]() |
33146603df | ||
![]() |
d3a97d9d15 | ||
![]() |
2a1c762e73 | ||
![]() |
c94279edc0 | ||
![]() |
878b2dba4a | ||
![]() |
2eca99379f | ||
![]() |
8a4405c473 | ||
![]() |
0d2e49b12c | ||
![]() |
edd5496a4d | ||
![]() |
01becae7d0 | ||
![]() |
eef6bbe134 | ||
![]() |
ff5f23017a | ||
![]() |
7dd6ab79ff | ||
![]() |
ecc03343b7 | ||
![]() |
2eb09b3ada | ||
![]() |
fa6b8cc21d | ||
![]() |
4510d18a7d | ||
![]() |
6c11621d91 | ||
![]() |
99d72b9348 | ||
![]() |
d65ff20777 | ||
![]() |
c2528a9c1f | ||
![]() |
c72af8edb5 | ||
![]() |
3ad99804d1 | ||
![]() |
99840ba3bc | ||
![]() |
204556de20 | ||
![]() |
8d7b4cd101 | ||
![]() |
ac5c5c8a14 | ||
![]() |
008fe0151b | ||
![]() |
f8bcce43b5 | ||
![]() |
e75052bbcf | ||
![]() |
3340192382 | ||
![]() |
e9fa2812a0 | ||
![]() |
885c52ed34 | ||
![]() |
9b0669f76c | ||
![]() |
3daa110116 | ||
![]() |
d9c6856d9c | ||
![]() |
3372110839 | ||
![]() |
ddd7c323ab | ||
![]() |
6446a52e46 | ||
![]() |
e58a66f849 | ||
![]() |
1167f8a414 | ||
![]() |
eee851f001 | ||
![]() |
b18ff86894 | ||
![]() |
e811083339 | ||
![]() |
e0590109c1 | ||
![]() |
ed1aa37100 | ||
![]() |
601850cb6a | ||
![]() |
ebe26a7eb0 | ||
![]() |
45cc177cab | ||
![]() |
59b39f12d6 | ||
![]() |
868b021118 | ||
![]() |
d4b0cf21d3 | ||
![]() |
d9614b9a1b | ||
![]() |
5df74718b3 | ||
![]() |
18819b76a8 | ||
![]() |
4ffde928d4 | ||
![]() |
9406f7b085 | ||
![]() |
cee9d0422b | ||
![]() |
442b4ea284 | ||
![]() |
3c92acb770 | ||
![]() |
4ca1edfc63 | ||
![]() |
f12fae3865 | ||
![]() |
027a5ec5f0 |
@@ -253,6 +253,10 @@
|
|||||||
"forceSingleLine": true
|
"forceSingleLine": true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"import/enforce-node-protocol-usage": [
|
||||||
|
"error",
|
||||||
|
"always"
|
||||||
|
],
|
||||||
|
|
||||||
"unused-imports/no-unused-imports": "error",
|
"unused-imports/no-unused-imports": "error",
|
||||||
"lodash/import-scope": [
|
"lodash/import-scope": [
|
||||||
|
160
.github/dependabot.yml
vendored
160
.github/dependabot.yml
vendored
@@ -11,8 +11,10 @@ updates:
|
|||||||
# So, only this first section can include "applies-to: security-updates"
|
# So, only this first section can include "applies-to: security-updates"
|
||||||
- package-ecosystem: "npm"
|
- package-ecosystem: "npm"
|
||||||
directory: "/"
|
directory: "/"
|
||||||
|
# Monthly dependency updates (NOTE: "schedule" doesn't apply to security updates)
|
||||||
schedule:
|
schedule:
|
||||||
interval: "weekly"
|
interval: "monthly"
|
||||||
|
time: "05:00"
|
||||||
# Allow up to 10 open PRs for dependencies
|
# Allow up to 10 open PRs for dependencies
|
||||||
open-pull-requests-limit: 10
|
open-pull-requests-limit: 10
|
||||||
# Group together Angular package upgrades
|
# Group together Angular package upgrades
|
||||||
@@ -22,14 +24,7 @@ updates:
|
|||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
patterns:
|
patterns:
|
||||||
- "@angular*"
|
- "@angular*"
|
||||||
update-types:
|
- "@ngtools/webpack"
|
||||||
- "minor"
|
|
||||||
- "patch"
|
|
||||||
# Group together all security updates for Angular. Only accept minor/patch types.
|
|
||||||
angular-security:
|
|
||||||
applies-to: security-updates
|
|
||||||
patterns:
|
|
||||||
- "@angular*"
|
|
||||||
update-types:
|
update-types:
|
||||||
- "minor"
|
- "minor"
|
||||||
- "patch"
|
- "patch"
|
||||||
@@ -41,14 +36,6 @@ updates:
|
|||||||
update-types:
|
update-types:
|
||||||
- "minor"
|
- "minor"
|
||||||
- "patch"
|
- "patch"
|
||||||
# Group together all security updates for NgRx. Only accept minor/patch types.
|
|
||||||
ngrx-security:
|
|
||||||
applies-to: security-updates
|
|
||||||
patterns:
|
|
||||||
- "@ngrx*"
|
|
||||||
update-types:
|
|
||||||
- "minor"
|
|
||||||
- "patch"
|
|
||||||
# Group together all patch version updates for eslint in a single PR
|
# Group together all patch version updates for eslint in a single PR
|
||||||
eslint:
|
eslint:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
@@ -58,15 +45,6 @@ updates:
|
|||||||
update-types:
|
update-types:
|
||||||
- "minor"
|
- "minor"
|
||||||
- "patch"
|
- "patch"
|
||||||
# Group together all security updates for eslint.
|
|
||||||
eslint-security:
|
|
||||||
applies-to: security-updates
|
|
||||||
patterns:
|
|
||||||
- "@typescript-eslint*"
|
|
||||||
- "eslint*"
|
|
||||||
update-types:
|
|
||||||
- "minor"
|
|
||||||
- "patch"
|
|
||||||
# Group together any testing related version updates
|
# Group together any testing related version updates
|
||||||
testing:
|
testing:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
@@ -80,9 +58,83 @@ updates:
|
|||||||
update-types:
|
update-types:
|
||||||
- "minor"
|
- "minor"
|
||||||
- "patch"
|
- "patch"
|
||||||
# Group together any testing related security updates
|
# Group together any postcss related version updates
|
||||||
testing-security:
|
postcss:
|
||||||
applies-to: security-updates
|
applies-to: version-updates
|
||||||
|
patterns:
|
||||||
|
- "postcss*"
|
||||||
|
update-types:
|
||||||
|
- "minor"
|
||||||
|
- "patch"
|
||||||
|
# Group together any sass related version updates
|
||||||
|
sass:
|
||||||
|
applies-to: version-updates
|
||||||
|
patterns:
|
||||||
|
- "sass*"
|
||||||
|
update-types:
|
||||||
|
- "minor"
|
||||||
|
- "patch"
|
||||||
|
# Group together any webpack related version updates
|
||||||
|
webpack:
|
||||||
|
applies-to: version-updates
|
||||||
|
patterns:
|
||||||
|
- "webpack*"
|
||||||
|
update-types:
|
||||||
|
- "minor"
|
||||||
|
- "patch"
|
||||||
|
ignore:
|
||||||
|
# Restrict zone.js updates to patch level to avoid dependency conflicts with @angular/core
|
||||||
|
- dependency-name: "zone.js"
|
||||||
|
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
||||||
|
# Restrict typescript updates to patch level because that's what our package.json says
|
||||||
|
- dependency-name: "typescript"
|
||||||
|
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
||||||
|
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
|
||||||
|
- dependency-name: "*"
|
||||||
|
update-types: ["version-update:semver-major"]
|
||||||
|
#####################
|
||||||
|
## dspace-9_x branch
|
||||||
|
#####################
|
||||||
|
- package-ecosystem: "npm"
|
||||||
|
directory: "/"
|
||||||
|
target-branch: dspace-9_x
|
||||||
|
schedule:
|
||||||
|
interval: "monthly"
|
||||||
|
time: "05:00"
|
||||||
|
# Allow up to 10 open PRs for dependencies
|
||||||
|
open-pull-requests-limit: 10
|
||||||
|
# Group together Angular package upgrades
|
||||||
|
groups:
|
||||||
|
# Group together all patch version updates for Angular in a single PR
|
||||||
|
angular:
|
||||||
|
applies-to: version-updates
|
||||||
|
patterns:
|
||||||
|
- "@angular*"
|
||||||
|
- "@ngtools/webpack"
|
||||||
|
update-types:
|
||||||
|
- "minor"
|
||||||
|
- "patch"
|
||||||
|
# Group together all minor/patch version updates for NgRx in a single PR
|
||||||
|
ngrx:
|
||||||
|
applies-to: version-updates
|
||||||
|
patterns:
|
||||||
|
- "@ngrx*"
|
||||||
|
- "@ngtools/webpack"
|
||||||
|
update-types:
|
||||||
|
- "minor"
|
||||||
|
- "patch"
|
||||||
|
# Group together all patch version updates for eslint in a single PR
|
||||||
|
eslint:
|
||||||
|
applies-to: version-updates
|
||||||
|
patterns:
|
||||||
|
- "@typescript-eslint*"
|
||||||
|
- "eslint*"
|
||||||
|
update-types:
|
||||||
|
- "minor"
|
||||||
|
- "patch"
|
||||||
|
# Group together any testing related version updates
|
||||||
|
testing:
|
||||||
|
applies-to: version-updates
|
||||||
patterns:
|
patterns:
|
||||||
- "@cypress*"
|
- "@cypress*"
|
||||||
- "axe-*"
|
- "axe-*"
|
||||||
@@ -101,14 +153,6 @@ updates:
|
|||||||
update-types:
|
update-types:
|
||||||
- "minor"
|
- "minor"
|
||||||
- "patch"
|
- "patch"
|
||||||
# Group together any postcss related security updates
|
|
||||||
postcss-security:
|
|
||||||
applies-to: security-updates
|
|
||||||
patterns:
|
|
||||||
- "postcss*"
|
|
||||||
update-types:
|
|
||||||
- "minor"
|
|
||||||
- "patch"
|
|
||||||
# Group together any sass related version updates
|
# Group together any sass related version updates
|
||||||
sass:
|
sass:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
@@ -117,14 +161,6 @@ updates:
|
|||||||
update-types:
|
update-types:
|
||||||
- "minor"
|
- "minor"
|
||||||
- "patch"
|
- "patch"
|
||||||
# Group together any sass related security updates
|
|
||||||
sass-security:
|
|
||||||
applies-to: security-updates
|
|
||||||
patterns:
|
|
||||||
- "sass*"
|
|
||||||
update-types:
|
|
||||||
- "minor"
|
|
||||||
- "patch"
|
|
||||||
# Group together any webpack related version updates
|
# Group together any webpack related version updates
|
||||||
webpack:
|
webpack:
|
||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
@@ -133,15 +169,13 @@ updates:
|
|||||||
update-types:
|
update-types:
|
||||||
- "minor"
|
- "minor"
|
||||||
- "patch"
|
- "patch"
|
||||||
# Group together any webpack related seurity updates
|
|
||||||
webpack-security:
|
|
||||||
applies-to: security-updates
|
|
||||||
patterns:
|
|
||||||
- "webpack*"
|
|
||||||
update-types:
|
|
||||||
- "minor"
|
|
||||||
- "patch"
|
|
||||||
ignore:
|
ignore:
|
||||||
|
# Restrict zone.js updates to patch level to avoid dependency conflicts with @angular/core
|
||||||
|
- dependency-name: "zone.js"
|
||||||
|
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
||||||
|
# Restrict typescript updates to patch level because that's what our package.json says
|
||||||
|
- dependency-name: "typescript"
|
||||||
|
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
||||||
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
|
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
|
||||||
- dependency-name: "*"
|
- dependency-name: "*"
|
||||||
update-types: ["version-update:semver-major"]
|
update-types: ["version-update:semver-major"]
|
||||||
@@ -152,7 +186,8 @@ updates:
|
|||||||
directory: "/"
|
directory: "/"
|
||||||
target-branch: dspace-8_x
|
target-branch: dspace-8_x
|
||||||
schedule:
|
schedule:
|
||||||
interval: "weekly"
|
interval: "monthly"
|
||||||
|
time: "05:00"
|
||||||
# Allow up to 10 open PRs for dependencies
|
# Allow up to 10 open PRs for dependencies
|
||||||
open-pull-requests-limit: 10
|
open-pull-requests-limit: 10
|
||||||
# Group together Angular package upgrades
|
# Group together Angular package upgrades
|
||||||
@@ -162,6 +197,7 @@ updates:
|
|||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
patterns:
|
patterns:
|
||||||
- "@angular*"
|
- "@angular*"
|
||||||
|
- "@ngtools/webpack"
|
||||||
update-types:
|
update-types:
|
||||||
- "minor"
|
- "minor"
|
||||||
- "patch"
|
- "patch"
|
||||||
@@ -220,6 +256,12 @@ updates:
|
|||||||
- "minor"
|
- "minor"
|
||||||
- "patch"
|
- "patch"
|
||||||
ignore:
|
ignore:
|
||||||
|
# Restrict zone.js updates to patch level to avoid dependency conflicts with @angular/core
|
||||||
|
- dependency-name: "zone.js"
|
||||||
|
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
||||||
|
# Restrict typescript updates to patch level because that's what our package.json says
|
||||||
|
- dependency-name: "typescript"
|
||||||
|
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
||||||
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
|
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
|
||||||
- dependency-name: "*"
|
- dependency-name: "*"
|
||||||
update-types: ["version-update:semver-major"]
|
update-types: ["version-update:semver-major"]
|
||||||
@@ -230,7 +272,8 @@ updates:
|
|||||||
directory: "/"
|
directory: "/"
|
||||||
target-branch: dspace-7_x
|
target-branch: dspace-7_x
|
||||||
schedule:
|
schedule:
|
||||||
interval: "weekly"
|
interval: "monthly"
|
||||||
|
time: "05:00"
|
||||||
# Allow up to 10 open PRs for dependencies
|
# Allow up to 10 open PRs for dependencies
|
||||||
open-pull-requests-limit: 10
|
open-pull-requests-limit: 10
|
||||||
# Group together Angular package upgrades
|
# Group together Angular package upgrades
|
||||||
@@ -240,6 +283,7 @@ updates:
|
|||||||
applies-to: version-updates
|
applies-to: version-updates
|
||||||
patterns:
|
patterns:
|
||||||
- "@angular*"
|
- "@angular*"
|
||||||
|
- "@ngtools/webpack"
|
||||||
update-types:
|
update-types:
|
||||||
- "minor"
|
- "minor"
|
||||||
- "patch"
|
- "patch"
|
||||||
@@ -293,6 +337,12 @@ updates:
|
|||||||
# 7.x Cannot update Webpack past v5.76.1 as later versions not supported by Angular 15
|
# 7.x Cannot update Webpack past v5.76.1 as later versions not supported by Angular 15
|
||||||
# See also https://github.com/DSpace/dspace-angular/pull/3283#issuecomment-2372488489
|
# See also https://github.com/DSpace/dspace-angular/pull/3283#issuecomment-2372488489
|
||||||
- dependency-name: "webpack"
|
- dependency-name: "webpack"
|
||||||
|
# Restrict zone.js updates to patch level to avoid dependency conflicts with @angular/core
|
||||||
|
- dependency-name: "zone.js"
|
||||||
|
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
||||||
|
# Restrict typescript updates to patch level because that's what our package.json says
|
||||||
|
- dependency-name: "typescript"
|
||||||
|
update-types: ["version-update:semver-major", "version-update:semver-minor"]
|
||||||
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
|
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
|
||||||
- dependency-name: "*"
|
- dependency-name: "*"
|
||||||
update-types: ["version-update:semver-major"]
|
update-types: ["version-update:semver-major"]
|
||||||
|
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
@@ -25,7 +25,7 @@ However, reviewers may request that you complete any actions in this list if you
|
|||||||
- [ ] My PR **doesn't introduce circular dependencies** (verified via `npm run check-circ-deps`)
|
- [ ] My PR **doesn't introduce circular dependencies** (verified via `npm run check-circ-deps`)
|
||||||
- [ ] My PR **includes [TypeDoc](https://typedoc.org/) comments** for _all new (or modified) public methods and classes_. It also includes TypeDoc for large or complex private methods.
|
- [ ] My PR **includes [TypeDoc](https://typedoc.org/) comments** for _all new (or modified) public methods and classes_. It also includes TypeDoc for large or complex private methods.
|
||||||
- [ ] My PR **passes all specs/tests and includes new/updated specs or tests** based on the [Code Testing Guide](https://wiki.lyrasis.org/display/DSPACE/Code+Testing+Guide).
|
- [ ] My PR **passes all specs/tests and includes new/updated specs or tests** based on the [Code Testing Guide](https://wiki.lyrasis.org/display/DSPACE/Code+Testing+Guide).
|
||||||
- [ ] My PR **aligns with [Accessibility guidelines](https://wiki.lyrasis.org/display/DSDOC8x/Accessibility)** if it makes changes to the user interface.
|
- [ ] My PR **aligns with [Accessibility guidelines](https://wiki.lyrasis.org/display/DSDOC9x/Accessibility)** if it makes changes to the user interface.
|
||||||
- [ ] My PR **uses i18n (internationalization) keys** instead of hardcoded English text, to allow for translations.
|
- [ ] My PR **uses i18n (internationalization) keys** instead of hardcoded English text, to allow for translations.
|
||||||
- [ ] My PR **includes details on how to test it**. I've provided clear instructions to reviewers on how to successfully test this fix or feature.
|
- [ ] My PR **includes details on how to test it**. I've provided clear instructions to reviewers on how to successfully test this fix or feature.
|
||||||
- [ ] If my PR includes new libraries/dependencies (in `package.json`), I've made sure their licenses align with the [DSpace BSD License](https://github.com/DSpace/DSpace/blob/main/LICENSE) based on the [Licensing of Contributions](https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines#CodeContributionGuidelines-LicensingofContributions) documentation.
|
- [ ] If my PR includes new libraries/dependencies (in `package.json`), I've made sure their licenses align with the [DSpace BSD License](https://github.com/DSpace/DSpace/blob/main/LICENSE) based on the [Licensing of Contributions](https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines#CodeContributionGuidelines-LicensingofContributions) documentation.
|
||||||
|
6
.github/workflows/codescan.yml
vendored
6
.github/workflows/codescan.yml
vendored
@@ -40,14 +40,14 @@ jobs:
|
|||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
# https://github.com/github/codeql-action
|
# https://github.com/github/codeql-action
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v2
|
uses: github/codeql-action/init@v3
|
||||||
with:
|
with:
|
||||||
languages: javascript
|
languages: javascript
|
||||||
|
|
||||||
# Autobuild attempts to build any compiled languages
|
# Autobuild attempts to build any compiled languages
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v2
|
uses: github/codeql-action/autobuild@v3
|
||||||
|
|
||||||
# Perform GitHub Code Scanning.
|
# Perform GitHub Code Scanning.
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v3
|
||||||
|
@@ -10,7 +10,7 @@ DSpace is a community built and supported project. We do not have a centralized
|
|||||||
## Contribute new code via a Pull Request
|
## Contribute new code via a Pull Request
|
||||||
|
|
||||||
We accept [GitHub Pull Requests (PRs)](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork) at any time from anyone.
|
We accept [GitHub Pull Requests (PRs)](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork) at any time from anyone.
|
||||||
Contributors to each release are recognized in our [Release Notes](https://wiki.lyrasis.org/display/DSDOC8x/Release+Notes).
|
Contributors to each release are recognized in our [Release Notes](https://wiki.lyrasis.org/display/DSDOC9x/Release+Notes).
|
||||||
|
|
||||||
Code Contribution Checklist
|
Code Contribution Checklist
|
||||||
- [ ] PRs _should_ be smaller in size (ideally less than 1,000 lines of code, not including comments & tests)
|
- [ ] PRs _should_ be smaller in size (ideally less than 1,000 lines of code, not including comments & tests)
|
||||||
@@ -18,7 +18,7 @@ Code Contribution Checklist
|
|||||||
- [ ] PRs **must** not introduce circular dependencies (verified via `yarn check-circ-deps`)
|
- [ ] PRs **must** not introduce circular dependencies (verified via `yarn check-circ-deps`)
|
||||||
- [ ] PRs **must** include [TypeDoc](https://typedoc.org/) comments for _all new (or modified) public methods and classes_. Large or complex private methods should also have TypeDoc.
|
- [ ] PRs **must** include [TypeDoc](https://typedoc.org/) comments for _all new (or modified) public methods and classes_. Large or complex private methods should also have TypeDoc.
|
||||||
- [ ] PRs **must** pass all automated pecs/tests and includes new/updated specs or tests based on the [Code Testing Guide](https://wiki.lyrasis.org/display/DSPACE/Code+Testing+Guide).
|
- [ ] PRs **must** pass all automated pecs/tests and includes new/updated specs or tests based on the [Code Testing Guide](https://wiki.lyrasis.org/display/DSPACE/Code+Testing+Guide).
|
||||||
- [ ] User interface changes **must** align with [Accessibility guidelines](https://wiki.lyrasis.org/display/DSDOC8x/Accessibility)
|
- [ ] User interface changes **must** align with [Accessibility guidelines](https://wiki.lyrasis.org/display/DSDOC9x/Accessibility)
|
||||||
- [ ] PRs **must** use i18n (internationalization) keys instead of hardcoded English text, to allow for translations.
|
- [ ] PRs **must** use i18n (internationalization) keys instead of hardcoded English text, to allow for translations.
|
||||||
- [ ] Details on how to test the PR **must** be provided. Reviewers must be aware of any steps they need to take to successfully test your fix or feature.
|
- [ ] Details on how to test the PR **must** be provided. Reviewers must be aware of any steps they need to take to successfully test your fix or feature.
|
||||||
- [ ] If a PR includes new libraries/dependencies (in `package.json`), then their software licenses **must** align with the [DSpace BSD License](https://github.com/DSpace/dspace-angular/blob/main/LICENSE) based on the [Licensing of Contributions](https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines#CodeContributionGuidelines-LicensingofContributions) documentation.
|
- [ ] If a PR includes new libraries/dependencies (in `package.json`), then their software licenses **must** align with the [DSpace BSD License](https://github.com/DSpace/dspace-angular/blob/main/LICENSE) based on the [Licensing of Contributions](https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines#CodeContributionGuidelines-LicensingofContributions) documentation.
|
||||||
|
10
README.md
10
README.md
@@ -10,7 +10,7 @@ Overview
|
|||||||
|
|
||||||
DSpace open source software is a turnkey repository application used by more than
|
DSpace open source software is a turnkey repository application used by more than
|
||||||
2,000 organizations and institutions worldwide to provide durable access to digital resources.
|
2,000 organizations and institutions worldwide to provide durable access to digital resources.
|
||||||
For more information, visit http://www.dspace.org/
|
For more information, visit https://www.dspace.org/
|
||||||
|
|
||||||
DSpace consists of both a Java-based backend and an Angular-based frontend.
|
DSpace consists of both a Java-based backend and an Angular-based frontend.
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ Downloads
|
|||||||
Documentation for each release may be viewed online or downloaded via our [Documentation Wiki](https://wiki.lyrasis.org/display/DSDOC/).
|
Documentation for each release may be viewed online or downloaded via our [Documentation Wiki](https://wiki.lyrasis.org/display/DSDOC/).
|
||||||
|
|
||||||
The latest DSpace Installation instructions are available at:
|
The latest DSpace Installation instructions are available at:
|
||||||
https://wiki.lyrasis.org/display/DSDOC7x/Installing+DSpace
|
https://wiki.lyrasis.org/display/DSDOC9x/Installing+DSpace
|
||||||
|
|
||||||
Quick start
|
Quick start
|
||||||
-----------
|
-----------
|
||||||
@@ -349,7 +349,7 @@ See our [DSpace Code Testing Guide](https://wiki.lyrasis.org/display/DSPACE/Code
|
|||||||
Documentation
|
Documentation
|
||||||
--------------
|
--------------
|
||||||
|
|
||||||
Official DSpace documentation is available in the DSpace wiki at https://wiki.lyrasis.org/display/DSDOC7x/
|
Official DSpace documentation is available in the DSpace wiki at https://wiki.lyrasis.org/display/DSDOC9x/
|
||||||
|
|
||||||
Some UI specific configuration documentation is also found in the [`./docs`](docs) folder of this codebase.
|
Some UI specific configuration documentation is also found in the [`./docs`](docs) folder of this codebase.
|
||||||
|
|
||||||
@@ -552,7 +552,7 @@ Additional support options are at https://wiki.lyrasis.org/display/DSPACE/Suppor
|
|||||||
|
|
||||||
DSpace also has an active service provider network. If you'd rather hire a service provider to
|
DSpace also has an active service provider network. If you'd rather hire a service provider to
|
||||||
install, upgrade, customize or host DSpace, then we recommend getting in touch with one of our
|
install, upgrade, customize or host DSpace, then we recommend getting in touch with one of our
|
||||||
[Registered Service Providers](http://www.dspace.org/service-providers).
|
[Registered Service Providers](https://dspace.org/registered-service-providers/).
|
||||||
|
|
||||||
|
|
||||||
Issue Tracker
|
Issue Tracker
|
||||||
@@ -565,7 +565,7 @@ DSpace uses GitHub to track issues:
|
|||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
DSpace source code is freely available under a standard [BSD 3-Clause license](https://opensource.org/licenses/BSD-3-Clause).
|
DSpace source code is freely available under a standard [BSD 3-Clause license](https://opensource.org/licenses/BSD-3-Clause).
|
||||||
The full license is available in the [LICENSE](LICENSE) file or online at http://www.dspace.org/license/
|
The full license is available in the [LICENSE](LICENSE) file or online at https://www.dspace.org/license/
|
||||||
|
|
||||||
DSpace uses third-party libraries which may be distributed under different licenses. Those licenses are listed
|
DSpace uses third-party libraries which may be distributed under different licenses. Those licenses are listed
|
||||||
in the [LICENSES_THIRD_PARTY](LICENSES_THIRD_PARTY) file.
|
in the [LICENSES_THIRD_PARTY](LICENSES_THIRD_PARTY) file.
|
||||||
|
@@ -265,6 +265,9 @@ languages:
|
|||||||
- code: es
|
- code: es
|
||||||
label: Español
|
label: Español
|
||||||
active: true
|
active: true
|
||||||
|
- code: fa
|
||||||
|
label: فارسی
|
||||||
|
active: true
|
||||||
- code: fi
|
- code: fi
|
||||||
label: Suomi
|
label: Suomi
|
||||||
active: true
|
active: true
|
||||||
@@ -274,6 +277,9 @@ languages:
|
|||||||
- code: gd
|
- code: gd
|
||||||
label: Gàidhlig
|
label: Gàidhlig
|
||||||
active: true
|
active: true
|
||||||
|
- code: gu
|
||||||
|
label: ગુજરાતી
|
||||||
|
active: true
|
||||||
- code: hi
|
- code: hi
|
||||||
label: हिंदी
|
label: हिंदी
|
||||||
active: true
|
active: true
|
||||||
@@ -289,6 +295,9 @@ languages:
|
|||||||
- code: lv
|
- code: lv
|
||||||
label: Latviešu
|
label: Latviešu
|
||||||
active: true
|
active: true
|
||||||
|
- code: mr
|
||||||
|
label: मराठी
|
||||||
|
active: true
|
||||||
- code: nl
|
- code: nl
|
||||||
label: Nederlands
|
label: Nederlands
|
||||||
active: true
|
active: true
|
||||||
@@ -301,6 +310,9 @@ languages:
|
|||||||
- code: pt-BR
|
- code: pt-BR
|
||||||
label: Português do Brasil
|
label: Português do Brasil
|
||||||
active: true
|
active: true
|
||||||
|
- code: ru
|
||||||
|
label: Русский
|
||||||
|
active: true
|
||||||
- code: sr-lat
|
- code: sr-lat
|
||||||
label: Srpski (lat)
|
label: Srpski (lat)
|
||||||
active: true
|
active: true
|
||||||
|
@@ -1,13 +1,87 @@
|
|||||||
import { testA11y } from 'cypress/support/utils';
|
import { testA11y } from 'cypress/support/utils';
|
||||||
|
|
||||||
describe('Community List Page', () => {
|
describe('Community List Page', () => {
|
||||||
|
function validateHierarchyLevel(currentLevel = 1): void {
|
||||||
|
// Find all <cdk-tree-node> elements with the current aria-level
|
||||||
|
cy.get(`ds-community-list cdk-tree-node.expandable-node[aria-level="${currentLevel}"]`).should('exist').then(($nodes) => {
|
||||||
|
let sublevelExists = false;
|
||||||
|
cy.wrap($nodes).each(($node) => {
|
||||||
|
// Check if the current node has an expand button and click it
|
||||||
|
if ($node.find('[data-test="expand-button"]').length) {
|
||||||
|
sublevelExists = true;
|
||||||
|
cy.wrap($node).find('[data-test="expand-button"]').click();
|
||||||
|
}
|
||||||
|
}).then(() => {
|
||||||
|
// After expanding all buttons, validate if a sublevel exists
|
||||||
|
if (sublevelExists) {
|
||||||
|
const nextLevelSelector = `ds-community-list cdk-tree-node.expandable-node[aria-level="${currentLevel + 1}"]`;
|
||||||
|
cy.get(nextLevelSelector).then(($nextLevel) => {
|
||||||
|
if ($nextLevel.length) {
|
||||||
|
// Recursively validate the next level
|
||||||
|
validateHierarchyLevel(currentLevel + 1);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
it('should pass accessibility tests', () => {
|
beforeEach(() => {
|
||||||
cy.visit('/community-list');
|
cy.visit('/community-list');
|
||||||
|
|
||||||
// <ds-community-list-page> tag must be loaded
|
// <ds-community-list-page> tag must be loaded
|
||||||
cy.get('ds-community-list-page').should('be.visible');
|
cy.get('ds-community-list-page').should('be.visible');
|
||||||
|
|
||||||
|
// <ds-community-list-list> tag must be loaded
|
||||||
|
cy.get('ds-community-list').should('be.visible');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should expand community/collection hierarchy', () => {
|
||||||
|
// Execute Hierarchy levels validation recursively
|
||||||
|
validateHierarchyLevel(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should display community/collections name with item count', () => {
|
||||||
|
// Open every <cdk-tree-node>
|
||||||
|
cy.get('[data-test="expand-button"]').click({ multiple: true });
|
||||||
|
cy.wait(300);
|
||||||
|
|
||||||
|
// A first <cdk-tree-node> must be found and validate that <a> tag (community name) and <span> tag (item count) exists in it
|
||||||
|
cy.get('ds-community-list').find('cdk-tree-node.expandable-node').then(($nodes) => {
|
||||||
|
cy.wrap($nodes).each(($node) => {
|
||||||
|
cy.wrap($node).find('a').should('exist');
|
||||||
|
cy.wrap($node).find('span').should('exist');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should enable "show more" button when 20 top-communities or more are presents', () => {
|
||||||
|
cy.get('ds-community-list').find('cdk-tree-node.expandable-node[aria-level="1"]').then(($nodes) => {
|
||||||
|
//Validate that there are 20 or more top-community elements
|
||||||
|
if ($nodes.length >= 20) {
|
||||||
|
//Validate that "show more" button is visible and then click on it
|
||||||
|
cy.get('[data-test="show-more-button"]').should('be.visible');
|
||||||
|
} else {
|
||||||
|
cy.get('[data-test="show-more-button"]').should('not.exist');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should show 21 or more top-communities if click "show more" button', () => {
|
||||||
|
cy.get('ds-community-list').find('cdk-tree-node.expandable-node[aria-level="1"]').then(($nodes) => {
|
||||||
|
//Validate that there are 20 or more top-community elements
|
||||||
|
if ($nodes.length >= 20) {
|
||||||
|
//Validate that "show more" button is visible and then click on it
|
||||||
|
cy.get('[data-test="show-more-button"]').click();
|
||||||
|
cy.wait(300);
|
||||||
|
cy.get('ds-community-list').find('cdk-tree-node.expandable-node[aria-level="1"]').should('have.length.at.least', 21);
|
||||||
|
} else {
|
||||||
|
cy.get('[data-test="show-more-button"]').should('not.exist');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should pass accessibility tests', () => {
|
||||||
// Open every expand button on page, so that we can scan sub-elements as well
|
// Open every expand button on page, so that we can scan sub-elements as well
|
||||||
cy.get('[data-test="expand-button"]').click({ multiple: true });
|
cy.get('[data-test="expand-button"]').click({ multiple: true });
|
||||||
|
|
||||||
|
@@ -84,7 +84,7 @@ describe('My DSpace page', () => {
|
|||||||
cy.url().should('include', '/mydspace');
|
cy.url().should('include', '/mydspace');
|
||||||
|
|
||||||
// Close any open notifications, to make sure they don't get in the way of next steps
|
// Close any open notifications, to make sure they don't get in the way of next steps
|
||||||
cy.get('[data-dismiss="alert"]').click({ multiple: true });
|
cy.get('[data-bs-dismiss="alert"]').click({ multiple: true });
|
||||||
|
|
||||||
// This is the GET command that will actually run the search
|
// This is the GET command that will actually run the search
|
||||||
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
|
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
|
||||||
|
@@ -95,7 +95,7 @@ describe('New Submission page', () => {
|
|||||||
// A success alert should be visible
|
// A success alert should be visible
|
||||||
cy.get('ds-notification div.alert-success').should('be.visible');
|
cy.get('ds-notification div.alert-success').should('be.visible');
|
||||||
// Now, dismiss any open alert boxes (may be multiple, as tests run quickly)
|
// Now, dismiss any open alert boxes (may be multiple, as tests run quickly)
|
||||||
cy.get('[data-dismiss="alert"]').click({ multiple: true });
|
cy.get('[data-bs-dismiss="alert"]').click({ multiple: true });
|
||||||
|
|
||||||
// This is the GET command that will actually run the search
|
// This is the GET command that will actually run the search
|
||||||
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
|
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
const fs = require('fs');
|
const fs = require('node:fs');
|
||||||
|
|
||||||
// These two global variables are used to store information about the REST API used
|
// These two global variables are used to store information about the REST API used
|
||||||
// by these e2e tests. They are filled out prior to running any tests in the before()
|
// by these e2e tests. They are filled out prior to running any tests in the before()
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
# # Therefore, it should be kept in sync with that file
|
# # Therefore, it should be kept in sync with that file
|
||||||
services:
|
services:
|
||||||
dspacedb:
|
dspacedb:
|
||||||
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-latest}-loadsql"
|
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-loadsql:${DSPACE_VER:-latest}"
|
||||||
environment:
|
environment:
|
||||||
# This LOADSQL should be kept in sync with the URL in DSpace/DSpace
|
# This LOADSQL should be kept in sync with the URL in DSpace/DSpace
|
||||||
# This SQL is available from https://github.com/DSpace-Labs/AIP-Files/releases/tag/demo-entities-data
|
# This SQL is available from https://github.com/DSpace-Labs/AIP-Files/releases/tag/demo-entities-data
|
||||||
|
@@ -60,13 +60,15 @@ services:
|
|||||||
# NOTE: This is customized to use our loadsql image, so that we are using a database with existing test data
|
# NOTE: This is customized to use our loadsql image, so that we are using a database with existing test data
|
||||||
dspacedb:
|
dspacedb:
|
||||||
container_name: dspacedb
|
container_name: dspacedb
|
||||||
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-latest}-loadsql"
|
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-loadsql:${DSPACE_VER:-latest}"
|
||||||
environment:
|
environment:
|
||||||
# This LOADSQL should be kept in sync with the LOADSQL in
|
# This LOADSQL should be kept in sync with the LOADSQL in
|
||||||
# https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/db.entities.yml
|
# https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/db.entities.yml
|
||||||
# This SQL is available from https://github.com/DSpace-Labs/AIP-Files/releases/tag/demo-entities-data
|
# This SQL is available from https://github.com/DSpace-Labs/AIP-Files/releases/tag/demo-entities-data
|
||||||
LOADSQL: https://github.com/DSpace-Labs/AIP-Files/releases/download/demo-entities-data/dspace7-entities-data.sql
|
LOADSQL: https://github.com/DSpace-Labs/AIP-Files/releases/download/demo-entities-data/dspace7-entities-data.sql
|
||||||
PGDATA: /pgdata
|
PGDATA: /pgdata
|
||||||
|
POSTGRES_DB: dspace
|
||||||
|
POSTGRES_USER: dspace
|
||||||
POSTGRES_PASSWORD: dspace
|
POSTGRES_PASSWORD: dspace
|
||||||
networks:
|
networks:
|
||||||
- dspacenet
|
- dspacenet
|
||||||
|
@@ -67,10 +67,12 @@ services:
|
|||||||
# DSpace database container
|
# DSpace database container
|
||||||
dspacedb:
|
dspacedb:
|
||||||
container_name: dspacedb
|
container_name: dspacedb
|
||||||
# Uses a custom Postgres image with pgcrypto installed
|
# Uses the base PostgreSQL image
|
||||||
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-latest}"
|
image: "docker.io/postgres:${POSTGRES_VERSION:-15}"
|
||||||
environment:
|
environment:
|
||||||
PGDATA: /pgdata
|
PGDATA: /pgdata
|
||||||
|
POSTGRES_DB: dspace
|
||||||
|
POSTGRES_USER: dspace
|
||||||
POSTGRES_PASSWORD: dspace
|
POSTGRES_PASSWORD: dspace
|
||||||
networks:
|
networks:
|
||||||
- dspacenet
|
- dspacenet
|
||||||
|
@@ -12,8 +12,8 @@ import {
|
|||||||
readFileSync,
|
readFileSync,
|
||||||
rmSync,
|
rmSync,
|
||||||
writeFileSync,
|
writeFileSync,
|
||||||
} from 'fs';
|
} from 'node:fs';
|
||||||
import { join } from 'path';
|
import { join } from 'node:path';
|
||||||
|
|
||||||
import { default as htmlPlugin } from './src/rules/html';
|
import { default as htmlPlugin } from './src/rules/html';
|
||||||
import { default as tsPlugin } from './src/rules/ts';
|
import { default as tsPlugin } from './src/rules/ts';
|
||||||
|
@@ -6,10 +6,11 @@
|
|||||||
* http://www.dspace.org/license/
|
* http://www.dspace.org/license/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { readFileSync } from 'node:fs';
|
||||||
|
import { basename } from 'node:path';
|
||||||
|
|
||||||
import { TSESTree } from '@typescript-eslint/utils';
|
import { TSESTree } from '@typescript-eslint/utils';
|
||||||
import { RuleContext } from '@typescript-eslint/utils/ts-eslint';
|
import { RuleContext } from '@typescript-eslint/utils/ts-eslint';
|
||||||
import { readFileSync } from 'fs';
|
|
||||||
import { basename } from 'path';
|
|
||||||
import ts, { Identifier } from 'typescript';
|
import ts, { Identifier } from 'typescript';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
3886
package-lock.json
generated
3886
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
63
package.json
63
package.json
@@ -1,12 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "dspace-angular",
|
"name": "dspace-angular",
|
||||||
"version": "9.0.0",
|
"version": "10.0.0-next",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"config:watch": "nodemon",
|
|
||||||
"test:rest": "ts-node --project ./tsconfig.ts-node.json scripts/test-rest.ts",
|
"test:rest": "ts-node --project ./tsconfig.ts-node.json scripts/test-rest.ts",
|
||||||
"start": "npm run start:prod",
|
"start": "npm run start:prod",
|
||||||
"start:dev": "nodemon --exec \"cross-env NODE_ENV=development npm run serve\"",
|
"start:dev": "cross-env NODE_ENV=development npm run serve --watch",
|
||||||
"start:prod": "npm run build:prod && cross-env NODE_ENV=production npm run serve:ssr",
|
"start:prod": "npm run build:prod && cross-env NODE_ENV=production npm run serve:ssr",
|
||||||
"start:mirador:prod": "npm run build:mirador && npm run start:prod",
|
"start:mirador:prod": "npm run build:mirador && npm run start:prod",
|
||||||
"preserve": "npm run base-href",
|
"preserve": "npm run base-href",
|
||||||
@@ -19,7 +18,7 @@
|
|||||||
"build:ssr": "ng build --configuration production && ng run dspace-angular:server:production",
|
"build:ssr": "ng build --configuration production && ng run dspace-angular:server:production",
|
||||||
"build:lint": "rimraf 'lint/dist/**/*.js' 'lint/dist/**/*.js.map' && tsc -b lint/tsconfig.json",
|
"build:lint": "rimraf 'lint/dist/**/*.js' 'lint/dist/**/*.js.map' && tsc -b lint/tsconfig.json",
|
||||||
"test": "ng test --source-map=true --watch=false --configuration test",
|
"test": "ng test --source-map=true --watch=false --configuration test",
|
||||||
"test:watch": "nodemon --exec \"ng test --source-map=true --watch=true --configuration test\"",
|
"test:watch": "ng test --source-map=true --watch=true --configuration test",
|
||||||
"test:headless": "ng test --source-map=true --watch=false --configuration test --browsers=ChromeHeadless --code-coverage",
|
"test:headless": "ng test --source-map=true --watch=false --configuration test --browsers=ChromeHeadless --code-coverage",
|
||||||
"test:lint": "npm run build:lint && npm run test:lint:nobuild",
|
"test:lint": "npm run build:lint && npm run test:lint:nobuild",
|
||||||
"test:lint:nobuild": "jasmine --config=lint/jasmine.json",
|
"test:lint:nobuild": "jasmine --config=lint/jasmine.json",
|
||||||
@@ -91,25 +90,23 @@
|
|||||||
"notistack": "3.0.1"
|
"notistack": "3.0.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/animations": "^18.2.12",
|
"@angular/animations": "^18.2.14",
|
||||||
"@angular/cdk": "^18.2.12",
|
"@angular/cdk": "^18.2.12",
|
||||||
"@angular/common": "^18.2.12",
|
"@angular/common": "^18.2.14",
|
||||||
"@angular/compiler": "^18.2.12",
|
"@angular/compiler": "^18.2.14",
|
||||||
"@angular/core": "^18.2.12",
|
"@angular/core": "^18.2.14",
|
||||||
"@angular/forms": "^18.2.12",
|
"@angular/forms": "^18.2.14",
|
||||||
"@angular/localize": "^18.2.12",
|
"@angular/localize": "^18.2.14",
|
||||||
"@angular/platform-browser": "^18.2.12",
|
"@angular/platform-browser": "^18.2.14",
|
||||||
"@angular/platform-browser-dynamic": "^18.2.12",
|
"@angular/platform-browser-dynamic": "^18.2.14",
|
||||||
"@angular/platform-server": "^18.2.12",
|
"@angular/platform-server": "^18.2.14",
|
||||||
"@angular/router": "^18.2.12",
|
"@angular/router": "^18.2.14",
|
||||||
"@angular/ssr": "^18.2.19",
|
"@angular/ssr": "^18.2.21",
|
||||||
"@babel/runtime": "7.27.1",
|
|
||||||
"@kolkov/ngx-gallery": "^2.0.1",
|
"@kolkov/ngx-gallery": "^2.0.1",
|
||||||
"@ng-bootstrap/ng-bootstrap": "^12.0.0",
|
"@ng-bootstrap/ng-bootstrap": "^12.0.0",
|
||||||
"@ng-dynamic-forms/core": "^16.0.0",
|
"@ng-dynamic-forms/core": "^16.0.0",
|
||||||
"@ng-dynamic-forms/ui-ng-bootstrap": "^16.0.0",
|
"@ng-dynamic-forms/ui-ng-bootstrap": "^16.0.0",
|
||||||
"@ngrx/effects": "^18.1.1",
|
"@ngrx/effects": "^18.1.1",
|
||||||
"@ngrx/operators": "^18.0.0",
|
|
||||||
"@ngrx/router-store": "^18.1.1",
|
"@ngrx/router-store": "^18.1.1",
|
||||||
"@ngrx/store": "^18.1.1",
|
"@ngrx/store": "^18.1.1",
|
||||||
"@ngx-translate/core": "^16.0.3",
|
"@ngx-translate/core": "^16.0.3",
|
||||||
@@ -117,14 +114,13 @@
|
|||||||
"@terraformer/wkt": "^2.2.1",
|
"@terraformer/wkt": "^2.2.1",
|
||||||
"altcha": "^0.9.0",
|
"altcha": "^0.9.0",
|
||||||
"angulartics2": "^12.2.0",
|
"angulartics2": "^12.2.0",
|
||||||
"axios": "^1.9.0",
|
|
||||||
"bootstrap": "^5.3",
|
"bootstrap": "^5.3",
|
||||||
"cerialize": "0.1.18",
|
"cerialize": "0.1.18",
|
||||||
"cli-progress": "^3.12.0",
|
"cli-progress": "^3.12.0",
|
||||||
"colors": "^1.4.0",
|
"colors": "^1.4.0",
|
||||||
"compression": "^1.7.5",
|
"compression": "^1.8.1",
|
||||||
"cookie-parser": "1.4.7",
|
"cookie-parser": "1.4.7",
|
||||||
"core-js": "^3.42.0",
|
"core-js": "^3.45.1",
|
||||||
"date-fns": "^2.29.3",
|
"date-fns": "^2.29.3",
|
||||||
"date-fns-tz": "^1.3.7",
|
"date-fns-tz": "^1.3.7",
|
||||||
"deepmerge": "^4.3.1",
|
"deepmerge": "^4.3.1",
|
||||||
@@ -135,7 +131,7 @@
|
|||||||
"filesize": "^10.1.6",
|
"filesize": "^10.1.6",
|
||||||
"http-proxy-middleware": "^2.0.9",
|
"http-proxy-middleware": "^2.0.9",
|
||||||
"http-terminator": "^3.2.0",
|
"http-terminator": "^3.2.0",
|
||||||
"isbot": "^5.1.28",
|
"isbot": "^5.1.30",
|
||||||
"js-cookie": "2.2.1",
|
"js-cookie": "2.2.1",
|
||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
"json5": "^2.2.3",
|
"json5": "^2.2.3",
|
||||||
@@ -150,7 +146,7 @@
|
|||||||
"mirador": "^3.4.3",
|
"mirador": "^3.4.3",
|
||||||
"mirador-dl-plugin": "^0.13.0",
|
"mirador-dl-plugin": "^0.13.0",
|
||||||
"mirador-share-plugin": "^0.16.0",
|
"mirador-share-plugin": "^0.16.0",
|
||||||
"morgan": "^1.10.0",
|
"morgan": "^1.10.1",
|
||||||
"ng2-file-upload": "7.0.1",
|
"ng2-file-upload": "7.0.1",
|
||||||
"ng2-nouislider": "^2.0.0",
|
"ng2-nouislider": "^2.0.0",
|
||||||
"ngx-infinite-scroll": "^18.0.0",
|
"ngx-infinite-scroll": "^18.0.0",
|
||||||
@@ -168,7 +164,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular-builders/custom-webpack": "~18.0.0",
|
"@angular-builders/custom-webpack": "~18.0.0",
|
||||||
"@angular-devkit/build-angular": "^18.2.19",
|
"@angular-devkit/build-angular": "^18.2.20",
|
||||||
"@angular-eslint/builder": "^18.4.1",
|
"@angular-eslint/builder": "^18.4.1",
|
||||||
"@angular-eslint/bundled-angular-compiler": "^18.4.1",
|
"@angular-eslint/bundled-angular-compiler": "^18.4.1",
|
||||||
"@angular-eslint/eslint-plugin": "^18.4.1",
|
"@angular-eslint/eslint-plugin": "^18.4.1",
|
||||||
@@ -176,13 +172,12 @@
|
|||||||
"@angular-eslint/schematics": "^18.4.1",
|
"@angular-eslint/schematics": "^18.4.1",
|
||||||
"@angular-eslint/template-parser": "^18.4.1",
|
"@angular-eslint/template-parser": "^18.4.1",
|
||||||
"@angular-eslint/utils": "^18.4.1",
|
"@angular-eslint/utils": "^18.4.1",
|
||||||
"@angular/cli": "^18.2.19",
|
"@angular/cli": "^18.2.21",
|
||||||
"@angular/compiler-cli": "^18.2.12",
|
"@angular/compiler-cli": "^18.2.12",
|
||||||
"@angular/language-service": "^18.2.12",
|
|
||||||
"@cypress/schematic": "^1.5.0",
|
"@cypress/schematic": "^1.5.0",
|
||||||
"@fortawesome/fontawesome-free": "^6.7.2",
|
"@fortawesome/fontawesome-free": "^6.7.2",
|
||||||
"@ngrx/store-devtools": "^18.1.1",
|
"@ngrx/store-devtools": "^18.1.1",
|
||||||
"@ngtools/webpack": "^18.2.19",
|
"@ngtools/webpack": "^18.2.20",
|
||||||
"@types/deep-freeze": "0.1.5",
|
"@types/deep-freeze": "0.1.5",
|
||||||
"@types/ejs": "^3.1.2",
|
"@types/ejs": "^3.1.2",
|
||||||
"@types/express": "^4.17.17",
|
"@types/express": "^4.17.17",
|
||||||
@@ -190,7 +185,7 @@
|
|||||||
"@types/jasmine": "~3.6.0",
|
"@types/jasmine": "~3.6.0",
|
||||||
"@types/js-cookie": "2.2.6",
|
"@types/js-cookie": "2.2.6",
|
||||||
"@types/lodash-es": "^4.17.12",
|
"@types/lodash-es": "^4.17.12",
|
||||||
"@types/node": "^14.14.9",
|
"@types/node": "^18.19.124",
|
||||||
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
||||||
"@typescript-eslint/parser": "^7.18.0",
|
"@typescript-eslint/parser": "^7.18.0",
|
||||||
"@typescript-eslint/rule-tester": "^7.18.0",
|
"@typescript-eslint/rule-tester": "^7.18.0",
|
||||||
@@ -200,13 +195,13 @@
|
|||||||
"copy-webpack-plugin": "^6.4.1",
|
"copy-webpack-plugin": "^6.4.1",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"cypress": "^13.17.0",
|
"cypress": "^13.17.0",
|
||||||
"cypress-axe": "^1.6.0",
|
"cypress-axe": "^1.7.0",
|
||||||
"deep-freeze": "0.0.1",
|
"deep-freeze": "0.0.1",
|
||||||
"eslint": "^8.39.0",
|
"eslint": "^8.39.0",
|
||||||
"eslint-plugin-deprecation": "^1.4.1",
|
"eslint-plugin-deprecation": "^1.4.1",
|
||||||
"eslint-plugin-dspace-angular-html": "file:./lint/dist/src/rules/html",
|
"eslint-plugin-dspace-angular-html": "file:./lint/dist/src/rules/html",
|
||||||
"eslint-plugin-dspace-angular-ts": "file:./lint/dist/src/rules/ts",
|
"eslint-plugin-dspace-angular-ts": "file:./lint/dist/src/rules/ts",
|
||||||
"eslint-plugin-import": "^2.31.0",
|
"eslint-plugin-import": "^2.32.0",
|
||||||
"eslint-plugin-import-newlines": "^1.3.1",
|
"eslint-plugin-import-newlines": "^1.3.1",
|
||||||
"eslint-plugin-jsdoc": "^45.0.0",
|
"eslint-plugin-jsdoc": "^45.0.0",
|
||||||
"eslint-plugin-jsonc": "^2.20.1",
|
"eslint-plugin-jsonc": "^2.20.1",
|
||||||
@@ -224,21 +219,19 @@
|
|||||||
"karma-jasmine": "~4.0.0",
|
"karma-jasmine": "~4.0.0",
|
||||||
"karma-jasmine-html-reporter": "^1.5.0",
|
"karma-jasmine-html-reporter": "^1.5.0",
|
||||||
"karma-mocha-reporter": "2.2.5",
|
"karma-mocha-reporter": "2.2.5",
|
||||||
"ng-mocks": "^14.13.4",
|
"ng-mocks": "^14.13.5",
|
||||||
"ngx-mask": "14.2.4",
|
"ngx-mask": "14.2.4",
|
||||||
"nodemon": "^2.0.22",
|
|
||||||
"postcss": "^8.5",
|
"postcss": "^8.5",
|
||||||
"postcss-import": "^14.0.0",
|
"postcss-import": "^14.0.0",
|
||||||
"postcss-loader": "^4.0.3",
|
"postcss-loader": "^4.0.3",
|
||||||
"postcss-preset-env": "^7.4.2",
|
"postcss-preset-env": "^7.4.2",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"sass": "~1.89.0",
|
"sass": "~1.92.1",
|
||||||
"sass-loader": "^12.6.0",
|
"sass-loader": "^12.6.0",
|
||||||
"sass-resources-loader": "^2.2.5",
|
"sass-resources-loader": "^2.2.5",
|
||||||
"ts-node": "^8.10.2",
|
"ts-node": "^8.10.2",
|
||||||
"typescript": "~5.4.5",
|
"typescript": "~5.4.5",
|
||||||
"webpack": "5.99.8",
|
"webpack": "^5.54.0",
|
||||||
"webpack-cli": "^5.1.4",
|
"webpack-cli": "^6.0.1"
|
||||||
"webpack-dev-server": "^4.15.1"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
15
server.ts
15
server.ts
@@ -25,7 +25,6 @@ import * as ejs from 'ejs';
|
|||||||
import * as compression from 'compression';
|
import * as compression from 'compression';
|
||||||
import expressStaticGzip from 'express-static-gzip';
|
import expressStaticGzip from 'express-static-gzip';
|
||||||
/* eslint-enable import/no-namespace */
|
/* eslint-enable import/no-namespace */
|
||||||
import axios from 'axios';
|
|
||||||
import LRU from 'lru-cache';
|
import LRU from 'lru-cache';
|
||||||
import { isbot } from 'isbot';
|
import { isbot } from 'isbot';
|
||||||
import { createCertificate } from 'pem';
|
import { createCertificate } from 'pem';
|
||||||
@@ -269,6 +268,12 @@ function serverSideRender(req, res, next, sendToUser: boolean = true) {
|
|||||||
],
|
],
|
||||||
})
|
})
|
||||||
.then((html) => {
|
.then((html) => {
|
||||||
|
// If headers were already sent, then do nothing else, it is probably a
|
||||||
|
// redirect response
|
||||||
|
if (res.headersSent) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (hasValue(html)) {
|
if (hasValue(html)) {
|
||||||
// Replace REST URL with UI URL
|
// Replace REST URL with UI URL
|
||||||
if (environment.ssr.replaceRestUrl && REST_BASE_URL !== environment.rest.baseUrl) {
|
if (environment.ssr.replaceRestUrl && REST_BASE_URL !== environment.rest.baseUrl) {
|
||||||
@@ -561,8 +566,8 @@ function createHttpsServer(keys) {
|
|||||||
* Create an HTTP server with the configured port and host.
|
* Create an HTTP server with the configured port and host.
|
||||||
*/
|
*/
|
||||||
function run() {
|
function run() {
|
||||||
const port = environment.ui.port || 4000;
|
const port = environment.ui.port;
|
||||||
const host = environment.ui.host || '/';
|
const host = environment.ui.host;
|
||||||
|
|
||||||
// Start up the Node server
|
// Start up the Node server
|
||||||
const server = app();
|
const server = app();
|
||||||
@@ -648,9 +653,9 @@ function isExcludedFromSsr(path: string, excludePathPattern: SsrExcludePatterns[
|
|||||||
*/
|
*/
|
||||||
function healthCheck(req, res) {
|
function healthCheck(req, res) {
|
||||||
const baseUrl = `${REST_BASE_URL}${environment.actuators.endpointPath}`;
|
const baseUrl = `${REST_BASE_URL}${environment.actuators.endpointPath}`;
|
||||||
axios.get(baseUrl)
|
fetch(baseUrl)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
res.status(response.status).send(response.data);
|
res.status(response.status).send(response);
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
res.status(error.response.status).send({
|
res.status(error.response.status).send({
|
||||||
|
@@ -83,7 +83,7 @@
|
|||||||
|
|
||||||
<form [formGroup]="searchForm" (ngSubmit)="search(searchForm.value)" class="d-flex justify-content-between">
|
<form [formGroup]="searchForm" (ngSubmit)="search(searchForm.value)" class="d-flex justify-content-between">
|
||||||
<div class="flex-grow-1 me-3">
|
<div class="flex-grow-1 me-3">
|
||||||
<div class="form-group input-group me-3">
|
<div class="mb-3 input-group me-3">
|
||||||
<input type="text" name="query" id="query" formControlName="query"
|
<input type="text" name="query" id="query" formControlName="query"
|
||||||
class="form-control" aria-label="Search input">
|
class="form-control" aria-label="Search input">
|
||||||
<span class="input-group-append">
|
<span class="input-group-append">
|
||||||
|
@@ -85,7 +85,7 @@
|
|||||||
}
|
}
|
||||||
@if (!groupDto.group?.permanent && groupDto.ableToDelete) {
|
@if (!groupDto.group?.permanent && groupDto.ableToDelete) {
|
||||||
<button
|
<button
|
||||||
(click)="deleteGroup(groupDto)" class="btn btn-outline-danger btn-sm btn-delete"
|
(click)="confirmDelete(groupDto)" class="btn btn-outline-danger btn-sm btn-delete"
|
||||||
title="{{messagePrefix + 'table.edit.buttons.remove' | translate: {name: dsoNameService.getName(groupDto.group) } }}">
|
title="{{messagePrefix + 'table.edit.buttons.remove' | translate: {name: dsoNameService.getName(groupDto.group) } }}">
|
||||||
<i class="fas fa-trash-alt fa-fw"></i>
|
<i class="fas fa-trash-alt fa-fw"></i>
|
||||||
</button>
|
</button>
|
||||||
|
@@ -381,6 +381,8 @@ describe('GroupsRegistryComponent', () => {
|
|||||||
deleteButton.click();
|
deleteButton.click();
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
|
|
||||||
|
(document as any).querySelector('.modal-footer .confirm').click();
|
||||||
|
|
||||||
expect(groupsDataServiceStub.delete).toHaveBeenCalledWith(mockGroups[0].id);
|
expect(groupsDataServiceStub.delete).toHaveBeenCalledWith(mockGroups[0].id);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -9,7 +9,10 @@ import {
|
|||||||
UntypedFormBuilder,
|
UntypedFormBuilder,
|
||||||
} from '@angular/forms';
|
} from '@angular/forms';
|
||||||
import { RouterLink } from '@angular/router';
|
import { RouterLink } from '@angular/router';
|
||||||
import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';
|
import {
|
||||||
|
NgbModal,
|
||||||
|
NgbTooltipModule,
|
||||||
|
} from '@ng-bootstrap/ng-bootstrap';
|
||||||
import {
|
import {
|
||||||
TranslateModule,
|
TranslateModule,
|
||||||
TranslateService,
|
TranslateService,
|
||||||
@@ -27,6 +30,7 @@ import {
|
|||||||
defaultIfEmpty,
|
defaultIfEmpty,
|
||||||
map,
|
map,
|
||||||
switchMap,
|
switchMap,
|
||||||
|
takeUntil,
|
||||||
tap,
|
tap,
|
||||||
} from 'rxjs/operators';
|
} from 'rxjs/operators';
|
||||||
|
|
||||||
@@ -57,6 +61,7 @@ import {
|
|||||||
} from '../../core/shared/operators';
|
} from '../../core/shared/operators';
|
||||||
import { PageInfo } from '../../core/shared/page-info.model';
|
import { PageInfo } from '../../core/shared/page-info.model';
|
||||||
import { BtnDisabledDirective } from '../../shared/btn-disabled.directive';
|
import { BtnDisabledDirective } from '../../shared/btn-disabled.directive';
|
||||||
|
import { ConfirmationModalComponent } from '../../shared/confirmation-modal/confirmation-modal.component';
|
||||||
import { hasValue } from '../../shared/empty.util';
|
import { hasValue } from '../../shared/empty.util';
|
||||||
import { ThemedLoadingComponent } from '../../shared/loading/themed-loading.component';
|
import { ThemedLoadingComponent } from '../../shared/loading/themed-loading.component';
|
||||||
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
||||||
@@ -142,6 +147,7 @@ export class GroupsRegistryComponent implements OnInit, OnDestroy {
|
|||||||
private paginationService: PaginationService,
|
private paginationService: PaginationService,
|
||||||
public requestService: RequestService,
|
public requestService: RequestService,
|
||||||
public dsoNameService: DSONameService,
|
public dsoNameService: DSONameService,
|
||||||
|
private modalService: NgbModal,
|
||||||
) {
|
) {
|
||||||
this.currentSearchQuery = '';
|
this.currentSearchQuery = '';
|
||||||
this.searchForm = this.formBuilder.group(({
|
this.searchForm = this.formBuilder.group(({
|
||||||
@@ -314,4 +320,30 @@ export class GroupsRegistryComponent implements OnInit, OnDestroy {
|
|||||||
this.paginationService.clearPagination(this.config.id);
|
this.paginationService.clearPagination(this.config.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
confirmDelete(group: GroupDtoModel): void {
|
||||||
|
const modalRef = this.modalService.open(ConfirmationModalComponent);
|
||||||
|
modalRef.componentInstance.name = this.dsoNameService.getName(group.group);
|
||||||
|
modalRef.componentInstance.headerLabel = 'admin.access-control.epeople.table.edit.buttons.remove.modal.header';
|
||||||
|
modalRef.componentInstance.infoLabel = 'admin.access-control.epeople.table.edit.buttons.remove.modal.info';
|
||||||
|
modalRef.componentInstance.cancelLabel = 'admin.access-control.epeople.table.edit.buttons.remove.modal.cancel';
|
||||||
|
modalRef.componentInstance.confirmLabel = 'admin.access-control.epeople.table.edit.buttons.remove.modal.confirm';
|
||||||
|
modalRef.componentInstance.brandColor = 'danger';
|
||||||
|
modalRef.componentInstance.confirmIcon = 'fas fa-trash';
|
||||||
|
|
||||||
|
const modalSub: Subscription = modalRef.componentInstance.response.pipe(
|
||||||
|
takeUntil(modalRef.closed),
|
||||||
|
).subscribe((result: boolean) => {
|
||||||
|
if (result === true) {
|
||||||
|
this.deleteGroup(group);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
void modalRef.result.then().finally(() => {
|
||||||
|
modalRef.close();
|
||||||
|
if (modalSub && !modalSub.closed) {
|
||||||
|
modalSub.unsubscribe();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
<!-- In the toggle section -->
|
<!-- In the toggle section -->
|
||||||
@if (!isNewService) {
|
@if (!isNewService) {
|
||||||
<div class="toggle-switch-container">
|
<div class="toggle-switch-container">
|
||||||
<label class="status-label font-weight-bold" for="enabled">{{ 'ldn-service-status' | translate }}</label>
|
<label class="status-label fw-bold" for="enabled">{{ 'ldn-service-status' | translate }}</label>
|
||||||
<div>
|
<div>
|
||||||
<input formControlName="enabled" hidden id="enabled" name="enabled" type="checkbox">
|
<input formControlName="enabled" hidden id="enabled" name="enabled" type="checkbox">
|
||||||
<div (click)="toggleEnabled()" [class.checked]="formModel.get('enabled').value" class="toggle-switch">
|
<div (click)="toggleEnabled()" [class.checked]="formModel.get('enabled').value" class="toggle-switch">
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
}
|
}
|
||||||
<!-- In the Name section -->
|
<!-- In the Name section -->
|
||||||
<div class="mb-5">
|
<div class="mb-5">
|
||||||
<label for="name" class="font-weight-bold">{{ 'ldn-new-service.form.label.name' | translate }}</label>
|
<label for="name" class="fw-bold">{{ 'ldn-new-service.form.label.name' | translate }}</label>
|
||||||
<input [class.invalid-field]="formModel.get('name').invalid && formModel.get('name').touched"
|
<input [class.invalid-field]="formModel.get('name').invalid && formModel.get('name').touched"
|
||||||
[placeholder]="'ldn-new-service.form.placeholder.name' | translate" class="form-control"
|
[placeholder]="'ldn-new-service.form.placeholder.name' | translate" class="form-control"
|
||||||
formControlName="name"
|
formControlName="name"
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
<!-- In the description section -->
|
<!-- In the description section -->
|
||||||
<div class="mb-5 mt-5 d-flex flex-column">
|
<div class="mb-5 mt-5 d-flex flex-column">
|
||||||
<label for="description" class="font-weight-bold">{{ 'ldn-new-service.form.label.description' | translate }}</label>
|
<label for="description" class="fw-bold">{{ 'ldn-new-service.form.label.description' | translate }}</label>
|
||||||
<textarea [placeholder]="'ldn-new-service.form.placeholder.description' | translate"
|
<textarea [placeholder]="'ldn-new-service.form.placeholder.description' | translate"
|
||||||
class="form-control" formControlName="description" id="description" name="description"></textarea>
|
class="form-control" formControlName="description" id="description" name="description"></textarea>
|
||||||
</div>
|
</div>
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
<!-- In the url section -->
|
<!-- In the url section -->
|
||||||
<div class="d-flex align-items-center">
|
<div class="d-flex align-items-center">
|
||||||
<div class="d-flex flex-column w-50 me-2">
|
<div class="d-flex flex-column w-50 me-2">
|
||||||
<label for="url" class="font-weight-bold">{{ 'ldn-new-service.form.label.url' | translate }}</label>
|
<label for="url" class="fw-bold">{{ 'ldn-new-service.form.label.url' | translate }}</label>
|
||||||
<input [class.invalid-field]="formModel.get('url').invalid && formModel.get('url').touched"
|
<input [class.invalid-field]="formModel.get('url').invalid && formModel.get('url').touched"
|
||||||
[placeholder]="'ldn-new-service.form.placeholder.url' | translate" class="form-control"
|
[placeholder]="'ldn-new-service.form.placeholder.url' | translate" class="form-control"
|
||||||
formControlName="url"
|
formControlName="url"
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="d-flex flex-column w-50">
|
<div class="d-flex flex-column w-50">
|
||||||
<label for="score" class="font-weight-bold">{{ 'ldn-new-service.form.label.score' | translate }}</label>
|
<label for="score" class="fw-bold">{{ 'ldn-new-service.form.label.score' | translate }}</label>
|
||||||
<input [class.invalid-field]="formModel.get('score').invalid && formModel.get('score').touched"
|
<input [class.invalid-field]="formModel.get('score').invalid && formModel.get('score').touched"
|
||||||
[placeholder]="'ldn-new-service.form.placeholder.score' | translate" formControlName="score"
|
[placeholder]="'ldn-new-service.form.placeholder.score' | translate" formControlName="score"
|
||||||
id="score"
|
id="score"
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
|
|
||||||
<!-- In the IP range section -->
|
<!-- In the IP range section -->
|
||||||
<div class="mb-5 mt-5">
|
<div class="mb-5 mt-5">
|
||||||
<label for="lowerIp" class="font-weight-bold">{{ 'ldn-new-service.form.label.ip-range' | translate }}</label>
|
<label for="lowerIp" class="fw-bold">{{ 'ldn-new-service.form.label.ip-range' | translate }}</label>
|
||||||
<div class="d-flex">
|
<div class="d-flex">
|
||||||
<input [class.invalid-field]="formModel.get('lowerIp').invalid && formModel.get('lowerIp').touched"
|
<input [class.invalid-field]="formModel.get('lowerIp').invalid && formModel.get('lowerIp').touched"
|
||||||
[placeholder]="'ldn-new-service.form.placeholder.lowerIp' | translate" class="form-control me-2"
|
[placeholder]="'ldn-new-service.form.placeholder.lowerIp' | translate" class="form-control me-2"
|
||||||
@@ -105,7 +105,7 @@
|
|||||||
|
|
||||||
<!-- In the ldnUrl section -->
|
<!-- In the ldnUrl section -->
|
||||||
<div class="mb-5 mt-5">
|
<div class="mb-5 mt-5">
|
||||||
<label for="ldnUrl" class="font-weight-bold">{{ 'ldn-new-service.form.label.ldnUrl' | translate }}</label>
|
<label for="ldnUrl" class="fw-bold">{{ 'ldn-new-service.form.label.ldnUrl' | translate }}</label>
|
||||||
<input [class.invalid-field]="formModel.get('ldnUrl').invalid && formModel.get('ldnUrl').touched"
|
<input [class.invalid-field]="formModel.get('ldnUrl').invalid && formModel.get('ldnUrl').touched"
|
||||||
[placeholder]="'ldn-new-service.form.placeholder.ldnUrl' | translate" class="form-control"
|
[placeholder]="'ldn-new-service.form.placeholder.ldnUrl' | translate" class="form-control"
|
||||||
formControlName="ldnUrl"
|
formControlName="ldnUrl"
|
||||||
@@ -130,7 +130,7 @@
|
|||||||
|
|
||||||
<!-- In the usesActorEmailId section -->
|
<!-- In the usesActorEmailId section -->
|
||||||
<div class="mb-5 mt-5">
|
<div class="mb-5 mt-5">
|
||||||
<label class="status-label font-weight-bold" for="usesActorEmailId">{{ 'ldn-service-usesActorEmailId' | translate }}</label>
|
<label class="status-label fw-bold" for="usesActorEmailId">{{ 'ldn-service-usesActorEmailId' | translate }}</label>
|
||||||
<div>
|
<div>
|
||||||
<input formControlName="usesActorEmailId" hidden id="usesActorEmailId"
|
<input formControlName="usesActorEmailId" hidden id="usesActorEmailId"
|
||||||
name="usesActorEmailId" type="checkbox">
|
name="usesActorEmailId" type="checkbox">
|
||||||
@@ -149,14 +149,14 @@
|
|||||||
@if (areControlsInitialized) {
|
@if (areControlsInitialized) {
|
||||||
<div class="row mb-1 mt-5">
|
<div class="row mb-1 mt-5">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<label class="font-weight-bold">{{ 'ldn-new-service.form.label.inboundPattern' | translate }} </label>
|
<label class="fw-bold">{{ 'ldn-new-service.form.label.inboundPattern' | translate }} </label>
|
||||||
</div>
|
</div>
|
||||||
@if (formModel.get('notifyServiceInboundPatterns')['controls'][0]?.value?.pattern) {
|
@if (formModel.get('notifyServiceInboundPatterns')['controls'][0]?.value?.pattern) {
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<label class="font-weight-bold">{{ 'ldn-new-service.form.label.ItemFilter' | translate }}</label>
|
<label class="fw-bold">{{ 'ldn-new-service.form.label.ItemFilter' | translate }}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-1">
|
<div class="col-sm-1">
|
||||||
<label class="font-weight-bold">{{ 'ldn-new-service.form.label.automatic' | translate }}</label>
|
<label class="fw-bold">{{ 'ldn-new-service.form.label.automatic' | translate }}</label>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-2">
|
||||||
@@ -295,8 +295,8 @@
|
|||||||
<span (click)="addInboundPattern()"
|
<span (click)="addInboundPattern()"
|
||||||
class="add-pattern-link mb-2">{{ 'ldn-new-service.form.label.addPattern' | translate }}</span>
|
class="add-pattern-link mb-2">{{ 'ldn-new-service.form.label.addPattern' | translate }}</span>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="form-group row">
|
<div class="mb-3 row">
|
||||||
<div class="col text-right space-children-mr">
|
<div class="col text-end space-children-mr">
|
||||||
<ng-content select="[before]"></ng-content>
|
<ng-content select="[before]"></ng-content>
|
||||||
<button (click)="resetFormAndLeave()" class="btn btn-outline-secondary" type="button">
|
<button (click)="resetFormAndLeave()" class="btn btn-outline-secondary" type="button">
|
||||||
<span> {{ 'submission.general.back.submit' | translate }}</span>
|
<span> {{ 'submission.general.back.submit' | translate }}</span>
|
||||||
@@ -317,9 +317,7 @@
|
|||||||
@if (isNewService) {
|
@if (isNewService) {
|
||||||
<h4>{{'service.overview.create.modal' | translate }}</h4>
|
<h4>{{'service.overview.create.modal' | translate }}</h4>
|
||||||
}
|
}
|
||||||
<button (click)="closeModal()" aria-label="Close"
|
<button (click)="closeModal()" aria-label="Close" class="btn-close" type="button">
|
||||||
class="close" type="button">
|
|
||||||
<span aria-hidden="true">×</span>
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@@ -77,8 +77,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<button (click)="closeModal()" aria-label="Close"
|
<button (click)="closeModal()" aria-label="Close"
|
||||||
[attr.aria-label]="'ldn-service-overview-close-modal' | translate"
|
[attr.aria-label]="'ldn-service-overview-close-modal' | translate"
|
||||||
class="close" type="button">
|
class="btn-close" type="button">
|
||||||
<span aria-hidden="true">×</span>
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -86,7 +85,7 @@
|
|||||||
<div>
|
<div>
|
||||||
{{ 'service.overview.delete.body' | translate }}
|
{{ 'service.overview.delete.body' | translate }}
|
||||||
</div>
|
</div>
|
||||||
<div class="mt-4 text-right">
|
<div class="mt-4 text-end">
|
||||||
<button (click)="closeModal()"
|
<button (click)="closeModal()"
|
||||||
[attr.aria-label]="'ldn-service-overview-close-modal' | translate"
|
[attr.aria-label]="'ldn-service-overview-close-modal' | translate"
|
||||||
class="btn btn-outline-secondary me-2">{{ 'service.detail.delete.cancel' | translate }}</button>
|
class="btn btn-outline-secondary me-2">{{ 'service.detail.delete.cancel' | translate }}</button>
|
||||||
|
@@ -1,15 +1,14 @@
|
|||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h4 class="modal-title">{{'notify-message-modal.title' | translate}}</h4>
|
<h4 class="modal-title">{{'notify-message-modal.title' | translate}}</h4>
|
||||||
<button type="button" class="close" aria-label="Close" (click)="activeModal.dismiss('Cross click')">
|
<button type="button" class="btn-close" aria-label="Close" (click)="activeModal.dismiss('Cross click')">
|
||||||
<span aria-hidden="true">×</span>
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body p-4">
|
<div class="modal-body p-4">
|
||||||
@for (key of notifyMessageKeys; track key) {
|
@for (key of notifyMessageKeys; track key) {
|
||||||
<div>
|
<div>
|
||||||
<div class="row mb-4">
|
<div class="row mb-4">
|
||||||
<div class="font-weight-bold col">{{ key + '.notify-detail-modal' | translate}}</div>
|
<div class="fw-bold col">{{ key + '.notify-detail-modal' | translate}}</div>
|
||||||
<div class="col text-right">{{'notify-detail-modal.' + notifyMessage[key] | translate: {default: notifyMessage[key] ?? "n/a" } }}</div>
|
<div class="col text-end">{{'notify-detail-modal.' + notifyMessage[key] | translate: {default: notifyMessage[key] ?? "n/a" } }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<div class="container my-4">
|
<div class="container my-4">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 col-md-3 text-left h4">{{((isInbound$ | async) ? 'admin.notify.dashboard.inbound' : 'admin.notify.dashboard.outbound') | translate}}</div>
|
<div class="col-12 col-md-3 text-start h4">{{((isInbound$ | async) ? 'admin.notify.dashboard.inbound' : 'admin.notify.dashboard.outbound') | translate}}</div>
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
<div class="h4">
|
<div class="h4">
|
||||||
@if ((selectedSearchConfig$ | async) !== defaultConfiguration) {
|
@if ((selectedSearchConfig$ | async) !== defaultConfiguration) {
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
<ds-loading></ds-loading>
|
<ds-loading></ds-loading>
|
||||||
}
|
}
|
||||||
@if ((loadingCollections$ | async) !== true) {
|
@if ((loadingCollections$ | async) !== true) {
|
||||||
<select id="collSel" name="collSel" class="form-control" multiple="multiple" size="10" formControlName="collections">
|
<select id="collSel" name="collSel" class="form-select" multiple="multiple" size="10" formControlName="collections">
|
||||||
@for (item of collections; track item) {
|
@for (item of collections; track item) {
|
||||||
<option [value]="item.id" [disabled]="item.disabled">{{item.name$ | async}}</option>
|
<option [value]="item.id" [disabled]="item.disabled">{{item.name$ | async}}</option>
|
||||||
}
|
}
|
||||||
@@ -32,11 +32,11 @@
|
|||||||
{{'admin.reports.items.section.metadataFieldQueries' | translate}}
|
{{'admin.reports.items.section.metadataFieldQueries' | translate}}
|
||||||
</ng-template>
|
</ng-template>
|
||||||
<ng-template ngbPanelContent>
|
<ng-template ngbPanelContent>
|
||||||
<fieldset id="predefqueries" class="form-group">
|
<fieldset id="predefqueries" class="mb-3">
|
||||||
<label>
|
<label>
|
||||||
{{'admin.reports.items.predefinedQueries' | translate}}
|
{{'admin.reports.items.predefinedQueries' | translate}}
|
||||||
</label>
|
</label>
|
||||||
<select id="predefselect" formControlName="presetQuery" class="form-control" (change)="setPresetQuery()">
|
<select id="predefselect" formControlName="presetQuery" class="form-select" (change)="setPresetQuery()">
|
||||||
@for (item of presetQueries; track item.id) {
|
@for (item of presetQueries; track item.id) {
|
||||||
<option [value]="item.id" [selected]="item.isDefault">{{item.label | translate}}</option>
|
<option [value]="item.id" [selected]="item.isDefault">{{item.label | translate}}</option>
|
||||||
}
|
}
|
||||||
@@ -46,17 +46,17 @@
|
|||||||
<div id="queries">
|
<div id="queries">
|
||||||
@for (pred of queryPredicatesArray().controls; track pred; let i = $index) {
|
@for (pred of queryPredicatesArray().controls; track pred; let i = $index) {
|
||||||
<div class="metadata">
|
<div class="metadata">
|
||||||
<div [formGroup]="pred" class="form-group">
|
<div [formGroup]="pred" class="mb-3">
|
||||||
<div class="form-row">
|
<div class="row">
|
||||||
<div class="col-4">
|
<div class="col-4">
|
||||||
<select class="query-tool" formControlName="field" class="form-control">
|
<select class="query-tool" formControlName="field" class="form-select">
|
||||||
@for (item of metadataFieldsWithAny; track item) {
|
@for (item of metadataFieldsWithAny; track item) {
|
||||||
<option [value]="item.id">{{item.name$ | async}}</option>
|
<option [value]="item.id">{{item.name$ | async}}</option>
|
||||||
}
|
}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-auto">
|
<div class="col-auto">
|
||||||
<select class="query-tool" formControlName="operator" class="form-control">
|
<select class="query-tool" formControlName="operator" class="form-select">
|
||||||
@for (item of predicates; track item) {
|
@for (item of predicates; track item) {
|
||||||
<option [value]="item.id">{{item.name$ | async | translate}}</option>
|
<option [value]="item.id">{{item.name$ | async | translate}}</option>
|
||||||
}
|
}
|
||||||
@@ -86,17 +86,17 @@
|
|||||||
{{'admin.reports.items.section.limitPaginateQueries' | translate}}
|
{{'admin.reports.items.section.limitPaginateQueries' | translate}}
|
||||||
</ng-template>
|
</ng-template>
|
||||||
<ng-template ngbPanelContent>
|
<ng-template ngbPanelContent>
|
||||||
<div class="row align-items-center">
|
<div class="row align-items-center mb-3">
|
||||||
<label for="limit" class="col-sm-2 col-form-label">{{'admin.reports.items.limit' | translate}}:</label>
|
<label for="limit" class="col-sm-2 col-form-label">{{'admin.reports.items.limit' | translate}}:</label>
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<select id="limit" name="limit" formControlName="pageLimit" class="form-control col-6">
|
<select id="limit" name="limit" formControlName="pageLimit" class="form-select col-6">
|
||||||
@for (item of pageLimits; track item) {
|
@for (item of pageLimits; track item) {
|
||||||
<option value="{{item.id}}" [selected]="item.isDefault">{{item.name$ | async}}</option>
|
<option value="{{item.id}}" [selected]="item.isDefault">{{item.name$ | async}}</option>
|
||||||
}
|
}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row align-items-center">
|
<div class="row align-items-center mb-3">
|
||||||
<label for="offset" class="col-sm-2 col-form-label">{{'admin.reports.items.offset' | translate}}:</label>
|
<label for="offset" class="col-sm-2 col-form-label">{{'admin.reports.items.offset' | translate}}:</label>
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<input id="offset" name="offset" value="0" class="form-control col-6">
|
<input id="offset" name="offset" value="0" class="form-control col-6">
|
||||||
@@ -104,7 +104,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<span class="col-3"></span>
|
<span class="col-3"></span>
|
||||||
<button class="btn btn-primary mt-1 col-6" (click)="submit()">{{'admin.reports.items.run' | translate}}</button>
|
<button class="btn btn-primary col-6" (click)="submit()">{{'admin.reports.items.run' | translate}}</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</ngb-panel>
|
</ngb-panel>
|
||||||
@@ -130,7 +130,7 @@
|
|||||||
</ng-template>
|
</ng-template>
|
||||||
<ng-template ngbPanelContent>
|
<ng-template ngbPanelContent>
|
||||||
<div id="show-fields">
|
<div id="show-fields">
|
||||||
<select class="query-tool" name="show_fields" multiple="multiple" size="8" class="form-control" formControlName="additionalFields">
|
<select class="query-tool" name="show_fields" multiple="multiple" size="8" class="form-select" formControlName="additionalFields">
|
||||||
@for (item of metadataFields; track item) {
|
@for (item of metadataFields; track item) {
|
||||||
<option [value]="item.id">{{item.name$ | async}}</option>
|
<option [value]="item.id">{{item.name$ | async}}</option>
|
||||||
}
|
}
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
.nav-breadcrumb {
|
.nav-breadcrumb {
|
||||||
background-color: var(--ds-breadcrumb-bg);
|
background-color: var(--ds-breadcrumb-bg) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.breadcrumb {
|
.breadcrumb {
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
padding-bottom: calc(var(--ds-content-spacing) / 2);
|
padding-bottom: calc(var(--ds-content-spacing) / 2);
|
||||||
padding-top: calc(var(--ds-content-spacing) / 2);
|
padding-top: calc(var(--ds-content-spacing) / 2);
|
||||||
background-color: var(--ds-breadcrumb-bg);
|
background-color: var(--ds-breadcrumb-bg) !important;
|
||||||
padding-left: calc(var(--bs-spacer) *.75);
|
padding-left: calc(var(--bs-spacer) *.75);
|
||||||
padding-right: calc(var(--bs-spacer) *.75);
|
padding-right: calc(var(--bs-spacer) *.75);
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<h1>{{ 'browse.metadata.map' | translate }}</h1>
|
<h1>{{ 'browse.metadata.map' | translate }}</h1>
|
||||||
@if (isPlatformBrowser(platformId)) {
|
@defer {
|
||||||
<ds-geospatial-map [facetValues]="facetValues$"
|
<ds-geospatial-map [facetValues]="facetValues$"
|
||||||
[currentScope]="this.scope$|async"
|
[currentScope]="this.scope$|async"
|
||||||
[layout]="'browse'"
|
[layout]="'browse'"
|
||||||
|
@@ -1,14 +1,11 @@
|
|||||||
import {
|
import {
|
||||||
AsyncPipe,
|
AsyncPipe,
|
||||||
isPlatformBrowser,
|
isPlatformBrowser,
|
||||||
NgIf,
|
|
||||||
} from '@angular/common';
|
} from '@angular/common';
|
||||||
import {
|
import {
|
||||||
ChangeDetectionStrategy,
|
ChangeDetectionStrategy,
|
||||||
Component,
|
Component,
|
||||||
Inject,
|
|
||||||
OnInit,
|
OnInit,
|
||||||
PLATFORM_ID,
|
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import {
|
import {
|
||||||
ActivatedRoute,
|
ActivatedRoute,
|
||||||
@@ -47,7 +44,6 @@ import { PaginatedSearchOptions } from '../../shared/search/models/paginated-sea
|
|||||||
imports: [
|
imports: [
|
||||||
AsyncPipe,
|
AsyncPipe,
|
||||||
GeospatialMapComponent,
|
GeospatialMapComponent,
|
||||||
NgIf,
|
|
||||||
TranslateModule,
|
TranslateModule,
|
||||||
],
|
],
|
||||||
standalone: true,
|
standalone: true,
|
||||||
@@ -67,7 +63,6 @@ export class BrowseByGeospatialDataComponent implements OnInit {
|
|||||||
public facetValues$: Observable<FacetValues> = of(null);
|
public facetValues$: Observable<FacetValues> = of(null);
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@Inject(PLATFORM_ID) public platformId: string,
|
|
||||||
private searchConfigurationService: SearchConfigurationService,
|
private searchConfigurationService: SearchConfigurationService,
|
||||||
private searchService: SearchService,
|
private searchService: SearchService,
|
||||||
protected route: ActivatedRoute,
|
protected route: ActivatedRoute,
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
<section class="comcol-page-browse-section">
|
<section class="comcol-page-browse-section">
|
||||||
<div class="browse-by-metadata w-100">
|
<div class="browse-by-metadata w-100">
|
||||||
@if ((loading$ | async) !== true) {
|
@if ((loading$ | async) !== true) {
|
||||||
<ds-browse-by class="col-xs-12 w-100"
|
<ds-browse-by class="col-12 w-100"
|
||||||
title="{{'browse.title' | translate:{
|
title="{{'browse.title' | translate:{
|
||||||
field: 'browse.metadata.' + browseId | translate,
|
field: 'browse.metadata.' + browseId | translate,
|
||||||
startsWith: (startsWith)? ('browse.startsWith' | translate: { startsWith: '"' + startsWith + '"' }) : '',
|
startsWith: (startsWith)? ('browse.startsWith' | translate: { startsWith: '"' + startsWith + '"' }) : '',
|
||||||
|
@@ -248,6 +248,8 @@ export class BrowseByMetadataComponent implements OnInit, OnChanges, OnDestroy {
|
|||||||
|
|
||||||
if (typeof params.startsWith === 'string') {
|
if (typeof params.startsWith === 'string') {
|
||||||
this.startsWith = params.startsWith.trim();
|
this.startsWith = params.startsWith.trim();
|
||||||
|
} else {
|
||||||
|
this.startsWith = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isNotEmpty(this.value)) {
|
if (isNotEmpty(this.value)) {
|
||||||
|
@@ -12,7 +12,7 @@
|
|||||||
<div class="align-middle my-auto">
|
<div class="align-middle my-auto">
|
||||||
@if ((dataSource.loading$ | async) !== true) {
|
@if ((dataSource.loading$ | async) !== true) {
|
||||||
<button (click)="getNextPage(node)"
|
<button (click)="getNextPage(node)"
|
||||||
class="btn btn-outline-primary btn-sm" role="button" tabindex="0">
|
class="btn btn-outline-primary btn-sm" role="button" tabindex="0" data-test="show-more-button">
|
||||||
<i class="fas fa-angle-down"></i> {{ 'communityList.showMore' | translate }}
|
<i class="fas fa-angle-down"></i> {{ 'communityList.showMore' | translate }}
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
|
@@ -77,11 +77,11 @@ export class CollectionDataService extends ComColDataService<Collection> {
|
|||||||
* requested after the response becomes stale
|
* requested after the response becomes stale
|
||||||
* @param linksToFollow List of {@link FollowLinkConfig} that indicate which
|
* @param linksToFollow List of {@link FollowLinkConfig} that indicate which
|
||||||
* {@link HALLink}s should be automatically resolved
|
* {@link HALLink}s should be automatically resolved
|
||||||
|
* @param searchHref The backend search endpoint to use (default to submit)
|
||||||
* @return Observable<RemoteData<PaginatedList<Collection>>>
|
* @return Observable<RemoteData<PaginatedList<Collection>>>
|
||||||
* collection list
|
* collection list
|
||||||
*/
|
*/
|
||||||
getAuthorizedCollection(query: string, options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig<Collection>[]): Observable<RemoteData<PaginatedList<Collection>>> {
|
getAuthorizedCollection(query: string, options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, searchHref: string = 'findSubmitAuthorized', ...linksToFollow: FollowLinkConfig<Collection>[]): Observable<RemoteData<PaginatedList<Collection>>> {
|
||||||
const searchHref = 'findSubmitAuthorized';
|
|
||||||
options = Object.assign({}, options, {
|
options = Object.assign({}, options, {
|
||||||
searchParams: [new RequestParam('query', query)],
|
searchParams: [new RequestParam('query', query)],
|
||||||
});
|
});
|
||||||
|
@@ -11,9 +11,11 @@ import { isNotEmpty } from '../../shared/empty.util';
|
|||||||
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
import { NotificationsService } from '../../shared/notifications/notifications.service';
|
||||||
import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model';
|
import { FollowLinkConfig } from '../../shared/utils/follow-link-config.model';
|
||||||
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
|
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
|
||||||
|
import { RequestParam } from '../cache/models/request-param.model';
|
||||||
import { ObjectCacheService } from '../cache/object-cache.service';
|
import { ObjectCacheService } from '../cache/object-cache.service';
|
||||||
import { Community } from '../shared/community.model';
|
import { Community } from '../shared/community.model';
|
||||||
import { HALEndpointService } from '../shared/hal-endpoint.service';
|
import { HALEndpointService } from '../shared/hal-endpoint.service';
|
||||||
|
import { getAllCompletedRemoteData } from '../shared/operators';
|
||||||
import { BitstreamDataService } from './bitstream-data.service';
|
import { BitstreamDataService } from './bitstream-data.service';
|
||||||
import { ComColDataService } from './comcol-data.service';
|
import { ComColDataService } from './comcol-data.service';
|
||||||
import { DSOChangeAnalyzer } from './dso-change-analyzer.service';
|
import { DSOChangeAnalyzer } from './dso-change-analyzer.service';
|
||||||
@@ -38,6 +40,32 @@ export class CommunityDataService extends ComColDataService<Community> {
|
|||||||
super('communities', requestService, rdbService, objectCache, halService, comparator, notificationsService, bitstreamDataService);
|
super('communities', requestService, rdbService, objectCache, halService, comparator, notificationsService, bitstreamDataService);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all communities the user is authorized to submit to
|
||||||
|
*
|
||||||
|
* @param query limit the returned community to those with metadata values
|
||||||
|
* matching the query terms.
|
||||||
|
* @param options The [[FindListOptions]] object
|
||||||
|
* @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's
|
||||||
|
* no valid cached version. Defaults to true
|
||||||
|
* @param reRequestOnStale Whether or not the request should automatically be re-
|
||||||
|
* requested after the response becomes stale
|
||||||
|
* @param linksToFollow List of {@link FollowLinkConfig} that indicate which
|
||||||
|
* {@link HALLink}s should be automatically resolved
|
||||||
|
* @return Observable<RemoteData<PaginatedList<Community>>>
|
||||||
|
* community list
|
||||||
|
*/
|
||||||
|
getAuthorizedCommunity(query: string, options: FindListOptions = {}, useCachedVersionIfAvailable = true, reRequestOnStale = true, ...linksToFollow: FollowLinkConfig<Community>[]): Observable<RemoteData<PaginatedList<Community>>> {
|
||||||
|
const searchHref = 'findAdminAuthorized';
|
||||||
|
options = Object.assign({}, options, {
|
||||||
|
searchParams: [new RequestParam('query', query)],
|
||||||
|
});
|
||||||
|
|
||||||
|
return this.searchBy(searchHref, options, useCachedVersionIfAvailable, reRequestOnStale, ...linksToFollow).pipe(
|
||||||
|
getAllCompletedRemoteData(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// this method is overridden in order to make it public
|
// this method is overridden in order to make it public
|
||||||
getEndpoint() {
|
getEndpoint() {
|
||||||
return this.halService.getEndpoint(this.linkPath);
|
return this.halService.getEndpoint(this.linkPath);
|
||||||
|
@@ -111,7 +111,7 @@ export class VersionHistoryDataService extends IdentifiableDataService<VersionHi
|
|||||||
|
|
||||||
this.halService.getEndpoint(this.versionsEndpoint).pipe(
|
this.halService.getEndpoint(this.versionsEndpoint).pipe(
|
||||||
take(1),
|
take(1),
|
||||||
map((endpointUrl: string) => (summary?.length > 0) ? `${endpointUrl}?summary=${summary}` : `${endpointUrl}`),
|
map((endpointUrl: string) => (summary?.length > 0) ? `${endpointUrl}?summary=${encodeURIComponent(summary)}` : `${endpointUrl}`),
|
||||||
find((href: string) => hasValue(href)),
|
find((href: string) => hasValue(href)),
|
||||||
).subscribe((href) => {
|
).subscribe((href) => {
|
||||||
const request = new PostRequest(requestId, href, itemHref, requestOptions);
|
const request = new PostRequest(requestId, href, itemHref, requestOptions);
|
||||||
|
@@ -4,7 +4,9 @@ import { makeEnvironmentProviders } from '@angular/core';
|
|||||||
import { environment } from '../../environments/environment';
|
import { environment } from '../../environments/environment';
|
||||||
import { Itemfilter } from '../admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters';
|
import { Itemfilter } from '../admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters';
|
||||||
import { LdnService } from '../admin/admin-ldn-services/ldn-services-model/ldn-services.model';
|
import { LdnService } from '../admin/admin-ldn-services/ldn-services-model/ldn-services.model';
|
||||||
|
import { AdminNotifyMessage } from '../admin/admin-notify-dashboard/models/admin-notify-message.model';
|
||||||
import { NotifyRequestsStatus } from '../item-page/simple/notify-requests-status/notify-requests-status.model';
|
import { NotifyRequestsStatus } from '../item-page/simple/notify-requests-status/notify-requests-status.model';
|
||||||
|
import { Filetypes } from '../process-page/processes/filetypes.model';
|
||||||
import { Process } from '../process-page/processes/process.model';
|
import { Process } from '../process-page/processes/process.model';
|
||||||
import { Script } from '../process-page/scripts/script.model';
|
import { Script } from '../process-page/scripts/script.model';
|
||||||
import { EndpointMockingRestService } from '../shared/mocks/dspace-rest/endpoint-mocking-rest.service';
|
import { EndpointMockingRestService } from '../shared/mocks/dspace-rest/endpoint-mocking-rest.service';
|
||||||
@@ -14,26 +16,41 @@ import {
|
|||||||
} from '../shared/mocks/dspace-rest/mocks/response-map.mock';
|
} from '../shared/mocks/dspace-rest/mocks/response-map.mock';
|
||||||
import { AccessStatusObject } from '../shared/object-collection/shared/badges/access-status-badge/access-status.model';
|
import { AccessStatusObject } from '../shared/object-collection/shared/badges/access-status-badge/access-status.model';
|
||||||
import { IdentifierData } from '../shared/object-list/identifier-data/identifier-data.model';
|
import { IdentifierData } from '../shared/object-list/identifier-data/identifier-data.model';
|
||||||
|
import { ListableNotificationObject } from '../shared/object-list/listable-notification-object/listable-notification-object.model';
|
||||||
|
import { FacetConfigResponse } from '../shared/search/models/facet-config-response.model';
|
||||||
|
import { FacetValues } from '../shared/search/models/facet-values.model';
|
||||||
|
import { SearchFilterConfig } from '../shared/search/models/search-filter-config.model';
|
||||||
|
import { SearchObjects } from '../shared/search/models/search-objects.model';
|
||||||
|
import { SearchResult } from '../shared/search/models/search-result.model';
|
||||||
import { Subscription } from '../shared/subscriptions/models/subscription.model';
|
import { Subscription } from '../shared/subscriptions/models/subscription.model';
|
||||||
|
import { StatisticsEndpoint } from '../statistics/statistics-endpoint.model';
|
||||||
import { SubmissionCoarNotifyConfig } from '../submission/sections/section-coar-notify/submission-coar-notify.config';
|
import { SubmissionCoarNotifyConfig } from '../submission/sections/section-coar-notify/submission-coar-notify.config';
|
||||||
import { SystemWideAlert } from '../system-wide-alert/system-wide-alert.model';
|
import { SystemWideAlert } from '../system-wide-alert/system-wide-alert.model';
|
||||||
import { AuthStatus } from './auth/models/auth-status.model';
|
import { AuthStatus } from './auth/models/auth-status.model';
|
||||||
import { ShortLivedToken } from './auth/models/short-lived-token.model';
|
import { ShortLivedToken } from './auth/models/short-lived-token.model';
|
||||||
import { BulkAccessConditionOptions } from './config/models/bulk-access-condition-options.model';
|
import { BulkAccessConditionOptions } from './config/models/bulk-access-condition-options.model';
|
||||||
|
import { SubmissionAccessModel } from './config/models/config-submission-access.model';
|
||||||
import { SubmissionAccessesModel } from './config/models/config-submission-accesses.model';
|
import { SubmissionAccessesModel } from './config/models/config-submission-accesses.model';
|
||||||
|
import { SubmissionDefinitionModel } from './config/models/config-submission-definition.model';
|
||||||
import { SubmissionDefinitionsModel } from './config/models/config-submission-definitions.model';
|
import { SubmissionDefinitionsModel } from './config/models/config-submission-definitions.model';
|
||||||
|
import { SubmissionFormModel } from './config/models/config-submission-form.model';
|
||||||
import { SubmissionFormsModel } from './config/models/config-submission-forms.model';
|
import { SubmissionFormsModel } from './config/models/config-submission-forms.model';
|
||||||
import { SubmissionSectionModel } from './config/models/config-submission-section.model';
|
import { SubmissionSectionModel } from './config/models/config-submission-section.model';
|
||||||
|
import { SubmissionSectionsModel } from './config/models/config-submission-sections.model';
|
||||||
|
import { SubmissionUploadModel } from './config/models/config-submission-upload.model';
|
||||||
import { SubmissionUploadsModel } from './config/models/config-submission-uploads.model';
|
import { SubmissionUploadsModel } from './config/models/config-submission-uploads.model';
|
||||||
|
import { PaginatedList } from './data/paginated-list.model';
|
||||||
import { Root } from './data/root.model';
|
import { Root } from './data/root.model';
|
||||||
import { DspaceRestService } from './dspace-rest/dspace-rest.service';
|
import { DspaceRestService } from './dspace-rest/dspace-rest.service';
|
||||||
import { EPerson } from './eperson/models/eperson.model';
|
import { EPerson } from './eperson/models/eperson.model';
|
||||||
import { Group } from './eperson/models/group.model';
|
import { Group } from './eperson/models/group.model';
|
||||||
|
import { Feedback } from './feedback/models/feedback.model';
|
||||||
import { MetadataField } from './metadata/metadata-field.model';
|
import { MetadataField } from './metadata/metadata-field.model';
|
||||||
import { MetadataSchema } from './metadata/metadata-schema.model';
|
import { MetadataSchema } from './metadata/metadata-schema.model';
|
||||||
import { QualityAssuranceEventObject } from './notifications/qa/models/quality-assurance-event.model';
|
import { QualityAssuranceEventObject } from './notifications/qa/models/quality-assurance-event.model';
|
||||||
import { QualityAssuranceSourceObject } from './notifications/qa/models/quality-assurance-source.model';
|
import { QualityAssuranceSourceObject } from './notifications/qa/models/quality-assurance-source.model';
|
||||||
import { QualityAssuranceTopicObject } from './notifications/qa/models/quality-assurance-topic.model';
|
import { QualityAssuranceTopicObject } from './notifications/qa/models/quality-assurance-topic.model';
|
||||||
|
import { Suggestion } from './notifications/suggestions/models/suggestion.model';
|
||||||
import { SuggestionSource } from './notifications/suggestions/models/suggestion-source.model';
|
import { SuggestionSource } from './notifications/suggestions/models/suggestion-source.model';
|
||||||
import { SuggestionTarget } from './notifications/suggestions/models/suggestion-target.model';
|
import { SuggestionTarget } from './notifications/suggestions/models/suggestion-target.model';
|
||||||
import { OrcidHistory } from './orcid/model/orcid-history.model';
|
import { OrcidHistory } from './orcid/model/orcid-history.model';
|
||||||
@@ -49,6 +66,7 @@ import { Bundle } from './shared/bundle.model';
|
|||||||
import { Collection } from './shared/collection.model';
|
import { Collection } from './shared/collection.model';
|
||||||
import { Community } from './shared/community.model';
|
import { Community } from './shared/community.model';
|
||||||
import { ConfigurationProperty } from './shared/configuration-property.model';
|
import { ConfigurationProperty } from './shared/configuration-property.model';
|
||||||
|
import { ContentSource } from './shared/content-source.model';
|
||||||
import { DSpaceObject } from './shared/dspace-object.model';
|
import { DSpaceObject } from './shared/dspace-object.model';
|
||||||
import { ExternalSource } from './shared/external-source.model';
|
import { ExternalSource } from './shared/external-source.model';
|
||||||
import { ExternalSourceEntry } from './shared/external-source-entry.model';
|
import { ExternalSourceEntry } from './shared/external-source-entry.model';
|
||||||
@@ -70,6 +88,7 @@ import { ValueListBrowseDefinition } from './shared/value-list-browse-definition
|
|||||||
import { Version } from './shared/version.model';
|
import { Version } from './shared/version.model';
|
||||||
import { VersionHistory } from './shared/version-history.model';
|
import { VersionHistory } from './shared/version-history.model';
|
||||||
import { UsageReport } from './statistics/models/usage-report.model';
|
import { UsageReport } from './statistics/models/usage-report.model';
|
||||||
|
import { CorrectionType } from './submission/models/correctiontype.model';
|
||||||
import { SubmissionCcLicence } from './submission/models/submission-cc-license.model';
|
import { SubmissionCcLicence } from './submission/models/submission-cc-license.model';
|
||||||
import { SubmissionCcLicenceUrl } from './submission/models/submission-cc-license-url.model';
|
import { SubmissionCcLicenceUrl } from './submission/models/submission-cc-license-url.model';
|
||||||
import { WorkflowItem } from './submission/models/workflowitem.model';
|
import { WorkflowItem } from './submission/models/workflowitem.model';
|
||||||
@@ -77,6 +96,7 @@ import { WorkspaceItem } from './submission/models/workspaceitem.model';
|
|||||||
import { Vocabulary } from './submission/vocabularies/models/vocabulary.model';
|
import { Vocabulary } from './submission/vocabularies/models/vocabulary.model';
|
||||||
import { VocabularyEntry } from './submission/vocabularies/models/vocabulary-entry.model';
|
import { VocabularyEntry } from './submission/vocabularies/models/vocabulary-entry.model';
|
||||||
import { VocabularyEntryDetail } from './submission/vocabularies/models/vocabulary-entry-detail.model';
|
import { VocabularyEntryDetail } from './submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||||
|
import { SupervisionOrder } from './supervision-order/models/supervision-order.model';
|
||||||
import { AdvancedWorkflowInfo } from './tasks/models/advanced-workflow-info.model';
|
import { AdvancedWorkflowInfo } from './tasks/models/advanced-workflow-info.model';
|
||||||
import { ClaimedTask } from './tasks/models/claimed-task-object.model';
|
import { ClaimedTask } from './tasks/models/claimed-task-object.model';
|
||||||
import { PoolTask } from './tasks/models/pool-task-object.model';
|
import { PoolTask } from './tasks/models/pool-task-object.model';
|
||||||
@@ -164,11 +184,9 @@ export const models =
|
|||||||
VocabularyEntryDetail,
|
VocabularyEntryDetail,
|
||||||
ConfigurationProperty,
|
ConfigurationProperty,
|
||||||
ShortLivedToken,
|
ShortLivedToken,
|
||||||
Registration,
|
|
||||||
UsageReport,
|
UsageReport,
|
||||||
QualityAssuranceTopicObject,
|
QualityAssuranceTopicObject,
|
||||||
QualityAssuranceEventObject,
|
QualityAssuranceEventObject,
|
||||||
Root,
|
|
||||||
SearchConfig,
|
SearchConfig,
|
||||||
SubmissionAccessesModel,
|
SubmissionAccessesModel,
|
||||||
QualityAssuranceSourceObject,
|
QualityAssuranceSourceObject,
|
||||||
@@ -187,4 +205,24 @@ export const models =
|
|||||||
SubmissionCoarNotifyConfig,
|
SubmissionCoarNotifyConfig,
|
||||||
NotifyRequestsStatus,
|
NotifyRequestsStatus,
|
||||||
SystemWideAlert,
|
SystemWideAlert,
|
||||||
|
AdminNotifyMessage,
|
||||||
|
SubmissionAccessModel,
|
||||||
|
SubmissionDefinitionModel,
|
||||||
|
SubmissionFormModel,
|
||||||
|
SubmissionSectionsModel,
|
||||||
|
SubmissionUploadModel,
|
||||||
|
PaginatedList,
|
||||||
|
Feedback,
|
||||||
|
Suggestion,
|
||||||
|
Filetypes,
|
||||||
|
ContentSource,
|
||||||
|
ListableNotificationObject,
|
||||||
|
FacetConfigResponse,
|
||||||
|
FacetValues,
|
||||||
|
SearchFilterConfig,
|
||||||
|
SearchObjects,
|
||||||
|
SearchResult,
|
||||||
|
StatisticsEndpoint,
|
||||||
|
CorrectionType,
|
||||||
|
SupervisionOrder,
|
||||||
];
|
];
|
||||||
|
@@ -6,13 +6,14 @@
|
|||||||
* http://www.dspace.org/license/
|
* http://www.dspace.org/license/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { XhrFactory } from '@angular/common';
|
|
||||||
import { Injectable } from '@angular/core';
|
|
||||||
import {
|
import {
|
||||||
Agent as HttpAgent,
|
Agent as HttpAgent,
|
||||||
AgentOptions as HttpAgentOptions,
|
AgentOptions as HttpAgentOptions,
|
||||||
} from 'http';
|
} from 'node:http';
|
||||||
import { Agent as HttpsAgent } from 'https';
|
import { Agent as HttpsAgent } from 'node:https';
|
||||||
|
|
||||||
|
import { XhrFactory } from '@angular/common';
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
import {
|
import {
|
||||||
prototype,
|
prototype,
|
||||||
XMLHttpRequest,
|
XMLHttpRequest,
|
||||||
|
@@ -183,7 +183,7 @@ export class SearchConfigurationService implements OnDestroy {
|
|||||||
*/
|
*/
|
||||||
getCurrentQuery(defaultQuery: string) {
|
getCurrentQuery(defaultQuery: string) {
|
||||||
return this.routeService.getQueryParameterValue('query').pipe(map((query) => {
|
return this.routeService.getQueryParameterValue('query').pipe(map((query) => {
|
||||||
return query || defaultQuery;
|
return query !== null ? query : defaultQuery; // Allow querying when the value is empty
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<ds-dso-edit-menu></ds-dso-edit-menu>
|
<ds-dso-edit-menu></ds-dso-edit-menu>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
||||||
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
|
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
|
||||||
</ds-metadata-field-wrapper>
|
</ds-metadata-field-wrapper>
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
[label]="'journalissue.page.journal-issn'">
|
[label]="'journalissue.page.journal-issn'">
|
||||||
</ds-generic-item-page-field>
|
</ds-generic-item-page-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-12 col-md-6">
|
<div class="col-12 col-md-6">
|
||||||
<ds-related-items
|
<ds-related-items
|
||||||
[parentItem]="object"
|
[parentItem]="object"
|
||||||
[relationType]="'isJournalVolumeOfIssue'"
|
[relationType]="'isJournalVolumeOfIssue'"
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<ds-dso-edit-menu></ds-dso-edit-menu>
|
<ds-dso-edit-menu></ds-dso-edit-menu>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
||||||
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
|
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
|
||||||
</ds-metadata-field-wrapper>
|
</ds-metadata-field-wrapper>
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
[label]="'journalvolume.page.issuedate'">
|
[label]="'journalvolume.page.issuedate'">
|
||||||
</ds-generic-item-page-field>
|
</ds-generic-item-page-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-12 col-md-6">
|
<div class="col-12 col-md-6">
|
||||||
<ds-related-items
|
<ds-related-items
|
||||||
[parentItem]="object"
|
[parentItem]="object"
|
||||||
[relationType]="'isJournalOfVolume'"
|
[relationType]="'isJournalOfVolume'"
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<ds-dso-edit-menu></ds-dso-edit-menu>
|
<ds-dso-edit-menu></ds-dso-edit-menu>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
||||||
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
|
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
|
||||||
</ds-metadata-field-wrapper>
|
</ds-metadata-field-wrapper>
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
[label]="'journal.page.editor'">
|
[label]="'journal.page.editor'">
|
||||||
</ds-generic-item-page-field>
|
</ds-generic-item-page-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-12 col-md-6">
|
<div class="col-12 col-md-6">
|
||||||
<ds-related-items
|
<ds-related-items
|
||||||
[parentItem]="object"
|
[parentItem]="object"
|
||||||
[relationType]="'isVolumeOfJournal'"
|
[relationType]="'isVolumeOfJournal'"
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<ds-dso-edit-menu></ds-dso-edit-menu>
|
<ds-dso-edit-menu></ds-dso-edit-menu>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
||||||
<ds-thumbnail [thumbnail]="object?.thumbnail | async"
|
<ds-thumbnail [thumbnail]="object?.thumbnail | async"
|
||||||
[defaultImage]="'assets/images/orgunit-placeholder.svg'"
|
[defaultImage]="'assets/images/orgunit-placeholder.svg'"
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
[label]="'orgunit.page.id'">
|
[label]="'orgunit.page.id'">
|
||||||
</ds-generic-item-page-field>
|
</ds-generic-item-page-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-12 col-md-7">
|
<div class="col-12 col-md-7">
|
||||||
<ds-item-page-img-field
|
<ds-item-page-img-field
|
||||||
[fields]="['organization.identifier.ror']"
|
[fields]="['organization.identifier.ror']"
|
||||||
[img]="{
|
[img]="{
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<ds-dso-edit-menu></ds-dso-edit-menu>
|
<ds-dso-edit-menu></ds-dso-edit-menu>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
||||||
<ds-thumbnail [thumbnail]="object?.thumbnail | async"
|
<ds-thumbnail [thumbnail]="object?.thumbnail | async"
|
||||||
[defaultImage]="'assets/images/person-placeholder.svg'"
|
[defaultImage]="'assets/images/person-placeholder.svg'"
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
[label]="'person.page.birthdate'">
|
[label]="'person.page.birthdate'">
|
||||||
</ds-generic-item-page-field>
|
</ds-generic-item-page-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-12 col-md-7">
|
<div class="col-12 col-md-7">
|
||||||
<ds-related-items
|
<ds-related-items
|
||||||
[parentItem]="object"
|
[parentItem]="object"
|
||||||
[relationType]="'isProjectOfPerson'"
|
[relationType]="'isProjectOfPerson'"
|
||||||
|
@@ -7,7 +7,7 @@
|
|||||||
<ds-dso-edit-menu></ds-dso-edit-menu>
|
<ds-dso-edit-menu></ds-dso-edit-menu>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
||||||
<ds-thumbnail
|
<ds-thumbnail
|
||||||
[thumbnail]="object?.thumbnail | async"
|
[thumbnail]="object?.thumbnail | async"
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
<!--[label]="'project.page.expectedcompletion'">-->
|
<!--[label]="'project.page.expectedcompletion'">-->
|
||||||
<!--</ds-generic-item-page-field>-->
|
<!--</ds-generic-item-page-field>-->
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-12 col-md-7">
|
<div class="col-12 col-md-7">
|
||||||
<ds-related-items
|
<ds-related-items
|
||||||
[parentItem]="object"
|
[parentItem]="object"
|
||||||
[relationType]="'isPersonOfProject'"
|
[relationType]="'isPersonOfProject'"
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
[innerHTML]="mdRepresentation.getValue()"
|
[innerHTML]="mdRepresentation.getValue()"
|
||||||
[ngbTooltip]="mdRepresentation.allMetadata(['person.jobTitle']).length > 0 ? descTemplate : null"></a>
|
[ngbTooltip]="mdRepresentation.allMetadata(['person.jobTitle']).length > 0 ? descTemplate : null"></a>
|
||||||
@if (mdRepresentation.firstMetadata('person.identifier.orcid')) {
|
@if (mdRepresentation.firstMetadata('person.identifier.orcid')) {
|
||||||
<ds-orcid-badge-and-tooltip class="ml-1"
|
<ds-orcid-badge-and-tooltip class="ms-1"
|
||||||
[orcid]="mdRepresentation.firstMetadata('person.identifier.orcid')"
|
[orcid]="mdRepresentation.firstMetadata('person.identifier.orcid')"
|
||||||
[authenticatedTimestamp]="mdRepresentation.firstMetadata('dspace.orcid.authenticated')">
|
[authenticatedTimestamp]="mdRepresentation.firstMetadata('dspace.orcid.authenticated')">
|
||||||
</ds-orcid-badge-and-tooltip>
|
</ds-orcid-badge-and-tooltip>
|
||||||
|
@@ -3,8 +3,8 @@
|
|||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<form [formGroup]="emailForm" (ngSubmit)="submitForm()">
|
<form [formGroup]="emailForm" (ngSubmit)="submitForm()">
|
||||||
<div class="form-group">
|
<div class="mb-3">
|
||||||
<div class="form-row">
|
<div class="row">
|
||||||
<div class="col-12 my-2">
|
<div class="col-12 my-2">
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<button type="submit" class="btn btn-lg btn-primary w-100">
|
<button type="submit" class="btn btn-lg btn-primary w-100">
|
||||||
{{ "external-login.confirm.button.label" | translate }}
|
{{ "external-login.confirm.button.label" | translate }}
|
||||||
|
@@ -3,8 +3,8 @@
|
|||||||
</h4>
|
</h4>
|
||||||
|
|
||||||
<form [formGroup]="emailForm" (ngSubmit)="submitForm()">
|
<form [formGroup]="emailForm" (ngSubmit)="submitForm()">
|
||||||
<div class="form-group">
|
<div class="mb-3">
|
||||||
<div class="form-row">
|
<div class="row">
|
||||||
<div class="col-12 my-2">
|
<div class="col-12 my-2">
|
||||||
<input
|
<input
|
||||||
type="email"
|
type="email"
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<button type="submit" class="btn btn-lg btn-primary w-100">
|
<button type="submit" class="btn btn-lg btn-primary w-100">
|
||||||
{{ "external-login.provide-email.button.label" | translate }}
|
{{ "external-login.provide-email.button.label" | translate }}
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<form class="form-login"
|
<form class="form-login"
|
||||||
[formGroup]="form" novalidate>
|
[formGroup]="form" novalidate>
|
||||||
<label class="font-weight-bold mb-0 text-uppercase">{{ registrationData.registrationType }}</label>
|
<label class="fw-bold mb-0 text-uppercase">{{ registrationData.registrationType }}</label>
|
||||||
<input [attr.aria-label]="'external-login-page.orcid-confirmation.netid.label' | translate"
|
<input [attr.aria-label]="'external-login-page.orcid-confirmation.netid.label' | translate"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
autofocus
|
autofocus
|
||||||
@@ -9,14 +9,14 @@
|
|||||||
[placeholder]="'external-login-page.orcid-confirmation.netid.placeholder' | translate"
|
[placeholder]="'external-login-page.orcid-confirmation.netid.placeholder' | translate"
|
||||||
type="text"
|
type="text"
|
||||||
[attr.data-test]="'netId' | dsBrowserOnly">
|
[attr.data-test]="'netId' | dsBrowserOnly">
|
||||||
<label class="font-weight-bold mb-0">{{"external-login-page.orcid-confirmation.lastname" | translate}}</label>
|
<label class="fw-bold mb-0">{{"external-login-page.orcid-confirmation.lastname" | translate}}</label>
|
||||||
<input [attr.aria-label]="'external-login-page.orcid-confirmation.lastname.label' | translate"
|
<input [attr.aria-label]="'external-login-page.orcid-confirmation.lastname.label' | translate"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
class="form-control form-control-lg position-relative mb-2"
|
class="form-control form-control-lg position-relative mb-2"
|
||||||
formControlName="lastname"
|
formControlName="lastname"
|
||||||
type="text"
|
type="text"
|
||||||
[attr.data-test]="'lastname' | dsBrowserOnly">
|
[attr.data-test]="'lastname' | dsBrowserOnly">
|
||||||
<label class="font-weight-bold mb-0">{{"external-login-page.orcid-confirmation.firstname" | translate}}</label>
|
<label class="fw-bold mb-0">{{"external-login-page.orcid-confirmation.firstname" | translate}}</label>
|
||||||
<input [attr.aria-label]="'external-login-page.orcid-confirmation.firstname.label' | translate"
|
<input [attr.aria-label]="'external-login-page.orcid-confirmation.firstname.label' | translate"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
class="form-control form-control-lg position-relative mb-2"
|
class="form-control form-control-lg position-relative mb-2"
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
type="text"
|
type="text"
|
||||||
[attr.data-test]="'firstname' | dsBrowserOnly">
|
[attr.data-test]="'firstname' | dsBrowserOnly">
|
||||||
@if (registrationData?.email) {
|
@if (registrationData?.email) {
|
||||||
<label class="font-weight-bold mb-0">{{"external-login-page.orcid-confirmation.email" | translate}}</label>
|
<label class="fw-bold mb-0">{{"external-login-page.orcid-confirmation.email" | translate}}</label>
|
||||||
<input [attr.aria-label]="'external-login-page.orcid-confirmation.email.label' | translate"
|
<input [attr.aria-label]="'external-login-page.orcid-confirmation.email.label' | translate"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
class="form-control form-control-lg position-relative"
|
class="form-control form-control-lg position-relative"
|
||||||
|
@@ -6,15 +6,15 @@
|
|||||||
<thead class="thead-light">
|
<thead class="thead-light">
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col">
|
<th scope="col">
|
||||||
<span class="h5 font-weight-bold">{{ 'external-login-validation.review-account-info.table.header.information' | translate }}</span>
|
<span class="h5 fw-bold">{{ 'external-login-validation.review-account-info.table.header.information' | translate }}</span>
|
||||||
</th>
|
</th>
|
||||||
<th scope="col">
|
<th scope="col">
|
||||||
<span class="h5 font-weight-bold">{{'external-login-validation.review-account-info.table.header.received-value' | translate }}</span>
|
<span class="h5 fw-bold">{{'external-login-validation.review-account-info.table.header.received-value' | translate }}</span>
|
||||||
</th>
|
</th>
|
||||||
<th scope="col">
|
<th scope="col">
|
||||||
<span class="h5 font-weight-bold">{{'external-login-validation.review-account-info.table.header.current-value' | translate }}</span>
|
<span class="h5 fw-bold">{{'external-login-validation.review-account-info.table.header.current-value' | translate }}</span>
|
||||||
</th>
|
</th>
|
||||||
<th scope="col"><span class="h5 font-weight-bold">{{'external-login-validation.review-account-info.table.header.action' | translate }}</span></th>
|
<th scope="col"><span class="h5 fw-bold">{{'external-login-validation.review-account-info.table.header.action' | translate }}</span></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
@@ -53,7 +53,7 @@
|
|||||||
<div class="content-container align-self-center">
|
<div class="content-container align-self-center">
|
||||||
<p class="m-0">
|
<p class="m-0">
|
||||||
<a class="text-white"
|
<a class="text-white"
|
||||||
href="http://www.dspace.org/" role="link" tabindex="0">{{ 'footer.link.dspace' | translate}}</a>
|
href="https://www.dspace.org/" role="link" tabindex="0">{{ 'footer.link.dspace' | translate}}</a>
|
||||||
{{ 'footer.copyright' | translate:{year: dateObj | date:'y'} }}
|
{{ 'footer.copyright' | translate:{year: dateObj | date:'y'} }}
|
||||||
<a class="text-white"
|
<a class="text-white"
|
||||||
href="https://www.lyrasis.org/" role="link" tabindex="0">{{ 'footer.link.lyrasis' | translate}}</a>
|
href="https://www.lyrasis.org/" role="link" tabindex="0">{{ 'footer.link.lyrasis' | translate}}</a>
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<div class="jumbotron py-4 px-2 py-sm-5 px-sm-0 mt-ncs mb-4">
|
<div class="home-news-content py-4 px-2 py-sm-5 px-sm-0 mt-ncs mb-4">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="d-flex flex-wrap">
|
<div class="d-flex flex-wrap">
|
||||||
<div>
|
<div>
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
.jumbotron {
|
.home-news-content {
|
||||||
background-color: var(--ds-home-news-background-color);
|
background-color: var(--ds-home-news-background-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
<h2>{{ 'info.accessibility-settings.title' | translate }}</h2>
|
<h2>{{ 'info.accessibility-settings.title' | translate }}</h2>
|
||||||
|
|
||||||
<form>
|
<form>
|
||||||
<div class="form-group row">
|
<div class="mb-3 row">
|
||||||
<label [for]="'disableNotificationTimeOutInput'" class="col-sm-4 col-form-label">
|
<label [for]="'disableNotificationTimeOutInput'" class="col-sm-4 col-form-label">
|
||||||
{{ 'info.accessibility-settings.disableNotificationTimeOut.label' | translate }}
|
{{ 'info.accessibility-settings.disableNotificationTimeOut.label' | translate }}
|
||||||
</label>
|
</label>
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group row">
|
<div class="mb-3 row">
|
||||||
<label [for]="'notificationTimeOutInput'" class="col-sm-4 col-form-label">
|
<label [for]="'notificationTimeOutInput'" class="col-sm-4 col-form-label">
|
||||||
{{ 'info.accessibility-settings.notificationTimeOut.label' | translate }}
|
{{ 'info.accessibility-settings.notificationTimeOut.label' | translate }}
|
||||||
</label>
|
</label>
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group row">
|
<div class="mb-3 row">
|
||||||
<label [for]="'liveRegionTimeOutInput'" class="col-sm-4 col-form-label">
|
<label [for]="'liveRegionTimeOutInput'" class="col-sm-4 col-form-label">
|
||||||
{{ 'info.accessibility-settings.liveRegionTimeOut.label' | translate }}
|
{{ 'info.accessibility-settings.liveRegionTimeOut.label' | translate }}
|
||||||
</label>
|
</label>
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div role="group">
|
<div role="group">
|
||||||
<button type="submit" (click)="saveSettings()" class="btn btn-primary mr-2">
|
<button type="submit" (click)="saveSettings()" class="btn btn-primary me-2">
|
||||||
{{ 'info.accessibility-settings.submit' | translate }}
|
{{ 'info.accessibility-settings.submit' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button (click)="resetSettings()" class="btn btn-warning">
|
<button (click)="resetSettings()" class="btn btn-warning">
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<div class="row row-offcanvas row-offcanvas-right">
|
<div class="row row-offcanvas row-offcanvas-right">
|
||||||
<div class="col-xs-12 col-sm-12 col-md-9">
|
<div class="col-12 col-sm-12 col-md-9">
|
||||||
<h1>{{ 'info.feedback.head' | translate }}</h1>
|
<h1>{{ 'info.feedback.head' | translate }}</h1>
|
||||||
<p>{{ 'info.feedback.info' | translate }}</p>
|
<p>{{ 'info.feedback.info' | translate }}</p>
|
||||||
<form [formGroup]="feedbackForm" (ngSubmit)="createFeedback()" class="col p-0">
|
<form [formGroup]="feedbackForm" (ngSubmit)="createFeedback()" class="col p-0">
|
||||||
|
@@ -1,7 +1,3 @@
|
|||||||
import {
|
|
||||||
AsyncPipe,
|
|
||||||
NgIf,
|
|
||||||
} from '@angular/common';
|
|
||||||
import {
|
import {
|
||||||
Component,
|
Component,
|
||||||
CUSTOM_ELEMENTS_SCHEMA,
|
CUSTOM_ELEMENTS_SCHEMA,
|
||||||
@@ -11,21 +7,14 @@ import {
|
|||||||
Output,
|
Output,
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import { ReactiveFormsModule } from '@angular/forms';
|
import { ReactiveFormsModule } from '@angular/forms';
|
||||||
import { RouterLink } from '@angular/router';
|
|
||||||
import { TranslateModule } from '@ngx-translate/core';
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
|
||||||
import { VarDirective } from '../../../shared/utils/var.directive';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ds-altcha-captcha',
|
selector: 'ds-altcha-captcha',
|
||||||
templateUrl: './altcha-captcha.component.html',
|
templateUrl: './altcha-captcha.component.html',
|
||||||
imports: [
|
imports: [
|
||||||
AsyncPipe,
|
|
||||||
NgIf,
|
|
||||||
ReactiveFormsModule,
|
ReactiveFormsModule,
|
||||||
RouterLink,
|
|
||||||
TranslateModule,
|
TranslateModule,
|
||||||
VarDirective,
|
|
||||||
],
|
],
|
||||||
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
||||||
standalone: true,
|
standalone: true,
|
||||||
|
@@ -58,13 +58,13 @@
|
|||||||
<div class="row mb-4">
|
<div class="row mb-4">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<div>{{'bitstream-request-a-copy.allfiles.label' |translate}}</div>
|
<div>{{'bitstream-request-a-copy.allfiles.label' |translate}}</div>
|
||||||
<div class="ms-4 form-check">
|
<div class="ms-2 form-check">
|
||||||
<input [className]="'form-check-input'" type="radio"
|
<input [className]="'form-check-input'" type="radio"
|
||||||
id="allfiles-true" formControlName="allfiles" value="true">
|
id="allfiles-true" formControlName="allfiles" value="true">
|
||||||
<label class="form-check-label"
|
<label class="form-check-label"
|
||||||
for="allfiles-true">{{'bitstream-request-a-copy.files-all-true.label' | translate}}</label>
|
for="allfiles-true">{{'bitstream-request-a-copy.files-all-true.label' | translate}}</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="ms-4">
|
<div class="ms-2 form-check">
|
||||||
<input [className]="'form-check-input'" type="radio"
|
<input [className]="'form-check-input'" type="radio"
|
||||||
id="allfiles-false" formControlName="allfiles" value="false" [attr.disabled]="bitstream === undefined ? true : null ">
|
id="allfiles-false" formControlName="allfiles" value="false" [attr.disabled]="bitstream === undefined ? true : null ">
|
||||||
<label class="form-check-label"
|
<label class="form-check-label"
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import {
|
import {
|
||||||
AsyncPipe,
|
AsyncPipe,
|
||||||
CommonModule,
|
NgClass,
|
||||||
} from '@angular/common';
|
} from '@angular/common';
|
||||||
import {
|
import {
|
||||||
ChangeDetectorRef,
|
ChangeDetectorRef,
|
||||||
@@ -72,8 +72,8 @@ import { ItemEditBitstreamBundleComponent } from './item-edit-bitstream-bundle/i
|
|||||||
AlertComponent,
|
AlertComponent,
|
||||||
AsyncPipe,
|
AsyncPipe,
|
||||||
BtnDisabledDirective,
|
BtnDisabledDirective,
|
||||||
CommonModule,
|
|
||||||
ItemEditBitstreamBundleComponent,
|
ItemEditBitstreamBundleComponent,
|
||||||
|
NgClass,
|
||||||
RouterLink,
|
RouterLink,
|
||||||
ThemedLoadingComponent,
|
ThemedLoadingComponent,
|
||||||
TranslateModule,
|
TranslateModule,
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
<table class="table" [class.mt-n1]="!isFirstTable"
|
<table class="table" [class.mt-n1]="!isFirstTable"
|
||||||
[attr.aria-label]="'item.edit.bitstreams.bundle.table.aria-label' | translate: { bundle: bundleName } ">
|
[attr.aria-label]="'item.edit.bitstreams.bundle.table.aria-label' | translate: { bundle: bundleName } ">
|
||||||
<thead [class.visually-hidden]="!isFirstTable">
|
<thead [class.visually-hidden]="!isFirstTable">
|
||||||
<tr class="header-row font-weight-bold">
|
<tr class="header-row fw-bold">
|
||||||
<th id="name" scope="col" class="{{ columnSizes.columns[0].buildClasses() }}">
|
<th id="name" scope="col" class="{{ columnSizes.columns[0].buildClasses() }}">
|
||||||
{{'item.edit.bitstreams.headers.name' | translate}}
|
{{'item.edit.bitstreams.headers.name' | translate}}
|
||||||
</th>
|
</th>
|
||||||
@@ -31,10 +31,10 @@
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody cdkDropList (cdkDropListDropped)="drop($event)">
|
<tbody cdkDropList (cdkDropListDropped)="drop($event)">
|
||||||
<tr class="bundle-row">
|
<tr class="bundle-row">
|
||||||
<th id="{{ bundleName }}" class="span" colspan="3" scope="colgroup">
|
<th id="{{ bundleName }}" class="row-element" colspan="3" scope="colgroup">
|
||||||
{{'item.edit.bitstreams.bundle.name' | translate:{ name: bundleName } }}
|
{{'item.edit.bitstreams.bundle.name' | translate:{ name: bundleName } }}
|
||||||
</th>
|
</th>
|
||||||
<td class="text-center">
|
<td class="text-center row-element">
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<button [routerLink]="[itemPageRoute, 'bitstreams', 'new']"
|
<button [routerLink]="[itemPageRoute, 'bitstreams', 'new']"
|
||||||
[queryParams]="{bundle: bundle.id}"
|
[queryParams]="{bundle: bundle.id}"
|
||||||
@@ -43,9 +43,9 @@
|
|||||||
title="{{'item.edit.bitstreams.bundle.edit.buttons.upload' | translate}}">
|
title="{{'item.edit.bitstreams.bundle.edit.buttons.upload' | translate}}">
|
||||||
<i class="fas fa-upload fa-fw"></i>
|
<i class="fas fa-upload fa-fw"></i>
|
||||||
</button>
|
</button>
|
||||||
<div ngbDropdown #paginationControls="ngbDropdown" class="btn-group float-right btn-sm p-0"
|
<div ngbDropdown #paginationControls="ngbDropdown" class="btn-group float-end p-0"
|
||||||
placement="bottom-right">
|
container="body" placement="bottom-right">
|
||||||
<button class="btn btn-outline-secondary" id="paginationControls" ngbDropdownToggle
|
<button class="btn btn-outline-secondary btn-sm" id="paginationControls" ngbDropdownToggle
|
||||||
[title]="'pagination.options.description' | translate"
|
[title]="'pagination.options.description' | translate"
|
||||||
[attr.aria-label]="'pagination.options.description' | translate" aria-haspopup="true"
|
[attr.aria-label]="'pagination.options.description' | translate" aria-haspopup="true"
|
||||||
aria-expanded="false">
|
aria-expanded="false">
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
(cdkDragStarted)="dragStart()" (cdkDragEnded)="dragEnd()">
|
(cdkDragStarted)="dragStart()" (cdkDragEnded)="dragEnd()">
|
||||||
<th class="bitstream-name row-element {{ columnSizes.columns[0].buildClasses() }}"
|
<th class="bitstream-name row-element {{ columnSizes.columns[0].buildClasses() }}"
|
||||||
scope="row" id="{{ entry.nameStripped }}" headers="{{ bundleName }} name">
|
scope="row" id="{{ entry.nameStripped }}" headers="{{ bundleName }} name">
|
||||||
<div class="drag-handle text-muted float-left p-1 mr-2 d-inline" tabindex="0" cdkDragHandle
|
<div class="drag-handle text-muted float-start p-1 me-2 d-inline" tabindex="0" cdkDragHandle
|
||||||
(keydown.enter)="select($event, entry)" (keydown.space)="select($event, entry)" (click)="select($event, entry)">
|
(keydown.enter)="select($event, entry)" (keydown.space)="select($event, entry)" (click)="select($event, entry)">
|
||||||
<i class="fas fa-grip-vertical fa-fw"
|
<i class="fas fa-grip-vertical fa-fw"
|
||||||
[title]="'item.edit.bitstreams.edit.buttons.drag' | translate"></i>
|
[title]="'item.edit.bitstreams.edit.buttons.drag' | translate"></i>
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<div class="col-12 col-md-3 h-auto float-start d-flex action-label">
|
<div class="col-12 col-md-3 h-auto float-start d-flex action-label">
|
||||||
<span class="justify-content-center align-self-center font-weight-bold">
|
<span class="justify-content-center align-self-center fw-bold">
|
||||||
{{'item.edit.tabs.status.buttons.' + operation.operationKey + '.label' | translate}}
|
{{'item.edit.tabs.status.buttons.' + operation.operationKey + '.label' | translate}}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
@for (statusKey of statusDataKeys; track statusKey) {
|
@for (statusKey of statusDataKeys; track statusKey) {
|
||||||
<div class="w-100 pt-1">
|
<div class="w-100 pt-1">
|
||||||
<div class="col-12 col-md-3 float-start status-label font-weight-bold">
|
<div class="col-12 col-md-3 float-start status-label fw-bold">
|
||||||
{{'item.edit.tabs.status.labels.' + statusKey | translate}}:
|
{{'item.edit.tabs.status.labels.' + statusKey | translate}}:
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-md-9 float-start status-data" id="status-{{statusKey}}">
|
<div class="col-12 col-md-9 float-start status-data" id="status-{{statusKey}}">
|
||||||
@@ -15,17 +15,17 @@
|
|||||||
<div class="w-100 pt-1">
|
<div class="w-100 pt-1">
|
||||||
@if ((identifier.identifierType==='doi')) {
|
@if ((identifier.identifierType==='doi')) {
|
||||||
<div>
|
<div>
|
||||||
<div class="col-12 col-md-3 float-start status-label font-weight-bold">
|
<div class="col-12 col-md-3 float-start status-label fw-bold">
|
||||||
{{identifier.identifierType.toLocaleUpperCase()}}
|
{{identifier.identifierType.toLocaleUpperCase()}}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-md-9 float-start status-label font-weight-bold">{{identifier.value}}
|
<div class="col-12 col-md-9 float-start status-label fw-bold">{{identifier.value}}
|
||||||
({{"item.edit.identifiers.doi.status."+identifier.identifierStatus|translate}})</div>
|
({{"item.edit.identifiers.doi.status."+identifier.identifierStatus|translate}})</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="col-12 col-md-3 float-start status-label font-weight-bold">
|
<div class="col-12 col-md-3 float-start status-label fw-bold">
|
||||||
{{'item.edit.tabs.status.labels.itemPage' | translate}}:
|
{{'item.edit.tabs.status.labels.itemPage' | translate}}:
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-md-9 float-start status-data" id="status-itemPage">
|
<div class="col-12 col-md-9 float-start status-data" id="status-itemPage">
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
CommonModule,
|
AsyncPipe,
|
||||||
isPlatformBrowser,
|
isPlatformBrowser,
|
||||||
} from '@angular/common';
|
} from '@angular/common';
|
||||||
import {
|
import {
|
||||||
@@ -54,7 +54,7 @@ import { OrcidSyncSettingsComponent } from './orcid-sync-settings/orcid-sync-set
|
|||||||
styleUrls: ['./orcid-page.component.scss'],
|
styleUrls: ['./orcid-page.component.scss'],
|
||||||
imports: [
|
imports: [
|
||||||
AlertComponent,
|
AlertComponent,
|
||||||
CommonModule,
|
AsyncPipe,
|
||||||
OrcidAuthComponent,
|
OrcidAuthComponent,
|
||||||
OrcidQueueComponent,
|
OrcidQueueComponent,
|
||||||
OrcidSyncSettingsComponent,
|
OrcidSyncSettingsComponent,
|
||||||
|
@@ -1,12 +1,14 @@
|
|||||||
@if (isNotEmpty(points) || isNotEmpty(bboxes)) {
|
@if (isNotEmpty(points) || isNotEmpty(bboxes)) {
|
||||||
<div>
|
<div>
|
||||||
<ds-metadata-field-wrapper [label]="label | translate">
|
<ds-metadata-field-wrapper [label]="label | translate">
|
||||||
|
@defer {
|
||||||
<ds-geospatial-map [coordinates]="this.points"
|
<ds-geospatial-map [coordinates]="this.points"
|
||||||
[bbox]="this.bboxes"
|
[bbox]="this.bboxes"
|
||||||
[cluster]="this.cluster"
|
[cluster]="this.cluster"
|
||||||
[layout]="'item'"
|
[layout]="'item'"
|
||||||
style="width: 100%;">
|
style="width: 100%;">
|
||||||
</ds-geospatial-map>
|
</ds-geospatial-map>
|
||||||
|
}
|
||||||
</ds-metadata-field-wrapper>
|
</ds-metadata-field-wrapper>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
@@ -63,13 +63,15 @@ describe('GeospatialItemPageFieldComponent', () => {
|
|||||||
fixture = TestBed.createComponent(GeospatialItemPageFieldComponent);
|
fixture = TestBed.createComponent(GeospatialItemPageFieldComponent);
|
||||||
comp = fixture.componentInstance;
|
comp = fixture.componentInstance;
|
||||||
comp.item = mockItemWithMetadataFieldsAndValue([mockField], mockValue);
|
comp.item = mockItemWithMetadataFieldsAndValue([mockField], mockValue);
|
||||||
comp.fields = mockFields;
|
comp.pointFields = mockFields;
|
||||||
|
comp.bboxFields = mockFields;
|
||||||
comp.label = mockLabel;
|
comp.label = mockLabel;
|
||||||
|
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it('should initialize a map from passed points', () => {
|
it('should initialize a map from passed points', () => {
|
||||||
expect(fixture.nativeElement.querySelector('ds-geospatial-map[ng-reflect-coordinates="Point ( +174.000000 -042.00000"]')).toBeTruthy();
|
expect(comp.bboxes).toContain(mockValue);
|
||||||
|
expect(comp.points).toContain(mockValue);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -1,10 +1,9 @@
|
|||||||
import { NgIf } from '@angular/common';
|
|
||||||
import {
|
import {
|
||||||
Component,
|
Component,
|
||||||
Input,
|
Input,
|
||||||
OnInit,
|
OnInit,
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import { TranslateModule } from '@ngx-translate/core';
|
import { TranslatePipe } from '@ngx-translate/core';
|
||||||
|
|
||||||
import { Item } from '../../../../../core/shared/item.model';
|
import { Item } from '../../../../../core/shared/item.model';
|
||||||
import {
|
import {
|
||||||
@@ -21,8 +20,7 @@ import { ItemPageFieldComponent } from '../item-page-field.component';
|
|||||||
imports: [
|
imports: [
|
||||||
GeospatialMapComponent,
|
GeospatialMapComponent,
|
||||||
MetadataFieldWrapperComponent,
|
MetadataFieldWrapperComponent,
|
||||||
NgIf,
|
TranslatePipe,
|
||||||
TranslateModule,
|
|
||||||
],
|
],
|
||||||
standalone: true,
|
standalone: true,
|
||||||
})
|
})
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
<ds-dso-edit-menu></ds-dso-edit-menu>
|
<ds-dso-edit-menu></ds-dso-edit-menu>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
@if (!(mediaViewer.image || mediaViewer.video)) {
|
@if (!(mediaViewer.image || mediaViewer.video)) {
|
||||||
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
||||||
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
|
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
[label]="'publication.page.publisher'">
|
[label]="'publication.page.publisher'">
|
||||||
</ds-generic-item-page-field>
|
</ds-generic-item-page-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-12 col-md-7">
|
<div class="col-12 col-md-7">
|
||||||
<ds-related-items
|
<ds-related-items
|
||||||
[parentItem]="object"
|
[parentItem]="object"
|
||||||
[relationType]="'isProjectOfPublication'"
|
[relationType]="'isProjectOfPublication'"
|
||||||
|
@@ -19,7 +19,7 @@
|
|||||||
<ds-dso-edit-menu></ds-dso-edit-menu>
|
<ds-dso-edit-menu></ds-dso-edit-menu>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xs-12 col-md-4">
|
<div class="col-12 col-md-4">
|
||||||
@if (!(mediaViewer.image || mediaViewer.video)) {
|
@if (!(mediaViewer.image || mediaViewer.video)) {
|
||||||
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
||||||
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
|
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
[label]="'item.page.publisher'">
|
[label]="'item.page.publisher'">
|
||||||
</ds-generic-item-page-field>
|
</ds-generic-item-page-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-12 col-md-6">
|
<div class="col-12 col-md-6">
|
||||||
<ds-item-page-abstract-field [item]="object"></ds-item-page-abstract-field>
|
<ds-item-page-abstract-field [item]="object"></ds-item-page-abstract-field>
|
||||||
<ds-generic-item-page-field [item]="object"
|
<ds-generic-item-page-field [item]="object"
|
||||||
[fields]="['dc.description']"
|
[fields]="['dc.description']"
|
||||||
|
@@ -44,6 +44,12 @@ describe('TabbedRelatedEntitiesSearchComponent', () => {
|
|||||||
provide: ActivatedRoute,
|
provide: ActivatedRoute,
|
||||||
useValue: {
|
useValue: {
|
||||||
queryParams: of({ tab: mockRelationType }),
|
queryParams: of({ tab: mockRelationType }),
|
||||||
|
snapshot: {
|
||||||
|
queryParams: {
|
||||||
|
scope: 'collection-uuid',
|
||||||
|
query: 'test',
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{ provide: Router, useValue: router },
|
{ provide: Router, useValue: router },
|
||||||
@@ -89,8 +95,10 @@ describe('TabbedRelatedEntitiesSearchComponent', () => {
|
|||||||
relativeTo: (comp as any).route,
|
relativeTo: (comp as any).route,
|
||||||
queryParams: {
|
queryParams: {
|
||||||
tab: event.nextId,
|
tab: event.nextId,
|
||||||
|
query: 'test',
|
||||||
|
scope: 'collection-uuid',
|
||||||
|
'spc.page': 1,
|
||||||
},
|
},
|
||||||
queryParamsHandling: 'merge',
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -89,8 +89,10 @@ export class TabbedRelatedEntitiesSearchComponent implements OnInit {
|
|||||||
relativeTo: this.route,
|
relativeTo: this.route,
|
||||||
queryParams: {
|
queryParams: {
|
||||||
tab: event.nextId,
|
tab: event.nextId,
|
||||||
|
query: this.route.snapshot.queryParams.query,
|
||||||
|
scope: this.route.snapshot.queryParams.scope,
|
||||||
|
'spc.page': 1,
|
||||||
},
|
},
|
||||||
queryParamsHandling: 'merge',
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -301,7 +301,7 @@
|
|||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<p>{{'quality-assurance.event.accept.description' | translate}}</p>
|
<p>{{'quality-assurance.event.accept.description' | translate}}</p>
|
||||||
|
|
||||||
<button class="btn btn-outline-success float-right" (click)="modal.close('do')">
|
<button class="btn btn-outline-success float-end" (click)="modal.close('do')">
|
||||||
<i class="fas fa-check"></i>
|
<i class="fas fa-check"></i>
|
||||||
<span class="d-none d-sm-inline"> {{'quality-assurance.event.action.import' | translate}}</span>
|
<span class="d-none d-sm-inline"> {{'quality-assurance.event.action.import' | translate}}</span>
|
||||||
</button>
|
</button>
|
||||||
@@ -318,7 +318,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<p>{{'quality-assurance.event.ignore.description' | translate}}</p>
|
<p>{{'quality-assurance.event.ignore.description' | translate}}</p>
|
||||||
<button class="btn btn-outline-danger float-right" (click)="modal.close('do')">
|
<button class="btn btn-outline-danger float-end" (click)="modal.close('do')">
|
||||||
<i class="fas fa-trash-alt"></i>
|
<i class="fas fa-trash-alt"></i>
|
||||||
<span class="d-none d-sm-inline"> {{'quality-assurance.event.action.ignore' | translate}}</span>
|
<span class="d-none d-sm-inline"> {{'quality-assurance.event.action.ignore' | translate}}</span>
|
||||||
</button>
|
</button>
|
||||||
@@ -335,7 +335,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<p>{{'quality-assurance.event.reject.description' | translate}}</p>
|
<p>{{'quality-assurance.event.reject.description' | translate}}</p>
|
||||||
<button class="btn btn-outline-danger float-right" (click)="modal.close('do')">
|
<button class="btn btn-outline-danger float-end" (click)="modal.close('do')">
|
||||||
<i class="fas fa-trash-alt"></i>
|
<i class="fas fa-trash-alt"></i>
|
||||||
<span class="d-none d-sm-inline"> {{'quality-assurance.event.action.reject' | translate}}</span>
|
<span class="d-none d-sm-inline"> {{'quality-assurance.event.action.reject' | translate}}</span>
|
||||||
</button>
|
</button>
|
||||||
@@ -352,7 +352,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<p>{{'quality-assurance.event.undo.description' | translate}}</p>
|
<p>{{'quality-assurance.event.undo.description' | translate}}</p>
|
||||||
<button class="btn btn-outline-danger float-right" (click)="modal.close('do')">
|
<button class="btn btn-outline-danger float-end" (click)="modal.close('do')">
|
||||||
<i class="fas fa-trash-alt"></i>
|
<i class="fas fa-trash-alt"></i>
|
||||||
<span class="d-none d-sm-inline"> {{'quality-assurance.event.action.undo' | translate}}</span>
|
<span class="d-none d-sm-inline"> {{'quality-assurance.event.action.undo' | translate}}</span>
|
||||||
</button>
|
</button>
|
||||||
|
@@ -1,8 +1,7 @@
|
|||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h4 class="modal-title" id="modal-title">{{ (labelPrefix + label + '.title') | translate }}</h4>
|
<h4 class="modal-title" id="modal-title">{{ (labelPrefix + label + '.title') | translate }}</h4>
|
||||||
<button type="button" class="close" aria-label="Close button" aria-describedby="modal-title"
|
<button type="button" class="btn-close" aria-label="Close button" aria-describedby="modal-title"
|
||||||
(click)="close()">
|
(click)="close()">
|
||||||
<span aria-hidden="true">×</span>
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
|
@@ -2,14 +2,13 @@
|
|||||||
<div class="notifications-wrapper position-fixed top right">
|
<div class="notifications-wrapper position-fixed top right">
|
||||||
<div class="notification alert alert-success alert-dismissible m-3 shadow" role="alert">
|
<div class="notification alert alert-success alert-dismissible m-3 shadow" role="alert">
|
||||||
<button (click)="removePopup()"
|
<button (click)="removePopup()"
|
||||||
type="button" class="close pt-0 pe-1 pe-0 pb-0" data-dismiss="alert" aria-label="Close">
|
type="button" class="close pt-0 pe-1 pe-0 pb-0" data-bs-dismiss="alert" aria-label="Close">
|
||||||
<span aria-hidden="true">×</span>
|
|
||||||
</button>
|
</button>
|
||||||
<div class="d-flex flex-row">
|
<div class="d-flex flex-row">
|
||||||
<div class="d-flex flex-column justify-content-center align-items-center">
|
<div class="d-flex flex-column justify-content-center align-items-center">
|
||||||
<div class="notification-icon d-flex justify-content-center"><i class="fas fa-2x fa-check-circle"></i></div>
|
<div class="notification-icon d-flex justify-content-center"><i class="fas fa-2x fa-check-circle"></i></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex flex-column justify-content-center align-content-stretch text-left p-2">
|
<div class="d-flex flex-column justify-content-center align-content-stretch text-start p-2">
|
||||||
@if ((suggestionsRD$ | async); as suggestions) {
|
@if ((suggestionsRD$ | async); as suggestions) {
|
||||||
@for (suggestion of suggestions; track suggestion) {
|
@for (suggestion of suggestions; track suggestion) {
|
||||||
<ng-container class="alert alert-info">
|
<ng-container class="alert alert-info">
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
</span>
|
</span>
|
||||||
<span class="file-name ms-1">{{fileObject?.name}}</span>
|
<span class="file-name ms-1">{{fileObject?.name}}</span>
|
||||||
</label>
|
</label>
|
||||||
<input requireFile #file="ngModel" type="file" name="file-upload-{{index}}" id="file-upload-{{index}}" class="form-control-file d-none" [ngModel]="fileObject" (ngModelChange)="setFile($event)"/>
|
<input requireFile #file="ngModel" type="file" name="file-upload-{{index}}" id="file-upload-{{index}}" class="form-control d-none" [ngModel]="fileObject" (ngModelChange)="setFile($event)"/>
|
||||||
@if (file.invalid && (file.dirty || file.touched)) {
|
@if (file.invalid && (file.dirty || file.touched)) {
|
||||||
<div
|
<div
|
||||||
class="alert alert-danger validation-error">
|
class="alert alert-danger validation-error">
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
<!-- Display access periods if more than one was bound to input. The parent component (grant-request-copy)
|
<!-- Display access periods if more than one was bound to input. The parent component (grant-request-copy)
|
||||||
sends an empty list if the feature is not enabled or applicable to this request. -->
|
sends an empty list if the feature is not enabled or applicable to this request. -->
|
||||||
@if (hasValue(validAccessPeriods$ | async) && (validAccessPeriods$ | async).length > 0) {
|
@if (hasValue(validAccessPeriods$ | async) && (validAccessPeriods$ | async).length > 0) {
|
||||||
<div class="form-group">
|
<div class="mb-3">
|
||||||
<label for="accessPeriod">{{ 'grant-request-copy.access-period.header' | translate }}</label>
|
<label for="accessPeriod">{{ 'grant-request-copy.access-period.header' | translate }}</label>
|
||||||
<div ngbDropdown class="d-block">
|
<div ngbDropdown class="d-block">
|
||||||
<!-- Show current selected access period (defaults to first in array) -->
|
<!-- Show current selected access period (defaults to first in array) -->
|
||||||
|
@@ -1,7 +1,4 @@
|
|||||||
import {
|
import { AsyncPipe } from '@angular/common';
|
||||||
AsyncPipe,
|
|
||||||
CommonModule,
|
|
||||||
} from '@angular/common';
|
|
||||||
import {
|
import {
|
||||||
Component,
|
Component,
|
||||||
OnInit,
|
OnInit,
|
||||||
@@ -49,7 +46,6 @@ import { ThemedEmailRequestCopyComponent } from '../email-request-copy/themed-em
|
|||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [
|
imports: [
|
||||||
AsyncPipe,
|
AsyncPipe,
|
||||||
CommonModule,
|
|
||||||
FormsModule,
|
FormsModule,
|
||||||
RouterLink,
|
RouterLink,
|
||||||
ThemedEmailRequestCopyComponent,
|
ThemedEmailRequestCopyComponent,
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<form [formGroup]="searchForm" (ngSubmit)="onSubmit(searchForm.value)" autocomplete="on" class="d-flex">
|
<form [formGroup]="searchForm" (ngSubmit)="onSubmit(searchForm.value)" autocomplete="on" class="d-flex">
|
||||||
<input #searchInput [@toggleAnimation]="isExpanded" [attr.aria-label]="('nav.search' | translate)" name="query"
|
<input #searchInput [@toggleAnimation]="isExpanded" [attr.aria-label]="('nav.search' | translate)" name="query"
|
||||||
formControlName="query" type="text" placeholder="{{searchExpanded ? ('nav.search' | translate) : ''}}"
|
formControlName="query" type="text" placeholder="{{searchExpanded ? ('nav.search' | translate) : ''}}"
|
||||||
class="d-inline-block bg-transparent position-absolute form-control dropdown-menu-right p1"
|
class="d-inline-block bg-transparent position-absolute form-control dropdown-menu-end p1"
|
||||||
[class.display]="searchExpanded ? 'inline-block' : 'none'"
|
[class.display]="searchExpanded ? 'inline-block' : 'none'"
|
||||||
[tabIndex]="searchExpanded ? 0 : -1"
|
[tabIndex]="searchExpanded ? 0 : -1"
|
||||||
[attr.data-test]="'header-search-box' | dsBrowserOnly">
|
[attr.data-test]="'header-search-box' | dsBrowserOnly">
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
}
|
}
|
||||||
<ng-content></ng-content>
|
<ng-content></ng-content>
|
||||||
@if (dismissible) {
|
@if (dismissible) {
|
||||||
<button type="button" class="btn-close" data-dismiss="alert" aria-label="Close" (click)="dismiss()">
|
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close" (click)="dismiss()">
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
@@ -144,6 +144,12 @@ export class CollectionDropdownComponent implements OnInit, OnDestroy {
|
|||||||
*/
|
*/
|
||||||
@Input() entityType: string;
|
@Input() entityType: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search endpoint to use for finding authorized collections.
|
||||||
|
* Defaults to 'findSubmitAuthorized', but can be overridden (e.g. to 'findAdminAuthorized')
|
||||||
|
*/
|
||||||
|
@Input() searchHref = 'findSubmitAuthorized';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Emit to notify whether search is complete
|
* Emit to notify whether search is complete
|
||||||
*/
|
*/
|
||||||
@@ -252,7 +258,7 @@ export class CollectionDropdownComponent implements OnInit, OnDestroy {
|
|||||||
followLink('parentCommunity'));
|
followLink('parentCommunity'));
|
||||||
} else {
|
} else {
|
||||||
searchListService$ = this.collectionDataService
|
searchListService$ = this.collectionDataService
|
||||||
.getAuthorizedCollection(query, findOptions, true, true, followLink('parentCommunity'));
|
.getAuthorizedCollection(query, findOptions, true, true, this.searchHref, followLink('parentCommunity'));
|
||||||
}
|
}
|
||||||
this.searchListCollection$ = searchListService$.pipe(
|
this.searchListCollection$ = searchListService$.pipe(
|
||||||
getFirstCompletedRemoteData(),
|
getFirstCompletedRemoteData(),
|
||||||
|
@@ -51,7 +51,7 @@
|
|||||||
@if (hasCustomGroup$ | async) {
|
@if (hasCustomGroup$ | async) {
|
||||||
<button
|
<button
|
||||||
class="btn btn-danger delete"
|
class="btn btn-danger delete"
|
||||||
(click)="delete()">
|
(click)="confirmDelete(dsoNameService.getName(group))">
|
||||||
<i class="fas fa-trash" aria-hidden="true"></i> {{'comcol-role.edit.delete' | translate}}
|
<i class="fas fa-trash" aria-hidden="true"></i> {{'comcol-role.edit.delete' | translate}}
|
||||||
</button>
|
</button>
|
||||||
}
|
}
|
||||||
|
@@ -10,6 +10,7 @@ import {
|
|||||||
import { By } from '@angular/platform-browser';
|
import { By } from '@angular/platform-browser';
|
||||||
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
|
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
|
||||||
import { RouterTestingModule } from '@angular/router/testing';
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
|
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
|
||||||
import { TranslateModule } from '@ngx-translate/core';
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
import { of } from 'rxjs';
|
import { of } from 'rxjs';
|
||||||
|
|
||||||
@@ -36,17 +37,22 @@ describe('ComcolRoleComponent', () => {
|
|||||||
let comcolRole;
|
let comcolRole;
|
||||||
let notificationsService;
|
let notificationsService;
|
||||||
|
|
||||||
const requestService = { hasByHref$: () => of(true) };
|
const requestService = {
|
||||||
|
hasByHref$: () => of(true),
|
||||||
|
setStaleByHrefSubstring: () => of(true),
|
||||||
|
};
|
||||||
|
|
||||||
const groupService = {
|
const groupService = {
|
||||||
findByHref: jasmine.createSpy('findByHref'),
|
findByHref: jasmine.createSpy('findByHref'),
|
||||||
createComcolGroup: jasmine.createSpy('createComcolGroup').and.returnValue(of({})),
|
createComcolGroup: jasmine.createSpy('createComcolGroup').and.returnValue(of({})),
|
||||||
deleteComcolGroup: jasmine.createSpy('deleteComcolGroup').and.returnValue(of({})),
|
deleteComcolGroup: jasmine.createSpy('deleteComcolGroup').and.returnValue(of({})),
|
||||||
|
clearGroupsRequests: jasmine.createSpy('clearGroupsRequests'),
|
||||||
};
|
};
|
||||||
|
|
||||||
beforeEach(waitForAsync(() => {
|
beforeEach(waitForAsync(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
imports: [
|
imports: [
|
||||||
|
NgbModule,
|
||||||
RouterTestingModule.withRoutes([]),
|
RouterTestingModule.withRoutes([]),
|
||||||
TranslateModule.forRoot(),
|
TranslateModule.forRoot(),
|
||||||
NoopAnimationsModule,
|
NoopAnimationsModule,
|
||||||
@@ -178,13 +184,17 @@ describe('ComcolRoleComponent', () => {
|
|||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
const modal = document.querySelector('ds-confirmation-modal');
|
||||||
|
if (modal) {
|
||||||
|
modal.remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('should have a delete button but no create or restrict button', (done) => {
|
it('should have a delete button but no create or restrict button', (done) => {
|
||||||
expect(de.query(By.css('.btn.create')))
|
expect(de.query(By.css('.btn.create'))).toBeNull();
|
||||||
.toBeNull();
|
expect(de.query(By.css('.btn.restrict'))).toBeNull();
|
||||||
expect(de.query(By.css('.btn.restrict')))
|
expect(de.query(By.css('.btn.delete'))).toBeTruthy();
|
||||||
.toBeNull();
|
|
||||||
expect(de.query(By.css('.btn.delete')))
|
|
||||||
.toBeTruthy();
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -195,6 +205,7 @@ describe('ComcolRoleComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should call the groupService delete method', (done) => {
|
it('should call the groupService delete method', (done) => {
|
||||||
|
(document as any).querySelector('.modal-footer .confirm').click();
|
||||||
expect(groupService.deleteComcolGroup).toHaveBeenCalled();
|
expect(groupService.deleteComcolGroup).toHaveBeenCalled();
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@@ -207,9 +218,11 @@ describe('ComcolRoleComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should show an error notification', (done) => {
|
it('should show an error notification', (done) => {
|
||||||
|
(document as any).querySelector('.modal-footer .confirm').click();
|
||||||
expect(notificationsService.error).toHaveBeenCalled();
|
expect(notificationsService.error).toHaveBeenCalled();
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -5,6 +5,7 @@ import {
|
|||||||
OnInit,
|
OnInit,
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import { RouterLink } from '@angular/router';
|
import { RouterLink } from '@angular/router';
|
||||||
|
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
||||||
import {
|
import {
|
||||||
TranslateModule,
|
TranslateModule,
|
||||||
TranslateService,
|
TranslateService,
|
||||||
@@ -12,11 +13,13 @@ import {
|
|||||||
import {
|
import {
|
||||||
BehaviorSubject,
|
BehaviorSubject,
|
||||||
Observable,
|
Observable,
|
||||||
|
Subscription,
|
||||||
} from 'rxjs';
|
} from 'rxjs';
|
||||||
import {
|
import {
|
||||||
filter,
|
filter,
|
||||||
map,
|
map,
|
||||||
switchMap,
|
switchMap,
|
||||||
|
takeUntil,
|
||||||
} from 'rxjs/operators';
|
} from 'rxjs/operators';
|
||||||
|
|
||||||
import { getGroupEditRoute } from '../../../../../access-control/access-control-routing-paths';
|
import { getGroupEditRoute } from '../../../../../access-control/access-control-routing-paths';
|
||||||
@@ -34,6 +37,7 @@ import {
|
|||||||
getFirstCompletedRemoteData,
|
getFirstCompletedRemoteData,
|
||||||
} from '../../../../../core/shared/operators';
|
} from '../../../../../core/shared/operators';
|
||||||
import { AlertComponent } from '../../../../alert/alert.component';
|
import { AlertComponent } from '../../../../alert/alert.component';
|
||||||
|
import { ConfirmationModalComponent } from '../../../../confirmation-modal/confirmation-modal.component';
|
||||||
import {
|
import {
|
||||||
hasNoValue,
|
hasNoValue,
|
||||||
hasValue,
|
hasValue,
|
||||||
@@ -115,6 +119,7 @@ export class ComcolRoleComponent implements OnInit {
|
|||||||
protected notificationsService: NotificationsService,
|
protected notificationsService: NotificationsService,
|
||||||
protected translateService: TranslateService,
|
protected translateService: TranslateService,
|
||||||
public dsoNameService: DSONameService,
|
public dsoNameService: DSONameService,
|
||||||
|
private modalService: NgbModal,
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,4 +220,31 @@ export class ComcolRoleComponent implements OnInit {
|
|||||||
|
|
||||||
this.roleName$ = this.translateService.get(`comcol-role.edit.${this.comcolRole.name}.name`);
|
this.roleName$ = this.translateService.get(`comcol-role.edit.${this.comcolRole.name}.name`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
confirmDelete(groupName: string): void {
|
||||||
|
const modalRef = this.modalService.open(ConfirmationModalComponent);
|
||||||
|
|
||||||
|
modalRef.componentInstance.name = groupName;
|
||||||
|
modalRef.componentInstance.headerLabel = 'comcol-role.edit.delete.modal.header';
|
||||||
|
modalRef.componentInstance.infoLabel = 'comcol-role.edit.delete.modal.info';
|
||||||
|
modalRef.componentInstance.cancelLabel = 'comcol-role.edit.delete.modal.cancel';
|
||||||
|
modalRef.componentInstance.confirmLabel = 'comcol-role.edit.delete.modal.confirm';
|
||||||
|
modalRef.componentInstance.brandColor = 'danger';
|
||||||
|
modalRef.componentInstance.confirmIcon = 'fas fa-trash';
|
||||||
|
|
||||||
|
const modalSub: Subscription = modalRef.componentInstance.response.pipe(
|
||||||
|
takeUntil(modalRef.closed),
|
||||||
|
).subscribe((result: boolean) => {
|
||||||
|
if (result === true) {
|
||||||
|
this.delete();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
void modalRef.result.then().finally(() => {
|
||||||
|
modalRef.close();
|
||||||
|
if (modalSub && !modalSub.closed) {
|
||||||
|
modalSub.unsubscribe();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -147,7 +147,7 @@ export class ComcolPageBrowseByComponent implements OnDestroy, OnInit {
|
|||||||
]).subscribe(([navOptions, url]: [ComColPageNavOption[], string]) => {
|
]).subscribe(([navOptions, url]: [ComColPageNavOption[], string]) => {
|
||||||
for (const option of navOptions) {
|
for (const option of navOptions) {
|
||||||
if (url?.split('?')[0] === comColRoute && option.id === this.appConfig[this.contentType].defaultBrowseTab) {
|
if (url?.split('?')[0] === comColRoute && option.id === this.appConfig[this.contentType].defaultBrowseTab) {
|
||||||
void this.router.navigate([option.routerLink], { queryParams: option.params });
|
void this.router.navigate([option.routerLink], { queryParams: option.params, replaceUrl: true });
|
||||||
break;
|
break;
|
||||||
} else if (option.routerLink === url?.split('?')[0]) {
|
} else if (option.routerLink === url?.split('?')[0]) {
|
||||||
this.currentOption$.next(option);
|
this.currentOption$.next(option);
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
:host {
|
||||||
|
.modal {
|
||||||
|
&-body, &-header {
|
||||||
|
word-break: break-word;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -11,6 +11,7 @@ import { TranslateModule } from '@ngx-translate/core';
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'ds-confirmation-modal',
|
selector: 'ds-confirmation-modal',
|
||||||
templateUrl: 'confirmation-modal.component.html',
|
templateUrl: 'confirmation-modal.component.html',
|
||||||
|
styleUrls: ['confirmation-modal.component.scss'],
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [
|
imports: [
|
||||||
TranslateModule,
|
TranslateModule,
|
||||||
|
@@ -3,22 +3,20 @@
|
|||||||
@if (this.canWithdraw) {
|
@if (this.canWithdraw) {
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
{{ 'item.qa.withdrawn.modal.header' | translate }}
|
{{ 'item.qa.withdrawn.modal.header' | translate }}
|
||||||
<button type="button" class="close" (click)="onModalClose()" aria-label="Close">
|
<button type="button" class="btn-close" (click)="onModalClose()" aria-label="Close">
|
||||||
<span aria-hidden="true">×</span>
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
} @else {
|
} @else {
|
||||||
@if (!this.canWithdraw) {
|
@if (!this.canWithdraw) {
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
{{'item.qa.reinstate.modal.header' | translate}}
|
{{'item.qa.reinstate.modal.header' | translate}}
|
||||||
<button type="button" class="close" (click)="onModalClose()" aria-label="Close">
|
<button type="button" class="btn-close" (click)="onModalClose()" aria-label="Close">
|
||||||
<span aria-hidden="true">×</span>
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div class="form-group">
|
<div class="mb-3">
|
||||||
<label for="reason">{{ this.canWithdraw ? ('qa-withdrawn.create.modal.form.summary.label' | translate)
|
<label for="reason">{{ this.canWithdraw ? ('qa-withdrawn.create.modal.form.summary.label' | translate)
|
||||||
: ('qa-reinstate.create.modal.form.summary.label' | translate) }}</label>
|
: ('qa-reinstate.create.modal.form.summary.label' | translate) }}</label>
|
||||||
<label for="reason">{{ this.canWithdraw ? ('qa-withdrawn.create.modal.form.summary2.label' | translate)
|
<label for="reason">{{ this.canWithdraw ? ('qa-withdrawn.create.modal.form.summary2.label' | translate)
|
||||||
|
@@ -83,5 +83,19 @@ describe('AuthorizedCollectionSelectorComponent', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('when using searchHref', () => {
|
||||||
|
it('should call getAuthorizedCollection with "findAdminAuthorized" when overridden', (done) => {
|
||||||
|
component.searchHref = 'findAdminAuthorized';
|
||||||
|
|
||||||
|
component.search('', 1).subscribe(() => {
|
||||||
|
expect(collectionService.getAuthorizedCollection).toHaveBeenCalledWith(
|
||||||
|
'', jasmine.any(Object), true, false, 'findAdminAuthorized', jasmine.anything(),
|
||||||
|
);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -66,6 +66,12 @@ export class AuthorizedCollectionSelectorComponent extends DSOSelectorComponent
|
|||||||
*/
|
*/
|
||||||
@Input() entityType: string;
|
@Input() entityType: string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search endpoint to use for finding authorized collections.
|
||||||
|
* Defaults to 'findSubmitAuthorized', but can be overridden (e.g. to 'findAdminAuthorized')
|
||||||
|
*/
|
||||||
|
@Input() searchHref = 'findSubmitAuthorized';
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
protected searchService: SearchService,
|
protected searchService: SearchService,
|
||||||
protected collectionDataService: CollectionDataService,
|
protected collectionDataService: CollectionDataService,
|
||||||
@@ -104,7 +110,7 @@ export class AuthorizedCollectionSelectorComponent extends DSOSelectorComponent
|
|||||||
findOptions);
|
findOptions);
|
||||||
} else {
|
} else {
|
||||||
searchListService$ = this.collectionDataService
|
searchListService$ = this.collectionDataService
|
||||||
.getAuthorizedCollection(query, findOptions, useCache, false, followLink('parentCommunity'));
|
.getAuthorizedCollection(query, findOptions, useCache, false, this.searchHref, followLink('parentCommunity'));
|
||||||
}
|
}
|
||||||
return searchListService$.pipe(
|
return searchListService$.pipe(
|
||||||
getFirstCompletedRemoteData(),
|
getFirstCompletedRemoteData(),
|
||||||
|
@@ -0,0 +1,71 @@
|
|||||||
|
import { NO_ERRORS_SCHEMA } from '@angular/core';
|
||||||
|
import {
|
||||||
|
ComponentFixture,
|
||||||
|
TestBed,
|
||||||
|
waitForAsync,
|
||||||
|
} from '@angular/core/testing';
|
||||||
|
import { RouterTestingModule } from '@angular/router/testing';
|
||||||
|
import { TranslateModule } from '@ngx-translate/core';
|
||||||
|
|
||||||
|
import { CommunityDataService } from '../../../../core/data/community-data.service';
|
||||||
|
import { Community } from '../../../../core/shared/community.model';
|
||||||
|
import { DSpaceObjectType } from '../../../../core/shared/dspace-object-type.model';
|
||||||
|
import { SearchService } from '../../../../core/shared/search/search.service';
|
||||||
|
import { ThemedLoadingComponent } from '../../../loading/themed-loading.component';
|
||||||
|
import { NotificationsService } from '../../../notifications/notifications.service';
|
||||||
|
import { ListableObjectComponentLoaderComponent } from '../../../object-collection/shared/listable-object/listable-object-component-loader.component';
|
||||||
|
import { createSuccessfulRemoteDataObject$ } from '../../../remote-data.utils';
|
||||||
|
import { createPaginatedList } from '../../../testing/utils.test';
|
||||||
|
import { VarDirective } from '../../../utils/var.directive';
|
||||||
|
import { AuthorizedCommunitySelectorComponent } from './authorized-community-selector.component';
|
||||||
|
|
||||||
|
describe('AuthorizedCommunitySelectorComponent', () => {
|
||||||
|
let component: AuthorizedCommunitySelectorComponent;
|
||||||
|
let fixture: ComponentFixture<AuthorizedCommunitySelectorComponent>;
|
||||||
|
|
||||||
|
let communityService;
|
||||||
|
let community;
|
||||||
|
|
||||||
|
let notificationsService: NotificationsService;
|
||||||
|
|
||||||
|
beforeEach(waitForAsync(() => {
|
||||||
|
community = Object.assign(new Community(), {
|
||||||
|
id: 'authorized-community',
|
||||||
|
});
|
||||||
|
communityService = jasmine.createSpyObj('communityService', {
|
||||||
|
getAuthorizedCommunity: createSuccessfulRemoteDataObject$(createPaginatedList([community])),
|
||||||
|
});
|
||||||
|
notificationsService = jasmine.createSpyObj('notificationsService', ['error']);
|
||||||
|
TestBed.configureTestingModule({
|
||||||
|
imports: [TranslateModule.forRoot(), RouterTestingModule.withRoutes([]), AuthorizedCommunitySelectorComponent, VarDirective],
|
||||||
|
providers: [
|
||||||
|
{ provide: SearchService, useValue: {} },
|
||||||
|
{ provide: CommunityDataService, useValue: communityService },
|
||||||
|
{ provide: NotificationsService, useValue: notificationsService },
|
||||||
|
],
|
||||||
|
schemas: [NO_ERRORS_SCHEMA],
|
||||||
|
})
|
||||||
|
.overrideComponent(AuthorizedCommunitySelectorComponent, {
|
||||||
|
remove: { imports: [ListableObjectComponentLoaderComponent, ThemedLoadingComponent] },
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
}));
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(AuthorizedCommunitySelectorComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
component.types = [DSpaceObjectType.COMMUNITY];
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('search', () => {
|
||||||
|
it('should call getAuthorizedCommunity and return the authorized community in a SearchResult', (done) => {
|
||||||
|
component.search('', 1).subscribe((resultRD) => {
|
||||||
|
expect(communityService.getAuthorizedCommunity).toHaveBeenCalled();
|
||||||
|
expect(resultRD.payload.page.length).toEqual(1);
|
||||||
|
expect(resultRD.payload.page[0].indexableObject).toEqual(community);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@@ -0,0 +1,105 @@
|
|||||||
|
import {
|
||||||
|
AsyncPipe,
|
||||||
|
NgClass,
|
||||||
|
} from '@angular/common';
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
import {
|
||||||
|
FormsModule,
|
||||||
|
ReactiveFormsModule,
|
||||||
|
} from '@angular/forms';
|
||||||
|
import {
|
||||||
|
TranslateModule,
|
||||||
|
TranslateService,
|
||||||
|
} from '@ngx-translate/core';
|
||||||
|
import { InfiniteScrollModule } from 'ngx-infinite-scroll';
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
|
import { map } from 'rxjs/operators';
|
||||||
|
|
||||||
|
import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service';
|
||||||
|
import { CommunityDataService } from '../../../../core/data/community-data.service';
|
||||||
|
import { FindListOptions } from '../../../../core/data/find-list-options.model';
|
||||||
|
import {
|
||||||
|
buildPaginatedList,
|
||||||
|
PaginatedList,
|
||||||
|
} from '../../../../core/data/paginated-list.model';
|
||||||
|
import { RemoteData } from '../../../../core/data/remote-data';
|
||||||
|
import { Community } from '../../../../core/shared/community.model';
|
||||||
|
import { DSpaceObject } from '../../../../core/shared/dspace-object.model';
|
||||||
|
import { getFirstCompletedRemoteData } from '../../../../core/shared/operators';
|
||||||
|
import { SearchService } from '../../../../core/shared/search/search.service';
|
||||||
|
import { hasValue } from '../../../empty.util';
|
||||||
|
import { HoverClassDirective } from '../../../hover-class.directive';
|
||||||
|
import { ThemedLoadingComponent } from '../../../loading/themed-loading.component';
|
||||||
|
import { NotificationsService } from '../../../notifications/notifications.service';
|
||||||
|
import { CommunitySearchResult } from '../../../object-collection/shared/community-search-result.model';
|
||||||
|
import { ListableObjectComponentLoaderComponent } from '../../../object-collection/shared/listable-object/listable-object-component-loader.component';
|
||||||
|
import { SearchResult } from '../../../search/models/search-result.model';
|
||||||
|
import { followLink } from '../../../utils/follow-link-config.model';
|
||||||
|
import { DSOSelectorComponent } from '../dso-selector.component';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'ds-authorized-community-selector',
|
||||||
|
styleUrls: ['../dso-selector.component.scss'],
|
||||||
|
templateUrl: '../dso-selector.component.html',
|
||||||
|
standalone: true,
|
||||||
|
imports: [
|
||||||
|
AsyncPipe,
|
||||||
|
FormsModule,
|
||||||
|
HoverClassDirective,
|
||||||
|
InfiniteScrollModule,
|
||||||
|
ListableObjectComponentLoaderComponent,
|
||||||
|
NgClass,
|
||||||
|
ReactiveFormsModule,
|
||||||
|
ThemedLoadingComponent,
|
||||||
|
TranslateModule,
|
||||||
|
],
|
||||||
|
})
|
||||||
|
/**
|
||||||
|
* Component rendering a list of communities to select from
|
||||||
|
*/
|
||||||
|
export class AuthorizedCommunitySelectorComponent extends DSOSelectorComponent {
|
||||||
|
/**
|
||||||
|
* If present this value is used to filter community list by entity type
|
||||||
|
*/
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
protected searchService: SearchService,
|
||||||
|
protected communityDataService: CommunityDataService,
|
||||||
|
protected notifcationsService: NotificationsService,
|
||||||
|
protected translate: TranslateService,
|
||||||
|
protected dsoNameService: DSONameService,
|
||||||
|
) {
|
||||||
|
super(searchService, notifcationsService, translate, dsoNameService);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a query to send for retrieving the current DSO
|
||||||
|
*/
|
||||||
|
getCurrentDSOQuery(): string {
|
||||||
|
return this.currentDSOId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Perform a search for authorized communities with the current query and page
|
||||||
|
* @param query Query to search objects for
|
||||||
|
* @param page Page to retrieve
|
||||||
|
* @param useCache Whether or not to use the cache
|
||||||
|
*/
|
||||||
|
search(query: string, page: number, useCache: boolean = true): Observable<RemoteData<PaginatedList<SearchResult<DSpaceObject>>>> {
|
||||||
|
let searchListService$: Observable<RemoteData<PaginatedList<Community>>> = null;
|
||||||
|
const findOptions: FindListOptions = {
|
||||||
|
currentPage: page,
|
||||||
|
elementsPerPage: this.defaultPagination.pageSize,
|
||||||
|
};
|
||||||
|
|
||||||
|
searchListService$ = this.communityDataService
|
||||||
|
.getAuthorizedCommunity(query, findOptions, useCache, false, followLink('parentCommunity'));
|
||||||
|
|
||||||
|
return searchListService$.pipe(
|
||||||
|
getFirstCompletedRemoteData(),
|
||||||
|
map((rd) => Object.assign(new RemoteData(null, null, null, null), rd, {
|
||||||
|
payload: hasValue(rd.payload) ? buildPaginatedList(rd.payload.pageInfo, rd.payload.page.map((col) => Object.assign(new CommunitySearchResult(), { indexableObject: col }))) : null,
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,14 @@
|
|||||||
|
<div>
|
||||||
|
<div class="modal-header">{{'dso-selector.'+ action + '.' + objectType.toString().toLowerCase() + '.head' | translate}}
|
||||||
|
<button type="button" class="btn-close" (click)="close()" aria-label="Close">
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
@if (header) {
|
||||||
|
<span class="h5 px-2">{{header | translate}}</span>
|
||||||
|
}
|
||||||
|
<ds-authorized-community-selector [currentDSOId]="dsoRD?.payload.uuid"
|
||||||
|
[types]="selectorTypes"
|
||||||
|
(onSelect)="selectObject($event)"></ds-authorized-community-selector>
|
||||||
|
</div>
|
||||||
|
</div>
|
@@ -18,7 +18,7 @@ import { Community } from '../../../../core/shared/community.model';
|
|||||||
import { MetadataValue } from '../../../../core/shared/metadata.models';
|
import { MetadataValue } from '../../../../core/shared/metadata.models';
|
||||||
import { createSuccessfulRemoteDataObject } from '../../../remote-data.utils';
|
import { createSuccessfulRemoteDataObject } from '../../../remote-data.utils';
|
||||||
import { RouterStub } from '../../../testing/router.stub';
|
import { RouterStub } from '../../../testing/router.stub';
|
||||||
import { DSOSelectorComponent } from '../../dso-selector/dso-selector.component';
|
import { AuthorizedCommunitySelectorComponent } from '../../dso-selector/authorized-community-selector/authorized-community-selector.component';
|
||||||
import { CreateCollectionParentSelectorComponent } from './create-collection-parent-selector.component';
|
import { CreateCollectionParentSelectorComponent } from './create-collection-parent-selector.component';
|
||||||
|
|
||||||
describe('CreateCollectionParentSelectorComponent', () => {
|
describe('CreateCollectionParentSelectorComponent', () => {
|
||||||
@@ -64,7 +64,7 @@ describe('CreateCollectionParentSelectorComponent', () => {
|
|||||||
schemas: [NO_ERRORS_SCHEMA],
|
schemas: [NO_ERRORS_SCHEMA],
|
||||||
})
|
})
|
||||||
.overrideComponent(CreateCollectionParentSelectorComponent, {
|
.overrideComponent(CreateCollectionParentSelectorComponent, {
|
||||||
remove: { imports: [DSOSelectorComponent] },
|
remove: { imports: [AuthorizedCommunitySelectorComponent] },
|
||||||
})
|
})
|
||||||
.compileComponents();
|
.compileComponents();
|
||||||
|
|
||||||
|
@@ -22,7 +22,7 @@ import {
|
|||||||
} from '../../../../core/cache/models/sort-options.model';
|
} from '../../../../core/cache/models/sort-options.model';
|
||||||
import { DSpaceObject } from '../../../../core/shared/dspace-object.model';
|
import { DSpaceObject } from '../../../../core/shared/dspace-object.model';
|
||||||
import { DSpaceObjectType } from '../../../../core/shared/dspace-object-type.model';
|
import { DSpaceObjectType } from '../../../../core/shared/dspace-object-type.model';
|
||||||
import { DSOSelectorComponent } from '../../dso-selector/dso-selector.component';
|
import { AuthorizedCommunitySelectorComponent } from '../../dso-selector/authorized-community-selector/authorized-community-selector.component';
|
||||||
import {
|
import {
|
||||||
DSOSelectorModalWrapperComponent,
|
DSOSelectorModalWrapperComponent,
|
||||||
SelectorActionType,
|
SelectorActionType,
|
||||||
@@ -34,10 +34,10 @@ import {
|
|||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ds-base-create-collection-parent-selector',
|
selector: 'ds-base-create-collection-parent-selector',
|
||||||
templateUrl: '../dso-selector-modal-wrapper.component.html',
|
templateUrl: './create-collection-parent-selector.component.html',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [
|
imports: [
|
||||||
DSOSelectorComponent,
|
AuthorizedCommunitySelectorComponent,
|
||||||
TranslateModule,
|
TranslateModule,
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
<span class="h5 px-2">{{'dso-selector.create.community.sub-level' | translate}}</span>
|
<span class="h5 px-2">{{'dso-selector.create.community.sub-level' | translate}}</span>
|
||||||
<ds-dso-selector [currentDSOId]="dsoRD?.payload.uuid" [types]="selectorTypes" [sort]="defaultSort" (onSelect)="selectObject($event)"></ds-dso-selector>
|
<ds-authorized-community-selector [currentDSOId]="dsoRD?.payload.uuid"
|
||||||
|
[types]="selectorTypes"
|
||||||
|
(onSelect)="selectObject($event)"></ds-authorized-community-selector>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@@ -21,7 +21,7 @@ import { Community } from '../../../../core/shared/community.model';
|
|||||||
import { MetadataValue } from '../../../../core/shared/metadata.models';
|
import { MetadataValue } from '../../../../core/shared/metadata.models';
|
||||||
import { createSuccessfulRemoteDataObject } from '../../../remote-data.utils';
|
import { createSuccessfulRemoteDataObject } from '../../../remote-data.utils';
|
||||||
import { RouterStub } from '../../../testing/router.stub';
|
import { RouterStub } from '../../../testing/router.stub';
|
||||||
import { DSOSelectorComponent } from '../../dso-selector/dso-selector.component';
|
import { AuthorizedCommunitySelectorComponent } from '../../dso-selector/authorized-community-selector/authorized-community-selector.component';
|
||||||
import { CreateCommunityParentSelectorComponent } from './create-community-parent-selector.component';
|
import { CreateCommunityParentSelectorComponent } from './create-community-parent-selector.component';
|
||||||
|
|
||||||
describe('CreateCommunityParentSelectorComponent', () => {
|
describe('CreateCommunityParentSelectorComponent', () => {
|
||||||
@@ -69,7 +69,7 @@ describe('CreateCommunityParentSelectorComponent', () => {
|
|||||||
schemas: [NO_ERRORS_SCHEMA],
|
schemas: [NO_ERRORS_SCHEMA],
|
||||||
})
|
})
|
||||||
.overrideComponent(CreateCommunityParentSelectorComponent, {
|
.overrideComponent(CreateCommunityParentSelectorComponent, {
|
||||||
remove: { imports: [DSOSelectorComponent] },
|
remove: { imports: [AuthorizedCommunitySelectorComponent] },
|
||||||
})
|
})
|
||||||
.compileComponents();
|
.compileComponents();
|
||||||
|
|
||||||
|
@@ -26,7 +26,7 @@ import { FeatureID } from '../../../../core/data/feature-authorization/feature-i
|
|||||||
import { DSpaceObject } from '../../../../core/shared/dspace-object.model';
|
import { DSpaceObject } from '../../../../core/shared/dspace-object.model';
|
||||||
import { DSpaceObjectType } from '../../../../core/shared/dspace-object-type.model';
|
import { DSpaceObjectType } from '../../../../core/shared/dspace-object-type.model';
|
||||||
import { hasValue } from '../../../empty.util';
|
import { hasValue } from '../../../empty.util';
|
||||||
import { DSOSelectorComponent } from '../../dso-selector/dso-selector.component';
|
import { AuthorizedCommunitySelectorComponent } from '../../dso-selector/authorized-community-selector/authorized-community-selector.component';
|
||||||
import {
|
import {
|
||||||
DSOSelectorModalWrapperComponent,
|
DSOSelectorModalWrapperComponent,
|
||||||
SelectorActionType,
|
SelectorActionType,
|
||||||
@@ -46,7 +46,7 @@ import {
|
|||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [
|
imports: [
|
||||||
AsyncPipe,
|
AsyncPipe,
|
||||||
DSOSelectorComponent,
|
AuthorizedCommunitySelectorComponent,
|
||||||
TranslateModule,
|
TranslateModule,
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
@@ -0,0 +1,15 @@
|
|||||||
|
<div>
|
||||||
|
<div class="modal-header">{{'dso-selector.'+ action + '.' + objectType.toString().toLowerCase() + '.head' | translate}}
|
||||||
|
<button type="button" class="btn-close" (click)="close()" aria-label="Close">
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
@if (header) {
|
||||||
|
<span class="h5 px-2">{{header | translate}}</span>
|
||||||
|
}
|
||||||
|
<ds-authorized-collection-selector [currentDSOId]="dsoRD?.payload.uuid"
|
||||||
|
[types]="selectorTypes"
|
||||||
|
searchHref="findAdminAuthorized"
|
||||||
|
(onSelect)="selectObject($event)"></ds-authorized-collection-selector>
|
||||||
|
</div>
|
||||||
|
</div>
|
@@ -18,7 +18,7 @@ import { Collection } from '../../../../core/shared/collection.model';
|
|||||||
import { MetadataValue } from '../../../../core/shared/metadata.models';
|
import { MetadataValue } from '../../../../core/shared/metadata.models';
|
||||||
import { createSuccessfulRemoteDataObject } from '../../../remote-data.utils';
|
import { createSuccessfulRemoteDataObject } from '../../../remote-data.utils';
|
||||||
import { RouterStub } from '../../../testing/router.stub';
|
import { RouterStub } from '../../../testing/router.stub';
|
||||||
import { DSOSelectorComponent } from '../../dso-selector/dso-selector.component';
|
import { AuthorizedCollectionSelectorComponent } from '../../dso-selector/authorized-collection-selector/authorized-collection-selector.component';
|
||||||
import { EditCollectionSelectorComponent } from './edit-collection-selector.component';
|
import { EditCollectionSelectorComponent } from './edit-collection-selector.component';
|
||||||
|
|
||||||
describe('EditCollectionSelectorComponent', () => {
|
describe('EditCollectionSelectorComponent', () => {
|
||||||
@@ -64,7 +64,7 @@ describe('EditCollectionSelectorComponent', () => {
|
|||||||
})
|
})
|
||||||
.overrideComponent(EditCollectionSelectorComponent, {
|
.overrideComponent(EditCollectionSelectorComponent, {
|
||||||
remove: {
|
remove: {
|
||||||
imports: [DSOSelectorComponent],
|
imports: [AuthorizedCollectionSelectorComponent],
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.compileComponents();
|
.compileComponents();
|
||||||
|
@@ -17,7 +17,7 @@ import {
|
|||||||
} from '../../../../core/cache/models/sort-options.model';
|
} from '../../../../core/cache/models/sort-options.model';
|
||||||
import { DSpaceObject } from '../../../../core/shared/dspace-object.model';
|
import { DSpaceObject } from '../../../../core/shared/dspace-object.model';
|
||||||
import { DSpaceObjectType } from '../../../../core/shared/dspace-object-type.model';
|
import { DSpaceObjectType } from '../../../../core/shared/dspace-object-type.model';
|
||||||
import { DSOSelectorComponent } from '../../dso-selector/dso-selector.component';
|
import { AuthorizedCollectionSelectorComponent } from '../../dso-selector/authorized-collection-selector/authorized-collection-selector.component';
|
||||||
import {
|
import {
|
||||||
DSOSelectorModalWrapperComponent,
|
DSOSelectorModalWrapperComponent,
|
||||||
SelectorActionType,
|
SelectorActionType,
|
||||||
@@ -30,10 +30,10 @@ import {
|
|||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ds-base-edit-collection-selector',
|
selector: 'ds-base-edit-collection-selector',
|
||||||
templateUrl: '../dso-selector-modal-wrapper.component.html',
|
templateUrl: './edit-collection-selector.component.html',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [
|
imports: [
|
||||||
DSOSelectorComponent,
|
AuthorizedCollectionSelectorComponent,
|
||||||
TranslateModule,
|
TranslateModule,
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
@@ -0,0 +1,14 @@
|
|||||||
|
<div>
|
||||||
|
<div class="modal-header">{{'dso-selector.'+ action + '.' + objectType.toString().toLowerCase() + '.head' | translate}}
|
||||||
|
<button type="button" class="btn-close" (click)="close()" aria-label="Close">
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
@if (header) {
|
||||||
|
<span class="h5 px-2">{{header | translate}}</span>
|
||||||
|
}
|
||||||
|
<ds-authorized-community-selector [currentDSOId]="dsoRD?.payload.uuid"
|
||||||
|
[types]="selectorTypes"
|
||||||
|
(onSelect)="selectObject($event)"></ds-authorized-community-selector>
|
||||||
|
</div>
|
||||||
|
</div>
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user