mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 01:54:15 +00:00
Compare commits
452 Commits
dspace-9.1
...
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 | ||
![]() |
1085c9812f | ||
![]() |
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({
|
||||||
|
@@ -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();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -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'"
|
||||||
|
@@ -5,9 +5,7 @@ import {
|
|||||||
import {
|
import {
|
||||||
ChangeDetectionStrategy,
|
ChangeDetectionStrategy,
|
||||||
Component,
|
Component,
|
||||||
Inject,
|
|
||||||
OnInit,
|
OnInit,
|
||||||
PLATFORM_ID,
|
|
||||||
} from '@angular/core';
|
} from '@angular/core';
|
||||||
import {
|
import {
|
||||||
ActivatedRoute,
|
ActivatedRoute,
|
||||||
@@ -65,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'"
|
||||||
|
@@ -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,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,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);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -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',
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
|
@@ -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>
|
@@ -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 { EditCommunitySelectorComponent } from './edit-community-selector.component';
|
import { EditCommunitySelectorComponent } from './edit-community-selector.component';
|
||||||
|
|
||||||
describe('EditCommunitySelectorComponent', () => {
|
describe('EditCommunitySelectorComponent', () => {
|
||||||
@@ -64,7 +64,7 @@ describe('EditCommunitySelectorComponent', () => {
|
|||||||
})
|
})
|
||||||
.overrideComponent(EditCommunitySelectorComponent, {
|
.overrideComponent(EditCommunitySelectorComponent, {
|
||||||
remove: {
|
remove: {
|
||||||
imports: [DSOSelectorComponent],
|
imports: [AuthorizedCommunitySelectorComponent],
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
.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 { AuthorizedCommunitySelectorComponent } from '../../dso-selector/authorized-community-selector/authorized-community-selector.component';
|
||||||
import {
|
import {
|
||||||
DSOSelectorModalWrapperComponent,
|
DSOSelectorModalWrapperComponent,
|
||||||
SelectorActionType,
|
SelectorActionType,
|
||||||
@@ -30,10 +30,10 @@ import {
|
|||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'ds-base-edit-community-selector',
|
selector: 'ds-base-edit-community-selector',
|
||||||
templateUrl: '../dso-selector-modal-wrapper.component.html',
|
templateUrl: './edit-community-selector.component.html',
|
||||||
standalone: true,
|
standalone: true,
|
||||||
imports: [
|
imports: [
|
||||||
DSOSelectorComponent,
|
AuthorizedCommunitySelectorComponent,
|
||||||
TranslateModule,
|
TranslateModule,
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
@@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
@if (model.languageCodes && model.languageCodes.length > 0) {
|
@if (model.languageCodes && model.languageCodes.length > 0) {
|
||||||
<div class="col-xs-2" >
|
<div class="col-2" >
|
||||||
<select
|
<select
|
||||||
#language="ngModel"
|
#language="ngModel"
|
||||||
[disabled]="model.readOnly"
|
[disabled]="model.readOnly"
|
||||||
|
@@ -437,6 +437,7 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo
|
|||||||
* Unsubscribe from all subscriptions
|
* Unsubscribe from all subscriptions
|
||||||
*/
|
*/
|
||||||
ngOnDestroy(): void {
|
ngOnDestroy(): void {
|
||||||
|
super.ngOnDestroy();
|
||||||
this.subs
|
this.subs
|
||||||
.filter((sub) => hasValue(sub))
|
.filter((sub) => hasValue(sub))
|
||||||
.forEach((sub) => sub.unsubscribe());
|
.forEach((sub) => sub.unsubscribe());
|
||||||
|
@@ -24,38 +24,40 @@
|
|||||||
|
|
||||||
@if ((isHierarchicalVocabulary() | async) !== true) {
|
@if ((isHierarchicalVocabulary() | async) !== true) {
|
||||||
<div class="position-relative right-addon">
|
<div class="position-relative right-addon">
|
||||||
@if (searching || loadingInitialValue) {
|
<div class="authority-icons position-absolute d-flex align-items-center">
|
||||||
<i class="fas fa-circle-notch fa-spin fa-2x fa-fw text-primary position-absolute mt-1 p-0" aria-hidden="true"></i>
|
@if (searching || loadingInitialValue) {
|
||||||
}
|
<i class="fas fa-circle-notch fa-spin fa-2x fa-fw text-primary my-auto p-0" aria-hidden="true"></i>
|
||||||
@if (!searching && !loadingInitialValue) {
|
}
|
||||||
<i
|
@if (!searching && !loadingInitialValue) {
|
||||||
dsAuthorityConfidenceState
|
<i
|
||||||
class="far fa-circle fa-2x fa-fw position-absolute mt-1 p-0"
|
dsAuthorityConfidenceState
|
||||||
aria-hidden="true"
|
class="far fa-circle fa-2x fa-fw my-auto p-0"
|
||||||
[authorityValue]="currentValue"
|
aria-hidden="true"
|
||||||
(whenClickOnConfidenceNotAccepted)="whenClickOnConfidenceNotAccepted($event)"></i>
|
[authorityValue]="currentValue"
|
||||||
}
|
(whenClickOnConfidenceNotAccepted)="whenClickOnConfidenceNotAccepted($event)"></i>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
<input #instance="ngbTypeahead"
|
<input #instance="ngbTypeahead"
|
||||||
class="form-control"
|
class="form-control"
|
||||||
[attr.aria-labelledby]="'label_' + model.id"
|
[attr.aria-labelledby]="'label_' + model.id"
|
||||||
[attr.autoComplete]="model.autoComplete"
|
[attr.autoComplete]="model.autoComplete"
|
||||||
[attr.aria-label]="model.label | translate"
|
[attr.aria-label]="model.label | translate"
|
||||||
[class.is-invalid]="showErrorMessages"
|
[class.is-invalid]="showErrorMessages"
|
||||||
[id]="model.id"
|
[id]="model.id"
|
||||||
[inputFormatter]="formatter"
|
[inputFormatter]="formatter"
|
||||||
[name]="model.name"
|
[name]="model.name"
|
||||||
[ngbTypeahead]="search"
|
[ngbTypeahead]="search"
|
||||||
[placeholder]="model.placeholder"
|
[placeholder]="model.placeholder"
|
||||||
[readonly]="model.readOnly"
|
[readonly]="model.readOnly"
|
||||||
[disabled]="model.readOnly"
|
[disabled]="model.readOnly"
|
||||||
[resultTemplate]="rt"
|
[resultTemplate]="rt"
|
||||||
[type]="model.inputType"
|
[type]="model.inputType"
|
||||||
[(ngModel)]="currentValue"
|
[(ngModel)]="currentValue"
|
||||||
(blur)="onBlur($event)"
|
(blur)="onBlur($event)"
|
||||||
(focus)="onFocus($event)"
|
(focus)="onFocus($event)"
|
||||||
(change)="onChange($event)"
|
(change)="onChange($event)"
|
||||||
(input)="onInput($event)"
|
(input)="onInput($event)"
|
||||||
(selectItem)="onSelectItem($event)">
|
(selectItem)="onSelectItem($event)">
|
||||||
@if (searchFailed) {
|
@if (searchFailed) {
|
||||||
<div class="invalid-feedback">Sorry, suggestions could not be loaded.</div>
|
<div class="invalid-feedback">Sorry, suggestions could not be loaded.</div>
|
||||||
}
|
}
|
||||||
@@ -65,25 +67,25 @@
|
|||||||
@if ((isHierarchicalVocabulary() | async)) {
|
@if ((isHierarchicalVocabulary() | async)) {
|
||||||
<div class="position-relative right-addon">
|
<div class="position-relative right-addon">
|
||||||
<i class="dropdown-toggle position-absolute tree-toggle" (click)="openTree($event)"
|
<i class="dropdown-toggle position-absolute tree-toggle" (click)="openTree($event)"
|
||||||
aria-hidden="true"></i>
|
aria-hidden="true"></i>
|
||||||
<input class="form-control"
|
<input class="form-control"
|
||||||
[attr.aria-labelledby]="'label_' + model.id"
|
[attr.aria-labelledby]="'label_' + model.id"
|
||||||
[attr.autoComplete]="model.autoComplete"
|
[attr.autoComplete]="model.autoComplete"
|
||||||
[attr.aria-label]="model.label | translate"
|
[attr.aria-label]="model.label | translate"
|
||||||
[class.is-invalid]="showErrorMessages"
|
[class.is-invalid]="showErrorMessages"
|
||||||
[class.tree-input]="!model.readOnly"
|
[class.tree-input]="!model.readOnly"
|
||||||
[id]="id"
|
[id]="id"
|
||||||
[name]="model.name"
|
[name]="model.name"
|
||||||
[placeholder]="model.placeholder"
|
[placeholder]="model.placeholder"
|
||||||
[readonly]="true"
|
[readonly]="true"
|
||||||
[disabled]="model.readOnly"
|
[disabled]="model.readOnly"
|
||||||
[type]="model.inputType"
|
[type]="model.inputType"
|
||||||
[value]="currentValue?.display"
|
[value]="currentValue?.display"
|
||||||
(focus)="onFocus($event)"
|
(focus)="onFocus($event)"
|
||||||
(change)="onChange($event)"
|
(change)="onChange($event)"
|
||||||
(click)="openTree($event)"
|
(click)="openTree($event)"
|
||||||
(keydown)="$event.preventDefault()"
|
(keydown)="$event.preventDefault()"
|
||||||
(keypress)="$event.preventDefault()"
|
(keypress)="$event.preventDefault()"
|
||||||
(keyup)="$event.preventDefault()">
|
(keyup)="$event.preventDefault()">
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
@@ -31,3 +31,9 @@
|
|||||||
.tree-input[readonly]{
|
.tree-input[readonly]{
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.authority-icons {
|
||||||
|
top: 50%;
|
||||||
|
right: 0;
|
||||||
|
transform: translateY(-50%)
|
||||||
|
}
|
||||||
|
@@ -45,10 +45,10 @@ import { FormFieldMetadataValueObject } from '../../../models/form-field-metadat
|
|||||||
import { DsDynamicTagComponent } from './dynamic-tag.component';
|
import { DsDynamicTagComponent } from './dynamic-tag.component';
|
||||||
import { DynamicTagModel } from './dynamic-tag.model';
|
import { DynamicTagModel } from './dynamic-tag.model';
|
||||||
|
|
||||||
function createKeyUpEvent(key: number) {
|
function createKeyUpEvent(key: string) {
|
||||||
/* eslint-disable no-empty,@typescript-eslint/no-empty-function */
|
/* eslint-disable no-empty,@typescript-eslint/no-empty-function */
|
||||||
const event = {
|
const event = {
|
||||||
keyCode: key, preventDefault: () => {
|
key: key, preventDefault: () => {
|
||||||
}, stopPropagation: () => {
|
}, stopPropagation: () => {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -278,8 +278,8 @@ describe('DsDynamicTagComponent test suite', () => {
|
|||||||
expect(tagComp.chips.getChipsItems()).toEqual(chips.getChipsItems());
|
expect(tagComp.chips.getChipsItems()).toEqual(chips.getChipsItems());
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should add an item on ENTER or key press is \',\' or \';\'', fakeAsync(() => {
|
it('should add an item on ENTER or key press is \',\'', fakeAsync(() => {
|
||||||
let event = createKeyUpEvent(13);
|
let event = createKeyUpEvent('Enter');
|
||||||
tagComp.currentValue = 'test value';
|
tagComp.currentValue = 'test value';
|
||||||
|
|
||||||
tagFixture.detectChanges();
|
tagFixture.detectChanges();
|
||||||
@@ -290,7 +290,7 @@ describe('DsDynamicTagComponent test suite', () => {
|
|||||||
expect(tagComp.model.value).toEqual(['test value']);
|
expect(tagComp.model.value).toEqual(['test value']);
|
||||||
expect(tagComp.currentValue).toBeNull();
|
expect(tagComp.currentValue).toBeNull();
|
||||||
|
|
||||||
event = createKeyUpEvent(188);
|
event = createKeyUpEvent(',');
|
||||||
tagComp.currentValue = 'test value';
|
tagComp.currentValue = 'test value';
|
||||||
|
|
||||||
tagFixture.detectChanges();
|
tagFixture.detectChanges();
|
||||||
|
@@ -219,13 +219,15 @@ export class DsDynamicTagComponent extends DsDynamicVocabularyComponent implemen
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new tag with typed text when typing 'Enter' or ',' or ';'
|
* Add a new tag with typed text when typing 'Enter' or ','
|
||||||
|
* Tests the key rather than keyCode as keyCodes can vary
|
||||||
|
* based on keyboard layout (and do not consider Shift mod)
|
||||||
* @param event the keyUp event
|
* @param event the keyUp event
|
||||||
*/
|
*/
|
||||||
onKeyUp(event) {
|
onKeyUp(event) {
|
||||||
if (event.keyCode === 13 || event.keyCode === 188) {
|
if (event.key === 'Enter' || event.key === ',') {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
// Key: 'Enter' or ',' or ';'
|
// Key: 'Enter' or ','
|
||||||
this.addTagsToChips();
|
this.addTagsToChips();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
}
|
}
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
<!--Array with repeatable items-->
|
<!--Array with repeatable items-->
|
||||||
@if ((!context.notRepeatable) && !isVirtual(context, index) && group.context.groups.length !== 1 && !isItemReadOnly(context, index)) {
|
@if ((!context.notRepeatable) && !isVirtual(context, index) && group.context.groups.length !== 1 && !isItemReadOnly(context, index)) {
|
||||||
<div
|
<div
|
||||||
class="col-xs-2 d-flex flex-column justify-content-sm-start align-items-end">
|
class="col-2 d-flex flex-column justify-content-sm-start align-items-end">
|
||||||
<button type="button" class="btn btn-secondary" role="button"
|
<button type="button" class="btn btn-secondary" role="button"
|
||||||
title="{{'form.remove' | translate}}"
|
title="{{'form.remove' | translate}}"
|
||||||
[attr.aria-label]="'form.remove' | translate"
|
[attr.aria-label]="'form.remove' | translate"
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
<!--Array with non repeatable items - Only discard button-->
|
<!--Array with non repeatable items - Only discard button-->
|
||||||
@if (context.notRepeatable && context.showButtons && group.context.groups.length > 1) {
|
@if (context.notRepeatable && context.showButtons && group.context.groups.length > 1) {
|
||||||
<div
|
<div
|
||||||
class="col-xs-2 d-flex flex-column justify-content-sm-start align-items-end">
|
class="col-2 d-flex flex-column justify-content-sm-start align-items-end">
|
||||||
<div class="btn-group" role="button">
|
<div class="btn-group" role="button">
|
||||||
<button type="button" class="btn btn-secondary"
|
<button type="button" class="btn btn-secondary"
|
||||||
title="{{'form.discard' | translate}}"
|
title="{{'form.discard' | translate}}"
|
||||||
|
@@ -232,7 +232,7 @@ export class FormComponent implements OnDestroy, OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (field) {
|
if (field) {
|
||||||
const model: DynamicFormControlModel = this.formBuilderService.findById(fieldId, formModel);
|
const model: DynamicFormControlModel = this.formBuilderService.findById(fieldId, formModel, fieldIndex);
|
||||||
this.formService.addErrorToField(field, model, error.message);
|
this.formService.addErrorToField(field, model, error.message);
|
||||||
this.changeDetectorRef.detectChanges();
|
this.changeDetectorRef.detectChanges();
|
||||||
|
|
||||||
@@ -255,7 +255,7 @@ export class FormComponent implements OnDestroy, OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (field) {
|
if (field) {
|
||||||
const model: DynamicFormControlModel = this.formBuilderService.findById(fieldId, formModel);
|
const model: DynamicFormControlModel = this.formBuilderService.findById(fieldId, formModel, fieldIndex);
|
||||||
this.formService.removeErrorFromField(field, model, error.message);
|
this.formService.removeErrorFromField(field, model, error.message);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -21,6 +21,7 @@ import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vo
|
|||||||
import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||||
import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model';
|
import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model';
|
||||||
import { VocabularyService } from '../../../core/submission/vocabularies/vocabulary.service';
|
import { VocabularyService } from '../../../core/submission/vocabularies/vocabulary.service';
|
||||||
|
import { createSuccessfulRemoteDataObject$ } from '../../remote-data.utils';
|
||||||
import { createTestComponent } from '../../testing/utils.test';
|
import { createTestComponent } from '../../testing/utils.test';
|
||||||
import { FormFieldMetadataValueObject } from '../builder/models/form-field-metadata-value.model';
|
import { FormFieldMetadataValueObject } from '../builder/models/form-field-metadata-value.model';
|
||||||
import { VocabularyTreeviewComponent } from './vocabulary-treeview.component';
|
import { VocabularyTreeviewComponent } from './vocabulary-treeview.component';
|
||||||
@@ -63,6 +64,7 @@ describe('VocabularyTreeviewComponent test suite', () => {
|
|||||||
searchTopEntries: jasmine.createSpy('searchTopEntries'),
|
searchTopEntries: jasmine.createSpy('searchTopEntries'),
|
||||||
getEntryDetailChildren: jasmine.createSpy('getEntryDetailChildren'),
|
getEntryDetailChildren: jasmine.createSpy('getEntryDetailChildren'),
|
||||||
clearSearchTopRequests: jasmine.createSpy('clearSearchTopRequests'),
|
clearSearchTopRequests: jasmine.createSpy('clearSearchTopRequests'),
|
||||||
|
findVocabularyById: createSuccessfulRemoteDataObject$({ preloadLevel: 2 }),
|
||||||
});
|
});
|
||||||
|
|
||||||
beforeEach(waitForAsync(() => {
|
beforeEach(waitForAsync(() => {
|
||||||
|
@@ -22,8 +22,17 @@ import {
|
|||||||
Observable,
|
Observable,
|
||||||
Subscription,
|
Subscription,
|
||||||
} from 'rxjs';
|
} from 'rxjs';
|
||||||
|
import {
|
||||||
|
map,
|
||||||
|
switchMap,
|
||||||
|
tap,
|
||||||
|
} from 'rxjs/operators';
|
||||||
|
import { VocabularyService } from 'src/app/core/submission/vocabularies/vocabulary.service';
|
||||||
|
|
||||||
|
import { RemoteData } from '../../../core/data/remote-data';
|
||||||
|
import { getFirstCompletedRemoteData } from '../../../core/shared/operators';
|
||||||
import { PageInfo } from '../../../core/shared/page-info.model';
|
import { PageInfo } from '../../../core/shared/page-info.model';
|
||||||
|
import { Vocabulary } from '../../../core/submission/vocabularies/models/vocabulary.model';
|
||||||
import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||||
import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
|
||||||
import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model';
|
import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model';
|
||||||
@@ -166,6 +175,7 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit, OnChanges
|
|||||||
*/
|
*/
|
||||||
constructor(
|
constructor(
|
||||||
private vocabularyTreeviewService: VocabularyTreeviewService,
|
private vocabularyTreeviewService: VocabularyTreeviewService,
|
||||||
|
protected vocabularyService: VocabularyService,
|
||||||
) {
|
) {
|
||||||
this.treeFlattener = new VocabularyTreeFlattener(this.transformer, this.getLevel,
|
this.treeFlattener = new VocabularyTreeFlattener(this.transformer, this.getLevel,
|
||||||
this.isExpandable, this.getChildren);
|
this.isExpandable, this.getChildren);
|
||||||
@@ -207,12 +217,20 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit, OnChanges
|
|||||||
);
|
);
|
||||||
this.nodeMap.set(entryId, newNode);
|
this.nodeMap.set(entryId, newNode);
|
||||||
|
|
||||||
if ((((level + 1) < this.preloadLevel) && newNode.childrenLoaded)
|
if ((((level + 1) < this.preloadLevel))
|
||||||
|| (newNode.isSearchNode && newNode.childrenLoaded)
|
|| (newNode.isSearchNode && newNode.childrenLoaded)
|
||||||
|| newNode.isInInitValueHierarchy) {
|
|| newNode.isInInitValueHierarchy) {
|
||||||
if (!newNode.isSearchNode) {
|
|
||||||
|
if (newNode.item.id === LOAD_MORE || newNode.item.id === LOAD_MORE_ROOT) {
|
||||||
|
// When a 'LOAD_MORE' node is encountered, the parent already has a lot of expanded children
|
||||||
|
// so this is a good point to stop expanding.
|
||||||
|
return newNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!newNode.childrenLoaded) {
|
||||||
this.loadChildren(newNode);
|
this.loadChildren(newNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.treeControl.expand(newNode);
|
this.treeControl.expand(newNode);
|
||||||
}
|
}
|
||||||
return newNode;
|
return newNode;
|
||||||
@@ -253,15 +271,31 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit, OnChanges
|
|||||||
*/
|
*/
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
this.subs.push(
|
this.subs.push(
|
||||||
this.vocabularyTreeviewService.getData().subscribe((data) => {
|
this.vocabularyService.findVocabularyById(this.vocabularyOptions.name).pipe(
|
||||||
|
// Retrieve the configured preloadLevel from REST
|
||||||
|
getFirstCompletedRemoteData(),
|
||||||
|
map((vocabularyRD: RemoteData<Vocabulary>) => {
|
||||||
|
if (vocabularyRD.hasSucceeded &&
|
||||||
|
hasValue(vocabularyRD.payload.preloadLevel) &&
|
||||||
|
vocabularyRD.payload.preloadLevel > 1) {
|
||||||
|
return vocabularyRD.payload.preloadLevel;
|
||||||
|
} else {
|
||||||
|
// Set preload level to 1 in case request fails
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
tap(preloadLevel => this.preloadLevel = preloadLevel),
|
||||||
|
tap(() => {
|
||||||
|
const entryId: string = (this.selectedItems?.length > 0) ? this.getEntryId(this.selectedItems[0]) : null;
|
||||||
|
this.vocabularyTreeviewService.initialize(this.vocabularyOptions, new PageInfo(), this.getSelectedEntryIds(), entryId);
|
||||||
|
}),
|
||||||
|
switchMap(() => this.vocabularyTreeviewService.getData()),
|
||||||
|
).subscribe((data) => {
|
||||||
this.dataSource.data = data;
|
this.dataSource.data = data;
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
this.loading = this.vocabularyTreeviewService.isLoading();
|
this.loading = this.vocabularyTreeviewService.isLoading();
|
||||||
|
|
||||||
const entryId: string = (this.selectedItems?.length > 0) ? this.getEntryId(this.selectedItems[0]) : null;
|
|
||||||
this.vocabularyTreeviewService.initialize(this.vocabularyOptions, new PageInfo(), this.getSelectedEntryIds(), entryId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -37,6 +37,8 @@ import { GeospatialMapDetail } from './models/geospatial-map-detail.model';
|
|||||||
* Component to draw points and polygons on a tiled map using leaflet.js
|
* Component to draw points and polygons on a tiled map using leaflet.js
|
||||||
* This component can be used by item page fields, the browse-by geospatial component, and the geospatial search
|
* This component can be used by item page fields, the browse-by geospatial component, and the geospatial search
|
||||||
* view mode to render related places of an item (e.g. metadata on a page), or items *as* places (e.g. browse / search)
|
* view mode to render related places of an item (e.g. metadata on a page), or items *as* places (e.g. browse / search)
|
||||||
|
*
|
||||||
|
* This component should be used in a `@defer` block to keep geospatial mapping libraries out of the main bundle!
|
||||||
*/
|
*/
|
||||||
export class GeospatialMapComponent implements AfterViewInit, OnInit, OnDestroy {
|
export class GeospatialMapComponent implements AfterViewInit, OnInit, OnDestroy {
|
||||||
|
|
||||||
@@ -134,6 +136,7 @@ export class GeospatialMapComponent implements AfterViewInit, OnInit, OnDestroy
|
|||||||
private initMap(): void {
|
private initMap(): void {
|
||||||
// 'Import' leaflet packages in a browser-mode-only way to avoid issues with SSR
|
// 'Import' leaflet packages in a browser-mode-only way to avoid issues with SSR
|
||||||
const L = require('leaflet'); require('leaflet.markercluster'); require('leaflet-providers');
|
const L = require('leaflet'); require('leaflet.markercluster'); require('leaflet-providers');
|
||||||
|
|
||||||
// Set better default icons
|
// Set better default icons
|
||||||
L.Icon.Default.mergeOptions({
|
L.Icon.Default.mergeOptions({
|
||||||
iconRetinaUrl: 'assets/images/marker-icon-2x.png',
|
iconRetinaUrl: 'assets/images/marker-icon-2x.png',
|
||||||
@@ -150,13 +153,19 @@ export class GeospatialMapComponent implements AfterViewInit, OnInit, OnDestroy
|
|||||||
this.map = L.map(el, {
|
this.map = L.map(el, {
|
||||||
center: this.DEFAULT_CENTRE_POINT,
|
center: this.DEFAULT_CENTRE_POINT,
|
||||||
zoom: 11,
|
zoom: 11,
|
||||||
|
worldCopyJump: true,
|
||||||
|
maxBoundsViscosity: 1.0,
|
||||||
|
maxBounds: [
|
||||||
|
[-85, -Infinity],
|
||||||
|
[85, Infinity],
|
||||||
|
],
|
||||||
});
|
});
|
||||||
const tileProviders = environment.geospatialMapViewer.tileProviders;
|
const tileProviders = environment.geospatialMapViewer.tileProviders;
|
||||||
for (let i = 0; i < tileProviders.length; i++) {
|
for (let i = 0; i < tileProviders.length; i++) {
|
||||||
// Add tiles to the map
|
// Add tiles to the map
|
||||||
const tiles = L.tileLayer.provider(tileProviders[i], {
|
const tiles = L.tileLayer.provider(tileProviders[i], {
|
||||||
maxZoom: 18,
|
maxZoom: 18,
|
||||||
minZoom: 3,
|
minZoom: 1,
|
||||||
});
|
});
|
||||||
tiles.addTo(this.map);
|
tiles.addTo(this.map);
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
@if ((currentMode$ | async) === viewModeEnum.GeospatialMap) {
|
@if ((currentMode$ | async) === viewModeEnum.GeospatialMap) {
|
||||||
<ds-object-geospatial-map [objects]="objects">
|
@defer {
|
||||||
</ds-object-geospatial-map>
|
<ds-object-geospatial-map [objects]="objects">
|
||||||
|
</ds-object-geospatial-map>
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@if ((currentMode$ | async) === viewModeEnum.ListElement || (currentMode$ | async) === viewModeEnum.GeospatialMap) {
|
@if ((currentMode$ | async) === viewModeEnum.ListElement || (currentMode$ | async) === viewModeEnum.GeospatialMap) {
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
<ds-item-page-title-field [item]="item">
|
<ds-item-page-title-field [item]="item">
|
||||||
</ds-item-page-title-field>
|
</ds-item-page-title-field>
|
||||||
<div class="row mb-1">
|
<div class="row mb-1">
|
||||||
<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]="item?.thumbnail | async"></ds-thumbnail>
|
<ds-thumbnail [thumbnail]="item?.thumbnail | async"></ds-thumbnail>
|
||||||
</ds-metadata-field-wrapper>
|
</ds-metadata-field-wrapper>
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
[placeholder]="('mydspace.results.no-authors' | translate)">
|
[placeholder]="('mydspace.results.no-authors' | translate)">
|
||||||
</ds-item-detail-preview-field>
|
</ds-item-detail-preview-field>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-12 col-md-6">
|
<div class="col-12 col-md-6">
|
||||||
<ds-item-detail-preview-field [item]="item"
|
<ds-item-detail-preview-field [item]="item"
|
||||||
[object]="object"
|
[object]="object"
|
||||||
[label]="('item.page.abstract' | translate)"
|
[label]="('item.page.abstract' | translate)"
|
||||||
|
@@ -1,3 +1,5 @@
|
|||||||
@if (isPlatformBrowser(platformId)) {
|
<!--
|
||||||
<ds-geospatial-map [mapInfo]="mapInfo"></ds-geospatial-map>
|
Note: ds-object-geospatial-map itself should be rendered in a @defer block, so we don't need one here.
|
||||||
}
|
https://angular.dev/guide/templates/defer#avoid-cascading-loads-with-nested-defer-blocks
|
||||||
|
-->
|
||||||
|
<ds-geospatial-map [mapInfo]="mapInfo"></ds-geospatial-map>
|
||||||
|
@@ -37,7 +37,9 @@ import { parseGeoJsonFromMetadataValue } from '../utils/geospatial.functions';
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* This component is used with the GeospatialMap ViewMode in search or browse results, and
|
* This component is used with the GeospatialMap ViewMode in search or browse results, and
|
||||||
* prepares geospatial data collection for display on the GeospatialMapComponent
|
* prepares geospatial data collection for display on the GeospatialMapComponent.
|
||||||
|
*
|
||||||
|
* This component should be used in a `@defer` block to keep geospatial mapping libraries out of the main bundle!
|
||||||
*/
|
*/
|
||||||
export class ObjectGeospatialMapComponent {
|
export class ObjectGeospatialMapComponent {
|
||||||
|
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
<div class="d-flex flex-row">
|
<div class="d-flex flex-row">
|
||||||
@if (linkType !== linkTypes.None) {
|
@if (linkType !== linkTypes.None) {
|
||||||
<a [target]="(linkType === linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType === linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[]" [queryParams]="queryParams$ | async" [queryParamsHandling]="'merge'" class="lead" role="link" tabindex="0">
|
<a [target]="(linkType === linkTypes.ExternalLink) ? '_blank' : '_self'" [attr.rel]="(linkType === linkTypes.ExternalLink) ? 'noopener noreferrer' : null" [routerLink]="[]" [queryParams]="queryParams$ | async" class="lead" role="link" tabindex="0">
|
||||||
{{object.value}}
|
{{object.value}}
|
||||||
</a>
|
</a>
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
(prev)="goPrev()"
|
(prev)="goPrev()"
|
||||||
(next)="goNext()">
|
(next)="goNext()">
|
||||||
@if (objects?.hasSucceeded) {
|
@if (objects?.hasSucceeded) {
|
||||||
<ul class="list-unstyled" [ngClass]="{'ml-4': selectable}" data-test="objects">
|
<ul class="list-unstyled" [ngClass]="{'ms-4': selectable}" data-test="objects">
|
||||||
@for (object of objects?.payload?.page; track object; let i = $index; let last = $last) {
|
@for (object of objects?.payload?.page; track object; let i = $index; let last = $last) {
|
||||||
<li class="mt-4 mb-4 d-flex" [class.border-bottom]="hasBorder && !last" [attr.data-test]="'list-object' | dsBrowserOnly">
|
<li class="mt-4 mb-4 d-flex" [class.border-bottom]="hasBorder && !last" [attr.data-test]="'list-object' | dsBrowserOnly">
|
||||||
@if (selectable) {
|
@if (selectable) {
|
||||||
|
@@ -45,7 +45,7 @@
|
|||||||
[ngClass]="{'btn-danger': dangerConfirm, 'btn-primary': !dangerConfirm}"
|
[ngClass]="{'btn-danger': dangerConfirm, 'btn-primary': !dangerConfirm}"
|
||||||
[dsBtnDisabled]="selectedIds?.length === 0"
|
[dsBtnDisabled]="selectedIds?.length === 0"
|
||||||
(click)="confirmSelected()">
|
(click)="confirmSelected()">
|
||||||
<i class="fas fa-trash"></i> {{confirmButton | translate}}
|
<i class="fas" [ngClass]="{'fa-trash': dangerConfirm, 'fa-save': !dangerConfirm}"></i> {{confirmButton | translate}}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
@@ -100,7 +100,7 @@ describe('StartsWithDateComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should add a startsWith query parameter', () => {
|
it('should add a startsWith query parameter', () => {
|
||||||
expect(paginationService.updateRoute).toHaveBeenCalledWith('page-id', { page: 1 }, { startsWith: expectedValue });
|
expect(paginationService.updateRoute).toHaveBeenCalledWith('page-id', { page: 1 }, { startsWith: expectedValue }, undefined, { queryParamsHandling: '' });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should automatically fill in the input field', () => {
|
it('should automatically fill in the input field', () => {
|
||||||
@@ -122,7 +122,7 @@ describe('StartsWithDateComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should add a startsWith query parameter', () => {
|
it('should add a startsWith query parameter', () => {
|
||||||
expect(paginationService.updateRoute).toHaveBeenCalledWith('page-id', { page: 1 }, { startsWith: expectedValue });
|
expect(paginationService.updateRoute).toHaveBeenCalledWith('page-id', { page: 1 }, { startsWith: expectedValue }, undefined, { queryParamsHandling: '' });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should automatically fill in the input field', () => {
|
it('should automatically fill in the input field', () => {
|
||||||
@@ -146,7 +146,7 @@ describe('StartsWithDateComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should add a startsWith query parameter', () => {
|
it('should add a startsWith query parameter', () => {
|
||||||
expect(paginationService.updateRoute).toHaveBeenCalledWith('page-id', { page: 1 }, { startsWith: expectedValue });
|
expect(paginationService.updateRoute).toHaveBeenCalledWith('page-id', { page: 1 }, { startsWith: expectedValue }, undefined, { queryParamsHandling: '' });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should automatically fill in the input field', () => {
|
it('should automatically fill in the input field', () => {
|
||||||
@@ -171,7 +171,7 @@ describe('StartsWithDateComponent', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should add a startsWith query parameter', () => {
|
it('should add a startsWith query parameter', () => {
|
||||||
expect(paginationService.updateRoute).toHaveBeenCalledWith('page-id', { page: 1 }, { startsWith: expectedValue });
|
expect(paginationService.updateRoute).toHaveBeenCalledWith('page-id', { page: 1 }, { startsWith: expectedValue }, undefined, { queryParamsHandling: '' });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -92,11 +92,10 @@ export abstract class StartsWithAbstractComponent implements OnInit, OnDestroy {
|
|||||||
this.startsWith = undefined;
|
this.startsWith = undefined;
|
||||||
}
|
}
|
||||||
if (resetPage) {
|
if (resetPage) {
|
||||||
this.paginationService.updateRoute(this.paginationId, { page: 1 }, { startsWith: this.startsWith });
|
this.paginationService.updateRoute(this.paginationId, { page: 1 }, { startsWith: this.startsWith }, undefined, { queryParamsHandling: '' });
|
||||||
} else {
|
} else {
|
||||||
void this.router.navigate([], {
|
void this.router.navigate([], {
|
||||||
queryParams: Object.assign({ startsWith: this.startsWith }),
|
queryParams: Object.assign({ startsWith: this.startsWith }),
|
||||||
queryParamsHandling: 'merge',
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -74,8 +74,8 @@ describe('StartsWithTextComponent', () => {
|
|||||||
expect(comp.startsWith).toEqual(expectedValue);
|
expect(comp.startsWith).toEqual(expectedValue);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should add a startsWith query parameter', () => {
|
it('should add a startsWith query parameter and clear all others', () => {
|
||||||
expect(paginationService.updateRoute).toHaveBeenCalledWith('page-id', { page: 1 }, { startsWith: expectedValue });
|
expect(paginationService.updateRoute).toHaveBeenCalledWith('page-id', { page: 1 }, { startsWith: expectedValue }, undefined, { queryParamsHandling: '' });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -8,6 +8,3 @@ import { ResourceType } from '../../../core/shared/resource-type';
|
|||||||
|
|
||||||
|
|
||||||
export const SUBMISSION_COAR_NOTIFY_CONFIG = new ResourceType('submissioncoarnotifyconfig');
|
export const SUBMISSION_COAR_NOTIFY_CONFIG = new ResourceType('submissioncoarnotifyconfig');
|
||||||
|
|
||||||
export const COAR_NOTIFY_WORKSPACEITEM = new ResourceType('workspaceitem');
|
|
||||||
|
|
||||||
|
@@ -1,39 +0,0 @@
|
|||||||
import {
|
|
||||||
autoserialize,
|
|
||||||
deserialize,
|
|
||||||
deserializeAs,
|
|
||||||
inheritSerialization,
|
|
||||||
} from 'cerialize';
|
|
||||||
|
|
||||||
import { typedObject } from '../../../core/cache/builders/build-decorators';
|
|
||||||
import { CacheableObject } from '../../../core/cache/cacheable-object.model';
|
|
||||||
import { excludeFromEquals } from '../../../core/utilities/equals.decorators';
|
|
||||||
import { COAR_NOTIFY_WORKSPACEITEM } from './section-coar-notify-service.resource-type';
|
|
||||||
|
|
||||||
/** An CoarNotify and its properties. */
|
|
||||||
@typedObject
|
|
||||||
@inheritSerialization(CacheableObject)
|
|
||||||
export class SubmissionCoarNotifyWorkspaceitemModel extends CacheableObject {
|
|
||||||
static type = COAR_NOTIFY_WORKSPACEITEM;
|
|
||||||
|
|
||||||
@excludeFromEquals
|
|
||||||
@autoserialize
|
|
||||||
endorsement?: number[];
|
|
||||||
|
|
||||||
@deserializeAs('id')
|
|
||||||
review?: number[];
|
|
||||||
|
|
||||||
@autoserialize
|
|
||||||
ingest?: number[];
|
|
||||||
|
|
||||||
@deserialize
|
|
||||||
_links: {
|
|
||||||
self: {
|
|
||||||
href: string;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
get self(): string {
|
|
||||||
return this._links.self.href;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -11,7 +11,7 @@
|
|||||||
<!-- don't use *ngIf="!isLoading" so the thumbnail can load in while the animation is playing -->
|
<!-- don't use *ngIf="!isLoading" so the thumbnail can load in while the animation is playing -->
|
||||||
@if (src() !== null) {
|
@if (src() !== null) {
|
||||||
<img class="thumbnail-content img-fluid"
|
<img class="thumbnail-content img-fluid"
|
||||||
[class.d-none]="isLoading"
|
[class.d-none]="isLoading()"
|
||||||
[src]="src() | dsSafeUrl"
|
[src]="src() | dsSafeUrl"
|
||||||
[alt]="alt | translate"
|
[alt]="alt | translate"
|
||||||
(error)="errorHandler()"
|
(error)="errorHandler()"
|
||||||
|
@@ -459,6 +459,22 @@
|
|||||||
// "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"",
|
// "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"",
|
||||||
"admin.access-control.epeople.table.edit.buttons.remove": "حذف \"{{name}}\"",
|
"admin.access-control.epeople.table.edit.buttons.remove": "حذف \"{{name}}\"",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.cancel": "Cancel",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.cancel": "Cancel",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.confirm": "Delete",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.confirm": "Delete",
|
||||||
|
|
||||||
// "admin.access-control.epeople.no-items": "No EPeople to show.",
|
// "admin.access-control.epeople.no-items": "No EPeople to show.",
|
||||||
"admin.access-control.epeople.no-items": "لا يوجد أشخاص إلكترونيين للعرض.",
|
"admin.access-control.epeople.no-items": "لا يوجد أشخاص إلكترونيين للعرض.",
|
||||||
|
|
||||||
@@ -651,7 +667,8 @@
|
|||||||
// "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"",
|
// "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
"admin.access-control.groups.form.delete-group.modal.header": "حذف المجموعة \"{{ dsoName }}\"",
|
"admin.access-control.groups.form.delete-group.modal.header": "حذف المجموعة \"{{ dsoName }}\"",
|
||||||
|
|
||||||
// "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"",
|
// "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
// TODO Source message changed - Revise the translation
|
||||||
"admin.access-control.groups.form.delete-group.modal.info": "هل أنت متأكد من أنك ترغب في حذف المجموعة \"{{ dsoName }}\"",
|
"admin.access-control.groups.form.delete-group.modal.info": "هل أنت متأكد من أنك ترغب في حذف المجموعة \"{{ dsoName }}\"",
|
||||||
|
|
||||||
// "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel",
|
// "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel",
|
||||||
@@ -2407,6 +2424,22 @@
|
|||||||
// "comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group",
|
// "comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group",
|
||||||
"comcol-role.edit.delete.error.title": "فشل حذف مجموعة الدور '{{ role }}'",
|
"comcol-role.edit.delete.error.title": "فشل حذف مجموعة الدور '{{ role }}'",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.cancel": "Cancel",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.cancel": "Cancel",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.confirm": "Delete",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.confirm": "Delete",
|
||||||
|
|
||||||
// "comcol-role.edit.community-admin.name": "Administrators",
|
// "comcol-role.edit.community-admin.name": "Administrators",
|
||||||
"comcol-role.edit.community-admin.name": "المسؤولون",
|
"comcol-role.edit.community-admin.name": "المسؤولون",
|
||||||
|
|
||||||
@@ -2560,7 +2593,7 @@
|
|||||||
|
|
||||||
// "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: {purposes}",
|
// "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: {purposes}",
|
||||||
// TODO Source message changed - Revise the translation
|
// TODO Source message changed - Revise the translation
|
||||||
"cookies.consent.content-notice.description": "نقوم بجمع ومعالجة معلوماتك الشخصية للأغراض التالية: <strong>الاستيثاق، والتفضيلات، والإقرار، والإحصائيات</strong>. <br/> لمعرفة المزيد، يرجى قراءة {privacyPolicy}.",
|
"cookies.consent.content-notice.description": "نقوم بجمع ومعالجة معلوماتك الشخصية للأغراض التالية: الاستيثاق، والتفضيلات، والإقرار، والإحصائيات. لمعرفة المزيد، يرجى قراءة {privacyPolicy}.",
|
||||||
|
|
||||||
// "cookies.consent.content-notice.learnMore": "Customize",
|
// "cookies.consent.content-notice.learnMore": "Customize",
|
||||||
"cookies.consent.content-notice.learnMore": "تخصيص",
|
"cookies.consent.content-notice.learnMore": "تخصيص",
|
||||||
@@ -11749,4 +11782,4 @@
|
|||||||
"file-download-link.request-copy": "Request a copy of ",
|
"file-download-link.request-copy": "Request a copy of ",
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -500,6 +500,22 @@
|
|||||||
// "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"",
|
// "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"",
|
||||||
"admin.access-control.epeople.table.edit.buttons.remove": "\"{{ name }}\" মুছে ফেলুন",
|
"admin.access-control.epeople.table.edit.buttons.remove": "\"{{ name }}\" মুছে ফেলুন",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.cancel": "Cancel",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.cancel": "Cancel",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.confirm": "Delete",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.confirm": "Delete",
|
||||||
|
|
||||||
// "admin.access-control.epeople.no-items": "No EPeople to show.",
|
// "admin.access-control.epeople.no-items": "No EPeople to show.",
|
||||||
"admin.access-control.epeople.no-items": "কোন ই-পারসিওন প্রদর্শন করার জন্যে নেই।",
|
"admin.access-control.epeople.no-items": "কোন ই-পারসিওন প্রদর্শন করার জন্যে নেই।",
|
||||||
|
|
||||||
@@ -695,7 +711,8 @@
|
|||||||
// "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"",
|
// "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
"admin.access-control.groups.form.delete-group.modal.header": "গ্রুপ মুছে ফেলুন \"{{ dsoName }}\"",
|
"admin.access-control.groups.form.delete-group.modal.header": "গ্রুপ মুছে ফেলুন \"{{ dsoName }}\"",
|
||||||
|
|
||||||
// "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"",
|
// "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
// TODO Source message changed - Revise the translation
|
||||||
"admin.access-control.groups.form.delete-group.modal.info": "আপনি কি গ্রুপ \"{{ dsoName }}\" মুছে ফেলতে চান তা নিশ্চিত করুন।",
|
"admin.access-control.groups.form.delete-group.modal.info": "আপনি কি গ্রুপ \"{{ dsoName }}\" মুছে ফেলতে চান তা নিশ্চিত করুন।",
|
||||||
|
|
||||||
// "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel",
|
// "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel",
|
||||||
@@ -2558,6 +2575,22 @@
|
|||||||
// TODO New key - Add a translation
|
// TODO New key - Add a translation
|
||||||
"comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group",
|
"comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.cancel": "Cancel",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.cancel": "Cancel",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.confirm": "Delete",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.confirm": "Delete",
|
||||||
|
|
||||||
// "comcol-role.edit.community-admin.name": "Administrators",
|
// "comcol-role.edit.community-admin.name": "Administrators",
|
||||||
"comcol-role.edit.community-admin.name": "প্রশাসক",
|
"comcol-role.edit.community-admin.name": "প্রশাসক",
|
||||||
|
|
||||||
@@ -2718,7 +2751,7 @@
|
|||||||
|
|
||||||
// "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: {purposes}",
|
// "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: {purposes}",
|
||||||
// TODO Source message changed - Revise the translation
|
// TODO Source message changed - Revise the translation
|
||||||
"cookies.consent.content-notice.description": "আমরা নিম্নলিখিত উদ্দেশ্যে আপনার ব্যক্তিগত তথ্য সংগ্রহ এবং প্রক্রিয়া করি: <strong>প্রমাণিকরণ, পছন্দ, স্বীকৃতি এবং পরিসংখ্যান</strong>। <br/> আরও জানতে, অনুগ্রহ করে আমাদের {privacyPolicy} পড়ুন.",
|
"cookies.consent.content-notice.description": "আমরা নিম্নলিখিত উদ্দেশ্যে আপনার ব্যক্তিগত তথ্য সংগ্রহ এবং প্রক্রিয়া করি: প্রমাণিকরণ, পছন্দ, স্বীকৃতি এবং পরিসংখ্যান। আরও জানতে, অনুগ্রহ করে আমাদের {privacyPolicy} পড়ুন.",
|
||||||
|
|
||||||
// "cookies.consent.content-notice.learnMore": "Customize",
|
// "cookies.consent.content-notice.learnMore": "Customize",
|
||||||
"cookies.consent.content-notice.learnMore": "কাস্টমাইজ করুন",
|
"cookies.consent.content-notice.learnMore": "কাস্টমাইজ করুন",
|
||||||
@@ -12671,4 +12704,4 @@
|
|||||||
"file-download-link.request-copy": "Request a copy of ",
|
"file-download-link.request-copy": "Request a copy of ",
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -459,6 +459,22 @@
|
|||||||
// "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"",
|
// "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"",
|
||||||
"admin.access-control.epeople.table.edit.buttons.remove": "Eliminar \"{{ name }}\"",
|
"admin.access-control.epeople.table.edit.buttons.remove": "Eliminar \"{{ name }}\"",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.cancel": "Cancel",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.cancel": "Cancel",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.confirm": "Delete",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.confirm": "Delete",
|
||||||
|
|
||||||
// "admin.access-control.epeople.no-items": "No EPeople to show.",
|
// "admin.access-control.epeople.no-items": "No EPeople to show.",
|
||||||
"admin.access-control.epeople.no-items": "No hi ha usuaris per mostrar.",
|
"admin.access-control.epeople.no-items": "No hi ha usuaris per mostrar.",
|
||||||
|
|
||||||
@@ -651,7 +667,8 @@
|
|||||||
// "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"",
|
// "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
"admin.access-control.groups.form.delete-group.modal.header": "Eliminar grup \"{{ dsoName }}\"",
|
"admin.access-control.groups.form.delete-group.modal.header": "Eliminar grup \"{{ dsoName }}\"",
|
||||||
|
|
||||||
// "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"",
|
// "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
// TODO Source message changed - Revise the translation
|
||||||
"admin.access-control.groups.form.delete-group.modal.info": "Esteu segur que voleu suprimir el grup \"{{ dsoName }}\"?",
|
"admin.access-control.groups.form.delete-group.modal.info": "Esteu segur que voleu suprimir el grup \"{{ dsoName }}\"?",
|
||||||
|
|
||||||
// "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel",
|
// "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel",
|
||||||
@@ -2299,6 +2316,22 @@
|
|||||||
// "comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group",
|
// "comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group",
|
||||||
"comcol-role.edit.delete.error.title": "Error en esborrar el grup del rol '{{ role }}'",
|
"comcol-role.edit.delete.error.title": "Error en esborrar el grup del rol '{{ role }}'",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.cancel": "Cancel",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.cancel": "Cancel",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.confirm": "Delete",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.confirm": "Delete",
|
||||||
|
|
||||||
// "comcol-role.edit.community-admin.name": "Administrators",
|
// "comcol-role.edit.community-admin.name": "Administrators",
|
||||||
"comcol-role.edit.community-admin.name": "Administradors",
|
"comcol-role.edit.community-admin.name": "Administradors",
|
||||||
|
|
||||||
|
@@ -477,6 +477,22 @@
|
|||||||
// "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"",
|
// "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"",
|
||||||
"admin.access-control.epeople.table.edit.buttons.remove": "Odstranit \"{{name}}\"",
|
"admin.access-control.epeople.table.edit.buttons.remove": "Odstranit \"{{name}}\"",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.cancel": "Cancel",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.cancel": "Cancel",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.confirm": "Delete",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.confirm": "Delete",
|
||||||
|
|
||||||
// "admin.access-control.epeople.no-items": "No EPeople to show.",
|
// "admin.access-control.epeople.no-items": "No EPeople to show.",
|
||||||
"admin.access-control.epeople.no-items": "Žádní uživatelé k zobrazení.",
|
"admin.access-control.epeople.no-items": "Žádní uživatelé k zobrazení.",
|
||||||
|
|
||||||
@@ -671,7 +687,8 @@
|
|||||||
// "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"",
|
// "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
"admin.access-control.groups.form.delete-group.modal.header": "Odstranit skupinu \"{{ dsoName }}\"",
|
"admin.access-control.groups.form.delete-group.modal.header": "Odstranit skupinu \"{{ dsoName }}\"",
|
||||||
|
|
||||||
// "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"",
|
// "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
// TODO Source message changed - Revise the translation
|
||||||
"admin.access-control.groups.form.delete-group.modal.info": "Určitě chcete odstranit skupinu \"{{ dsoName }}\"",
|
"admin.access-control.groups.form.delete-group.modal.info": "Určitě chcete odstranit skupinu \"{{ dsoName }}\"",
|
||||||
|
|
||||||
// "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel",
|
// "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel",
|
||||||
@@ -2456,6 +2473,22 @@
|
|||||||
// "comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group",
|
// "comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group",
|
||||||
"comcol-role.edit.delete.error.title": "Nepodařilo se smazat skupinu pro roli '{{ role }}'",
|
"comcol-role.edit.delete.error.title": "Nepodařilo se smazat skupinu pro roli '{{ role }}'",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.cancel": "Cancel",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.cancel": "Cancel",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.confirm": "Delete",
|
||||||
|
// TODO New key - Add a translation
|
||||||
|
"comcol-role.edit.delete.modal.confirm": "Delete",
|
||||||
|
|
||||||
// "comcol-role.edit.community-admin.name": "Administrators",
|
// "comcol-role.edit.community-admin.name": "Administrators",
|
||||||
"comcol-role.edit.community-admin.name": "Správci",
|
"comcol-role.edit.community-admin.name": "Správci",
|
||||||
|
|
||||||
@@ -2612,7 +2645,7 @@
|
|||||||
|
|
||||||
// "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: {purposes}",
|
// "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: {purposes}",
|
||||||
// TODO Source message changed - Revise the translation
|
// TODO Source message changed - Revise the translation
|
||||||
"cookies.consent.content-notice.description": "Vaše osobní údaje shromažďujeme a zpracováváme pro následující účely: <strong>Ověření, Preference, Potvrzení a Statistiky</strong>. <br/> Chcete-li se dozvědět více, přečtěte si prosím naše {privacyPolicy}.",
|
"cookies.consent.content-notice.description": "Vaše osobní údaje shromažďujeme a zpracováváme pro následující účely: Ověření, Preference, Potvrzení a Statistiky. Chcete-li se dozvědět více, přečtěte si prosím naše {privacyPolicy}.",
|
||||||
|
|
||||||
// "cookies.consent.content-notice.learnMore": "Customize",
|
// "cookies.consent.content-notice.learnMore": "Customize",
|
||||||
"cookies.consent.content-notice.learnMore": "Přizpůsobit",
|
"cookies.consent.content-notice.learnMore": "Přizpůsobit",
|
||||||
@@ -11982,4 +12015,4 @@
|
|||||||
"file-download-link.request-copy": "Request a copy of ",
|
"file-download-link.request-copy": "Request a copy of ",
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -459,6 +459,18 @@
|
|||||||
// "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"",
|
// "admin.access-control.epeople.table.edit.buttons.remove": "Delete \"{{name}}\"",
|
||||||
"admin.access-control.epeople.table.edit.buttons.remove": "\"{{name}}\" löschen",
|
"admin.access-control.epeople.table.edit.buttons.remove": "\"{{name}}\" löschen",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.header": "Gruppe \"{{ dsoName }}\" löschen",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.info": "Sind Sie sicher, dass Sie die Gruppe \"{{ dsoName }}\" und alle damit verbundenen Richtlinien löschen möchten",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.cancel": "Cancel",
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.cancel": "Abbrechen",
|
||||||
|
|
||||||
|
// "admin.access-control.epeople.table.edit.buttons.remove.modal.confirm": "Delete",
|
||||||
|
"admin.access-control.epeople.table.edit.buttons.remove.modal.confirm": "Löschen",
|
||||||
|
|
||||||
// "admin.access-control.epeople.no-items": "No EPeople to show.",
|
// "admin.access-control.epeople.no-items": "No EPeople to show.",
|
||||||
"admin.access-control.epeople.no-items": "Keine Personen dazu.",
|
"admin.access-control.epeople.no-items": "Keine Personen dazu.",
|
||||||
|
|
||||||
@@ -651,8 +663,9 @@
|
|||||||
// "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"",
|
// "admin.access-control.groups.form.delete-group.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
"admin.access-control.groups.form.delete-group.modal.header": "Gruppe \"{{ dsoName }}\" löschen",
|
"admin.access-control.groups.form.delete-group.modal.header": "Gruppe \"{{ dsoName }}\" löschen",
|
||||||
|
|
||||||
// "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\"",
|
// "admin.access-control.groups.form.delete-group.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
"admin.access-control.groups.form.delete-group.modal.info": "Sind Sie sicher, dass Sie die Gruppe \"{{ dsoName }}\" löschen möchten",
|
// TODO Source message changed - Revise the translation
|
||||||
|
"admin.access-control.groups.form.delete-group.modal.info": "Sind Sie sicher, dass Sie die Gruppe \"{{ dsoName }}\" und alle damit verbundenen Richtlinien löschen möchten",
|
||||||
|
|
||||||
// "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel",
|
// "admin.access-control.groups.form.delete-group.modal.cancel": "Cancel",
|
||||||
"admin.access-control.groups.form.delete-group.modal.cancel": "Abbrechen",
|
"admin.access-control.groups.form.delete-group.modal.cancel": "Abbrechen",
|
||||||
@@ -1366,7 +1379,7 @@
|
|||||||
"bitstream.edit.bitstream": "Bitstream: ",
|
"bitstream.edit.bitstream": "Bitstream: ",
|
||||||
|
|
||||||
// "bitstream.edit.form.description.hint": "Optionally, provide a brief description of the file, for example \"<i>Main article</i>\" or \"<i>Experiment data readings</i>\".",
|
// "bitstream.edit.form.description.hint": "Optionally, provide a brief description of the file, for example \"<i>Main article</i>\" or \"<i>Experiment data readings</i>\".",
|
||||||
"bitstream.edit.form.description.hint": "Hier können Sie eine kurze Beschreibung der Datei angeben, zum Beispiel \"<i>Artikel</i>\" oder \"<i>Tabellenhanhang</i>\".",
|
"bitstream.edit.form.description.hint": "Hier können Sie eine kurze Beschreibung der Datei angeben, zum Beispiel \"<i>Artikel</i>\" oder \"<i>Tabellenanhang</i>\".",
|
||||||
|
|
||||||
// "bitstream.edit.form.description.label": "Description",
|
// "bitstream.edit.form.description.label": "Description",
|
||||||
"bitstream.edit.form.description.label": "Beschreibung",
|
"bitstream.edit.form.description.label": "Beschreibung",
|
||||||
@@ -2298,6 +2311,18 @@
|
|||||||
// "comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group",
|
// "comcol-role.edit.delete.error.title": "Failed to delete the '{{ role }}' role's group",
|
||||||
"comcol-role.edit.delete.error.title": "Die Gruppe der Rolle '{{ role }}' konnte nicht gelöscht werden",
|
"comcol-role.edit.delete.error.title": "Die Gruppe der Rolle '{{ role }}' konnte nicht gelöscht werden",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.header": "Delete Group \"{{ dsoName }}\"",
|
||||||
|
"comcol-role.edit.delete.modal.header": "Gruppe \"{{ dsoName }}\" löschen",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.info": "Are you sure you want to delete Group \"{{ dsoName }}\" and all its associated policies?",
|
||||||
|
"comcol-role.edit.delete.modal.info": "Sind Sie sicher, dass Sie die Gruppe \"{{ dsoName }}\" und alle damit verbundenen Richtlinien löschen möchten",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.cancel": "Cancel",
|
||||||
|
"comcol-role.edit.delete.modal.cancel": "Abbrechen",
|
||||||
|
|
||||||
|
// "comcol-role.edit.delete.modal.confirm": "Delete",
|
||||||
|
"comcol-role.edit.delete.modal.confirm": "Löschen",
|
||||||
|
|
||||||
// "comcol-role.edit.community-admin.name": "Administrators",
|
// "comcol-role.edit.community-admin.name": "Administrators",
|
||||||
"comcol-role.edit.community-admin.name": "Administrator:innen",
|
"comcol-role.edit.community-admin.name": "Administrator:innen",
|
||||||
|
|
||||||
@@ -2450,7 +2475,7 @@
|
|||||||
|
|
||||||
// "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: {purposes}",
|
// "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: {purposes}",
|
||||||
// TODO Source message changed - Revise the translation
|
// TODO Source message changed - Revise the translation
|
||||||
"cookies.consent.content-notice.description": "Wir sammeln und verarbeiten Ihre personenbezogenen Daten für die folgenden Zwecke: <strong>Authentifikation, Einstellungen, Zustimmungen und Statistiken</strong>. <br/> Um mehr zu erfahren, lesen Sie bitte unsere {privacyPolicy}.",
|
"cookies.consent.content-notice.description": "Wir sammeln und verarbeiten Ihre personenbezogenen Daten für die folgenden Zwecke: Authentifikation, Einstellungen, Zustimmungen und Statistiken. Um mehr zu erfahren, lesen Sie bitte unsere {privacyPolicy}.",
|
||||||
|
|
||||||
// "cookies.consent.content-notice.learnMore": "Customize",
|
// "cookies.consent.content-notice.learnMore": "Customize",
|
||||||
"cookies.consent.content-notice.learnMore": "Anpassen",
|
"cookies.consent.content-notice.learnMore": "Anpassen",
|
||||||
@@ -2469,7 +2494,7 @@
|
|||||||
"cookies.consent.content-modal.no-privacy-policy.text": "",
|
"cookies.consent.content-modal.no-privacy-policy.text": "",
|
||||||
|
|
||||||
// "cookies.consent.content-modal.title": "Information that we collect",
|
// "cookies.consent.content-modal.title": "Information that we collect",
|
||||||
"cookies.consent.content-modal.title": "Information, die wir sammeln",
|
"cookies.consent.content-modal.title": "Informationen, die wir sammeln",
|
||||||
|
|
||||||
// "cookies.consent.app.title.accessibility": "Accessibility Settings",
|
// "cookies.consent.app.title.accessibility": "Accessibility Settings",
|
||||||
// TODO New key - Add a translation
|
// TODO New key - Add a translation
|
||||||
@@ -11087,4 +11112,4 @@
|
|||||||
"file-download-link.request-copy": "Request a copy of ",
|
"file-download-link.request-copy": "Request a copy of ",
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user