Compare commits

...

1501 Commits

Author SHA1 Message Date
Tim Donohue
c5448fe252 Update version tag for release 2024-07-09 14:28:46 -05:00
Alan Orth
a705067aed Merge pull request #3152 from alanorth/client-user-agent
Forward client's user-agent instead of Node's
2024-07-03 08:54:24 +03:00
Tim Donohue
28bd6a5fe6 Merge pull request #3063 from tdonohue/port_new_csrf_fixes_to_7x
[Port dspace-7_x] Ensures CSRF token is initialized prior to first modifying (non-GET) request
2024-07-01 11:35:51 -05:00
Alan Orth
5b2966cf48 src/app/core: forward client user-agent
Forward the client's user-agent instead of sending Node's.
2024-06-28 07:58:15 +03:00
Tim Donohue
735a3af254 Merge pull request #3139 from tdonohue/port_3138_to_7x
[Port dspace-7_x] Fix error which prevent submitter to deposit a new item
2024-06-20 14:37:34 -05:00
Giuseppe Digilio
3036e72c4c [DURACOM-282] fix issue with submission edit page when providing a not existing workspaceitem 2024-06-20 11:35:53 -05:00
Giuseppe Digilio
4eacdfb113 [DURACOM-282] fix issue with removing duplicated json patch operations, which in some case changed the order in the queue 2024-06-20 11:24:51 -05:00
Tim Donohue
fbb97167d6 Merge pull request #3135 from tdonohue/port_3029_to_7x
[Port dspace-7_x] src/assets/i18n: CrossRef → Crossref
2024-06-20 07:00:03 -05:00
Alan Orth
2d881c9621 src/assets/i18n: CrossRef → Crossref
As part of a rebranding in 2015 Crossref started stylizing their
name as "Crossref" instead of "CrossRef".

See: https://www.crossref.org/blog/the-logo-has-landed/
2024-06-18 15:41:31 -05:00
Tim Donohue
31508ed5eb Merge pull request #3121 from alexandrevryghem/w2p-113560_edit-item-add-relationships-one-by-one_contribute-7_x
Remove Bitstreams on edit-item-page doesn't work
2024-06-18 12:12:09 -05:00
Tim Donohue
3895d26d0b Merge pull request #3133 from tdonohue/port_3129_to_7x
[Port dspace-7_x] Bump ws from 7.5.9 to 7.5.10
2024-06-17 17:14:06 -05:00
Tim Donohue
e9b39ff106 Merge pull request #3131 from tdonohue/port_3125_to_7x
[Port dspace-7_x] Bump postcss to 8.4.38
2024-06-17 16:49:42 -05:00
Tim Donohue
8615c70ccc Bump ws from 7.5.9 to 7.5.10 2024-06-17 16:21:54 -05:00
Tim Donohue
93f1ae0b49 Merge pull request #3130 from tdonohue/port_3124_to_7x
Bump express from 4.18.2 to 4.19.2
2024-06-17 15:11:52 -05:00
Tim Donohue
8990a2d132 Bump postcss to 8.4.38 2024-06-17 15:03:05 -05:00
Tim Donohue
f4eb8876c2 Bump express from 4.18.2 to 4.19.2 2024-06-17 14:37:28 -05:00
Tim Donohue
eb7a93a12f Merge pull request #3128 from tdonohue/port_2915_to_7x
[Port dspace-7_x] Bump tar to 6.2.1
2024-06-17 14:21:25 -05:00
Tim Donohue
69eedf4015 Bump tar to 6.2.1 2024-06-17 13:04:59 -05:00
Tim Donohue
ff31c302e2 Merge pull request #3126 from tdonohue/port_3123_to_7x
[Port dspace-7_x] Bump braces from 3.0.2 to 3.0.3
2024-06-17 12:34:21 -05:00
Tim Donohue
7b554a48f9 Bump braces from 3.0.2 to 3.0.3 2024-06-17 10:41:08 -05:00
Tim Donohue
c088ccb32e Merge pull request #3119 from tdonohue/port_3067_to_7x
[Port dspace-7_x] Fix "Browse by Author" remaining serious accessibility issues
2024-06-17 09:27:26 -05:00
Alexandre Vryghem
1990120fa0 Merge branch 'refs/heads/w2p-113560_edit-item-add-relationships-one-by-one_contribute-7.6' into w2p-113560_edit-item-add-relationships-one-by-one_contribute-7_x 2024-06-14 23:07:12 +02:00
Alexandre Vryghem
1444271e69 115046: Fixed edit item bitstream tab buttons not updating correctly & removed method calls retuning observables in edit collection's content source tab 2024-06-14 23:03:56 +02:00
Tim Donohue
09bf25a233 Merge pull request #3039 from VictorHugoDuranS/dspace-7_2668
Fix - Change color Contrast in cookie settings box
2024-06-14 15:31:33 -05:00
Tim Donohue
9580b29491 Merge pull request #3118 from DSpace/backport-3099-to-dspace-7_x
[Port dspace-7_x] Improving accessibility of the ds-loading component
2024-06-14 15:13:31 -05:00
Tim Donohue
5fe6dfb949 Merge pull request #3117 from DSpace/backport-3115-to-dspace-7_x
[Port dspace-7_x] Fixes: Site hangs when selecting items via keyboard from the hamburger menu
2024-06-14 15:05:43 -05:00
root
ebb846f2a9 Correcting a formatting error 2024-06-14 15:02:36 -05:00
root
983e955398 DSpace #1176 - Browse by Author serious issues 2024-06-14 15:02:13 -05:00
root
36266dffef Melhorando acessibilidade do componente ds-loading
(cherry picked from commit e96d64a622)
2024-06-14 19:09:15 +00:00
Eike Martin Löhden
53fb9f85fc Change key-listener to keydown in order to work on chrome browsers.
(cherry picked from commit a4e9a9a4b8)
2024-06-14 18:56:25 +00:00
Tim Donohue
16210365be Merge pull request #3109 from alexandrevryghem/w2p-113560_edit-item-add-relationships-one-by-one_contribute-7_x
[Port dspace-7_x] Fixed caching & same entity type relationship with different left/rightwardtype bugs on edit item relationships
2024-06-11 14:43:12 -05:00
Alexandre Vryghem
a0260f5267 Merge branch 'w2p-113560_edit-item-add-relationships-one-by-one_contribute-7.6' into w2p-113560_edit-item-add-relationships-one-by-one_contribute-7_x 2024-06-10 16:54:08 +02:00
Tim Donohue
2d28dfc6e6 Merge pull request #3107 from tdonohue/port_3098_to_7x
[Port dspace-7_x] Fixed item edit relationships with same type name but different entities all being shown under same label
2024-06-10 09:32:40 -05:00
Alexandre Vryghem
31ab05f4fe 115434: Passed relatedEntityType parameter to byLabel endpoint 2024-06-07 15:16:41 -05:00
Alexandre Vryghem
813db7cc9f 115046: Fixed same type entity relationships with same leftward/rightward type displaying twice 2024-06-07 14:55:41 +02:00
Tim Donohue
0d3db9f19d Merge pull request #3103 from alexandrevryghem/w2p-113901_edit-item-relationships-does-not-display-tilted-relationships_contribute-7_x
[Port dspace-7_x] Fixed edit item relationships tab not displaying tilted relationships
2024-06-06 09:21:14 -05:00
Alexandre Vryghem
1f4700cb91 Merge remote-tracking branch 'refs/remotes/alex/w2p-113901_edit-item-relationships-does-not-display-tilted-relationships' into dspace-7_x
# Conflicts:
#	src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.ts
2024-06-05 23:42:34 +02:00
Tim Donohue
27c57d6f4e Merge pull request #3102 from tdonohue/port_2953_to_7x
[Port dspace-7_x] Avoid metadata representation element is rendered twice when checking the browse configuration
2024-06-05 15:52:56 -05:00
Giuseppe Digilio
3f7e273597 Avoid metadata representation element is rendered twice when checking the browse configuration 2024-06-05 15:25:12 -05:00
Alexandre Vryghem
6d1e6f90fc 115046: Fixed issue where relationsToItems would never emit when an empty array was passed to it 2024-06-03 15:03:47 +02:00
Alexandre Vryghem
8ee375016f 115046: Fixed loading animation not resetting hen closing modal 2024-06-03 14:55:53 +02:00
Alexandre Vryghem
f1706e24c2 115046: Fixed related item not invalidating on relationship deletion & automatically invalidate the isSelected value after updating relationship on item 2024-06-03 14:55:53 +02:00
Yana De Pauw
33b59c739d 115284: Fix issue with same type relationships 2024-06-03 11:20:21 +02:00
Giuseppe Digilio
2d81a487d3 [DURACOM-247] Move check for initialized token to request effects 2024-05-31 12:13:05 -05:00
Tim Donohue
df8f0db784 Update build script to use "docker compose" instead of "docker-compose". Fixes random failures starting e2e test backend via Docker 2024-05-31 12:13:05 -05:00
Tim Donohue
950038e6df Fix tests. Add XSRFService to all specs which need it to be initialized 2024-05-31 12:13:01 -05:00
Tim Donohue
769210bef2 Update code to use GET request. Cleanup lint errors & add in basic TypeDocs 2024-05-31 12:12:02 -05:00
Art Lowel
7d5e499f21 make a call to ensure a correct XSRF token before performing any non-GET requests 2024-05-31 12:12:02 -05:00
Tim Donohue
cbee67cd4b Merge pull request #3059 from alexandrevryghem/w2p-113560_edit-item-add-relationships-one-by-one_contribute-7_x
[Port dspace-7_x] Fixed creation & deletion of relationships not working correctly & added same entity type relationship support
2024-05-31 12:09:50 -05:00
Tim Donohue
5580c81ff7 Merge pull request #3095 from tdonohue/port_2761_to_7x
[Port dspace-7_x] Fix caching issues for versioning
2024-05-31 11:45:18 -05:00
Yury Bondarenko
73be8a972c Always wait for correct draft status, fix spelling 2024-05-30 17:00:51 -05:00
Yury Bondarenko
5f5f6da067 Clean up VersionHistoryDataService changes 2024-05-30 16:57:26 -05:00
Yury Bondarenko
be817b0ab6 Fix cache invalidation for versioning 2024-05-30 16:57:14 -05:00
Alexandre Vryghem
bedfe02f65 Merge branch 'w2p-113560_edit-item-add-relationships-one-by-one_contribute-7.6' into w2p-113560_edit-item-add-relationships-one-by-one_contribute-7_x 2024-05-30 23:17:15 +02:00
Alexandre Vryghem
227d47154c 115046: Fixed issue where store operations would sometimes be performed in incorrect order 2024-05-30 23:12:03 +02:00
Alexandre Vryghem
4a70382072 115046: Fixed incorrect name variant being saved in the store when marking relationship ready for deletion 2024-05-30 23:12:02 +02:00
Alexandre Vryghem
c687d3ff5d 115046: Fixed performance issues in virtual metadata popup 2024-05-30 23:12:02 +02:00
Tim Donohue
491a61b8b1 Merge pull request #3088 from DSpace/backport-3080-to-dspace-7_x
[Port dspace-7_x] Fixed page size change and sorting not working on comcol pages
2024-05-29 16:55:00 -05:00
Tim Donohue
8c6df7ac8e Merge pull request #3089 from DSpace/backport-3079-to-dspace-7_x
[Port dspace-7_x] Fixed delete item page freezing when having relationships
2024-05-29 16:54:40 -05:00
Tim Donohue
8c35ca86c8 Merge pull request #3064 from alexandrevryghem/minor-ui-improvements_contribute-7_x
[Port dspace-7_x] Fixed item-edit.cy.ts regularly failing & minor UI improvements
2024-05-29 16:36:20 -05:00
Alexandre Vryghem
7993020463 115427: Fixed delete item not redirecting when having some virtual metadata that needs to be copied
(cherry picked from commit b8d9c650f5)
2024-05-29 20:51:02 +00:00
Alexandre Vryghem
8b3010be0c 115427: Fixed edit item pages not redirecting to 404 with invalid id
(cherry picked from commit 249cac4f27)
2024-05-29 20:51:01 +00:00
Alexandre Vryghem
2843659416 115427: Fixed delete item page freezing when it has relationships
(cherry picked from commit e6086e16ea)
2024-05-29 20:51:01 +00:00
Alexandre Vryghem
a77d80946b 115428: Fixed EventEmitter being triggered multiple times because its name was the same as a standard DOM event
(cherry picked from commit 4d89a11943)
2024-05-29 20:35:49 +00:00
Tim Donohue
a3a298f51e Merge pull request #3087 from DSpace/backport-3062-to-dspace-7_x
[Port dspace-7_x] Made legacy bitstream URLs redirect with 301 status code
2024-05-29 15:00:44 -05:00
Alexandre Vryghem
c332600633 114624: Made the legacyBitstreamURLRedirectGuard return false for valid bitstream urls in combination with a HardRedirectService#redirect, this will make ensure the redirect is visible for curl instead of being performed by Angular
(cherry picked from commit 23644e9ec7)
2024-05-29 18:38:53 +00:00
Kuno Vercammen
f1b397fc11 114624: Refactored legacyBitstreamURL resolver into a guard to set the redirect status code to 301 Moved Permanently
(cherry picked from commit 369bd693d4)
2024-05-29 18:38:53 +00:00
Alexandre Vryghem
7a9bb4d726 113901: Don't unsubscribe after first succeeded remote data, because otherwise the reRequestOnStale won't work 2024-05-23 11:58:44 +02:00
VictorHugoDuranS
975e9fd356 Hide search text field when number of facet values is less than the maximum (#3061)
Hide search text field in the filter section if the number of facet values does not exceed the maximum number of facet values shown.
2024-05-22 09:23:51 +03:00
Alexandre Vryghem
6cab13a876 Added missing alt & replaced remaining dspace logo PNGs with SVGs
(cherry picked from commit 56c786d3f7)
2024-05-17 21:34:14 +02:00
Alexandre Vryghem
da439000ac Fixed item-edit.cy.ts regularly failing because of aria-required-children for role="row" & added missing roles to edit comcol tabs
(cherry picked from commit 77d0f9cd60)
2024-05-17 21:32:32 +02:00
Alexandre Vryghem
f8a8b90556 Aligned communities search results like collections on md screens
(cherry picked from commit c2684d3078)
2024-05-17 21:31:14 +02:00
Alexandre Vryghem
7b374f7a32 Merge branch 'minor-ui-improvements_contribute-7.6' into minor-ui-improvements_contribute-7_x 2024-05-17 21:30:51 +02:00
Alexandre Vryghem
14dbced218 Merge branch 'w2p-113560_edit-item-add-relationships-one-by-one_contribute-7.6' into w2p-113560_edit-item-add-relationships-one-by-one_contribute-7_x 2024-05-17 20:06:53 +02:00
Alexandre Vryghem
9053489ddd 115046: Fixed url parameters not being filtered out of the url before hasChanges$ & isReinstatable$ is calculated 2024-05-17 18:51:23 +02:00
Alexandre Vryghem
f7c9058e50 Merge branch 'w2p-113560_edit-item-add-relationships-one-by-one_contribute-7.6' into w2p-113560_edit-item-add-relationships-one-by-one_contribute-7_x
# Conflicts:
#	src/app/item-page/edit-item-page/item-bitstreams/item-bitstreams.component.html
#	src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/dynamic-lookup-relation-modal.component.html
2024-05-17 14:40:20 +02:00
Alexandre Vryghem
f65b96412a Fixed multiple edit relationship bugs
- Fixed issue making it impossible to add new relationships until the page is refreshed after deleting an existing one (only when you refreshed the page after creating the initial relationship)
- Fixed NPE in DsDynamicLookupRelationModalComponent
- Grouped buttons on relationship page in order to assure that they always have the same behaviour
2024-05-17 14:34:24 +02:00
Tim Donohue
088e56fb8a Merge pull request #3055 from DSpace/backport-3046-to-dspace-7_x
[Port dspace-7_x] Fix self link don't match warnings for authorization endpoint
2024-05-16 08:37:43 -05:00
Alexandre Vryghem
1b38f2d25d Merge branch 'w2p-113560_edit-item-add-relationships-one-by-one' into w2p-113560_edit-item-add-relationships-one-by-one_contribute-7_x
# Conflicts:
#	src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.html
2024-05-16 10:17:34 +02:00
Alexandre Vryghem
e0fb590b02 Don't encode the uri parameter of /api/authz/authorizations/search/object since the returned self link doesn't encode the uri param
(cherry picked from commit b0991db1d4)
2024-05-15 21:49:41 +00:00
Tim Donohue
8ea7a2572a Merge pull request #3053 from tdonohue/port_2962_to_7x
[Port dspace-7_x] Fix submission lost changes after save
2024-05-15 14:17:49 -05:00
Tim Donohue
3edb663b21 Minor bug fix to specs 2024-05-15 13:28:19 -05:00
Tim Donohue
432692edc8 Merge pull request #3051 from tdonohue/port_2944_to_7x
[Port dspace-7_x] Disable inlineCriticalCss by default for better SSR performance
2024-05-15 13:21:04 -05:00
Tim Donohue
dfc304f9aa Merge pull request #3052 from DSpace/backport-2706-to-dspace-7_x
[Port dspace-7_x] Update pt-PT.json5
2024-05-15 13:20:45 -05:00
Art Lowel
d1890e0253 move embed item fix to SubmissionJsonPatchOperationsService 2024-05-15 12:40:23 -05:00
Art Lowel
66832eeb28 embed the item to submission patch request to fix issue where the submission form would revert to the previous data on save 2024-05-15 12:37:01 -05:00
Ricardo Saraiva
83b67149a6 Update pt-PT.json5
Revision and improvement of some of the already existing translation keys upon reviewers’ suggestions.

(cherry picked from commit 16c5665b31)
2024-05-15 17:16:57 +00:00
Ricardo Saraiva
ba1eee27b3 Update pt-PT.json5
(cherry picked from commit c4142e7a80)
2024-05-15 17:16:57 +00:00
Ricardo Saraiva
bb055e12fb Update pt-PT.json5
(cherry picked from commit 6c5e971dc1)
2024-05-15 17:16:57 +00:00
Ricardo Saraiva
242043b3f8 Update pt-PT.json5
(cherry picked from commit 3262e00d6e)
2024-05-15 17:16:57 +00:00
Ricardo Saraiva
170c7ac6cc Update pt-PT.json5
(cherry picked from commit 38eacf31bf)
2024-05-15 17:16:56 +00:00
Ricardo Saraiva
c2ddaf286d Update pt-PT.json5
Addition of new translation keys (following DSpace 7.6.1 release) & revision/improvement of some of the already existing.

(cherry picked from commit 18085698b2)
2024-05-15 17:16:56 +00:00
Ricardo Saraiva
071fa370bf Update pt-PT.json5
Addition of new translation keys (following DSpace 7.6.1 release) & revision/improvement of some of the already existing.

(cherry picked from commit 02792d28bc)
2024-05-15 17:16:56 +00:00
Tim Donohue
eeb562dd14 Disable inlineCriticalCss by default for better SSR performance 2024-05-15 12:12:55 -05:00
Alexandre Vryghem
479adf6519 115046: Fixed failing tests & added new test to cover added code 2024-05-15 16:09:24 +02:00
Tim Donohue
84e4cc01cc Merge pull request #3044 from DSpace/backport-3028-to-dspace-7_x
[Port dspace-7_x] Add HTML support on system-wide alert (Fixes #3019)
2024-05-14 13:26:10 -05:00
Tim Donohue
d95574df6f Merge pull request #3043 from tdonohue/port_3025_to_7x
[Port dspace-7_x] Czech DSpace 7 UI translation by NTK
2024-05-14 13:25:57 -05:00
Abel Gómez
40b4df6354 Fix code alignment
(cherry picked from commit af193282da)
2024-05-14 17:31:35 +00:00
Abel Gómez
7a364fddeb Add HTML support to system-wide alert banner. Fixes #3019.
(cherry picked from commit b9fb4e2159)
2024-05-14 17:31:35 +00:00
NTK
d9a5f324a5 Czech DSpace 7 UI translation by NTK 2024-05-14 12:14:29 -05:00
Tim Donohue
fdafa0f034 Merge pull request #3042 from tdonohue/port_3007_to_7x
[Port dspace-7_x] After English, reorder languages alphabetically by code
2024-05-14 10:35:44 -05:00
Tim Donohue
d55b0c0dd3 After English, reorder languages alphabetically by code 2024-05-14 09:26:49 -05:00
Tim Donohue
30c025c5c1 Merge pull request #2841 from atmire/w2p-112198_add-relationship-effects-queue
Fix for not all CREATE/DELETE Relationship requests coming through, during submission entity lookup
2024-05-14 09:24:29 -05:00
Tim Donohue
75718bf3ec Merge pull request #2983 from oscar-escire/fix/authorSearch
Fix Author search result without co-author
2024-05-13 14:19:37 -05:00
Tim Donohue
36fa4d4cae Merge pull request #3027 from alexandrevryghem/discovery-backports_contribute-7_x
[Port dspace-7_x] Multiple discovery backports
2024-05-13 11:41:22 -05:00
Tim Donohue
1aa6d358bb Merge pull request #3038 from tdonohue/port_2771_to_7x
[Port dspace-7_x] improved layout of feedback form (increase vertical spacing)
2024-05-13 08:38:59 -05:00
Oscar Chacón
5e59403779 Update: replaced logic of allMetadataValues method by allMetadataNoExcludingValues logic 2024-05-11 17:37:38 -06:00
Sascha Szott
6ff9edaa8b improved layout of feedback form (increase vertical spacing) 2024-05-10 16:38:33 -05:00
Victor Hugo Duran Santiago
876ecb1d12 Fix - Change color Contrast in cookie settings box 2024-05-10 15:27:37 -06:00
Tim Donohue
9bd154792a Merge pull request #3033 from DSpace/backport-2951-to-dspace-7_x
[Port dspace-7_x] Fix display of dso names for EPersons
2024-05-10 15:59:53 -05:00
Tim Donohue
d43c44e911 Merge pull request #2973 from oscar-escire/fix/policyNameForm
added maxlength and hint to resource policy
2024-05-10 15:14:08 -05:00
Tim Donohue
8467bb7c0a Merge pull request #3034 from tdonohue/port_2954_to_7x
[Port dspace-7_x] Live import preview should show all metadata values, not only the first one
2024-05-10 13:43:53 -05:00
Jens Vannerum
01719822c1 114440: fix test 2024-05-10 12:34:45 -05:00
Marie Verdonck
ffbe407d83 104686: Live Import preview only shows first metadata value per field 2024-05-10 12:30:13 -05:00
Gantner, Florian Klaus
202c84c484 extend eperson render type for display of dso name
https://github.com/DSpace/dspace-angular/issues/2947
(cherry picked from commit 97fade00a4)
2024-05-10 17:20:15 +00:00
Tim Donohue
6ac2e9a95d Merge pull request #3032 from DSpace/backport-2725-to-dspace-7_x
[Port dspace-7_x] Encode all `RequestParam` values
2024-05-10 11:21:55 -05:00
Alexandre Vryghem
daff8a4594 Refactored code to always encode the RequestParams
(cherry picked from commit d5cf236938)
2024-05-10 15:53:07 +00:00
Alexandre Vryghem
ae8e0f9ae8 110889: Fixed searchevents request containing the query params in the clickedObject
Also fixed minor CSS issue in mobile mode where sidebar is still visible

(cherry picked from commit cbe3f2f8f5)
2024-05-09 18:13:13 +02:00
Alexandre Vryghem
0aadcdfdd9 110889: Prevent vocabulary undefined from being retrieved in hierarchy filter when none is configured
(cherry picked from commit 9e7a59ddd0)
2024-05-09 16:17:53 +02:00
Art Lowel
a658bf4531 decrease the number of unnecessary rerenders by checking whether the relationship types have changed 2024-05-09 15:25:37 +02:00
Art Lowel
4541788a34 fix issue where relationship lists wouldn't update automatically from the second submit onwards 2024-05-09 14:55:37 +02:00
Alan Orth
c44fce9e0f Merge pull request #2866 from atmire/w2p-113124_AddInputToOpenDsMetadataUriValuesInNewWindow
Allow opening ds-metadata-uri-values links in a new window
2024-05-09 15:46:51 +03:00
Art Lowel
cb59c05baf fix spinners 2024-05-09 14:06:56 +02:00
Art Lowel
d75b158ee1 Merge remote-tracking branch 'contributions/fix-api-undefined-issue-7.6' into w2p-113560_edit-item-add-relationships-one-by-one 2024-05-09 13:44:18 +02:00
Art Lowel
1c50dbf4c6 Merge remote-tracking branch 'alexandre/fix-create-relationship-not-working-between-same-types_contribute-7.6' into w2p-113560_edit-item-add-relationships-one-by-one 2024-05-09 13:40:03 +02:00
Alexandre Vryghem
ce3eb76190 110889: Don't retrieve the accessStatus when item.showAccessStatuses is false
(cherry picked from commit 37c534b809)
2024-05-09 12:26:18 +02:00
Alexandre Vryghem
6dac7ceec4 Prevent ItemSearchResult from being recreated at every iteration
(cherry picked from commit da320b5fbc)
2024-05-09 12:18:36 +02:00
Alexandre Vryghem
3454ca99f3 108586: Fixed ItemListElementComponent not pointing to the ItemSearchResultListElementComponent from the themes folder when present
(cherry picked from commit d00fc5d9d3)
2024-05-09 12:16:56 +02:00
Tim Donohue
dd5a167d0d Merge pull request #3013 from atmire/process-ui-null-eperson-fix-7.6
[Port dspace-7_x] Handle Null Users Gracefully in Process Overview Page
2024-05-08 14:45:49 -05:00
Art Lowel
9f3ee32858 fix issue where a submit emitted from the edit relationship modal wouldn't arrive in the edit relationships component 2024-05-08 17:48:33 +02:00
Tim Donohue
3ae9c8e9f8 Merge pull request #3017 from DSpace/backport-3016-to-dspace-7_x
[Port dspace-7_x] Ensure `item` is also embedded in submission form
2024-05-07 14:22:03 -05:00
Tim Donohue
3c9cb4e3b6 Ensure item is also embedded in submission form
(cherry picked from commit bf4d04c909)
2024-05-07 18:53:19 +00:00
Oscar Chacón
f80d1fdc68 fixed lint errors 2024-05-06 11:12:22 -06:00
Tim Donohue
4bf8944c48 Merge pull request #2987 from atmire/w2p-105866_Submission-performance-7_x
7.x - Submission performance
2024-05-06 11:12:25 -05:00
Tim Donohue
2b0f0f627e Merge pull request #3009 from tdonohue/port_2994_to_7x
[Port dspace-7_x] Bump ejs from 3.1.9 to 3.1.10
2024-05-06 08:55:55 -05:00
Kuno Vercammen
b7b1c3e582 Merge remote-tracking branch 'origin/dspace-7_x' into process-ui-null-eperson-fix-7.6
# Conflicts:
#	src/assets/i18n/en.json5
2024-05-06 13:45:39 +02:00
Kuno Vercammen
488958c251 113904: Added tests for null user handling 2024-05-06 12:09:40 +02:00
Kuno Vercammen
26c234e36c 113904: Fix null user handling 2024-05-06 11:53:05 +02:00
Tim Donohue
55e742fbfb Bump ejs from 3.1.9 to 3.1.10 2024-05-03 16:07:48 -05:00
Tim Donohue
0be17bb0ed Merge pull request #3008 from tdonohue/port_2863_to_7x
[Port dspace-7_x] Added Arabic Translation
2024-05-03 15:55:51 -05:00
Mohamed Ali
aa7496e41d Added Arabic Translation 2024-05-03 15:20:51 -05:00
Tim Donohue
bc5262f5f7 Merge pull request #3006 from DSpace/backport-2831-to-dspace-7_x
[Port dspace-7_x] French translations for missing parameters (access control and batch loading)
2024-05-03 12:37:13 -05:00
Tim Donohue
07a91222c4 lint fixes
(cherry picked from commit 3bb559542d)
2024-05-03 16:44:32 +00:00
Pierre Lasou
b06bece1cb Update fr.json5 correcting bad quotation marks
(cherry picked from commit 1abc796734)
2024-05-03 16:44:32 +00:00
Pierre Lasou
053844a7bc Update fr.json5 - adding missing comma
(cherry picked from commit 3b98c8c84f)
2024-05-03 16:44:32 +00:00
Pierre Lasou
7129d6b9c8 Update fr.json5 to adresse reviewer feedback
(cherry picked from commit 46df7e805e)
2024-05-03 16:44:32 +00:00
Pierre Lasou
ae35461516 Update fr.json5 to add batch upload labels
Addition of batch upload labels (ZIP, SAF)

(cherry picked from commit c4548e63ca)
2024-05-03 16:44:32 +00:00
Pierre Lasou
a250de49a0 Update fr.json5 to add access conditions labels
Changes to the labels related to access control and access conditions.

(cherry picked from commit e747520646)
2024-05-03 16:44:32 +00:00
Tim Donohue
13775e53de Merge pull request #3001 from tdonohue/port_2933_to_7x
[Port dspace-7_x] Reset dropdown values
2024-05-02 16:29:14 -05:00
Andreas Awouters
e9c5340f67 113319: Fix dropdown component spec
(cherry picked from commit 70357803e86caabc6357b7cbec9db1ef8edd2a56)
2024-05-02 14:57:41 -05:00
Andreas Awouters
861132d04d 113319: Add dropdown entry to clear selection
(cherry picked from commit 13d1547b3dbf5d4cd74617d6327044da798ed44e)
2024-05-02 14:57:29 -05:00
Tim Donohue
a7517d6814 Merge pull request #2992 from DSpace/backport-2991-to-dspace-7_x
[Port dspace-7_x] Remove obsolete "version" tag from Docker Compose files (Angular version)
2024-05-01 16:28:54 -05:00
Tim Donohue
971c07632a Merge pull request #2641 from hutattedonmyarm/regex-error-messages-backport-dspace7x
[Port dspace-7_x] More meaningful regex error messages
2024-05-01 16:22:43 -05:00
Tim Donohue
45840c1c17 Remove obsolete "version" tag from compose files
(cherry picked from commit d6303de877)
2024-05-01 20:05:31 +00:00
Tim Donohue
91d72c19dd Merge pull request #2694 from hutattedonmyarm/dspace-7_x
[Port dspace-7_x]  Enable type-bind for checkbox inputs during submission
2024-04-30 15:13:40 -05:00
Tim Donohue
5301a8fc51 Merge pull request #2990 from DSpace/backport-2710-to-dspace-7_x
[Port dspace-7_x] Update robots.txt.ejs
2024-04-29 17:03:13 -05:00
Tim Donohue
27d00d133a Merge pull request #2989 from tdonohue/port_2675_to_7x
[Port to dspace-7_x] Multiline selected facet badge on search page
2024-04-29 16:57:02 -05:00
Bram Luyten
6447c3769b Update robots.txt.ejs
Fix for issue #2709

(cherry picked from commit fbd35296f0)
2024-04-29 21:29:37 +00:00
lotte
ebb99c813a Merge branch 'w2p-108595_multiline-search-filter-badge' into multiline-search-filter-badge_main 2024-04-29 16:02:41 -05:00
lotte
e1fe4031e5 Removed unnecessary change 2024-04-29 15:59:22 -05:00
lotte
65860b81b1 108595: fix for overflowing search filter badge selection 2024-04-29 15:59:04 -05:00
Yana De Pauw
dabc0e9b4b [Ticket 2124] Slow response times 2024-04-29 12:59:35 +02:00
Oscar Chacón
2530845b9b Fix trailing spaces and removed console.log 2024-04-26 17:38:06 -06:00
Oscar Chacón
f055ff6fbd Fix: author search result without co-author 2024-04-25 16:19:21 -06:00
Art Lowel
e4b098e64d update test 2024-04-25 10:56:54 +02:00
Alexandre Vryghem
132e1f9524 Minor UI improvements
- Fixed DSO edit menu sometimes displaying underneath header based on header z-index
- Fixed accessibility issue on request a copy page
2024-04-23 02:02:28 +02:00
Tim Donohue
679702bb5a Merge pull request #2967 from tdonohue/update_backend_docker_scripts_7x
Update REST and CI docker compose scripts to sync with 7.x backend
2024-04-22 16:39:38 -05:00
Oscar Chacón
f8e0cc6808 added maxlength and hint to resource policy 2024-04-22 14:42:32 -06:00
Tim Donohue
45ab7231a0 Merge pull request #2969 from alexandrevryghem/w2p-112970_added-missing-breadcrumbs_contribute-7_x
[Port dspace-7_x] Added missing/incomplete breadcrumbs on create community/collection/item pages
2024-04-22 12:23:00 -05:00
Tim Donohue
c794e1ebde Merge pull request #2968 from alexandrevryghem/fix-broken-item-mapper-pagination_contribute-7_x
[Port dspace-7_x] Fixed pagination issues on item mapper
2024-04-22 12:13:02 -05:00
Alexandre Vryghem
7d49666865 Merge remote-tracking branch 'alex/w2p-112970_added-missing-breadcrumbs_contribute-7.4' into dspace-7_x
# Conflicts:
#	src/app/collection-page/collection-page-routing.module.ts
#	src/app/community-page/community-page-routing.module.ts
#	src/app/core/core.module.ts
#	src/app/workflowitems-edit-page/workflowitems-edit-page-routing.module.ts
#	src/app/workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts
#	src/assets/i18n/en.json5
2024-04-22 16:23:48 +02:00
Alexandre Vryghem
7e6f736b2f Merge branch 'fix-broken-item-mapper-pagination_contribute-7.6' into dspace-7_x
# Conflicts:
#	src/app/access-control/bulk-access/browse/bulk-access-browse.component.html
#	src/app/access-control/epeople-registry/epeople-registry.component.html
#	src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html
#	src/app/access-control/group-registry/group-form/members-list/members-list.component.html
#	src/app/access-control/group-registry/group-form/subgroup-list/subgroups-list.component.html
#	src/app/shared/object-select/collection-select/collection-select.component.html
#	src/app/shared/object-select/item-select/item-select.component.html
2024-04-19 23:52:34 +02:00
Tim Donohue
b43e99518d Update REST and CI docker compose scripts to sync with 7.x backend 2024-04-19 16:21:12 -05:00
Tim Donohue
7a5694347a Merge pull request #2965 from tdonohue/port_2816_to_7x
[Port dspace-7_x] Return 404 Not Found status code on missing identifiers
2024-04-19 13:21:05 -05:00
Jens Vannerum
92f2a77dae 111326: return not found status code on missing identifiers 2024-04-19 12:17:22 -05:00
Tim Donohue
57c2b02277 Merge pull request #2960 from DSpace/backport-2768-to-dspace-7_x
[Port dspace-7_x] Fix infinite scroll
2024-04-19 11:36:51 -05:00
Andrea Barbasso
fde0ebf872 [DURACOM-224] fix infinite scroll
(cherry picked from commit 2afa473cfb)
2024-04-19 15:43:02 +00:00
Alexandre Vryghem
268d2e54fc 108555: Refactored CollectionSelectComponent to not call canSelect every time changes are detected 2024-04-18 21:18:10 +02:00
Alexandre Vryghem
59197cff2d 108555: Refactored ItemSelectComponent to not call canSelect every time changes are detected 2024-04-18 21:18:10 +02:00
Alexandre Vryghem
da31c4f253 108555: Removed pageInfoState Input since it wasn't used and almost all the components gave the incorrect type of data to it 2024-04-18 19:28:01 +02:00
Tim Donohue
4aa3158f33 Merge pull request #2925 from DSpace/backport-2905-to-dspace-7_x
[Port dspace-7_x] Fix for submission describe warning contribution bug
2024-04-12 13:52:45 -05:00
lotte
3768dc030e 113500: Fixed lint issues
(cherry picked from commit 903af2ccdb)
2024-04-12 17:20:51 +00:00
lotte
27286998f7 113500: Fixed lint error
(cherry picked from commit 722bd6f7f5)
2024-04-12 17:20:51 +00:00
lotte
d8b6e86896 113500: Fixed tests after bugfix
(cherry picked from commit 4e0046022b)
2024-04-12 17:20:51 +00:00
lotte
47537a019c 113500: Fix for warning on first describe step
(cherry picked from commit 993ce1ab16)
2024-04-12 17:20:51 +00:00
Art Lowel
8e59b7d0b0 also add relationships one by one on the edit item relationships tab 2024-04-11 17:51:59 +02:00
Tim Donohue
f72725ceed Merge pull request #2919 from DSpace/backport-2782-to-dspace-7_x
[Port dspace-7_x] Fixed Font Awesome CSS Pseudo-elements not rendering in v6.x
2024-04-11 08:59:54 -05:00
Alexandre Vryghem
4251630ab8 112970: Always rerun resolvers on url change for create comcol pages 2024-04-11 00:18:04 +02:00
Alexandre Vryghem
e2c2174bf7 111373: Fixed Font Awesome CSS Pseudo-elements for v6.x
(cherry picked from commit 01f97a623f)
2024-04-10 21:51:53 +00:00
Tim Donohue
de1a240140 Merge pull request #2858 from 4Science/DURACOM-241
7.x - Header, navbar, and admin sidebar refactoring
2024-04-10 14:18:54 -05:00
Tim Donohue
b12bdfdd22 Docker build IDs must all be unique to avoid image conflicts. Ensure no builds use a generic name like "dspace-angular". 2024-04-09 15:06:43 -05:00
Tim Donohue
971c302378 Merge pull request #2911 from tdonohue/update_actions_7x
[Port dspace-7_x] Update all GitHub Actions & add token for Codecov.io
2024-04-08 16:59:26 -05:00
Tim Donohue
b758d0a5f9 Ensure all artifacts have a unique name by appending Node version to each 2024-04-08 14:46:16 -05:00
Tim Donohue
78f1d9f763 Update all GitHub Actions. Add newly required CODECOV_TOKEN to codecov action 2024-04-08 14:46:10 -05:00
Tim Donohue
90dc0e3f61 Merge pull request #2901 from DSpace/backport-2067-to-dspace-7_x
[Port dspace-7_x] Add configuration option to disable inlined CSS in SSR HTML
2024-04-05 13:45:50 -05:00
Yury Bondarenko
fd10fbe2a8 Add to config.example.yml
(cherry picked from commit 4a39f33006)
2024-04-05 18:14:43 +00:00
Yury Bondarenko
3b11ac517c Add configuration option to disable inlined CSS in SSR HTML
When inlining CSS, Angular Universal needs to extract critical styles.
This seems to take up a significant chunk of processing time.

However, loading may appear less smooth when this feature is disabled.

Added to the configuration to make it easier to A/B test this without a full re-build.

(cherry picked from commit 38a058d7af)
2024-04-05 18:14:42 +00:00
Tim Donohue
a1090fbb0d Merge pull request #2896 from tdonohue/port_2894_to_7x
[Port dspace-7_x] Bump axios to 1.6.8
2024-04-04 15:00:51 -05:00
Tim Donohue
4239d37a38 Bump axios to 1.6.8 2024-04-04 14:12:29 -05:00
Tim Donohue
a87a5f9b5e Merge pull request #2892 from tdonohue/port_2867_to_7x
[Port dspace-7_x]  Bump follow-redirects from 1.15.5 to 1.15.6
2024-04-04 12:36:55 -05:00
Tim Donohue
777fc571b0 Merge pull request #2895 from tdonohue/port_2872_to_7x
[Port dspace-7_x] Bump webpack-dev-middleware from 5.3.3 to 5.3.4
2024-04-04 12:36:36 -05:00
Tim Donohue
dc92bbd80a Merge pull request #2893 from tdonohue/port_2881_to_7x
[Port dspace-7_x] Bump express from 4.18.2 to 4.19.2
2024-04-04 12:09:24 -05:00
Tim Donohue
d503e4db07 Bump webpack-dev-middleware from 5.3.3 to 5.3.4 2024-04-04 11:58:15 -05:00
Tim Donohue
bba7fe2f74 Bump express from 4.18.2 to 4.19.2 2024-04-04 11:34:30 -05:00
Tim Donohue
ed8e280aa4 Bump follow-redirects from 1.15.5 to 1.15.6 2024-04-04 11:01:41 -05:00
Alexandre Vryghem
60d93e653f 113938: Added missing comcol structure to workspace/workflow item breadcrumbs 2024-04-04 12:07:29 +02:00
Alexandre Vryghem
fb8733ca0b 113901: Store the retrieved Relationships in the store
This needs to be done here too, since tilted relationships won't be returned by the api/core/items/{uuid}/relationships endpoint
2024-04-02 17:39:44 +02:00
Tim Donohue
2dfa075423 Merge pull request #2832 from alexandrevryghem/patch_2808
[Port dspace-7_x] Refactored community & collection pages
2024-03-29 10:04:08 -05:00
Alan Orth
43137fe676 Merge pull request #2879 from DSpace/backport-2877-to-dspace-7_x
[Port dspace-7_x] System-wide alert shouldn't be created when the message is empty
2024-03-26 11:26:31 +03:00
Alexandre Vryghem
d05438dc3e Prevent system-wide alert to be activated with empty message
(cherry picked from commit 767de4b5c8)
2024-03-26 07:12:03 +00:00
Alexandre Vryghem
25cb0455e2 Fixed bug in BrowseService where findListByHref was called with null instead of undefined, which prevented its default values from being used
(cherry picked from commit e6bf2f0ca7)
2024-03-24 19:12:48 +01:00
Alexandre Vryghem
692bb991a0 112970: Added missing breadcrumbs to create community/collection pages 2024-03-19 12:06:39 +01:00
Kuno Vercammen
badf00258c 113124: Allow opening ds-metadata-uri-values links in a new window 2024-03-15 11:42:01 +01:00
Tim Donohue
4c693a1294 Merge pull request #2861 from DSpace/backport-2777-to-dspace-7_x
[Port dspace-7_x] Element reference for typeahead directive is only defined when model has authority
2024-03-08 15:56:38 -06:00
William Welling
85922433a5 NgbTypeahead instance is only defined when model has authority
(cherry picked from commit 018d44c616)
2024-03-08 20:13:19 +00:00
Davide Negretti
3caac21648 [DURACOM-195] fix spacing in collapsible menu
(cherry picked from commit a88282d70b)
2024-03-07 18:57:39 +01:00
Davide Negretti
f26b265e64 [DURACOM-195] fix
(cherry picked from commit fdbe7a6005)
2024-03-07 18:57:36 +01:00
Davide Negretti
89c88ca6e0 [DURACOM-195] replace ul/li with div in sidebar
(cherry picked from commit d1dc8e6038)
2024-03-07 18:57:33 +01:00
Davide Negretti
e3f1fa39d5 [DURACOM-195] add background on mouse over to dropdown user menu items
(cherry picked from commit 8e35c0f713)
2024-03-07 18:57:30 +01:00
Davide Negretti
49efc4175d [DURACOM-195] fix issue with logo on small screens
(cherry picked from commit bff93a0847)
2024-03-07 18:57:27 +01:00
Davide Negretti
48e9817245 [DURACOM-195] replace ul/li with div in navbar
(cherry picked from commit abba806d40)
2024-03-07 18:57:24 +01:00
Davide Negretti
a9c3008cee [DURACOM-195] fixes
(cherry picked from commit 523850bc45)
2024-03-07 18:57:19 +01:00
Davide Negretti
8efc401811 [DURACOM-195] fix prefix of custom CSS variables
(cherry picked from commit 46fe7f63e3)
2024-03-07 18:57:16 +01:00
Davide Negretti
9518f70b42 [DURACOM-195] misc fixes
(cherry picked from commit 87d3383bba)
2024-03-07 18:57:13 +01:00
Davide Negretti
2f5c3b1267 [DURACOM-195] fix comment
(cherry picked from commit 80cc4c5d9a)
2024-03-07 18:57:08 +01:00
Davide Negretti
bb16983029 [DURACOM-195] fix issue with event handling in expandable admin sidebar section
(cherry picked from commit f25ec6210b)
2024-03-07 18:56:57 +01:00
Davide Negretti
5b1438f09f [DURACOM-195] accessibility issue fixed on log-out button
(cherry picked from commit 8f73b8ff9d)
2024-03-07 18:56:50 +01:00
Davide Negretti
510968b0c6 [DURACOM-195] [DURACOM-210] Reorder SCSS and CSS theme variables 2024-03-07 18:54:28 +01:00
Davide Negretti
8718bd0df6 [DURACOM-195] Header, navbar, and sidebar refactoring 2024-03-07 18:34:34 +01:00
Davide Negretti
7d2fdb7598 [DURACOM-195] Base components (simplify header-navbar-wrapper) 2024-03-07 18:32:51 +01:00
Davide Negretti
6c6afbf148 [DURACOM-195] Base components 2024-03-07 18:32:46 +01:00
Davide Negretti
d95d5753b4 [DURACOM-195] New host-window service methods 2024-03-07 18:32:38 +01:00
Tim Donohue
2178e0e6a3 Merge pull request #2852 from DSpace/backport-2851-to-dspace-7_x
[Port dspace-7_x] fix selector value in CommunitySidebarSearchListElementComponent
2024-03-05 09:52:46 -06:00
Sascha Szott
77f3b97e46 fix selector value in CommunitySidebarSearchListElementComponent
(cherry picked from commit ad3ef56e06)
2024-03-05 15:13:14 +00:00
Tim Donohue
203b0bbbaf Merge pull request #2850 from DSpace/backport-2847-to-dspace-7_x
[Port dspace-7_x] Bump sanitize-html from 2.10.0 to 2.12.1
2024-03-04 16:37:05 -06:00
dependabot[bot]
781de6e998 Bump sanitize-html from 2.10.0 to 2.12.1
Bumps [sanitize-html](https://github.com/apostrophecms/sanitize-html) from 2.10.0 to 2.12.1.
- [Changelog](https://github.com/apostrophecms/sanitize-html/blob/main/CHANGELOG.md)
- [Commits](https://github.com/apostrophecms/sanitize-html/compare/2.10.0...2.12.1)

---
updated-dependencies:
- dependency-name: sanitize-html
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit e7eaa9f61b)
2024-03-04 22:02:36 +00:00
Tim Donohue
6fefbe129d Merge pull request #2849 from alanorth/backport-2356-to-dspace-7_x
[Port dspace-7_x] Update dependencies for Node v20
2024-03-04 14:28:47 -06:00
Alan Orth
3add551bde [Port dspace-7_x] Update dependencies for Node v20
Port of #2356 by @mwoodiupui to dspace-7_x.
2024-03-04 20:33:12 +03:00
Tim Donohue
51f48b31dc Merge pull request #2843 from DSpace/backport-2822-to-dspace-7_x
[Port dspace-7_x] Bump ip from 2.0.0 to 2.0.1
2024-02-29 15:56:19 -06:00
dependabot[bot]
b2adc42aaf Bump ip from 2.0.0 to 2.0.1
Bumps [ip](https://github.com/indutny/node-ip) from 2.0.0 to 2.0.1.
- [Commits](https://github.com/indutny/node-ip/compare/v2.0.0...v2.0.1)

---
updated-dependencies:
- dependency-name: ip
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit c147c7d6ea)
2024-02-29 21:26:32 +00:00
Alexandre Vryghem
f2dab663ca 108588: Fixed browse by issue date show loading icon indefinitely when empty
(cherry picked from commit 6f51bd866c)
2024-02-23 21:40:21 +01:00
DSpace Bot
0f09920cb1 [Port dspace-7_x] site search should not adopt existing URL query string parameters (#2824)
Do not merge existing query params when using site search from MyDSpace workflow.
2024-02-22 11:50:03 +03:00
Alan Orth
41faa5ee52 Merge pull request #2821 from tdonohue/port_2733_to_7x
[Port dspace-7_x]  Use keyboard to select values (part 2)
2024-02-20 21:13:10 +03:00
Jens Vannerum
d920567f8a 111768: move original code back to init only for performance 2024-02-20 09:45:03 -06:00
Jens Vannerum
85694ec285 111768: add back necessary setCurrentValue calls that were removed earlier 2024-02-20 09:44:57 -06:00
Nona Luypaert
325728de8f 112198: Ensure relationship requests are sent one by one
- remove (de)select all buttons in DynamicLookupRelationSearchTab
- add requestQueue to RelationshipEffects
2024-02-19 11:09:05 +01:00
Tim Donohue
3ce4603328 Merge pull request #2812 from DSpace/backport-2770-to-dspace-7_x
[Port dspace-7_x] German translations of feedback page translation keys
2024-02-15 17:11:58 -06:00
Sascha Szott
9cff5e9c34 minor improvement of German translation
(cherry picked from commit e03b492dbd)
2024-02-15 22:11:36 +00:00
Sascha Szott
0fdfecd973 added german translations of feedback page translation keys
(cherry picked from commit 26ebc9f8fc)
2024-02-15 22:11:36 +00:00
Tim Donohue
9dc0363337 Merge pull request #2811 from DSpace/backport-2794-to-dspace-7_x
[Port dspace-7_x] Added scope @Input() to the SearchComponent & fixed related bugs
2024-02-15 15:16:09 -06:00
Alexandre Vryghem
d96c048874 111639: Fixed search settings not using the scope
(cherry picked from commit 93b22cba1f)
2024-02-15 20:38:01 +00:00
Alexandre Vryghem
865f4899b2 111639: Added scope @Input() and made the search facets & search results use that scope
(cherry picked from commit 22e87a5f5a)
2024-02-15 20:38:01 +00:00
Tim Donohue
b350916fe3 Merge pull request #2810 from DSpace/backport-2647-to-dspace-7_x
[Port dspace-7_x] File edit component updated to work for forms without access conditions.
2024-02-15 14:34:38 -06:00
Michael Spalti
381254a16e File edit component updated to work for forms without access conditions.
Fixed unit test

Fixed accidental reformatting

(cherry picked from commit 6fff475a5a)
2024-02-15 20:00:45 +00:00
Tim Donohue
8506d36dbf Merge pull request #2800 from alexandrevryghem/generify-component-loaders_contribute-7_x
[Port dspace-7_x] Refactored community & collection pages
2024-02-14 10:58:38 -06:00
Alexandre Vryghem
0366e8b934 Replace routerLinkActive with [class.active] to ensure visibility of aria-current tag 2024-02-14 00:10:41 +01:00
Tim Donohue
eba7683f6b Merge pull request #2803 from DSpace/backport-2705-to-dspace-7_x
[Port dspace-7_x] Minor updates to i18n strings for clarity and consistency
2024-02-07 12:31:13 -06:00
Tim Donohue
5a0018d4fa Merge pull request #2802 from DSpace/backport-2766-to-dspace-7_x
[Port dspace-7_x] Fix missing Register DOI button if configuration enabled
2024-02-07 11:48:27 -06:00
Thomas Misilo
17dc120ca1 Update "E-mail" to be "Email" for consistency
(cherry picked from commit 7b8962a7cd)
2024-02-07 17:23:05 +00:00
Alan Orth
8eb2e2ce80 src/assets/i18n/en.json5: minor changes for consistency
Fix some random capitalizations and strange wording.

(cherry picked from commit d6c46847c2)
2024-02-07 17:23:05 +00:00
Alan Orth
b2b9fb8bf9 src/assets/i18n/en.json5: minor updates for consistency
We should be capitalizing acronyms and project-specific nouns like
MyDSpace consistently in our interface.

(cherry picked from commit f78f4b45fc)
2024-02-07 17:23:05 +00:00
Alan Orth
9d9d90ab9c src/assets/i18n: change "controller" to "reviewer"
Reviewer is a less obscure term for what this actually is in most
cases.

(cherry picked from commit 98241d8925)
2024-02-07 17:23:05 +00:00
Tim Donohue
ccd7056a87 Merge pull request #2801 from DSpace/backport-2799-to-dspace-7_x
[Port dspace-7_x] Bump follow-redirects from 1.15.3 to 1.15.5
2024-02-07 11:06:06 -06:00
Kim Shepherd
c50dd1a3e9 Improve cfg handling in item-status.component.ts
(cherry picked from commit 68475d1ed6)
2024-02-07 16:57:19 +00:00
Kim Shepherd
8b3bc90864 Improve cfg handling in item-status.component.ts
(cherry picked from commit 3e33785311)
2024-02-07 16:57:19 +00:00
Agustina Martinez
9f99555c64 Update item-status.component.ts
Fix initialOperations typo and return ops with register doi op

(cherry picked from commit e77898eaac)
2024-02-07 16:57:19 +00:00
dependabot[bot]
eb4633557d Bump follow-redirects from 1.15.3 to 1.15.5
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.3 to 1.15.5.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.3...v1.15.5)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit 90a277fbeb)
2024-02-07 16:34:28 +00:00
Alexandre Vryghem
effa19f719 111679: Restored missing inAndOutputNames on ClaimedTaskActionsLoaderComponent 2024-02-07 13:56:08 +01:00
Alexandre Vryghem
835891fe59 Merge remote-tracking branch 'upstream/dspace-7_x' into generify-component-loaders_contribute-7_x
# Conflicts:
#	src/app/shared/theme-support/themed.component.ts
2024-02-07 00:18:22 +01:00
Alexandre Vryghem
ff55646c62 108588: Fixed accessibility issues on ds-comcol-page-browse-by 2024-02-07 00:17:46 +01:00
Tim Donohue
972c1098cb Merge pull request #2798 from DSpace/backport-2795-to-dspace-7_x
[Port dspace-7_x] fix German translation of admin.workflow.item.workflow
2024-02-06 16:03:36 -06:00
Sascha Szott
59fc3e5635 remove translation (use singular form instead of plural form)
(cherry picked from commit ac5670a514)
2024-02-06 22:03:10 +00:00
Tim Donohue
60b310e216 Merge pull request #2796 from tdonohue/port_2791_to_7x
[Port dspace-7_x] Fix issue with cli.yml not using same network as backend.
2024-02-05 16:08:24 -06:00
Tim Donohue
b9cc5ba824 Resync docker-compose-ci and docker/docker-compose-rest with DSpace/DSpace docker scripts 2024-02-05 14:19:53 -06:00
Tim Donohue
f072ae74af Bug fix to GitHub CI build. Set compose project name via env variable. Also add default name if unspecified 2024-02-05 11:14:00 -06:00
Tim Donohue
e2d014d0a6 Update cli.yml to reference dspacenet in docker-compose-rest. Remove unnecessary network from cli.assetstore.yml 2024-02-05 11:13:53 -06:00
Tim Donohue
ab579da614 Merge pull request #2790 from DSpace/backport-2778-to-dspace-7_x
[Port dspace-7_x] Dedupe patch operations by op and path
2024-02-01 13:50:52 -06:00
William Welling
05c978bc62 Dedupe patch operations by op and path
(cherry picked from commit f40639de86)
2024-02-01 19:00:52 +00:00
Tim Donohue
95c635c451 Merge pull request #2786 from tdonohue/port_2717_to_7x
[Port dspace-7_x] Fix accessibility issues (part 2)
2024-01-31 11:56:18 -06:00
Alexandre Vryghem
3e48e5903e Fixed dropdown accessibility issue
- Removed non-existing dropdownMenuButton references
- Added appropriate roles to dropdown menus
2024-01-31 09:51:19 -06:00
Alexandre Vryghem
63fa8f39f5 Fixed user authentication/registration accessibility issue
- Added the correct autocomplete value
- Removed dangling labels, because aria labels already describe those input fields & we can't use ids in this component because otherwise there are duplicate ids on the /login page
2024-01-31 09:51:09 -06:00
Alexandre Vryghem
138e163fa8 Fixed edit metadata page accessibility issue
- Hide fontawesome icons for screen readers
- Added missing aria-label to metadata field input
2024-01-31 09:51:03 -06:00
Alexandre Vryghem
ac743c5138 Fixed feedback form page accessibility issue
- The form used a fieldset tag instead of a form tag
2024-01-31 09:50:58 -06:00
Alexandre Vryghem
37803e9330 Fixed remaining community/collection page accessibility issues
- Hide fontawesome icons for screen readers
- Replaced dangling labels with spans and added more descriptive aria label to browse link
- Fixed empty label/missing header in edit resource policy table
- Added missing comcol logo al text
- Refactored dso-edit-menu-section to not display empty link buttons and duplicate titles
2024-01-31 09:50:50 -06:00
Alexandre Vryghem
8b5cd79bdc Fixed accessibility issues on AccessControlFormContainerComponent
- Replaced invisible label in AccessControlArrayFormComponent that was only used for styling with span
- Fixed radio buttons not being part of a fieldset
- Fixed empty table header
2024-01-31 09:50:44 -06:00
Alexandre Vryghem
949e55235a Fixed accessibility issues on BitstreamFormatsComponent
- Removed empty label of the select box and replaced it with an aria-label
- Fixed empty table header
2024-01-31 09:50:38 -06:00
Alexandre Vryghem
5173ac3704 Fixed accessibility issues on MetadataRegistryComponent
- Removed empty label of the select box and replaced it with an aria-label
- Fixed empty table header
2024-01-31 09:50:31 -06:00
Alexandre Vryghem
9335c32334 Fixed accessibility issues on MetadataSchemaComponent
- Removed empty label of the select box and replaced it with an aria-label
- Fixed empty table header
2024-01-31 09:50:23 -06:00
Alexandre Vryghem
b0d3710454 Fixed accessibility issues with pagination button
- Replaced the h6 tags with the role heading
- Gave the gear button the roles in order to be detected as an expandable menu
- Replaced the dropdown structure to render a menu of listboxes
- Added the aria-selected attribute
2024-01-31 09:49:38 -06:00
Alexandre Vryghem
e0849af926 Fix header ordering 2024-01-31 09:42:30 -06:00
Alexandre Vryghem
b076b98996 Fixed accessibility issues on SubmissionImportExternalSearchbarComponent
- Fixed input not describing itself
- Put the items from the dropdown in an ul
- Fixed broken aria labels
- Removed titles who where identical to the displayed value
2024-01-31 09:42:24 -06:00
Alexandre Vryghem
cc0501f340 Fixed search filters having empty input buttons 2024-01-31 09:42:17 -06:00
Alexandre Vryghem
6b204b5b53 Removed invisible buttons on the CommunityListComponent & fixed content displacement when expanding com/col 2024-01-31 09:42:12 -06:00
Alexandre Vryghem
3bf7d819de Fixed accessibility issues related to dso selectors
- Fixed header ordering
- Fixed input field not having a description what it does (because the header isn't always shown I decided to use aria-labels instead of regular labels)
2024-01-31 09:42:04 -06:00
Alexandre Vryghem
6497a156aa Destroy dynamically generated components in onDestroy & replace deprecated createComponent 2024-01-31 00:06:44 +01:00
Tim Donohue
67fc0054c1 Merge pull request #2773 from DSpace/backport-2755-to-dspace-7_x
[Port dspace-7_x] Add logo max constraints
2024-01-25 15:53:07 -06:00
FrancescoMolinaro
d4493cb534 add width 100% to prevent overflow on mobile
(cherry picked from commit f82ba8c5ad)
2024-01-25 21:08:11 +00:00
FrancescoMolinaro
682ec2b678 remove class from template
(cherry picked from commit d9e25882ce)
2024-01-25 21:08:11 +00:00
FrancescoMolinaro
20f5f17aac adapt solution to prevent img overflow
(cherry picked from commit d3c788a4e1)
2024-01-25 21:08:11 +00:00
FrancescoMolinaro
f1a7f36f17 add logo max costraints
(cherry picked from commit 32e3141b19)
2024-01-25 21:08:11 +00:00
Tim Donohue
5d700d5563 Merge pull request #2772 from DSpace/backport-2769-to-dspace-7_x
[Port dspace-7_x] fixed typo in info.feedback.page_help
2024-01-25 11:02:51 -06:00
Sascha Szott
c11a3b1372 fixed typo
(cherry picked from commit 4b7798fcc7)
2024-01-25 16:25:48 +00:00
Alan Orth
be0512d74e Merge pull request #2764 from alanorth/backport-2733-to-dspace-7_x
[Port dspace-7_x] Use keyboard to select values
2024-01-23 12:18:28 +03:00
Jens Vannerum
2d0d6ddc5d 110088: new implementation for keyboard support in dropdowns 2024-01-23 11:43:37 +03:00
Tim Donohue
b2cae3b48d Merge pull request #2758 from DSpace/backport-2691-to-dspace-7_x
[Port dspace-7_x] Decrease min-height for Login Dropdown Menu
2024-01-19 11:12:03 -06:00
Tim Donohue
5f19b6a26a Merge pull request #2757 from DSpace/backport-2736-to-dspace-7_x
[Port dspace-7_x] use localized error message
2024-01-19 11:11:50 -06:00
Thomas Misilo
d880b728ce Decrease min-height for Login Dropdown Menu
Fixes #2690

This is noticable when you have disabled local authentication, and only have a singular remote authentication such as Shibboleth or Orcid.

(cherry picked from commit 09fc44a539)
2024-01-19 15:25:12 +00:00
Sascha Szott
e7490340f8 use localized error message
(cherry picked from commit 92a74cee5a)
2024-01-19 15:21:44 +00:00
Alan Orth
fed70c5e9b Merge pull request #2754 from DSpace/backport-2721-to-dspace-7_x
[Port dspace-7_x] Fix whitespace in links due to newlines
2024-01-19 10:07:44 +03:00
Alan Orth
f08d74b269 src/app/item-page: remove newlines in links
The newlines cause whitespace to be enapsulated in the rendered link.

(cherry picked from commit 7207bbbd0e)
2024-01-19 05:14:00 +00:00
Alan Orth
f2f5156065 src/app/community-list-page: remove newlines in links
The newlines cause whitespace to be enapsulated in the rendered link.

(cherry picked from commit 7bedf7fc59)
2024-01-19 05:14:00 +00:00
Tim Donohue
0ed96d893d Merge pull request #2748 from DSpace/backport-2711-to-dspace-7_x
[Port dspace-7_x] Add more automated accessibility scanning to e2e tests & fix a few minor accessibility bugs
2024-01-17 14:09:02 -06:00
Tim Donohue
2137720602 Add environment variable for Person collection name. Use it in submission e2e tests.
(cherry picked from commit a5a89a4b98)
2024-01-17 19:38:04 +00:00
Tim Donohue
12a19378f7 Move increment/decrement to i18n. Update to use "name".
(cherry picked from commit 0aaf3131fa)
2024-01-17 19:38:04 +00:00
Tim Donohue
75c81b712e Add accessibility testing for admin sidebar
(cherry picked from commit 31bc05235e)
2024-01-17 19:38:04 +00:00
Tim Donohue
4e0a889fa1 Add Item Edit accessibility tests. Switch Item to use to one with bitstreams. Minor updates to HTML to pass accessibility tests.
(cherry picked from commit 80492cd88a)
2024-01-17 19:38:04 +00:00
Tim Donohue
9a7277065f Add accessibility tests (and minor fixes) for Edit Collection's Content Source tab and Item Mapper tab
(cherry picked from commit 00cb2f9e8a)
2024-01-17 19:38:04 +00:00
Tim Donohue
16a10548b8 Add Edit Collection accessibility Testing
(cherry picked from commit 9894d315a0)
2024-01-17 19:38:04 +00:00
Tim Donohue
4187847ad0 Add Edit Community accessibility tests & minor cleanup
(cherry picked from commit 6c76d8c1d7)
2024-01-17 19:38:04 +00:00
Tim Donohue
77bb3ed952 Fix circular dependency issue by using Cypres env variables directly instead of global constants
(cherry picked from commit e47593b303)
2024-01-17 19:38:04 +00:00
Tim Donohue
023f8a6900 Improve accessibility testing on Submission page
(cherry picked from commit 8d61fa6ac3)
2024-01-17 19:38:04 +00:00
Tim Donohue
0be04c754a Refactor e2e test infrastruction to allow easier way to lookup REST API info and generate CSRF tokens
(cherry picked from commit a581219df5)
2024-01-17 19:38:04 +00:00
Tim Donohue
07b95c2634 Fix ARIA labels and tabindex on date picker in submission form. Tabindex is unnecessary & throws accessibility errors from AXE tools
(cherry picked from commit 5dad8bec39)
2024-01-17 19:38:04 +00:00
Tim Donohue
e9efb50e02 Fix ARIA labels on submission form relationship button and dynamic dropdowns
(cherry picked from commit aeea1cd592)
2024-01-17 19:38:04 +00:00
Tim Donohue
868229460f Add new e2e accessibility tests & update some existing ones
(cherry picked from commit 53d521a87e)
2024-01-17 19:38:04 +00:00
Tim Donohue
9d593b657b Merge pull request #2743 from tdonohue/port_2587_to_dspace-7_x
[Port to dspace-7_x]  Deque Analysis Color Contrast fixes #2587
2024-01-16 16:48:13 -06:00
Maciej Kleban
0b43109a29 Replace hard-coded colors with bootstrap variants
* Replace custom variables with Bootstrap variants
* Replace custom button colors with Bootstrap variants
* Remove custom colors and replace them with bootstrap variants
* Fix checkbox offset styles
---------
Co-authored-by: Maciej Kleban <maciej.kleban@pcgacademia.pl>
2024-01-16 16:15:35 -06:00
Dawnkai
07a2f3bbbb Deque Analysis Color Contrast fixes 2024-01-16 16:04:27 -06:00
Alan Orth
fc28693b12 Merge pull request #2740 from DSpace/backport-2662-to-dspace-7_x
[Port dspace-7_x] Fixed ePerson link on edit group page
2024-01-12 08:51:21 +03:00
Alexandre Vryghem
77d2086796 Fixed ePerson link on edit group page
(cherry picked from commit 430ee3846a)
2024-01-12 05:25:16 +00:00
Tim Donohue
8dd0db094e Merge pull request #2670 from atmire/fix-api-undefined-issue-7.6.2-next
Ensure HALEndpointService doesn't use stale responses
2024-01-08 10:16:57 -06:00
Alexandre Vryghem
b28e24fda3 Merge branch 'memory-leak-fixes_contribute-7.4' into memory-leak-fixes_contribute-7.6
# Conflicts:
#	src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.ts
#	src/app/admin/admin-workflow-page/admin-workflow-search-results/admin-workflow-search-result-grid-element/workflow-item/workflow-item-search-result-admin-workflow-grid-element.component.ts
#	src/app/shared/metadata-representation/metadata-representation-loader.component.ts
#	src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.ts
#	src/app/shared/theme-support/themed.component.ts
2023-12-28 19:58:37 +01:00
Alexandre Vryghem
480c7a6ce0 Destroy dynamically generated components in onDestroy & replace deprecated createComponent 2023-12-26 14:31:07 +01:00
Tim Donohue
33a5dd3e7f Merge pull request #2713 from DSpace/backport-2707-to-dspace-7_x
[Port dspace-7_x] Update fi.json5
2023-12-14 11:22:36 -06:00
reetagithub
9a9311e02a Update fi.json5
Corrected a typo  in search.view.switch.show-grid

(cherry picked from commit 2339a559e9)
2023-12-14 16:16:00 +00:00
Tim Donohue
2fec884072 Merge pull request #2696 from DSpace/backport-2683-to-dspace-7_x
[Port dspace-7_x] Fix accessibility issues
2023-12-06 10:30:55 -06:00
Alexandre Vryghem
4a0bf8a7af Fixed Edit Item Bitstream showing empty buttons when css is turned off & replaced authentication dropdown menu link with button
- Also fixed box-shadows not working the same way for all footer buttons/links

(cherry picked from commit 4545b5354d)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
53f5ceabee Fixed Edit Item Bitstream showing empty buttons when css is turned off
(cherry picked from commit ff6dff72d8)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
8f8a3acba7 Fixed DSONameService getName & getHitHighlights returning empty string for OrgUnits without organization.legalName field
(cherry picked from commit e96d3cd2e9)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
dbb7917058 Fixed accessibility issues on search page
(cherry picked from commit 9a5ad0bc9f)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
7ec57988b8 Fixed accessibility issues about header ordering
(cherry picked from commit 5566c99625)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
3300f72621 Fixed browse by vocabulary treeview accessibility issues
(cherry picked from commit 30fe424cc5)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
77f52df047 Fixed item page accessibility issues
(cherry picked from commit 8ba17c991e)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
79ce4e9ec2 Fix collection mapper accessibility issues
- Added missing aria-labels to input checkboxes
- Fixed multiple tab related accessibility issues

(cherry picked from commit 1db83ba3c5)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
73cffe990a Fix item mapper accessibility issues
- Added missing aria-labels to input checkboxes
- Fixed role="tablist" not having direct role="tab" by adding role="presentation" on the li elements

(cherry picked from commit 5b21d14583)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
b94f0a9b69 Fix resource policy accessibility issues
(cherry picked from commit 09bf8af03c)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
5d5582e2d2 Fix Bitstream format accessibility issues
- Added missing aria-labels to input checkboxes
- Fixed minor css alignment

(cherry picked from commit 57cc34cdd1)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
5e52233cf3 Fix Process detail accessibility issues
- Made Process Output keyboard accessible

(cherry picked from commit 120835cfcd)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
9ed13f31ff Fix Create a new process page accessibility issues
- Added missing aria-label to delete buttons
- Moved hardcoded translation to translation files
- Fix color contrast issues on buttons
- Fix minor alignment issues
- Added missing aria labels to input and select elements

(cherry picked from commit 52c0977489)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
bc1ed9a96f Fix Processes Overview accessibility issues
- Added missing aria-label to delete button

(cherry picked from commit 4ea487cc0d)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
57ebe88994 Fix System-wide Alert accessibility issues
- Added missing aria-label to buttons

(cherry picked from commit 3bdfc386e9)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
96b3423ed1 Fix Health Panel usability issues
- Fixed aria-controls on HealthComponentComponent, HealthInfoComponent, HealthInfoComponentComponent, HealthPanelComponent pointing to non-existing id
- Fixed the tabs not having the role tab on its tabs
- Fixed aria-expanded being set to true when collapsed and backwards for HealthPanelComponent & HealthInfoComponent
- Fixed role="tablist" not having direct role="tab" by adding role="presentation" on the li elements
- Fixed minor alignment issues

(cherry picked from commit 3628c84844)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
fc7aa27706 Fix Bulk Access Management usability issues
- Added aria-labels to trash & select bitstream icon
- Added aria-labels ui-switch components (had to upgrade ngx-ui-switch to 14.1.0)
- Fixed aria-controls pointing to non-existing ids
- Fixed bulk-access-browse not having the tab role on it's tabs
- Fixed role="tablist" not having direct role="tab" by adding role="presentation" on the li elements
- Fixed aria-expanded being set to true when collapsed and backwards for BulkAccessBrowseComponent & BulkAccessSettingsComponent

(cherry picked from commit c300123b78)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
1c4be7d1fe Fixed duplicate search-navbar-container id & renabled accessibility tests for header
(cherry picked from commit cc71d60ebb)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
9f468c2c11 Added aria-labels & fixed aria-controls on myDSpace page
- Added aria-label to the new submission buttons (for repositories with more than 1 entity type)
- Fixed aria-controls pointing to non-existing ids

(cherry picked from commit 8a7bdfe18f)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
69100f0a24 Replaced uncrawlable links with buttons
(cherry picked from commit 9ab30231aa)
2023-12-06 16:03:23 +00:00
Alexandre Vryghem
d32303bf47 Added missing aria labels to edit bitstream tab
(cherry picked from commit e229be44d6)
2023-12-06 16:03:23 +00:00
Art Lowel
91789a698f Merge branch 'fix-api-undefined-issue-7.6' into fix-api-undefined-issue-7.6.2-next 2023-12-06 11:30:28 +01:00
Art Lowel
1d4a36e3b8 Merge remote-tracking branch 'upstream/dspace-7_x' into fix-api-undefined-issue-7.6.2-next 2023-12-06 11:30:23 +01:00
Art Lowel
790e717199 add ResponsePendingStale state 2023-12-06 11:24:35 +01:00
Art Lowel
c8ac260b78 also skip loading hal requests 2023-12-06 11:24:29 +01:00
max.nuding
9f95eb452c enable type-bind for checkbox inputs during submission 2023-12-06 10:15:31 +01:00
Tim Donohue
970c449b30 Merge pull request #2685 from DSpace/backport-2684-to-dspace-7_x
[Port dspace-7_x] Updated bitstream read description in en.json5
2023-12-04 15:57:39 -06:00
Michael Spalti
3b568f7d32 Updated bitstream read description in en.json5
(cherry picked from commit 2592f87356)
2023-12-04 21:08:29 +00:00
Tim Donohue
5de6cedf5e Merge pull request #2677 from DSpace/backport-2673-to-dspace-7_x
[Port dspace-7_x] Fix for loading thumbnail images for Items when MediaViewer enabled
2023-11-30 15:08:01 -06:00
Michael Spalti
9c69a77d43 Fix for thumbnail images in items.
Revert changes in html template

Revert changes in html template

Revert changes in html template

(cherry picked from commit 88c39e8b26)
2023-11-30 20:14:36 +00:00
Art Lowel
db29263eb1 Merge branch 'fix-api-undefined-issue-7.6' into fix-api-undefined-issue-7.6.2-next 2023-11-29 16:58:43 +01:00
Tim Donohue
5b59d37e2f Merge pull request #2667 from tdonohue/port_2666_to_dspace-7_x
[Port dspace-7_x] [Docker] Refactor to simply use the reusable-docker-build.yml from DSpace/DSpace.
2023-11-29 09:38:51 -06:00
Art Lowel
38752d9d71 ensure HALEndpointService doesn't use stale requests 2023-11-29 14:25:36 +01:00
Tim Donohue
92d25dd2a8 Remove unused env variables 2023-11-28 16:52:15 -06:00
Tim Donohue
65fff9361c Use the script from the dspace-7_x branch 2023-11-28 16:13:56 -06:00
Tim Donohue
b83a8421a3 Refactor to simply use the reusable-docker-build.yml from DSpace/DSpace. 2023-11-28 16:12:21 -06:00
Alan Orth
714652ebb0 Merge pull request #2659 from DSpace/backport-2652-to-dspace-7_x
[Port dspace-7_x] Deselect all metadata fields when switching between metadata schemas in registry
2023-11-23 16:27:52 +03:00
Alexandre Vryghem
c3f424dae4 108587: Deselect all fields on component destruction
(cherry picked from commit ecca8286b5)
2023-11-23 04:57:35 +00:00
Tim Donohue
6758b4c4c7 Merge pull request #2655 from tdonohue/port_docker_gh_updates
[Port dspace-7_x] Port recent GitHub Action changes
2023-11-22 12:20:58 -06:00
Tim Donohue
bd78acd559 Redeploy demo/sandbox more quickly by only waiting for AMD64 image 2023-11-22 11:42:11 -06:00
Tim Donohue
62ccd18345 Trigger redeploy of demo/sandbox from GitHub Actions after DockerHub image updated. 2023-11-21 13:55:17 -06:00
Tim Donohue
5ab87ec6c3 Update GH actions to latest versions. Fix bug in codecov to ensure it retries on error. 2023-11-21 13:55:10 -06:00
Tim Donohue
63e792990f Fix directory structure for -dist digests 2023-11-21 13:54:42 -06:00
Tim Donohue
526da8cddf Fix bug in Docker manifest. Each build must use a separate artifact to store digests. Other minor cleanup & comments added. 2023-11-21 13:54:30 -06:00
Thomas Misilo
02eb618c5f Setup the Docker GH Action for Matrix Building
This change enables building of the amd64 and arm64 images simultaneously.

Once both images finish, the manifest is sent to Docker Hub, allowing for a single image that has both the amd64/arm64 images.
2023-11-21 13:54:03 -06:00
Alexandre Vryghem
45e8977db7 Fixed pagination issues on item mapper 2023-11-15 23:31:54 +01:00
Tim Donohue
5a839c2906 Update version tag for development of next release 2023-11-15 14:37:06 -06:00
Tim Donohue
d8ed267e5f Update version tag for release 2023-11-15 14:33:16 -06:00
max.nuding
ab23613b79 Remove unnecessary import 2023-11-15 13:42:53 +01:00
max.nuding
c93a64db83 Fix tests to include translationservice dependency 2023-11-15 13:28:15 +01:00
max.nuding
038e31ccd1 Submission form now displays custom messages for regex validated fields if they exist 2023-11-15 10:51:53 +01:00
Tim Donohue
fdcaeb592c Merge pull request #2639 from tdonohue/port_2610_to_dspace-7_x
[Port dspace-7_x] Fixed menu not updating when a new sub section is added after rendering has already completed
2023-11-13 17:00:20 -06:00
Tim Donohue
8872fd3340 Merge pull request #2638 from DSpace/backport-2633-to-dspace-7_x
[Port dspace-7_x] Edit-item view: random order of buttons in status tab
2023-11-13 16:51:21 -06:00
Tim Donohue
959d592394 Merge pull request #2637 from DSpace/backport-2632-to-dspace-7_x
[Port dspace-7_x] Fixes "some item edit pages are accessible by anonymous users"
2023-11-13 16:40:19 -06:00
Alexandre Vryghem
c98e8f6504 107902: Created test case for 2f26e686cc 2023-11-13 16:36:05 -06:00
Kristof De Langhe
e293f3db52 107685: menu-component re-render section on store update 2023-11-13 16:35:16 -06:00
Vlad Nouski
651b6a7d76 refactor: code
(cherry picked from commit fbbbc18844)
2023-11-13 22:05:45 +00:00
Vlad Nouski
dd554590b1 fix: random order of buttons in status tab
(cherry picked from commit 35f8b55f58)
2023-11-13 22:05:45 +00:00
Tim Donohue
0a3502e9cc Merge pull request #2636 from DSpace/backport-2562-to-dspace-7_x
[Port dspace-7_x] Fix match theme by handle with canonical prefix https://hdl.handle.net/ not working
2023-11-13 16:00:02 -06:00
Vlad Nouski
94866cab45 [DURACOM-202] refactor: code
(cherry picked from commit 6f64db1645)
2023-11-13 20:34:42 +00:00
Vlad Nouski
a5a59dcf8b [DURACOM-202] refactor: code
(cherry picked from commit b6d515ff09)
2023-11-13 20:34:42 +00:00
Vlad Nouski
8f9a358afb [DURACOM-202] feature: item edit pages are accessible by administrator
(cherry picked from commit ccf1cc4547)
2023-11-13 20:34:42 +00:00
Alexandre Vryghem
0cd72e4917 107671: Fixed theme matching by handle not working in production mode
(cherry picked from commit 7529ed8b35)
2023-11-13 20:21:10 +00:00
Alexandre Vryghem
1222ed45ca 107671: Fixed bug where config property would still sometimes be undefined whey calling the ngOnDestroy in the ThemedComponent
(cherry picked from commit 4e54cca600)
2023-11-13 20:21:10 +00:00
Alexandre Vryghem
27f3fc310f 107671: Split Theme model & ThemeConfig classes in separate files to prevent circular dependencies
(cherry picked from commit da8880e5ba)
2023-11-13 20:21:10 +00:00
Alexandre Vryghem
d3fdfebde1 107671: Fix handle theme not working with canonical prefix https://hdl.handle.net/
(cherry picked from commit a7faf7d449)
2023-11-13 20:21:10 +00:00
Tim Donohue
626cc30738 Merge pull request #2635 from DSpace/backport-2579-to-dspace-7_x
[Port dspace-7_x] adding new access-status-list-element-badge css classes
2023-11-13 13:19:23 -06:00
Tim Donohue
64364c9ddb Merge pull request #2634 from DSpace/backport-2630-to-dspace-7_x
[Port dspace-7_x] Fix handle redirect not working with custom nameSpace
2023-11-13 13:18:52 -06:00
Paulo Graça
a276f415a8 adding ngOnDestroy for dealing with unsubscribe
(cherry picked from commit 75b788d05b)
2023-11-13 17:30:28 +00:00
Paulo Graça
59c4d59e45 remove replaceAll and use an object property
(cherry picked from commit c7eae9242a)
2023-11-13 17:30:28 +00:00
Paulo Graça
a12488c827 new accessStatusClass atribute
(cherry picked from commit 6378dbec4a)
2023-11-13 17:30:28 +00:00
Paulo Graça
ff03243298 Create new access-status-badge.component.scss
(cherry picked from commit 3bf2eb1997)
2023-11-13 17:30:28 +00:00
Paulo Graça
116bfbded1 adding new access-status-list-element-badge css classes
(cherry picked from commit e847e4ef51)
2023-11-13 17:30:28 +00:00
Alexandre Vryghem
68cdd120c9 Fix handle redirect not working with custom nameSpace
(cherry picked from commit b894dce3b0)
2023-11-13 17:22:53 +00:00
Tim Donohue
7d5c4560cd Merge pull request #2629 from tdonohue/port_2620_to_dspace-7_x
[Port dspace-7_x] Fix for repeatable date field labels
2023-11-10 17:20:40 -06:00
Tim Donohue
755e89dffa Merge pull request #2628 from DSpace/backport-2625-to-dspace-7_x
[Port dspace-7_x] Bump axios from 0.27.2 to 1.6.0
2023-11-10 17:15:22 -06:00
lotte
8458d589b2 Fixed test 2023-11-10 16:40:31 -06:00
lotte
30ce8440e1 108045: Fix for repeatable date field labels 2023-11-10 16:39:38 -06:00
dependabot[bot]
c8d98ec0b1 Bump axios from 0.27.2 to 1.6.0
Bumps [axios](https://github.com/axios/axios) from 0.27.2 to 1.6.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v0.27.2...v1.6.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit ef9f31d3c6)
2023-11-10 22:23:44 +00:00
Tim Donohue
6975fd15d5 Merge pull request #2627 from DSpace/backport-2545-to-dspace-7_x
[Port dspace-7_x] Fix "Edit Group" page always requests all member Subgroups & EPersons
2023-11-10 15:14:27 -06:00
Tim Donohue
d305e6096a Address feedback. Run empty search on init. Reorder sections to list current members before add members (for both eperson and groups)
(cherry picked from commit 9117ac005f)
2023-11-10 19:03:47 +00:00
Tim Donohue
37ae09acd1 Remove seemingly unnecessary page reload after new search.
(cherry picked from commit d163db13f2)
2023-11-10 19:03:47 +00:00
Tim Donohue
8cc36d7056 Refactor subgroups-list component's "search()" to act same as member-list component's "search()". Avoids reloading the page as frequently.
(cherry picked from commit 2eb1a17e4e)
2023-11-10 19:03:47 +00:00
Tim Donohue
4a1f2a1b75 Refactor members-list and subgroups-list components to use new isNotMemberOf endpoints (via services)
(cherry picked from commit 8a10888d2a)
2023-11-10 19:03:47 +00:00
Tim Donohue
1f1dc59f8b Fix subgroups-list specs so they align with new members-list specs
(cherry picked from commit 64f968b246)
2023-11-10 19:03:47 +00:00
Tim Donohue
f0b4239df9 Also remove unnecessary EpersonDtoModel from extending ReviewersListComponent. Remove "memberOfGroup" from EpersonDtoModel as it is no longer used
(cherry picked from commit b598f1b5ca)
2023-11-10 19:03:47 +00:00
Tim Donohue
753a31f7f4 Remove unnecessary EpersonDtoModel. Rework code and tests to use EPerson instead.
(cherry picked from commit bffae54b10)
2023-11-10 19:03:47 +00:00
Tim Donohue
ac6a7be7aa Remove "isMemberOfGroup()" from members-list component.
(cherry picked from commit 43d37196fb)
2023-11-10 19:03:47 +00:00
Tim Donohue
c02cfff8da Fix bug where linked Community/Collection info was sometimes listed many times in a row
(cherry picked from commit 229236634a)
2023-11-10 19:03:47 +00:00
Tim Donohue
d7ccce1f8f Remove isSubgroupOfGroup() functionality as it loads every subgroup at once. Bad peformance for large groups
(cherry picked from commit 97479a2945)
2023-11-10 19:03:47 +00:00
Tim Donohue
139446118b Limit getMembers() and getSubgroups() to only fetching one object. These lists are only used to find the size of each
(cherry picked from commit 0da7c15f2e)
2023-11-10 19:03:47 +00:00
Tim Donohue
787feae631 Merge pull request #2626 from tdonohue/port_2607_to_dspace-7_x
[Port dspace-7_x] Added skip to main content button
2023-11-10 11:43:15 -06:00
Alexandre Vryghem
e545c42aae Added skip to main content button 2023-11-10 10:59:57 -06:00
Tim Donohue
d166b5e37a Merge pull request #2623 from DSpace/backport-2611-to-dspace-7_x
[Port dspace-7_x] Communities & Collections tree browser updates - Replaced #2597
2023-11-10 09:55:38 -06:00
Tim Donohue
61ded72183 Merge pull request #2616 from DSpace/backport-2574-to-dspace-7_x
[Port dspace-7_x] Support type-bind of elements based on repeatable list type-bound element (CHECKBOX_GROUP)
2023-11-10 09:15:59 -06:00
William Welling
b6d8c7d18e Filter expanded nodes by id
Co-Authored-By: Art Lowel <1567693+artlowel@users.noreply.github.com>
(cherry picked from commit dc2ef989e6)
2023-11-10 15:14:28 +00:00
William Welling
1d0ca04992 Update condition to render show more node
`loadingNode` ends up being the current `node` after clicking it preventing it from rendering when more pages available.

Update community list component spec

Make the show more flat node id unique

The nodes with same id are conflicting when added to the tree. Clicking on the second with same id places the show more button under the wrong branch and expands the wrong page.

(cherry picked from commit 11d3771e72)
2023-11-10 15:14:28 +00:00
Tim Donohue
34b91a7dea Merge pull request #2617 from DSpace/backport-2594-to-dspace-7_x
[Port dspace-7_x] Media viewer controls rendered behind DSpace header
2023-11-10 06:49:12 -06:00
Tim Donohue
203dcbebda Merge pull request #2612 from DSpace/backport-2596-to-dspace-7_x
[Port dspace-7_x] Fix cache issue when depositing a submission
2023-11-09 16:53:28 -06:00
Davide Negretti
c6ade09e4a [DURACOM-180] Prevent header from covering media viewer controls (base theme)
(cherry picked from commit c042cd8d11)
2023-11-09 22:44:28 +00:00
Davide Negretti
5f46b638e4 [DURACOM-180] Prevent header from covering media viewer controls (dspace theme)
(cherry picked from commit 0208a78437)
2023-11-09 22:44:28 +00:00
Davide Negretti
0d0c2dac17 [DURACOM-195] Simplify vertical spacing in header and breadcrumbs
(cherry picked from commit a3e6d9b09a)
2023-11-09 22:44:28 +00:00
Andreas Mahnke
bc21085398 Support type-bind of elements based on repeatable list type-bound element (CHECKBOX_GROUP)
(cherry picked from commit 09aaa46875)
2023-11-09 22:04:12 +00:00
Tim Donohue
137a83e7f1 Merge pull request #2614 from DSpace/backport-2595-to-dspace-7_x
[Port dspace-7_x] Add UI nameSpace context path to Mirador viewer path
2023-11-09 13:40:03 -06:00
Alan Orth
31ee580047 Merge pull request #2615 from DSpace/backport-2602-to-dspace-7_x
[Port dspace-7_x] Support for freetext values in submission for vocabulary controlled `onebox` and `tag` types
2023-11-09 22:39:53 +03:00
Jens Vannerum
e815b1d938 108055: add user input to tag list
(cherry picked from commit aac58e612d)
2023-11-09 18:56:37 +00:00
Jens Vannerum
a758848146 108055: fix issue 8686: unable to enter freetext values in the submission form for vocabulary
(cherry picked from commit 0dcf6cb885)
2023-11-09 18:56:37 +00:00
William Welling
fba30781de Add UI nameSpace context path to Mirador viewer path
(cherry picked from commit 3228c457a3)
2023-11-09 17:45:22 +00:00
Giuseppe Digilio
4b4c1dc08a [DURACOM-197] Fix cache issue when depositing a submission
(cherry picked from commit f992ff6671)
2023-11-09 17:31:52 +00:00
Tim Donohue
5eb62e22eb Merge pull request #2605 from DSpace/backport-2364-to-dspace-7_x
[Port dspace-7_x] Utility gap-* classes for flexbox
2023-11-08 16:57:59 -06:00
Tim Donohue
fbe4732450 Merge pull request #2590 from marcoaureliocardoso/dspace-7_x
fix(pt-BR.json5): fix and update the language file
2023-11-08 16:49:38 -06:00
Davide Negretti
c5f22ab959 [DURACOM-177] Use gap-* classes on navbar buttons
(cherry picked from commit a35629536e)
2023-11-08 22:15:29 +00:00
Davide Negretti
75e45cc8c2 [DURACOM-177] gap-* classes
(cherry picked from commit 930a381e4a)
2023-11-08 22:15:29 +00:00
Tim Donohue
5bb451a649 Merge pull request #2604 from DSpace/backport-2603-to-dspace-7_x
[Port dspace-7_x] Fix e2e tests by running in production mode & using a user-agent for statistics
2023-11-08 13:13:21 -06:00
Tim Donohue
042c0f06f1 Specify user agent to avoid being detected as a "bot" by backend
(cherry picked from commit 72cda41731)
2023-11-08 18:25:13 +00:00
Tim Donohue
f3f87dc928 Ensure e2e tests run in production mode
(cherry picked from commit 7dcaae8465)
2023-11-08 18:25:13 +00:00
Tim Donohue
4a10d37d0d Merge pull request #2598 from DSpace/backport-2593-to-dspace-7_x
[Port dspace-7_x] Fix "Submission input type date doesn't work properly once a value has been set"
2023-11-03 15:56:55 -05:00
Alisa Ismailati
c99487babc [DURACOM-194] fixed year input value on input type date
(cherry picked from commit c412c1fa13)
2023-11-03 20:15:37 +00:00
Alisa Ismailati
e54723aa85 Merged in DSC-106 (pull request #643)
[DSC-106] Date input usable via keyboard using tab

Approved-by: Vincenzo Mecca
(cherry picked from commit 543b4ad576)
2023-11-03 20:15:37 +00:00
Marco Aurelio Cardoso
8b48a0b118 fix(pt-BR.json5): fix and update the language file and previous errors
Fix and update the pt-BR language file and the previous errors
2023-10-29 07:18:04 -03:00
Marco Aurelio Cardoso
e1494c0518 fix(pt-BR.json5): fix and update the language file
Fix and update the pt-BR language file
2023-10-29 06:49:20 -03:00
Tim Donohue
701c6e36b0 Merge pull request #2589 from DSpace/backport-2580-to-dspace-7_x
[Port dspace-7_x]   Check cssRules before css variables are read from stylesheet (again)
2023-10-27 13:51:12 -05:00
Gantner, Florian Klaus
c6b66b62e3 more error-prone check of cssRules existence before css variables are get from stylesheet
check the existence off cssRules property before the variables are readed from this stylesheet
https://github.com/DSpace/dspace-angular/issues/2450

(cherry picked from commit 4dd334f2e7)
2023-10-27 15:28:08 +00:00
Tim Donohue
6a182c32e1 Merge pull request #2585 from tdonohue/port_2442_to_7x
[Port dspace-7_x] New themed components & minor CSS fixes
2023-10-26 16:56:03 -05:00
Alexandre Vryghem
b8079a350c New themed components & minor CSS fixes (#2442)
* 100839: Created themeable BrowseByComponent

* 100839: Added themed BrowseByComponent to custom theme

* 100839: Added themed BrowseEntryListElementComponent to custom theme

* Added PersonComponent to custom theme

* Themed LogInComponent

* Fix focus on navbar using different color

* Fix ccLicense checkbox margin

* Fix long search facets name not displaying correctly

* Removed RecentItemListComponent's unnecessary float causing alignment issues when adding components underneath it

* Themed RegisterEmailFormComponent
2023-10-26 16:07:24 -05:00
Tim Donohue
3e9f3aba92 Merge pull request #2584 from DSpace/backport-2441-to-dspace-7_x
[Port dspace-7_x] Minor css variables fixes for header & navbar
2023-10-26 15:02:26 -05:00
Alexandre Vryghem
e548ebcb5a Added new variables for the expandable navbar section
(cherry picked from commit 2ca2a3881f)
2023-10-26 19:03:08 +00:00
Alexandre Vryghem
166444fc50 Fixed breadcrumb padding using incorrect syntax
(cherry picked from commit 6c48238fa2)
2023-10-26 19:03:08 +00:00
Alexandre Vryghem
a40e26985d Fixed header bg color not being set in default (no) theme
(cherry picked from commit 14b1ce5e50)
2023-10-26 19:03:08 +00:00
Alexandre Vryghem
72dcfddff1 Added support for changing the color of the navbar
(cherry picked from commit f6649e1c38)
2023-10-26 19:03:08 +00:00
Tim Donohue
b9f60fa627 Merge pull request #2583 from DSpace/backport-2506-to-dspace-7_x
[Port dspace-7_x] allow insertion of multi-line scope notes in MD field registry
2023-10-26 13:25:32 -05:00
Tim Donohue
97b22c63f8 Merge pull request #2391 from alexandrevryghem/split-eperson-administration-page_contribute-maintenance-7.6
Created separate ePerson pages for create/edit
2023-10-26 13:23:15 -05:00
Sascha Szott
163661a956 allow to insert multi-line scope notes in MD field registry
(cherry picked from commit 5bc5dd859e)
2023-10-26 16:56:44 +00:00
Tim Donohue
f8671e7d4b Merge pull request #2581 from DSpace/backport-2542-to-dspace-7_x
[Port dspace-7_x] Fix i18n labels and alignment in vocabulary-treeview
2023-10-26 11:24:11 -05:00
Tim Donohue
673f81759e Merge pull request #2464 from alexandrevryghem/i18n-cache-busting_contribute-7.6
i18n production improvements
2023-10-26 11:22:36 -05:00
Davide Negretti
e10a08ecfa [DURACOM-190] Fix alignment in vocabulary-treeview
(cherry picked from commit feb2b2be53)
2023-10-26 15:35:38 +00:00
Davide Negretti
00eb24c39d [DURACOM-190] Fix i18n labels in vocabulary-treeview
(cherry picked from commit b321d6f727)
2023-10-26 15:35:38 +00:00
Tim Donohue
3b6dd66680 Merge pull request #2458 from atmire/backport-2423-to-dspace-7_x
[Port to dspace-7_x] Fix inherit policies at item move (Angular)
2023-10-25 16:38:44 -05:00
Tim Donohue
d6951dc8e3 Merge pull request #2576 from tdonohue/port_2362_to_7x
[Port dspace-7_x] Making user menu component themeable
2023-10-25 16:06:50 -05:00
Tim Donohue
1d2cdf75e6 Merge pull request #2575 from tdonohue/port_2530_to_7x
[Port to dspace-7_x] Fix display LogInComponent turning blank when entering wrong username/password combination
2023-10-25 15:18:20 -05:00
Eike Martin Löhden
4945460382 Removed default value from inExpandableNavbar. 2023-10-25 15:16:01 -05:00
Eike Martin Löhden
2ec90b8273 Included user-menu component in custom theme. 2023-10-25 15:15:54 -05:00
Eike Martin Löhden
a4aecce865 Replaced tags for ds-user-menu. 2023-10-25 15:15:48 -05:00
Eike Martin Löhden
de826634c8 Corrected missing semicolon. 2023-10-25 15:15:41 -05:00
Eike Martin Löhden
d04d9fd250 Added themed-user-menu component. 2023-10-25 15:15:25 -05:00
Alexandre Vryghem
86657108dd Merge branch 'fix-display-order-authentication-methods_contribute-7.4' into fix-display-order-authentication-methods_contribute-7.6
# Conflicts:
#	src/app/shared/log-in/log-in.component.html
#	src/app/shared/log-in/log-in.component.ts
2023-10-25 14:27:09 -05:00
Alan Orth
73f21f21e7 Merge pull request #2571 from DSpace/backport-2553-to-dspace-7_x
[Port dspace-7_x] Added Serbian Cyrillic translation and corrected Serbian Latin translаtion
2023-10-24 22:47:50 +03:00
imilos
5ab69af71e Added Serbian cyrilic translation and corrected Serbian latin translation.
(cherry picked from commit aa9e12dcfe)
2023-10-24 18:02:41 +00:00
imilos
884e113168 Added Serbian cyrilic translation and corrected Serbian latin translation.
(cherry picked from commit ad12e5a7f2)
2023-10-24 18:02:41 +00:00
Alan Orth
a92aa05049 Merge pull request #2566 from DSpace/backport-2527-to-dspace-7_x
[Port dspace-7_x] Minor header button improvements
2023-10-23 21:57:44 +03:00
Alexandre Vryghem
d7dba4bfcf Fixed invalid html structure the ExpandableNavbarSectionComponent had an ul tag containing non-li tags
(cherry picked from commit fa56d5dfb7)
2023-10-23 17:50:43 +00:00
Alexandre Vryghem
e82a1ebedb Applied same gap between header icons in the dspace theme and made the search field non-focusable when collapsed
(cherry picked from commit 58d31dd73f)
2023-10-23 17:50:43 +00:00
Alexandre Vryghem
d7f1d37e41 Themed LangSwitchComponent
(cherry picked from commit f9b4460e70)
2023-10-23 17:50:43 +00:00
Alexandre Vryghem
d6de6fee6c Use gap instead of individual paddings for header icons
(cherry picked from commit 9f2a1d048b)
2023-10-23 17:50:43 +00:00
Tim Donohue
7dd9156375 Merge pull request #2564 from DSpace/backport-2561-to-dspace-7_x
[Port dspace-7_x] Fix RequestService test sometimes failing in CICD
2023-10-23 10:00:35 -05:00
Alexandre Vryghem
8428b0549b Fix RequestService test failing because of different lastUpdated time
(cherry picked from commit fb315335c9)
2023-10-23 13:56:07 +00:00
Tim Donohue
33c2c98757 Merge pull request #2560 from DSpace/backport-2439-to-dspace-7_x
[Port dspace-7_x] Fix Request-a-Copy grant form optional message not optional in form validation
2023-10-20 15:14:08 -05:00
Agustina Martinez
e9b70e34d5 Update email-request-copy.component.html
Message is optional: remove req in [disabled]

(cherry picked from commit 94c756d52d)
2023-10-20 20:13:00 +00:00
Tim Donohue
c3ee2ca6c1 Merge pull request #2559 from DSpace/backport-2558-to-dspace-7_x
[Port dspace-7_x] Revert 2454 "Check cssRules before css variables are read from stylesheet"
2023-10-20 12:07:43 -05:00
Tim Donohue
2834ac33a4 Revert "Check cssRules before css variables are read from stylesheet (#2454)"
This reverts commit fa79c358c0.

(cherry picked from commit 6f73b65d53)
2023-10-20 17:07:13 +00:00
Tim Donohue
1eeed36036 Merge pull request #2552 from DSpace/backport-2549-to-dspace-7_x
[Port dspace-7_x] Bump @babel/traverse from 7.21.4 to 7.23.2
2023-10-20 09:57:08 -05:00
dependabot[bot]
bc0629e004 Bump @babel/traverse from 7.21.4 to 7.23.2
Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.21.4 to 7.23.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse)

---
updated-dependencies:
- dependency-name: "@babel/traverse"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit 97f7a5e82a)
2023-10-19 21:45:57 +00:00
Alexandre Vryghem
d473fcdf16 Merge branch 'split-eperson-administration-page_contribute-7.6' into split-eperson-administration-page_contribute-maintenance-7.6 2023-10-19 23:01:48 +02:00
Alexandre Vryghem
2e571767ea 107664: Normalized ePerson & group edit url and moved error message to translation file 2023-10-19 23:01:24 +02:00
Tim Donohue
c25b80abdd Merge pull request #2504 from atmire/Angular-SRR-menu-issues
Fix Angular SSR menu issues
2023-10-19 10:19:27 -05:00
Alan Orth
b5f942b71d Merge pull request #2547 from DSpace/backport-2454-to-dspace-7_x
[Port dspace-7_x] Check cssRules before css variables are read from stylesheet
2023-10-17 22:50:14 +03:00
Gantner, Florian Klaus
21dcef0a42 checkstyle remove unused extra lines
(cherry picked from commit 5f8a9dea34)
2023-10-17 19:17:51 +00:00
Gantner, Florian Klaus
c4a60abd65 check cssRules existence before css variables are get from stylesheet
(cherry picked from commit 367cda2de0)
2023-10-17 19:17:51 +00:00
Alan Orth
fd850164f5 Merge pull request #2546 from DSpace/backport-2534-to-dspace-7_x
[Port dspace-7_x] Bump postcss from 8.4.23 to 8.4.31
2023-10-16 14:20:07 +03:00
dependabot[bot]
8f881dbb52 Bump postcss from 8.4.23 to 8.4.31
Bumps [postcss](https://github.com/postcss/postcss) from 8.4.23 to 8.4.31.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.4.23...8.4.31)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit 3c5079e9ce)
2023-10-16 07:36:28 +00:00
Alexandre Vryghem
a419956e2a Merge remote-tracking branch 'upstream/dspace-7_x' into split-eperson-administration-page_contribute-maintenance-7.6
# Conflicts:
#	src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html
2023-10-14 17:38:26 +02:00
Alan Orth
3cb23c18e7 Merge pull request #2536 from atmire/issue-2535_hide-add-more-button-submission-if-no-disabled-sections-7.x
Issue 2535 hide add more button submission if no disabled sections 7.x
2023-10-12 09:46:14 +03:00
Alan Orth
59be2ae907 Merge pull request #2543 from DSpace/backport-2531-to-dspace-7_x
[Port dspace-7_x] Fix browse by visual bug
2023-10-12 09:17:48 +03:00
Jens Vannerum
15d2880ca4 Fix browse by visual bug
(cherry picked from commit d0b4e15db4)
2023-10-11 19:04:20 +00:00
Pascal-Nicolas Becker
c03cd03274 Merge pull request #2541 from DSpace/backport-2537-to-dspace-7_x
[Port dspace-7_x] Translate community as 'Bereich' in de.json5
2023-10-11 05:33:28 +02:00
Janne Jensen
ec86bc12bd translate community as 'Bereich' in de.json5
(cherry picked from commit 0139670371)
2023-10-10 20:40:03 +00:00
Marie Verdonck
77dd72b6ef Merge branch 'issue-2535_hide-add-more-button-submission-if-no-disabled-sections-7.4' into issue-2535_hide-add-more-button-submission-if-no-disabled-sections-7.x 2023-10-04 17:30:45 +02:00
Marie Verdonck
709848ee25 Issue#2535: Hide add more button in submission if no disabled sections 2023-10-04 17:27:04 +02:00
Alan Orth
980e254d9a Merge pull request #2528 from DSpace/backport-2385-to-dspace-7_x
[Port dspace-7_x] Move subscription button to DSO edit menu
2023-09-27 10:56:27 +03:00
Yury Bondarenko
6d195f5ffa Update DSO edit menu resolver tests
- Abstract away the different "subsections" ~ DSO type (the tests should not care about this)
  Instead, retrieve sections of interest by ID & assert whether they're there & how they should look
- Test separately for Communities, Collections & Items
- Test newly added menu section

(cherry picked from commit 18b7a9c7de)
2023-09-27 07:02:24 +00:00
Yury Bondarenko
578a427f46 Move subscription button to DSO edit menu
(cherry picked from commit c9558167b2)
2023-09-27 07:02:24 +00:00
Alan Orth
506579cd23 Merge pull request #2510 from atmire/fix-mutliple-api-calls-on-route-change
Fix multiple api calls on route change
2023-09-27 08:12:47 +03:00
Alan Orth
19eec6ac31 Merge pull request #2526 from DSpace/backport-2525-to-dspace-7_x
[Port dspace-7_x] Fix mouse cursor on language dropdown menu
2023-09-26 22:09:17 +03:00
Davide Negretti
2aab4265a5 [DURACOM-185] Fix pointer on language dropdown menu
(cherry picked from commit 6b5708cffd)
2023-09-26 18:40:11 +00:00
Art Lowel
67a6f58865 Merge branch 'fix-mutliple-api-calls-on-route-change-7.6' into fix-mutliple-api-calls-on-route-change 2023-09-26 16:56:17 +02:00
Art Lowel
6a99185214 roll back unintended change to the responseMsToLive for RootDataservice 2023-09-26 16:56:07 +02:00
Art Lowel
d02c5397f8 Merge branch 'fix-mutliple-api-calls-on-route-change-7.6' into fix-mutliple-api-calls-on-route-change 2023-09-26 14:44:39 +02:00
Art Lowel
32fc28ec54 fix dev mode issue where retrieving the login options fails 2023-09-26 14:44:13 +02:00
DSpace Bot
77efe52f4a [Port dspace-7_x] Fix missing or wrong Italian translations (#2522)
[DURACOM-184] fix missing or wrong Italian translations

---------

Co-authored-by: Andrea Barbasso <´andrea.barbasso@4science.com´>
2023-09-26 11:04:49 +03:00
Alan Orth
83beb5474e Merge pull request #2521 from DSpace/backport-2473-to-dspace-7_x
[Port dspace-7_x] Fix some routes not using the correct baseHref
2023-09-26 10:51:51 +03:00
DSpace Bot
1c38d9259a [Port dspace-7_x] Serbian (Latin) translation (#2520)
* Serbian (latin) translation added.

---------

Co-authored-by: imilos <imilos@gmail.com>
2023-09-26 10:08:07 +03:00
Alexandre Vryghem
d6d5a2891c Fix routes not working with baseHref
(cherry picked from commit 18febff7a6)
2023-09-26 07:07:20 +00:00
Hrafn Malmquist
abd6c01a98 Merge pull request #2502 from alanorth/undo-text-capitalize
Don't capitalize metadata values in search
2023-09-26 00:19:07 +01:00
DSpace Bot
f77d01c01f [Port dspace-7_x] Update fi.json5 (#2516)
* Update fi.json5

Two last translations to the Finnish file.

(cherry picked from commit c3a908bccb)
2023-09-25 12:53:45 +03:00
Tim Donohue
fd3f1628ee Merge pull request #2514 from DSpace/backport-2505-to-dspace-7_x
[Port dspace-7_x] remove obsolete label element in metadata-schema.component.html
2023-09-22 14:53:04 -05:00
Sascha Szott
c7fe310d81 removed trailing whitespaces as suggested by reviewer
(cherry picked from commit 43f19e7d91)
2023-09-22 17:57:54 +00:00
Sascha Szott
742b2d920a remove obsolete label element in metadata-schema.component.html
(cherry picked from commit 6847c30e58)
2023-09-22 17:57:54 +00:00
Art Lowel
7a8e2206ae Merge branch 'fix-mutliple-api-calls-on-route-change-7.6' into fix-mutliple-api-calls-on-route-change 2023-09-22 12:01:24 +02:00
Art Lowel
8fbe8c16dc fix issue where invalidateRootCache didn't happen when the page first loaded 2023-09-22 12:00:59 +02:00
Art Lowel
0104f81d54 Merge branch 'fix-mutliple-api-calls-on-route-change-7.6' into fix-mutliple-api-calls-on-route-change 2023-09-22 10:48:46 +02:00
Art Lowel
5ad621b27e fix issue where more than one api call was made on every route change 2023-09-22 10:23:07 +02:00
Alan Orth
47029c0a78 src/app/shared/search: don't capitalize metadata values
Don't capitalize metadata values for display purposes.
2023-09-19 07:42:23 +03:00
Yana De Pauw
5a5f71a3d9 Merge remote-tracking branch 'upstream/dspace-7_x' into Angular-SRR-menu-issues 2023-09-18 16:49:36 +02:00
Yana De Pauw
3e8d180f1b 106974: Angular SSR menu issues 2023-09-18 16:43:32 +02:00
Tim Donohue
2d733732f6 Merge pull request #2498 from DSpace/backport-2451-to-dspace-7_x
[Port dspace-7_x] Graceful shutdown on SIGINT (e.g. from 'pm2 stop').
2023-09-14 12:29:23 -05:00
Mark H. Wood
d6cabd1d01 Document a modified method as required by PR guidelines.
(cherry picked from commit bf9b2b82e1)
2023-09-14 16:07:36 +00:00
Mark H. Wood
46e2f4e22c Properly await termination.
(cherry picked from commit 4449737aed)
2023-09-14 16:07:36 +00:00
Mark H. Wood
15c2af5fbf Graceful shutdown on SIGINT (e.g. from 'pm2 stop').
(cherry picked from commit 6709c3bb5f)
2023-09-14 16:07:36 +00:00
Tim Donohue
a37e0f29b7 Merge pull request #2497 from DSpace/backport-2493-to-dspace-7_x
[Port dspace-7_x] Correct text of help info on edit group page
2023-09-14 11:01:38 -05:00
Tim Donohue
b423b49cac Correct text of help info on edit group page
(cherry picked from commit 49247430e5)
2023-09-14 15:07:21 +00:00
Tim Donohue
bdf7414392 Merge pull request #2488 from alexandrevryghem/fix-display-order-authentication-methods_contribute-7.6
[Port dspace-7_x] Made it possible to reorder the login methods
2023-09-11 16:40:43 -05:00
Tim Donohue
459a43184a Merge pull request #2486 from DSpace/backport-2421-to-dspace-7_x
[Port dspace-7_x] 🚸remove thumbnail from file-upload section and show bitstream format …
2023-09-08 16:13:14 -05:00
Alexandre Vryghem
0905a53db5 Fix innerText still being undefined in ssr mode 2023-09-08 22:35:27 +02:00
Alan Orth
cd93c6eecd Merge pull request #2487 from DSpace/backport-2445-to-dspace-7_x
[Port dspace-7_x] Fix to Metadata Registry create new metadata schema doesn't appear without reload #1081
2023-09-08 23:29:50 +03:00
Hugo Dominguez
161d7e069b 🎨 revert format
(cherry picked from commit 3e5524de69)
2023-09-08 19:50:25 +00:00
Hugo Dominguez
e3ea2cb2b0 🐛 fix bug of caching when add new schema
(cherry picked from commit 9fb9e5848c)
2023-09-08 19:50:25 +00:00
Hugo Dominguez
8d295419c7 ♻️ refactor chain of observables to avoid async issues
(cherry picked from commit 2dc9fd44d7)
2023-09-08 19:50:25 +00:00
Tim Donohue
22538f30dc Update workspaceitem-section-upload-file.model.ts
Fix code comment

(cherry picked from commit 01c8a4d9c3)
2023-09-08 19:33:55 +00:00
Hugo Dominguez
5daf993451 🎨revert unnecessary format
(cherry picked from commit 13e4052c4d)
2023-09-08 19:33:55 +00:00
Hugo Dominguez
b7b3db5ba8 🚸remove thumbnail from file-upload section and show bitstream format and checksum
(cherry picked from commit 4c8ec8a4f2)
2023-09-08 19:33:55 +00:00
Tim Donohue
a0a8607628 Merge pull request #2484 from DSpace/backport-2412-to-dspace-7_x
[Port dspace-7_x] remove redundant cache default values from server.ts
2023-09-08 11:40:43 -05:00
Sascha Szott
3a465ac452 remove redundant cache default values from server.ts
(cherry picked from commit e53abcb69e)
2023-09-08 15:44:21 +00:00
Tim Donohue
97b2eb7a7c Merge pull request #2404 from alexandrevryghem/fix-setStaleByHrefSubtring-not-emitting-after-all-requests-were-stale_contribute-maintenance-7.6
[Port dspace-7_x] Fix `setStaleByHrefSubstring` not emitting true when all requests are stale
2023-09-07 14:39:33 -05:00
Tim Donohue
b46390c315 Merge pull request #2396 from alexandrevryghem/w2p-104312_pass-query-to-external-search-tabs_contribute-maintenance-7.6
[Port dspace-7_x] Search query is not set by default when opening an external sources tab
2023-09-07 12:49:47 -05:00
Tim Donohue
d14e258b5b Merge pull request #2483 from DSpace/backport-2470-to-dspace-7_x
[Port dspace-7_x] Minor pt-PT translation fixes
2023-09-07 11:15:21 -05:00
José Carvalho
1622b25aac Minor pt-PT translation fixes
(cherry picked from commit a6c1120700)
2023-09-07 15:35:02 +00:00
Tim Donohue
d95fa43c6b Merge pull request #2479 from DSpace/backport-2366-to-dspace-7_x
[Port dspace-7_x] CSV export fixes
2023-09-06 16:08:21 -05:00
Kristof De Langhe
4918ff212c 104189: CSV export add fixedFilter
(cherry picked from commit 45ad5f7316)
2023-09-06 19:53:01 +00:00
Kristof De Langhe
c2790584bd 104189: Allow CSV export on related entity search
(cherry picked from commit cac1407f08)
2023-09-06 19:53:01 +00:00
Tim Donohue
162cf94772 Merge pull request #2478 from DSpace/backport-2361-to-dspace-7_x
[Port dspace-7_x] Fix tree not updating when switching between "Browse by Vocabulary" pages
2023-09-06 09:22:00 -05:00
Nona Luypaert
92e0b6dddf Fix VocabularyTreeview not updating + i18n for nsi
(cherry picked from commit b5a70e8f95)
2023-09-05 22:14:44 +00:00
Tim Donohue
5b646af818 Merge pull request #2477 from DSpace/backport-2457-to-dspace-7_x
[Port dspace-7_x] config/config.example.yml: fix example syntax
2023-09-05 16:25:23 -05:00
Alan Orth
8363273f58 config/config.example.yml: fix example syntax
As of DSpace Angular 7.2 the syntax has changed from TypeScript to
YAML.

(cherry picked from commit 9e46b5310b)
2023-09-05 21:24:21 +00:00
Alan Orth
5f5d11cc0b Merge pull request #2476 from DSpace/backport-2432-to-dspace-7_x
[Port dspace-7_x] Fix to Value of dropdown changes automatically on item submission page
2023-09-05 20:16:37 +03:00
Hugo Dominguez
eb38b5877e change test event, click by mousedown on dynamic-scrollable-dropdown.component.spec.ts
(cherry picked from commit 25479e1794)
2023-09-05 17:15:51 +00:00
Hugo Dominguez
f88638e9fe 🐛 Fix Value of dropdown changes automatically on item submission page
(cherry picked from commit 651305952d)
2023-09-05 17:15:51 +00:00
Tim Donohue
cd350ddf5f Merge pull request #2472 from DSpace/backport-2448-to-dspace-7_x
[Port dspace-7_x] Spanish translation updated to 7.6
2023-09-05 09:48:32 -05:00
Alan Orth
2987ad05be Merge pull request #2474 from DSpace/backport-2444-to-dspace-7_x
[Port dspace-7_x] Fix to Mobile navbar hamburger menu doesn't work in Firefox/Safari #2372
2023-09-05 12:01:31 +03:00
Hugo Dominguez
9afbd8d746 🐛 fix when navbar expands on firefox
(cherry picked from commit 60706720e4)
2023-09-05 09:00:34 +00:00
Sergio Fernández Celorio
a4eaf02a47 Some lint errors fixed
(cherry picked from commit 1885638ba6)
2023-09-01 19:05:02 +00:00
Sergio Fernández Celorio
d1ebf07456 Spanish translation updated to 7.6
(cherry picked from commit 4cc4192e93)
2023-09-01 19:05:02 +00:00
Tim Donohue
02c47c3234 Merge pull request #2469 from DSpace/backport-2468-to-dspace-7_x
[Port dspace-7_x] Minor Accessibility Fixes & Enable accessibility scan on more pages
2023-08-30 10:31:36 -05:00
Tim Donohue
63c752b3f4 Fix heading order accessibility issue in search filters/facets
(cherry picked from commit 276d80895e)
2023-08-30 14:40:51 +00:00
Tim Donohue
6df76515ba Minor fixes to cypress tests
(cherry picked from commit 70a7bbe3cb)
2023-08-30 14:40:51 +00:00
Tim Donohue
3cdcdaf475 Fix accessibility of date sliders by adding aria-labels
(cherry picked from commit 2a881791ba)
2023-08-30 14:40:51 +00:00
Tim Donohue
b90d102e5e Update ng2-nouislider and nouislider to latest versions
(cherry picked from commit 91d8b7e4f7)
2023-08-30 14:40:51 +00:00
Tim Donohue
13ead8174a Fix heading order issue with item page & update accessibility tests to prove it now passes
(cherry picked from commit ba244bf6b1)
2023-08-30 14:40:51 +00:00
Tim Donohue
a7a807c0bb Enable excessibility checking of login menu, and remove unnecessary exclusion from header
(cherry picked from commit 339ed63734)
2023-08-30 14:40:51 +00:00
Tim Donohue
baecf2ac11 Reenable accessibility check fixed in #2251
(cherry picked from commit 158ebb0e32)
2023-08-30 14:40:51 +00:00
Tim Donohue
7ebdc43ca2 Update to latest axe-core
(cherry picked from commit 50899f1d1b)
2023-08-30 14:40:51 +00:00
Tim Donohue
13c0cb48ed Update to latest cypress
(cherry picked from commit 68a3323fca)
2023-08-30 14:40:51 +00:00
Alan Orth
6639594f7e Merge pull request #2465 from DSpace/backport-2463-to-dspace-7_x
[Port dspace-7_x] Fix to Pagination position is retained between searches #2159
2023-08-29 11:27:09 +03:00
Alexandre Vryghem
07a2e333ca Implemented i18n cache busting 2023-08-28 21:24:03 +02:00
Tim Donohue
af8c599497 Merge pull request #2466 from DSpace/backport-2447-to-dspace-7_x
[Port dspace-7_x] 2251 accessibility issues on the community list page
2023-08-28 14:13:02 -05:00
Alan Orth
0542e9b2fd Merge pull request #2467 from DSpace/backport-2399-to-dspace-7_x
[Port dspace-7_x] fix(i18n): curation-task.task.registerdoi.label
2023-08-28 21:07:04 +03:00
Mirko Scherf
2a55e36082 fix(i18m): curation-task.task.registerdoi.label
changed curation-task.task.register-doi.label back to
curation-task.task.registerdoi.label and added German translation

(cherry picked from commit 0ec72f679b)
2023-08-28 18:02:28 +00:00
Hrafn Malmquist
8a5d6897c4 Reorder instance method to come after member declaration
(cherry picked from commit e59913acab)
2023-08-28 14:44:18 +00:00
Hrafn Malmquist
e89a277702 Improve documentation
(cherry picked from commit d9b6e9d81f)
2023-08-28 14:44:18 +00:00
Hrafn Malmquist
9fc4e213df Add trackby function so cdktree can differentiate between new and old nodes
(cherry picked from commit 5f71de885b)
2023-08-28 14:44:18 +00:00
Hrafn Malmquist
46ac61dcac Replace h2 with a h1
(cherry picked from commit 05c53ad1d4)
2023-08-28 14:44:18 +00:00
Hrafn Malmquist
eef98d70c3 Replace h5 with a span
(cherry picked from commit 5ef4a827f5)
2023-08-28 14:44:18 +00:00
Hugo Dominguez
5c669fb1b7 add first page condition when search submit
(cherry picked from commit 044230209c)
2023-08-28 14:33:34 +00:00
Hugo Dominguez
a343991e74 🐛 go to first page after submit search
(cherry picked from commit 88a7088b47)
2023-08-28 14:33:34 +00:00
Tim Donohue
83de2c5769 Merge pull request #2462 from tdonohue/port_2395
[Port dspace-7_x] Fix themed components duplicating themself when switching themes
2023-08-25 13:28:03 -05:00
Alexandre Vryghem
8b57a2f6af Merge branch 'fix-ngonchanges-not-working-for-themed-components_contribute-7.2' into fix-ngonchanges-not-working-for-themed-components_contribute-7.4
# Conflicts:
#	src/app/app.component.ts
2023-08-25 12:34:10 -05:00
Alexandre Vryghem
7352d9e273 Reset to base theme when no default theme is set and leaving UUID/handle theme 2023-08-25 12:22:51 -05:00
Alexandre Vryghem
4e14bc0b78 101577: Ensure the component is always destroyed before rendering the new component 2023-08-25 12:22:32 -05:00
Alexandre Vryghem
0e289b3f39 103176: Fix vcr not being defined yet in OnInit hook 2023-08-25 12:19:30 -05:00
Koen Pauwels
815425c101 Fix lint issue. 2023-08-25 10:18:09 +02:00
Alan Orth
6ad641f4e2 Merge pull request #2460 from DSpace/backport-2434-to-dspace-7_x
[Port dspace-7_x] Input type list doesn't work correctly if multiple value-pairs have the same pair value
2023-08-25 10:37:33 +03:00
Alexandre Vryghem
7f00253d3d 105265: Made the DsDynamicListComponent's checkbox & radio buttons ids unique for each metadata field to prevent other value-pairs having the same id
(cherry picked from commit 4c419e1eee)
2023-08-25 06:17:16 +00:00
Tim Donohue
03d17678e2 Merge pull request #2459 from DSpace/backport-2449-to-dspace-7_x
[Port dspace-7_x] Update pl.json5
2023-08-24 16:03:53 -05:00
Michał Dykas
0efb95825d Update pl.json5 fix test 2 spaces instead of 1
(cherry picked from commit f58a7a2e9b)
2023-08-24 19:58:39 +00:00
Michał Dykas
95cde220e6 Update pl.json5 fix issues from tests
(cherry picked from commit 93299ec83d)
2023-08-24 19:58:39 +00:00
Michał Dykas
964066056c Update pl.json5
Translation update of 2 spaces instead of 3

(cherry picked from commit cfd753f928)
2023-08-24 19:58:39 +00:00
Michał Dykas
22db36f938 Update pl.json5
Update from 7.4 to 7.6 version

(cherry picked from commit b439ab4484)
2023-08-24 19:58:39 +00:00
Tim Donohue
9df4d660e7 Merge pull request #2453 from tdonohue/fix_demo_urls_7_x
[Port dspace-7_x] Replace mentions of demo7.dspace.org and api7.dspace.org with new demo URLs
2023-08-24 12:41:02 -05:00
Koen Pauwels
a5b30ea3c2 103818 Adjusted "Inherit policies" tooltip 2023-08-24 15:27:52 +02:00
Koen Pauwels
2078b7593a 103818 Add warning tooltip to "Inherit policies" checkbox on item move page 2023-08-24 15:27:52 +02:00
Tim Donohue
fe8429ebbe Enable new skip merge commit feature 2023-08-23 17:08:44 -05:00
Tim Donohue
8feeedfc3a Merge pull request #2455 from DSpace/backport-2438-to-dspace-7_x
[Port dspace-7_x] 2437 Correct and clarify commented-out code in several custom components
2023-08-23 16:07:17 -05:00
Hardy Pottinger
3292222e47 fix lint error in workflow-item-send-back.component.ts
(cherry picked from commit 518cc714f2)
2023-08-23 19:50:22 +00:00
Hardy Pottinger
36868c06f0 2437 Correct and clarify commented-out code in several custom components
- Correct the path in commented-out code in the custom theme's
  components
- Clarify that the workflow-item-sen-back.component.scss file is a stub
- It has no corresponding SCSS file in the base theme

(cherry picked from commit 0906234a29)
2023-08-23 19:50:22 +00:00
Tim Donohue
5853e49bd0 Update default configs to use https://demo.dspace.org/server/ 2023-08-22 16:44:10 -05:00
Tim Donohue
2fd53c7ad2 Replace mentions of demo7.dspace.org and api7.dspace.org with demo or sandbox 2023-08-22 16:38:00 -05:00
Tim Donohue
63345a335a Merge pull request #2428 from DSpace/backport-2409-to-dspace-7_x
[Port dspace-7_x] Bump word-wrap from 1.2.3 to 1.2.5
2023-08-09 10:07:14 -05:00
dependabot[bot]
bbb50f2858 Bump word-wrap from 1.2.3 to 1.2.5
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.5.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.5)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit 2fec33e70a)
2023-08-08 21:42:41 +00:00
Tim Donohue
3e31c1eee3 Merge pull request #2427 from tdonohue/port_2048
[Port dspace-7_x] ProcessDetailComponent test improvement
2023-08-08 16:25:21 -05:00
Kristof De Langhe
cfcf93ecf8 104126: ProcessDetailComponent test improvement 2023-08-08 15:08:49 -05:00
Tim Donohue
74c2f3d9bb Merge pull request #2405 from alexandrevryghem/fix-collection-form-bugs_contribute-maintenance-7.6
[Port dspace-7_x] Fix minor collection form bugs
2023-08-04 12:48:34 -05:00
Tim Donohue
f22fcc7b3c Merge pull request #2420 from tdonohue/port_2388
[Port dspace-7_x] fix(i18n): add and update missing status strings
2023-08-04 12:25:44 -05:00
Mirko Scherf
c3b9a1d5c6 fix(i18n): add and update missing status strings
New strings for status filter entries:
search.filters.namedresourcetype.*
Refactored strings introduced with #2068 (refactor badged),
e.g. mydspace.status.archived -> mydspace.status.mydspaceArchived
2023-08-04 11:19:55 -05:00
Alan Orth
d072ae7027 Merge pull request #2419 from DSpace/backport-2378-to-dspace-7_x
[Port dspace-7_x] Show error message from the password validation response
2023-08-04 16:04:15 +03:00
milanmajchrak
f746d45ac1 Show error message from the error response
(cherry picked from commit e6546b4499)
2023-08-04 12:21:30 +00:00
Tim Donohue
1fd917dd4a Merge pull request #2418 from DSpace/backport-2344-to-dspace-7_x
[Port dspace-7_x] Catch and handle unsuccessful "convert rels to items" responses
2023-08-03 16:38:44 -05:00
Tim Donohue
99e349b91f Merge pull request #2392 from alexandrevryghem/fix-mathjax-displaying-twiced-in-ui_contribute-maintenance-7.6
[Port dspace-7_x] Fixed MathJax code being displayed twice by `dsMarkdown` pipe
2023-08-03 16:09:56 -05:00
Kim Shepherd
a7ed053d15 catch and handle unsuccessful "convert rels to items" responses
(cherry picked from commit a35b7d8356)
2023-08-03 20:03:27 +00:00
Tim Donohue
99c6dd1829 Merge pull request #2347 from alanorth/finnish-language-strings
src/assets/i18n: update Finnish language strings
2023-08-03 12:56:22 -05:00
Tim Donohue
0a48b09bd7 Merge pull request #2416 from tdonohue/port_of_2381
[Port dspace-7_x] refactor: rename aletr-type.ts to alert-type.ts
2023-08-03 12:37:18 -05:00
Mirko Scherf
0dc74165dc refactor: rename aletr-type.ts to alert-type.ts 2023-08-03 11:51:48 -05:00
Tim Donohue
9cbb634245 Merge pull request #2415 from DSpace/backport-2363-to-dspace-7_x
[Port dspace-7_x] Bump semver from 5.7.1 to 5.7.2
2023-08-02 15:55:32 -05:00
dependabot[bot]
7c379db7ee Bump semver from 5.7.1 to 5.7.2
Bumps [semver](https://github.com/npm/node-semver) from 5.7.1 to 5.7.2.
- [Release notes](https://github.com/npm/node-semver/releases)
- [Changelog](https://github.com/npm/node-semver/blob/v5.7.2/CHANGELOG.md)
- [Commits](https://github.com/npm/node-semver/compare/v5.7.1...v5.7.2)

---
updated-dependencies:
- dependency-name: semver
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit 0b0c60e38c)
2023-08-02 20:06:40 +00:00
Alexandre Vryghem
3dc73f9021 Properly handle AuthMethod subscription in LogInComponent 2023-08-02 21:25:58 +02:00
Alexandre Vryghem
94ceee9080 Merge remote-tracking branch 'templates/dspace-7.6' into fix-display-order-authentication-methods_contribute-7.6
# Conflicts:
#	src/app/shared/log-in/log-in.component.html
#	src/app/shared/log-in/methods/log-in-external-provider/log-in-external-provider.component.spec.ts
#	src/app/shared/log-in/methods/oidc/log-in-oidc.component.html
#	src/app/shared/log-in/methods/oidc/log-in-oidc.component.spec.ts
#	src/app/shared/log-in/methods/orcid/log-in-orcid.component.html
#	src/app/shared/log-in/methods/password/log-in-password.component.ts
#	src/app/shared/log-in/methods/shibboleth/log-in-shibboleth.component.html
#	src/app/shared/log-in/methods/shibboleth/log-in-shibboleth.component.spec.ts
2023-08-02 21:01:36 +02:00
Alexandre Vryghem
71cf66ecf4 Fix display order of authentication methods 2023-08-02 10:00:43 +02:00
Alan Orth
1b9656b135 src/assets/i18n: update Finnish language strings
Contributed by Reeta Kuukoski from the National Library of Finland.
2023-07-31 12:32:14 +03:00
Tim Donohue
85acdcb9c5 Merge pull request #2407 from DSpace/backport-2406-to-dspace-7_x
[Port dspace-7_x] Add GitHub action to automatically create a port PR (based on label) & minor bug fixes
2023-07-28 15:25:02 -05:00
Tim Donohue
867ae9c341 Minor update to label_merge_conflicts to ignore any errors (seem random at this time)
(cherry picked from commit d75d12b423)
2023-07-28 20:11:29 +00:00
Tim Donohue
4965bdee5f Add action to automatically create a port PR when specified
(cherry picked from commit 338b63ebb8)
2023-07-28 20:11:29 +00:00
Alexandre Vryghem
ebaccc055e Merge branch 'fix-collection-form-bugs_contribute-7.4' into fix-collection-form-bugs_contribute-7.6
# Conflicts:
#	src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html
2023-07-28 00:14:58 +02:00
Alexandre Vryghem
273be5bd81 Merge remote-tracking branch 'contributions/fix-setStaleByHrefSubtring-not-emitting-after-all-requests-were-stale_contribute-7.4' into fix-setStaleByHrefSubtring-not-emitting-after-all-requests-were-stale_contribute-7.6
# Conflicts:
#	src/app/core/data/request.service.ts
2023-07-27 23:57:18 +02:00
Alexandre Vryghem
5062e46433 104312: Add missing query @Input() to ThemedDynamicLookupRelationExternalSourceTabComponent 2023-07-25 18:26:47 +02:00
Alexandre Vryghem
9b1d18bd32 Merge tag 'dspace-7.6' into w2p-104312_pass-query-to-external-search-tabs_contribute-7.6 2023-07-25 18:26:18 +02:00
Alexandre Vryghem
15656b03ce Fix mathjax code being displayed twice
This was due to sanitizeHtml rendering the mjx-assistive-mml tag as text. This tag is used by screen readers and therefor we should allow it to be rendered
2023-07-21 23:18:40 +02:00
Alexandre Vryghem
75ec046bba Hide the delete EPerson/Group buttons when the user can't delete the EPerson/Group 2023-07-21 18:34:42 +02:00
Alexandre Vryghem
998e1fac8d Fix spacing issues for EPerson form buttons 2023-07-21 18:34:42 +02:00
Alexandre Vryghem
9ac19d40fc Cleanup access-control components
- Use the same methods to retrieve the access-control urls
- Fix EPersonDataService.startEditingNewEPerson returning the incorrect link
2023-07-21 18:34:41 +02:00
Alexandre Vryghem
2a35180a1b Created separate pages for edit & create EPersons 2023-07-21 17:15:10 +02:00
Alexandre Vryghem
648925f3e1 104312: DsDynamicLookupRelationExternalSourceTabComponent should have the form value already filled in the search input 2023-07-19 14:04:34 +02:00
Tim Donohue
4f0e1d6de1 Merge pull request #2369 from tdonohue/port_2358_2359
Port recent GitHub Actions changes to dspace-7_x branch
2023-07-14 16:56:32 -05:00
Tim Donohue
1809f0585c Split docker images into separate jobs to run in parallel. Ensure 'main' codebase is tagged as 'latest' 2023-07-14 15:41:57 -05:00
Tim Donohue
a484379f69 Ensure codescan and label_merge_conflicts run on maintenance branches 2023-07-14 15:41:41 -05:00
Tim Donohue
7bf4da55cf Enable Pull Request Opened action to assign PRs to their creator 2023-07-14 15:41:26 -05:00
Alan Orth
a079ed729c Merge pull request #2354 from alanorth/request-copy-component-path
src/app: fix path to deny-request-copy component
2023-07-06 20:45:56 +03:00
Alan Orth
3a48ed390b src/app: fix path to deny-request-copy component
The themed-deny-request-copy.component erroneously includes the cus-
tom theme's deny-request-copy component instead of its own.

Closes: https://github.com/DSpace/dspace-angular/issues/2351
2023-07-06 20:41:52 +03:00
Alexandre Vryghem
cf77726866 Fix enter not submitting collection form correctly
Fixed it for communities, collections, ePersons & groups
2023-07-01 01:01:57 +02:00
Alexandre Vryghem
b2b1782cd8 Hide entity field in collection form when entities aren't initialized 2023-06-30 22:43:46 +02:00
Alexandre Vryghem
02a20c8862 103236: Added tests for setStaleByHrefSubstring 2023-06-30 17:01:25 +02:00
Art Lowel
ae6b183fae 103236: fix issue where setStaleByHrefSubtring wouldn't emit after all requests were stale 2023-06-30 16:56:15 +02:00
Tim Donohue
884aa07430 Update version tag for development of next release 2023-06-23 13:04:19 -05:00
Tim Donohue
404ccd9b0e Update version tag for release 2023-06-23 12:54:41 -05:00
Tim Donohue
990bde43ab Merge pull request #2336 from atmire/w2p-103005_variable-overwrite-fix_contribution
Fix background-color overwrite issue
2023-06-23 10:01:53 -05:00
Tim Donohue
db526a0c25 Merge pull request #2331 from tdonohue/ssr_redirect_301
Implement basic 301 Redirect for DSpace 6.x URLs when SSR is used.
2023-06-23 08:59:30 -05:00
Tim Donohue
9a5e26f640 Merge pull request #2334 from 4Science/fix-bistream-download-cache
fix for bitstreams are not visible to crawlers when caching is enabled
2023-06-23 08:56:02 -05:00
lotte
d4a59dd51c Merge branch 'w2p-103005_variable-overwrite-fix' 2023-06-23 12:07:22 +02:00
lotte
3d133f6166 103005: Fixed issue where bg colours couldn't be overwritten in themes 2023-06-23 11:50:05 +02:00
Giuseppe Digilio
163014306c [DURACOM-172] improve regex 2023-06-23 09:23:28 +02:00
Giuseppe Digilio
d9857a7a9a Merge branch 'main' into fix-bistream-download-cache 2023-06-23 09:16:17 +02:00
Tim Donohue
5331ff68db Merge pull request #2330 from doana/dynamic-scrollable-dropdown-accessibility
Add the ability to expand / collapse via keyboard
2023-06-22 15:23:33 -05:00
Tim Donohue
d4a5308d0c Refactor to use HardRedirectService. Update its redirect method to support optional statusCode 2023-06-22 13:37:14 -05:00
Giuseppe Digilio
6a58e49fb4 [DURACOM-172] add check to save only successful response into the SSR cache 2023-06-22 18:16:53 +02:00
Tim Donohue
661b4aef9d Merge pull request #2332 from 4Science/DURACOM-170
"Add Collection"  form loads
2023-06-22 11:10:39 -05:00
Alisa Ismailati
47e7eb1a4f [DURACOM-170] Fixed "add collection" behavior 2023-06-22 12:14:15 +02:00
Tim Donohue
0fe33eecd1 Implement basic 301 Redirect when SSR is used. 2023-06-21 15:36:59 -05:00
Adam Doan
275b057b40 Add the ability to expand / collapse via keyboard 2023-06-21 17:37:22 +00:00
Art Lowel
499bfe3154 Merge pull request #2277 from paulo-graca/bugfix/addressing-#2276
new project metadata representation component
2023-06-21 09:19:06 +02:00
Tim Donohue
5d39026eb7 Merge pull request #2245 from mwoodiupui/themeable-request-copy
Make some request-copy components themeable.
2023-06-20 16:27:45 -05:00
Tim Donohue
ee3e5ca14c Merge pull request #2316 from alanorth/item-count-style
src/app: adjust item count style
2023-06-20 16:13:26 -05:00
Tim Donohue
834893249c Merge pull request #2326 from 4Science/DURACOM-160
[DURACOM-160] Hide "Send feedback" link when CanSendFeedback is false
2023-06-20 15:50:59 -05:00
Alan Orth
07a8024daa src/app: adjust item count style
Minor adjustment to community and collection item counts. Instead of
using the Bootstrap `lead` class, which reduces weight but increases
size, we should use the same badge / pill style used in other counts
like on on the browse by pages.
2023-06-20 22:33:11 +03:00
Paulo Graça
5c10e473e9 Merge branch 'main' into bugfix/addressing-#2276 2023-06-20 17:07:13 +01:00
Paulo Graça
1919f976f4 adding support for DSONameService 2023-06-20 15:30:56 +01:00
Tim Donohue
2fa8ab5365 Merge pull request #2322 from alanorth/english-strings
src/assets/i18n: update English strings
2023-06-20 09:27:43 -05:00
Tim Donohue
157eedade4 Merge pull request #2288 from atmire/add-referrer-to-pageview-event-7.6.0-next
Add referrer to pageview event
2023-06-20 09:20:42 -05:00
Paulo Graça
f471957c4c adding support for DSONameService 2023-06-20 14:06:48 +01:00
Paulo Graça
72eaf35de1 adding support for DSONameService 2023-06-20 13:35:12 +01:00
Paulo Graça
e6fdc4597a change param name in typescript doc 2023-06-20 10:34:34 +01:00
Paulo Graça
130c3c9496 addressing styling issue 2023-06-20 10:33:03 +01:00
Paulo Graça
82d17d795f add support for dsoNameService 2023-06-20 10:24:53 +01:00
Paulo Graça
52dbb21339 include the project metadata representation component 2023-06-19 15:37:35 +01:00
Davide Negretti
4eb2297910 [DURACOM-160] Hide "Send feedback" link when CanSendFeedback is false 2023-06-19 13:24:10 +02:00
Paulo Graça
1caeecaa50 Merge branch 'main' into bugfix/addressing-#2276 2023-06-19 09:51:46 +01:00
Alan Orth
00aa0271f2 src/assets/i18n: update English strings
Re-word two messages for better English and consistency with other
similar strings.
2023-06-19 09:50:46 +03:00
Tim Donohue
471051dd59 Merge pull request #2319 from misilot/patch-1
Fix typo for the word Series
2023-06-16 16:36:52 -05:00
Tim Donohue
d728cc227d Merge pull request #2292 from rsaraivac/portuguese_pt-PT-message-keys
Portuguese (pt_PT) translation keys update
2023-06-16 16:13:30 -05:00
Tom Misilo
d266367070 Fix typo for the word Series 2023-06-16 15:54:30 -05:00
Mark H. Wood
c63001c205 Fix illogical templateUrl paths. Add missed DenyRequestCopyComponent. 2023-06-16 16:08:18 -04:00
Tim Donohue
d3d33536bf Merge pull request #2308 from 4Science/DURACOM-155
Edit section in sidebar menu: edit page of selected item / collection / community does not refresh
2023-06-16 14:34:27 -05:00
Tim Donohue
c903df80d8 Merge pull request #2297 from 4Science/DURACOM-152
Fixed read-only visibility for submission form fields
2023-06-16 14:08:47 -05:00
Ricardo Saraiva
022c6840f2 Merge branch 'main' into portuguese_pt-PT-message-keys 2023-06-16 17:58:36 +01:00
Ricardo Saraiva
adf8cc7bc5 Update pt-PT.json5
Incorporates some revised translations, adds and updates newly introduced translation keys.
2023-06-16 17:18:34 +01:00
Tim Donohue
5c8828f6b5 Merge pull request #2247 from 4Science/feature/CST-9636
feat: added bulk access control management
2023-06-16 10:48:24 -05:00
Paulo Graça
86b27de6e4 Merge branch 'main' into bugfix/addressing-#2276 2023-06-16 16:06:51 +01:00
Tim Donohue
e9b18d87fe Merge pull request #2311 from 4Science/DURACOM-157
Multiple uploaders in the same page don't work
2023-06-16 10:01:19 -05:00
Tim Donohue
3785729ae5 Merge pull request #2318 from saschaszott/patch-3
resolve German translation inconsistency in scopenote
2023-06-16 09:14:00 -05:00
Alisa Ismailati
42026b36d5 [DURACOM-152] refactored concatenated fields visibility 2023-06-16 15:31:45 +02:00
Sascha Szott
69726f6fa0 resolve German translation differences 2023-06-16 15:00:52 +02:00
Alisa Ismailati
d00ad0cd0e [DURACOM-152] Field visibility 2023-06-16 13:27:51 +02:00
Davide Negretti
4c6cae911b [DURACOM-157] Multiple uploaders in the same page don't work 2023-06-16 10:54:04 +02:00
Tim Donohue
91027094ed Merge pull request #2252 from alexandrevryghem/issue-1671_fix-relationships-not-updating-view-on-submission-form_contribute-main
Adding/removing relationships in the submission form does not update the view automatically
2023-06-15 11:47:04 -05:00
Tim Donohue
12f9023810 Merge pull request #2313 from 4Science/fix-duplicate-headers
[CST-5729] Fix duplicate links for download page
2023-06-15 10:47:39 -05:00
Giuseppe Digilio
47543b4237 [CST-5729] Fix duplicate links for download page 2023-06-15 17:18:00 +02:00
Alisa Ismailati
fda4ef77e4 [DURACOM-152] Section visibility read-only 2023-06-15 12:42:29 +02:00
Tim Donohue
7ebdcd3686 Merge pull request #2304 from 4Science/cache-response-headers
Add possibility to store response's headers into the SSR cache
2023-06-14 15:36:23 -05:00
Tim Donohue
0c9baf22f5 Merge pull request #2250 from damian-joz/1787-coll-comm-item-counts
Displaying item counts at Communities and Collections list view.
2023-06-14 14:08:23 -05:00
Tim Donohue
25ca13735b Merge pull request #2244 from mwoodiupui/reqitem-response
Make request-copy grant message an optional addition; main text is in backend.
2023-06-14 13:18:27 -05:00
Tim Donohue
327031cceb Merge pull request #2213 from atmire/w2p-101289_1578_primaryBitstream-edit-implementation
Primary bitstream toggle implementation
2023-06-14 11:45:17 -05:00
Giuseppe Digilio
2f06a7cb17 [CST-5729] Change in order to save header only if configured and existing 2023-06-14 18:26:55 +02:00
Mark H. Wood
2d716c7630 Remove test which is no longer valid. 2023-06-14 11:32:03 -04:00
Mark H. Wood
004645b5e4 Remove lint. 2023-06-14 11:32:00 -04:00
Mark H. Wood
93fcbe79aa Make grant message an optional addition; main text is in backend. 2023-06-14 11:30:59 -04:00
Giuseppe Digilio
6e6b775c20 Merge remote-tracking branch '4sciencebitbucket/feature/CST-9636' into feature/CST-9636 2023-06-14 15:03:04 +02:00
Enea Jahollari
e720c77388 Merge branch 'main' into feature/CST-9636
# Conflicts:
#	src/assets/i18n/en.json5
2023-06-14 13:55:19 +02:00
Alan Orth
9919abebce Merge pull request #2305 from alanorth/finnish-strings
src/assets: update fi.json5
2023-06-14 14:35:59 +03:00
Alisa Ismailati
ce517adf7d [DURACOM-155] lint fix 2023-06-14 13:18:33 +02:00
Alan Orth
134eac5f39 src/assets: update fi.json5
Add a few Finnish language UI strings.
2023-06-14 13:30:56 +03:00
kshepherd
de65530e72 Merge pull request #2306 from alanorth/lint-en.json5
src/assets/i18n/en.json5: lint
2023-06-14 11:26:11 +02:00
Alan Orth
adebc30d3b src/assets/i18n/en.json5: lint
Normalize whitespace in i18n/en.json5. This file should be clean, as
it is the "upstream" of all other language assets and produces a lot
of whitespace changes every time strings are merged.
2023-06-14 11:24:22 +03:00
Alisa Ismailati
3b93f5bd23 [DURACOM-155] small fix 2023-06-14 09:44:58 +02:00
Tim Donohue
c70e0464ed Merge pull request #2299 from alexandrevryghem/fix-browse-by-proxy-timeout_contribute-main
Fix Proxy Timeouts on browse by pages
2023-06-13 16:41:30 -05:00
damian
8bcceff085 Empty communities and collections items count are now shown. Show communities items count at the home page. 2023-06-13 19:57:30 +02:00
Giuseppe Digilio
ac9be25faf [CST-5729] check if header exists 2023-06-13 19:30:40 +02:00
Giuseppe Digilio
302f5a6076 Merge branch 'main' into cache-response-headers 2023-06-13 19:17:55 +02:00
Giuseppe Digilio
486aefebc7 [CST-5729] Add possibility to store response's headers into the SSR cache 2023-06-13 19:00:33 +02:00
Alisa Ismailati
ec8470de06 [DURACOM-155] 2023-06-13 18:41:11 +02:00
Tim Donohue
187702d52d Merge pull request #2230 from tdonohue/default_privacy
Add default privacy statement & end user agreement
2023-06-13 10:47:04 -05:00
Alisa Ismailati
ff85422bb3 [DURACOM-155] Edit item / collection / community in sidebar menu 2023-06-13 16:46:26 +02:00
Tim Donohue
685fbf630a Address feedback: Make links open in new window/tab. 2023-06-12 17:04:02 -05:00
Tim Donohue
c3854355fd Fix e2e test to check for new title prefix 2023-06-12 16:56:08 -05:00
Tim Donohue
de0d7bf33a Replace lorem ipsum with text donated by DSpaceDirect 2023-06-12 16:56:08 -05:00
Tim Donohue
48ea7df8b2 Merge pull request #2212 from enea4science/CST-7216
Import saf via URL
2023-06-12 13:05:39 -05:00
Tim Donohue
a3779622f0 Merge pull request #2301 from 4Science/signposting-url-fix
[CST-5729] fix issue with signposting endpoint url replace
2023-06-12 09:07:28 -05:00
Giuseppe Digilio
5d6edade22 [CST-5729] turn to use app config baseurl 2023-06-12 15:22:33 +02:00
Giuseppe Digilio
e85f9f2b25 [CST-5729] fix issue with signposting endpoint url replace 2023-06-12 14:40:21 +02:00
Alisa Ismailati
2c7cf18be5 Merge branch 'main' of https://bitbucket.org/4Science/dspace-angular into DURACOM-152 2023-06-12 11:52:10 +02:00
enea4science
58a3ec3972 Update orcid-sync-settings.component.ts 2023-06-12 09:50:26 +02:00
enea4science
9a74190bf4 Merge branch 'main' into feature/CST-9636 2023-06-12 09:47:35 +02:00
enea4science
155f3f9a12 Merge branch 'main' into CST-7216 2023-06-12 09:37:07 +02:00
Alexandre Vryghem
91b635787d Merge remote-tracking branch 'upstream/main' into fix-browse-by-proxy-timeout_contribute-main
# Conflicts:
#	src/app/browse-by/browse-by-guard.spec.ts
#	src/app/browse-by/browse-by-guard.ts
2023-06-11 22:08:18 +02:00
Alexandre Vryghem
b8d282ebe4 Fix proxy timeout error for browse by pages 2023-06-11 22:04:40 +02:00
Paulo Graça
404e2f8e02 Merge branch 'main' into bugfix/addressing-#2276 2023-06-10 00:36:19 +01:00
Tim Donohue
00e0028864 Merge pull request #2248 from 4Science/feature/CST-5729
Implement Signposting on angular side
2023-06-09 16:03:10 -05:00
Giuseppe Digilio
2fc3f2bbc3 Merge branch 'main' into feature/CST-5729 2023-06-09 19:25:07 +02:00
Giuseppe Digilio
96903d89de [CST-5729] fix signposting proxy url 2023-06-09 19:24:16 +02:00
damian
8cc96060ff Variable name change. 2023-06-09 16:44:29 +02:00
Yury Bondarenko
c4b2565373 Workaround: don't use form-global data for check
Note: we're balancing multiple bugs against eachother here, not ideal!
  - the diff doesn't catch removed Relationship fields; instead, form reload is triggered by a dspace.entity.type change
  - if we add the original `this.sectionMetadata.includes(key)` check, we filter out this change and the form fails to update
  - if we add `relation.*` fields to `this.sectionMetadata`, newly added Relationship entries are duplicated

As of this commit, the form _seems_ to work in a stable way, but these issues shoud really investigated in more detail.
2023-06-09 13:39:33 +02:00
lotte
95f33848f9 Merge remote-tracking branch 'origin/main' into w2p-101289_1578_primaryBitstream-edit-implementation 2023-06-09 12:14:48 +02:00
lotte
daf297b94b 101289: Removed unnecessary data services from primary bitstream service 2023-06-09 12:12:31 +02:00
Paulo Graça
ba6d3f363c Merge branch 'main' into bugfix/addressing-#2276 2023-06-09 11:02:26 +01:00
Tim Donohue
00d895b304 Merge pull request #2293 from 4Science/DURACOM-151
Delete EPerson from "Edit EPerson" form
2023-06-08 14:21:28 -05:00
lotte
9d2fed4186 101289: Fixed test issues 2023-06-08 16:42:25 +02:00
lotte
a936878c96 101289: tests 2023-06-08 16:02:33 +02:00
Art Lowel
c9324b0714 fix issue where iiif tests would fail 2023-06-08 15:44:30 +02:00
Giuseppe Digilio
706c49d04b Merge remote-tracking branch '4sciencebitbucket/feature/CST-9636' into feature/CST-9636 2023-06-08 15:23:17 +02:00
Giuseppe Digilio
d449108395 [CST-9636] revert changes to object-list.component 2023-06-08 15:23:02 +02:00
Enea Jahollari
84f4f017fb CST-9639: Fix error when modal closes 2023-06-08 14:52:29 +02:00
lotte
56cba82c2d 101289: intermediate commit for test issues 2023-06-08 14:16:04 +02:00
Giuseppe Digilio
45bf5a77e2 Merge branch 'main' into DURACOM-152 2023-06-08 13:17:51 +02:00
Giuseppe Digilio
b3b5b761db Merge branch 'main' into feature/CST-5729 2023-06-08 13:15:26 +02:00
Giuseppe Digilio
02bb7db119 [CST-5729] Fix issue with undefined link type 2023-06-08 13:15:02 +02:00
Enea Jahollari
16ff75c92e CST-9639: Fix calendar placement 2023-06-08 10:23:33 +02:00
Enea Jahollari
cdca1b5313 Merge branch 'main' into feature/CST-9636 2023-06-08 09:52:38 +02:00
Enea Jahollari
b44acd68ee CST-9639: Fix maxStartDate issue 2023-06-08 09:52:25 +02:00
Tim Donohue
ed6fe8c609 Merge pull request #2296 from atmire/w2p-101127_browse-by-controlled-vocabulary-7.6.0-next
Browse by Controlled Vocab on Community/Collection homepages
2023-06-07 16:43:30 -05:00
Mark H. Wood
50acff1b59 Empty the template of local content. 2023-06-07 12:22:37 -04:00
Alisa Ismailati
5331b43a62 [DURACOM-152] Fixed read-only visibility for submission form fields 2023-06-07 18:08:21 +02:00
Enea Jahollari
88b69a55eb Merge branch 'main' into feature/CST-9636 2023-06-07 17:29:27 +02:00
Enea Jahollari
12b3eb839b CST-9639: Added and fixed unit tests 2023-06-07 17:29:05 +02:00
Tim Donohue
3c871f90c0 Merge pull request #2234 from mspalti/mirador-config
Update of mirador configuration and webpack
2023-06-07 09:51:57 -05:00
Art Lowel
d69adab419 refactor primarybitstreams to work with DELETE, POST and PUT instead of PATCh 2023-06-07 16:22:57 +02:00
Enea Jahollari
9f78f6c5c1 Merge branch 'main' into feature/CST-9636
# Conflicts:
#	src/app/core/core.module.ts
2023-06-07 16:11:43 +02:00
Enea Jahollari
47e0314c9b CST-9639: Fixed error on control remove, fixed cancel button behavior, fixed bad state of access control tab on load, fixed translations, added jsdocs 2023-06-07 13:00:12 +02:00
Nona Luypaert
6b0318fc03 Merge branch 'main' into w2p-101127_browse-by-controlled-vocabulary-7.6.0-next 2023-06-07 11:07:12 +02:00
Nona Luypaert
9db595c232 Merge branch 'w2p-101127_browse-by-controlled-vocabulary' into w2p-101127_browse-by-controlled-vocabulary-7.6.0-next 2023-06-07 10:03:48 +02:00
Nona Luypaert
77a8fde646 101623: Fix Browse By Vocabulary on comcol page 2023-06-07 09:36:01 +02:00
Paulo Graça
a7f7cecdab Merge branch 'main' into bugfix/addressing-#2276 2023-06-07 08:34:33 +01:00
Paulo Graça
f6f68de6d1 Merge branch 'main' into portuguese_pt-PT-message-keys 2023-06-07 08:15:31 +01:00
Tim Donohue
829b111663 Merge pull request #2177 from alexandrevryghem/fix-metadata-fields-containing-dots_contribute-main
Added input validation for new metadata field submissions & fixed some other small bugs
2023-06-06 14:33:58 -05:00
Tim Donohue
e2b3f52fe4 Merge pull request #2228 from enea4science/feature/DURACOM-131
[DURACOM-131] Show output files in separate lines and a refresh spinner if status is running
2023-06-06 13:52:28 -05:00
Alexandre Vryghem
25e06fffe9 Merge remote-tracking branch 'alex/fix-metadata-fields-containing-dots_contribute-7.4' into fix-metadata-fields-containing-dots_contribute-main 2023-06-06 18:58:24 +02:00
Alexandre Vryghem
755451191c 100553: Updated form validation errors from metadata schema and field form 2023-06-06 18:27:07 +02:00
Giuseppe Digilio
d2dfd0b293 Merge branch 'main' into feature/CST-5729 2023-06-06 18:14:39 +02:00
Alisa Ismailati
454d869c53 Merge branch 'main' of https://bitbucket.org/4Science/dspace-angular into DURACOM-151 2023-06-06 18:09:21 +02:00
Alisa Ismailati
b1aa2f3550 [DURACOM-151] reverted setStaleByUUID method as it was 2023-06-06 16:57:17 +02:00
Enea Jahollari
3fdef20dc2 added unit testing 2023-06-06 15:54:57 +02:00
Alisa Ismailati
1b2d9829ed [DURACOM-151] unit test fix 2023-06-06 15:35:54 +02:00
Alisa Ismailati
3611f37563 [DURACOM-151] Fixed EPerson deletion 2023-06-06 14:42:49 +02:00
Enea Jahollari
dbccda4330 rollback change for orcid sync settings 2023-06-06 14:13:13 +02:00
Paulo Graça
7a19603f5c Merge branch 'main' into bugfix/addressing-#2276 2023-06-06 12:45:49 +01:00
Ricardo Saraiva
70b1717a3c Merge branch 'main' into portuguese_pt-PT-message-keys 2023-06-06 12:27:41 +01:00
Ricardo Saraiva
72be58aa2a Update pt-PT.json5 2023-06-06 11:50:35 +01:00
Ricardo Saraiva
3f343dbd60 Update pt-PT.json5 2023-06-06 11:29:47 +01:00
Art Lowel
8f536d31ef Merge remote-tracking branch 'upstream/main' into add-referrer-to-pageview-event-7.6.0-next 2023-06-06 10:43:30 +02:00
Tim Donohue
5af9793cdf Merge pull request #2253 from doana/orcid-settings-button-accessibility
ORCID registry queue button accessibility
2023-06-05 15:49:05 -05:00
Tim Donohue
1ba72f54c2 Merge pull request #2021 from atmire/default-configuration-fix
"default" search configuration fix
2023-06-05 15:37:29 -05:00
Tim Donohue
5dda1989b5 Merge pull request #2280 from atmire/w2p-102039_Multiple_Bitstream_deletion_endpoint
Fix multiple bitstream deletion not working
2023-06-05 15:36:02 -05:00
Tim Donohue
21c7f438ac Merge pull request #2215 from atmire/w2p-101127_browse-by-controlled-vocabulary-7.6.0-next
Browse by Controlled Vocabulary Page
2023-06-05 15:31:50 -05:00
Paulo Graça
2cfef082f1 Merge branch 'main' into bugfix/addressing-#2276 2023-06-05 15:45:35 +01:00
Ricardo Saraiva
2824469dc5 Update pt-PT.json5 2023-06-05 14:41:55 +01:00
Alan Orth
cdff2aba6c Merge pull request #2272 from alanorth/publisher-i18n-string
src/assets: add i18n string for publisher
2023-06-05 16:30:14 +03:00
Giuseppe Digilio
092608f6cb [CST-5729] Remove additional error message 2023-06-05 15:11:01 +02:00
Alan Orth
165bdf7797 src/assets: add i18n string for publisher
Add string for publisher in live import item preview.

Requires: https://github.com/DSpace/DSpace/pull/8866
2023-06-05 15:52:02 +03:00
Giuseppe Digilio
f52e95871a Merge branch 'main' into feature/CST-5729 2023-06-05 14:22:14 +02:00
Enea Jahollari
d99b98d140 Merge remote-tracking branch 'origin/main' into feature/CST-9636 2023-06-05 09:18:00 +02:00
Paulo Graça
58caa84153 Merge branch 'main' into bugfix/addressing-#2276 2023-06-04 09:31:58 +01:00
Nona Luypaert
9ca57e942a Merge branch 'main' into w2p-101127_browse-by-controlled-vocabulary-7.6.0-next
Conflicts:
	src/assets/i18n/en.json5
2023-06-03 00:07:37 +02:00
Tim Donohue
ef9fd36fe2 Merge pull request #2246 from doana/search-filter-accessibility
Add filter name to search filter button aria-label.
2023-06-02 17:02:21 -05:00
Tim Donohue
5a9e9fdd5a Merge pull request #2255 from doana/starts-with-text-missing-label
Add label to starts-with-text input field
2023-06-02 16:28:47 -05:00
Tim Donohue
e0f0b6935c Merge pull request #2274 from alanorth/fix-english-permission-string
src/assets/i18n: fix English permission string
2023-06-02 16:06:19 -05:00
Tim Donohue
acb9b24722 Merge pull request #2202 from mwoodiupui/themeable-section-upload-file
Themeable `SubmissionSectionUploadFileComponent`
2023-06-02 15:58:16 -05:00
Nona Luypaert
db8b9f13b6 Merge branch 'w2p-101127_browse-by-controlled-vocabulary' into w2p-101127_browse-by-controlled-vocabulary-7.6.0-next 2023-06-02 20:18:32 +02:00
Nona Luypaert
4cf69eb9c9 101623: Fix reset emit nog working for BrowseByTaxonomyPage 2023-06-02 20:16:13 +02:00
enea4science
df71391647 Merge branch 'main' into CST-7216 2023-06-02 15:33:50 +02:00
Enea Jahollari
81f7b5ae12 Merge remote-tracking branch 'upstream/main' into CST-7216 2023-06-02 15:32:57 +02:00
Enea Jahollari
ae269f64b6 Merge branch 'main' into feature/CST-9636
# Conflicts:
#	src/app/item-page/edit-item-page/edit-item-page.module.ts
#	src/app/item-page/edit-item-page/edit-item-page.routing.module.ts
2023-06-02 15:10:30 +02:00
Nona Luypaert
7135f8ab30 Merge branch 'w2p-101127_browse-by-controlled-vocabulary' into w2p-101127_browse-by-controlled-vocabulary-7.6.0-next
Conflicts:
	src/app/browse-by/browse-by-page.module.ts
	src/app/shared/form/form.module.ts
2023-06-02 14:31:52 +02:00
Nona Luypaert
9d08cac566 101623: Reset in Treeview also resets selectedItems + Provide TreeviewService in root 2023-06-02 14:15:46 +02:00
Alan Orth
da245b88b8 src/assets/i18n: fix English permission string
The current message is not correct English. Note, there seems to be
a mix of "don't" and "do not" language. Perhaps we should harmonize
that eventually.
2023-06-02 12:59:20 +03:00
enea4science
f16befb088 Merge branch 'main' into feature/DURACOM-131 2023-06-02 09:37:36 +02:00
Enea Jahollari
f09a26f019 Merge remote-tracking branch 'upstream/main' into feature/DURACOM-131 2023-06-02 09:34:23 +02:00
Mark H. Wood
10899aa22c Merge branch 'main' into themeable-section-upload-file 2023-06-01 16:36:09 -04:00
Tim Donohue
6ba8cbd49c Merge branch 'main' into starts-with-text-missing-label 2023-06-01 15:20:52 -05:00
Mark H. Wood
3a5d8022e5 Merge branch 'main' into themeable-request-copy 2023-06-01 13:58:07 -04:00
Mark H. Wood
dd548c20e9 Add blank custom versions to 'custom' theme. 2023-06-01 13:48:17 -04:00
Tim Donohue
37a323e94f Merge pull request #2231 from mspalti/date-browse-fix
Possible fix for browse-by-date links
2023-06-01 12:40:59 -05:00
Tim Donohue
be7938a21b Merge pull request #2036 from atmire/w2p-98422_Thumbnail-uploader_contribute-7.2
Adding themed components for EditBitstreamPageComponent and ItemStatusComponent
2023-06-01 11:53:46 -05:00
Tim Donohue
aa7409051b Merge pull request #2243 from 4Science/DURACOM-145
Handled collection step visibility on a submission form
2023-06-01 11:32:08 -05:00
Michael Spalti
8e450402af Removed unnecessary route navigation. 2023-06-01 09:30:38 -07:00
Michael Spalti
86e1333025 Possible fix for browse-by-date links 2023-06-01 09:30:38 -07:00
Mark H. Wood
97673471f7 Remove inherited input declarations. 2023-06-01 12:20:59 -04:00
Mark H. Wood
8e6268ff84 We want an empty template, since not yet used. 2023-06-01 12:16:29 -04:00
Giuseppe Digilio
81f3a5cce0 Merge branch 'main' into feature/CST-5729 2023-06-01 18:00:15 +02:00
Tim Donohue
828f2586b1 Merge pull request #2261 from tdonohue/fix_unsafe_links
Fix several "potentially unsafe external link" warnings
2023-06-01 10:57:41 -05:00
Tim Donohue
dd6051b645 Merge pull request #2287 from rsaraivac/portuguese_pt-PT-message-keys
Contribution to the Portuguese (pt-PT) translation of DSpace
2023-06-01 10:49:41 -05:00
Tim Donohue
6426f9e532 Merge pull request #2286 from alanorth/remove-webpack.js
Remove scripts/webpack.js
2023-06-01 10:49:07 -05:00
Kristof De Langhe
48896fdae2 Merge branch 'main' into w2p-98422_Thumbnail-uploader_contribute-7.2 2023-06-01 17:14:32 +02:00
Enea Jahollari
1ebe61028f Merge branch 'main' into feature/CST-9636 2023-06-01 17:01:24 +02:00
Enea Jahollari
5e4102cd21 update test file 2023-06-01 16:57:20 +02:00
Enea Jahollari
b35e27a44b disable tests 2023-06-01 16:57:13 +02:00
Enea Jahollari
72b089c0cd fix BulkAccessSettingsComponent test 2023-06-01 16:04:12 +02:00
Enea Jahollari
8b636f533b fix bitstream list item test 2023-06-01 15:41:52 +02:00
Enea Jahollari
c1dcebbd04 Fix: fix validation and translation
Show/hide the datepicker based on the value
2023-06-01 15:27:11 +02:00
Paulo Graça
3e7a3f250b Merge branch 'main' into portuguese_pt-PT-message-keys 2023-06-01 10:39:17 +01:00
Art Lowel
ee04589599 Merge branch 'add-referrer-to-pageview-event-7.4' into add-referrer-to-pageview-event-7.6.0-next 2023-06-01 11:01:05 +02:00
Art Lowel
f2cfab749e Merge branch 'add-referrer-to-pageview-event-7.2' into add-referrer-to-pageview-event-7.4 2023-06-01 11:00:53 +02:00
Art Lowel
42ba7924b9 Merge branch 'add-referrer-to-pageview-event-7.0' into add-referrer-to-pageview-event-7.2 2023-06-01 11:00:41 +02:00
Art Lowel
d1dff0553d fix lint error 2023-06-01 11:00:26 +02:00
Art Lowel
43e1e6d22b add noreferrer to license link 2023-06-01 10:56:44 +02:00
Giuseppe Digilio
a67c8906ee Merge branch 'main' into feature/CST-5729 2023-06-01 09:15:41 +02:00
Tim Donohue
37d9b5bfc2 Merge pull request #2269 from DSpace/dependabot/npm_and_yarn/socket.io-parser-4.2.3
Bump socket.io-parser from 4.2.2 to 4.2.3
2023-05-31 16:59:28 -05:00
rsaraivac
9c683b55e0 Merge branch 'main' into portuguese_pt-PT-message-keys 2023-05-31 21:15:04 +01:00
rsaraivac
c84db3ce3d Update pt-PT.json5 2023-05-31 20:34:21 +01:00
Tim Donohue
0968fe8bbc Merge pull request #2271 from kshepherd/item_status_page_config_fix
ItemStatus component should handle missing config gracefully
2023-05-31 14:28:37 -05:00
rsaraivac
29f283b35e Update pt-PT.json5 2023-05-31 20:11:38 +01:00
rsaraivac
6ad0f99ca4 Update pt-PT.json5 2023-05-31 20:06:12 +01:00
rsaraivac
d3d9a526fd Update pt-PT.json5 2023-05-31 19:29:57 +01:00
rsaraivac
bbfb8bec01 Update pt-PT.json5 2023-05-31 18:34:59 +01:00
Tim Donohue
8bdd2d293f Merge pull request #2135 from mwoodiupui/embargo-date
Don't allow the date picker to exceed the maximum start or end date for an access option
2023-05-31 11:53:53 -05:00
Alan Orth
6483eb2c30 Remove scripts/webpack.js
This is no longer used.

Fixes: https://github.com/DSpace/dspace-angular/issues/2285
2023-05-31 19:39:36 +03:00
Tim Donohue
38d7412569 Merge pull request #2284 from atmire/fix-issue-with-colons-in-ids
Fix issue where a colon in a uuid would get misinterpreted as a route param
2023-05-31 10:36:37 -05:00
rsaraivac
0f1b16cbeb Merge branch 'main' into portuguese_pt-PT-message-keys 2023-05-31 14:56:59 +01:00
Art Lowel
244608aa5c fix issue where a colon in a uuid would get misinterpreted as a route param 2023-05-31 12:11:15 +02:00
rsaraivac
fb1ff05757 Contribution to the Portuguese (pt-PT) translation of DSpace v7.5
Extended revision of the Portuguese (pt-PT) translation of DSpace v7.5. This version adds new message keys,  reordered the message keys accordingly to the authoritative master (en.json5) and adds missing or not found translation keys (mentioned in the last section of the file).
2023-05-30 22:09:59 +01:00
Art Lowel
15493e2f69 Merge branch 'add-referrer-to-pageview-event-7.4' into add-referrer-to-pageview-event-7.6.0-next 2023-05-30 17:48:29 +02:00
Art Lowel
ffdc7b32c5 Merge branch 'add-referrer-to-pageview-event-7.2' into add-referrer-to-pageview-event-7.4 2023-05-30 17:24:51 +02:00
Art Lowel
5723fcbdc0 Merge branch 'add-referrer-to-pageview-event-7.0' into add-referrer-to-pageview-event-7.2 2023-05-30 17:19:44 +02:00
Art Lowel
5b37101bb9 add the rel="noreferrer" attribute when target="_blank" 2023-05-30 17:17:54 +02:00
Art Lowel
3df0286ec8 fix an issue where the current page would be used instead of a third party referrer 2023-05-30 16:53:16 +02:00
Art Lowel
fcfdff7fbd ensure the rel="noopener" attribute is only set when target="_blank" and remove "noreferrer" in all cases 2023-05-30 16:53:12 +02:00
Art Lowel
4717d6f758 add referrer to pageview events 2023-05-30 16:39:50 +02:00
Art Lowel
2db6c96d57 Merge branch 'add-referrer-to-pageview-event-7.2' into add-referrer-to-pageview-event-7.4 2023-05-30 16:33:13 +02:00
Art Lowel
f8eb8e1cae Merge branch 'add-referrer-to-pageview-event-7.0' into add-referrer-to-pageview-event-7.2 2023-05-30 16:08:59 +02:00
Paulo Graça
2ff5b7370c updating project metatadata representation list html 2023-05-30 14:53:55 +01:00
Paulo Graça
f5e09c5f8d fixing angular test, I was using a legacy property 2023-05-30 14:24:56 +01:00
Nona Luypaert
23b5d52623 101623: Fix request being sent with uuid=undefined if not going to a DSO page 2023-05-30 14:50:25 +02:00
Nona Luypaert
97c90cfd9e Merge branch 'w2p-101127_browse-by-controlled-vocabulary' into w2p-101127_browse-by-controlled-vocabulary-7.6.0-next
Remove invalid _links in BrowseDefinition models
Make arrows smaller in on VocabularyTreeview template
2023-05-30 14:14:20 +02:00
Nona Luypaert
138fccf711 101623: Fix lint/tests after removing invalid links, Make arrows on Treeview smaller 2023-05-30 14:11:03 +02:00
Paulo Graça
d9ed91df05 new project metadata representation component 2023-05-30 11:46:59 +01:00
Alexandre Vryghem
fb66b5abd6 102039: Use patch to delete multiple bitstreams at once 2023-05-30 11:31:11 +02:00
Enea Jahollari
23eeee3d16 Fix alignment 2023-05-30 09:58:06 +02:00
Enea Jahollari
a525c6fe3e Fix sections alignment 2023-05-29 15:47:16 +02:00
Enea Jahollari
877af98c4b Make Reset and Execute buttons normal 2023-05-29 15:30:24 +02:00
Enea Jahollari
bd477765c0 Added labels and hide dates if disabled 2023-05-29 10:44:03 +02:00
Mark H. Wood
74a0820271 Correct test fixture to match unit-under-test requirements. 2023-05-26 13:13:03 -04:00
Giuseppe Digilio
ae4b68f1bb Merge branch 'main' into feature/CST-5729
# Conflicts:
#	src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts
2023-05-25 23:17:31 +02:00
Giuseppe Digilio
220b30bea7 [CST-5729] Address review feedback 2023-05-25 23:15:57 +02:00
Mark H. Wood
172f7e527f Merge remote-tracking branch 'upstream/main' into embargo-date 2023-05-25 14:57:25 -04:00
Tim Donohue
d2fa8cda6a Merge pull request #2200 from atmire/w2p-100414_Missing-search-result-statistics-PR
Missing search results statistics
2023-05-25 08:55:01 -05:00
lotte
d71c16879e Merge branch 'main' into w2p-101289_1578_primaryBitstream-edit-implementation 2023-05-25 14:36:39 +02:00
Nona Luypaert
85f95112b3 101127: Remove invalid links in BrowseDefinition models 2023-05-25 12:10:28 +02:00
Kim Shepherd
efaf1d47da item-status comp should handle missing config gracefully
if the "register identifier" config is missing, simply
return enabled=false rather than break the rest of the
page features from loading
2023-05-25 10:34:08 +12:00
Nona Luypaert
d38b16eb48 Merge remote-tracking branch 'upstream/main' into w2p-101127_browse-by-controlled-vocabulary-7.6.0-next
Conflicts:
	src/app/browse-by/browse-by-guard.spec.ts
	src/app/shared/object-list/metadata-representation-list-element/browse-link/browse-link-metadata-list-element.component.ts
	src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.ts
2023-05-24 17:26:53 +02:00
Nona Luypaert
1d0df844c3 101623: Fixes after merge 2023-05-24 16:51:52 +02:00
Nona Luypaert
fad1a7ade4 Merge branch 'w2p-101127_browse-by-controlled-vocabulary' into w2p-101127_browse-by-controlled-vocabulary-7.6.0-next
Conflicts:
	src/app/browse-by/browse-by-routing.module.ts
	src/app/browse-by/browse-by.module.ts
	src/app/core/browse/browse-definition-data.service.ts
	src/app/core/core.module.ts
2023-05-24 16:35:37 +02:00
dependabot[bot]
e7b02778cf Bump socket.io-parser from 4.2.2 to 4.2.3
Bumps [socket.io-parser](https://github.com/socketio/socket.io-parser) from 4.2.2 to 4.2.3.
- [Release notes](https://github.com/socketio/socket.io-parser/releases)
- [Changelog](https://github.com/socketio/socket.io-parser/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io-parser/compare/4.2.2...4.2.3)

---
updated-dependencies:
- dependency-name: socket.io-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-24 02:15:33 +00:00
Mark H. Wood
8a93bef98c Supply a customizable themed version. 2023-05-23 13:06:12 -04:00
Tim Donohue
9c780200b2 Merge pull request #2226 from 4Science/DURACOM-133
Supervised Order with OBSERVER permissions can only view the item
2023-05-23 11:46:45 -05:00
Nona Luypaert
78d5116cdb 101623: Add missing docs + Fix lint issues 2023-05-23 17:54:33 +02:00
Nona Luypaert
2f0f69710e 101623: Fix browse-related tests by replacing abstract class 2023-05-23 17:40:07 +02:00
Nona Luypaert
d9b0eebc18 101623: Remove hardcoded 'browse by srsc' menu option in MenuResolver 2023-05-23 17:08:00 +02:00
Nona Luypaert
aee76913aa 101623: Replace hardcoded vocabulary with BrowseDefinition in BrowseByTaxonomyPage 2023-05-23 17:05:00 +02:00
Nona Luypaert
d1c91b8bc2 101623: Override createAndSendGetRequest in BrowseDefinitionDataService 2023-05-23 17:02:10 +02:00
Enea Jahollari
7f450320b6 Fix circular dependency 2023-05-23 16:05:38 +02:00
Enea Jahollari
d7fe120245 Merge branch 'main' into feature/CST-9636
# Conflicts:
#	src/app/entity-groups/research-entities/item-list-elements/search-result-list-elements/person/person-search-result-list-element.component.ts
2023-05-23 15:51:46 +02:00
Nona Luypaert
f01c58e84d 101623: Fix BrowseResponseParsingService + Add tests for it 2023-05-23 14:13:05 +02:00
Pascal-Nicolas Becker
7a2b1b2068 Merge pull request #2266 from fapsi/patch-1
German translation for "browse.startsWith"
2023-05-23 14:10:56 +02:00
fapsi
1bc8111117 Merge branch 'main' into patch-1 2023-05-23 01:22:40 +02:00
Tim Donohue
8b1a2d0a0e Merge pull request #2232 from uniba-ub/fix2219
Correctly load choice ui form.other-information translation keys
2023-05-22 17:01:23 -05:00
fapsi
6af872bf9f Removed unnecessary trailing spaces
Fixing linting.
2023-05-22 23:46:33 +02:00
fapsi
2445a6bd8a German translation for "browse.startsWith"
Added missing German translation for "browse.startsWith".
2023-05-22 23:05:13 +02:00
Tim Donohue
d5198659a9 Merge pull request #2129 from alexandrevryghem/retrieve-name-with-dsonameservice-main
Use the DSONameService to display DSpaceObjects names
2023-05-22 15:55:47 -05:00
Giuseppe Digilio
2c3329b7c0 Merge remote-tracking branch '4sciencebitbucket/DURACOM-133' into DURACOM-133 2023-05-22 09:15:30 +02:00
Giuseppe Digilio
e12da0fd0e Merge branch 'main' into feature/CST-5729 2023-05-22 09:11:34 +02:00
Alisa Ismailati
d0ccb59424 [DURACOM-133] Removed unused variable 2023-05-22 09:11:15 +02:00
Giuseppe Digilio
f0f8f163fa Merge remote-tracking branch '4sciencebitbucket/DURACOM-145' into DURACOM-145 2023-05-22 09:01:17 +02:00
Gantner, Florian Klaus
47098ca4ca add missing form.other-information keys 2023-05-22 08:29:23 +02:00
Tim Donohue
edeea00c75 Fix several "potentially unsafe external link" warnings 2023-05-19 16:02:30 -05:00
Tim Donohue
5a5c7cc43b Merge pull request #2254 from DSpace/dependabot/npm_and_yarn/engine.io-6.4.2
Bump engine.io from 6.4.1 to 6.4.2
2023-05-19 15:52:32 -05:00
dependabot[bot]
5f72865e42 Bump engine.io from 6.4.1 to 6.4.2
Bumps [engine.io](https://github.com/socketio/engine.io) from 6.4.1 to 6.4.2.
- [Release notes](https://github.com/socketio/engine.io/releases)
- [Changelog](https://github.com/socketio/engine.io/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/engine.io/compare/6.4.1...6.4.2)

---
updated-dependencies:
- dependency-name: engine.io
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-19 19:46:45 +00:00
Mark H. Wood
055ed9ba6e Fix spec broken by signature change. 2023-05-19 14:00:21 -04:00
Mark H. Wood
d54754f78a Conform to expected ngOnChanges signature; tidy up. 2023-05-19 13:36:04 -04:00
Mark H. Wood
f466d0b67c Merge remote-tracking branch 'upstream/main' into themeable-section-upload-file 2023-05-19 13:31:05 -04:00
Tim Donohue
724f1fe4d3 Merge pull request #2260 from alexandrevryghem/fix-jasmine-matchers-not-properly-indexing
Fix jasmine Matchers functions not properly indexing in IntelliJ
2023-05-19 12:22:56 -05:00
Tim Donohue
8c52f2abed Merge pull request #2235 from alexandrevryghem/themed-thumbnail_component-main
Fixed `ngOnChanges` not working for themed components & decorator components + minor fixes
2023-05-19 11:57:13 -05:00
Giuseppe Digilio
2e6a1c21ea Merge remote-tracking branch '4sciencebitbucket/DURACOM-133' into DURACOM-133 2023-05-19 18:33:20 +02:00
Alisa Ismailati
aee6060fef Revert "[DURACOM-145] Fixed e2e failing tests"
This reverts commit b9c7391b1452e9a79d9c5615595b08cd7ac8b14c.
2023-05-19 18:31:52 +02:00
Alisa Ismailati
8e25a02fde [DURACOM-145] Fixed e2e failing tests 2023-05-19 18:31:52 +02:00
Alisa Ismailati
9ca04b4b63 [DURACOM-145] Handled collection step
on a submission form
2023-05-19 18:31:52 +02:00
Alisa Ismailati
3e202a67f1 [DURACOM-133] Remove isAdmin checks 2023-05-19 18:23:55 +02:00
Giuseppe Digilio
709764c8af [DURACOM-133] Fix import paths 2023-05-19 18:23:55 +02:00
Alisa Ismailati
c0d91da6e2 [DURACOM-133] Fixed failing test 2023-05-19 18:23:55 +02:00
Alisa Ismailati
6c8f816fb2 [DURACOM-133] Do not show edit/delete button
for observer
2023-05-19 18:23:55 +02:00
Alexandre Vryghem
99ea73f9f6 Fix jasmine Matchers functions not properly indexing 2023-05-19 17:49:21 +02:00
Nona Luypaert
bf31c76c88 101623: Add ValueListBrowseDefinition model + super NonHierarchicalBrowse class 2023-05-19 16:56:07 +02:00
Tim Donohue
e04dd9e183 Merge pull request #2256 from 4Science/fix_WorkspaceitemsDeletePageComponent_test
Fix test
2023-05-19 09:17:05 -05:00
Alexandre Vryghem
b878f28db6 Merge remote-tracking branch 'upstream/main' into retrieve-name-with-dsonameservice-main
# Conflicts:
#	src/app/workflowitems-edit-page/advanced-workflow-action/advanced-workflow-action-select-reviewer/reviewers-list/reviewers-list.component.ts
2023-05-19 15:00:24 +02:00
Alexandre Vryghem
af7d99a987 Merge branch 'retrieve-name-with-dsonameservice-7.4' into retrieve-name-with-dsonameservice-main 2023-05-19 14:59:40 +02:00
Alexandre Vryghem
11a86c3756 Fixed switch collection in submission form not working anymore 2023-05-19 14:59:23 +02:00
Alexandre Vryghem
8dd0b49e27 Merge branch 'fix-ngonchanges-not-working-for-themed-components_contribute-7.4' into fix-ngonchanges-not-working-for-themed-components_contribute-main 2023-05-19 14:02:29 +02:00
Alexandre Vryghem
0894ba0166 Merge branch 'fix-ngonchanges-not-working-for-themed-components_contribute-7.2' into fix-ngonchanges-not-working-for-themed-components_contribute-7.4
# Conflicts:
#	src/app/thumbnail/thumbnail.component.ts
2023-05-19 14:02:12 +02:00
Alexandre Vryghem
92f58f0e8a 101577: Fixed default thumbnail not working when thumbnail isn't defined 2023-05-19 14:01:35 +02:00
Alexandre Vryghem
053063d0f4 Merge remote-tracking branch 'upstream/main' into fix-ngonchanges-not-working-for-themed-components_contribute-main
# Conflicts:
#	src/app/shared/object-list/metadata-representation-list-element/metadata-representation-list-element.component.ts
#	src/app/shared/object-list/metadata-representation-list-element/plain-text/plain-text-metadata-list-element.component.html
#	src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts
#	src/app/shared/object-list/my-dspace-result-list-element/pool-search-result/pool-search-result-list-element.component.ts
#	src/app/shared/shared.module.ts
#	src/app/shared/theme-support/themed.component.ts
#	src/themes/custom/lazy-theme.module.ts
2023-05-19 13:36:41 +02:00
Alexandre Vryghem
98a5076366 101577: Fixed some SearchResultListElementComponents not rendering because of potential undefined dso 2023-05-19 13:21:38 +02:00
Alexandre Vryghem
190f245635 Merge tag 'dspace-7.4' into fix-ngonchanges-not-working-for-themed-components_contribute-7.4
# Conflicts:
#	src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/collection-search-result/collection-admin-search-result-grid-element.component.spec.ts
#	src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/community-search-result/community-admin-search-result-grid-element.component.spec.ts
#	src/app/shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-loader.component.ts
#	src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts
#	src/app/shared/object-grid/collection-grid-element/collection-grid-element.component.html
#	src/app/shared/object-grid/community-grid-element/community-grid-element.component.html
#	src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html
#	src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html
#	src/app/shared/object-grid/search-result-grid-element/item-search-result/item/item-search-result-grid-element.component.html
#	src/app/shared/theme-support/themed.component.ts
#	src/app/thumbnail/thumbnail.component.spec.ts
#	src/app/thumbnail/thumbnail.component.ts
#	src/themes/custom/lazy-theme.module.ts
2023-05-19 13:17:26 +02:00
Alexandre Vryghem
82a8da6028 101577: Fixed ClaimedTaskActionsLoaderComponent not updating its @rendersWorkflowTaskOption components ngOnChanges 2023-05-19 12:22:55 +02:00
Alexandre Vryghem
2ca91fd331 101577: Fixed MetadataRepresentationLoaderComponent not updating its @metadataRepresentationComponent components ngOnChanges 2023-05-19 12:22:55 +02:00
Alexandre Vryghem
a4a0482d88 101577: Fixed ListableObjectComponentLoaderComponent not updating its @listableObjectComponent components ngOnChanges 2023-05-19 12:22:43 +02:00
Giuseppe Digilio
e8f7a9e3a1 Merge branch 'main' into feature/CST-5729 2023-05-19 11:46:33 +02:00
Giuseppe Digilio
008dee60c1 Fix test 2023-05-18 23:21:45 +02:00
Giuseppe Digilio
0c6994ba14 Merge branch 'main' into fix_WorkspaceitemsDeletePageComponent_test 2023-05-18 23:13:18 +02:00
Tim Donohue
8218ed595a Merge pull request #2257 from tdonohue/fix_community_list_spec
Fix several specs/tests on `main`
2023-05-18 15:38:19 -05:00
Tim Donohue
12a561d0a0 Comment out problematic test in "workspaceitems-delete-page" component 2023-05-18 13:37:45 -05:00
Tim Donohue
ba2444768e Minor fix to spec after Angular 15 update 2023-05-18 13:14:37 -05:00
Giuseppe Digilio
ba8b27e611 Fix test 2023-05-18 19:03:37 +02:00
Giuseppe Digilio
d5dec7582a Merge branch 'main' into DURACOM-133 2023-05-18 18:30:00 +02:00
Giuseppe Digilio
7906770e8e Merge branch 'main' into feature/CST-5729 2023-05-18 18:29:06 +02:00
Adam Doan
30ae91b206 Merge branch 'main' into starts-with-text-missing-label 2023-05-18 10:09:46 -04:00
Tim Donohue
ba4d652806 Merge pull request #2204 from atmire/Angular-15-upgrade
Angular 15 upgrade
2023-05-18 08:48:58 -05:00
Adam Doan
f1378b870b Add label to starts-with-text input field 2023-05-18 13:40:48 +00:00
Alexandre Vryghem
10d5f3d0af 101577: Ensure renderComponentInstance is called in ngOnChanges if the component is not initialised yet 2023-05-18 15:02:14 +02:00
Alexandre Vryghem
0559e1ebc1 101577: Added changes parameter to the ThumbnailComponent's ngOnChanges 2023-05-18 15:02:14 +02:00
Alexandre Vryghem
30cbcbb7c8 101577: Added themeable ThumbnailComponent to custom theme 2023-05-18 15:02:14 +02:00
Alexandre Vryghem
8e4247c2ac 101577: Themed ThumbnailComponent 2023-05-18 15:01:46 +02:00
Alisa Ismailati
be83037739 Merge branch 'main' of https://bitbucket.org/4Science/dspace-angular into DURACOM-133 2023-05-18 11:34:34 +02:00
Alisa Ismailati
69a3a1ec08 [DURACOM-133] Remove isAdmin checks 2023-05-18 11:30:51 +02:00
Tim Donohue
698795299d Merge pull request #2199 from arvoConsultores/DS-8636
#8636  Request a Copy's "helpdesk" strategy requires authentication t…
2023-05-17 16:46:55 -05:00
Tim Donohue
4f4dbffde8 Merge pull request #2227 from 4Science/DURACOM-134
Administer workflow actions
2023-05-17 16:44:18 -05:00
Art Lowel
3d7e61f57f add a custom FindDataImpl for browsedefinitions 2023-05-17 18:31:46 +02:00
Adam Doan
0272f9a5a8 Merge branch 'DSpace:main' into orcid-settings-button-accessibility 2023-05-17 07:28:28 -04:00
damian
388c08b9a1 Archived items moved outside initial span element(fix for tests). Tests added. 2023-05-17 10:56:08 +02:00
Tim Donohue
e2c51710ea Merge pull request #2198 from uofmsean/fix-2197-authority-key-lookup
Fix #2197 authority key lookup
2023-05-16 16:54:54 -05:00
Adam Doan
bd1881fc9a Add accessible button names for ORCID queue action buttons 2023-05-16 18:54:17 +00:00
damian
da7cb11bcb Archived items moved outside initial span element(fix for tests) 2023-05-15 20:34:46 +02:00
Giuseppe Digilio
43d78c695c [CST-5729] Assign a default value 2023-05-15 17:11:45 +02:00
Giuseppe Digilio
1a95d0c571 Merge branch 'main' into feature/CST-5729 2023-05-15 17:03:29 +02:00
Giuseppe Digilio
10c6b03c40 [CST-5729] Fix lint 2023-05-15 16:58:20 +02:00
Giuseppe Digilio
a1b27a5fb3 [CST-5729] Revert unused changes 2023-05-15 16:34:02 +02:00
Giuseppe Digilio
c0efbbd07b Merge branch 'main' into feature/CST-5729 2023-05-15 16:27:54 +02:00
Giuseppe Digilio
78cf3e1bfc [CST-5729] Finalize signposting implementation 2023-05-15 16:27:38 +02:00
Tim Donohue
b93e0bf003 Merge pull request #2249 from 4Science/DURACOM-99
[DURACOM-99] Tests fixed
2023-05-15 09:22:46 -05:00
damian
536cb62cc0 Displaying item counts at Communities and Collections list view. 2023-05-15 16:09:17 +02:00
Enea Jahollari
b4340e0b91 [CST-9639] Fix lint issues 2023-05-15 15:39:39 +02:00
Enea Jahollari
691c6ff2d8 Merge branch 'main' into feature/CST-9636
# Conflicts:
#	src/app/core/shared/context.model.ts
2023-05-15 14:31:03 +02:00
Enea Jahollari
2fc2897a36 [CST-9639] Show warning only when replace is selected 2023-05-15 13:10:10 +02:00
Enea Jahollari
270e003328 [CST-9639] Disable Execute button if none is enabled and dont send field in payload if not enabled in form 2023-05-15 12:27:44 +02:00
Alexandre Vryghem
4be1b57db3 Merge remote-tracking branch 'upstream/main' into retrieve-name-with-dsonameservice-main
# Conflicts:
#	src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.spec.ts
#	src/app/shared/object-detail/my-dspace-result-detail-element/claimed-task-search-result/claimed-task-search-result-detail-element.component.ts
#	src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts
#	src/app/shared/object-detail/my-dspace-result-detail-element/item-search-result/item-search-result-detail-element.component.spec.ts
#	src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.spec.ts
#	src/app/shared/object-detail/my-dspace-result-detail-element/pool-search-result/pool-search-result-detail-element.component.ts
#	src/app/shared/object-detail/my-dspace-result-detail-element/workflow-item-search-result/workflow-item-search-result-detail-element.component.ts
#	src/app/shared/object-detail/my-dspace-result-detail-element/workspace-item-search-result/workspace-item-search-result-detail-element.component.ts
#	src/app/shared/object-grid/search-result-grid-element/collection-search-result/collection-search-result-grid-element.component.html
#	src/app/shared/object-grid/search-result-grid-element/community-search-result/community-search-result-grid-element.component.html
#	src/app/shared/subscriptions/subscription-modal/subscription-modal.component.html
#	src/app/shared/subscriptions/subscription-view/subscription-view.component.html
2023-05-13 13:42:19 +02:00
Davide Negretti
9f73f4ad2d [DURACOM-99] Tests fixed 2023-05-12 23:41:29 +02:00
Tim Donohue
21b61fc0e2 Merge pull request #1951 from 4Science/DURACOM-99
Italian language
2023-05-12 16:19:36 -05:00
Tim Donohue
d7372bcdf3 Merge pull request #2239 from alexandrevryghem/fix-community-page-sorting_contribute-main
Fixed community's sub-communities and collections sort
2023-05-12 15:01:06 -05:00
Giuseppe Digilio
8c8d3e71a8 Merge branch 'main' into feature/CST-5729 2023-05-12 19:53:24 +02:00
Giuseppe Digilio
93d9b87db1 [CST-5729] Finalize implementation 2023-05-12 19:52:47 +02:00
Davide Negretti
58bc42671c [DURACOM-99] Lint errors fixed 2023-05-12 18:46:03 +02:00
Tim Donohue
f276756c3a Merge pull request #2217 from 4Science/DURACOM-138
Parameter box, shown or not
2023-05-12 11:03:32 -05:00
Alexandre Vryghem
d4efd85cc5 Merge remote-tracking branch 'upstream/main' into issue-1671_fix-relationships-not-updating-view-on-submission-form_contribute-main 2023-05-12 17:52:37 +02:00
Alexandre Vryghem
b318d7281a 101654: Fixed relationship fields not being hidden when they are out of scope 2023-05-12 17:52:03 +02:00
Alexandre Vryghem
a6a10200d2 Merge remote-tracking branch 'templates/dspace-7.4' into issue-1671_fix-relationships-not-updating-view-on-submission-form_contribute-7.4
# Conflicts:
#	src/app/submission/sections/form/section-form.component.spec.ts
#	src/app/submission/sections/form/section-form.component.ts
2023-05-12 17:36:19 +02:00
Giuseppe Digilio
11c844d973 [CST-9636] Format date to be sent to the process 2023-05-12 17:24:10 +02:00
Tim Donohue
39d1fc235e Merge pull request #2068 from atmire/w2p-97184_theme-feedback_contribute-main
Refactor badges
2023-05-12 10:15:52 -05:00
Giuseppe Digilio
6ff80700f3 [CST-9636] Fix multiple uuid argument 2023-05-12 16:56:59 +02:00
Alban Imami
22fbcbebfa [CST-5729] Method to remove Link tags from Head when switched page 2023-05-12 16:01:19 +02:00
Sondissimo
d523e1e94a Merge branch 'main' into DURACOM-138 2023-05-12 15:44:25 +02:00
Sondissimo
0cf46d0ac6 DURACOM-138 the test for the new change, regarding the parameter box appearing or not, has been written, also fixed the errors that the console was outputting 2023-05-12 15:16:44 +02:00
Giuseppe Digilio
ee0b76cb72 [CST-9636] Fix argument to send to the process 2023-05-12 15:07:24 +02:00
Adam Doan
9a8dfc229f Add filter name to search filter button aria-label. 2023-05-12 13:04:43 +00:00
samuel
4abdea5f62 99221: Fix minor issues with Relationships in submission - hide disabled buttons 2023-05-12 14:51:51 +02:00
samuel
dff343f62e 96598: Test feedback pt. 3: submission - repair auto-refresh - repair tests 2023-05-12 14:51:40 +02:00
samuel
14fb379419 96598: Test feedback pt. 3: submission - repair auto-refresh 2023-05-12 14:51:26 +02:00
Alban Imami
6f4b0ad6b1 [CST-5729] fixed the id on the bitstream api request 2023-05-12 12:10:57 +02:00
Davide Negretti
84b63a443f [DURACOM-99] Updated Italian translations (2023-05-12) 2023-05-12 12:05:32 +02:00
LotteHofstede
6c7da1cc5d Merge branch 'main' into w2p-97184_theme-feedback_contribute-main 2023-05-12 10:45:16 +02:00
lotte
b4d2f063c6 97184: styleurl fix for themed badges component 2023-05-12 10:44:55 +02:00
Nona Luypaert
f3d4754d5b 101623: Add BrowseDefinitionModels to CoreModule, Fix FlatBrowseDefinition 2023-05-12 10:06:03 +02:00
Davide Negretti
d332296da8 [DURACOM-99] First italian translations (2022-11-04) 2023-05-12 10:00:56 +02:00
Davide Negretti
134a808fba [DURACOM-99] Italian support added 2023-05-12 10:00:56 +02:00
Giuseppe Digilio
377e27b305 [CST-9636] Fix lint 2023-05-12 09:25:47 +02:00
Nona Luypaert
67976299de 101623: Fixes for rendersBrowseBy, BrowseResponseParsingService, BrowseByRoutingModule 2023-05-12 08:12:04 +02:00
Tim Donohue
959f826d64 Merge pull request #2241 from doana/view-mode-switch-accessibility
View mode switch accessibility
2023-05-11 16:53:45 -05:00
Mark H. Wood
8e5c4a73dc Make some request-copy components themeable. 2023-05-11 13:55:53 -04:00
Alban Imami
bb50e2bbdc Merge branch 'feature/CST-5729' of https://bitbucket.org/4Science/dspace-angular into feature/CST-5729 2023-05-11 18:52:32 +02:00
Alban Imami
558f8f51fb [CST-5729] Implemented functionality to add Links in Response Headers on Item Page 2023-05-11 18:47:01 +02:00
Tim Donohue
84d8a61f83 Merge pull request #2229 from mwoodiupui/license-linebreaks
Enable line breaks in deposit license during submission.
2023-05-11 10:12:34 -05:00
Giuseppe Digilio
6808eec3a4 Merge branch 'main' into feature/CST-9636
# Conflicts:
#	src/app/item-page/edit-item-page/edit-item-page.module.ts
#	src/app/item-page/edit-item-page/edit-item-page.routing.module.ts
2023-05-11 15:30:31 +02:00
Giuseppe Digilio
fe8bbddac2 [CST-5729] Fix proxying for signposting 2023-05-11 15:05:35 +02:00
Enea Jahollari
a6897e9a6d [CST-9639] Validation, translations and style fixes 2023-05-11 15:01:12 +02:00
Adam Doan
bd9f70acc8 Update tests 2023-05-11 12:57:44 +00:00
Kristof De Langhe
ff1175cd6f Merge branch 'w2p-100414_Missing-search-result-statistics-7.4' into w2p-100414_Missing-search-result-statistics-PR 2023-05-11 14:10:29 +02:00
Kristof De Langhe
c306dfd309 100414: remove fdescribe 2023-05-11 14:10:20 +02:00
Kristof De Langhe
e6bc199932 Merge branch 'w2p-100414_Missing-search-result-statistics-7.4' into w2p-100414_Missing-search-result-statistics-PR 2023-05-11 14:09:29 +02:00
Kristof De Langhe
f5b7bea3ec 100414: Lint fixes 2023-05-11 14:08:05 +02:00
Kristof De Langhe
6675b61f81 100414: test cases 2023-05-11 13:57:52 +02:00
Kristof De Langhe
cc34e27c20 100414: test cases 2023-05-11 13:56:54 +02:00
Adam Doan
9ddd75dbdf Use more semantically appropriate elements and explicit names 2023-05-11 11:50:28 +00:00
Alban Imami
e8ff0fbf36 [CST-5729] implemented functionality to add link tags in head html section when on item page 2023-05-11 12:53:18 +02:00
Kristof De Langhe
b382a88c2f Merge branch 'w2p-100414_Missing-search-result-statistics-7.4' into w2p-100414_Missing-search-result-statistics-PR 2023-05-11 12:29:28 +02:00
Kristof De Langhe
540ce4d7c4 100414: Rename object to clickedObject 2023-05-11 12:29:07 +02:00
Kristof De Langhe
b1c7728a96 Merge branch 'w2p-100414_Missing-search-result-statistics-7.4' into w2p-100414_Missing-search-result-statistics-PR 2023-05-11 11:36:24 +02:00
Kristof De Langhe
0f0847c069 100414: Refactor SearchTrackerComponent to SearchComponent 2023-05-11 11:32:49 +02:00
Kristof De Langhe
fbacebb439 Merge branch 'w2p-100414_Missing-search-result-statistics-7.2' into w2p-100414_Missing-search-result-statistics-7.4 2023-05-11 11:26:49 +02:00
Kristof De Langhe
cf12fb22ee Merge branch 'w2p-100414_Missing-search-result-statistics-7.0' into w2p-100414_Missing-search-result-statistics-7.2 2023-05-11 11:25:04 +02:00
Kristof De Langhe
3221621e6c 100414: Missing search result statistics - renaming object to clickedObject 2023-05-11 11:17:19 +02:00
Giuseppe Digilio
f3aa2d47a6 [CST-9636] finalize implementation 2023-05-11 11:10:00 +02:00
Alexandre Vryghem
4449960c0d Merge remote-tracking branch 'upstream/main' into fix-community-page-sorting_contribute-main 2023-05-10 23:39:36 +02:00
Tim Donohue
c914b42de2 Merge pull request #2196 from atmire/w2p-101198_in-place-links_contribute-main
Replace in-place links with buttons
2023-05-10 13:42:46 -05:00
Giuseppe Digilio
64c0fff370 [CST-9636] WIP Create unit tests 2023-05-10 20:18:20 +02:00
Giuseppe Digilio
e31fc562c5 [CST-9636] WIP Create the access-control.module 2023-05-10 18:25:41 +02:00
Enea Jahollari
7b5b795954 [CST-9636] Added state transformer to file model, added tests for bulk access control service 2023-05-10 17:12:53 +02:00
Enea Jahollari
628732b932 [CST-9636] Show warning only when there are no controls and form is not disabled 2023-05-10 16:45:17 +02:00
Enea Jahollari
9da66a5cfd Merge remote-tracking branch 'origin/feature/CST-9636' into feature/CST-9636 2023-05-10 16:28:00 +02:00
Enea Jahollari
5f74446bf5 [CST-9636] Added jsdoc comments 2023-05-10 16:27:53 +02:00
Giuseppe Digilio
b279b97c37 [CST-9636] WIP Fix bulk-access-config-data.service 2023-05-10 16:23:27 +02:00
Enea Jahollari
4bf10c880a [CST-9636] Refactor access control array form to accept dropdown options 2023-05-10 16:02:01 +02:00
Giuseppe Digilio
5455c79563 [CST-9636] WIP add bulk-access-config-data.service 2023-05-10 15:53:00 +02:00
Giuseppe Digilio
079c79bb42 Merge branch 'feature/CST-9636' of bitbucket.org:4Science/dspace-angular into feature/CST-9636 2023-05-10 15:13:07 +02:00
Giuseppe Digilio
35d4561d53 [CST-9636] WIP improve bulk access page 2023-05-10 15:12:55 +02:00
Enea Jahollari
723e1e1278 [CST-9636] Make access control form container reusable 2023-05-10 15:11:44 +02:00
Enea Jahollari
52d72766ca [CST-9636] Reactor to use one component for all the access-control pages 2023-05-10 14:34:29 +02:00
Nona Luypaert
195ab41aac 101623: Themed BrowseByTaxonomyPageComponent 2023-05-10 13:39:57 +02:00
Nona Luypaert
8c6e3b0c1f 101623: Add new BrowseResponseParsingService and BrowseDefinitionRestRequest 2023-05-10 13:28:49 +02:00
Giuseppe Digilio
3924a82048 [CST-9636] Provide possibility to paginate a full list of elements 2023-05-10 13:08:08 +02:00
Nona Luypaert
c2f2cb5b3a 101623: Add HierarchicalBrowseDefinition model + base BrowseDefinition class 2023-05-10 11:32:18 +02:00
Giuseppe Digilio
581ed432f9 [CST-9636] Use show thumbnail flag for community and collection list elements 2023-05-10 11:09:41 +02:00
Nona Luypaert
c10e660e0b 101623: Refactor BrowseDefinition model/resource-type to FlatBrowseDefinition 2023-05-10 10:11:06 +02:00
Tim Donohue
d67cfaa278 Merge pull request #2236 from tdonohue/enable_vietnamese
Enable Vietnamese language pack
2023-05-09 17:08:10 -05:00
Tim Donohue
fbfe55db35 Enable Vietnamese language pack 2023-05-09 16:37:33 -05:00
Tim Donohue
6d531db20c Merge pull request #2210 from Zerosoul1990/Zerosoul1990/issue2172
Vietnamese translation!
2023-05-09 16:36:09 -05:00
Tim Donohue
7e3613fa9d Merge pull request #2220 from alexandrevryghem/fix-mobile-navbar-and-header-icon-css-variables
Fixed mobile navbar not expanding & use same css variable for all header icons
2023-05-09 14:37:48 -05:00
Giuseppe Digilio
06fef61f02 [CST-9636] Create page for bulk access 2023-05-09 18:39:04 +02:00
Giuseppe Digilio
cd1808d981 Merge branch 'feature/CST-9636' of bitbucket.org:4Science/dspace-angular into feature/CST-9636 2023-05-09 18:25:18 +02:00
Giuseppe Digilio
40cb6a18be [CST-9636] Add flag to show or not thumbnail along list element by component's input firstly 2023-05-09 18:25:05 +02:00
Alisa Ismailati
681ee6f816 [DURACOM-145] Handled collection step
on a submission form
2023-05-09 17:27:06 +02:00
Enea Jahollari
a088641e5c [CST-9636] Added select bitstreams modal and made it work 2023-05-09 16:41:40 +02:00
lotte
ed24204f89 101198: Made aria label i18n 2023-05-09 14:03:34 +02:00
Enea Jahollari
301863fb80 [CST-9636] Added translations and validations to item, community and collection access control 2023-05-09 12:42:08 +02:00
Kristof De Langhe
e9da5f0616 Merge remote-tracking branch 'atmire/Angular-15-upgrade' into w2p-101108_Angular-15-upgrade 2023-05-09 11:37:53 +02:00
Kristof De Langhe
2d326d1f46 101108: Fix SSR animation console error 2023-05-09 11:34:57 +02:00
Michael Spalti
508fa76e45 Updated comment. 2023-05-08 12:20:55 -07:00
Michael Spalti
77c19d9fb1 Updated mirador webpack configuration. 2023-05-08 11:54:40 -07:00
Tim Donohue
c233927c29 Merge pull request #2211 from enea4science/feature/8384-edit-item-curate
Fixes #8384: Added Curate tab in Edit Item page
2023-05-08 11:20:38 -05:00
Enea Jahollari
57eb6da97a fixup! Fix change detection issue 2023-05-08 14:57:20 +02:00
Gantner, Florian Klaus
9ab022c225 remove buggy translation object
fixes https://github.com/DSpace/dspace-angular/issues/2219 by removing the json object for key form.other-information which avoids to load subordinated translation keys
2023-05-08 09:17:13 +02:00
Alexandre Vryghem
74cd70d860 Fixed communities collection and sub-community sorting not working after page refresh 2023-05-07 23:36:14 +02:00
Alexandre Vryghem
548a5ccb79 Merge branch 'fix-metadata-fields-containing-dots_contribute-7.4' into fix-metadata-fields-containing-dots_contribute-main
# Conflicts:
#	src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html
#	src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts
2023-05-06 12:54:25 +02:00
Alexandre Vryghem
091d0fccf7 100553: Explicitly request EditInPlaceFieldComponent's metadata field suggestions with the sort by fieldName,ASC 2023-05-06 03:55:08 +02:00
LotteHofstede
2e3dc97e51 Merge branch 'main' into w2p-101198_in-place-links_contribute-main 2023-05-05 10:04:26 +02:00
lotte
325d7cc9e8 Added aria label to navbar search button 2023-05-05 09:53:29 +02:00
Art Lowel
f44bdc9c77 fix an issue where the current page would be used instead of a third party referrer 2023-05-04 17:41:47 +02:00
LotteHofstede
8c08e5384a Merge branch 'main' into w2p-97184_theme-feedback_contribute-main 2023-05-04 15:50:43 +02:00
lotte
f4cedeb576 Renamed context in remaining places 2023-05-04 15:18:00 +02:00
lotte
f944fbba37 Applied feedback for context name and missing context 2023-05-04 14:38:10 +02:00
lotte
f159590187 Added line breaks for clarity 2023-05-04 14:23:23 +02:00
lotte
130b0fad76 Added doc for some of the contexts 2023-05-04 14:20:53 +02:00
lotte
9439a51c5d 101198: Fixed issue with header search bar 2023-05-04 11:29:52 +02:00
Mark H. Wood
c21ab0a86f Enable line breaks in deposit license during submission. 2023-05-03 17:13:06 -04:00
Enea Jahollari
efedd10d9c [DURACOM-131] Add check to run the refresh only on browser 2023-05-03 17:25:25 +02:00
Enea Jahollari
c066bc9d54 [DURACOM-131] Added automatic refresh every 5 seconds if the status is running 2023-05-03 17:22:20 +02:00
Enea Jahollari
89eb4e3cb2 [DURACOM-131] Show output files in separate lines 2023-05-03 15:29:12 +02:00
Alisa Ismailati
13662e336d Merge branch 'DURACOM-134' of https://bitbucket.org/4Science/dspace-angular into DURACOM-134 2023-05-03 11:11:15 +02:00
Alisa Ismailati
7b19ba7be2 [DURACOM-134] Fixes 2023-05-03 11:11:10 +02:00
Alisa Ismailati
78a81cbb4b Merge branch 'DURACOM-133' of https://bitbucket.org/4Science/dspace-angular into DURACOM-133 2023-05-03 10:26:52 +02:00
Alisa Ismailati
06f3b68048 [DURACOM-133] Fixed failing test 2023-05-03 10:26:48 +02:00
Enea Jahollari
3a45ecf578 [CST-9636] Added bulk access condition options service 2023-05-03 09:31:01 +02:00
Art Lowel
f19daf54cb Merge branch 'add-referrer-to-pageview-event-7.2' into add-referrer-to-pageview-event-7.4 2023-05-02 18:31:06 +02:00
Art Lowel
bd4dbcf9ad Merge branch 'add-referrer-to-pageview-event-7.0' into add-referrer-to-pageview-event-7.2 2023-05-02 18:16:32 +02:00
Art Lowel
5aaa4ef371 ensure the rel="noopener" attribute is only set when target="_blank" and remove "noreferrer" in all cases 2023-05-02 18:11:57 +02:00
Art Lowel
27d3c58d00 add referrer to pageview events 2023-05-02 17:09:55 +02:00
Giuseppe Digilio
983769cf59 [DURACOM-133] Fix import paths 2023-05-02 15:52:24 +02:00
Giuseppe Digilio
6b9f6bf767 [DURACOM-134] Fix import paths 2023-05-02 15:49:41 +02:00
Sondissimo
dc3120234d Merge branch 'main' into DURACOM-138 2023-05-02 11:27:37 +02:00
Alexandre Vryghem
c042a5cf1a Fixed mobile nav not opening/displaying correctly 2023-05-01 14:41:19 +02:00
Alexandre Vryghem
ef9c42804c Fixed --ds-header-icon-color & --ds-header-icon-color-hover not being applied to all header icons 2023-05-01 14:41:19 +02:00
Alisa Ismailati
2895cfe083 [DURACOM-134] Administer workflow actions fixed 2023-04-28 18:03:52 +02:00
Yury Bondarenko
d98e44185c Update JavaScript target version 2023-04-28 18:02:18 +02:00
Yury Bondarenko
a94f729faa Lock webpack version to 5.76.1
This is a strict requirement of `@angular-devkit/build-angular` 15.2.5

Specifying the version as `@^5.0.0` causes multiple versions to be installed side by side, which leads to build issues.
Adding this "exact version dependency" gets rid of the warning but does not change yarn.lock (because that same version was already being resolved)
2023-04-28 18:01:42 +02:00
Tim Donohue
5e27741483 Merge pull request #2183 from atmire/w2p-100302_Live-import-issues-7.5
Fix Live Import issues
2023-04-28 09:59:39 -05:00
Enea Jahollari
3647292b8f [CST-9636] Added unit tests and the logic to create file object from payload 2023-04-28 16:47:07 +02:00
Sondissimo
3d9100f2d1 DURACOM-138 Added a single line in the process-parameters.component.html, we now check if the parameters selector for the process contains at least 1 value, if not, the selector box is not shown. 2023-04-28 16:40:15 +02:00
Yana De Pauw
2a90214778 Add typedocs 2023-04-28 14:19:44 +02:00
Alban Imami
90a1f25ba9 Work for signposting 2023-04-27 16:51:41 +02:00
Alisa Ismailati
8ec5d11fcc [DURACOM-133] Do not show edit/delete button
for observer
2023-04-27 15:58:37 +02:00
Nona Luypaert
0a2cc98524 Merge branch 'w2p-101127_browse-by-controlled-vocabulary' into w2p-101127_browse-by-controlled-vocabulary-7.6.0-next
Conflicts:
	src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.spec.ts
2023-04-27 14:43:43 +02:00
Nona Luypaert
2a84c42531 101393: Fix VocabularyTreeview tests + Remove template comments 2023-04-27 14:37:13 +02:00
Art Lowel
a5c300aebd refactor mulitselect mode to use labels instead of buttons 2023-04-27 14:10:43 +02:00
Nona Luypaert
835eb73e0e Merge remote-tracking branch 'upstream/main' into w2p-101127_browse-by-controlled-vocabulary-7.6.0-next
Conflicts:
	src/app/browse-by/browse-by-routing.module.ts
	src/app/browse-by/browse-by.module.ts
2023-04-27 12:03:01 +02:00
Nona Luypaert
da7c980ab1 101393: Add 'Browse by Subject Category' link to 'All of DSpace' 2023-04-27 11:04:41 +02:00
Nona Luypaert
09f3dddde4 101393: Fix breadcrumbs on BrowseByTaxonomyPage 2023-04-27 10:52:51 +02:00
Enea Jahollari
b1d33c83a6 fixup! Added Curate tab in Edit Item page 2023-04-27 09:41:40 +02:00
Yury Bondarenko
fe1be27d49 Bump Node heap size in CI 2023-04-26 18:46:01 +02:00
Nona Luypaert
ea297d1296 101353: Add tests for BrowseByTaxonomyPageComponent 2023-04-26 18:40:38 +02:00
Nona Luypaert
bb242d99a6 101353: Fix VocabularyTreeview onSelect being called twice 2023-04-26 18:37:55 +02:00
Nona Luypaert
14b053b704 101353: Add deselect Output in VocabularyTreeview 2023-04-26 17:46:10 +02:00
Nona Luypaert
03bf4befab 101353: Fix issues in BrowseByTaxonomyPage and VocabularyTreeview 2023-04-26 16:50:48 +02:00
Alisa Ismailati
c89adf4f81 [DURACOM-134] send-back action fixed 2023-04-26 15:33:02 +02:00
lotte
3ee09834b1 101289: #1578 Changed primarybitstream field to primaryBitstreamUUID 2023-04-26 13:47:39 +02:00
Enea Jahollari
496853671e [CST-9636] Added access control components in community, item and collection edit page 2023-04-26 12:35:50 +02:00
Nona Luypaert
a80cae8fb5 101353: Add browse link + queryparams in BrowseByTaxonomyPage 2023-04-26 12:14:09 +02:00
tuanvu
b83c218bf1 Update 2023-04-26 16:35:44 +07:00
lotte
94f52721d4 101289: #1578 Removed border from primaryBitstream switch 2023-04-26 11:29:17 +02:00
tuanvu
0dbbe6cb79 Update error 2023-04-26 16:29:12 +07:00
tuanvu
53b883cb42 Internalization (i18n): Vietnamese translation!
Fixes #2172
2023-04-26 16:21:58 +07:00
Enea Jahollari
2e6b1cc4ef Added Curate tab in Edit Item page 2023-04-26 11:21:05 +02:00
tuanvu
702f9cd4db Update Lang file 2023-04-26 16:06:02 +07:00
Nona Luypaert
6e7a8a992c 101127: Add VocabularyTreeview to BrowseByTaxonomyPage 2023-04-26 10:57:33 +02:00
tuanvu
618f03c8ca Update Locale 2023-04-26 15:55:52 +07:00
lotte
222c220c56 101289: #1578 fixed redirection bug 2023-04-26 10:54:36 +02:00
tuanvu
08b271095f Internalization (i18n): Vietnamese translation! 2023-04-26 14:46:32 +07:00
Nona Luypaert
99dd9d2de9 101127: Take activeModal out of VocabularyTreeviewComponent 2023-04-25 17:55:20 +02:00
lotte
7008afd05f 1578: primaryBitstream implementation 2023-04-25 16:12:00 +02:00
Kristof De Langhe
18e7de81d9 101108: Removal of webpack devDependency to solve conflict with @angular-devkit/build-angular 2023-04-25 15:51:41 +02:00
Kristof De Langhe
6152b30425 Merge branch 'main' into w2p-101108_Angular-15-upgrade 2023-04-25 15:33:56 +02:00
enea4science
b6dc8a8579 Merge branch '4Science:main' into main 2023-04-25 14:51:35 +02:00
Kristof De Langhe
051b17e0e4 101108: Automatic npx npm-check-updates --interactive 2023-04-25 14:38:49 +02:00
Kristof De Langhe
36f6110e58 101108: Automatic ng update @nicky-lenaers/ngx-scroll-to 2023-04-25 11:35:41 +02:00
Kristof De Langhe
e037d87084 101108: Automatic ng update ngx-infinite-scroll 2023-04-25 11:24:11 +02:00
Kristof De Langhe
41a265f755 101108: Automatic ng update @angular/cdk@15 2023-04-25 10:38:18 +02:00
Kristof De Langhe
0ceeeaf33f 101108: Automatic ng update @angular/cdk@14 2023-04-25 10:35:40 +02:00
Kristof De Langhe
d6da065068 101108: Automatic ng update ngx-pagination 2023-04-24 11:54:35 +02:00
Kristof De Langhe
ee4da3f541 101108: Automatic ng update @ngx-translate/core 2023-04-24 10:34:49 +02:00
Kristof De Langhe
1ba642719d 101108: Automatic ng update ng-mocks 2023-04-24 10:31:37 +02:00
Mark H. Wood
6adc9a1742 Make theme-able. 2023-04-21 09:55:18 -04:00
Mark H. Wood
4f83eaa53d Tidy up interface declarations. 2023-04-21 09:47:18 -04:00
Nona Luypaert
7f7ed17d6e 101127: Add multiSelect tests in VocabularyTreeviewComponent 2023-04-21 09:11:28 +02:00
Alexandre Vryghem
e0fb0e14a3 Show N/A when submitter has been removed 2023-04-20 17:47:23 +02:00
Adán Román Ruiz
b1605e095a Merge branch 'main' into DS-8636 2023-04-20 13:30:41 +02:00
aroman-arvo
9de002120d #8636 Request a Copy's "helpdesk" strategy requires authentication to respond 2023-04-20 11:12:37 +02:00
LotteHofstede
cc86ac5086 Merge branch 'main' into w2p-97184_theme-feedback_contribute-main 2023-04-20 10:47:04 +02:00
Kristof De Langhe
41e4e87061 100414: Add entities to allowed object route 2023-04-20 10:13:55 +02:00
lotte
1b9a85bde7 Merge branch 'main' into w2p-101198_in-place-links_contribute-main 2023-04-20 09:36:45 +02:00
uofmsean
b5f85c207c Merge branch 'main' into fix-2197-authority-key-lookup 2023-04-19 17:25:54 -05:00
Sean Kalynuk
73b2c0b29f Fix #2197 authority key lookup
Avoid an authority key lookup when it starts with "will be generated::"
2023-04-19 16:44:04 -05:00
Alexandre Vryghem
e0c3a22466 Merge remote-tracking branch 'origin/main' into retrieve-name-with-dsonameservice-main
# Conflicts:
#	src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.ts
2023-04-19 23:35:35 +02:00
Tim Donohue
4847fc6f7a Merge pull request #2156 from alexandrevryghem/fix-enabling-video-mediaviewer-without-image-mediaviewer-main
Made it possible to enable video viewer without also enabling image viewer
2023-04-19 16:21:02 -05:00
Tim Donohue
cefe1bfda3 Merge pull request #2187 from mspalti/shibboleth-refresh
Shibboleth page update after authentication
2023-04-19 16:08:31 -05:00
Tim Donohue
d9f6386b11 Merge pull request #2164 from alexandrevryghem/fixed-default-input-values-not-working_contribute-main
Fixed some themeable component default values not being overridable
2023-04-19 16:06:59 -05:00
Michael W Spalti
b1f3b785e1 Added typedoc and minor test update 2023-04-19 11:39:59 -07:00
Michael Spalti
e336660cdd lint fix 2023-04-19 11:39:59 -07:00
Michael Spalti
d8ee1f55f1 closing auth check subscription 2023-04-19 11:39:59 -07:00
Michael Spalti
0bf095a1d9 removed unused import 2023-04-19 11:39:59 -07:00
Michael Spalti
4c2a7a10c7 updated auth-cookie check 2023-04-19 11:39:59 -07:00
Michael Spalti
290a89909e Added check for external auth and page refresh 2023-04-19 11:39:59 -07:00
Tim Donohue
ade9533f4c Merge pull request #2194 from tdonohue/fix_item_request
Add missing export for ItemRequest module
2023-04-19 11:55:15 -05:00
lotte
559691be0e Merge branch 'main' into w2p-101198_in-place-links_contribute-main 2023-04-19 15:51:32 +02:00
lotte
43d5bf372b 101198: in place links replaced with buttons 2023-04-19 15:50:00 +02:00
Tim Donohue
3e02f22f47 Add missing export for ItemRequest module 2023-04-18 11:20:20 -05:00
Alexandre Vryghem
fc7997d8b8 100479: Removed the default input values to make it possible to override them in themes 2023-04-17 23:50:15 +02:00
Tim Donohue
8c8fad75fa Merge pull request #2193 from tdonohue/update_actions
Split Codecov GitHub action to separate job & add retries. Update other actions.
2023-04-17 16:49:15 -05:00
Tim Donohue
8ce1552bb1 Merge pull request #2186 from vlguerrero/spanish-translation-contribution
Update es.json5
2023-04-17 16:24:12 -05:00
Alexandre Vryghem
7b27251cf2 Merge remote-tracking branch 'upstream/main' into fixed-default-input-values-not-working_contribute-main
# Conflicts:
#	src/app/shared/search/themed-search.component.ts
2023-04-17 23:14:57 +02:00
Tim Donohue
88ba37e527 Fix warnings in action summary. Use new Yarn cache syntax. Update Cypress and remove unnecessary headless flag. 2023-04-17 16:02:02 -05:00
Alexandre Vryghem
80b90524b6 100479: Removed the default input values to make it possible to override them in themes 2023-04-17 22:49:22 +02:00
Alexandre Vryghem
38df774c9c Merge remote-tracking branch 'templates/dspace-7.4' into fixed-default-input-values-not-working_contribute-7.4 2023-04-17 22:48:54 +02:00
Tim Donohue
fef1ba9663 Update to latest version of actions 2023-04-17 15:07:09 -05:00
Tim Donohue
187cdd7ae2 Split Codecov upload into a separate job. Make it auto-retry up to five times 2023-04-17 15:06:51 -05:00
Nona Luypaert
f0d0cb5930 101127: Fix all tests related to VocabularyTreeview 2023-04-17 16:27:58 +02:00
Nona Luypaert
7a876c0276 101127: Refactor VocabularyTreeView to add multiSelect & checkboxes 2023-04-17 15:35:27 +02:00
Nona Luypaert
3da2b3c0ef 101127: Put modal from VocabularyTreeview in VocabularyTreeviewModal 2023-04-17 10:13:14 +02:00
Alexandre Vryghem
1752b1afd4 100479: Removed the default input values to make it possible to override them in themes 2023-04-17 00:15:24 +02:00
Alexandre Vryghem
d6147e5236 Fixed default @Input() values not working for themed components 2023-04-17 00:08:48 +02:00
Tim Donohue
3fcb1138e2 Merge pull request #2146 from amgciadev/fix-1702-b
Fix #1702 - Move item collection with inheritPolicies support
2023-04-14 14:50:29 -05:00
Nona Luypaert
f4efe00671 101127: Create BrowseByTaxonomyPageComponent 2023-04-14 19:41:41 +02:00
Tim Donohue
548ccf8b90 Merge pull request #2162 from TexasDigitalLibrary/DS-8668
DS-8668: adds check for HTTP 413 status code when importing an SAF file
2023-04-14 11:43:20 -05:00
Tim Donohue
e986f10e21 Merge pull request #2144 from atmire/fix-dso-edit-menu-dropdowns
Fix DSO edit menu dropdowns
2023-04-13 16:47:33 -05:00
Tim Donohue
a8515faa90 Merge pull request #2190 from tdonohue/solr_dir_fix
Fix Docker solr configset directories
2023-04-13 15:02:05 -05:00
Tim Donohue
f73fbc270f Fix solr configset directories 2023-04-13 14:16:33 -05:00
lotte
8136826c6d Added missing typedoc 2023-04-13 16:12:49 +02:00
lotte
17782b80cd Merge branch 'main' into w2p-97184_theme-feedback_contribute-main 2023-04-13 13:11:58 +02:00
Tim Donohue
d972036736 Merge pull request #2184 from TexasDigitalLibrary/DS-2077
DS-2077: removes external Google font
2023-04-12 16:57:49 -05:00
Tim Donohue
d8f367ce9c Merge pull request #2189 from tdonohue/docker_cleanup
Minor docker / compose updates based on recent changes to backend
2023-04-12 16:50:07 -05:00
Tim Donohue
b7bd6ef709 Merge pull request #2110 from atmire/add-json5-eslint-support
Added i18n ESLint support
2023-04-12 15:07:59 -05:00
Tim Donohue
113703ff6b Ensure default Dockerfile starts in dev mode & has appropriate memory allocated. Enhance comments in -dist.yml 2023-04-12 11:42:37 -05:00
Kristof De Langhe
4ed6ccebff 101108: Angular 15 upgrade - test build & run fixes 2023-04-12 17:47:40 +02:00
Kristof De Langhe
84f1fcbb35 101108: Angular 15 upgrade - resolve fix 2023-04-12 17:29:54 +02:00
Tim Donohue
72fad0a6c9 Update/Enhance Docker README with latest info 2023-04-12 09:53:45 -05:00
Tim Donohue
0f22978b2e Sync changes from Dspace/DSpace#8679 to dspace-angular docker scripts 2023-04-12 09:52:48 -05:00
Kristof De Langhe
5761698a0d 101108: Automatic ng update @angular-devkit/build-angular@15 2023-04-12 12:25:10 +02:00
Kristof De Langhe
585ef37243 101108: install fixes 2023-04-12 12:17:15 +02:00
Kristof De Langhe
6d855caa33 101108: Automatic ng update @ngrx/router-store@15 2023-04-12 12:07:38 +02:00
Kristof De Langhe
83acd1f4b4 101108: Automatic ng update @nguniversal/express-engine@15 2023-04-12 12:04:32 +02:00
Kristof De Langhe
29fe2ef954 101108: Automatic ng update @nguniversal/express-engine@14 2023-04-12 12:02:31 +02:00
Kristof De Langhe
d705de1b4f 101108: Automatic ng update ngx-ui-switch@14 2023-04-12 11:58:10 +02:00
Kristof De Langhe
6deba31828 101108: Automatic ng update @ngtools/webpack@15 2023-04-12 11:42:16 +02:00
Kristof De Langhe
8c3ec98db3 101108: Automatic ng update @angular-eslint/schematics@15 2023-04-12 11:40:05 +02:00
Kristof De Langhe
0327f1d856 101108: Automatic ng update @nguniversal/builders@15 2023-04-12 11:37:25 +02:00
Kristof De Langhe
2eb91add4d 101108: Automatic ng update @angular/core@15 @angular/cli@15 2023-04-12 11:34:26 +02:00
Kristof De Langhe
643e75a838 101108: Angular 14 upgrade - build fixes #1 2023-04-11 17:50:50 +02:00
Kristof De Langhe
59681ea54d 101108: Automatic ng update @angular-devkit/build-angular@14 2023-04-11 17:05:23 +02:00
Kristof De Langhe
4c10721e3a 101108: Automatic ng update @angular/cli@14 2023-04-11 16:43:04 +02:00
Kristof De Langhe
5fb237d905 101108: Automatic ng update @nguniversal/builders@14 2023-04-11 16:28:29 +02:00
Kristof De Langhe
859ffb5cdc 101108: Automatic ng update @angular-devkit/build-angular@14 2023-04-11 16:23:18 +02:00
Kristof De Langhe
d21ce38011 101108: Automatic ng update @angular/core@14 2023-04-11 16:18:20 +02:00
Tim Donohue
4e7cad9e17 Merge pull request #2137 from mark-cooper/dspace-angular-dist
Build & publish dspace/dspace-angular imgs with -dist suffix
2023-04-07 12:02:30 -05:00
Mark Cooper
7410141d3f Build & publish dspace/dspace-angular imgs with -dist suffix 2023-04-06 16:46:08 -07:00
Leonardo Guerrero
05d73abbe2 Update es.json5 2023-04-05 11:35:23 -05:00
Kristof De Langhe
b829335ba5 100414: Missing search_result statistics fix 2023-04-05 17:49:29 +02:00
Tim Donohue
1ba3a0572b Merge pull request #2185 from tdonohue/minor_cypress_updates
Minor cypress updates & stabilize e2e tests
2023-04-05 08:37:57 -05:00
Alexandre Vryghem
93ac1957c5 Merge branch 'fix-enabling-video-mediaviewer-without-image-mediaviewer-7.2' into fix-enabling-video-mediaviewer-without-image-mediaviewer-main
# Conflicts:
#	src/app/item-page/media-viewer/media-viewer.component.html
2023-04-04 22:11:26 +02:00
Alexandre Vryghem
4469918640 Show ThumbnailComponent as fallback instead of a MediaViewerImageComponent placeholder when only one of the mediaviewers options is enabled 2023-04-04 22:05:09 +02:00
Tim Donohue
ff5ccf30ee Minor update to latest Cypress 2023-04-04 14:08:34 -05:00
Tim Donohue
fb45f5f807 Remove flakey check for success alert box. Unnecessary for this test, and sometimes randomly fails (if alert box closes before it can be clicked closed) 2023-04-04 14:07:22 -05:00
Tim Donohue
a1f4d7d7b6 Merge pull request #2176 from pilasou/pilasou-translations-fr
Small updates to french translations
2023-04-04 12:07:33 -05:00
nwoodward
dc6fa35483 remove unused import 2023-04-04 12:04:32 -05:00
nwoodward
a3034dd5f8 remove external Google font 2023-04-04 12:02:20 -05:00
Yana De Pauw
59b417d3f4 Merge remote-tracking branch 'upstream/main' into w2p-100302_Live-import-issues-7.5 2023-04-04 11:09:01 +02:00
Alexandre Vryghem
afbd16d38d Merge remote-tracking branch 'upstream/main' into add-json5-eslint-support
# Conflicts:
#	src/assets/i18n/fi.json5
#	src/assets/i18n/fr.json5
2023-04-04 00:08:48 +02:00
Tim Donohue
afc147507c Merge pull request #2133 from alexandrevryghem/fix-missing-hints-and-required-attributes-main
Fix missing hints and error messages for input-type `list` & `tag`
2023-04-03 16:31:36 -05:00
Yana De Pauw
4ab9f7086b Merge branch 'w2p-100302_Live-import-issues' into w2p-100302_Live-import-issues-7.5 2023-04-03 17:55:37 +02:00
Yana De Pauw
3590582832 100302: Change error check to hasFailed 2023-04-03 17:48:30 +02:00
Alexandre Vryghem
751ce12f97 Merge branch 'fix-metadata-fields-containing-dots_contribute-7.4' into fix-metadata-fields-containing-dots_contribute-main 2023-04-03 14:46:23 +02:00
Alexandre Vryghem
24e6cdd3ec 100553: Removed possibility to updated schema name, element and qualifier 2023-04-03 14:33:52 +02:00
Alexandre Vryghem
f301be3eb2 Merge remote-tracking branch 'upstream/main' into retrieve-name-with-dsonameservice-main
# Conflicts:
#	src/app/browse-by/browse-by-date-page/browse-by-date-page.component.ts
2023-04-01 21:08:27 +02:00
Tim Donohue
6892489156 Merge pull request #2143 from CrisGuzmanS/issues/2140
disabled the posibility to change the collection for workflow items to prevent errors
2023-03-30 16:50:07 -05:00
Tim Donohue
8740eaf218 Merge pull request #2171 from mspalti/browse-start-year
Added upper limit to browse by date (year)
2023-03-30 15:12:24 -05:00
Michael Spalti
521b7d4db8 updated value param check 2023-03-30 11:09:02 -07:00
Michael Spalti
24cc3fb76e reverted browse-by-metadata change 2023-03-30 11:09:02 -07:00
Michael Spalti
5b33c49ccc Added upper limit to browse by date 2023-03-30 11:09:02 -07:00
Cristian Emanuelle Guzmán Suárez
bb8775a8f0 Update workflowitems-edit-page-routing.module.ts
avoiding trailing-space
2023-03-30 12:02:42 -06:00
Cristian Emanuelle Guzmán Suárez
0ffdda26dc Update workflowitems-edit-page-routing.module.ts
small change to re run test
2023-03-30 11:16:28 -06:00
cris
b5881a0ae9 modifying behavior of collectionModifiable 2023-03-30 16:51:08 +00:00
Cristian Emanuelle Guzmán Suárez
7fbec71002 Merge branch 'DSpace:main' into issues/2140 2023-03-30 10:16:42 -06:00
Pierre Lasou
0fbcf84125 Small updates to french translations
Adding corrections suggested in the following PR review: https://github.com/DSpace/dspace-angular/pull/2154
2023-03-30 11:50:16 -04:00
Alexandre Vryghem
9cc158230f Merge remote-tracking branch 'upstream/main' into fix-metadata-fields-containing-dots_contribute-main
# Conflicts:
#	src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.html
#	src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.spec.ts
#	src/app/item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts
2023-03-30 17:49:39 +02:00
Alexandre Vryghem
792a614631 100553: Set the maximum amount of metadata fields shown on EditInPlaceFieldComponent back to 10 2023-03-30 17:35:55 +02:00
Alexandre Vryghem
b00a0f5be9 100553: Added extra regex validation to prevent users from adding namespaces, elements and qualifiers with spaces
Minor fixes:
- Metadata Registry's name field was not being emptied after successful submission
- The first input from both forms both had the red error border after clearing the fields
2023-03-30 17:35:55 +02:00
Tim Donohue
1ddeeed081 Merge pull request #2127 from tdonohue/update_cypress_12
Upgrade to Cypress 12 for e2e tests
2023-03-30 10:22:06 -05:00
Yana De Pauw
057b54a667 Merge branch 'w2p-100302_Live-import-issues' into w2p-100302_Live-import-issues-7.5 2023-03-30 17:05:07 +02:00
Yana De Pauw
6c5ae4972e 100302: Add an error to prevent piping or subscribing to undefined when no href is present 2023-03-30 16:53:10 +02:00
Enea Jahollari
af9b4a292e Fix error message when updating ORCID settings 2023-03-30 12:28:48 +02:00
Alexandre Vryghem
690554d103 Merge remote-tracking branch 'upstream/main' into fix-enabling-video-mediaviewer-without-image-mediaviewer-main
# Conflicts:
#	src/app/item-page/simple/item-types/publication/publication.component.html
#	src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html
2023-03-29 10:12:16 +02:00
Tim Donohue
81087d3a2c Merge pull request #2154 from pilasou/pilasou-translations-fr
Update to fixe french labels for System-wide alert
2023-03-28 16:51:12 -05:00
Tim Donohue
f04f73edfa Merge pull request #2149 from alexandrevryghem/media-viewer-thumbnail-width_contribute-main
Media viewer thumbnails don't take viewport width into account
2023-03-28 16:20:20 -05:00
Tim Donohue
4ff68da423 Merge pull request #2166 from reetagithub/main
Update en.json5
2023-03-28 10:09:11 -05:00
Yana De Pauw
b86c467a1f Merge branch 'w2p-100302_Live-import-issues' into w2p-100302_Live-import-issues-7.5 2023-03-28 14:40:43 +02:00
Yana De Pauw
9f6616a5ce 100302: Add support to check if a request has a cached value 2023-03-28 14:38:44 +02:00
reetagithub
26f9c7e40f Update fi.json5
Harmonized some translations and translated the few new translations.
2023-03-28 12:44:34 +03:00
reetagithub
a2aa436c1d Update en.json5
Two typos corrected.
2023-03-28 10:24:01 +03:00
Yana De Pauw
3851884225 Merge remote-tracking branch 'upstream/main' into w2p-100302_Live-import-issues-7.5 2023-03-27 17:23:36 +02:00
Yana De Pauw
153a53f118 100302: Fix issues with live import 2023-03-27 16:31:26 +02:00
Alexandre Vryghem
918493ecb3 Merge branch 'fix-enabling-video-mediaviewer-without-image-mediaviewer-7.2' into fix-enabling-video-mediaviewer-without-image-mediaviewer-main 2023-03-26 01:04:19 +01:00
Alexandre Vryghem
43dd508b10 Fix placeholder not being shown for items with not THUMBNAIL bitstreams 2023-03-26 01:04:02 +01:00
Alexandre Vryghem
e14760a29b Merge remote-tracking branch 'upstream/main' into retrieve-name-with-dsonameservice-main
# Conflicts:
#	src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.ts
2023-03-24 23:26:30 +01:00
Alexandre Vryghem
0c47298194 Merge remote-tracking branch 'upstream/main' into add-json5-eslint-support
# Conflicts:
#	src/assets/i18n/hu.json5
2023-03-24 21:22:31 +01:00
Pierre Lasou
46a73e9c1b Fixing minor syntax problems
Added missing commas and missing "//" characters.
2023-03-24 14:15:07 -04:00
nwoodward
3a7ab491bf updated message to reflect only one file 2023-03-24 08:53:55 -05:00
nwoodward
b2a9c4f456 handle http status code 413 from the backend when an SAF file is larger than the limit 2023-03-24 08:48:19 -05:00
Alexandre Vryghem
a49c8cad99 Merge remote-tracking branch 'upstream/main' into fix-enabling-video-mediaviewer-without-image-mediaviewer-main
# Conflicts:
#	src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.ts
#	src/app/item-page/media-viewer/media-viewer.component.html
#	src/app/item-page/simple/item-types/publication/publication.component.html
#	src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html
2023-03-24 00:46:29 +01:00
Alexandre Vryghem
ebfef74adb Merge remote-tracking branch 'upstream/main' into media-viewer-thumbnail-width_contribute-main
# Conflicts:
#	src/app/item-page/simple/item-types/publication/publication.component.html
#	src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html
2023-03-24 00:18:33 +01:00
Tim Donohue
d0ccec9d0e Merge pull request #2126 from atmire/ensure-cookie-language-is-valid-main
Ensure cookie language is valid
2023-03-23 16:37:30 -05:00
Tim Donohue
943e1b4eef Merge pull request #2151 from alexandrevryghem/atmire-contributions-march-2023
New themed components
2023-03-23 15:12:18 -05:00
Tim Donohue
3588643731 Merge pull request #2142 from akoscomp/main
Update hu language file with dspace7.5 strings
2023-03-23 14:48:49 -05:00
Tim Donohue
ee705f0ccf Merge pull request #2130 from amanbudgujar/virsoftech-angular
EPerson creation page changed
2023-03-23 14:38:37 -05:00
Tim Donohue
b4042e712d Merge pull request #2148 from DSpace/dependabot/npm_and_yarn/webpack-5.76.0
Bump webpack from 5.75.0 to 5.76.0
2023-03-23 14:09:39 -05:00
Tim Donohue
80c3416214 Merge pull request #2139 from CrisGuzmanS/issues/2128
browse-by-metadata-page works correctly on numeric 'value' param
2023-03-23 11:43:25 -05:00
Enea Jahollari
081e44521a Merge branch 'main' into CST-7216 2023-03-23 12:01:27 +01:00
Enea Jahollari
b31fdf0be6 [CST-7216] Imported UploadModule in AdminModule to fix build error 2023-03-23 11:59:50 +01:00
Alexandre Vryghem
2f336ff8de Merge branch 'w2p-99465_themed-MediaViewerCompoent_contribute-7.2' into atmire-contributions-march-2023 2023-03-21 10:03:55 +01:00
Alexandre Vryghem
e426c1a4ef Fixed MediaViewerVideoComponent 2023-03-21 10:02:43 +01:00
Alexandre Vryghem
83444fc9c2 Merge remote-tracking branch 'upstream/main' into fix-enabling-video-mediaviewer-without-image-mediaviewer-7.2
# Conflicts:
#	src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.html
#	src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.ts
2023-03-19 23:37:35 +01:00
Alexandre Vryghem
aa4d56e2cf Made it possible to only enable video media viewer
Also:
- Filtered out non-supported media file types from the mediaViewers mediaList
- Fixed thumbnails not displaying with 0 ORIGINAL bitstreams
2023-03-19 21:22:57 +01:00
Pierre Lasou
58df43b852 Update to fixe french labels for System-wide alert
Add translations for the System wide alert feature as well other various missing parameters.
2023-03-17 15:02:07 -04:00
Alexandre Vryghem
5011ec672c Merge branch 'fix-rss-button-not-showing' into atmire-contributions-march-2023 2023-03-17 17:30:48 +01:00
Alexandre Vryghem
56d60820a5 96384: Fix RSS component sometimes not displaying when loaded to fast 2023-03-17 17:00:12 +01:00
Alexandre Vryghem
2d48c6369b Merge remote-tracking branch 'upstream/main' into retrieve-name-with-dsonameservice-main 2023-03-16 00:30:49 +01:00
Alexandre Vryghem
3b5829160b Merge branch 'retrieve-name-with-dsonameservice-7.4' into retrieve-name-with-dsonameservice-main 2023-03-16 00:26:55 +01:00
Alexandre Vryghem
2030b29ddc Fix scope name not being displayed after a page refresh & code cleanup 2023-03-16 00:26:11 +01:00
Alexandre Vryghem
21431f8111 Merge remote-tracking branch 'contributions/w2p-99464_add-missing-end-user-agreement-guards_contribute-7.2' 2023-03-15 17:37:52 +01:00
Alexandre Vryghem
4f87bab78c Merge remote-tracking branch 'alex/w2p-99465_themed-MediaViewerCompoent_contribute-7.2'
# Conflicts:
#	src/themes/custom/lazy-theme.module.ts
2023-03-15 17:22:50 +01:00
Alexandre Vryghem
daca70e6cb Merge remote-tracking branch 'atmire/issue-1833_entity-title-refactor_themed-ItemPageTitleFieldComponent-7.2'
# Conflicts:
#	src/app/entity-groups/journal-entities/item-pages/journal-issue/journal-issue.component.html
#	src/app/entity-groups/journal-entities/item-pages/journal-volume/journal-volume.component.html
#	src/app/entity-groups/journal-entities/item-pages/journal/journal.component.html
#	src/app/entity-groups/research-entities/item-pages/org-unit/org-unit.component.html
#	src/app/entity-groups/research-entities/item-pages/person/person.component.html
#	src/app/entity-groups/research-entities/item-pages/project/project.component.html
#	src/app/item-page/full/full-item-page.component.html
#	src/app/item-page/simple/item-types/publication/publication.component.html
#	src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html
#	src/app/shared/shared.module.ts
#	src/themes/custom/lazy-theme.module.ts
2023-03-15 17:15:05 +01:00
cris
385b72862e lint issues solved 2023-03-15 16:00:07 +00:00
Alexandre Vryghem
06f95da018 Merge remote-tracking branch 'alex/w2p-100079_themed-feedback-form-component_contribute-7.2'
# Conflicts:
#	src/themes/custom/lazy-theme.module.ts
2023-03-15 16:55:21 +01:00
Alexandre Vryghem
f1d675bbe2 Merge remote-tracking branch 'upstream/main' into media-viewer-thumbnail-width_contribute-main 2023-03-15 14:31:35 +01:00
Alexandre Vryghem
d60e358766 Fix media viewer thumbnails exceeding max width 2023-03-15 14:15:04 +01:00
dependabot[bot]
be484b1249 Bump webpack from 5.75.0 to 5.76.0
Bumps [webpack](https://github.com/webpack/webpack) from 5.75.0 to 5.76.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.75.0...v5.76.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-14 22:48:34 +00:00
Alexandre Vryghem
b63fa5f375 Themed MediaViewerVideoComponent 2023-03-14 14:26:51 +01:00
Alexandre Vryghem
f4e95946dc Themed MediaViewerImageComponent 2023-03-14 14:26:39 +01:00
Alexandre Vryghem
faec78a12e Themed MediaViewerComponent 2023-03-14 14:26:18 +01:00
Agustina Martinez
50d36231aa Add support to send inheritPolicies flag when moving item collection 2023-03-13 16:17:31 +00:00
cris
ebd8cbaaae avoid unnecesary assignment to this.value 2023-03-13 00:13:20 +00:00
cris
e4657b7d51 whitespace differences hiddne 2023-03-12 23:21:22 +00:00
Cristian Emanuelle Guzmán Suárez
a6bad9f142 Merge branch 'main' into issues/2128 2023-03-12 17:36:05 -06:00
cris
6983b40136 if data does not exist the undefined error is avoid 2023-03-12 21:13:17 +00:00
cris
12518dcc86 if collectionModiable does not exists is set as null 2023-03-12 20:49:01 +00:00
cris
22da2f7160 avoiding lint issues 2023-03-12 19:49:30 +00:00
cris
762bdafe5e Merge branch 'issues/2140' of https://github.com/CrisGuzmanS/dspace-angular into issues/2140 2023-03-12 19:39:41 +00:00
cris
f561ff8f35 collectionModifiable can be null 2023-03-12 19:39:26 +00:00
Cristian Emanuelle Guzmán Suárez
787c99bcde Merge branch 'DSpace:main' into issues/2140 2023-03-12 13:21:32 -06:00
Tim Donohue
694fa39a6e Merge pull request #2141 from CrisGuzmanS/issues/2044
pageSize applied in Recent Submissions
2023-03-10 12:55:05 -06:00
Tim Donohue
673d056554 Merge pull request #2132 from md1222/edit-bitstream
Fixed: Clear metadata if value has not set. Reference issue no #1612
2023-03-10 12:13:10 -06:00
Tim Donohue
42097b7802 Merge pull request #2083 from atmire/atmire-contributions-alex-7.5
New themed components
2023-03-10 12:02:49 -06:00
Tim Donohue
2326a2596f Merge pull request #2109 from vlguerrero/spanish-translation-contribution
Spanish translation contribution
2023-03-10 11:46:50 -06:00
Yury Bondarenko
7fb9c8a38a Fix DSO edit menu dropdowns 2023-03-10 11:36:40 +01:00
cris
1c2d96ce43 solving lint issues 2023-03-10 03:39:03 +00:00
cris
1ca8529440 collection is not modifiable in workflowitem section 2023-03-10 03:22:47 +00:00
cris
6e77140591 avoiding trailing space 2023-03-09 21:12:29 +00:00
cris
6493b62e6a adding sortConfig 2023-03-09 21:00:36 +00:00
akoscomp
22686d52da Update hu language file with dspace7.5 strings
Improve translationo
2023-03-09 21:31:47 +02:00
cris
9d1991eec1 pageSize applied in Recent Submissions 2023-03-09 18:39:13 +00:00
cris
293692f1d2 fixing lint issues 2023-03-09 15:45:55 +00:00
cris
e2cf97f8c1 browse-by-metadata-page works correctly on numeric 'value' param 2023-03-09 04:38:59 +00:00
Tim Donohue
6d1b9f3fa4 Ensure all SSR caching is disabled in CI environment 2023-03-07 16:38:25 -06:00
Tim Donohue
61ace6f831 Bug fix: generateViewEvent() requires Solr to commit stats immediately. 2023-03-07 15:02:31 -06:00
Tim Donohue
371bd072b3 Add generateViewEvent() util to generate stats in e2e tests. Refactored xsrf.interceptor.ts to move constants to a separate file so they can be reused in e2e tests easily. 2023-03-06 16:13:43 -06:00
Alexandre Vryghem
72dbb0fdef Themed FeedbackFormComponent 2023-03-06 22:09:34 +01:00
Mark H. Wood
1e7ede015b Don't allow the date picker to exceed the maximum start or end date for an access option. 2023-03-06 11:19:49 -05:00
Alexandre Vryghem
441eac2bf4 Merge remote-tracking branch 'upstream/main' into fix-missing-hints-and-required-attributes-main
# Conflicts:
#	src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts
#	src/app/shared/form/builder/ds-dynamic-form-ui/models/list/dynamic-list-checkbox-group.model.ts
2023-03-05 17:57:27 +01:00
Alexandre Vryghem
7720f38364 Fixed hints & required error messages for input-type list
- Added mapping for required & hint properties
- Set the required type on the checkbox group instead of on each checkbox individually
2023-03-05 14:30:04 +01:00
Lucky
c72ab68b65 Merge branch 'main' into edit-bitstream 2023-03-04 15:01:10 +05:30
Asif Mustaque
f2ecef8499 A tiny indentation fix 2023-03-04 12:29:08 +05:30
Alexandre Vryghem
79cb51b2c1 Fix hints not being displayed for dynamic array fields 2023-03-03 21:59:06 +01:00
Tim Donohue
48e95e262d Fix lint warnings by switching + to concat() 2023-03-03 12:53:27 -06:00
Tim Donohue
d38ba9cf0e Make statistics tests more stable by waiting on page to fully load 2023-03-03 12:53:27 -06:00
Tim Donohue
aa7c644e6a Minor configuration cleanup for Cypress 2023-03-03 10:49:06 -06:00
Tim Donohue
934c23a550 Fix accessibility issue where restricted objects have no name in statistics table 2023-03-03 10:49:06 -06:00
Tim Donohue
1ae3c183d4 Minor test cleanup after upgrade 2023-03-03 10:49:06 -06:00
Asif Mustaque
c9d261e68b Fix for issue #1612
Removes metadata field entry dc.description from the bitstream's metadata

Co-Authored-By: Aman Budgujar <amanbudgujar@gmail.com>
2023-03-03 18:57:24 +05:30
Aman Budgujar
3a2123f569 Changes associated with #2026
While creating a new EPerson -
* Reset password button is not displayed.
* Submit button label changed from 'Save' to 'Create'.
2023-03-03 10:56:29 +05:30
Aman Budgujar
7d0891f9f6 Revert "Changes associated with #2026"
This reverts commit 0090088cb3.
2023-03-03 10:48:34 +05:30
Alexandre Vryghem
83155062cf Merge remote-tracking branch 'upstream/main' into retrieve-name-with-dsonameservice-7.4
# Conflicts:
#	src/app/access-control/epeople-registry/epeople-registry.component.html
#	src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts
#	src/app/access-control/group-registry/group-form/group-form.component.spec.ts
#	src/app/access-control/group-registry/group-form/group-form.component.ts
#	src/app/access-control/group-registry/group-form/members-list/members-list.component.html
#	src/app/access-control/group-registry/group-form/members-list/members-list.component.ts
#	src/app/collection-page/edit-item-template-page/edit-item-template-page.component.html
#	src/app/item-page/full/field-components/file-section/full-file-section.component.ts
#	src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.ts
#	src/app/item-page/simple/field-components/file-section/file-section.component.html
#	src/app/item-page/simple/field-components/file-section/file-section.component.ts
#	src/app/item-page/versions/item-versions.component.ts
#	src/app/shared/auth-nav-menu/user-menu/user-menu.component.html
#	src/app/shared/auth-nav-menu/user-menu/user-menu.component.ts
#	src/app/shared/object-collection/shared/mydspace-item-submitter/item-submitter.component.html
2023-03-02 22:13:05 +01:00
Alexandre Vryghem
2513f91a1a Use DSONameService to display DSpaceObjects names 2023-03-02 19:40:36 +01:00
Aman Budgujar
5c27dca3d7 Revert "CSS changed for login-container #1952"
This reverts commit feb2d09d5a.
2023-03-02 18:51:39 +05:30
Aman Budgujar
0090088cb3 Changes associated with #2026
While creating a new EPerson -
* Reset password button is not displayed.
* Submit button label changed from 'Save' to 'Create'.
2023-03-02 18:47:59 +05:30
Aman Budgujar
4cf1feef07 Merge branch 'main' of https://github.com/amanbudgujar/dspace-angular 2023-03-02 18:18:52 +05:30
Tim Donohue
599e8a777e Update to latest cypress, cypress-axe and axe-core 2023-03-01 16:49:01 -06:00
Tim Donohue
f5d18edd06 Fix circulary dependency in our Cypress support code. 2023-03-01 16:39:35 -06:00
Tim Donohue
376788ea2e Automated upgrade to Cypress 12. 2023-03-01 16:39:31 -06:00
Tim Donohue
1d58910d70 Merge pull request #2085 from CrisGuzmanS/ul-and-li-in-dropdwon-collection-in-submissions-form
ID 469871. List or list item is not marked up properly.
2023-03-01 16:03:12 -06:00
Tim Donohue
eaa54dfcaf Merge pull request #2092 from CrisGuzmanS/issues/1186-470750
Buttons have same name but different actions.
2023-03-01 14:14:54 -06:00
Alexandre Vryghem
b8496df6aa Added missing EndUserAgreementCurrentUserGuard guards 2023-03-01 17:02:38 +01:00
cris
e80e56d78b erro fixed when dropdwon is closed 2023-03-01 03:31:31 +00:00
Cristian Emanuelle Guzmán Suárez
1ed3b9244f Merge branch 'DSpace:main' into ul-and-li-in-dropdwon-collection-in-submissions-form 2023-02-28 20:47:36 -06:00
Tim Donohue
00c5636c88 Merge pull request #2007 from arvoConsultores/DS-8408
In Advanced Search, list collections alphabetically
2023-02-28 16:58:14 -06:00
Tim Donohue
8264872f38 Merge pull request #2084 from CrisGuzmanS/role-in-tabs
ul and li replaced to role list and listitem
2023-02-28 16:28:11 -06:00
Cristian Emanuelle Guzmán Suárez
a2bd3be23f submission.workflow.generic.delete-help sentence make sense. 2023-02-28 16:24:13 -06:00
Alexandre Vryghem
019ef75804 Initialised EventEmitter submitSearch in ThemedSearchFormComponent 2023-02-28 23:05:19 +01:00
Tim Donohue
8bb73b3188 Merge pull request #2111 from atmire/fix-tests-upstream
Fix false positive tests caused by `fixture.debugElement.query().toBeDefined()` & `toBeUndefined()`
2023-02-28 15:04:25 -06:00
Tim Donohue
8d867a7a93 Merge pull request #2121 from CrisGuzmanS/issues/2089
avoiding drag and drop in put for multiple select option
2023-02-28 12:41:06 -06:00
Tim Donohue
d7977aba97 Merge pull request #2122 from atmire/atmire-css-contributions-main
Minor CSS fixes
2023-02-27 16:55:51 -06:00
Tim Donohue
07ee16aa8d Merge pull request #2113 from CrisGuzmanS/issues/1998
avoiding error when user unselect a filter option
2023-02-27 16:40:30 -06:00
Tim Donohue
e9f4d4574a Merge pull request #2117 from atmire/w2p-99615_misc-community-bug-fixes_contribute-main
Fixed UI issues #2087 and #2088
2023-02-27 16:00:52 -06:00
Alexandre Vryghem
d79dcbae73 94481: Themed ItemPageTitleFieldComponent 2023-02-27 17:25:08 +01:00
Alexandre Vryghem
ed998f41ce Merge remote-tracking branch 'upstream/main' into ensure-cookie-language-is-valid-7.2 2023-02-26 21:49:51 +01:00
Alexandre Vryghem
92f5c6f427 Do not use disabled or non-existing languages from language cookie 2023-02-26 21:39:10 +01:00
Alexandre Vryghem
200e95a390 Fix vertical alignment of text & buttons in tables 2023-02-26 00:53:26 +01:00
Alexandre Vryghem
1b46303539 Merge branch 'atmire-css-contributions-7.2' into atmire-css-contributions-main
# Conflicts:
#	src/app/admin/admin-registries/metadata-schema/metadata-schema.component.html
#	src/app/shared/log-in/log-in.component.html
2023-02-26 00:52:04 +01:00
cris
ec3f7736d4 avoiding drag and drop in put for multiple select option 2023-02-24 16:19:41 +00:00
Alexandre Vryghem
5398c06242 Fix alignment of input fields on metadata registry when only one input field has error 2023-02-24 01:19:28 +01:00
Alexandre Vryghem
af23a3a8e3 Fixed css issues of LogInComponent where text would overflow 2023-02-24 01:19:08 +01:00
lotte
e3fe80013c Merge branch 'w2p-99615_misc-community-bug-fixes_contribute-7.4' into w2p-99615_misc-community-bug-fixes_contribute-main 2023-02-23 15:55:20 +01:00
lotte
0a4f027129 99615: Fixed #2087 and #2088 2023-02-23 15:44:18 +01:00
lotte
d2871ea8a0 Solved test issues 2023-02-23 14:39:34 +01:00
lotte
ab78df2e68 Fixes after merge 2023-02-23 11:08:23 +01:00
lotte
c1a1d1a20e Merge branch 'w2p-99521_themed-top-level-communities-component_contribute-main' into w2p-97184_theme-feedback_contribute-main 2023-02-23 11:07:29 +01:00
Lucky
feb2d09d5a CSS changed for login-container #1952 2023-02-23 13:59:05 +05:30
lotte
55fcab1700 Merge branch 'w2p-99521_themed-top-level-communities-component_contribute-7.4' into w2p-99521_themed-top-level-communities-component_contribute-main 2023-02-22 16:14:25 +01:00
lotte
efe1d1085a Moved TopLevelCommunityComponent to Eager module 2023-02-22 16:12:40 +01:00
lotte
1c12977347 Merge branch 'w2p-99521_themed-top-level-communities-component_contribute-7.2' into w2p-99521_themed-top-level-communities-component_contribute-7.4 2023-02-22 16:08:36 +01:00
lotte
eff5f1b81a 99521: themed TopLevelCommunitiesComponent 2023-02-22 15:59:29 +01:00
Alexandre Vryghem
5e726f8916 Made private constructor arguments protected to be accessible in themed components 2023-02-22 14:28:15 +01:00
Alexandre Vryghem
64dd2e6344 Merge remote-tracking branch 'templates/w2p-91874_Authority-control_contribute-7.2' into atmire-contributions-alex-7.5
# Conflicts:
#	src/app/shared/form/form.module.ts
#	src/app/shared/shared.module.ts
#	src/themes/custom/lazy-theme.module.ts
2023-02-22 13:52:38 +01:00
Alexandre Vryghem
74ca23ec83 Merge branch 'w2p-98661_themed-FullFileSectionComponent-contribute-7.2' into atmire-contributions-alex-7.5
# Conflicts:
#	src/app/item-page/full/full-item-page.component.html
#	src/app/item-page/item-page.module.ts
#	src/themes/custom/lazy-theme.module.ts
2023-02-22 13:29:44 +01:00
cris
17afdfa34b avoiding error when user unselect a filter option 2023-02-21 22:44:45 +00:00
Alexandre Vryghem
553002406f Merge branch 'fix-tests-7.4' into fix-tests-upstream 2023-02-19 01:06:21 +01:00
Alexandre Vryghem
4f14d66400 Fixed lint issues 2023-02-19 01:04:25 +01:00
Alexandre Vryghem
b13f7cdf64 Merge remote-tracking branch 'upstream/main' into fix-tests-upstream 2023-02-19 00:49:30 +01:00
Alexandre Vryghem
f063b15fb4 Merge remote-tracking branch 'templates/w2p-97755_fix-spy-created-after-component_contribute-7.2' into fix-tests-upstream
# Conflicts:
#	src/app/admin/admin-sidebar/admin-sidebar.component.spec.ts
2023-02-19 00:48:24 +01:00
Alexandre Vryghem
718db3466d Fixed false positive tests caused by fixture.debugElement.query().toBeDefined() 2023-02-19 00:23:19 +01:00
Alexandre Vryghem
3c2f3d071f Fixed *.json5 linting issues 2023-02-18 19:52:39 +01:00
Alexandre Vryghem
5ccfeccb42 Added ESLint validation for *.json5 files 2023-02-18 19:48:48 +01:00
Alexandre Vryghem
008e089e62 Merge remote-tracking branch 'upstream/main' into atmire-contributions-alex-7.5
# Conflicts:
#	src/app/item-page/item-page.module.ts
#	src/app/shared/search/themed-search.component.ts
#	src/app/shared/shared.module.ts
#	src/themes/custom/eager-theme.module.ts
#	src/themes/custom/lazy-theme.module.ts
2023-02-18 13:19:08 +01:00
Leonardo Guerrero
7844a939ca Arranges after personal review 2023-02-17 22:27:49 -05:00
Leonardo Guerrero
9e03faac54 Fix some typo mistakes 2023-02-17 22:10:46 -05:00
Leonardo Guerrero
6078ca9e8a update es.json5 2023-02-17 21:57:49 -05:00
Tim Donohue
bbec2fd038 Update version tag for development of next release 2023-02-17 10:48:04 -06:00
Sufiyan Shaikh
98da08ead0 [CST-7216] Design fixes and parameter changed 2023-02-17 12:08:22 +01:00
Sufiyan Shaikh
e47b42bc89 [CST-7216] Angular: Import saf via URL 2023-02-17 12:07:52 +01:00
aroman-arvo
938bf33ad2 DS-8404 - fix config param name 2023-02-15 19:20:20 +01:00
cris
1d00b431ac aria-label added to edit, view and delete button 2023-02-14 03:18:28 +00:00
aroman-arvo
9a2b885501 DS-8498: ling fixes 2023-02-13 19:38:32 +01:00
aroman-arvo
742922dba0 DS-8408: Test cases and some fixes or comcol ordering 2023-02-13 19:32:47 +01:00
aroman-arvo
0121e6d895 DS-8408 - more lint problems 2023-02-13 12:34:13 +01:00
aroman-arvo
e2668cdf97 DS-8408 - lint errors 2023-02-13 12:22:07 +01:00
aroman-arvo
b015f682b4 Merge remote-tracking branch 'github/main' into DS-8408 2023-02-13 11:31:03 +01:00
aroman-arvo
eeda26e122 8408 - sort ordering is parametrized and used only when no text query is send. 2023-02-13 10:42:56 +01:00
Alexandre Vryghem
1d69e1581a 97755: Call spy before component is created 2023-02-10 18:00:42 +01:00
cris
e1beb61525 ul and li in dropdwon collection in submissions form 2023-02-09 21:44:02 +00:00
cris
e4e973bbef ul and li replaced to role list and listitem 2023-02-09 20:53:28 +00:00
lotte
458fe3c680 Merge remote-tracking branch 'origin/main' into w2p-97184_theme-feedback_contribute-main 2023-02-09 11:23:33 +01:00
Alexandre Vryghem
7edc1c1036 Merge branch 'w2p-94688_added-themeable-search-form-component' into atmire-contributions-alex-7.5 2023-02-08 23:04:52 +01:00
Alexandre Vryghem
b1077dad31 Merge remote-tracking branch 'templates/w2p-97729_themed-ItemAlertsComponent_contribute-7.4' into atmire-contributions-alex-7.5
# Conflicts:
#	src/app/item-page/alerts/themed-item-alerts.component.ts
#	src/app/shared/shared.module.ts
#	src/themes/custom/lazy-theme.module.ts
2023-02-08 22:56:08 +01:00
Alexandre Vryghem
b3c65f59a4 97281: Added ItemSearchResultListElementComponent & PublicationSidebarSearchListElementComponent to custom theme 2023-02-08 21:33:06 +01:00
Alexandre Vryghem
e8dda89f19 Merge remote-tracking branch 'templates/w2p-98819_themed-starts-with-components_contribute-7.0' into atmire-contributions-alex-7.5
# Conflicts:
#	src/themes/custom/entry-components.ts
#	src/themes/custom/lazy-theme.module.ts
2023-02-08 21:29:20 +01:00
Alexandre Vryghem
827aa1f045 Merge remote-tracking branch 'atmire/w2p-98891_pass-default-query-to-search_contribute-7.2' into atmire-contributions-alex-7.5
# Conflicts:
#	src/app/shared/search/search.component.ts
2023-02-08 21:22:22 +01:00
lotte
3faf244259 Merge branch 'main' into w2p-97184_theme-feedback_contribute-main 2023-02-02 14:35:13 +01:00
Alexandre Vryghem
c6ecc0cbd4 98891: DsDynamicLookupRelationSearchTabComponent should have the form value already filled in the search input 2023-01-31 15:51:55 +01:00
Alexandre Vryghem
fbeaec1a54 98891: Make it possible to provide query to SearchComponent 2023-01-31 15:16:44 +01:00
lotte
3a6c2a4a8d Ran lint fixes 2023-01-25 09:30:50 +01:00
lotte
0a889f67b6 Merge branch 'w2p-97184_theme-feedback_contribute-7.4' into w2p-97184_theme-feedback_contribute-main 2023-01-25 09:13:05 +01:00
lotte
7cedb9415f Merge branch 'w2p-97184_theme-feedback_contribute-7.2' into w2p-97184_theme-feedback_contribute-7.4 2023-01-25 09:12:48 +01:00
lotte
c294ddf565 Fixed issue with detail page badges 2023-01-25 09:11:46 +01:00
lotte
2ff7ea43cf Fixed import issue 2023-01-25 09:10:26 +01:00
lotte
99e83b3e70 Merge branch 'w2p-97184_theme-feedback_contribute-7.4' into w2p-97184_theme-feedback_contribute-main 2023-01-24 18:18:35 +01:00
lotte
3a2f15d1ef Fixed issues with badges and moved access status into ds-badges 2023-01-24 18:13:50 +01:00
lotte
36b4d08779 Put accidentally moved components back 2023-01-24 14:23:48 +01:00
lotte
666ffda1df Fixed merge issue 2023-01-24 13:48:04 +01:00
lotte
eccd67d131 Merge branch 'w2p-97184_theme-feedback_contribute-7.2' into w2p-97184_theme-feedback_contribute-7.4 2023-01-24 13:47:35 +01:00
lotte
a475fa10be Fixed more tests and imports 2023-01-24 13:28:02 +01:00
lotte
906c26bbe4 Revert "Made ListableObjectComponentLoaderComponent themeable"
This reverts commit a4679ca7
2023-01-24 09:51:33 +01:00
lotte
1f2897664a Fixing tests 2023-01-24 09:30:45 +01:00
lotte
d7b38b2a78 Fixed issues with new badges 2023-01-24 08:24:37 +01:00
Alexandre Vryghem
d49ae535a1 98819: Added StartsWithDateComponent & StartsWithTextComponent to custom folder 2023-01-23 18:24:14 +01:00
lotte
69342e7f69 Merge branch 'w2p-97184_theme-feedback_contribute-7.2' into w2p-97184_theme-feedback_contribute-7.4 2023-01-23 16:58:52 +01:00
lotte
85562679a2 Refactored item list badges 2023-01-23 16:54:16 +01:00
lotte
a27a27905f Merge branch 'w2p-97184_theme-feedback_contribute-7.4' into w2p-97184_theme-feedback_contribute-main 2023-01-23 13:48:47 +01:00
lotte
4682507b25 Fixed in/outputs that changed for themed components 2023-01-23 13:48:30 +01:00
lotte
7ac4fbc387 Merge branch 'w2p-97184_theme-feedback_contribute-7.2' into w2p-97184_theme-feedback_contribute-7.4 2023-01-23 13:32:39 +01:00
lotte
ff98a9bcd8 Fixed ThemedListableObjectComponentLoader 2023-01-23 13:32:25 +01:00
lotte
7abcea1d03 Merge branch 'w2p-97184_theme-feedback_contribute-7.4' into w2p-97184_theme-feedback_contribute-main 2023-01-23 12:54:14 +01:00
lotte
ab0ff30886 Merge branch 'main' into w2p-97184_theme-feedback_contribute-main 2023-01-23 12:48:37 +01:00
lotte
5351ba6c55 Merge branch 'dspace-7.4' into w2p-97184_theme-feedback_contribute-7.4 2023-01-23 12:46:38 +01:00
lotte
a4679ca7e5 Made ListableObjectComponentLoaderComponent themeable 2023-01-23 12:33:01 +01:00
lotte
6114337660 Split up process module to be importable 2023-01-23 12:16:05 +01:00
Alexandre Vryghem
660a6dbd56 98661: Created themeable FullFileSectionComponent 2023-01-19 15:33:18 +01:00
aroman-arvo
6523b02913 DS-8408: Edit item is ordered by relevance 2023-01-16 13:09:05 +01:00
Adán Román Ruiz
4e0a0a0105 Merge branch 'DSpace:main' into DS-8408 2023-01-16 09:54:22 +01:00
Adán Román Ruiz
f790d29355 Merge branch 'main' into DS-8408 2023-01-11 19:13:54 +01:00
lotte
bcb27f666a replace ds-search-sidebar with ds-themed-search-sidebar 2023-01-11 15:14:19 +01:00
Kristof De Langhe
35a9e7cdc9 Merge remote-tracking branch 'dspace/main' into w2p-98422_Thumbnail-uploader_contribute-7.2 2023-01-11 15:03:27 +01:00
Kristof De Langhe
4ba64fdfcc 98422: Remove unused import 2023-01-11 14:55:16 +01:00
Kristof De Langhe
de7fcb30da 98422: Themed component import fixes 2023-01-11 14:49:21 +01:00
lotte
cb982d6552 Made SearchSidebarComponent themeable 2023-01-11 14:46:37 +01:00
Kristof De Langhe
c3d71cbdd6 98422: Themed ItemStatusComponent and EditBitstreamPageComponent 2023-01-11 14:18:20 +01:00
lotte
7926277acd added new input to ThemedSearchFiltersComponent 2023-01-11 11:24:42 +01:00
lotte
e135b014be Merge branch 'main' into w2p-97184_theme-feedback_contribute-7.2 2023-01-11 10:56:11 +01:00
lotte
9fdac08c67 removed unnecessary text in html file 2023-01-11 10:53:32 +01:00
lotte
9979d8664d Made SearchFiltersComponent themeable 2023-01-11 10:27:30 +01:00
Yana De Pauw
3fd4be9929 Merge remote-tracking branch 'upstream/main' into default-configuration-fix 2023-01-02 16:01:01 +01:00
Alexandre Vryghem
2451bbbd34 97729: Themed ItemAlertsComponent 2022-12-21 14:48:14 +01:00
Adan Roman
d6402fbaf8 DS-8408 - Unused dependency 2022-12-21 08:31:42 +01:00
Adan Roman
c2b56c1fa4 DS-8408 - In Advanced Search, list collections alphabetically 2022-12-20 17:23:03 +01:00
Adan Roman
8949e7cc27 DS-8408 - In Advanced Search, list collections alphabetically 2022-12-20 15:42:56 +01:00
Yana De Pauw
95ed5087d3 Merge branch 'default-configuration-fix-7.2' into default-configuration-fix 2022-12-13 16:07:35 +01:00
Yana De Pauw
cceea734b3 97248: Remove hardcoded 'default' configuration 2022-12-12 11:43:56 +01:00
Alexandre Vryghem
ba15b28c7c 94688: Added themeable template of SearchFormComponent 2022-12-01 10:28:15 +01:00
Alexandre Vryghem
e96954cf60 94688: Added ThemedSearchFormComponent 2022-12-01 10:27:10 +01:00
Kristof De Langhe
86e084bf05 90761: themed component calls 2022-05-30 16:27:28 +02:00
Kristof De Langhe
7eaa50949d 90761: Themed DsDynamicLookupRelationExternalSourceTabComponent 2022-05-30 14:53:43 +02:00
Kristof De Langhe
2340164394 91874: Themed DsDynamicLookupRelationSearchTabComponent and MetadataRepresentationListComponent 2022-05-27 17:21:21 +02:00
1523 changed files with 104115 additions and 52981 deletions

View File

@@ -1,17 +0,0 @@
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# For the full list of supported browsers by the Angular framework, please see:
# https://angular.io/guide/browser-support
# You can see what browsers were selected by your queries by running:
# npx browserslist
last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
Firefox ESR
not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line.

View File

@@ -15,3 +15,6 @@ trim_trailing_whitespace = false
[*.ts]
quote_type = single
[*.json5]
ij_json_keep_blank_lines_in_code = 3

View File

@@ -7,7 +7,8 @@
"eslint-plugin-jsdoc",
"eslint-plugin-deprecation",
"unused-imports",
"eslint-plugin-lodash"
"eslint-plugin-lodash",
"eslint-plugin-jsonc"
],
"overrides": [
{
@@ -224,6 +225,42 @@
"@angular-eslint/template/no-negated-async": "off",
"@angular-eslint/template/eqeqeq": "off"
}
},
{
"files": [
"*.json5"
],
"extends": [
"plugin:jsonc/recommended-with-jsonc"
],
"rules": {
"no-irregular-whitespace": "error",
"no-trailing-spaces": "error",
"jsonc/comma-dangle": [
"error",
"always-multiline"
],
"jsonc/indent": [
"error",
2
],
"jsonc/key-spacing": [
"error",
{
"beforeColon": false,
"afterColon": true,
"mode": "strict"
}
],
"jsonc/no-dupe-keys": "off",
"jsonc/quotes": [
"error",
"double",
{
"avoidEscape": false
}
]
}
}
]
}

View File

@@ -1,26 +0,0 @@
# This workflow runs whenever a new pull request is created
# TEMPORARILY DISABLED. Unfortunately this doesn't work for PRs created from forked repositories (which is how we tend to create PRs).
# There is no known workaround yet. See https://github.community/t/how-to-use-github-token-for-prs-from-forks/16818
name: Pull Request opened
# Only run for newly opened PRs against the "main" branch
on:
pull_request:
types: [opened]
branches:
- main
jobs:
automation:
runs-on: ubuntu-latest
steps:
# Assign the PR to whomever created it. This is useful for visualizing assignments on project boards
# See https://github.com/marketplace/actions/pull-request-assigner
- name: Assign PR to creator
uses: thomaseizinger/assign-pr-creator-action@v1.0.0
# Note, this authentication token is created automatically
# See: https://docs.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
# Ignore errors. It is possible the PR was created by someone who cannot be assigned
continue-on-error: true

View File

@@ -15,15 +15,26 @@ jobs:
env:
# The ci step will test the dspace-angular code against DSpace REST.
# Direct that step to utilize a DSpace REST service that has been started in docker.
# NOTE: These settings should be kept in sync with those in [src]/docker/docker-compose-ci.yml
DSPACE_REST_HOST: 127.0.0.1
DSPACE_REST_PORT: 8080
DSPACE_REST_NAMESPACE: '/server'
DSPACE_REST_SSL: false
# Spin up UI on 127.0.0.1 to avoid host resolution issues in e2e tests with Node 18+
DSPACE_UI_HOST: 127.0.0.1
DSPACE_UI_PORT: 4000
# Ensure all SSR caching is disabled in test environment
DSPACE_CACHE_SERVERSIDE_BOTCACHE_MAX: 0
DSPACE_CACHE_SERVERSIDE_ANONYMOUSCACHE_MAX: 0
# Tell Cypress to run e2e tests using the same UI URL
CYPRESS_BASE_URL: http://127.0.0.1:4000
# When Chrome version is specified, we pin to a specific version of Chrome
# Comment this out to use the latest release
#CHROME_VERSION: "90.0.4430.212-1"
# Bump Node heap size (OOM in CI after upgrading to Angular 15)
NODE_OPTIONS: '--max-old-space-size=4096'
# Project name to use when running "docker compose" prior to e2e tests
COMPOSE_PROJECT_NAME: 'ci'
strategy:
# Create a matrix of Node versions to test against (in parallel)
matrix:
@@ -34,11 +45,11 @@ jobs:
steps:
# https://github.com/actions/checkout
- name: Checkout codebase
uses: actions/checkout@v3
uses: actions/checkout@v4
# https://github.com/actions/setup-node
- name: Install Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
@@ -61,9 +72,9 @@ jobs:
# https://github.com/actions/cache/blob/main/examples.md#node---yarn
- name: Get Yarn cache directory
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Cache Yarn dependencies
uses: actions/cache@v3
uses: actions/cache@v4
with:
# Cache entire Yarn cache directory (see previous step)
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
@@ -86,30 +97,33 @@ jobs:
- name: Run specs (unit tests)
run: yarn run test:headless
# Upload code coverage report to artifact (for one version of Node only),
# so that it can be shared with the 'codecov' job (see below)
# NOTE: Angular CLI only supports code coverage for specs. See https://github.com/angular/angular-cli/issues/6286
# Upload coverage reports to Codecov (for one version of Node only)
# https://github.com/codecov/codecov-action
- name: Upload coverage to Codecov.io
uses: codecov/codecov-action@v3
if: matrix.node-version == '16.x'
- name: Upload code coverage report to Artifact
uses: actions/upload-artifact@v4
if: matrix.node-version == '18.x'
with:
name: coverage-report-${{ matrix.node-version }}
path: 'coverage/dspace-angular/lcov.info'
retention-days: 14
# Using docker-compose start backend using CI configuration
# Using "docker compose" start backend using CI configuration
# and load assetstore from a cached copy
- name: Start DSpace REST Backend via Docker (for e2e tests)
run: |
docker-compose -f ./docker/docker-compose-ci.yml up -d
docker-compose -f ./docker/cli.yml -f ./docker/cli.assetstore.yml run --rm dspace-cli
docker compose -f ./docker/docker-compose-ci.yml up -d
docker compose -f ./docker/cli.yml -f ./docker/cli.assetstore.yml run --rm dspace-cli
docker container ls
# Run integration tests via Cypress.io
# https://github.com/cypress-io/github-action
# (NOTE: to run these e2e tests locally, just use 'ng e2e')
- name: Run e2e tests (integration tests)
uses: cypress-io/github-action@v4
uses: cypress-io/github-action@v6
with:
# Run tests in Chrome, headless mode
# Run tests in Chrome, headless mode (default)
browser: chrome
headless: true
# Start app before running tests (will be stopped automatically after tests finish)
start: yarn run serve:ssr
# Wait for backend & frontend to be available
@@ -121,19 +135,19 @@ jobs:
# Cypress always creates a video of all e2e tests (whether they succeeded or failed)
# Save those in an Artifact
- name: Upload e2e test videos to Artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
if: always()
with:
name: e2e-test-videos
name: e2e-test-videos-${{ matrix.node-version }}
path: cypress/videos
# If e2e tests fail, Cypress creates a screenshot of what happened
# Save those in an Artifact
- name: Upload e2e test failure screenshots to Artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
if: failure()
with:
name: e2e-test-screenshots
name: e2e-test-screenshots-${{ matrix.node-version }}
path: cypress/screenshots
- name: Stop app (in case it stays up after e2e tests)
@@ -168,4 +182,38 @@ jobs:
run: kill -9 $(lsof -t -i:4000)
- name: Shutdown Docker containers
run: docker-compose -f ./docker/docker-compose-ci.yml down
run: docker compose -f ./docker/docker-compose-ci.yml down
# Codecov upload is a separate job in order to allow us to restart this separate from the entire build/test
# job above. This is necessary because Codecov uploads seem to randomly fail at times.
# See https://community.codecov.com/t/upload-issues-unable-to-locate-build-via-github-actions-api/3954
codecov:
# Must run after 'tests' job above
needs: tests
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
# Download artifacts from previous 'tests' job
- name: Download coverage artifacts
uses: actions/download-artifact@v4
# Now attempt upload to Codecov using its action.
# NOTE: We use a retry action to retry the Codecov upload if it fails the first time.
#
# Retry action: https://github.com/marketplace/actions/retry-action
# Codecov action: https://github.com/codecov/codecov-action
- name: Upload coverage to Codecov.io
uses: Wandalen/wretry.action@v1.3.0
with:
action: codecov/codecov-action@v4
# Ensure codecov-action throws an error when it fails to upload
# This allows us to auto-restart the action if an error is thrown
with: |
fail_ci_if_error: true
token: ${{ secrets.CODECOV_TOKEN }}
# Try re-running action 5 times max
attempt_limit: 5
# Run again in 30 seconds
attempt_delay: 30000

View File

@@ -5,12 +5,16 @@
# because CodeQL requires a fresh build with all tests *disabled*.
name: "Code Scanning"
# Run this code scan for all pushes / PRs to main branch. Also run once a week.
# Run this code scan for all pushes / PRs to main or maintenance branches. Also run once a week.
on:
push:
branches: [ main ]
branches:
- main
- 'dspace-**'
pull_request:
branches: [ main ]
branches:
- main
- 'dspace-**'
# Don't run if PR is only updating static documentation
paths-ignore:
- '**/*.md'
@@ -31,7 +35,7 @@ jobs:
steps:
# https://github.com/actions/checkout
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
# https://github.com/github/codeql-action

View File

@@ -3,6 +3,9 @@ name: Docker images
# Run this Build for all pushes to 'main' or maintenance branches, or tagged releases.
# Also run for PRs to ensure PR doesn't break Docker build process
# NOTE: uses "reusable-docker-build.yml" in DSpace/DSpace to actually build each of the Docker images
# https://github.com/DSpace/DSpace/blob/dspace-7_x/.github/workflows/reusable-docker-build.yml
#
on:
push:
branches:
@@ -16,75 +19,41 @@ permissions:
contents: read # to fetch code (actions/checkout)
jobs:
docker:
#############################################################
# Build/Push the 'dspace/dspace-angular' image
#############################################################
dspace-angular:
# Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace-angular'
if: github.repository == 'dspace/dspace-angular'
runs-on: ubuntu-latest
env:
# Define tags to use for Docker images based on Git tags/branches (for docker/metadata-action)
# For a new commit on default branch (main), use the literal tag 'dspace-7_x' on Docker image.
# For a new commit on other branches, use the branch name as the tag for Docker image.
# For a new tag, copy that tag name as the tag for Docker image.
IMAGE_TAGS: |
type=raw,value=dspace-7_x,enable=${{ endsWith(github.ref, github.event.repository.default_branch) }}
type=ref,event=branch,enable=${{ !endsWith(github.ref, github.event.repository.default_branch) }}
type=ref,event=tag
# Define default tag "flavor" for docker/metadata-action per
# https://github.com/docker/metadata-action#flavor-input
# We turn off 'latest' tag by default.
TAGS_FLAVOR: |
latest=false
# Architectures / Platforms for which we will build Docker images
# If this is a PR, we ONLY build for AMD64. For PRs we only do a sanity check test to ensure Docker builds work.
# If this is NOT a PR (e.g. a tag or merge commit), also build for ARM64.
PLATFORMS: linux/amd64${{ github.event_name != 'pull_request' && ', linux/arm64' || '' }}
# Use the reusable-docker-build.yml script from DSpace/DSpace repo to build our Docker image
uses: DSpace/DSpace/.github/workflows/reusable-docker-build.yml@dspace-7_x
with:
build_id: dspace-angular-dev
image_name: dspace/dspace-angular
dockerfile_path: ./Dockerfile
secrets:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_ACCESS_TOKEN: ${{ secrets.DOCKER_ACCESS_TOKEN }}
steps:
# https://github.com/actions/checkout
- name: Checkout codebase
uses: actions/checkout@v3
# https://github.com/docker/setup-buildx-action
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v2
# https://github.com/docker/setup-qemu-action
- name: Set up QEMU emulation to build for multiple architectures
uses: docker/setup-qemu-action@v2
# https://github.com/docker/login-action
- name: Login to DockerHub
# Only login if not a PR, as PRs only trigger a Docker build and not a push
if: github.event_name != 'pull_request'
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
###############################################
# Build/Push the 'dspace/dspace-angular' image
###############################################
# https://github.com/docker/metadata-action
# Get Metadata for docker_build step below
- name: Sync metadata (tags, labels) from GitHub to Docker for 'dspace-angular' image
id: meta_build
uses: docker/metadata-action@v4
with:
images: dspace/dspace-angular
tags: ${{ env.IMAGE_TAGS }}
flavor: ${{ env.TAGS_FLAVOR }}
# https://github.com/docker/build-push-action
- name: Build and push 'dspace-angular' image
id: docker_build
uses: docker/build-push-action@v3
with:
context: .
file: ./Dockerfile
platforms: ${{ env.PLATFORMS }}
# For pull requests, we run the Docker build (to ensure no PR changes break the build),
# but we ONLY do an image push to DockerHub if it's NOT a PR
push: ${{ github.event_name != 'pull_request' }}
# Use tags / labels provided by 'docker/metadata-action' above
tags: ${{ steps.meta_build.outputs.tags }}
labels: ${{ steps.meta_build.outputs.labels }}
#############################################################
# Build/Push the 'dspace/dspace-angular' image ('-dist' tag)
#############################################################
dspace-angular-dist:
# Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace-angular'
if: github.repository == 'dspace/dspace-angular'
# Use the reusable-docker-build.yml script from DSpace/DSpace repo to build our Docker image
uses: DSpace/DSpace/.github/workflows/reusable-docker-build.yml@dspace-7_x
with:
build_id: dspace-angular-dist
image_name: dspace/dspace-angular
dockerfile_path: ./Dockerfile.dist
# As this is a "dist" image, its tags are all suffixed with "-dist". Otherwise, it uses the same
# tagging logic as the primary 'dspace/dspace-angular' image above.
tags_flavor: suffix=-dist
secrets:
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
DOCKER_ACCESS_TOKEN: ${{ secrets.DOCKER_ACCESS_TOKEN }}
# Enable redeploy of sandbox & demo if the branch for this image matches the deployment branch of
# these sites as specified in reusable-docker-build.xml
REDEPLOY_SANDBOX_URL: ${{ secrets.REDEPLOY_SANDBOX_URL }}
REDEPLOY_DEMO_URL: ${{ secrets.REDEPLOY_DEMO_URL }}

View File

@@ -16,7 +16,7 @@ jobs:
# Only add to project board if issue is flagged as "needs triage" or has no labels
# NOTE: By default we flag new issues as "needs triage" in our issue template
if: (contains(github.event.issue.labels.*.name, 'needs triage') || join(github.event.issue.labels.*.name) == '')
uses: actions/add-to-project@v0.3.0
uses: actions/add-to-project@v1.0.0
# Note, the authentication token below is an ORG level Secret.
# It must be created/recreated manually via a personal access token with admin:org, project, public_repo permissions
# See: https://docs.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token#permissions-for-the-github_token

View File

@@ -1,11 +1,12 @@
# This workflow checks open PRs for merge conflicts and labels them when conflicts are found
name: Check for merge conflicts
# Run whenever the "main" branch is updated
# NOTE: This means merge conflicts are only checked for when a PR is merged to main.
# Run this for all pushes (i.e. merges) to 'main' or maintenance branches
on:
push:
branches: [ main ]
branches:
- main
- 'dspace-**'
# So that the `conflict_label_name` is removed if conflicts are resolved,
# we allow this to run for `pull_request_target` so that github secrets are available.
pull_request_target:
@@ -23,7 +24,9 @@ jobs:
steps:
# See: https://github.com/prince-chrismc/label-merge-conflicts-action
- name: Auto-label PRs with merge conflicts
uses: prince-chrismc/label-merge-conflicts-action@v2
uses: prince-chrismc/label-merge-conflicts-action@v3
# Ignore any failures -- may occur (randomly?) for older, outdated PRs.
continue-on-error: true
# Add "merge conflict" label if a merge conflict is detected. Remove it when resolved.
# Note, the authentication token is created automatically
# See: https://docs.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token

View File

@@ -0,0 +1,46 @@
# This workflow will attempt to port a merged pull request to
# the branch specified in a "port to" label (if exists)
name: Port merged Pull Request
# Only run for merged PRs against the "main" or maintenance branches
# We allow this to run for `pull_request_target` so that github secrets are available
# (This is required when the PR comes from a forked repo)
on:
pull_request_target:
types: [ closed ]
branches:
- main
- 'dspace-**'
permissions:
contents: write # so action can add comments
pull-requests: write # so action can create pull requests
jobs:
port_pr:
runs-on: ubuntu-latest
# Don't run on closed *unmerged* pull requests
if: github.event.pull_request.merged
steps:
# Checkout code
- uses: actions/checkout@v4
# Port PR to other branch (ONLY if labeled with "port to")
# See https://github.com/korthout/backport-action
- name: Create backport pull requests
uses: korthout/backport-action@v2
with:
# Trigger based on a "port to [branch]" label on PR
# (This label must specify the branch name to port to)
label_pattern: '^port to ([^ ]+)$'
# Title to add to the (newly created) port PR
pull_title: '[Port ${target_branch}] ${pull_title}'
# Description to add to the (newly created) port PR
pull_description: 'Port of #${pull_number} by @${pull_author} to `${target_branch}`.'
# Copy all labels from original PR to (newly created) port PR
# NOTE: The labels matching 'label_pattern' are automatically excluded
copy_labels_pattern: '.*'
# Skip any merge commits in the ported PR. This means only non-merge commits are cherry-picked to the new PR
merge_commits: 'skip'
# Use a personal access token (PAT) to create PR as 'dspace-bot' user.
# A PAT is required in order for the new PR to trigger its own actions (for CI checks)
github_token: ${{ secrets.PR_PORT_TOKEN }}

View File

@@ -0,0 +1,24 @@
# This workflow runs whenever a new pull request is created
name: Pull Request opened
# Only run for newly opened PRs against the "main" or maintenance branches
# We allow this to run for `pull_request_target` so that github secrets are available
# (This is required to assign a PR back to the creator when the PR comes from a forked repo)
on:
pull_request_target:
types: [ opened ]
branches:
- main
- 'dspace-**'
permissions:
pull-requests: write
jobs:
automation:
runs-on: ubuntu-latest
steps:
# Assign the PR to whomever created it. This is useful for visualizing assignments on project boards
# See https://github.com/toshimaru/auto-author-assign
- name: Assign PR to creator
uses: toshimaru/auto-author-assign@v2.1.0

2
.gitignore vendored
View File

@@ -39,3 +39,5 @@ package-lock.json
/nbproject/
junit.xml
/src/mirador-viewer/config.local.js

View File

@@ -2,20 +2,27 @@
# See https://github.com/DSpace/dspace-angular/tree/main/docker for usage details
FROM node:18-alpine
WORKDIR /app
ADD . /app/
EXPOSE 4000
# Ensure Python and other build tools are available
# These are needed to install some node modules, especially on linux/arm64
RUN apk add --update python3 make g++ && rm -rf /var/cache/apk/*
WORKDIR /app
ADD . /app/
EXPOSE 4000
# We run yarn install with an increased network timeout (5min) to avoid "ESOCKETTIMEDOUT" errors from hub.docker.com
# See, for example https://github.com/yarnpkg/yarn/issues/5540
RUN yarn install --network-timeout 300000
# When running in dev mode, 4GB of memory is required to build & launch the app.
# This default setting can be overridden as needed in your shell, via an env file or in docker-compose.
# See Docker environment var precedence: https://docs.docker.com/compose/environment-variables/envvars-precedence/
ENV NODE_OPTIONS="--max_old_space_size=4096"
# On startup, run in DEVELOPMENT mode (this defaults to live reloading enabled, etc).
# Listen / accept connections from all IP addresses.
# NOTE: At this time it is only possible to run Docker container in Production mode
# if you have a public IP. See https://github.com/DSpace/dspace-angular/issues/1485
# if you have a public URL. See https://github.com/DSpace/dspace-angular/issues/1485
ENV NODE_ENV development
CMD yarn serve --host 0.0.0.0

31
Dockerfile.dist Normal file
View File

@@ -0,0 +1,31 @@
# This image will be published as dspace/dspace-angular:$DSPACE_VERSION-dist
# See https://github.com/DSpace/dspace-angular/tree/main/docker for usage details
# Test build:
# docker build -f Dockerfile.dist -t dspace/dspace-angular:dspace-7_x-dist .
FROM node:18-alpine as build
# Ensure Python and other build tools are available
# These are needed to install some node modules, especially on linux/arm64
RUN apk add --update python3 make g++ && rm -rf /var/cache/apk/*
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --network-timeout 300000
ADD . /app/
RUN yarn build:prod
FROM node:18-alpine
RUN npm install --global pm2
COPY --chown=node:node --from=build /app/dist /app/dist
COPY --chown=node:node config /app/config
COPY --chown=node:node docker/dspace-ui.json /app/dspace-ui.json
WORKDIR /app
USER node
ENV NODE_ENV production
EXPOSE 4000
CMD pm2-runtime start dspace-ui.json --json

View File

@@ -157,8 +157,8 @@ DSPACE_UI_SSL => DSPACE_SSL
The same settings can also be overwritten by setting system environment variables instead, E.g.:
```bash
export DSPACE_HOST=api7.dspace.org
export DSPACE_UI_PORT=4200
export DSPACE_HOST=demo.dspace.org
export DSPACE_UI_PORT=4000
```
The priority works as follows: **environment variable** overrides **variable in `.env` file** overrides external config set by `DSPACE_APP_CONFIG_PATH` overrides **`config.(prod or dev).yml`**
@@ -288,7 +288,7 @@ E2E tests (aka integration tests) use [Cypress.io](https://www.cypress.io/). Con
The test files can be found in the `./cypress/integration/` folder.
Before you can run e2e tests, two things are REQUIRED:
1. You MUST be running the DSpace backend (i.e. REST API) locally. The e2e tests will *NOT* succeed if run against our demo REST API (https://api7.dspace.org/server/), as that server is uncontrolled and may have content added/removed at any time.
1. You MUST be running the DSpace backend (i.e. REST API) locally. The e2e tests will *NOT* succeed if run against our demo/sandbox REST API (https://demo.dspace.org/server/ or https://sandbox.dspace.org/server/), as those sites may have content added/removed at any time.
* After starting up your backend on localhost, make sure either your `config.prod.yml` or `config.dev.yml` has its `rest` settings defined to use that localhost backend.
* If you'd prefer, you may instead use environment variables as described at [Configuring](#configuring). For example:
```
@@ -413,8 +413,7 @@ dspace-angular
│ ├── merge-i18n-files.ts *
│ ├── serve.ts *
│ ├── sync-i18n-files.ts *
── test-rest.ts *
│ └── webpack.js *
── test-rest.ts *
├── src * The source of the application
│ ├── app * The source code of the application, subdivided by module/page.
│ ├── assets * Folder for static resources

View File

@@ -266,16 +266,26 @@
"options": {
"lintFilePatterns": [
"src/**/*.ts",
"src/**/*.html"
"src/**/*.html",
"src/**/*.json5"
]
}
}
}
}
},
"defaultProject": "dspace-angular",
"cli": {
"analytics": false,
"defaultCollection": "@angular-eslint/schematics"
"schematicCollections": [
"@angular-eslint/schematics"
]
},
"schematics": {
"@angular-eslint/schematics:application": {
"setParserOptionsProject": true
},
"@angular-eslint/schematics:library": {
"setParserOptionsProject": true
}
}
}

View File

@@ -17,12 +17,19 @@ ui:
# Trust X-FORWARDED-* headers from proxies (default = true)
useProxies: true
universal:
# Whether to inline "critical" styles into the server-side rendered HTML.
# Determining which styles are critical is a relatively expensive operation;
# this option can be disabled to boost server performance at the expense of
# loading smoothness. For improved SSR performance, DSpace defaults this to false (disabled).
inlineCriticalCss: false
# The REST API server settings
# NOTE: these settings define which (publicly available) REST API to use. They are usually
# 'synced' with the 'dspace.server.url' setting in your backend's local.cfg.
rest:
ssl: true
host: api7.dspace.org
host: demo.dspace.org
port: 443
# NOTE: Space is capitalized because 'namespace' is a reserved string in TypeScript
nameSpace: /server
@@ -169,6 +176,12 @@ languages:
- code: en
label: English
active: true
- code: ar
label: العربية
active: true
- code: bn
label: বাংলা
active: true
- code: ca
label: Català
active: true
@@ -178,21 +191,36 @@ languages:
- code: de
label: Deutsch
active: true
- code: el
label: Ελληνικά
active: true
- code: es
label: Español
active: true
- code: fi
label: Suomi
active: true
- code: fr
label: Français
active: true
- code: gd
label: Gàidhlig
active: true
- code: lv
label: Latviešu
- code: hi
label: हिंदी
active: true
- code: hu
label: Magyar
active: true
- code: it
label: Italiano
active: true
- code: kk
label: Қазақ
active: true
- code: lv
label: Latviešu
active: true
- code: nl
label: Nederlands
active: true
@@ -205,8 +233,11 @@ languages:
- code: pt-BR
label: Português do Brasil
active: true
- code: fi
label: Suomi
- code: sr-lat
label: Srpski (lat)
active: true
- code: sr-cyr
label: Српски
active: true
- code: sv
label: Svenska
@@ -214,21 +245,12 @@ languages:
- code: tr
label: Türkçe
active: true
- code: kk
label: Қазақ
active: true
- code: bn
label: বাংলা
active: true
- code: hi
label: हिंदी
active: true
- code: el
label: Ελληνικά
active: true
- code: uk
label: раї́нська
active: true
- code: vi
label: Tiếng Việt
active: true
# Browse-By Pages
@@ -286,33 +308,33 @@ themes:
#
# # A theme with a handle property will match the community, collection or item with the given
# # handle, and all collections and/or items within it
# - name: 'custom',
# handle: '10673/1233'
# - name: custom
# handle: 10673/1233
#
# # A theme with a regex property will match the route using a regular expression. If it
# # matches the route for a community or collection it will also apply to all collections
# # and/or items within it
# - name: 'custom',
# regex: 'collections\/e8043bc2.*'
# - name: custom
# regex: collections\/e8043bc2.*
#
# # A theme with a uuid property will match the community, collection or item with the given
# # ID, and all collections and/or items within it
# - name: 'custom',
# uuid: '0958c910-2037-42a9-81c7-dca80e3892b4'
# - name: custom
# uuid: 0958c910-2037-42a9-81c7-dca80e3892b4
#
# # The extends property specifies an ancestor theme (by name). Whenever a themed component is not found
# # in the current theme, its ancestor theme(s) will be checked recursively before falling back to default.
# - name: 'custom-A',
# extends: 'custom-B',
# - name: custom-A
# extends: custom-B
# # Any of the matching properties above can be used
# handle: '10673/34'
# handle: 10673/34
#
# - name: 'custom-B',
# extends: 'custom',
# handle: '10673/12'
# - name: custom-B
# extends: custom
# handle: 10673/12
#
# # A theme with only a name will match every route
# name: 'custom'
# name: custom
#
# # This theme will use the default bootstrap styling for DSpace components
# - name: BASE_THEME_NAME
@@ -369,3 +391,8 @@ vocabularies:
- filter: 'subject'
vocabulary: 'srsc'
enabled: true
# Default collection/community sorting order at Advanced search, Create/update community and collection when there are not a query.
comcolSelectionSort:
sortField: 'dc.title'
sortDirection: 'ASC'

View File

@@ -1,5 +1,5 @@
rest:
ssl: true
host: api7.dspace.org
host: demo.dspace.org
port: 443
nameSpace: /server

47
cypress.config.ts Normal file
View File

@@ -0,0 +1,47 @@
import { defineConfig } from 'cypress';
export default defineConfig({
videosFolder: 'cypress/videos',
screenshotsFolder: 'cypress/screenshots',
fixturesFolder: 'cypress/fixtures',
retries: {
runMode: 2,
openMode: 0,
},
env: {
// Global DSpace environment variables used in all our Cypress e2e tests
// May be modified in this config, or overridden in a variety of ways.
// See Cypress environment variable docs: https://docs.cypress.io/guides/guides/environment-variables
// Default values listed here are all valid for the Demo Entities Data set available at
// https://github.com/DSpace-Labs/AIP-Files/releases/tag/demo-entities-data
// (This is the data set used in our CI environment)
// Admin account used for administrative tests
DSPACE_TEST_ADMIN_USER: 'dspacedemo+admin@gmail.com',
DSPACE_TEST_ADMIN_PASSWORD: 'dspace',
// Community/collection/publication used for view/edit tests
DSPACE_TEST_COMMUNITY: '0958c910-2037-42a9-81c7-dca80e3892b4',
DSPACE_TEST_COLLECTION: '282164f5-d325-4740-8dd1-fa4d6d3e7200',
DSPACE_TEST_ENTITY_PUBLICATION: '6160810f-1e53-40db-81ef-f6621a727398',
// Search term (should return results) used in search tests
DSPACE_TEST_SEARCH_TERM: 'test',
// Main Collection used for submission tests. Should be able to accept normal Item objects
DSPACE_TEST_SUBMIT_COLLECTION_NAME: 'Sample Collection',
DSPACE_TEST_SUBMIT_COLLECTION_UUID: '9d8334e9-25d3-4a67-9cea-3dffdef80144',
// Collection used for Person entity submission tests. MUST be configured with EntityType=Person.
DSPACE_TEST_SUBMIT_PERSON_COLLECTION_NAME: 'People',
// Account used to test basic submission process
DSPACE_TEST_SUBMIT_USER: 'dspacedemo+submit@gmail.com',
DSPACE_TEST_SUBMIT_USER_PASSWORD: 'dspace',
},
e2e: {
// Setup our plugins for e2e tests
setupNodeEvents(on, config) {
return require('./cypress/plugins/index.ts')(on, config);
},
// This is the base URL that Cypress will run all tests against
// It can be overridden via the CYPRESS_BASE_URL environment variable
// (By default we set this to a value which should work in most development environments)
baseUrl: 'http://localhost:4000',
},
});

View File

@@ -1,25 +0,0 @@
{
"integrationFolder": "cypress/integration",
"supportFile": "cypress/support/index.ts",
"videosFolder": "cypress/videos",
"screenshotsFolder": "cypress/screenshots",
"pluginsFile": "cypress/plugins/index.ts",
"fixturesFolder": "cypress/fixtures",
"baseUrl": "http://127.0.0.1:4000",
"retries": {
"runMode": 2,
"openMode": 0
},
"env": {
"DSPACE_TEST_ADMIN_USER": "dspacedemo+admin@gmail.com",
"DSPACE_TEST_ADMIN_PASSWORD": "dspace",
"DSPACE_TEST_COMMUNITY": "0958c910-2037-42a9-81c7-dca80e3892b4",
"DSPACE_TEST_COLLECTION": "282164f5-d325-4740-8dd1-fa4d6d3e7200",
"DSPACE_TEST_ENTITY_PUBLICATION": "e98b0f27-5c19-49a0-960d-eb6ad5287067",
"DSPACE_TEST_SEARCH_TERM": "test",
"DSPACE_TEST_SUBMIT_COLLECTION_NAME": "Sample Collection",
"DSPACE_TEST_SUBMIT_COLLECTION_UUID": "9d8334e9-25d3-4a67-9cea-3dffdef80144",
"DSPACE_TEST_SUBMIT_USER": "dspacedemo+submit@gmail.com",
"DSPACE_TEST_SUBMIT_USER_PASSWORD": "dspace"
}
}

View File

@@ -0,0 +1,28 @@
import { Options } from 'cypress-axe';
import { testA11y } from 'cypress/support/utils';
describe('Admin Sidebar', () => {
beforeEach(() => {
// Must login as an Admin for sidebar to appear
cy.visit('/login');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should be pinnable and pass accessibility tests', () => {
// Pin the sidebar open
cy.get('#sidebar-collapse-toggle').click();
// Click on every expandable section to open all menus
cy.get('ds-expandable-admin-sidebar-section').click({multiple: true});
// Analyze <ds-admin-sidebar> for accessibility
testA11y('ds-admin-sidebar',
{
rules: {
// Currently all expandable sections have nested interactive elements
// See https://github.com/DSpace/dspace-angular/issues/2178
'nested-interactive': { enabled: false },
}
} as Options);
});
});

View File

@@ -1,10 +1,9 @@
import { TEST_ENTITY_PUBLICATION } from 'cypress/support';
import { testA11y } from 'cypress/support/utils';
describe('Breadcrumbs', () => {
it('should pass accessibility tests', () => {
// Visit an Item, as those have more breadcrumbs
cy.visit('/entities/publication/' + TEST_ENTITY_PUBLICATION);
cy.visit('/entities/publication/'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION')));
// Wait for breadcrumbs to be visible
cy.get('ds-breadcrumbs').should('be.visible');

View File

@@ -0,0 +1,128 @@
import { testA11y } from 'cypress/support/utils';
const COLLECTION_EDIT_PAGE = '/collections/'.concat(Cypress.env('DSPACE_TEST_COLLECTION')).concat('/edit');
beforeEach(() => {
// All tests start with visiting the Edit Collection Page
cy.visit(COLLECTION_EDIT_PAGE);
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
describe('Edit Collection > Edit Metadata tab', () => {
it('should pass accessibility tests', () => {
// <ds-edit-collection> tag must be loaded
cy.get('ds-edit-collection').should('be.visible');
// Analyze <ds-edit-collection> for accessibility issues
testA11y('ds-edit-collection');
});
});
describe('Edit Collection > Assign Roles tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="roles"]').click();
// <ds-collection-roles> tag must be loaded
cy.get('ds-collection-roles').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-collection-roles');
});
});
describe('Edit Collection > Content Source tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="source"]').click();
// <ds-collection-source> tag must be loaded
cy.get('ds-collection-source').should('be.visible');
// Check the external source checkbox (to display all fields on the page)
cy.get('#externalSourceCheck').check();
// Wait for the source controls to appear
// cy.get('ds-collection-source-controls').should('be.visible');
// Analyze entire page for accessibility issues
testA11y('ds-collection-source');
});
});
describe('Edit Collection > Curate tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="curate"]').click();
// <ds-collection-curate> tag must be loaded
cy.get('ds-collection-curate').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-collection-curate');
});
});
describe('Edit Collection > Access Control tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="access-control"]').click();
// <ds-collection-access-control> tag must be loaded
cy.get('ds-collection-access-control').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-collection-access-control');
});
});
describe('Edit Collection > Authorizations tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="authorizations"]').click();
// <ds-collection-authorizations> tag must be loaded
cy.get('ds-collection-authorizations').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-collection-authorizations');
});
});
describe('Edit Collection > Item Mapper tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="mapper"]').click();
// <ds-collection-item-mapper> tag must be loaded
cy.get('ds-collection-item-mapper').should('be.visible');
// Analyze entire page for accessibility issues
testA11y('ds-collection-item-mapper');
// Click on the "Map new Items" tab
cy.get('li[data-test="mapTab"] a').click();
// Make sure search form is now visible
cy.get('ds-search-form').should('be.visible');
// Analyze entire page (again) for accessibility issues
testA11y('ds-collection-item-mapper');
});
});
describe('Edit Collection > Delete page', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="delete-button"]').click();
// <ds-delete-collection> tag must be loaded
cy.get('ds-delete-collection').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-delete-collection');
});
});

View File

@@ -1,13 +1,12 @@
import { TEST_COLLECTION } from 'cypress/support';
import { testA11y } from 'cypress/support/utils';
describe('Collection Page', () => {
it('should pass accessibility tests', () => {
cy.visit('/collections/' + TEST_COLLECTION);
cy.visit('/collections/'.concat(Cypress.env('DSPACE_TEST_COLLECTION')));
// <ds-collection-page> tag must be loaded
cy.get('ds-collection-page').should('exist');
cy.get('ds-collection-page').should('be.visible');
// Analyze <ds-collection-page> for accessibility issues
testA11y('ds-collection-page');

View File

@@ -0,0 +1,37 @@
import { REGEX_MATCH_NON_EMPTY_TEXT } from 'cypress/support/e2e';
import { testA11y } from 'cypress/support/utils';
describe('Collection Statistics Page', () => {
const COLLECTIONSTATISTICSPAGE = '/statistics/collections/'.concat(Cypress.env('DSPACE_TEST_COLLECTION'));
it('should load if you click on "Statistics" from a Collection page', () => {
cy.visit('/collections/'.concat(Cypress.env('DSPACE_TEST_COLLECTION')));
cy.get('ds-navbar ds-link-menu-item a[data-test="link-menu-item.menu.section.statistics"]').click();
cy.location('pathname').should('eq', COLLECTIONSTATISTICSPAGE);
});
it('should contain a "Total visits" section', () => {
cy.visit(COLLECTIONSTATISTICSPAGE);
cy.get('table[data-test="TotalVisits"]').should('be.visible');
});
it('should contain a "Total visits per month" section', () => {
cy.visit(COLLECTIONSTATISTICSPAGE);
// Check just for existence because this table is empty in CI environment as it's historical data
cy.get('.'.concat(Cypress.env('DSPACE_TEST_COLLECTION')).concat('_TotalVisitsPerMonth')).should('exist');
});
it('should pass accessibility tests', () => {
cy.visit(COLLECTIONSTATISTICSPAGE);
// <ds-collection-statistics-page> tag must be loaded
cy.get('ds-collection-statistics-page').should('be.visible');
// Verify / wait until "Total Visits" table's label is non-empty
// (This table loads these labels asynchronously, so we want to wait for them before analyzing page)
cy.get('table[data-test="TotalVisits"] th[data-test="statistics-label"]').contains(REGEX_MATCH_NON_EMPTY_TEXT);
// Analyze <ds-collection-statistics-page> for accessibility issues
testA11y('ds-collection-statistics-page');
});
});

View File

@@ -0,0 +1,86 @@
import { testA11y } from 'cypress/support/utils';
const COMMUNITY_EDIT_PAGE = '/communities/'.concat(Cypress.env('DSPACE_TEST_COMMUNITY')).concat('/edit');
beforeEach(() => {
// All tests start with visiting the Edit Community Page
cy.visit(COMMUNITY_EDIT_PAGE);
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
describe('Edit Community > Edit Metadata tab', () => {
it('should pass accessibility tests', () => {
// <ds-edit-community> tag must be loaded
cy.get('ds-edit-community').should('be.visible');
// Analyze <ds-edit-community> for accessibility issues
testA11y('ds-edit-community');
});
});
describe('Edit Community > Assign Roles tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="roles"]').click();
// <ds-community-roles> tag must be loaded
cy.get('ds-community-roles').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-community-roles');
});
});
describe('Edit Community > Curate tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="curate"]').click();
// <ds-community-curate> tag must be loaded
cy.get('ds-community-curate').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-community-curate');
});
});
describe('Edit Community > Access Control tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="access-control"]').click();
// <ds-community-access-control> tag must be loaded
cy.get('ds-community-access-control').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-community-access-control');
});
});
describe('Edit Community > Authorizations tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="authorizations"]').click();
// <ds-community-authorizations> tag must be loaded
cy.get('ds-community-authorizations').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-community-authorizations');
});
});
describe('Edit Community > Delete page', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="delete-button"]').click();
// <ds-delete-community> tag must be loaded
cy.get('ds-delete-community').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-delete-community');
});
});

View File

@@ -0,0 +1,17 @@
import { testA11y } from 'cypress/support/utils';
describe('Community List Page', () => {
it('should pass accessibility tests', () => {
cy.visit('/community-list');
// <ds-community-list-page> tag must be loaded
cy.get('ds-community-list-page').should('be.visible');
// Open every expand button on page, so that we can scan sub-elements as well
cy.get('[data-test="expand-button"]').click({ multiple: true });
// Analyze <ds-community-list-page> for accessibility issues
testA11y('ds-community-list-page');
});
});

View File

@@ -1,15 +1,14 @@
import { TEST_COMMUNITY } from 'cypress/support';
import { testA11y } from 'cypress/support/utils';
describe('Community Page', () => {
it('should pass accessibility tests', () => {
cy.visit('/communities/' + TEST_COMMUNITY);
cy.visit('/communities/'.concat(Cypress.env('DSPACE_TEST_COMMUNITY')));
// <ds-community-page> tag must be loaded
cy.get('ds-community-page').should('exist');
cy.get('ds-community-page').should('be.visible');
// Analyze <ds-community-page> for accessibility issues
testA11y('ds-community-page',);
testA11y('ds-community-page');
});
});

View File

@@ -0,0 +1,37 @@
import { REGEX_MATCH_NON_EMPTY_TEXT } from 'cypress/support/e2e';
import { testA11y } from 'cypress/support/utils';
describe('Community Statistics Page', () => {
const COMMUNITYSTATISTICSPAGE = '/statistics/communities/'.concat(Cypress.env('DSPACE_TEST_COMMUNITY'));
it('should load if you click on "Statistics" from a Community page', () => {
cy.visit('/communities/'.concat(Cypress.env('DSPACE_TEST_COMMUNITY')));
cy.get('ds-navbar ds-link-menu-item a[data-test="link-menu-item.menu.section.statistics"]').click();
cy.location('pathname').should('eq', COMMUNITYSTATISTICSPAGE);
});
it('should contain a "Total visits" section', () => {
cy.visit(COMMUNITYSTATISTICSPAGE);
cy.get('table[data-test="TotalVisits"]').should('be.visible');
});
it('should contain a "Total visits per month" section', () => {
cy.visit(COMMUNITYSTATISTICSPAGE);
// Check just for existence because this table is empty in CI environment as it's historical data
cy.get('.'.concat(Cypress.env('DSPACE_TEST_COMMUNITY')).concat('_TotalVisitsPerMonth')).should('exist');
});
it('should pass accessibility tests', () => {
cy.visit(COMMUNITYSTATISTICSPAGE);
// <ds-community-statistics-page> tag must be loaded
cy.get('ds-community-statistics-page').should('be.visible');
// Verify / wait until "Total Visits" table's label is non-empty
// (This table loads these labels asynchronously, so we want to wait for them before analyzing page)
cy.get('table[data-test="TotalVisits"] th[data-test="statistics-label"]').contains(REGEX_MATCH_NON_EMPTY_TEXT);
// Analyze <ds-community-statistics-page> for accessibility issues
testA11y('ds-community-statistics-page');
});
});

13
cypress/e2e/header.cy.ts Normal file
View File

@@ -0,0 +1,13 @@
import { testA11y } from 'cypress/support/utils';
describe('Header', () => {
it('should pass accessibility tests', () => {
cy.visit('/');
// Header must first be visible
cy.get('ds-header').should('be.visible');
// Analyze <ds-header> for accessibility
testA11y('ds-header');
});
});

View File

@@ -0,0 +1,31 @@
import { REGEX_MATCH_NON_EMPTY_TEXT } from 'cypress/support/e2e';
import { testA11y } from 'cypress/support/utils';
import '../support/commands';
describe('Site Statistics Page', () => {
it('should load if you click on "Statistics" from homepage', () => {
cy.visit('/');
cy.get('ds-navbar ds-link-menu-item a[data-test="link-menu-item.menu.section.statistics"]').click();
cy.location('pathname').should('eq', '/statistics');
});
it('should pass accessibility tests', () => {
// generate 2 view events on an Item's page
cy.generateViewEvent(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION'), 'item');
cy.generateViewEvent(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION'), 'item');
cy.visit('/statistics');
// <ds-site-statistics-page> tag must be visable
cy.get('ds-site-statistics-page').should('be.visible');
// Verify / wait until "Total Visits" table's *last* label is non-empty
// (This table loads these labels asynchronously, so we want to wait for them before analyzing page)
cy.get('table[data-test="TotalVisits"] th[data-test="statistics-label"]').last().contains(REGEX_MATCH_NON_EMPTY_TEXT);
// Wait an extra 500ms, just so all entries in Total Visits have loaded.
cy.wait(500);
// Analyze <ds-site-statistics-page> for accessibility issues
testA11y('ds-site-statistics-page');
});
});

View File

@@ -6,8 +6,8 @@ describe('Homepage', () => {
cy.visit('/');
});
it('should display translated title "DSpace Angular :: Home"', () => {
cy.title().should('eq', 'DSpace Angular :: Home');
it('should display translated title "DSpace Repository :: Home"', () => {
cy.title().should('eq', 'DSpace Repository :: Home');
});
it('should contain a news section', () => {

140
cypress/e2e/item-edit.cy.ts Normal file
View File

@@ -0,0 +1,140 @@
import { Options } from 'cypress-axe';
import { testA11y } from 'cypress/support/utils';
const ITEM_EDIT_PAGE = '/items/'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION')).concat('/edit');
beforeEach(() => {
// All tests start with visiting the Edit Item Page
cy.visit(ITEM_EDIT_PAGE);
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
describe('Edit Item > Edit Metadata tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="metadata"]').click();
// <ds-edit-item-page> tag must be loaded
cy.get('ds-edit-item-page').should('be.visible');
// wait for all the ds-dso-edit-metadata-value components to be rendered
cy.get('ds-dso-edit-metadata-value div[role="row"]').each(($row: HTMLDivElement) => {
cy.wrap($row).find('div[role="cell"]').should('be.visible');
});
// Analyze <ds-edit-item-page> for accessibility issues
testA11y('ds-edit-item-page');
});
});
describe('Edit Item > Status tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="status"]').click();
// <ds-item-status> tag must be loaded
cy.get('ds-item-status').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-item-status');
});
});
describe('Edit Item > Bitstreams tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="bitstreams"]').click();
// <ds-item-bitstreams> tag must be loaded
cy.get('ds-item-bitstreams').should('be.visible');
// Table of item bitstreams must also be loaded
cy.get('div.item-bitstreams').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-item-bitstreams',
{
rules: {
// Currently Bitstreams page loads a pagination component per Bundle
// and they all use the same 'id="p-dad"'.
'duplicate-id': { enabled: false },
}
} as Options
);
});
});
describe('Edit Item > Curate tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="curate"]').click();
// <ds-item-curate> tag must be loaded
cy.get('ds-item-curate').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-item-curate');
});
});
describe('Edit Item > Relationships tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="relationships"]').click();
// <ds-item-relationships> tag must be loaded
cy.get('ds-item-relationships').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-item-relationships');
});
});
describe('Edit Item > Version History tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="versionhistory"]').click();
// <ds-item-version-history> tag must be loaded
cy.get('ds-item-version-history').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-item-version-history');
});
});
describe('Edit Item > Access Control tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="access-control"]').click();
// <ds-item-access-control> tag must be loaded
cy.get('ds-item-access-control').should('be.visible');
// Analyze for accessibility issues
testA11y('ds-item-access-control');
});
});
describe('Edit Item > Collection Mapper tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="mapper"]').click();
// <ds-item-collection-mapper> tag must be loaded
cy.get('ds-item-collection-mapper').should('be.visible');
// Analyze entire page for accessibility issues
testA11y('ds-item-collection-mapper');
// Click on the "Map new collections" tab
cy.get('li[data-test="mapTab"] a').click();
// Make sure search form is now visible
cy.get('ds-search-form').should('be.visible');
// Analyze entire page (again) for accessibility issues
testA11y('ds-item-collection-mapper');
});
});

View File

@@ -0,0 +1,32 @@
import { testA11y } from 'cypress/support/utils';
describe('Item Page', () => {
const ITEMPAGE = '/items/'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION'));
const ENTITYPAGE = '/entities/publication/'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION'));
// Test that entities will redirect to /entities/[type]/[uuid] when accessed via /items/[uuid]
it('should redirect to the entity page when navigating to an item page', () => {
cy.visit(ITEMPAGE);
cy.location('pathname').should('eq', ENTITYPAGE);
});
it('should pass accessibility tests', () => {
cy.visit(ENTITYPAGE);
// <ds-item-page> tag must be loaded
cy.get('ds-item-page').should('be.visible');
// Analyze <ds-item-page> for accessibility issues
testA11y('ds-item-page');
});
it('should pass accessibility tests on full item page', () => {
cy.visit(ENTITYPAGE + '/full');
// <ds-full-item-page> tag must be loaded
cy.get('ds-full-item-page').should('be.visible');
// Analyze <ds-full-item-page> for accessibility issues
testA11y('ds-full-item-page');
});
});

View File

@@ -0,0 +1,43 @@
import { REGEX_MATCH_NON_EMPTY_TEXT } from 'cypress/support/e2e';
import { testA11y } from 'cypress/support/utils';
describe('Item Statistics Page', () => {
const ITEMSTATISTICSPAGE = '/statistics/items/'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION'));
it('should load if you click on "Statistics" from an Item/Entity page', () => {
cy.visit('/entities/publication/'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION')));
cy.get('ds-navbar ds-link-menu-item a[data-test="link-menu-item.menu.section.statistics"]').click();
cy.location('pathname').should('eq', ITEMSTATISTICSPAGE);
});
it('should contain element ds-item-statistics-page when navigating to an item statistics page', () => {
cy.visit(ITEMSTATISTICSPAGE);
cy.get('ds-item-statistics-page').should('be.visible');
cy.get('ds-item-page').should('not.exist');
});
it('should contain a "Total visits" section', () => {
cy.visit(ITEMSTATISTICSPAGE);
cy.get('table[data-test="TotalVisits"]').should('be.visible');
});
it('should contain a "Total visits per month" section', () => {
cy.visit(ITEMSTATISTICSPAGE);
// Check just for existence because this table is empty in CI environment as it's historical data
cy.get('.'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION')).concat('_TotalVisitsPerMonth')).should('exist');
});
it('should pass accessibility tests', () => {
cy.visit(ITEMSTATISTICSPAGE);
// <ds-item-statistics-page> tag must be loaded
cy.get('ds-item-statistics-page').should('be.visible');
// Verify / wait until "Total Visits" table's label is non-empty
// (This table loads these labels asynchronously, so we want to wait for them before analyzing page)
cy.get('table[data-test="TotalVisits"] th[data-test="statistics-label"]').contains(REGEX_MATCH_NON_EMPTY_TEXT);
// Analyze <ds-item-statistics-page> for accessibility issues
testA11y('ds-item-statistics-page');
});
});

View File

@@ -1,33 +1,33 @@
import { TEST_ADMIN_PASSWORD, TEST_ADMIN_USER, TEST_ENTITY_PUBLICATION } from 'cypress/support';
import { testA11y } from 'cypress/support/utils';
const page = {
openLoginMenu() {
// Click the "Log In" dropdown menu in header
cy.get('ds-themed-navbar [data-test="login-menu"]').click();
cy.get('ds-themed-header [data-test="login-menu"]').click();
},
openUserMenu() {
// Once logged in, click the User menu in header
cy.get('ds-themed-navbar [data-test="user-menu"]').click();
cy.get('ds-themed-header [data-test="user-menu"]').click();
},
submitLoginAndPasswordByPressingButton(email, password) {
// Enter email
cy.get('ds-themed-navbar [data-test="email"]').type(email);
cy.get('ds-themed-header [data-test="email"]').type(email);
// Enter password
cy.get('ds-themed-navbar [data-test="password"]').type(password);
cy.get('ds-themed-header [data-test="password"]').type(password);
// Click login button
cy.get('ds-themed-navbar [data-test="login-button"]').click();
cy.get('ds-themed-header [data-test="login-button"]').click();
},
submitLoginAndPasswordByPressingEnter(email, password) {
// In opened Login modal, fill out email & password, then click Enter
cy.get('ds-themed-navbar [data-test="email"]').type(email);
cy.get('ds-themed-navbar [data-test="password"]').type(password);
cy.get('ds-themed-navbar [data-test="password"]').type('{enter}');
cy.get('ds-themed-header [data-test="email"]').type(email);
cy.get('ds-themed-header [data-test="password"]').type(password);
cy.get('ds-themed-header [data-test="password"]').type('{enter}');
},
submitLogoutByPressingButton() {
// This is the POST command that will actually log us out
cy.intercept('POST', '/server/api/authn/logout').as('logout');
// Click logout button
cy.get('ds-themed-navbar [data-test="logout-button"]').click();
cy.get('ds-themed-header [data-test="logout-button"]').click();
// Wait until above POST command responds before continuing
// (This ensures next action waits until logout completes)
cy.wait('@logout');
@@ -36,7 +36,7 @@ const page = {
describe('Login Modal', () => {
it('should login when clicking button & stay on same page', () => {
const ENTITYPAGE = '/entities/publication/' + TEST_ENTITY_PUBLICATION;
const ENTITYPAGE = '/entities/publication/'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION'));
cy.visit(ENTITYPAGE);
// Login menu should exist
@@ -46,7 +46,7 @@ describe('Login Modal', () => {
page.openLoginMenu();
cy.get('.form-login').should('be.visible');
page.submitLoginAndPasswordByPressingButton(TEST_ADMIN_USER, TEST_ADMIN_PASSWORD);
page.submitLoginAndPasswordByPressingButton(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
cy.get('ds-log-in').should('not.exist');
// Verify we are still on the same page
@@ -66,7 +66,7 @@ describe('Login Modal', () => {
cy.get('.form-login').should('be.visible');
// Login, and the <ds-log-in> tag should no longer exist
page.submitLoginAndPasswordByPressingEnter(TEST_ADMIN_USER, TEST_ADMIN_PASSWORD);
page.submitLoginAndPasswordByPressingEnter(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
cy.get('.form-login').should('not.exist');
// Verify we are still on homepage
@@ -80,7 +80,7 @@ describe('Login Modal', () => {
it('should support logout', () => {
// First authenticate & access homepage
cy.login(TEST_ADMIN_USER, TEST_ADMIN_PASSWORD);
cy.login(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
cy.visit('/');
// Verify ds-log-in tag doesn't exist, but ds-log-out tag does exist
@@ -102,12 +102,15 @@ describe('Login Modal', () => {
page.openLoginMenu();
// Registration link should be visible
cy.get('ds-themed-navbar [data-test="register"]').should('be.visible');
cy.get('ds-themed-header [data-test="register"]').should('be.visible');
// Click registration link & you should go to registration page
cy.get('ds-themed-navbar [data-test="register"]').click();
cy.get('ds-themed-header [data-test="register"]').click();
cy.location('pathname').should('eq', '/register');
cy.get('ds-register-email').should('exist');
// Test accessibility of this page
testA11y('ds-register-email');
});
it('should allow forgot password', () => {
@@ -116,11 +119,32 @@ describe('Login Modal', () => {
page.openLoginMenu();
// Forgot password link should be visible
cy.get('ds-themed-navbar [data-test="forgot"]').should('be.visible');
cy.get('ds-themed-header [data-test="forgot"]').should('be.visible');
// Click link & you should go to Forgot Password page
cy.get('ds-themed-navbar [data-test="forgot"]').click();
cy.get('ds-themed-header [data-test="forgot"]').click();
cy.location('pathname').should('eq', '/forgot');
cy.get('ds-forgot-email').should('exist');
// Test accessibility of this page
testA11y('ds-forgot-email');
});
it('should pass accessibility tests in menus', () => {
cy.visit('/');
// Open login menu & verify accessibility
page.openLoginMenu();
cy.get('ds-log-in').should('exist');
testA11y('ds-log-in');
// Now login
page.submitLoginAndPasswordByPressingButton(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
cy.get('ds-log-in').should('not.exist');
// Open user menu, verify user menu accesibility
page.openUserMenu();
cy.get('ds-user-menu').should('be.visible');
testA11y('ds-user-menu');
});
});

View File

@@ -1,5 +1,3 @@
import { Options } from 'cypress-axe';
import { TEST_SUBMIT_USER, TEST_SUBMIT_USER_PASSWORD, TEST_SUBMIT_COLLECTION_NAME } from 'cypress/support';
import { testA11y } from 'cypress/support/utils';
describe('My DSpace page', () => {
@@ -7,9 +5,9 @@ describe('My DSpace page', () => {
cy.visit('/mydspace');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(TEST_SUBMIT_USER, TEST_SUBMIT_USER_PASSWORD);
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
cy.get('ds-my-dspace-page').should('exist');
cy.get('ds-my-dspace-page').should('be.visible');
// At least one recent submission should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
@@ -19,46 +17,24 @@ describe('My DSpace page', () => {
cy.get('.filter-toggle').click({ multiple: true });
// Analyze <ds-my-dspace-page> for accessibility issues
testA11y(
{
include: ['ds-my-dspace-page'],
exclude: [
['nouislider'] // Date filter slider is missing ARIA labels. Will be fixed by #1175
],
},
{
rules: {
// Search filters fail these two "moderate" impact rules
'heading-order': { enabled: false },
'landmark-unique': { enabled: false }
}
} as Options
);
testA11y('ds-my-dspace-page');
});
it('should have a working detailed view that passes accessibility tests', () => {
cy.visit('/mydspace');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(TEST_SUBMIT_USER, TEST_SUBMIT_USER_PASSWORD);
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
cy.get('ds-my-dspace-page').should('exist');
cy.get('ds-my-dspace-page').should('be.visible');
// Click button in sidebar to display detailed view
cy.get('ds-search-sidebar [data-test="detail-view"]').click();
cy.get('ds-object-detail').should('exist');
cy.get('ds-object-detail').should('be.visible');
// Analyze <ds-search-page> for accessibility issues
testA11y('ds-my-dspace-page',
{
rules: {
// Search filters fail these two "moderate" impact rules
'heading-order': { enabled: false },
'landmark-unique': { enabled: false }
}
} as Options
);
// Analyze <ds-my-dspace-page> for accessibility issues
testA11y('ds-my-dspace-page');
});
// NOTE: Deleting existing submissions is exercised by submission.spec.ts
@@ -66,7 +42,7 @@ describe('My DSpace page', () => {
cy.visit('/mydspace');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(TEST_SUBMIT_USER, TEST_SUBMIT_USER_PASSWORD);
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Open the New Submission dropdown
cy.get('button[data-test="submission-dropdown"]').click();
@@ -77,10 +53,10 @@ describe('My DSpace page', () => {
cy.get('ds-create-item-parent-selector').should('be.visible');
// Type in a known Collection name in the search box
cy.get('ds-authorized-collection-selector input[type="search"]').type(TEST_SUBMIT_COLLECTION_NAME);
cy.get('ds-authorized-collection-selector input[type="search"]').type(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME'));
// Click on the button matching that known Collection name
cy.get('ds-authorized-collection-selector button[title="' + TEST_SUBMIT_COLLECTION_NAME + '"]').click();
cy.get('ds-authorized-collection-selector button[title="'.concat(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME')).concat('"]')).click();
// New URL should include /workspaceitems, as we've started a new submission
cy.url().should('include', '/workspaceitems');
@@ -89,7 +65,7 @@ describe('My DSpace page', () => {
cy.get('ds-submission-edit').should('be.visible');
// A Collection menu button should exist & its value should be the selected collection
cy.get('#collectionControlsMenuButton span').should('have.text', TEST_SUBMIT_COLLECTION_NAME);
cy.get('#collectionControlsMenuButton span').should('have.text', Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME'));
// Now that we've created a submission, we'll test that we can go back and Edit it.
// Get our Submission URL, to parse out the ID of this new submission
@@ -138,7 +114,7 @@ describe('My DSpace page', () => {
cy.visit('/mydspace');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(TEST_SUBMIT_USER, TEST_SUBMIT_USER_PASSWORD);
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Open the New Import dropdown
cy.get('button[data-test="import-dropdown"]').click();
@@ -150,6 +126,9 @@ describe('My DSpace page', () => {
// The external import searchbox should be visible
cy.get('ds-submission-import-external-searchbar').should('be.visible');
// Test for accessibility issues
testA11y('ds-submission-import-external');
});
});

View File

@@ -1,8 +1,13 @@
import { testA11y } from 'cypress/support/utils';
describe('PageNotFound', () => {
it('should contain element ds-pagenotfound when navigating to page that doesnt exist', () => {
// request an invalid page (UUIDs at root path aren't valid)
cy.visit('/e9019a69-d4f1-4773-b6a3-bd362caa46f2', { failOnStatusCode: false });
cy.get('ds-pagenotfound').should('exist');
cy.get('ds-pagenotfound').should('be.visible');
// Analyze <ds-pagenotfound> for accessibility issues
testA11y('ds-pagenotfound');
});
it('should not contain element ds-pagenotfound when navigating to existing page', () => {

View File

@@ -1,23 +1,21 @@
import { TEST_SEARCH_TERM } from 'cypress/support';
const page = {
fillOutQueryInNavBar(query) {
// Click the magnifying glass
cy.get('ds-themed-navbar [data-test="header-search-icon"]').click();
cy.get('ds-themed-header [data-test="header-search-icon"]').click();
// Fill out a query in input that appears
cy.get('ds-themed-navbar [data-test="header-search-box"]').type(query);
cy.get('ds-themed-header [data-test="header-search-box"]').type(query);
},
submitQueryByPressingEnter() {
cy.get('ds-themed-navbar [data-test="header-search-box"]').type('{enter}');
cy.get('ds-themed-header [data-test="header-search-box"]').type('{enter}');
},
submitQueryByPressingIcon() {
cy.get('ds-themed-navbar [data-test="header-search-icon"]').click();
cy.get('ds-themed-header [data-test="header-search-icon"]').click();
}
};
describe('Search from Navigation Bar', () => {
// NOTE: these tests currently assume this query will return results!
const query = TEST_SEARCH_TERM;
const query = Cypress.env('DSPACE_TEST_SEARCH_TERM');
it('should go to search page with correct query if submitted (from home)', () => {
cy.visit('/');
@@ -27,7 +25,7 @@ describe('Search from Navigation Bar', () => {
page.fillOutQueryInNavBar(query);
page.submitQueryByPressingEnter();
// New URL should include query param
cy.url().should('include', 'query=' + query);
cy.url().should('include', 'query='.concat(query));
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// At least one search result should be displayed
@@ -42,7 +40,7 @@ describe('Search from Navigation Bar', () => {
page.fillOutQueryInNavBar(query);
page.submitQueryByPressingEnter();
// New URL should include query param
cy.url().should('include', 'query=' + query);
cy.url().should('include', 'query='.concat(query));
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// At least one search result should be displayed
@@ -57,7 +55,7 @@ describe('Search from Navigation Bar', () => {
page.fillOutQueryInNavBar(query);
page.submitQueryByPressingIcon();
// New URL should include query param
cy.url().should('include', 'query=' + query);
cy.url().should('include', 'query='.concat(query));
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// At least one search result should be displayed

View File

@@ -1,8 +1,10 @@
import { Options } from 'cypress-axe';
import { TEST_SEARCH_TERM } from 'cypress/support';
import { testA11y } from 'cypress/support/utils';
describe('Search Page', () => {
// NOTE: these tests currently assume this query will return results!
const query = Cypress.env('DSPACE_TEST_SEARCH_TERM');
it('should redirect to the correct url when query was set and submit button was triggered', () => {
const queryString = 'Another interesting query string';
cy.visit('/search');
@@ -13,11 +15,11 @@ describe('Search Page', () => {
});
it('should load results and pass accessibility tests', () => {
cy.visit('/search?query=' + TEST_SEARCH_TERM);
cy.get('[data-test="search-box"]').should('have.value', TEST_SEARCH_TERM);
cy.visit('/search?query='.concat(query));
cy.get('[data-test="search-box"]').should('have.value', query);
// <ds-search-page> tag must be loaded
cy.get('ds-search-page').should('exist');
cy.get('ds-search-page').should('be.visible');
// At least one search result should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
@@ -27,31 +29,17 @@ describe('Search Page', () => {
cy.get('[data-test="filter-toggle"]').click({ multiple: true });
// Analyze <ds-search-page> for accessibility issues
testA11y(
{
include: ['ds-search-page'],
exclude: [
['nouislider'] // Date filter slider is missing ARIA labels. Will be fixed by #1175
],
},
{
rules: {
// Search filters fail these two "moderate" impact rules
'heading-order': { enabled: false },
'landmark-unique': { enabled: false }
}
} as Options
);
testA11y('ds-search-page');
});
it('should have a working grid view that passes accessibility tests', () => {
cy.visit('/search?query=' + TEST_SEARCH_TERM);
cy.visit('/search?query='.concat(query));
// Click button in sidebar to display grid view
cy.get('ds-search-sidebar [data-test="grid-view"]').click();
// <ds-search-page> tag must be loaded
cy.get('ds-search-page').should('exist');
cy.get('ds-search-page').should('be.visible');
// At least one grid object (card) should be displayed
cy.get('[data-test="grid-object"]').should('be.visible');
@@ -60,9 +48,8 @@ describe('Search Page', () => {
testA11y('ds-search-page',
{
rules: {
// Search filters fail these two "moderate" impact rules
'heading-order': { enabled: false },
'landmark-unique': { enabled: false }
// Card titles fail this test currently
'heading-order': { enabled: false }
}
} as Options
);

View File

@@ -1,16 +1,16 @@
import { Options } from 'cypress-axe';
import { TEST_SUBMIT_USER, TEST_SUBMIT_USER_PASSWORD, TEST_SUBMIT_COLLECTION_NAME, TEST_SUBMIT_COLLECTION_UUID } from 'cypress/support';
import { testA11y } from 'cypress/support/utils';
//import { TEST_SUBMIT_USER, TEST_SUBMIT_USER_PASSWORD, TEST_SUBMIT_COLLECTION_NAME, TEST_SUBMIT_COLLECTION_UUID, TEST_ADMIN_USER, TEST_ADMIN_PASSWORD } from 'cypress/support/e2e';
import { Options } from 'cypress-axe';
describe('New Submission page', () => {
// NOTE: We already test that new submissions can be started from MyDSpace in my-dspace.spec.ts
// NOTE: We already test that new Item submissions can be started from MyDSpace in my-dspace.spec.ts
it('should create a new submission when using /submit path & pass accessibility', () => {
// Test that calling /submit with collection & entityType will create a new submission
cy.visit('/submit?collection=' + TEST_SUBMIT_COLLECTION_UUID + '&entityType=none');
cy.visit('/submit?collection='.concat(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_UUID')).concat('&entityType=none'));
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(TEST_SUBMIT_USER, TEST_SUBMIT_USER_PASSWORD);
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Should redirect to /workspaceitems, as we've started a new submission
cy.url().should('include', '/workspaceitems');
@@ -19,7 +19,7 @@ describe('New Submission page', () => {
cy.get('ds-submission-edit').should('be.visible');
// A Collection menu button should exist & it's value should be the selected collection
cy.get('#collectionControlsMenuButton span').should('have.text', TEST_SUBMIT_COLLECTION_NAME);
cy.get('#collectionControlsMenuButton span').should('have.text', Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME'));
// 4 sections should be visible by default
cy.get('div#section_traditionalpageone').should('be.visible');
@@ -27,6 +27,25 @@ describe('New Submission page', () => {
cy.get('div#section_upload').should('be.visible');
cy.get('div#section_license').should('be.visible');
// Test entire page for accessibility
testA11y('ds-submission-edit',
{
rules: {
// Author & Subject fields have invalid "aria-multiline" attrs.
// See https://github.com/DSpace/dspace-angular/issues/1272
'aria-allowed-attr': { enabled: false },
// All panels are accordians & fail "aria-required-children" and "nested-interactive".
// Seem to require updating ng-bootstrap and https://github.com/DSpace/dspace-angular/issues/2216
'aria-required-children': { enabled: false },
'nested-interactive': { enabled: false },
// All select boxes fail to have a name / aria-label.
// This is a bug in ng-dynamic-forms and may require https://github.com/DSpace/dspace-angular/issues/2216
'select-name': { enabled: false },
}
} as Options
);
// Discard button should work
// Clicking it will display a confirmation, which we will confirm with another click
cy.get('button#discard').click();
@@ -35,10 +54,10 @@ describe('New Submission page', () => {
it('should block submission & show errors if required fields are missing', () => {
// Create a new submission
cy.visit('/submit?collection=' + TEST_SUBMIT_COLLECTION_UUID + '&entityType=none');
cy.visit('/submit?collection='.concat(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_UUID')).concat('&entityType=none'));
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(TEST_SUBMIT_USER, TEST_SUBMIT_USER_PASSWORD);
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Attempt an immediate deposit without filling out any fields
cy.get('button#deposit').click();
@@ -95,10 +114,10 @@ describe('New Submission page', () => {
it('should allow for deposit if all required fields completed & file uploaded', () => {
// Create a new submission
cy.visit('/submit?collection=' + TEST_SUBMIT_COLLECTION_UUID + '&entityType=none');
cy.visit('/submit?collection='.concat(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_UUID')).concat('&entityType=none'));
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(TEST_SUBMIT_USER, TEST_SUBMIT_USER_PASSWORD);
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Fill out all required fields (Title, Date)
cy.get('input#dc_title').type('DSpace logo uploaded via e2e tests');
@@ -118,14 +137,12 @@ describe('New Submission page', () => {
// Upload our DSpace logo via drag & drop onto submission form
// cy.get('div#section_upload')
cy.get('div.ds-document-drop-zone').selectFile('src/assets/images/dspace-logo.png', {
cy.get('div.ds-document-drop-zone').selectFile('src/assets/images/dspace-logo.svg', {
action: 'drag-drop'
});
// Wait for upload to complete before proceeding
cy.wait('@upload');
// Close the upload success notice
cy.get('[data-dismiss="alert"]').click({multiple: true});
// Wait for deposit button to not be disabled & click it.
cy.get('button#deposit').should('not.be.disabled').click();
@@ -135,4 +152,76 @@ describe('New Submission page', () => {
cy.get('ds-notification div.alert-success').should('be.visible');
});
it('is possible to submit a new "Person" and that form passes accessibility', () => {
// To submit a different entity type, we'll start from MyDSpace
cy.visit('/mydspace');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
// NOTE: At this time, we MUST login as admin to submit Person objects
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
// Open the New Submission dropdown
cy.get('button[data-test="submission-dropdown"]').click();
// Click on the "Person" type in that dropdown
cy.get('#entityControlsDropdownMenu button[title="Person"]').click();
// This should display the <ds-create-item-parent-selector> (popup window)
cy.get('ds-create-item-parent-selector').should('be.visible');
// Type in a known Collection name in the search box
cy.get('ds-authorized-collection-selector input[type="search"]').type(Cypress.env('DSPACE_TEST_SUBMIT_PERSON_COLLECTION_NAME'));
// Click on the button matching that known Collection name
cy.get('ds-authorized-collection-selector button[title="'.concat(Cypress.env('DSPACE_TEST_SUBMIT_PERSON_COLLECTION_NAME')).concat('"]')).click();
// New URL should include /workspaceitems, as we've started a new submission
cy.url().should('include', '/workspaceitems');
// The Submission edit form tag should be visible
cy.get('ds-submission-edit').should('be.visible');
// A Collection menu button should exist & its value should be the selected collection
cy.get('#collectionControlsMenuButton span').should('have.text', Cypress.env('DSPACE_TEST_SUBMIT_PERSON_COLLECTION_NAME'));
// 3 sections should be visible by default
cy.get('div#section_personStep').should('be.visible');
cy.get('div#section_upload').should('be.visible');
cy.get('div#section_license').should('be.visible');
// Test entire page for accessibility
testA11y('ds-submission-edit',
{
rules: {
// All panels are accordians & fail "aria-required-children" and "nested-interactive".
// Seem to require updating ng-bootstrap and https://github.com/DSpace/dspace-angular/issues/2216
'aria-required-children': { enabled: false },
'nested-interactive': { enabled: false },
}
} as Options
);
// Click the lookup button next to "Publication" field
cy.get('button[data-test="lookup-button"]').click();
// A popup modal window should be visible
cy.get('ds-dynamic-lookup-relation-modal').should('be.visible');
// Popup modal should also pass accessibility tests
//testA11y('ds-dynamic-lookup-relation-modal');
testA11y({
include: ['ds-dynamic-lookup-relation-modal'],
exclude: [
['ul.nav-tabs'] // Tabs at top of model have several issues which seem to be caused by ng-bootstrap
],
});
// Close popup window
cy.get('ds-dynamic-lookup-relation-modal button.close').click();
// Back on the form, click the discard button to remove new submission
// Clicking it will display a confirmation, which we will confirm with another click
cy.get('button#discard').click();
cy.get('button#discard_submit').click();
});
});

View File

@@ -1,32 +0,0 @@
import { TEST_COLLECTION } from 'cypress/support';
import { testA11y } from 'cypress/support/utils';
describe('Collection Statistics Page', () => {
const COLLECTIONSTATISTICSPAGE = '/statistics/collections/' + TEST_COLLECTION;
it('should load if you click on "Statistics" from a Collection page', () => {
cy.visit('/collections/' + TEST_COLLECTION);
cy.get('ds-navbar ds-link-menu-item a[title="Statistics"]').click();
cy.location('pathname').should('eq', COLLECTIONSTATISTICSPAGE);
});
it('should contain a "Total visits" section', () => {
cy.visit(COLLECTIONSTATISTICSPAGE);
cy.get('.' + TEST_COLLECTION + '_TotalVisits').should('exist');
});
it('should contain a "Total visits per month" section', () => {
cy.visit(COLLECTIONSTATISTICSPAGE);
cy.get('.' + TEST_COLLECTION + '_TotalVisitsPerMonth').should('exist');
});
it('should pass accessibility tests', () => {
cy.visit(COLLECTIONSTATISTICSPAGE);
// <ds-collection-statistics-page> tag must be loaded
cy.get('ds-collection-statistics-page').should('exist');
// Analyze <ds-collection-statistics-page> for accessibility issues
testA11y('ds-collection-statistics-page');
});
});

View File

@@ -1,25 +0,0 @@
import { Options } from 'cypress-axe';
import { testA11y } from 'cypress/support/utils';
describe('Community List Page', () => {
it('should pass accessibility tests', () => {
cy.visit('/community-list');
// <ds-community-list-page> tag must be loaded
cy.get('ds-community-list-page').should('exist');
// Open first Community (to show Collections)...that way we scan sub-elements as well
cy.get('ds-community-list :nth-child(1) > .btn-group > .btn').click();
// Analyze <ds-community-list-page> for accessibility issues
// Disable heading-order checks until it is fixed
testA11y('ds-community-list-page',
{
rules: {
'heading-order': { enabled: false }
}
} as Options
);
});
});

View File

@@ -1,32 +0,0 @@
import { TEST_COMMUNITY } from 'cypress/support';
import { testA11y } from 'cypress/support/utils';
describe('Community Statistics Page', () => {
const COMMUNITYSTATISTICSPAGE = '/statistics/communities/' + TEST_COMMUNITY;
it('should load if you click on "Statistics" from a Community page', () => {
cy.visit('/communities/' + TEST_COMMUNITY);
cy.get('ds-navbar ds-link-menu-item a[title="Statistics"]').click();
cy.location('pathname').should('eq', COMMUNITYSTATISTICSPAGE);
});
it('should contain a "Total visits" section', () => {
cy.visit(COMMUNITYSTATISTICSPAGE);
cy.get('.' + TEST_COMMUNITY + '_TotalVisits').should('exist');
});
it('should contain a "Total visits per month" section', () => {
cy.visit(COMMUNITYSTATISTICSPAGE);
cy.get('.' + TEST_COMMUNITY + '_TotalVisitsPerMonth').should('exist');
});
it('should pass accessibility tests', () => {
cy.visit(COMMUNITYSTATISTICSPAGE);
// <ds-community-statistics-page> tag must be loaded
cy.get('ds-community-statistics-page').should('exist');
// Analyze <ds-community-statistics-page> for accessibility issues
testA11y('ds-community-statistics-page');
});
});

View File

@@ -1,19 +0,0 @@
import { testA11y } from 'cypress/support/utils';
describe('Header', () => {
it('should pass accessibility tests', () => {
cy.visit('/');
// Header must first be visible
cy.get('ds-header').should('be.visible');
// Analyze <ds-header> for accessibility
testA11y({
include: ['ds-header'],
exclude: [
['#search-navbar-container'], // search in navbar has duplicative ID. Will be fixed in #1174
['.dropdownLogin'] // "Log in" link has color contrast issues. Will be fixed in #1149
],
});
});
});

View File

@@ -1,19 +0,0 @@
import { testA11y } from 'cypress/support/utils';
describe('Site Statistics Page', () => {
it('should load if you click on "Statistics" from homepage', () => {
cy.visit('/');
cy.get('ds-navbar ds-link-menu-item a[title="Statistics"]').click();
cy.location('pathname').should('eq', '/statistics');
});
it('should pass accessibility tests', () => {
cy.visit('/statistics');
// <ds-site-statistics-page> tag must be loaded
cy.get('ds-site-statistics-page').should('exist');
// Analyze <ds-site-statistics-page> for accessibility issues
testA11y('ds-site-statistics-page');
});
});

View File

@@ -1,31 +0,0 @@
import { Options } from 'cypress-axe';
import { TEST_ENTITY_PUBLICATION } from 'cypress/support';
import { testA11y } from 'cypress/support/utils';
describe('Item Page', () => {
const ITEMPAGE = '/items/' + TEST_ENTITY_PUBLICATION;
const ENTITYPAGE = '/entities/publication/' + TEST_ENTITY_PUBLICATION;
// Test that entities will redirect to /entities/[type]/[uuid] when accessed via /items/[uuid]
it('should redirect to the entity page when navigating to an item page', () => {
cy.visit(ITEMPAGE);
cy.location('pathname').should('eq', ENTITYPAGE);
});
it('should pass accessibility tests', () => {
cy.visit(ENTITYPAGE);
// <ds-item-page> tag must be loaded
cy.get('ds-item-page').should('exist');
// Analyze <ds-item-page> for accessibility issues
// Disable heading-order checks until it is fixed
testA11y('ds-item-page',
{
rules: {
'heading-order': { enabled: false }
}
} as Options
);
});
});

View File

@@ -1,38 +0,0 @@
import { TEST_ENTITY_PUBLICATION } from 'cypress/support';
import { testA11y } from 'cypress/support/utils';
describe('Item Statistics Page', () => {
const ITEMSTATISTICSPAGE = '/statistics/items/' + TEST_ENTITY_PUBLICATION;
it('should load if you click on "Statistics" from an Item/Entity page', () => {
cy.visit('/entities/publication/' + TEST_ENTITY_PUBLICATION);
cy.get('ds-navbar ds-link-menu-item a[title="Statistics"]').click();
cy.location('pathname').should('eq', ITEMSTATISTICSPAGE);
});
it('should contain element ds-item-statistics-page when navigating to an item statistics page', () => {
cy.visit(ITEMSTATISTICSPAGE);
cy.get('ds-item-statistics-page').should('exist');
cy.get('ds-item-page').should('not.exist');
});
it('should contain a "Total visits" section', () => {
cy.visit(ITEMSTATISTICSPAGE);
cy.get('.' + TEST_ENTITY_PUBLICATION + '_TotalVisits').should('exist');
});
it('should contain a "Total visits per month" section', () => {
cy.visit(ITEMSTATISTICSPAGE);
cy.get('.' + TEST_ENTITY_PUBLICATION + '_TotalVisitsPerMonth').should('exist');
});
it('should pass accessibility tests', () => {
cy.visit(ITEMSTATISTICSPAGE);
// <ds-item-statistics-page> tag must be loaded
cy.get('ds-item-statistics-page').should('exist');
// Analyze <ds-item-statistics-page> for accessibility issues
testA11y('ds-item-statistics-page');
});
});

View File

@@ -1,5 +1,11 @@
const fs = require('fs');
// 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()
// method of e2e.ts. They can then be accessed by any tests via the getters below.
let REST_BASE_URL: string;
let REST_DOMAIN: string;
// Plugins enable you to tap into, modify, or extend the internal behavior of Cypress
// For more info, visit https://on.cypress.io/plugins-api
module.exports = (on, config) => {
@@ -30,6 +36,24 @@ module.exports = (on, config) => {
}
return null;
},
// Save value of REST Base URL, looked up before all tests.
// This allows other tests to use it easily via getRestBaseURL() below.
saveRestBaseURL(url: string) {
return (REST_BASE_URL = url);
},
// Retrieve currently saved value of REST Base URL
getRestBaseURL() {
return REST_BASE_URL ;
},
// Save value of REST Domain, looked up before all tests.
// This allows other tests to use it easily via getRestBaseDomain() below.
saveRestBaseDomain(domain: string) {
return (REST_DOMAIN = domain);
},
// Retrieve currently saved value of REST Domain
getRestBaseDomain() {
return REST_DOMAIN ;
}
});
};

View File

@@ -4,12 +4,13 @@
// ***********************************************
import { AuthTokenInfo, TOKENITEM } from 'src/app/core/auth/models/auth-token-info.model';
import { FALLBACK_TEST_REST_BASE_URL } from '.';
import { DSPACE_XSRF_COOKIE, XSRF_REQUEST_HEADER } from 'src/app/core/xsrf/xsrf.constants';
import { v4 as uuidv4 } from 'uuid';
// Declare Cypress namespace to help with Intellisense & code completion in IDEs
// ALL custom commands MUST be listed here for code completion to work
// tslint:disable-next-line:no-namespace
declare global {
// eslint-disable-next-line @typescript-eslint/no-namespace
namespace Cypress {
interface Chainable<Subject = any> {
/**
@@ -27,6 +28,22 @@ declare global {
* @param password password to login as
*/
loginViaForm(email: string, password: string): typeof loginViaForm;
/**
* Generate view event for given object. Useful for testing statistics pages with
* pre-generated statistics. This just generates a single "hit", but can be called multiple times to
* generate multiple hits.
* @param uuid UUID of object
* @param dsoType type of DSpace Object (e.g. "item", "collection", "community")
*/
generateViewEvent(uuid: string, dsoType: string): typeof generateViewEvent;
/**
* Create a new CSRF token and add to required Cookie. CSRF Token is returned
* in chainable in order to allow it to be sent also in required CSRF header.
* @returns Chainable reference to allow CSRF token to also be sent in header.
*/
createCSRFCookie(): Chainable<any>;
}
}
}
@@ -40,35 +57,15 @@ declare global {
* @param password password to login as
*/
function login(email: string, password: string): void {
// Cypress doesn't have access to the running application in Node.js.
// So, it's not possible to inject or load the AppConfig or environment of the Angular UI.
// Instead, we'll read our running application's config.json, which contains the configs &
// is regenerated at runtime each time the Angular UI application starts up.
cy.task('readUIConfig').then((str: string) => {
// Parse config into a JSON object
const config = JSON.parse(str);
// Find the URL of our REST API. Have a fallback ready, just in case 'rest.baseUrl' cannot be found.
let baseRestUrl = FALLBACK_TEST_REST_BASE_URL;
if (!config.rest.baseUrl) {
console.warn("Could not load 'rest.baseUrl' from config.json. Falling back to " + FALLBACK_TEST_REST_BASE_URL);
} else {
console.log("Found 'rest.baseUrl' in config.json. Using this REST API for login: " + config.rest.baseUrl);
baseRestUrl = config.rest.baseUrl;
}
// To login via REST, first we have to do a GET to obtain a valid CSRF token
cy.request( baseRestUrl + '/api/authn/status' )
.then((response) => {
// We should receive a CSRF token returned in a response header
expect(response.headers).to.have.property('dspace-xsrf-token');
const csrfToken = response.headers['dspace-xsrf-token'];
// Create a fake CSRF cookie/token to use in POST
cy.createCSRFCookie().then((csrfToken: string) => {
// get our REST API's base URL, also needed for POST
cy.task('getRestBaseURL').then((baseRestUrl: string) => {
// Now, send login POST request including that CSRF token
cy.request({
method: 'POST',
url: baseRestUrl + '/api/authn/login',
headers: { 'X-XSRF-TOKEN' : csrfToken},
headers: { [XSRF_REQUEST_HEADER]: csrfToken},
form: true, // indicates the body should be form urlencoded
body: { user: email, password: password }
}).then((resp) => {
@@ -86,19 +83,17 @@ function login(email: string, password: string): void {
cy.setCookie(TOKENITEM, JSON.stringify(authinfo));
});
});
});
}
// Add as a Cypress command (i.e. assign to 'cy.login')
Cypress.Commands.add('login', login);
/**
* Login user via displayed login form
* @param email email to login as
* @param password password to login as
*/
function loginViaForm(email: string, password: string): void {
function loginViaForm(email: string, password: string): void {
// Enter email
cy.get('ds-log-in [data-test="email"]').type(email);
// Enter password
@@ -107,4 +102,68 @@ Cypress.Commands.add('login', login);
cy.get('ds-log-in [data-test="login-button"]').click();
}
// Add as a Cypress command (i.e. assign to 'cy.loginViaForm')
Cypress.Commands.add('loginViaForm', loginViaForm);
Cypress.Commands.add('loginViaForm', loginViaForm);
/**
* Generate statistic view event for given object. Useful for testing statistics pages with
* pre-generated statistics. This just generates a single "hit", but can be called multiple times to
* generate multiple hits.
*
* NOTE: This requires that "solr-statistics.autoCommit=false" be set on the DSpace backend
* (as it is in our docker-compose-ci.yml used in CI).
* Otherwise, by default, new statistical events won't be saved until Solr's autocommit next triggers.
* @param uuid UUID of object
* @param dsoType type of DSpace Object (e.g. "item", "collection", "community")
*/
function generateViewEvent(uuid: string, dsoType: string): void {
// Create a fake CSRF cookie/token to use in POST
cy.createCSRFCookie().then((csrfToken: string) => {
// get our REST API's base URL, also needed for POST
cy.task('getRestBaseURL').then((baseRestUrl: string) => {
// Now, send 'statistics/viewevents' POST request including that fake CSRF token in required header
cy.request({
method: 'POST',
url: baseRestUrl + '/api/statistics/viewevents',
headers: {
[XSRF_REQUEST_HEADER] : csrfToken,
// use a known public IP address to avoid being seen as a "bot"
'X-Forwarded-For': '1.1.1.1',
// Use a user-agent of a Firefox browser on Windows. This again avoids being seen as a "bot"
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0',
},
//form: true, // indicates the body should be form urlencoded
body: { targetId: uuid, targetType: dsoType },
}).then((resp) => {
// We expect a 201 (which means statistics event was created)
expect(resp.status).to.eq(201);
});
});
});
}
// Add as a Cypress command (i.e. assign to 'cy.generateViewEvent')
Cypress.Commands.add('generateViewEvent', generateViewEvent);
/**
* Can be used by tests to generate a random XSRF/CSRF token and save it to
* the required XSRF/CSRF cookie for usage when sending POST requests or similar.
* The generated CSRF token is returned in a Chainable to allow it to be also sent
* in the CSRF HTTP Header.
* @returns a Cypress Chainable which can be used to get the generated CSRF Token
*/
function createCSRFCookie(): Cypress.Chainable {
// Generate a new token which is a random UUID
const csrfToken: string = uuidv4();
// Save it to our required cookie
cy.task('getRestBaseDomain').then((baseDomain: string) => {
// Create a fake CSRF Token. Set it in the required server-side cookie
cy.setCookie(DSPACE_XSRF_COOKIE, csrfToken, { 'domain': baseDomain });
});
// return the generated token wrapped in a chainable
return cy.wrap(csrfToken);
}
// Add as a Cypress command (i.e. assign to 'cy.createCSRFCookie')
Cypress.Commands.add('createCSRFCookie', createCSRFCookie);

75
cypress/support/e2e.ts Normal file
View File

@@ -0,0 +1,75 @@
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import all custom Commands (from commands.ts) for all tests
import './commands';
// Import Cypress Axe tools for all tests
// https://github.com/component-driven/cypress-axe
import 'cypress-axe';
import { DSPACE_XSRF_COOKIE } from 'src/app/core/xsrf/xsrf.constants';
// Runs once before all tests
before(() => {
// Cypress doesn't have access to the running application in Node.js.
// So, it's not possible to inject or load the AppConfig or environment of the Angular UI.
// Instead, we'll read our running application's config.json, which contains the configs &
// is regenerated at runtime each time the Angular UI application starts up.
cy.task('readUIConfig').then((str: string) => {
// Parse config into a JSON object
const config = JSON.parse(str);
// Find URL of our REST API & save to global variable via task
let baseRestUrl = FALLBACK_TEST_REST_BASE_URL;
if (!config.rest.baseUrl) {
console.warn("Could not load 'rest.baseUrl' from config.json. Falling back to " + FALLBACK_TEST_REST_BASE_URL);
} else {
baseRestUrl = config.rest.baseUrl;
}
cy.task('saveRestBaseURL', baseRestUrl);
// Find domain of our REST API & save to global variable via task.
let baseDomain = FALLBACK_TEST_REST_DOMAIN;
if (!config.rest.host) {
console.warn("Could not load 'rest.host' from config.json. Falling back to " + FALLBACK_TEST_REST_DOMAIN);
} else {
baseDomain = config.rest.host;
}
cy.task('saveRestBaseDomain', baseDomain);
});
});
// Runs once before the first test in each "block"
beforeEach(() => {
// Pre-agree to all Klaro cookies by setting the klaro-anonymous cookie
// This just ensures it doesn't get in the way of matching other objects in the page.
cy.setCookie('klaro-anonymous', '{%22authentication%22:true%2C%22preferences%22:true%2C%22acknowledgement%22:true%2C%22google-analytics%22:true%2C%22google-recaptcha%22:true}');
// Remove any CSRF cookies saved from prior tests
cy.clearCookie(DSPACE_XSRF_COOKIE);
});
// NOTE: FALLBACK_TEST_REST_BASE_URL is only used if Cypress cannot read the REST API BaseURL
// from the Angular UI's config.json. See 'before()' above.
const FALLBACK_TEST_REST_BASE_URL = 'http://localhost:8080/server';
const FALLBACK_TEST_REST_DOMAIN = 'localhost';
// USEFUL REGEX for testing
// Match any string that contains at least one non-space character
// Can be used with "contains()" to determine if an element has a non-empty text value
export const REGEX_MATCH_NON_EMPTY_TEXT = /^(?!\s*$).+/;

View File

@@ -1,63 +0,0 @@
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import all custom Commands (from commands.ts) for all tests
import './commands';
// Import Cypress Axe tools for all tests
// https://github.com/component-driven/cypress-axe
import 'cypress-axe';
// Runs once before the first test in each "block"
beforeEach(() => {
// Pre-agree to all Klaro cookies by setting the klaro-anonymous cookie
// This just ensures it doesn't get in the way of matching other objects in the page.
cy.setCookie('klaro-anonymous', '{%22authentication%22:true%2C%22preferences%22:true%2C%22acknowledgement%22:true%2C%22google-analytics%22:true%2C%22google-recaptcha%22:true}');
});
// For better stability between tests, we visit "about:blank" (i.e. blank page) after each test.
// This ensures any remaining/outstanding XHR requests are killed, so they don't affect the next test.
// Borrowed from: https://glebbahmutov.com/blog/visit-blank-page-between-tests/
afterEach(() => {
cy.window().then((win) => {
win.location.href = 'about:blank';
});
});
// Global constants used in tests
// May be overridden in our cypress.json config file using specified environment variables.
// Default values listed here are all valid for the Demo Entities Data set available at
// https://github.com/DSpace-Labs/AIP-Files/releases/tag/demo-entities-data
// (This is the data set used in our CI environment)
// NOTE: FALLBACK_TEST_REST_BASE_URL is only used if Cypress cannot read the REST API BaseURL
// from the Angular UI's config.json. See 'getBaseRESTUrl()' in commands.ts
export const FALLBACK_TEST_REST_BASE_URL = 'http://localhost:8080/server';
// Admin account used for administrative tests
export const TEST_ADMIN_USER = Cypress.env('DSPACE_TEST_ADMIN_USER') || 'dspacedemo+admin@gmail.com';
export const TEST_ADMIN_PASSWORD = Cypress.env('DSPACE_TEST_ADMIN_PASSWORD') || 'dspace';
// Community/collection/publication used for view/edit tests
export const TEST_COLLECTION = Cypress.env('DSPACE_TEST_COLLECTION') || '282164f5-d325-4740-8dd1-fa4d6d3e7200';
export const TEST_COMMUNITY = Cypress.env('DSPACE_TEST_COMMUNITY') || '0958c910-2037-42a9-81c7-dca80e3892b4';
export const TEST_ENTITY_PUBLICATION = Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION') || 'e98b0f27-5c19-49a0-960d-eb6ad5287067';
// Search term (should return results) used in search tests
export const TEST_SEARCH_TERM = Cypress.env('DSPACE_TEST_SEARCH_TERM') || 'test';
// Collection used for submission tests
export const TEST_SUBMIT_COLLECTION_NAME = Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME') || 'Sample Collection';
export const TEST_SUBMIT_COLLECTION_UUID = Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_UUID') || '9d8334e9-25d3-4a67-9cea-3dffdef80144';
export const TEST_SUBMIT_USER = Cypress.env('DSPACE_TEST_SUBMIT_USER') || 'dspacedemo+submit@gmail.com';
export const TEST_SUBMIT_USER_PASSWORD = Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD') || 'dspace';

View File

@@ -6,7 +6,20 @@
If you wish to run DSpace on Docker in production, we recommend building your own Docker images. You are welcome to borrow ideas/concepts from the below images in doing so. But, the below images should not be used "as is" in any production scenario.
***
## 'Dockerfile' in root directory
## Overview
The scripts in this directory can be used to start the DSpace User Interface (frontend) in Docker.
Optionally, the backend (REST API) might also be started in Docker.
For additional options/settings in starting the backend (REST API) in Docker, see the Docker Compose
documentation for the backend: https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/README.md
## Root directory
The root directory of this project contains all the Dockerfiles which may be referenced by
the Docker compose scripts in this 'docker' folder.
### Dockerfile
This Dockerfile is used to build a *development* DSpace 7 Angular UI image, published as 'dspace/dspace-angular'
```
@@ -20,7 +33,18 @@ Admins to our DockerHub repo can manually publish with the following command.
docker push dspace/dspace-angular:dspace-7_x
```
## docker directory
### Dockerfile.dist
The `Dockerfile.dist` is used to generate a *production* build and runtime environment.
```bash
# build the latest image
docker build -f Dockerfile.dist -t dspace/dspace-angular:dspace-7_x-dist .
```
A default/demo version of this image is built *automatically*.
## 'docker' directory
- docker-compose.yml
- Starts DSpace Angular with Docker Compose from the current branch. This file assumes that a DSpace 7 REST instance will also be started in Docker.
- docker-compose-rest.yml
@@ -45,23 +69,47 @@ docker-compose -f docker/docker-compose.yml build
## To start DSpace (REST and Angular) from your branch
This command provides a quick way to start both the frontend & backend from this single codebase
```
docker-compose -p d7 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml up -d
```
Keep in mind, you may also start the backend by cloning the 'DSpace/DSpace' GitHub repository separately. See the next section.
## Run DSpace REST and DSpace Angular from local branches.
This section assumes that you have clones *both* the 'DSpace/DSpace' and 'DSpace/dspace-angular' GitHub
repositories. When both are available locally, you can spin up both in Docker and have them work together.
_The system will be started in 2 steps. Each step shares the same docker network._
From DSpace/DSpace (build as needed)
From 'DSpace/DSpace' clone (build first as needed):
```
docker-compose -p d7 up -d
```
From DSpace/DSpace-angular
NOTE: More detailed instructions on starting the backend via Docker can be found in the [Docker Compose instructions for the Backend](https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/README.md).
From 'DSpace/dspace-angular' clone (build first as needed)
```
docker-compose -p d7 -f docker/docker-compose.yml up -d
```
At this point, you should be able to access the UI from http://localhost:4000,
and the backend at http://localhost:8080/server/
## Run DSpace Angular dist build with DSpace Demo site backend
This allows you to run the Angular UI in *production* mode, pointing it at the demo or sandbox backend
(https://demo.dspace.org/server/ or https://sandbox.dspace.org/server/).
```
docker-compose -f docker/docker-compose-dist.yml pull
docker-compose -f docker/docker-compose-dist.yml build
docker-compose -p d7 -f docker/docker-compose-dist.yml up -d
```
## Ingest test data from AIPDIR
Create an administrator
@@ -87,9 +135,10 @@ Load assetstore content and trigger a re-index of the repository
docker-compose -p d7 -f docker/cli.yml -f docker/cli.assetstore.yml run --rm dspace-cli
```
## End to end testing of the rest api (runs in travis).
_In this instance, only the REST api runs in Docker using the Entities dataset. Travis will perform CI testing of Angular using Node to drive the tests._
## End to end testing of the REST API (runs in GitHub Actions CI).
_In this instance, only the REST api runs in Docker using the Entities dataset. GitHub Actions will perform CI testing of Angular using Node to drive the tests. See `.github/workflows/build.yml` for more details._
This command is only really useful for testing our Continuous Integration process.
```
docker-compose -p d7ci -f docker/docker-compose-travis.yml up -d
docker-compose -p d7ci -f docker/docker-compose-ci.yml up -d
```

View File

@@ -12,15 +12,8 @@
# https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/cli.assetstore.yml
#
# Therefore, it should be kept in sync with that file
version: "3.7"
networks:
dspacenet:
services:
dspace-cli:
networks:
dspacenet: {}
environment:
# This assetstore zip is available from https://github.com/DSpace-Labs/AIP-Files/releases/tag/demo-entities-data
- LOADASSETS=https://github.com/DSpace-Labs/AIP-Files/releases/download/demo-entities-data/assetstore.tar.gz

View File

@@ -12,8 +12,6 @@
# https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/cli.ingest.yml
#
# Therefore, it should be kept in sync with that file
version: "3.7"
services:
dspace-cli:
environment:

View File

@@ -12,8 +12,13 @@
# https://github.com/DSpace/DSpace/blob/main/docker-compose-cli.yml
#
# Therefore, it should be kept in sync with that file
version: "3.7"
networks:
# Default to using network named 'dspacenet' from docker-compose-rest.yml.
# Its full name will be prepended with the project name (e.g. "-p d7" means it will be named "d7_dspacenet")
# If COMPOSITE_PROJECT_NAME is missing, default value will be "docker" (name of folder this file is in)
default:
name: ${COMPOSE_PROJECT_NAME:-docker}_dspacenet
external: true
services:
dspace-cli:
image: "${DOCKER_OWNER:-dspace}/dspace-cli:${DSPACE_VER:-dspace-7_x}"
@@ -30,16 +35,12 @@ services:
# solr.server: Ensure we are using the 'dspacesolr' image for Solr
solr__P__server: http://dspacesolr:8983/solr
volumes:
- "assetstore:/dspace/assetstore"
# Keep DSpace assetstore directory between reboots
- assetstore:/dspace/assetstore
entrypoint: /dspace/bin/dspace
command: help
networks:
- dspacenet
tty: true
stdin_open: true
volumes:
assetstore:
networks:
dspacenet:

View File

@@ -12,8 +12,6 @@
# https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/db.entities.yml
#
# # Therefore, it should be kept in sync with that file
version: "3.7"
services:
dspacedb:
image: dspace/dspace-postgres-pgcrypto:loadsql

View File

@@ -10,7 +10,6 @@
# This is used by our GitHub CI at .github/workflows/build.yml
# It is based heavily on the Backend's Docker Compose:
# https://github.com/DSpace/DSpace/blob/main/docker-compose.yml
version: '3.7'
networks:
dspacenet:
services:
@@ -30,11 +29,15 @@ services:
db__P__url: 'jdbc:postgresql://dspacedb:5432/dspace'
# solr.server: Ensure we are using the 'dspacesolr' image for Solr
solr__P__server: http://dspacesolr:8983/solr
# Tell Statistics to commit all views immediately instead of waiting on Solr's autocommit.
# This allows us to generate statistics in e2e tests so that statistics pages can be tested thoroughly.
solr__D__statistics__P__autoCommit: 'false'
LOGGING_CONFIG: /dspace/config/log4j2-container.xml
image: "${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-7_x-test}"
depends_on:
- dspacedb
image: dspace/dspace:dspace-7_x-test
networks:
dspacenet:
- dspacenet
ports:
- published: 8080
target: 8080
@@ -42,8 +45,6 @@ services:
tty: true
volumes:
- assetstore:/dspace/assetstore
# Mount DSpace's solr configs to a volume, so that we can share to 'dspacesolr' container (see below)
- solr_configs:/dspace/solr
# Ensure that the database is ready BEFORE starting tomcat
# 1. While a TCP connection to dspacedb port 5432 is not available, continue to sleep
# 2. Then, run database migration to init database tables (including any out-of-order ignored migrations, if any)
@@ -59,29 +60,30 @@ services:
# NOTE: This is customized to use our loadsql image, so that we are using a database with existing test data
dspacedb:
container_name: dspacedb
image: "${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-7_x-loadsql}"
environment:
# 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
# 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
PGDATA: /pgdata
image: dspace/dspace-postgres-pgcrypto:loadsql
POSTGRES_PASSWORD: dspace
networks:
dspacenet:
- dspacenet
ports:
- published: 5432
target: 5432
stdin_open: true
tty: true
volumes:
# Keep Postgres data directory between reboots
- pgdata:/pgdata
# DSpace Solr container
dspacesolr:
container_name: dspacesolr
# Uses official Solr image at https://hub.docker.com/_/solr/
image: solr:8.11-slim
# Needs main 'dspace' container to start first to guarantee access to solr_configs
depends_on:
- dspace
image: "${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-7_x}"
networks:
dspacenet:
- dspacenet
ports:
- published: 8983
target: 8983
@@ -89,9 +91,6 @@ services:
tty: true
working_dir: /var/solr/data
volumes:
# Mount our "solr_configs" volume available under the Solr's configsets folder (in a 'dspace' subfolder)
# This copies the Solr configs from main 'dspace' container into 'dspacesolr' via that volume
- solr_configs:/opt/solr/server/solr/configsets/dspace
# Keep Solr data directory between reboots
- solr_data:/var/solr/data
# Initialize all DSpace Solr cores using the mounted configsets (see above), then start Solr
@@ -100,14 +99,16 @@ services:
- '-c'
- |
init-var-solr
precreate-core authority /opt/solr/server/solr/configsets/dspace/authority
precreate-core oai /opt/solr/server/solr/configsets/dspace/oai
precreate-core search /opt/solr/server/solr/configsets/dspace/search
precreate-core statistics /opt/solr/server/solr/configsets/dspace/statistics
precreate-core authority /opt/solr/server/solr/configsets/authority
cp -r /opt/solr/server/solr/configsets/authority/* authority
precreate-core oai /opt/solr/server/solr/configsets/oai
cp -r /opt/solr/server/solr/configsets/oai/* oai
precreate-core search /opt/solr/server/solr/configsets/search
cp -r /opt/solr/server/solr/configsets/search/* search
precreate-core statistics /opt/solr/server/solr/configsets/statistics
cp -r /opt/solr/server/solr/configsets/statistics/* statistics
exec solr -f
volumes:
assetstore:
pgdata:
solr_data:
# Special volume used to share Solr configs from 'dspace' to 'dspacesolr' container (see above)
solr_configs:

View File

@@ -0,0 +1,39 @@
#
# The contents of this file are subject to the license and copyright
# detailed in the LICENSE and NOTICE files at the root of the source
# tree and available online at
#
# http://www.dspace.org/license/
#
# Docker Compose for running the DSpace Angular UI dist build
# for previewing with the DSpace Demo site backend
networks:
dspacenet:
services:
dspace-angular:
container_name: dspace-angular
environment:
DSPACE_UI_SSL: 'false'
DSPACE_UI_HOST: dspace-angular
DSPACE_UI_PORT: '4000'
DSPACE_UI_NAMESPACE: /
# NOTE: When running the UI in production mode (which the -dist image does),
# these DSPACE_REST_* variables MUST point at a public, HTTPS URL.
# This is because Server Side Rendering (SSR) currently requires a public URL,
# see this bug: https://github.com/DSpace/dspace-angular/issues/1485
DSPACE_REST_SSL: 'true'
DSPACE_REST_HOST: demo.dspace.org
DSPACE_REST_PORT: 443
DSPACE_REST_NAMESPACE: /server
image: dspace/dspace-angular:dspace-7_x-dist
build:
context: ..
dockerfile: Dockerfile.dist
networks:
dspacenet:
ports:
- published: 4000
target: 4000
stdin_open: true
tty: true

View File

@@ -10,7 +10,6 @@
# This is based heavily on the docker-compose.yml that is available in the DSpace/DSpace
# (Backend) at:
# https://github.com/DSpace/DSpace/blob/main/docker-compose.yml
version: '3.7'
networks:
dspacenet:
ipam:
@@ -29,8 +28,9 @@ services:
# __D__ => "-" (e.g. google__D__metadata => google-metadata)
# dspace.dir, dspace.server.url, dspace.ui.url and dspace.name
dspace__P__dir: /dspace
dspace__P__server__P__url: http://localhost:8080/server
dspace__P__ui__P__url: http://localhost:4000
# Uncomment to set a non-default value for dspace.server.url or dspace.ui.url
# dspace__P__server__P__url: http://localhost:8080/server
# dspace__P__ui__P__url: http://localhost:4000
dspace__P__name: 'DSpace Started with Docker Compose'
# db.url: Ensure we are using the 'dspacedb' image for our database
db__P__url: 'jdbc:postgresql://dspacedb:5432/dspace'
@@ -39,11 +39,12 @@ services:
# proxies.trusted.ipranges: This setting is required for a REST API running in Docker to trust requests
# from the host machine. This IP range MUST correspond to the 'dspacenet' subnet defined above.
proxies__P__trusted__P__ipranges: '172.23.0'
image: dspace/dspace:dspace-7_x-test
LOGGING_CONFIG: /dspace/config/log4j2-container.xml
image: "${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-7_x-test}"
depends_on:
- dspacedb
networks:
dspacenet:
- dspacenet
ports:
- published: 8080
target: 8080
@@ -51,8 +52,6 @@ services:
tty: true
volumes:
- assetstore:/dspace/assetstore
# Mount DSpace's solr configs to a volume, so that we can share to 'dspacesolr' container (see below)
- solr_configs:/dspace/solr
# Ensure that the database is ready BEFORE starting tomcat
# 1. While a TCP connection to dspacedb port 5432 is not available, continue to sleep
# 2. Then, run database migration to init database tables
@@ -67,28 +66,27 @@ services:
# DSpace database container
dspacedb:
container_name: dspacedb
# Uses a custom Postgres image with pgcrypto installed
image: "${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-7_x}"
environment:
PGDATA: /pgdata
image: dspace/dspace-postgres-pgcrypto
POSTGRES_PASSWORD: dspace
networks:
dspacenet:
- dspacenet
ports:
- published: 5432
target: 5432
stdin_open: true
tty: true
volumes:
# Keep Postgres data directory between reboots
- pgdata:/pgdata
# DSpace Solr container
dspacesolr:
container_name: dspacesolr
# Uses official Solr image at https://hub.docker.com/_/solr/
image: solr:8.11-slim
# Needs main 'dspace' container to start first to guarantee access to solr_configs
depends_on:
- dspace
image: "${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-7_x}"
networks:
dspacenet:
- dspacenet
ports:
- published: 8983
target: 8983
@@ -96,32 +94,28 @@ services:
tty: true
working_dir: /var/solr/data
volumes:
# Mount our "solr_configs" volume available under the Solr's configsets folder (in a 'dspace' subfolder)
# This copies the Solr configs from main 'dspace' container into 'dspacesolr' via that volume
- solr_configs:/opt/solr/server/solr/configsets/dspace
# Keep Solr data directory between reboots
- solr_data:/var/solr/data
# Initialize all DSpace Solr cores using the mounted local configsets (see above), then start Solr
# * First, run precreate-core to create the core (if it doesn't yet exist). If exists already, this is a no-op
# * Second, copy updated configs from mounted configsets to this core. If it already existed, this updates core
# to the latest configs. If it's a newly created core, this is a no-op.
# * Second, copy configsets to this core:
# Updates to Solr configs require the container to be rebuilt/restarted:
# `docker-compose -p d7 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml up -d --build dspacesolr`
entrypoint:
- /bin/bash
- '-c'
- |
init-var-solr
precreate-core authority /opt/solr/server/solr/configsets/dspace/authority
cp -r -u /opt/solr/server/solr/configsets/dspace/authority/* authority
precreate-core oai /opt/solr/server/solr/configsets/dspace/oai
cp -r -u /opt/solr/server/solr/configsets/dspace/oai/* oai
precreate-core search /opt/solr/server/solr/configsets/dspace/search
cp -r -u /opt/solr/server/solr/configsets/dspace/search/* search
precreate-core statistics /opt/solr/server/solr/configsets/dspace/statistics
cp -r -u /opt/solr/server/solr/configsets/dspace/statistics/* statistics
precreate-core authority /opt/solr/server/solr/configsets/authority
cp -r /opt/solr/server/solr/configsets/authority/* authority
precreate-core oai /opt/solr/server/solr/configsets/oai
cp -r /opt/solr/server/solr/configsets/oai/* oai
precreate-core search /opt/solr/server/solr/configsets/search
cp -r /opt/solr/server/solr/configsets/search/* search
precreate-core statistics /opt/solr/server/solr/configsets/statistics
cp -r /opt/solr/server/solr/configsets/statistics/* statistics
exec solr -f
volumes:
assetstore:
pgdata:
solr_data:
# Special volume used to share Solr configs from 'dspace' to 'dspacesolr' container (see above)
solr_configs:

View File

@@ -9,7 +9,6 @@
# Docker Compose for running the DSpace Angular UI for testing/development
# Requires also running a REST API backend (either locally or remotely),
# for example via 'docker-compose-rest.yml'
version: '3.7'
networks:
dspacenet:
services:

11
docker/dspace-ui.json Normal file
View File

@@ -0,0 +1,11 @@
{
"apps": [
{
"name": "dspace-ui",
"cwd": "/app",
"script": "dist/server/main.js",
"instances": "max",
"exec_mode": "cluster"
}
]
}

View File

@@ -48,7 +48,7 @@ dspace-angular connects to your DSpace installation by using its REST endpoint.
```yaml
rest:
ssl: true
host: api7.dspace.org
host: demo.dspace.org
port: 443
nameSpace: /server
}
@@ -57,7 +57,7 @@ rest:
Alternately you can set the following environment variables. If any of these are set, it will override all configuration files:
```
DSPACE_REST_SSL=true
DSPACE_REST_HOST=api7.dspace.org
DSPACE_REST_HOST=demo.dspace.org
DSPACE_REST_PORT=443
DSPACE_REST_NAMESPACE=/server
```

View File

@@ -1,6 +1,6 @@
{
"name": "dspace-angular",
"version": "7.5.0",
"version": "7.6.2",
"scripts": {
"ng": "ng",
"config:watch": "nodemon",
@@ -15,14 +15,14 @@
"analyze": "webpack-bundle-analyzer dist/browser/stats.json",
"build": "ng build --configuration development",
"build:stats": "ng build --stats-json",
"build:prod": "yarn run build:ssr",
"build:prod": "cross-env NODE_ENV=production yarn run build:ssr",
"build:ssr": "ng build --configuration production && ng run dspace-angular:server:production",
"test": "ng test --sourceMap=true --watch=false --configuration test",
"test:watch": "nodemon --exec \"ng test --sourceMap=true --watch=true --configuration test\"",
"test:headless": "ng test --sourceMap=true --watch=false --configuration test --browsers=ChromeHeadless --code-coverage",
"test": "ng test --source-map=true --watch=false --configuration test",
"test:watch": "nodemon --exec \"ng test --source-map=true --watch=true --configuration test\"",
"test:headless": "ng test --source-map=true --watch=false --configuration test --browsers=ChromeHeadless --code-coverage",
"lint": "ng lint",
"lint-fix": "ng lint --fix=true",
"e2e": "ng e2e",
"e2e": "cross-env NODE_ENV=production ng e2e",
"clean:dev:config": "rimraf src/assets/config.json",
"clean:coverage": "rimraf coverage",
"clean:dist": "rimraf dist",
@@ -55,135 +55,137 @@
"ts-node": "10.2.1"
},
"dependencies": {
"@angular/animations": "~13.3.12",
"@angular/cdk": "^13.2.6",
"@angular/common": "~13.3.12",
"@angular/compiler": "~13.3.12",
"@angular/core": "~13.3.12",
"@angular/forms": "~13.3.12",
"@angular/localize": "13.3.12",
"@angular/platform-browser": "~13.3.12",
"@angular/platform-browser-dynamic": "~13.3.12",
"@angular/platform-server": "~13.3.12",
"@angular/router": "~13.3.12",
"@babel/runtime": "7.17.2",
"@angular/animations": "^15.2.8",
"@angular/cdk": "^15.2.8",
"@angular/common": "^15.2.8",
"@angular/compiler": "^15.2.8",
"@angular/core": "^15.2.8",
"@angular/forms": "^15.2.8",
"@angular/localize": "15.2.8",
"@angular/platform-browser": "^15.2.8",
"@angular/platform-browser-dynamic": "^15.2.8",
"@angular/platform-server": "^15.2.8",
"@angular/router": "^15.2.8",
"@babel/runtime": "7.21.0",
"@kolkov/ngx-gallery": "^2.0.1",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.9.1",
"@material-ui/icons": "^4.11.3",
"@ng-bootstrap/ng-bootstrap": "^11.0.0",
"@ng-dynamic-forms/core": "^15.0.0",
"@ng-dynamic-forms/ui-ng-bootstrap": "^15.0.0",
"@ngrx/effects": "^13.0.2",
"@ngrx/router-store": "^13.0.2",
"@ngrx/store": "^13.0.2",
"@nguniversal/express-engine": "^13.0.2",
"@ngx-translate/core": "^13.0.0",
"@nicky-lenaers/ngx-scroll-to": "^13.0.0",
"@ngrx/effects": "^15.4.0",
"@ngrx/router-store": "^15.4.0",
"@ngrx/store": "^15.4.0",
"@nguniversal/express-engine": "^15.2.1",
"@ngx-translate/core": "^14.0.0",
"@nicky-lenaers/ngx-scroll-to": "^14.0.0",
"@types/grecaptcha": "^3.0.4",
"angular-idle-preload": "3.0.0",
"angulartics2": "^12.0.0",
"axios": "^0.27.2",
"angulartics2": "^12.2.0",
"axios": "^1.6.0",
"bootstrap": "^4.6.1",
"cerialize": "0.1.18",
"cli-progress": "^3.8.0",
"cli-progress": "^3.12.0",
"colors": "^1.4.0",
"compression": "^1.7.4",
"cookie-parser": "1.4.5",
"core-js": "^3.7.0",
"cookie-parser": "1.4.6",
"core-js": "^3.30.1",
"date-fns": "^2.29.3",
"date-fns-tz": "^1.3.7",
"deepmerge": "^4.2.2",
"ejs": "^3.1.8",
"express": "^4.17.1",
"deepmerge": "^4.3.1",
"ejs": "^3.1.10",
"express": "^4.19.2",
"express-rate-limit": "^5.1.3",
"fast-json-patch": "^3.0.0-1",
"fast-json-patch": "^3.1.1",
"filesize": "^6.1.0",
"http-proxy-middleware": "^1.0.5",
"isbot": "^3.6.5",
"http-terminator": "^3.2.0",
"isbot": "^3.6.10",
"js-cookie": "2.2.1",
"js-yaml": "^4.1.0",
"json5": "^2.2.2",
"jsonschema": "1.4.0",
"json5": "^2.2.3",
"jsonschema": "1.4.1",
"jwt-decode": "^3.1.2",
"klaro": "^0.7.18",
"lodash": "^4.17.21",
"lru-cache": "^7.14.1",
"markdown-it": "^13.0.1",
"markdown-it-mathjax3": "^4.3.1",
"markdown-it-mathjax3": "^4.3.2",
"mirador": "^3.3.0",
"mirador-dl-plugin": "^0.13.0",
"mirador-share-plugin": "^0.11.0",
"morgan": "^1.10.0",
"ng-mocks": "^13.1.1",
"ng-mocks": "^14.10.0",
"ng2-file-upload": "1.4.0",
"ng2-nouislider": "^1.8.3",
"ngx-infinite-scroll": "^10.0.1",
"ngx-pagination": "5.0.0",
"ng2-nouislider": "^2.0.0",
"ngx-infinite-scroll": "^15.0.0",
"ngx-pagination": "6.0.3",
"ngx-sortablejs": "^11.1.0",
"ngx-ui-switch": "^13.0.2",
"nouislider": "^14.6.3",
"pem": "1.14.4",
"prop-types": "^15.7.2",
"react-copy-to-clipboard": "^5.0.1",
"ngx-ui-switch": "^14.1.0",
"nouislider": "^15.7.1",
"pem": "1.14.7",
"prop-types": "^15.8.1",
"react-copy-to-clipboard": "^5.1.0",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.5.5",
"sanitize-html": "^2.7.2",
"sortablejs": "1.13.0",
"rxjs": "^7.8.0",
"sanitize-html": "^2.12.1",
"sortablejs": "1.15.0",
"uuid": "^8.3.2",
"webfontloader": "1.6.28",
"zone.js": "~0.11.5"
},
"devDependencies": {
"@angular-builders/custom-webpack": "~13.1.0",
"@angular-devkit/build-angular": "~13.3.10",
"@angular-eslint/builder": "13.1.0",
"@angular-eslint/eslint-plugin": "13.1.0",
"@angular-eslint/eslint-plugin-template": "13.1.0",
"@angular-eslint/schematics": "13.1.0",
"@angular-eslint/template-parser": "13.1.0",
"@angular/cli": "~13.3.10",
"@angular/compiler-cli": "~13.3.12",
"@angular/language-service": "~13.3.12",
"@angular-builders/custom-webpack": "~15.0.0",
"@angular-devkit/build-angular": "^15.2.6",
"@angular-eslint/builder": "15.2.1",
"@angular-eslint/eslint-plugin": "15.2.1",
"@angular-eslint/eslint-plugin-template": "15.2.1",
"@angular-eslint/schematics": "15.2.1",
"@angular-eslint/template-parser": "15.2.1",
"@angular/cli": "^16.0.4",
"@angular/compiler-cli": "^15.2.8",
"@angular/language-service": "^15.2.8",
"@cypress/schematic": "^1.5.0",
"@fortawesome/fontawesome-free": "^6.2.1",
"@ngrx/store-devtools": "^13.0.2",
"@ngtools/webpack": "^13.2.6",
"@nguniversal/builders": "^13.1.1",
"@fortawesome/fontawesome-free": "^6.4.0",
"@ngrx/store-devtools": "^15.4.0",
"@ngtools/webpack": "^15.2.6",
"@nguniversal/builders": "^15.2.1",
"@types/deep-freeze": "0.1.2",
"@types/ejs": "^3.1.1",
"@types/express": "^4.17.9",
"@types/ejs": "^3.1.2",
"@types/express": "^4.17.17",
"@types/jasmine": "~3.6.0",
"@types/js-cookie": "2.2.6",
"@types/lodash": "^4.14.165",
"@types/lodash": "^4.14.194",
"@types/node": "^14.14.9",
"@types/sanitize-html": "^2.6.2",
"@typescript-eslint/eslint-plugin": "5.11.0",
"@typescript-eslint/parser": "5.11.0",
"axe-core": "^4.4.3",
"@types/sanitize-html": "^2.9.0",
"@typescript-eslint/eslint-plugin": "^5.59.1",
"@typescript-eslint/parser": "^5.59.1",
"axe-core": "^4.7.2",
"compression-webpack-plugin": "^9.2.0",
"copy-webpack-plugin": "^6.4.1",
"cross-env": "^7.0.3",
"cypress": "9.7.0",
"cypress-axe": "^0.14.0",
"cypress": "12.17.4",
"cypress-axe": "^1.4.0",
"deep-freeze": "0.0.1",
"eslint": "^8.2.0",
"eslint-plugin-deprecation": "^1.3.2",
"eslint-plugin-import": "^2.25.4",
"eslint-plugin-jsdoc": "^39.6.4",
"eslint": "^8.39.0",
"eslint-plugin-deprecation": "^1.4.1",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-jsdoc": "^45.0.0",
"eslint-plugin-jsonc": "^2.6.0",
"eslint-plugin-lodash": "^7.4.0",
"eslint-plugin-unused-imports": "^2.0.0",
"express-static-gzip": "^2.1.5",
"express-static-gzip": "^2.1.7",
"jasmine-core": "^3.8.0",
"jasmine-marbles": "0.9.2",
"karma": "^6.3.14",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage-istanbul-reporter": "~3.0.2",
"karma": "^6.4.2",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage-istanbul-reporter": "~3.0.3",
"karma-jasmine": "~4.0.0",
"karma-jasmine-html-reporter": "^1.5.0",
"karma-mocha-reporter": "2.2.5",
"ngx-mask": "^13.1.7",
"nodemon": "^2.0.20",
"postcss": "^8.1",
"nodemon": "^2.0.22",
"postcss": "^8.4",
"postcss-apply": "0.12.0",
"postcss-import": "^14.0.0",
"postcss-loader": "^4.0.3",
@@ -193,14 +195,14 @@
"react-dom": "^16.14.0",
"rimraf": "^3.0.2",
"rxjs-spy": "^8.0.2",
"sass": "~1.33.0",
"sass": "~1.62.0",
"sass-loader": "^12.6.0",
"sass-resources-loader": "^2.1.1",
"sass-resources-loader": "^2.2.5",
"ts-node": "^8.10.2",
"typescript": "~4.5.5",
"webpack": "^5.69.1",
"webpack-bundle-analyzer": "^4.4.0",
"typescript": "~4.8.4",
"webpack": "5.76.1",
"webpack-bundle-analyzer": "^4.8.0",
"webpack-cli": "^4.2.0",
"webpack-dev-server": "^4.5.0"
"webpack-dev-server": "^4.13.3"
}
}

View File

@@ -1,13 +0,0 @@
const path = require('path');
const child_process = require('child_process');
const heapSize = 4096;
const webpackPath = path.join('node_modules', 'webpack', 'bin', 'webpack.js');
const params = [
'--max_old_space_size=' + heapSize,
webpackPath,
...process.argv.slice(2)
];
child_process.spawn('node', params, { stdio:'inherit' });

102
server.ts
View File

@@ -26,15 +26,15 @@ import * as ejs from 'ejs';
import * as compression from 'compression';
import * as expressStaticGzip from 'express-static-gzip';
/* eslint-enable import/no-namespace */
import axios from 'axios';
import LRU from 'lru-cache';
import isbot from 'isbot';
import { createCertificate } from 'pem';
import { createServer } from 'https';
import { json } from 'body-parser';
import { createHttpTerminator } from 'http-terminator';
import { existsSync, readFileSync } from 'fs';
import { readFileSync } from 'fs';
import { join } from 'path';
import { enableProdMode } from '@angular/core';
@@ -54,7 +54,7 @@ import { buildAppConfig } from './src/config/config.server';
import { APP_CONFIG, AppConfig } from './src/config/app-config.interface';
import { extendEnvironmentWithAppConfig } from './src/config/config.util';
import { logStartupMessage } from './startup-message';
import { TOKENITEM } from 'src/app/core/auth/models/auth-token-info.model';
import { TOKENITEM } from './src/app/core/auth/models/auth-token-info.model';
/*
@@ -131,6 +131,7 @@ export function app() {
server.engine('html', (_, options, callback) =>
ngExpressEngine({
bootstrap: ServerAppModule,
inlineCriticalCss: environment.universal.inlineCriticalCss,
providers: [
{
provide: REQUEST,
@@ -180,6 +181,15 @@ export function app() {
changeOrigin: true
}));
/**
* Proxy the linksets
*/
router.use('/signposting**', createProxyMiddleware({
target: `${environment.rest.baseUrl}`,
pathRewrite: path => path.replace(environment.ui.nameSpace, '/'),
changeOrigin: true
}));
/**
* Checks if the rateLimiter property is present
* When it is present, the rateLimiter will be enabled. When it is undefined, the rateLimiter will be disabled.
@@ -312,22 +322,23 @@ function initCache() {
if (botCacheEnabled()) {
// Initialize a new "least-recently-used" item cache (where least recently used pages are removed first)
// See https://www.npmjs.com/package/lru-cache
// When enabled, each page defaults to expiring after 1 day
// When enabled, each page defaults to expiring after 1 day (defined in default-app-config.ts)
botCache = new LRU( {
max: environment.cache.serverSide.botCache.max,
ttl: environment.cache.serverSide.botCache.timeToLive || 24 * 60 * 60 * 1000, // 1 day
allowStale: environment.cache.serverSide.botCache.allowStale ?? true // if object is stale, return stale value before deleting
ttl: environment.cache.serverSide.botCache.timeToLive,
allowStale: environment.cache.serverSide.botCache.allowStale
});
}
if (anonymousCacheEnabled()) {
// NOTE: While caches may share SSR pages, this cache must be kept separately because the timeToLive
// may expire pages more frequently.
// When enabled, each page defaults to expiring after 10 seconds (to minimize anonymous users seeing out-of-date content)
// When enabled, each page defaults to expiring after 10 seconds (defined in default-app-config.ts)
// to minimize anonymous users seeing out-of-date content
anonymousCache = new LRU( {
max: environment.cache.serverSide.anonymousCache.max,
ttl: environment.cache.serverSide.anonymousCache.timeToLive || 10 * 1000, // 10 seconds
allowStale: environment.cache.serverSide.anonymousCache.allowStale ?? true // if object is stale, return stale value before deleting
ttl: environment.cache.serverSide.anonymousCache.timeToLive,
allowStale: environment.cache.serverSide.anonymousCache.allowStale
});
}
}
@@ -366,9 +377,19 @@ function cacheCheck(req, res, next) {
}
// If cached copy exists, return it to the user.
if (cachedCopy) {
if (cachedCopy && cachedCopy.page) {
if (cachedCopy.headers) {
Object.keys(cachedCopy.headers).forEach((header) => {
if (cachedCopy.headers[header]) {
if (environment.cache.serverSide.debug) {
console.log(`Restore cached ${header} header`);
}
res.setHeader(header, cachedCopy.headers[header]);
}
});
}
res.locals.ssr = true; // mark response as SSR-generated (enables text compression)
res.send(cachedCopy);
res.send(cachedCopy.page);
// Tell Express to skip all other handlers for this path
// This ensures we don't try to re-render the page since we've already returned the cached copy
@@ -443,22 +464,50 @@ function saveToCache(req, page: any) {
const key = getCacheKey(req);
// Avoid caching "/reload/[random]" paths (these are hard refreshes after logout)
if (key.startsWith('/reload')) { return; }
// Avoid caching not successful responses (status code different from 2XX status)
if (hasNotSucceeded(req.res.statusCode)) { return; }
// Retrieve response headers to save, if any
const headers = retrieveHeaders(req.res);
// If bot cache is enabled, save it to that cache if it doesn't exist or is expired
// (NOTE: has() will return false if page is expired in cache)
if (botCacheEnabled() && !botCache.has(key)) {
botCache.set(key, page);
botCache.set(key, { page, headers });
if (environment.cache.serverSide.debug) { console.log(`CACHE SAVE FOR ${key} in bot cache.`); }
}
// If anonymous cache is enabled, save it to that cache if it doesn't exist or is expired
if (anonymousCacheEnabled() && !anonymousCache.has(key)) {
anonymousCache.set(key, page);
anonymousCache.set(key, { page, headers });
if (environment.cache.serverSide.debug) { console.log(`CACHE SAVE FOR ${key} in anonymous cache.`); }
}
}
}
/**
* Check if status code is different from 2XX
* @param statusCode
*/
function hasNotSucceeded(statusCode) {
const rgx = new RegExp(/^20+/);
return !rgx.test(statusCode);
}
function retrieveHeaders(response) {
const headers = Object.create({});
if (Array.isArray(environment.cache.serverSide.headers) && environment.cache.serverSide.headers.length > 0) {
environment.cache.serverSide.headers.forEach((header) => {
if (response.hasHeader(header)) {
if (environment.cache.serverSide.debug) {
console.log(`Save ${header} header to cache`);
}
headers[header] = response.getHeader(header);
}
});
}
return headers;
}
/**
* Whether a user is authenticated or not
*/
@@ -479,23 +528,46 @@ function serverStarted() {
* @param keys SSL credentials
*/
function createHttpsServer(keys) {
createServer({
const listener = createServer({
key: keys.serviceKey,
cert: keys.certificate
}, app).listen(environment.ui.port, environment.ui.host, () => {
serverStarted();
});
// Graceful shutdown when signalled
const terminator = createHttpTerminator({server: listener});
process.on('SIGINT', () => {
void (async ()=> {
console.debug('Closing HTTPS server on signal');
await terminator.terminate().catch(e => { console.error(e); });
console.debug('HTTPS server closed');
})();
});
}
/**
* Create an HTTP server with the configured port and host.
*/
function run() {
const port = environment.ui.port || 4000;
const host = environment.ui.host || '/';
// Start up the Node server
const server = app();
server.listen(port, host, () => {
const listener = server.listen(port, host, () => {
serverStarted();
});
// Graceful shutdown when signalled
const terminator = createHttpTerminator({server: listener});
process.on('SIGINT', () => {
void (async () => {
console.debug('Closing HTTP server on signal');
await terminator.terminate().catch(e => { console.error(e); });
console.debug('HTTP server closed.');return undefined;
})();
});
}
function start() {

View File

@@ -1,12 +1,22 @@
import { URLCombiner } from '../core/url-combiner/url-combiner';
import { getAccessControlModuleRoute } from '../app-routing-paths';
export const GROUP_EDIT_PATH = 'groups';
export const EPERSON_PATH = 'epeople';
export function getEPersonsRoute(): string {
return new URLCombiner(getAccessControlModuleRoute(), EPERSON_PATH).toString();
}
export function getEPersonEditRoute(id: string): string {
return new URLCombiner(getEPersonsRoute(), id, 'edit').toString();
}
export const GROUP_PATH = 'groups';
export function getGroupsRoute() {
return new URLCombiner(getAccessControlModuleRoute(), GROUP_EDIT_PATH).toString();
return new URLCombiner(getAccessControlModuleRoute(), GROUP_PATH).toString();
}
export function getGroupEditRoute(id: string) {
return new URLCombiner(getAccessControlModuleRoute(), GROUP_EDIT_PATH, id).toString();
return new URLCombiner(getGroupsRoute(), id, 'edit').toString();
}

View File

@@ -3,17 +3,24 @@ import { RouterModule } from '@angular/router';
import { EPeopleRegistryComponent } from './epeople-registry/epeople-registry.component';
import { GroupFormComponent } from './group-registry/group-form/group-form.component';
import { GroupsRegistryComponent } from './group-registry/groups-registry.component';
import { GROUP_EDIT_PATH } from './access-control-routing-paths';
import { EPERSON_PATH, GROUP_PATH } from './access-control-routing-paths';
import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver';
import { GroupPageGuard } from './group-registry/group-page.guard';
import { GroupAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/group-administrator.guard';
import { SiteAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
import {
GroupAdministratorGuard
} from '../core/data/feature-authorization/feature-authorization-guard/group-administrator.guard';
import {
SiteAdministratorGuard
} from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
import { BulkAccessComponent } from './bulk-access/bulk-access.component';
import { EPersonFormComponent } from './epeople-registry/eperson-form/eperson-form.component';
import { EPersonResolver } from './epeople-registry/eperson-resolver.service';
@NgModule({
imports: [
RouterModule.forChild([
{
path: 'epeople',
path: EPERSON_PATH,
component: EPeopleRegistryComponent,
resolve: {
breadcrumb: I18nBreadcrumbResolver
@@ -22,7 +29,26 @@ import { SiteAdministratorGuard } from '../core/data/feature-authorization/featu
canActivate: [SiteAdministratorGuard]
},
{
path: GROUP_EDIT_PATH,
path: `${EPERSON_PATH}/create`,
component: EPersonFormComponent,
resolve: {
breadcrumb: I18nBreadcrumbResolver,
},
data: { title: 'admin.access-control.epeople.add.title', breadcrumbKey: 'admin.access-control.epeople.add' },
canActivate: [SiteAdministratorGuard],
},
{
path: `${EPERSON_PATH}/:id/edit`,
component: EPersonFormComponent,
resolve: {
breadcrumb: I18nBreadcrumbResolver,
ePerson: EPersonResolver,
},
data: { title: 'admin.access-control.epeople.edit.title', breadcrumbKey: 'admin.access-control.epeople.edit' },
canActivate: [SiteAdministratorGuard],
},
{
path: GROUP_PATH,
component: GroupsRegistryComponent,
resolve: {
breadcrumb: I18nBreadcrumbResolver
@@ -31,7 +57,7 @@ import { SiteAdministratorGuard } from '../core/data/feature-authorization/featu
canActivate: [GroupAdministratorGuard]
},
{
path: `${GROUP_EDIT_PATH}/newGroup`,
path: `${GROUP_PATH}/create`,
component: GroupFormComponent,
resolve: {
breadcrumb: I18nBreadcrumbResolver
@@ -40,14 +66,23 @@ import { SiteAdministratorGuard } from '../core/data/feature-authorization/featu
canActivate: [GroupAdministratorGuard]
},
{
path: `${GROUP_EDIT_PATH}/:groupId`,
path: `${GROUP_PATH}/:groupId/edit`,
component: GroupFormComponent,
resolve: {
breadcrumb: I18nBreadcrumbResolver
},
data: { title: 'admin.access-control.groups.title.singleGroup', breadcrumbKey: 'admin.access-control.groups.singleGroup' },
canActivate: [GroupPageGuard]
}
},
{
path: 'bulk-access',
component: BulkAccessComponent,
resolve: {
breadcrumb: I18nBreadcrumbResolver
},
data: { title: 'admin.access-control.bulk-access.title', breadcrumbKey: 'admin.access-control.bulk-access' },
canActivate: [SiteAdministratorGuard]
},
])
]
})

View File

@@ -12,6 +12,12 @@ import { GroupsRegistryComponent } from './group-registry/groups-registry.compon
import { FormModule } from '../shared/form/form.module';
import { DYNAMIC_ERROR_MESSAGES_MATCHER, DynamicErrorMessagesMatcher } from '@ng-dynamic-forms/core';
import { AbstractControl } from '@angular/forms';
import { BulkAccessComponent } from './bulk-access/bulk-access.component';
import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap';
import { BulkAccessBrowseComponent } from './bulk-access/browse/bulk-access-browse.component';
import { BulkAccessSettingsComponent } from './bulk-access/settings/bulk-access-settings.component';
import { SearchModule } from '../shared/search/search.module';
import { AccessControlFormModule } from '../shared/access-control-form-container/access-control-form.module';
/**
* Condition for displaying error messages on email form field
@@ -28,6 +34,9 @@ export const ValidateEmailErrorStateMatcher: DynamicErrorMessagesMatcher =
RouterModule,
AccessControlRoutingModule,
FormModule,
NgbAccordionModule,
SearchModule,
AccessControlFormModule,
],
exports: [
MembersListComponent,
@@ -39,6 +48,9 @@ export const ValidateEmailErrorStateMatcher: DynamicErrorMessagesMatcher =
GroupFormComponent,
SubgroupsListComponent,
MembersListComponent,
BulkAccessComponent,
BulkAccessBrowseComponent,
BulkAccessSettingsComponent,
],
providers: [
{

View File

@@ -0,0 +1,68 @@
<ngb-accordion #acc="ngbAccordion" [activeIds]="'browse'">
<ngb-panel [id]="'browse'">
<ng-template ngbPanelHeader>
<div class="w-100 d-flex gap-3 justify-content-between collapse-toggle" ngbPanelToggle (click)="acc.toggle('browse')"
data-test="browse">
<button type="button" class="btn btn-link p-0" (click)="$event.preventDefault()"
[attr.aria-expanded]="acc.isExpanded('browse')"
aria-controls="bulk-access-browse-panel-content">
{{ 'admin.access-control.bulk-access-browse.header' | translate }}
</button>
<div class="text-right d-flex gap-2">
<div class="d-flex my-auto">
<span *ngIf="acc.isExpanded('browse')" class="fas fa-chevron-up fa-fw"></span>
<span *ngIf="!acc.isExpanded('browse')" class="fas fa-chevron-down fa-fw"></span>
</div>
</div>
</div>
</ng-template>
<ng-template ngbPanelContent>
<div id="bulk-access-browse-panel-content">
<ul ngbNav #nav="ngbNav" [(activeId)]="activateId" class="nav-pills">
<li [ngbNavItem]="'search'" role="presentation">
<a ngbNavLink>{{'admin.access-control.bulk-access-browse.search.header' | translate}}</a>
<ng-template ngbNavContent>
<div class="mx-n3">
<ds-themed-search [configuration]="'administrativeBulkAccess'"
[selectable]="true"
[selectionConfig]="{ repeatable: true, listId: listId }"
[showThumbnails]="false"></ds-themed-search>
</div>
</ng-template>
</li>
<li [ngbNavItem]="'selected'" role="presentation">
<a ngbNavLink>
{{'admin.access-control.bulk-access-browse.selected.header' | translate: {number: ((objectsSelected$ | async)?.payload?.totalElements) ? (objectsSelected$ | async)?.payload?.totalElements : '0'} }}
</a>
<ng-template ngbNavContent>
<ds-pagination
[paginationOptions]="(paginationOptions$ | async)"
[collectionSize]="(objectsSelected$|async)?.payload?.totalElements"
[objects]="(objectsSelected$|async)"
[showPaginator]="false"
(prev)="pagePrev()"
(next)="pageNext()">
<ul *ngIf="(objectsSelected$|async)?.hasSucceeded" class="list-unstyled ml-4">
<li *ngFor='let object of (objectsSelected$|async)?.payload?.page | paginate: { itemsPerPage: (paginationOptions$ | async).pageSize,
currentPage: (paginationOptions$ | async).currentPage, totalItems: (objectsSelected$|async)?.payload?.page.length }; let i = index; let last = last '
class="mt-4 mb-4 d-flex"
[attr.data-test]="'list-object' | dsBrowserOnly">
<ds-selectable-list-item-control [index]="i"
[object]="object"
[selectionConfig]="{ repeatable: true, listId: listId }"></ds-selectable-list-item-control>
<ds-listable-object-component-loader [listID]="listId"
[index]="i"
[object]="object"
[showThumbnails]="false"
[viewMode]="'list'"></ds-listable-object-component-loader>
</li>
</ul>
</ds-pagination>
</ng-template>
</li>
</ul>
<div [ngbNavOutlet]="nav" class="mt-5"></div>
</div>
</ng-template>
</ngb-panel>
</ngb-accordion>

View File

@@ -0,0 +1,82 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { of } from 'rxjs';
import { NgbAccordionModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
import { TranslateModule } from '@ngx-translate/core';
import { BulkAccessBrowseComponent } from './bulk-access-browse.component';
import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service';
import { SelectableObject } from '../../../shared/object-list/selectable-list/selectable-list.service.spec';
import { PageInfo } from '../../../core/shared/page-info.model';
import { buildPaginatedList } from '../../../core/data/paginated-list.model';
import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils';
describe('BulkAccessBrowseComponent', () => {
let component: BulkAccessBrowseComponent;
let fixture: ComponentFixture<BulkAccessBrowseComponent>;
const listID1 = 'id1';
const value1 = 'Selected object';
const value2 = 'Another selected object';
const selected1 = new SelectableObject(value1);
const selected2 = new SelectableObject(value2);
const testSelection = { id: listID1, selection: [selected1, selected2] } ;
const selectableListService = jasmine.createSpyObj('SelectableListService', ['getSelectableList', 'deselectAll']);
beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({
imports: [
NgbAccordionModule,
NgbNavModule,
TranslateModule.forRoot()
],
declarations: [BulkAccessBrowseComponent],
providers: [ { provide: SelectableListService, useValue: selectableListService }, ],
schemas: [
NO_ERRORS_SCHEMA
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(BulkAccessBrowseComponent);
component = fixture.componentInstance;
(component as any).selectableListService.getSelectableList.and.returnValue(of(testSelection));
fixture.detectChanges();
});
afterEach(() => {
fixture.destroy();
component = null;
});
it('should create the component', () => {
expect(component).toBeTruthy();
});
it('should have an initial active nav id of "search"', () => {
expect(component.activateId).toEqual('search');
});
it('should have an initial pagination options object with default values', () => {
expect(component.paginationOptions$.getValue().id).toEqual('bas');
expect(component.paginationOptions$.getValue().pageSize).toEqual(5);
expect(component.paginationOptions$.getValue().currentPage).toEqual(1);
});
it('should have an initial remote data with a paginated list as value', () => {
const list = buildPaginatedList(new PageInfo({
'elementsPerPage': 5,
'totalElements': 2,
'totalPages': 1,
'currentPage': 1
}), [selected1, selected2]) ;
const rd = createSuccessfulRemoteDataObject(list);
expect(component.objectsSelected$.value).toEqual(rd);
});
});

View File

@@ -0,0 +1,119 @@
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
import { BehaviorSubject, Subscription } from 'rxjs';
import { distinctUntilChanged, map } from 'rxjs/operators';
import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-page.component';
import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service';
import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service';
import { SelectableListState } from '../../../shared/object-list/selectable-list/selectable-list.reducer';
import { RemoteData } from '../../../core/data/remote-data';
import { buildPaginatedList, PaginatedList } from '../../../core/data/paginated-list.model';
import { ListableObject } from '../../../shared/object-collection/shared/listable-object.model';
import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils';
import { PageInfo } from '../../../core/shared/page-info.model';
import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model';
import { hasValue } from '../../../shared/empty.util';
@Component({
selector: 'ds-bulk-access-browse',
templateUrl: 'bulk-access-browse.component.html',
styleUrls: ['./bulk-access-browse.component.scss'],
providers: [
{
provide: SEARCH_CONFIG_SERVICE,
useClass: SearchConfigurationService
}
]
})
export class BulkAccessBrowseComponent implements OnInit, OnDestroy {
/**
* The selection list id
*/
@Input() listId!: string;
/**
* The active nav id
*/
activateId = 'search';
/**
* The list of the objects already selected
*/
objectsSelected$: BehaviorSubject<RemoteData<PaginatedList<ListableObject>>> = new BehaviorSubject<RemoteData<PaginatedList<ListableObject>>>(null);
/**
* The pagination options object used for the list of selected elements
*/
paginationOptions$: BehaviorSubject<PaginationComponentOptions> = new BehaviorSubject<PaginationComponentOptions>(Object.assign(new PaginationComponentOptions(), {
id: 'bas',
pageSize: 5,
currentPage: 1
}));
/**
* Array to track all subscriptions and unsubscribe them onDestroy
*/
private subs: Subscription[] = [];
constructor(private selectableListService: SelectableListService) {}
/**
* Subscribe to selectable list updates
*/
ngOnInit(): void {
this.subs.push(
this.selectableListService.getSelectableList(this.listId).pipe(
distinctUntilChanged(),
map((list: SelectableListState) => this.generatePaginatedListBySelectedElements(list))
).subscribe(this.objectsSelected$)
);
}
pageNext() {
this.paginationOptions$.next(Object.assign(new PaginationComponentOptions(), this.paginationOptions$.value, {
currentPage: this.paginationOptions$.value.currentPage + 1
}));
}
pagePrev() {
this.paginationOptions$.next(Object.assign(new PaginationComponentOptions(), this.paginationOptions$.value, {
currentPage: this.paginationOptions$.value.currentPage - 1
}));
}
private calculatePageCount(pageSize, totalCount = 0) {
// we suppose that if we have 0 items we want 1 empty page
return totalCount < pageSize ? 1 : Math.ceil(totalCount / pageSize);
}
/**
* Generate The RemoteData object containing the list of the selected elements
* @param list
* @private
*/
private generatePaginatedListBySelectedElements(list: SelectableListState): RemoteData<PaginatedList<ListableObject>> {
const pageInfo = new PageInfo({
elementsPerPage: this.paginationOptions$.value.pageSize,
totalElements: list?.selection.length,
totalPages: this.calculatePageCount(this.paginationOptions$.value.pageSize, list?.selection.length),
currentPage: this.paginationOptions$.value.currentPage
});
if (pageInfo.currentPage > pageInfo.totalPages) {
pageInfo.currentPage = pageInfo.totalPages;
this.paginationOptions$.next(Object.assign(new PaginationComponentOptions(), this.paginationOptions$.value, {
currentPage: pageInfo.currentPage
}));
}
return createSuccessfulRemoteDataObject(buildPaginatedList(pageInfo, list?.selection || []));
}
ngOnDestroy(): void {
this.subs
.filter((sub) => hasValue(sub))
.forEach((sub) => sub.unsubscribe());
this.selectableListService.deselectAll(this.listId);
}
}

View File

@@ -0,0 +1,20 @@
<div class="container">
<h1>{{ 'admin.access-control.bulk-access.title' | translate }}</h1>
<ds-bulk-access-browse [listId]="listId"></ds-bulk-access-browse>
<div class="clearfix mb-3"></div>
<ds-bulk-access-settings #dsBulkSettings ></ds-bulk-access-settings>
<hr>
<div class="d-flex justify-content-end">
<button class="btn btn-outline-primary mr-3" (click)="reset()">
{{ 'access-control-cancel' | translate }}
</button>
<button class="btn btn-primary" [disabled]="!canExport()" (click)="submit()">
{{ 'access-control-execute' | translate }}
</button>
</div>
</div>

View File

@@ -0,0 +1,158 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { TranslateModule } from '@ngx-translate/core';
import { of } from 'rxjs';
import { BulkAccessComponent } from './bulk-access.component';
import { BulkAccessControlService } from '../../shared/access-control-form-container/bulk-access-control.service';
import { SelectableListService } from '../../shared/object-list/selectable-list/selectable-list.service';
import { SelectableListState } from '../../shared/object-list/selectable-list/selectable-list.reducer';
import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils';
import { Process } from '../../process-page/processes/process.model';
import { RouterTestingModule } from '@angular/router/testing';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { NotificationsServiceStub } from '../../shared/testing/notifications-service.stub';
describe('BulkAccessComponent', () => {
let component: BulkAccessComponent;
let fixture: ComponentFixture<BulkAccessComponent>;
let bulkAccessControlService: any;
let selectableListService: any;
const selectableListServiceMock = jasmine.createSpyObj('SelectableListService', ['getSelectableList', 'deselectAll']);
const bulkAccessControlServiceMock = jasmine.createSpyObj('bulkAccessControlService', ['createPayloadFile', 'executeScript']);
const mockFormState = {
'bitstream': [],
'item': [
{
'name': 'embargo',
'startDate': {
'year': 2026,
'month': 5,
'day': 31
},
'endDate': null
}
],
'state': {
'item': {
'toggleStatus': true,
'accessMode': 'replace'
},
'bitstream': {
'toggleStatus': false,
'accessMode': '',
'changesLimit': '',
'selectedBitstreams': []
}
}
};
const mockFile = {
'uuids': [
'1234', '5678'
],
'file': { }
};
const mockSettings: any = jasmine.createSpyObj('AccessControlFormContainerComponent', {
getValue: jasmine.createSpy('getValue'),
reset: jasmine.createSpy('reset')
});
const selection: any[] = [{ indexableObject: { uuid: '1234' } }, { indexableObject: { uuid: '5678' } }];
const selectableListState: SelectableListState = { id: 'test', selection };
const expectedIdList = ['1234', '5678'];
const selectableListStateEmpty: SelectableListState = { id: 'test', selection: [] };
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [
RouterTestingModule,
TranslateModule.forRoot()
],
declarations: [ BulkAccessComponent ],
providers: [
{ provide: BulkAccessControlService, useValue: bulkAccessControlServiceMock },
{ provide: NotificationsService, useValue: NotificationsServiceStub },
{ provide: SelectableListService, useValue: selectableListServiceMock }
],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(BulkAccessComponent);
component = fixture.componentInstance;
bulkAccessControlService = TestBed.inject(BulkAccessControlService);
selectableListService = TestBed.inject(SelectableListService);
});
afterEach(() => {
fixture.destroy();
});
describe('when there are no elements selected', () => {
beforeEach(() => {
(component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListStateEmpty));
fixture.detectChanges();
component.settings = mockSettings;
});
it('should create', () => {
expect(component).toBeTruthy();
});
it('should generate the id list by selected elements', () => {
expect(component.objectsSelected$.value).toEqual([]);
});
it('should disable the execute button when there are no objects selected', () => {
expect(component.canExport()).toBe(false);
});
});
describe('when there are elements selected', () => {
beforeEach(() => {
(component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState));
fixture.detectChanges();
component.settings = mockSettings;
});
it('should create', () => {
expect(component).toBeTruthy();
});
it('should generate the id list by selected elements', () => {
expect(component.objectsSelected$.value).toEqual(expectedIdList);
});
it('should enable the execute button when there are objects selected', () => {
component.objectsSelected$.next(['1234']);
expect(component.canExport()).toBe(true);
});
it('should call the settings reset method when reset is called', () => {
component.reset();
expect(component.settings.reset).toHaveBeenCalled();
});
it('should call the bulkAccessControlService executeScript method when submit is called', () => {
(component.settings as any).getValue.and.returnValue(mockFormState);
bulkAccessControlService.createPayloadFile.and.returnValue(mockFile);
bulkAccessControlService.executeScript.and.returnValue(createSuccessfulRemoteDataObject$(new Process()));
component.objectsSelected$.next(['1234']);
component.submit();
expect(bulkAccessControlService.executeScript).toHaveBeenCalled();
});
});
});

View File

@@ -0,0 +1,94 @@
import { Component, OnInit, ViewChild } from '@angular/core';
import { BehaviorSubject, Subscription } from 'rxjs';
import { distinctUntilChanged, map } from 'rxjs/operators';
import { BulkAccessSettingsComponent } from './settings/bulk-access-settings.component';
import { BulkAccessControlService } from '../../shared/access-control-form-container/bulk-access-control.service';
import { SelectableListState } from '../../shared/object-list/selectable-list/selectable-list.reducer';
import { SelectableListService } from '../../shared/object-list/selectable-list/selectable-list.service';
@Component({
selector: 'ds-bulk-access',
templateUrl: './bulk-access.component.html',
styleUrls: ['./bulk-access.component.scss']
})
export class BulkAccessComponent implements OnInit {
/**
* The selection list id
*/
listId = 'bulk-access-list';
/**
* The list of the objects already selected
*/
objectsSelected$: BehaviorSubject<string[]> = new BehaviorSubject<string[]>([]);
/**
* Array to track all subscriptions and unsubscribe them onDestroy
*/
private subs: Subscription[] = [];
/**
* The SectionsDirective reference
*/
@ViewChild('dsBulkSettings') settings: BulkAccessSettingsComponent;
constructor(
private bulkAccessControlService: BulkAccessControlService,
private selectableListService: SelectableListService
) {
}
ngOnInit(): void {
this.subs.push(
this.selectableListService.getSelectableList(this.listId).pipe(
distinctUntilChanged(),
map((list: SelectableListState) => this.generateIdListBySelectedElements(list))
).subscribe(this.objectsSelected$)
);
}
canExport(): boolean {
return this.objectsSelected$.value?.length > 0;
}
/**
* Reset the form to its initial state
* This will also reset the state of the child components (bitstream and item access)
*/
reset(): void {
this.settings.reset();
}
/**
* Submit the form
* This will create a payload file and execute the script
*/
submit(): void {
const settings = this.settings.getValue();
const bitstreamAccess = settings.bitstream;
const itemAccess = settings.item;
const { file } = this.bulkAccessControlService.createPayloadFile({
bitstreamAccess,
itemAccess,
state: settings.state
});
this.bulkAccessControlService.executeScript(
this.objectsSelected$.value || [],
file
).subscribe();
}
/**
* Generate The RemoteData object containing the list of the selected elements
* @param list
* @private
*/
private generateIdListBySelectedElements(list: SelectableListState): string[] {
return list?.selection?.map((entry: any) => entry.indexableObject.uuid);
}
}

View File

@@ -0,0 +1,21 @@
<ngb-accordion #acc="ngbAccordion" [activeIds]="'settings'">
<ngb-panel [id]="'settings'">
<ng-template ngbPanelHeader>
<div class="w-100 d-flex gap-3 justify-content-between collapse-toggle" ngbPanelToggle (click)="acc.toggle('settings')" data-test="settings">
<button type="button" class="btn btn-link p-0" (click)="$event.preventDefault()" [attr.aria-expanded]="acc.isExpanded('settings')"
aria-controls="bulk-access-settings-panel-content">
{{ 'admin.access-control.bulk-access-settings.header' | translate }}
</button>
<div class="text-right d-flex gap-2">
<div class="d-flex my-auto">
<span *ngIf="acc.isExpanded('settings')" class="fas fa-chevron-up fa-fw"></span>
<span *ngIf="!acc.isExpanded('settings')" class="fas fa-chevron-down fa-fw"></span>
</div>
</div>
</div>
</ng-template>
<ng-template ngbPanelContent>
<ds-access-control-form-container id="bulk-access-settings-panel-content" #dsAccessControlForm [showSubmit]="false"></ds-access-control-form-container>
</ng-template>
</ngb-panel>
</ngb-accordion>

View File

@@ -0,0 +1,81 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap';
import { TranslateModule } from '@ngx-translate/core';
import { BulkAccessSettingsComponent } from './bulk-access-settings.component';
import { NO_ERRORS_SCHEMA } from '@angular/core';
describe('BulkAccessSettingsComponent', () => {
let component: BulkAccessSettingsComponent;
let fixture: ComponentFixture<BulkAccessSettingsComponent>;
const mockFormState = {
'bitstream': [],
'item': [
{
'name': 'embargo',
'startDate': {
'year': 2026,
'month': 5,
'day': 31
},
'endDate': null
}
],
'state': {
'item': {
'toggleStatus': true,
'accessMode': 'replace'
},
'bitstream': {
'toggleStatus': false,
'accessMode': '',
'changesLimit': '',
'selectedBitstreams': []
}
}
};
const mockControl: any = jasmine.createSpyObj('AccessControlFormContainerComponent', {
getFormValue: jasmine.createSpy('getFormValue'),
reset: jasmine.createSpy('reset')
});
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [NgbAccordionModule, TranslateModule.forRoot()],
declarations: [BulkAccessSettingsComponent],
schemas: [NO_ERRORS_SCHEMA]
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(BulkAccessSettingsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
component.controlForm = mockControl;
});
it('should create the component', () => {
expect(component).toBeTruthy();
});
it('should have a method to get the form value', () => {
expect(component.getValue).toBeDefined();
});
it('should have a method to reset the form', () => {
expect(component.reset).toBeDefined();
});
it('should return the correct form value', () => {
const expectedValue = mockFormState;
(component.controlForm as any).getFormValue.and.returnValue(mockFormState);
const actualValue = component.getValue();
// @ts-ignore
expect(actualValue).toEqual(expectedValue);
});
it('should call reset on the control form', () => {
component.reset();
expect(component.controlForm.reset).toHaveBeenCalled();
});
});

View File

@@ -0,0 +1,34 @@
import { Component, ViewChild } from '@angular/core';
import {
AccessControlFormContainerComponent
} from '../../../shared/access-control-form-container/access-control-form-container.component';
@Component({
selector: 'ds-bulk-access-settings',
templateUrl: 'bulk-access-settings.component.html',
styleUrls: ['./bulk-access-settings.component.scss'],
exportAs: 'dsBulkSettings'
})
export class BulkAccessSettingsComponent {
/**
* The SectionsDirective reference
*/
@ViewChild('dsAccessControlForm') controlForm: AccessControlFormContainerComponent<any>;
/**
* Will be used from a parent component to read the value of the form
*/
getValue() {
return this.controlForm.getFormValue();
}
/**
* Reset the form to its initial state
* This will also reset the state of the child components (bitstream and item access)
*/
reset() {
this.controlForm.reset();
}
}

View File

@@ -2,98 +2,92 @@
<div class="epeople-registry row">
<div class="col-12">
<div class="d-flex justify-content-between border-bottom mb-3">
<h2 id="header" class="pb-2">{{labelPrefix + 'head' | translate}}</h2>
<h1 id="header" class="pb-2">{{labelPrefix + 'head' | translate}}</h1>
<div *ngIf="!isEPersonFormShown">
<div>
<button class="mr-auto btn btn-success addEPerson-button"
(click)="isEPersonFormShown = true">
[routerLink]="'create'">
<i class="fas fa-plus"></i>
<span class="d-none d-sm-inline">{{labelPrefix + 'button.add' | translate}}</span>
<span class="d-none d-sm-inline ml-1">{{labelPrefix + 'button.add' | translate}}</span>
</button>
</div>
</div>
<ds-eperson-form *ngIf="isEPersonFormShown" (submitForm)="reset()"
(cancelForm)="isEPersonFormShown = false"></ds-eperson-form>
<div *ngIf="!isEPersonFormShown">
<h3 id="search" class="border-bottom pb-2">{{labelPrefix + 'search.head' | translate}}
</h3>
<form [formGroup]="searchForm" (ngSubmit)="search(searchForm.value)" class="d-flex justify-content-between">
<div>
<select name="scope" id="scope" formControlName="scope" class="form-control" aria-label="Search scope">
<option value="metadata">{{labelPrefix + 'search.scope.metadata' | translate}}</option>
<option value="email">{{labelPrefix + 'search.scope.email' | translate}}</option>
</select>
</div>
<div class="flex-grow-1 mr-3 ml-3">
<div class="form-group input-group">
<input type="text" name="query" id="query" formControlName="query"
class="form-control" attr.aria-label="{{labelPrefix + 'search.placeholder' | translate}}"
[placeholder]="(labelPrefix + 'search.placeholder' | translate)">
<span class="input-group-append">
<h2 id="search" class="border-bottom pb-2">
{{labelPrefix + 'search.head' | translate}}
</h2>
<form [formGroup]="searchForm" (ngSubmit)="search(searchForm.value)" class="d-flex justify-content-between">
<div>
<select name="scope" id="scope" formControlName="scope" class="form-control" aria-label="Search scope">
<option value="metadata">{{labelPrefix + 'search.scope.metadata' | translate}}</option>
<option value="email">{{labelPrefix + 'search.scope.email' | translate}}</option>
</select>
</div>
<div class="flex-grow-1 mr-3 ml-3">
<div class="form-group input-group">
<input type="text" name="query" id="query" formControlName="query"
class="form-control" [attr.aria-label]="labelPrefix + 'search.placeholder' | translate"
[placeholder]="(labelPrefix + 'search.placeholder' | translate)">
<span class="input-group-append">
<button type="submit" class="search-button btn btn-primary">
<i class="fas fa-search"></i> {{ labelPrefix + 'search.button' | translate }}
</button>
</span>
</div>
</div>
<div>
<button (click)="clearFormAndResetResult();"
class="search-button btn btn-secondary">{{labelPrefix + 'button.see-all' | translate}}</button>
</div>
</form>
<ds-themed-loading *ngIf="searching$ | async"></ds-themed-loading>
<ds-pagination
*ngIf="(pageInfoState$ | async)?.totalElements > 0 && !(searching$ | async)"
[paginationOptions]="config"
[pageInfoState]="pageInfoState$"
[collectionSize]="(pageInfoState$ | async)?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="epeople" class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th scope="col">{{labelPrefix + 'table.id' | translate}}</th>
<th scope="col">{{labelPrefix + 'table.name' | translate}}</th>
<th scope="col">{{labelPrefix + 'table.email' | translate}}</th>
<th>{{labelPrefix + 'table.edit' | translate}}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let epersonDto of (ePeopleDto$ | async)?.page"
[ngClass]="{'table-primary' : isActive(epersonDto.eperson) | async}">
<td>{{epersonDto.eperson.id}}</td>
<td>{{epersonDto.eperson.name}}</td>
<td>{{epersonDto.eperson.email}}</td>
<td>
<div class="btn-group edit-field">
<button class="delete-button" (click)="toggleEditEPerson(epersonDto.eperson)"
class="btn btn-outline-primary btn-sm access-control-editEPersonButton"
title="{{labelPrefix + 'table.edit.buttons.edit' | translate: {name: epersonDto.eperson.name} }}">
<i class="fas fa-edit fa-fw"></i>
</button>
<button [disabled]="!epersonDto.ableToDelete" (click)="deleteEPerson(epersonDto.eperson)"
class="btn btn-outline-danger btn-sm access-control-deleteEPersonButton"
title="{{labelPrefix + 'table.edit.buttons.remove' | translate: {name: epersonDto.eperson.name} }}">
<i class="fas fa-trash-alt fa-fw"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</ds-pagination>
<div *ngIf="(pageInfoState$ | async)?.totalElements == 0" class="alert alert-info w-100 mb-2" role="alert">
{{labelPrefix + 'no-items' | translate}}
</div>
<div>
<button (click)="clearFormAndResetResult();"
class="search-button btn btn-secondary">{{labelPrefix + 'button.see-all' | translate}}</button>
</div>
</form>
<ds-themed-loading *ngIf="searching$ | async"></ds-themed-loading>
<ds-pagination
*ngIf="(pageInfoState$ | async)?.totalElements > 0 && !(searching$ | async)"
[paginationOptions]="config"
[collectionSize]="(pageInfoState$ | async)?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="epeople" class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th scope="col">{{labelPrefix + 'table.id' | translate}}</th>
<th scope="col">{{labelPrefix + 'table.name' | translate}}</th>
<th scope="col">{{labelPrefix + 'table.email' | translate}}</th>
<th>{{labelPrefix + 'table.edit' | translate}}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let epersonDto of (ePeopleDto$ | async)?.page"
[ngClass]="{'table-primary' : isActive(epersonDto.eperson) | async}">
<td>{{epersonDto.eperson.id}}</td>
<td>{{ dsoNameService.getName(epersonDto.eperson) }}</td>
<td>{{epersonDto.eperson.email}}</td>
<td>
<div class="btn-group edit-field">
<button [routerLink]="getEditEPeoplePage(epersonDto.eperson.id)"
class="btn btn-outline-primary btn-sm access-control-editEPersonButton"
title="{{labelPrefix + 'table.edit.buttons.edit' | translate: { name: dsoNameService.getName(epersonDto.eperson) } }}">
<i class="fas fa-edit fa-fw"></i>
</button>
<button *ngIf="epersonDto.ableToDelete" (click)="deleteEPerson(epersonDto.eperson)"
class="delete-button btn btn-outline-danger btn-sm access-control-deleteEPersonButton"
title="{{labelPrefix + 'table.edit.buttons.remove' | translate: { name: dsoNameService.getName(epersonDto.eperson) } }}">
<i class="fas fa-trash-alt fa-fw"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</ds-pagination>
<div *ngIf="(pageInfoState$ | async)?.totalElements == 0" class="alert alert-info w-100 mb-2" role="alert">
{{labelPrefix + 'no-items' | translate}}
</div>
</div>
</div>

View File

@@ -1,7 +1,7 @@
import { Router } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { CommonModule } from '@angular/common';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, fakeAsync, TestBed, tick, waitForAsync } from '@angular/core/testing';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { BrowserModule, By } from '@angular/platform-browser';
@@ -42,6 +42,7 @@ describe('EPeopleRegistryComponent', () => {
let paginationService;
beforeEach(waitForAsync(() => {
jasmine.getEnv().allowRespy(true);
mockEPeople = [EPersonMock, EPersonMock2];
ePersonDataServiceStub = {
activeEPerson: null,
@@ -98,7 +99,7 @@ describe('EPeopleRegistryComponent', () => {
deleteEPerson(ePerson: EPerson): Observable<boolean> {
this.allEpeople = this.allEpeople.filter((ePerson2: EPerson) => {
return (ePerson2.uuid !== ePerson.uuid);
});
});
return observableOf(true);
},
editEPerson(ePerson: EPerson) {
@@ -202,36 +203,6 @@ describe('EPeopleRegistryComponent', () => {
});
});
describe('toggleEditEPerson', () => {
describe('when you click on first edit eperson button', () => {
beforeEach(fakeAsync(() => {
const editButtons = fixture.debugElement.queryAll(By.css('.access-control-editEPersonButton'));
editButtons[0].triggerEventHandler('click', {
preventDefault: () => {/**/
}
});
tick();
fixture.detectChanges();
}));
it('editEPerson form is toggled', () => {
const ePeopleIds = fixture.debugElement.queryAll(By.css('#epeople tr td:first-child'));
ePersonDataServiceStub.getActiveEPerson().subscribe((activeEPerson: EPerson) => {
if (ePeopleIds[0] && activeEPerson === ePeopleIds[0].nativeElement.textContent) {
expect(component.isEPersonFormShown).toEqual(false);
} else {
expect(component.isEPersonFormShown).toEqual(true);
}
});
});
it('EPerson search section is hidden', () => {
expect(fixture.debugElement.query(By.css('#search'))).toBeNull();
});
});
});
describe('deleteEPerson', () => {
describe('when you click on first delete eperson button', () => {
let ePeopleIdsFoundBeforeDelete;
@@ -260,17 +231,16 @@ describe('EPeopleRegistryComponent', () => {
describe('delete EPerson button when the isAuthorized returns false', () => {
let ePeopleDeleteButton;
beforeEach(() => {
authorizationService = jasmine.createSpyObj('authorizationService', {
isAuthorized: observableOf(false)
});
spyOn(authorizationService, 'isAuthorized').and.returnValue(observableOf(false));
component.initialisePage();
fixture.detectChanges();
});
it('should be disabled', () => {
ePeopleDeleteButton = fixture.debugElement.queryAll(By.css('#epeople tr td div button.delete-button'));
ePeopleDeleteButton.forEach((deleteButton) => {
ePeopleDeleteButton.forEach((deleteButton: DebugElement) => {
expect(deleteButton.nativeElement.disabled).toBe(true);
});
});
});
});

View File

@@ -1,5 +1,5 @@
import { Component, OnDestroy, OnInit } from '@angular/core';
import { FormBuilder } from '@angular/forms';
import { UntypedFormBuilder } from '@angular/forms';
import { Router } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
import { BehaviorSubject, combineLatest, Observable, Subscription } from 'rxjs';
@@ -21,6 +21,8 @@ import { RequestService } from '../../core/data/request.service';
import { PageInfo } from '../../core/shared/page-info.model';
import { NoContent } from '../../core/shared/NoContent.model';
import { PaginationService } from '../../core/pagination/pagination.service';
import { DSONameService } from '../../core/breadcrumbs/dso-name.service';
import { getEPersonEditRoute, getEPersonsRoute } from '../access-control-routing-paths';
@Component({
selector: 'ds-epeople-registry',
@@ -63,11 +65,6 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy {
currentPage: 1
});
/**
* Whether or not to show the EPerson form
*/
isEPersonFormShown: boolean;
// The search form
searchForm;
@@ -89,11 +86,13 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy {
private translateService: TranslateService,
private notificationsService: NotificationsService,
private authorizationService: AuthorizationDataService,
private formBuilder: FormBuilder,
private formBuilder: UntypedFormBuilder,
private router: Router,
private modalService: NgbModal,
private paginationService: PaginationService,
public requestService: RequestService) {
public requestService: RequestService,
public dsoNameService: DSONameService,
) {
this.currentSearchQuery = '';
this.currentSearchScope = 'metadata';
this.searchForm = this.formBuilder.group(({
@@ -111,17 +110,11 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy {
*/
initialisePage() {
this.searching$.next(true);
this.isEPersonFormShown = false;
this.search({scope: this.currentSearchScope, query: this.currentSearchQuery});
this.subs.push(this.epersonService.getActiveEPerson().subscribe((eperson: EPerson) => {
if (eperson != null && eperson.id) {
this.isEPersonFormShown = true;
}
}));
this.subs.push(this.ePeople$.pipe(
switchMap((epeople: PaginatedList<EPerson>) => {
if (epeople.pageInfo.totalElements > 0) {
return combineLatest(...epeople.page.map((eperson) => {
return combineLatest(epeople.page.map((eperson: EPerson) => {
return this.authorizationService.isAuthorized(FeatureID.CanDelete, hasValue(eperson) ? eperson.self : undefined).pipe(
map((authorized) => {
const epersonDtoModel: EpersonDtoModel = new EpersonDtoModel();
@@ -157,14 +150,14 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy {
const query: string = data.query;
const scope: string = data.scope;
if (query != null && this.currentSearchQuery !== query) {
this.router.navigate([this.epersonService.getEPeoplePageRouterLink()], {
void this.router.navigate([getEPersonsRoute()], {
queryParamsHandling: 'merge'
});
this.currentSearchQuery = query;
this.paginationService.resetPage(this.config.id);
}
if (scope != null && this.currentSearchScope !== scope) {
this.router.navigate([this.epersonService.getEPeoplePageRouterLink()], {
void this.router.navigate([getEPersonsRoute()], {
queryParamsHandling: 'merge'
});
this.currentSearchScope = scope;
@@ -202,23 +195,6 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy {
return this.epersonService.getActiveEPerson();
}
/**
* Start editing the selected EPerson
* @param ePerson
*/
toggleEditEPerson(ePerson: EPerson) {
this.getActiveEPerson().pipe(take(1)).subscribe((activeEPerson: EPerson) => {
if (ePerson === activeEPerson) {
this.epersonService.cancelEditEPerson();
this.isEPersonFormShown = false;
} else {
this.epersonService.editEPerson(ePerson);
this.isEPersonFormShown = true;
}
});
this.scrollToTop();
}
/**
* Deletes EPerson, show notification on success/failure & updates EPeople list
*/
@@ -237,9 +213,9 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy {
if (hasValue(ePerson.id)) {
this.epersonService.deleteEPerson(ePerson).pipe(getFirstCompletedRemoteData()).subscribe((restResponse: RemoteData<NoContent>) => {
if (restResponse.hasSucceeded) {
this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', {name: ePerson.name}));
this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', {name: this.dsoNameService.getName(ePerson)}));
} else {
this.notificationsService.error('Error occured when trying to delete EPerson with id: ' + ePerson.id + ' with code: ' + restResponse.statusCode + ' and message: ' + restResponse.errorMessage);
this.notificationsService.error(this.translateService.get(this.labelPrefix + 'notification.deleted.success', { id: ePerson.id, statusCode: restResponse.statusCode, errorMessage: restResponse.errorMessage }));
}
});
}
@@ -261,16 +237,6 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy {
this.subs.filter((sub) => hasValue(sub)).forEach((sub) => sub.unsubscribe());
}
scrollToTop() {
(function smoothscroll() {
const currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
if (currentScroll > 0) {
window.requestAnimationFrame(smoothscroll);
window.scrollTo(0, currentScroll - (currentScroll / 8));
}
})();
}
/**
* Reset all input-fields to be empty and search all search
*/
@@ -281,17 +247,7 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy {
this.search({query: ''});
}
/**
* This method will set everything to stale, which will cause the lists on this page to update.
*/
reset() {
this.epersonService.getBrowseEndpoint().pipe(
take(1)
).subscribe((href: string) => {
this.requestService.setStaleByHrefSubstring(href).pipe(take(1)).subscribe(() => {
this.epersonService.cancelEditEPerson();
this.isEPersonFormShown = false;
});
});
getEditEPeoplePage(id: string): string {
return getEPersonEditRoute(id);
}
}

View File

@@ -1,84 +1,96 @@
<div *ngIf="epersonService.getActiveEPerson() | async; then editheader; else createHeader"></div>
<div class="container">
<div class="group-form row">
<div class="col-12">
<ng-template #createHeader>
<h4>{{messagePrefix + '.create' | translate}}</h4>
</ng-template>
<div *ngIf="epersonService.getActiveEPerson() | async; then editHeader; else createHeader"></div>
<ng-template #editheader>
<h4>{{messagePrefix + '.edit' | translate}}</h4>
</ng-template>
<ng-template #createHeader>
<h1 class="border-bottom pb-2">{{messagePrefix + '.create' | translate}}</h1>
</ng-template>
<ds-form [formId]="formId"
[formModel]="formModel"
[formGroup]="formGroup"
[formLayout]="formLayout"
[displayCancel]="false"
(submitForm)="onSubmit()">
<div before class="btn-group">
<button (click)="onCancel()"
class="btn btn-outline-secondary"><i class="fas fa-arrow-left"></i> {{messagePrefix + '.return' | translate}}</button>
</div>
<div between class="btn-group">
<button class="btn btn-primary" [disabled]="!(canReset$ | async)" (click)="resetPassword()">
<i class="fa fa-key"></i> {{'admin.access-control.epeople.actions.reset' | translate}}
</button>
</div>
<div between class="btn-group ml-1">
<button *ngIf="!isImpersonated" class="btn btn-primary" [ngClass]="{'d-none' : !(canImpersonate$ | async)}" (click)="impersonate()">
<i class="fa fa-user-secret"></i> {{'admin.access-control.epeople.actions.impersonate' | translate}}
</button>
<button *ngIf="isImpersonated" class="btn btn-primary" (click)="stopImpersonating()">
<i class="fa fa-user-secret"></i> {{'admin.access-control.epeople.actions.stop-impersonating' | translate}}
</button>
</div>
<button after class="btn btn-danger delete-button" [disabled]="!(canDelete$ | async)" (click)="delete()">
<i class="fas fa-trash"></i> {{'admin.access-control.epeople.actions.delete' | translate}}
</button>
</ds-form>
<ng-template #editHeader>
<h1 class="border-bottom pb-2">{{messagePrefix + '.edit' | translate}}</h1>
</ng-template>
<ds-themed-loading [showMessage]="false" *ngIf="!formGroup"></ds-themed-loading>
<ds-form [formId]="formId"
[formModel]="formModel"
[formGroup]="formGroup"
[formLayout]="formLayout"
[displayCancel]="false"
[submitLabel]="submitLabel"
(submitForm)="onSubmit()">
<div before class="btn-group">
<button (click)="onCancel()" type="button" class="btn btn-outline-secondary">
<i class="fas fa-arrow-left"></i> {{messagePrefix + '.return' | translate}}
</button>
</div>
<div *ngIf="displayResetPassword" between class="btn-group">
<button class="btn btn-primary" [disabled]="!(canReset$ | async)" type="button" (click)="resetPassword()">
<i class="fa fa-key"></i> {{'admin.access-control.epeople.actions.reset' | translate}}
</button>
</div>
<div *ngIf="canImpersonate$ | async" between class="btn-group">
<button *ngIf="!isImpersonated" class="btn btn-primary" type="button" (click)="impersonate()">
<i class="fa fa-user-secret"></i> {{'admin.access-control.epeople.actions.impersonate' | translate}}
</button>
<button *ngIf="isImpersonated" class="btn btn-primary" type="button" (click)="stopImpersonating()">
<i class="fa fa-user-secret"></i> {{'admin.access-control.epeople.actions.stop-impersonating' | translate}}
</button>
</div>
<button *ngIf="canDelete$ | async" after class="btn btn-danger delete-button" type="button" (click)="delete()">
<i class="fas fa-trash"></i> {{'admin.access-control.epeople.actions.delete' | translate}}
</button>
</ds-form>
<div *ngIf="epersonService.getActiveEPerson() | async">
<h5>{{messagePrefix + '.groupsEPersonIsMemberOf' | translate}}</h5>
<ds-themed-loading [showMessage]="false" *ngIf="!formGroup"></ds-themed-loading>
<ds-themed-loading [showMessage]="false" *ngIf="!(groups | async)"></ds-themed-loading>
<div *ngIf="epersonService.getActiveEPerson() | async">
<h2>{{messagePrefix + '.groupsEPersonIsMemberOf' | translate}}</h2>
<ds-pagination
*ngIf="(groups | async)?.payload?.totalElements > 0"
[paginationOptions]="config"
[pageInfoState]="(groups | async)?.payload"
[collectionSize]="(groups | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true"
(pageChange)="onPageChange($event)">
<ds-themed-loading [showMessage]="false" *ngIf="!(groups | async)"></ds-themed-loading>
<div class="table-responsive">
<table id="groups" class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th scope="col" class="align-middle">{{messagePrefix + '.table.id' | translate}}</th>
<th scope="col" class="align-middle">{{messagePrefix + '.table.name' | translate}}</th>
<th scope="col" class="align-middle">{{messagePrefix + '.table.collectionOrCommunity' | translate}}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let group of (groups | async)?.payload?.page">
<td class="align-middle">{{group.id}}</td>
<td class="align-middle"><a (click)="groupsDataService.startEditingNewGroup(group)"
[routerLink]="[groupsDataService.getGroupEditPageRouterLink(group)]">{{group.name}}</a></td>
<td class="align-middle">{{(group.object | async)?.payload?.name}}</td>
</tr>
</tbody>
</table>
</div>
<ds-pagination
*ngIf="(groups | async)?.payload?.totalElements > 0"
[paginationOptions]="config"
[collectionSize]="(groups | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true"
(pageChange)="onPageChange($event)">
</ds-pagination>
<div class="table-responsive">
<table id="groups" class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th scope="col" class="align-middle">{{messagePrefix + '.table.id' | translate}}</th>
<th scope="col" class="align-middle">{{messagePrefix + '.table.name' | translate}}</th>
<th scope="col" class="align-middle">{{messagePrefix + '.table.collectionOrCommunity' | translate}}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let group of (groups | async)?.payload?.page">
<td class="align-middle">{{group.id}}</td>
<td class="align-middle">
<a (click)="groupsDataService.startEditingNewGroup(group)"
[routerLink]="[groupsDataService.getGroupEditPageRouterLink(group)]">
{{ dsoNameService.getName(group) }}
</a>
</td>
<td class="align-middle">{{ dsoNameService.getName(undefined) }}</td>
</tr>
</tbody>
</table>
</div>
<div *ngIf="(groups | async)?.payload?.totalElements == 0" class="alert alert-info w-100 mb-2" role="alert">
<div>{{messagePrefix + '.memberOfNoGroups' | translate}}</div>
<div>
<button [routerLink]="[groupsDataService.getGroupRegistryRouterLink()]"
class="btn btn-primary">{{messagePrefix + '.goToGroups' | translate}}</button>
</ds-pagination>
<div *ngIf="(groups | async)?.payload?.totalElements == 0" class="alert alert-info w-100 mb-2" role="alert">
<div>{{messagePrefix + '.memberOfNoGroups' | translate}}</div>
<div>
<button [routerLink]="[groupsDataService.getGroupRegistryRouterLink()]"
class="btn btn-primary">{{messagePrefix + '.goToGroups' | translate}}</button>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -2,7 +2,7 @@ import { Observable, of as observableOf } from 'rxjs';
import { CommonModule } from '@angular/common';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
import { BrowserModule, By } from '@angular/platform-browser';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
@@ -31,6 +31,10 @@ import { PaginationServiceStub } from '../../../shared/testing/pagination-servic
import { FindListOptions } from '../../../core/data/find-list-options.model';
import { ValidateEmailNotTaken } from './validators/email-taken.validator';
import { EpersonRegistrationService } from '../../../core/data/eperson-registration.service';
import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model';
import { ActivatedRoute, Router } from '@angular/router';
import { RouterStub } from '../../../shared/testing/router.stub';
import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub';
describe('EPersonFormComponent', () => {
let component: EPersonFormComponent;
@@ -43,6 +47,8 @@ describe('EPersonFormComponent', () => {
let authorizationService: AuthorizationDataService;
let groupsDataService: GroupDataService;
let epersonRegistrationService: EpersonRegistrationService;
let route: ActivatedRouteStub;
let router: RouterStub;
let paginationService;
@@ -106,6 +112,9 @@ describe('EPersonFormComponent', () => {
},
getEPersonByEmail(email): Observable<RemoteData<EPerson>> {
return createSuccessfulRemoteDataObject$(null);
},
findById(_id: string, _useCachedVersionIfAvailable = true, _reRequestOnStale = true, ..._linksToFollow: FollowLinkConfig<EPerson>[]): Observable<RemoteData<EPerson>> {
return createSuccessfulRemoteDataObject$(null);
}
};
builderService = Object.assign(getMockFormBuilderService(),{
@@ -116,9 +125,9 @@ describe('EPersonFormComponent', () => {
const controlModel = model;
const controlState = { value: controlModel.value, disabled: controlModel.disabled };
const controlOptions = this.createAbstractControlOptions(controlModel.validators, controlModel.asyncValidators, controlModel.updateOn);
controls[model.id] = new FormControl(controlState, controlOptions);
controls[model.id] = new UntypedFormControl(controlState, controlOptions);
});
return new FormGroup(controls, options);
return new UntypedFormGroup(controls, options);
},
createAbstractControlOptions(validatorsConfig = null, asyncValidatorsConfig = null, updateOn = null) {
return {
@@ -182,6 +191,8 @@ describe('EPersonFormComponent', () => {
});
paginationService = new PaginationServiceStub();
route = new ActivatedRouteStub();
router = new RouterStub();
TestBed.configureTestingModule({
imports: [CommonModule, NgbModule, FormsModule, ReactiveFormsModule, BrowserModule,
TranslateModule.forRoot({
@@ -202,6 +213,8 @@ describe('EPersonFormComponent', () => {
{ provide: PaginationService, useValue: paginationService },
{ provide: RequestService, useValue: jasmine.createSpyObj('requestService', ['removeByHrefSubstring'])},
{ provide: EpersonRegistrationService, useValue: epersonRegistrationService },
{ provide: ActivatedRoute, useValue: route },
{ provide: Router, useValue: router },
EPeopleRegistryComponent
],
schemas: [NO_ERRORS_SCHEMA]
@@ -263,24 +276,18 @@ describe('EPersonFormComponent', () => {
fixture.detectChanges();
});
describe('firstName, lastName and email should be required', () => {
it('form should be invalid because the firstName is required', waitForAsync(() => {
fixture.whenStable().then(() => {
expect(component.formGroup.controls.firstName.valid).toBeFalse();
expect(component.formGroup.controls.firstName.errors.required).toBeTrue();
});
}));
it('form should be invalid because the lastName is required', waitForAsync(() => {
fixture.whenStable().then(() => {
expect(component.formGroup.controls.lastName.valid).toBeFalse();
expect(component.formGroup.controls.lastName.errors.required).toBeTrue();
});
}));
it('form should be invalid because the email is required', waitForAsync(() => {
fixture.whenStable().then(() => {
expect(component.formGroup.controls.email.valid).toBeFalse();
expect(component.formGroup.controls.email.errors.required).toBeTrue();
});
}));
it('form should be invalid because the firstName is required', () => {
expect(component.formGroup.controls.firstName.valid).toBeFalse();
expect(component.formGroup.controls.firstName.errors.required).toBeTrue();
});
it('form should be invalid because the lastName is required', () => {
expect(component.formGroup.controls.lastName.valid).toBeFalse();
expect(component.formGroup.controls.lastName.errors.required).toBeTrue();
});
it('form should be invalid because the email is required', () => {
expect(component.formGroup.controls.email.valid).toBeFalse();
expect(component.formGroup.controls.email.errors.required).toBeTrue();
});
});
describe('after inserting information firstName,lastName and email not required', () => {
@@ -290,24 +297,18 @@ describe('EPersonFormComponent', () => {
component.formGroup.controls.email.setValue('test@test.com');
fixture.detectChanges();
});
it('firstName should be valid because the firstName is set', waitForAsync(() => {
fixture.whenStable().then(() => {
it('firstName should be valid because the firstName is set', () => {
expect(component.formGroup.controls.firstName.valid).toBeTrue();
expect(component.formGroup.controls.firstName.errors).toBeNull();
});
}));
it('lastName should be valid because the lastName is set', waitForAsync(() => {
fixture.whenStable().then(() => {
});
it('lastName should be valid because the lastName is set', () => {
expect(component.formGroup.controls.lastName.valid).toBeTrue();
expect(component.formGroup.controls.lastName.errors).toBeNull();
});
}));
it('email should be valid because the email is set', waitForAsync(() => {
fixture.whenStable().then(() => {
});
it('email should be valid because the email is set', () => {
expect(component.formGroup.controls.email.valid).toBeTrue();
expect(component.formGroup.controls.email.errors).toBeNull();
});
}));
});
});
@@ -316,12 +317,10 @@ describe('EPersonFormComponent', () => {
component.formGroup.controls.email.setValue('test@test');
fixture.detectChanges();
});
it('email should not be valid because the email pattern', waitForAsync(() => {
fixture.whenStable().then(() => {
it('email should not be valid because the email pattern', () => {
expect(component.formGroup.controls.email.valid).toBeFalse();
expect(component.formGroup.controls.email.errors.pattern).toBeTruthy();
});
}));
});
});
describe('after already utilized email', () => {
@@ -336,12 +335,10 @@ describe('EPersonFormComponent', () => {
fixture.detectChanges();
});
it('email should not be valid because email is already taken', waitForAsync(() => {
fixture.whenStable().then(() => {
it('email should not be valid because email is already taken', () => {
expect(component.formGroup.controls.email.valid).toBeFalse();
expect(component.formGroup.controls.email.errors.emailTaken).toBeTruthy();
});
}));
});
});
@@ -393,11 +390,9 @@ describe('EPersonFormComponent', () => {
fixture.detectChanges();
});
it('should emit a new eperson using the correct values', waitForAsync(() => {
fixture.whenStable().then(() => {
expect(component.submitForm.emit).toHaveBeenCalledWith(expected);
});
}));
it('should emit a new eperson using the correct values', () => {
expect(component.submitForm.emit).toHaveBeenCalledWith(expected);
});
});
describe('with an active eperson', () => {
@@ -428,11 +423,9 @@ describe('EPersonFormComponent', () => {
fixture.detectChanges();
});
it('should emit the existing eperson using the correct values', waitForAsync(() => {
fixture.whenStable().then(() => {
expect(component.submitForm.emit).toHaveBeenCalledWith(expectedWithId);
});
}));
it('should emit the existing eperson using the correct values', () => {
expect(component.submitForm.emit).toHaveBeenCalledWith(expectedWithId);
});
});
});
@@ -491,16 +484,16 @@ describe('EPersonFormComponent', () => {
});
it('the delete button should be active if the eperson can be deleted', () => {
it('the delete button should be visible if the ePerson can be deleted', () => {
const deleteButton = fixture.debugElement.query(By.css('.delete-button'));
expect(deleteButton.nativeElement.disabled).toBe(false);
expect(deleteButton).not.toBeNull();
});
it('the delete button should be disabled if the eperson cannot be deleted', () => {
it('the delete button should be hidden if the ePerson cannot be deleted', () => {
component.canDelete$ = observableOf(false);
fixture.detectChanges();
const deleteButton = fixture.debugElement.query(By.css('.delete-button'));
expect(deleteButton.nativeElement.disabled).toBe(true);
expect(deleteButton).toBeNull();
});
it('should call the epersonFormComponent delete when clicked on the button', () => {

View File

@@ -1,5 +1,5 @@
import { ChangeDetectorRef, Component, EventEmitter, OnDestroy, OnInit, Output } from '@angular/core';
import { FormGroup } from '@angular/forms';
import { UntypedFormGroup } from '@angular/forms';
import {
DynamicCheckboxModel,
DynamicFormControlModel,
@@ -8,7 +8,7 @@ import {
} from '@ng-dynamic-forms/core';
import { TranslateService } from '@ngx-translate/core';
import { combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs';
import { debounceTime, switchMap, take } from 'rxjs/operators';
import { debounceTime, finalize, map, switchMap, take } from 'rxjs/operators';
import { PaginatedList } from '../../../core/data/paginated-list.model';
import { RemoteData } from '../../../core/data/remote-data';
import { EPersonDataService } from '../../../core/eperson/eperson-data.service';
@@ -37,6 +37,9 @@ import { ValidateEmailNotTaken } from './validators/email-taken.validator';
import { Registration } from '../../../core/shared/registration.model';
import { EpersonRegistrationService } from '../../../core/data/eperson-registration.service';
import { TYPE_REQUEST_FORGOT } from '../../../register-email-form/register-email-form.component';
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
import { ActivatedRoute, Router } from '@angular/router';
import { getEPersonsRoute } from '../../access-control-routing-paths';
@Component({
selector: 'ds-eperson-form',
@@ -108,7 +111,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
/**
* A FormGroup that combines all inputs
*/
formGroup: FormGroup;
formGroup: UntypedFormGroup;
/**
* An EventEmitter that's fired whenever the form is being submitted
@@ -165,6 +168,15 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
*/
isImpersonated = false;
/**
* A boolean that indicate if to display EPersonForm's Rest password button
*/
displayResetPassword = false;
/**
* A string that indicate the label of Submit button
*/
submitLabel = 'form.create';
/**
* Subscription to email field value change
*/
@@ -183,11 +195,16 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
private paginationService: PaginationService,
public requestService: RequestService,
private epersonRegistrationService: EpersonRegistrationService,
public dsoNameService: DSONameService,
protected route: ActivatedRoute,
protected router: Router,
) {
this.subs.push(this.epersonService.getActiveEPerson().subscribe((eperson: EPerson) => {
this.epersonInitial = eperson;
if (hasValue(eperson)) {
this.isImpersonated = this.authService.isImpersonatingUser(eperson.id);
this.displayResetPassword = true;
this.submitLabel = 'form.submit';
}
}));
}
@@ -200,15 +217,17 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
* This method will initialise the page
*/
initialisePage() {
observableCombineLatest(
this.subs.push(this.epersonService.findById(this.route.snapshot.params.id).subscribe((ePersonRD: RemoteData<EPerson>) => {
this.epersonService.editEPerson(ePersonRD.payload);
}));
observableCombineLatest([
this.translateService.get(`${this.messagePrefix}.firstName`),
this.translateService.get(`${this.messagePrefix}.lastName`),
this.translateService.get(`${this.messagePrefix}.email`),
this.translateService.get(`${this.messagePrefix}.canLogIn`),
this.translateService.get(`${this.messagePrefix}.requireCertificate`),
this.translateService.get(`${this.messagePrefix}.emailHint`),
).subscribe(([firstName, lastName, email, canLogIn, requireCertificate, emailHint]) => {
]).subscribe(([firstName, lastName, email, canLogIn, requireCertificate, emailHint]) => {
this.firstName = new DynamicInputModel({
id: 'firstName',
label: firstName,
@@ -326,6 +345,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
onCancel() {
this.epersonService.cancelEditEPerson();
this.cancelForm.emit();
void this.router.navigate([getEPersonsRoute()]);
}
/**
@@ -375,10 +395,12 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
getFirstCompletedRemoteData()
).subscribe((rd: RemoteData<EPerson>) => {
if (rd.hasSucceeded) {
this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.created.success', { name: ePersonToCreate.name }));
this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.created.success', { name: this.dsoNameService.getName(ePersonToCreate) }));
this.submitForm.emit(ePersonToCreate);
this.epersonService.clearEPersonRequests();
void this.router.navigateByUrl(getEPersonsRoute());
} else {
this.notificationsService.error(this.translateService.get(this.labelPrefix + 'notification.created.failure', { name: ePersonToCreate.name }));
this.notificationsService.error(this.translateService.get(this.labelPrefix + 'notification.created.failure', { name: this.dsoNameService.getName(ePersonToCreate) }));
this.cancelForm.emit();
}
});
@@ -414,10 +436,11 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
const response = this.epersonService.updateEPerson(editedEperson);
response.pipe(getFirstCompletedRemoteData()).subscribe((rd: RemoteData<EPerson>) => {
if (rd.hasSucceeded) {
this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.edited.success', { name: editedEperson.name }));
this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.edited.success', { name: this.dsoNameService.getName(editedEperson) }));
this.submitForm.emit(editedEperson);
void this.router.navigateByUrl(getEPersonsRoute());
} else {
this.notificationsService.error(this.translateService.get(this.labelPrefix + 'notification.edited.failure', { name: editedEperson.name }));
this.notificationsService.error(this.translateService.get(this.labelPrefix + 'notification.edited.failure', { name: this.dsoNameService.getName(editedEperson) }));
this.cancelForm.emit();
}
});
@@ -450,31 +473,43 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
* Deletes the EPerson from the Repository. The EPerson will be the only that this form is showing.
* It'll either show a success or error message depending on whether the delete was successful or not.
*/
delete() {
this.epersonService.getActiveEPerson().pipe(take(1)).subscribe((eperson: EPerson) => {
const modalRef = this.modalService.open(ConfirmationModalComponent);
modalRef.componentInstance.dso = eperson;
modalRef.componentInstance.headerLabel = 'confirmation-modal.delete-eperson.header';
modalRef.componentInstance.infoLabel = 'confirmation-modal.delete-eperson.info';
modalRef.componentInstance.cancelLabel = 'confirmation-modal.delete-eperson.cancel';
modalRef.componentInstance.confirmLabel = 'confirmation-modal.delete-eperson.confirm';
modalRef.componentInstance.brandColor = 'danger';
modalRef.componentInstance.confirmIcon = 'fas fa-trash';
modalRef.componentInstance.response.pipe(take(1)).subscribe((confirm: boolean) => {
if (confirm) {
if (hasValue(eperson.id)) {
this.epersonService.deleteEPerson(eperson).pipe(getFirstCompletedRemoteData()).subscribe((restResponse: RemoteData<NoContent>) => {
if (restResponse.hasSucceeded) {
this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', { name: eperson.name }));
this.submitForm.emit();
} else {
this.notificationsService.error('Error occured when trying to delete EPerson with id: ' + eperson.id + ' with code: ' + restResponse.statusCode + ' and message: ' + restResponse.errorMessage);
}
this.cancelForm.emit();
});
}
}
});
delete(): void {
this.epersonService.getActiveEPerson().pipe(
take(1),
switchMap((eperson: EPerson) => {
const modalRef = this.modalService.open(ConfirmationModalComponent);
modalRef.componentInstance.dso = eperson;
modalRef.componentInstance.headerLabel = 'confirmation-modal.delete-eperson.header';
modalRef.componentInstance.infoLabel = 'confirmation-modal.delete-eperson.info';
modalRef.componentInstance.cancelLabel = 'confirmation-modal.delete-eperson.cancel';
modalRef.componentInstance.confirmLabel = 'confirmation-modal.delete-eperson.confirm';
modalRef.componentInstance.brandColor = 'danger';
modalRef.componentInstance.confirmIcon = 'fas fa-trash';
return modalRef.componentInstance.response.pipe(
take(1),
switchMap((confirm: boolean) => {
if (confirm && hasValue(eperson.id)) {
this.canDelete$ = observableOf(false);
return this.epersonService.deleteEPerson(eperson).pipe(
getFirstCompletedRemoteData(),
map((restResponse: RemoteData<NoContent>) => ({ restResponse, eperson }))
);
} else {
return observableOf(null);
}
}),
finalize(() => this.canDelete$ = observableOf(true))
);
})
).subscribe(({ restResponse, eperson }: { restResponse: RemoteData<NoContent> | null, eperson: EPerson }) => {
if (restResponse?.hasSucceeded) {
this.notificationsService.success(this.translateService.get(this.labelPrefix + 'notification.deleted.success', { name: this.dsoNameService.getName(eperson) }));
void this.router.navigate([getEPersonsRoute()]);
} else {
this.notificationsService.error(`Error occurred when trying to delete EPerson with id: ${eperson?.id} with code: ${restResponse?.statusCode} and message: ${restResponse?.errorMessage}`);
}
this.cancelForm.emit();
});
}
@@ -510,7 +545,6 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
* Cancel the current edit when component is destroyed & unsub all subscriptions
*/
ngOnDestroy(): void {
this.onCancel();
this.subs.filter((sub) => hasValue(sub)).forEach((sub) => sub.unsubscribe());
this.paginationService.clearPagination(this.config.id);
if (hasValue(this.emailValueChangeSubscribe)) {
@@ -518,16 +552,6 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
}
}
/**
* This method will ensure that the page gets reset and that the cache is cleared
*/
reset() {
this.epersonService.getActiveEPerson().pipe(take(1)).subscribe((eperson: EPerson) => {
this.requestService.removeByHrefSubstring(eperson.self);
});
this.initialisePage();
}
/**
* Checks for the given ePerson if there is already an ePerson in the system with that email
* and shows notification if this is the case
@@ -543,7 +567,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
.subscribe((list: PaginatedList<EPerson>) => {
if (list.totalElements > 0) {
this.notificationsService.error(this.translateService.get(this.labelPrefix + 'notification.' + notificationSection + '.failure.emailInUse', {
name: ePerson.name,
name: this.dsoNameService.getName(ePerson),
email: ePerson.email
}));
}

View File

@@ -0,0 +1,53 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, Resolve, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';
import { EPerson } from '../../core/eperson/models/eperson.model';
import { RemoteData } from '../../core/data/remote-data';
import { getFirstCompletedRemoteData } from '../../core/shared/operators';
import { ResolvedAction } from '../../core/resolving/resolver.actions';
import { EPersonDataService } from '../../core/eperson/eperson-data.service';
import { Store } from '@ngrx/store';
import { followLink, FollowLinkConfig } from '../../shared/utils/follow-link-config.model';
export const EPERSON_EDIT_FOLLOW_LINKS: FollowLinkConfig<EPerson>[] = [
followLink('groups'),
];
/**
* This class represents a resolver that requests a specific {@link EPerson} before the route is activated
*/
@Injectable({
providedIn: 'root',
})
export class EPersonResolver implements Resolve<RemoteData<EPerson>> {
constructor(
protected ePersonService: EPersonDataService,
protected store: Store<any>,
) {
}
/**
* Method for resolving a {@link EPerson} based on the parameters in the current route
* @param {ActivatedRouteSnapshot} route The current ActivatedRouteSnapshot
* @param {RouterStateSnapshot} state The current RouterStateSnapshot
* @returns `Observable<<RemoteData<EPerson>>` Emits the found {@link EPerson} based on the parameters in the current
* route, or an error if something went wrong
*/
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<RemoteData<EPerson>> {
const ePersonRD$: Observable<RemoteData<EPerson>> = this.ePersonService.findById(route.params.id,
true,
false,
...EPERSON_EDIT_FOLLOW_LINKS,
).pipe(
getFirstCompletedRemoteData(),
);
ePersonRD$.subscribe((ePersonRD: RemoteData<EPerson>) => {
this.store.dispatch(new ResolvedAction(state.url, ePersonRD.payload));
});
return ePersonRD$;
}
}

View File

@@ -2,14 +2,14 @@
<div class="group-form row">
<div class="col-12">
<div *ngIf="groupDataService.getActiveGroup() | async; then editheader; else createHeader"></div>
<div *ngIf="groupDataService.getActiveGroup() | async; then editHeader; else createHeader"></div>
<ng-template #createHeader>
<h2 class="border-bottom pb-2">{{messagePrefix + '.head.create' | translate}}</h2>
<h1 class="border-bottom pb-2">{{messagePrefix + '.head.create' | translate}}</h1>
</ng-template>
<ng-template #editheader>
<h2 class="border-bottom pb-2">
<ng-template #editHeader>
<h1 class="border-bottom pb-2">
<span
*dsContextHelp="{
content: 'admin.access-control.groups.form.tooltip.editGroupPage',
@@ -20,13 +20,13 @@
>
{{messagePrefix + '.head.edit' | translate}}
</span>
</h2>
</h1>
</ng-template>
<ds-alert *ngIf="groupBeingEdited?.permanent" [type]="AlertTypeEnum.Warning"
[content]="messagePrefix + '.alert.permanent'"></ds-alert>
<ds-alert *ngIf="!(canEdit$ | async) && (groupDataService.getActiveGroup() | async)" [type]="AlertTypeEnum.Warning"
[content]="(messagePrefix + '.alert.workflowGroup' | translate:{ name: (getLinkedDSO(groupBeingEdited) | async)?.payload?.name, comcol: (getLinkedDSO(groupBeingEdited) | async)?.payload?.type, comcolEditRolesRoute: (getLinkedEditRolesRoute(groupBeingEdited) | async) })">
[content]="(messagePrefix + '.alert.workflowGroup' | translate:{ name: dsoNameService.getName((getLinkedDSO(groupBeingEdited) | async)?.payload), comcol: (getLinkedDSO(groupBeingEdited) | async)?.payload?.type, comcolEditRolesRoute: (getLinkedEditRolesRoute(groupBeingEdited) | async) })">
</ds-alert>
<ds-form [formId]="formId"
@@ -36,12 +36,11 @@
[displayCancel]="false"
(submitForm)="onSubmit()">
<div before class="btn-group">
<button (click)="onCancel()"
<button (click)="onCancel()" type="button"
class="btn btn-outline-secondary"><i class="fas fa-arrow-left"></i> {{messagePrefix + '.return' | translate}}</button>
</div>
<div after *ngIf="groupBeingEdited != null" class="btn-group">
<button class="btn btn-danger delete-button" [disabled]="!(canEdit$ | async) || groupBeingEdited.permanent"
(click)="delete()">
<div after *ngIf="(canEdit$ | async) && !groupBeingEdited?.permanent" class="btn-group">
<button (click)="delete()" class="btn btn-danger delete-button" type="button">
<i class="fa fa-trash"></i> {{ messagePrefix + '.actions.delete' | translate}}
</button>
</div>

View File

@@ -2,7 +2,7 @@ import { CommonModule } from '@angular/common';
import { HttpClient } from '@angular/common/http';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
import { BrowserModule, By } from '@angular/platform-browser';
import { ActivatedRoute, Router } from '@angular/router';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
@@ -23,6 +23,7 @@ import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { HALEndpointService } from '../../../core/shared/hal-endpoint.service';
import { PageInfo } from '../../../core/shared/page-info.model';
import { UUIDService } from '../../../core/shared/uuid.service';
import { XSRFService } from '../../../core/xsrf/xsrf.service';
import { FormBuilderService } from '../../../shared/form/builder/form-builder.service';
import { NotificationsService } from '../../../shared/notifications/notifications.service';
import { GroupMock, GroupMock2 } from '../../../shared/testing/group-mock';
@@ -36,6 +37,8 @@ import { NotificationsServiceStub } from '../../../shared/testing/notifications-
import { Operation } from 'fast-json-patch';
import { ValidateGroupExists } from './validators/group-exists.validator';
import { NoContent } from '../../../core/shared/NoContent.model';
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
import { DSONameServiceMock } from '../../../shared/mocks/dso-name.service.mock';
describe('GroupFormComponent', () => {
let component: GroupFormComponent;
@@ -130,9 +133,9 @@ describe('GroupFormComponent', () => {
const controlModel = model;
const controlState = { value: controlModel.value, disabled: controlModel.disabled };
const controlOptions = this.createAbstractControlOptions(controlModel.validators, controlModel.asyncValidators, controlModel.updateOn);
controls[model.id] = new FormControl(controlState, controlOptions);
controls[model.id] = new UntypedFormControl(controlState, controlOptions);
});
return new FormGroup(controls, options);
return new UntypedFormGroup(controls, options);
},
createAbstractControlOptions(validatorsConfig = null, asyncValidatorsConfig = null, updateOn = null) {
return {
@@ -188,7 +191,7 @@ describe('GroupFormComponent', () => {
translateService = getMockTranslateService();
router = new RouterMock();
notificationService = new NotificationsServiceStub();
TestBed.configureTestingModule({
return TestBed.configureTestingModule({
imports: [CommonModule, NgbModule, FormsModule, ReactiveFormsModule, BrowserModule,
TranslateModule.forRoot({
loader: {
@@ -198,7 +201,8 @@ describe('GroupFormComponent', () => {
}),
],
declarations: [GroupFormComponent],
providers: [GroupFormComponent,
providers: [
{ provide: DSONameService, useValue: new DSONameServiceMock() },
{ provide: EPersonDataService, useValue: ePersonDataServiceStub },
{ provide: GroupDataService, useValue: groupsDataServiceStub },
{ provide: DSpaceObjectDataService, useValue: dsoDataServiceStub },
@@ -208,6 +212,7 @@ describe('GroupFormComponent', () => {
{ provide: HttpClient, useValue: {} },
{ provide: ObjectCacheService, useValue: {} },
{ provide: UUIDService, useValue: {} },
{ provide: XSRFService, useValue: {} },
{ provide: Store, useValue: {} },
{ provide: RemoteDataBuildService, useValue: {} },
{ provide: HALEndpointService, useValue: {} },
@@ -240,8 +245,8 @@ describe('GroupFormComponent', () => {
fixture.detectChanges();
});
it('should emit a new group using the correct values', waitForAsync(() => {
fixture.whenStable().then(() => {
it('should emit a new group using the correct values', (async () => {
await fixture.whenStable().then(() => {
expect(component.submitForm.emit).toHaveBeenCalledWith(expected);
});
}));
@@ -303,8 +308,8 @@ describe('GroupFormComponent', () => {
expect(groupsDataServiceStub.patch).toHaveBeenCalledWith(expected, operations);
});
it('should emit the existing group using the correct new values', waitForAsync(() => {
fixture.whenStable().then(() => {
it('should emit the existing group using the correct new values', (async () => {
await fixture.whenStable().then(() => {
expect(component.submitForm.emit).toHaveBeenCalledWith(expected2);
});
}));

View File

@@ -1,5 +1,5 @@
import { Component, EventEmitter, HostListener, OnDestroy, OnInit, Output, ChangeDetectorRef } from '@angular/core';
import { FormGroup } from '@angular/forms';
import { UntypedFormGroup } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import {
@@ -10,7 +10,6 @@ import {
} from '@ng-dynamic-forms/core';
import { TranslateService } from '@ngx-translate/core';
import {
ObservedValueOf,
combineLatest as observableCombineLatest,
Observable,
of as observableOf,
@@ -37,7 +36,7 @@ import {
getFirstCompletedRemoteData,
getFirstSucceededRemoteDataPayload
} from '../../../core/shared/operators';
import { AlertType } from '../../../shared/alert/aletr-type';
import { AlertType } from '../../../shared/alert/alert-type';
import { ConfirmationModalComponent } from '../../../shared/confirmation-modal/confirmation-modal.component';
import { hasValue, isNotEmpty, hasValueOperator } from '../../../shared/empty.util';
import { FormBuilderService } from '../../../shared/form/builder/form-builder.service';
@@ -46,7 +45,9 @@ import { followLink } from '../../../shared/utils/follow-link-config.model';
import { NoContent } from '../../../core/shared/NoContent.model';
import { Operation } from 'fast-json-patch';
import { ValidateGroupExists } from './validators/group-exists.validator';
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
import { environment } from '../../../../environments/environment';
import { getGroupEditRoute, getGroupsRoute } from '../../access-control-routing-paths';
@Component({
selector: 'ds-group-form',
@@ -95,7 +96,7 @@ export class GroupFormComponent implements OnInit, OnDestroy {
/**
* A FormGroup that combines all inputs
*/
formGroup: FormGroup;
formGroup: UntypedFormGroup;
/**
* An EventEmitter that's fired whenever the form is being submitted
@@ -134,7 +135,8 @@ export class GroupFormComponent implements OnInit, OnDestroy {
groupNameValueChangeSubscribe: Subscription;
constructor(public groupDataService: GroupDataService,
constructor(
public groupDataService: GroupDataService,
private ePersonDataService: EPersonDataService,
private dSpaceObjectDataService: DSpaceObjectDataService,
private formBuilderService: FormBuilderService,
@@ -145,7 +147,9 @@ export class GroupFormComponent implements OnInit, OnDestroy {
private authorizationService: AuthorizationDataService,
private modalService: NgbModal,
public requestService: RequestService,
protected changeDetectorRef: ChangeDetectorRef) {
protected changeDetectorRef: ChangeDetectorRef,
public dsoNameService: DSONameService,
) {
}
ngOnInit() {
@@ -161,19 +165,19 @@ export class GroupFormComponent implements OnInit, OnDestroy {
this.canEdit$ = this.groupDataService.getActiveGroup().pipe(
hasValueOperator(),
switchMap((group: Group) => {
return observableCombineLatest(
return observableCombineLatest([
this.authorizationService.isAuthorized(FeatureID.CanDelete, isNotEmpty(group) ? group.self : undefined),
this.hasLinkedDSO(group),
(isAuthorized: ObservedValueOf<Observable<boolean>>, hasLinkedDSO: ObservedValueOf<Observable<boolean>>) => {
return isAuthorized && !hasLinkedDSO;
});
})
]).pipe(
map(([isAuthorized, hasLinkedDSO]: [boolean, boolean]) => isAuthorized && !hasLinkedDSO),
);
}),
);
observableCombineLatest(
observableCombineLatest([
this.translateService.get(`${this.messagePrefix}.groupName`),
this.translateService.get(`${this.messagePrefix}.groupCommunity`),
this.translateService.get(`${this.messagePrefix}.groupDescription`)
).subscribe(([groupName, groupCommunity, groupDescription]) => {
]).subscribe(([groupName, groupCommunity, groupDescription]) => {
this.groupName = new DynamicInputModel({
id: 'groupName',
label: groupName,
@@ -211,12 +215,12 @@ export class GroupFormComponent implements OnInit, OnDestroy {
}
this.subs.push(
observableCombineLatest(
observableCombineLatest([
this.groupDataService.getActiveGroup(),
this.canEdit$,
this.groupDataService.getActiveGroup()
.pipe(filter((activeGroup) => hasValue(activeGroup)),switchMap((activeGroup) => this.getLinkedDSO(activeGroup).pipe(getFirstSucceededRemoteDataPayload())))
).subscribe(([activeGroup, canEdit, linkedObject]) => {
]).subscribe(([activeGroup, canEdit, linkedObject]) => {
if (activeGroup != null) {
@@ -226,12 +230,14 @@ export class GroupFormComponent implements OnInit, OnDestroy {
this.groupBeingEdited = activeGroup;
if (linkedObject?.name) {
this.formBuilderService.insertFormGroupControl(1, this.formGroup, this.formModel, this.groupCommunity);
this.formGroup.patchValue({
groupName: activeGroup.name,
groupCommunity: linkedObject?.name ?? '',
groupDescription: activeGroup.firstMetadataValue('dc.description'),
});
if (!this.formGroup.controls.groupCommunity) {
this.formBuilderService.insertFormGroupControl(1, this.formGroup, this.formModel, this.groupCommunity);
this.formGroup.patchValue({
groupName: activeGroup.name,
groupCommunity: linkedObject?.name ?? '',
groupDescription: activeGroup.firstMetadataValue('dc.description'),
});
}
} else {
this.formModel = [
this.groupName,
@@ -259,7 +265,7 @@ export class GroupFormComponent implements OnInit, OnDestroy {
onCancel() {
this.groupDataService.cancelEditGroup();
this.cancelForm.emit();
this.router.navigate([this.groupDataService.getGroupRegistryRouterLink()]);
void this.router.navigate([getGroupsRoute()]);
}
/**
@@ -306,7 +312,7 @@ export class GroupFormComponent implements OnInit, OnDestroy {
const groupSelfLink = rd.payload._links.self.href;
this.setActiveGroupWithLink(groupSelfLink);
this.groupDataService.clearGroupsRequests();
this.router.navigateByUrl(this.groupDataService.getGroupEditPageRouterLinkWithID(rd.payload.uuid));
void this.router.navigateByUrl(getGroupEditRoute(rd.payload.uuid));
}
} else {
this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.created.failure', { name: groupToCreate.name }));
@@ -331,7 +337,7 @@ export class GroupFormComponent implements OnInit, OnDestroy {
.subscribe((list: PaginatedList<Group>) => {
if (list.totalElements > 0) {
this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.' + notificationSection + '.failure.groupNameInUse', {
name: group.name
name: this.dsoNameService.getName(group),
}));
}
}));
@@ -364,10 +370,10 @@ export class GroupFormComponent implements OnInit, OnDestroy {
getFirstCompletedRemoteData()
).subscribe((rd: RemoteData<Group>) => {
if (rd.hasSucceeded) {
this.notificationsService.success(this.translateService.get(this.messagePrefix + '.notification.edited.success', { name: rd.payload.name }));
this.notificationsService.success(this.translateService.get(this.messagePrefix + '.notification.edited.success', { name: this.dsoNameService.getName(rd.payload) }));
this.submitForm.emit(rd.payload);
} else {
this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.edited.failure', { name: group.name }));
this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.edited.failure', { name: this.dsoNameService.getName(group) }));
this.cancelForm.emit();
}
});
@@ -427,11 +433,11 @@ export class GroupFormComponent implements OnInit, OnDestroy {
this.groupDataService.delete(group.id).pipe(getFirstCompletedRemoteData())
.subscribe((rd: RemoteData<NoContent>) => {
if (rd.hasSucceeded) {
this.notificationsService.success(this.translateService.get(this.messagePrefix + '.notification.deleted.success', { name: group.name }));
this.notificationsService.success(this.translateService.get(this.messagePrefix + '.notification.deleted.success', { name: this.dsoNameService.getName(group) }));
this.onCancel();
} else {
this.notificationsService.error(
this.translateService.get(this.messagePrefix + '.notification.deleted.failure.title', { name: group.name }),
this.translateService.get(this.messagePrefix + '.notification.deleted.failure.title', { name: this.dsoNameService.getName(group) }),
this.translateService.get(this.messagePrefix + '.notification.deleted.failure.content', { cause: rd.errorMessage }));
}
});

View File

@@ -1,106 +1,11 @@
<ng-container>
<h3 class="border-bottom pb-2">{{messagePrefix + '.head' | translate}}</h3>
<h2 class="border-bottom pb-2">{{messagePrefix + '.head' | translate}}</h2>
<h4 id="search" class="border-bottom pb-2">
<span
*dsContextHelp="{
content: 'admin.access-control.groups.form.tooltip.editGroup.addEpeople',
id: 'edit-group-add-epeople',
iconPlacement: 'right',
tooltipPlacement: ['top', 'right', 'bottom']
}"
>
{{messagePrefix + '.search.head' | translate}}
</span>
</h4>
<h3>{{messagePrefix + '.headMembers' | translate}}</h3>
<form [formGroup]="searchForm" (ngSubmit)="search(searchForm.value)" class="d-flex justify-content-between">
<div>
<select name="scope" id="scope" formControlName="scope" class="form-control" aria-label="Search scope">
<option value="metadata">{{messagePrefix + '.search.scope.metadata' | translate}}</option>
<option value="email">{{messagePrefix + '.search.scope.email' | translate}}</option>
</select>
</div>
<div class="flex-grow-1 mr-3 ml-3">
<div class="form-group input-group">
<input type="text" name="query" id="query" formControlName="query"
class="form-control" aria-label="Search input">
<span class="input-group-append">
<button type="submit" class="search-button btn btn-primary">
<i class="fas fa-search"></i> {{ messagePrefix + '.search.button' | translate }}</button>
</span>
</div>
</div>
<div>
<button (click)="clearFormAndResetResult();"
class="btn btn-secondary">{{messagePrefix + '.button.see-all' | translate}}</button>
</div>
</form>
<ds-pagination *ngIf="(ePeopleSearchDtos | async)?.totalElements > 0"
[paginationOptions]="configSearch"
[pageInfoState]="(ePeopleSearchDtos | async)"
[collectionSize]="(ePeopleSearchDtos | async)?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="epersonsSearch" class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th scope="col" class="align-middle">{{messagePrefix + '.table.id' | translate}}</th>
<th scope="col" class="align-middle">{{messagePrefix + '.table.name' | translate}}</th>
<th scope="col" class="align-middle">{{messagePrefix + '.table.identity' | translate}}</th>
<th class="align-middle">{{messagePrefix + '.table.edit' | translate}}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let ePerson of (ePeopleSearchDtos | async)?.page">
<td class="align-middle">{{ePerson.eperson.id}}</td>
<td class="align-middle"><a (click)="ePersonDataService.startEditingNewEPerson(ePerson.eperson)"
[routerLink]="[ePersonDataService.getEPeoplePageRouterLink()]">{{ePerson.eperson.name}}</a></td>
<td class="align-middle">
{{messagePrefix + '.table.email' | translate}}: {{ ePerson.eperson.email ? ePerson.eperson.email : '-' }}<br/>
{{messagePrefix + '.table.netid' | translate}}: {{ ePerson.eperson.netid ? ePerson.eperson.netid : '-' }}
</td>
<td class="align-middle">
<div class="btn-group edit-field">
<button *ngIf="ePerson.memberOfGroup"
(click)="deleteMemberFromGroup(ePerson)"
[disabled]="actionConfig.remove.disabled"
[ngClass]="['btn btn-sm', actionConfig.remove.css]"
title="{{messagePrefix + '.table.edit.buttons.remove' | translate: {name: ePerson.eperson.name} }}">
<i [ngClass]="actionConfig.remove.icon"></i>
</button>
<button *ngIf="!ePerson.memberOfGroup"
(click)="addMemberToGroup(ePerson)"
[disabled]="actionConfig.add.disabled"
[ngClass]="['btn btn-sm', actionConfig.add.css]"
title="{{messagePrefix + '.table.edit.buttons.add' | translate: {name: ePerson.eperson.name} }}">
<i [ngClass]="actionConfig.add.icon"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</ds-pagination>
<div *ngIf="(ePeopleSearchDtos | async)?.totalElements == 0 && searchDone"
class="alert alert-info w-100 mb-2"
role="alert">
{{messagePrefix + '.no-items' | translate}}
</div>
<h4>{{messagePrefix + '.headMembers' | translate}}</h4>
<ds-pagination *ngIf="(ePeopleMembersOfGroupDtos | async)?.totalElements > 0"
<ds-pagination *ngIf="(ePeopleMembersOfGroup | async)?.totalElements > 0"
[paginationOptions]="config"
[pageInfoState]="(ePeopleMembersOfGroupDtos | async)"
[collectionSize]="(ePeopleMembersOfGroupDtos | async)?.totalElements"
[collectionSize]="(ePeopleMembersOfGroup | async)?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
@@ -115,28 +20,103 @@
</tr>
</thead>
<tbody>
<tr *ngFor="let ePerson of (ePeopleMembersOfGroupDtos | async)?.page">
<td class="align-middle">{{ePerson.eperson.id}}</td>
<td class="align-middle"><a (click)="ePersonDataService.startEditingNewEPerson(ePerson.eperson)"
[routerLink]="[ePersonDataService.getEPeoplePageRouterLink()]">{{ePerson.eperson.name}}</a></td>
<tr *ngFor="let eperson of (ePeopleMembersOfGroup | async)?.page">
<td class="align-middle">{{eperson.id}}</td>
<td class="align-middle">
{{messagePrefix + '.table.email' | translate}}: {{ ePerson.eperson.email ? ePerson.eperson.email : '-' }}<br/>
{{messagePrefix + '.table.netid' | translate}}: {{ ePerson.eperson.netid ? ePerson.eperson.netid : '-' }}
<a [routerLink]="getEPersonEditRoute(eperson.id)">
{{ dsoNameService.getName(eperson) }}
</a>
</td>
<td class="align-middle">
{{messagePrefix + '.table.email' | translate}}: {{ eperson.email ? eperson.email : '-' }}<br/>
{{messagePrefix + '.table.netid' | translate}}: {{ eperson.netid ? eperson.netid : '-' }}
</td>
<td class="align-middle">
<div class="btn-group edit-field">
<button *ngIf="ePerson.memberOfGroup"
(click)="deleteMemberFromGroup(ePerson)"
<button (click)="deleteMemberFromGroup(eperson)"
[disabled]="actionConfig.remove.disabled"
[ngClass]="['btn btn-sm', actionConfig.remove.css]"
title="{{messagePrefix + '.table.edit.buttons.remove' | translate: {name: ePerson.eperson.name} }}">
title="{{messagePrefix + '.table.edit.buttons.remove' | translate: { name: dsoNameService.getName(eperson) } }}">
<i [ngClass]="actionConfig.remove.icon"></i>
</button>
<button *ngIf="!ePerson.memberOfGroup"
(click)="addMemberToGroup(ePerson)"
</div>
</td>
</tr>
</tbody>
</table>
</div>
</ds-pagination>
<div *ngIf="(ePeopleMembersOfGroup | async) == undefined || (ePeopleMembersOfGroup | async)?.totalElements == 0" class="alert alert-info w-100 mb-2"
role="alert">
{{messagePrefix + '.no-members-yet' | translate}}
</div>
<h3 id="search" class="border-bottom pb-2">
<span
*dsContextHelp="{
content: 'admin.access-control.groups.form.tooltip.editGroup.addEpeople',
id: 'edit-group-add-epeople',
iconPlacement: 'right',
tooltipPlacement: ['top', 'right', 'bottom']
}"
>
{{messagePrefix + '.search.head' | translate}}
</span>
</h3>
<form [formGroup]="searchForm" (ngSubmit)="search(searchForm.value)" class="d-flex justify-content-between">
<div class="flex-grow-1 mr-3">
<div class="form-group input-group mr-3">
<input type="text" name="query" id="query" formControlName="query"
class="form-control" aria-label="Search input">
<span class="input-group-append">
<button type="submit" class="search-button btn btn-primary">
<i class="fas fa-search"></i> {{ messagePrefix + '.search.button' | translate }}</button>
</span>
</div>
</div>
<div>
<button (click)="clearFormAndResetResult();"
class="btn btn-secondary">{{messagePrefix + '.button.see-all' | translate}}</button>
</div>
</form>
<ds-pagination *ngIf="(ePeopleSearch | async)?.totalElements > 0"
[paginationOptions]="configSearch"
[collectionSize]="(ePeopleSearch | async)?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="epersonsSearch" class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th scope="col" class="align-middle">{{messagePrefix + '.table.id' | translate}}</th>
<th scope="col" class="align-middle">{{messagePrefix + '.table.name' | translate}}</th>
<th scope="col" class="align-middle">{{messagePrefix + '.table.identity' | translate}}</th>
<th class="align-middle">{{messagePrefix + '.table.edit' | translate}}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let eperson of (ePeopleSearch | async)?.page">
<td class="align-middle">{{eperson.id}}</td>
<td class="align-middle">
<a [routerLink]="getEPersonEditRoute(eperson.id)">
{{ dsoNameService.getName(eperson) }}
</a>
</td>
<td class="align-middle">
{{messagePrefix + '.table.email' | translate}}: {{ eperson.email ? eperson.email : '-' }}<br/>
{{messagePrefix + '.table.netid' | translate}}: {{ eperson.netid ? eperson.netid : '-' }}
</td>
<td class="align-middle">
<div class="btn-group edit-field">
<button (click)="addMemberToGroup(eperson)"
[disabled]="actionConfig.add.disabled"
[ngClass]="['btn btn-sm', actionConfig.add.css]"
title="{{messagePrefix + '.table.edit.buttons.add' | translate: {name: ePerson.eperson.name} }}">
title="{{messagePrefix + '.table.edit.buttons.add' | translate: { name: dsoNameService.getName(eperson) } }}">
<i [ngClass]="actionConfig.add.icon"></i>
</button>
</div>
@@ -148,9 +128,10 @@
</ds-pagination>
<div *ngIf="(ePeopleMembersOfGroupDtos | async) == undefined || (ePeopleMembersOfGroupDtos | async)?.totalElements == 0" class="alert alert-info w-100 mb-2"
<div *ngIf="(ePeopleSearch | async)?.totalElements == 0 && searchDone"
class="alert alert-info w-100 mb-2"
role="alert">
{{messagePrefix + '.no-members-yet' | translate}}
{{messagePrefix + '.no-items' | translate}}
</div>
</ng-container>

View File

@@ -1,5 +1,5 @@
import { CommonModule } from '@angular/common';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
import { ComponentFixture, fakeAsync, flush, inject, TestBed, tick, waitForAsync } from '@angular/core/testing';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { BrowserModule, By } from '@angular/platform-browser';
@@ -17,7 +17,7 @@ import { Group } from '../../../../core/eperson/models/group.model';
import { PageInfo } from '../../../../core/shared/page-info.model';
import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service';
import { NotificationsService } from '../../../../shared/notifications/notifications.service';
import { GroupMock, GroupMock2 } from '../../../../shared/testing/group-mock';
import { GroupMock } from '../../../../shared/testing/group-mock';
import { MembersListComponent } from './members-list.component';
import { EPersonMock, EPersonMock2 } from '../../../../shared/testing/eperson.mock';
import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils';
@@ -28,6 +28,8 @@ import { NotificationsServiceStub } from '../../../../shared/testing/notificatio
import { RouterMock } from '../../../../shared/mocks/router.mock';
import { PaginationService } from '../../../../core/pagination/pagination.service';
import { PaginationServiceStub } from '../../../../shared/testing/pagination-service.stub';
import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service';
import { DSONameServiceMock } from '../../../../shared/mocks/dso-name.service.mock';
describe('MembersListComponent', () => {
let component: MembersListComponent;
@@ -37,28 +39,26 @@ describe('MembersListComponent', () => {
let ePersonDataServiceStub: any;
let groupsDataServiceStub: any;
let activeGroup;
let allEPersons;
let allGroups;
let epersonMembers;
let subgroupMembers;
let epersonMembers: EPerson[];
let epersonNonMembers: EPerson[];
let paginationService;
beforeEach(waitForAsync(() => {
activeGroup = GroupMock;
epersonMembers = [EPersonMock2];
subgroupMembers = [GroupMock2];
allEPersons = [EPersonMock, EPersonMock2];
allGroups = [GroupMock, GroupMock2];
epersonNonMembers = [EPersonMock];
ePersonDataServiceStub = {
activeGroup: activeGroup,
epersonMembers: epersonMembers,
subgroupMembers: subgroupMembers,
findListByHref(href: string): Observable<RemoteData<PaginatedList<EPerson>>> {
epersonNonMembers: epersonNonMembers,
// This method is used to get all the current members
findListByHref(_href: string): Observable<RemoteData<PaginatedList<EPerson>>> {
return createSuccessfulRemoteDataObject$(buildPaginatedList<EPerson>(new PageInfo(), groupsDataServiceStub.getEPersonMembers()));
},
searchByScope(scope: string, query: string): Observable<RemoteData<PaginatedList<EPerson>>> {
// This method is used to search across *non-members*
searchNonMembers(query: string, group: string): Observable<RemoteData<PaginatedList<EPerson>>> {
if (query === '') {
return createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), allEPersons));
return createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), epersonNonMembers));
}
return createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), []));
},
@@ -68,29 +68,26 @@ describe('MembersListComponent', () => {
clearLinkRequests() {
// empty
},
getEPeoplePageRouterLink(): string {
return '/access-control/epeople';
}
};
groupsDataServiceStub = {
activeGroup: activeGroup,
epersonMembers: epersonMembers,
subgroupMembers: subgroupMembers,
allGroups: allGroups,
epersonNonMembers: epersonNonMembers,
getActiveGroup(): Observable<Group> {
return observableOf(activeGroup);
},
getEPersonMembers() {
return this.epersonMembers;
},
searchGroups(query: string): Observable<RemoteData<PaginatedList<Group>>> {
if (query === '') {
return createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), this.allGroups));
}
return createSuccessfulRemoteDataObject$(buildPaginatedList(new PageInfo(), []));
},
addMemberToGroup(parentGroup, eperson: EPerson): Observable<RestResponse> {
this.epersonMembers = [...this.epersonMembers, eperson];
addMemberToGroup(parentGroup, epersonToAdd: EPerson): Observable<RestResponse> {
// Add eperson to list of members
this.epersonMembers = [...this.epersonMembers, epersonToAdd];
// Remove eperson from list of non-members
this.epersonNonMembers.forEach( (eperson: EPerson, index: number) => {
if (eperson.id === epersonToAdd.id) {
this.epersonNonMembers.splice(index, 1);
}
});
return observableOf(new RestResponse(true, 200, 'Success'));
},
clearGroupsRequests() {
@@ -103,14 +100,14 @@ describe('MembersListComponent', () => {
return '/access-control/groups/' + group.id;
},
deleteMemberFromGroup(parentGroup, epersonToDelete: EPerson): Observable<RestResponse> {
this.epersonMembers = this.epersonMembers.find((eperson: EPerson) => {
if (eperson.id !== epersonToDelete.id) {
return eperson;
// Remove eperson from list of members
this.epersonMembers.forEach( (eperson: EPerson, index: number) => {
if (eperson.id === epersonToDelete.id) {
this.epersonMembers.splice(index, 1);
}
});
if (this.epersonMembers === undefined) {
this.epersonMembers = [];
}
// Add eperson to list of non-members
this.epersonNonMembers = [...this.epersonNonMembers, epersonToDelete];
return observableOf(new RestResponse(true, 200, 'Success'));
}
};
@@ -118,7 +115,7 @@ describe('MembersListComponent', () => {
translateService = getMockTranslateService();
paginationService = new PaginationServiceStub();
TestBed.configureTestingModule({
return TestBed.configureTestingModule({
imports: [CommonModule, NgbModule, FormsModule, ReactiveFormsModule, BrowserModule,
TranslateModule.forRoot({
loader: {
@@ -135,6 +132,7 @@ describe('MembersListComponent', () => {
{ provide: FormBuilderService, useValue: builderService },
{ provide: Router, useValue: new RouterMock() },
{ provide: PaginationService, useValue: paginationService },
{ provide: DSONameService, useValue: new DSONameServiceMock() },
],
schemas: [NO_ERRORS_SCHEMA]
}).compileComponents();
@@ -147,6 +145,7 @@ describe('MembersListComponent', () => {
});
afterEach(fakeAsync(() => {
fixture.destroy();
fixture.debugElement.nativeElement.remove();
flush();
component = null;
fixture.debugElement.nativeElement.remove();
@@ -156,19 +155,43 @@ describe('MembersListComponent', () => {
expect(comp).toBeDefined();
}));
it('should show list of eperson members of current active group', () => {
const epersonIdsFound = fixture.debugElement.queryAll(By.css('#ePeopleMembersOfGroup tr td:first-child'));
expect(epersonIdsFound.length).toEqual(1);
epersonMembers.map((eperson: EPerson) => {
expect(epersonIdsFound.find((foundEl) => {
return (foundEl.nativeElement.textContent.trim() === eperson.uuid);
})).toBeTruthy();
describe('current members list', () => {
it('should show list of eperson members of current active group', () => {
const epersonIdsFound = fixture.debugElement.queryAll(By.css('#ePeopleMembersOfGroup tr td:first-child'));
expect(epersonIdsFound.length).toEqual(1);
epersonMembers.map((eperson: EPerson) => {
expect(epersonIdsFound.find((foundEl) => {
return (foundEl.nativeElement.textContent.trim() === eperson.uuid);
})).toBeTruthy();
});
});
it('should show a delete button next to each member', () => {
const epersonsFound = fixture.debugElement.queryAll(By.css('#ePeopleMembersOfGroup tbody tr'));
epersonsFound.map((foundEPersonRowElement: DebugElement) => {
const addButton: DebugElement = foundEPersonRowElement.query(By.css('td:last-child .fa-plus'));
const deleteButton: DebugElement = foundEPersonRowElement.query(By.css('td:last-child .fa-trash-alt'));
expect(addButton).toBeNull();
expect(deleteButton).not.toBeNull();
});
});
describe('if first delete button is pressed', () => {
beforeEach(() => {
const deleteButton: DebugElement = fixture.debugElement.query(By.css('#ePeopleMembersOfGroup tbody .fa-trash-alt'));
deleteButton.nativeElement.click();
fixture.detectChanges();
});
it('then no ePerson remains as a member of the active group.', () => {
const epersonsFound = fixture.debugElement.queryAll(By.css('#ePeopleMembersOfGroup tbody tr'));
expect(epersonsFound.length).toEqual(0);
});
});
});
describe('search', () => {
describe('when searching without query', () => {
let epersonsFound;
let epersonsFound: DebugElement[];
beforeEach(fakeAsync(() => {
component.search({ scope: 'metadata', query: '' });
tick();
@@ -176,69 +199,34 @@ describe('MembersListComponent', () => {
epersonsFound = fixture.debugElement.queryAll(By.css('#epersonsSearch tbody tr'));
}));
it('should display all epersons', () => {
expect(epersonsFound.length).toEqual(2);
it('should display only non-members of the group', () => {
const epersonIdsFound = fixture.debugElement.queryAll(By.css('#epersonsSearch tbody tr td:first-child'));
expect(epersonIdsFound.length).toEqual(1);
epersonNonMembers.map((eperson: EPerson) => {
expect(epersonIdsFound.find((foundEl) => {
return (foundEl.nativeElement.textContent.trim() === eperson.uuid);
})).toBeTruthy();
});
});
describe('if eperson is already a eperson', () => {
it('should have delete button, else it should have add button', () => {
activeGroup.epersons.map((eperson: EPerson) => {
epersonsFound.map((foundEPersonRowElement) => {
if (foundEPersonRowElement.debugElement !== undefined) {
const epersonId = foundEPersonRowElement.debugElement.query(By.css('td:first-child'));
const addButton = foundEPersonRowElement.debugElement.query(By.css('td:last-child .fa-plus'));
const deleteButton = foundEPersonRowElement.debugElement.query(By.css('td:last-child .fa-trash-alt'));
if (epersonId.nativeElement.textContent === eperson.id) {
expect(addButton).toBeUndefined();
expect(deleteButton).toBeDefined();
} else {
expect(deleteButton).toBeUndefined();
expect(addButton).toBeDefined();
}
}
});
});
it('should display an add button next to non-members, not a delete button', () => {
epersonsFound.map((foundEPersonRowElement: DebugElement) => {
const addButton: DebugElement = foundEPersonRowElement.query(By.css('td:last-child .fa-plus'));
const deleteButton: DebugElement = foundEPersonRowElement.query(By.css('td:last-child .fa-trash-alt'));
expect(addButton).not.toBeNull();
expect(deleteButton).toBeNull();
});
});
describe('if first add button is pressed', () => {
beforeEach(fakeAsync(() => {
const addButton = fixture.debugElement.query(By.css('#epersonsSearch tbody .fa-plus'));
beforeEach(() => {
const addButton: DebugElement = fixture.debugElement.query(By.css('#epersonsSearch tbody .fa-plus'));
addButton.nativeElement.click();
tick();
fixture.detectChanges();
}));
it('all groups in search member of selected group', () => {
epersonsFound = fixture.debugElement.queryAll(By.css('#epersonsSearch tbody tr'));
expect(epersonsFound.length).toEqual(2);
epersonsFound.map((foundEPersonRowElement) => {
if (foundEPersonRowElement.debugElement !== undefined) {
const addButton = foundEPersonRowElement.debugElement.query(By.css('td:last-child .fa-plus'));
const deleteButton = foundEPersonRowElement.debugElement.query(By.css('td:last-child .fa-trash-alt'));
expect(addButton).toBeUndefined();
expect(deleteButton).toBeDefined();
}
});
});
});
describe('if first delete button is pressed', () => {
beforeEach(fakeAsync(() => {
const addButton = fixture.debugElement.query(By.css('#epersonsSearch tbody .fa-trash-alt'));
addButton.nativeElement.click();
tick();
fixture.detectChanges();
}));
it('first eperson in search delete button, because now member', () => {
it('then all (two) ePersons are member of the active group. No non-members left', () => {
epersonsFound = fixture.debugElement.queryAll(By.css('#epersonsSearch tbody tr'));
epersonsFound.map((foundEPersonRowElement) => {
if (foundEPersonRowElement.debugElement !== undefined) {
const addButton = foundEPersonRowElement.debugElement.query(By.css('td:last-child .fa-plus'));
const deleteButton = foundEPersonRowElement.debugElement.query(By.css('td:last-child .fa-trash-alt'));
expect(deleteButton).toBeUndefined();
expect(addButton).toBeDefined();
}
});
expect(epersonsFound.length).toEqual(0);
});
});
});

View File

@@ -1,40 +1,37 @@
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
import { FormBuilder } from '@angular/forms';
import { UntypedFormBuilder } from '@angular/forms';
import { Router } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
import {
Observable,
of as observableOf,
Subscription,
BehaviorSubject,
combineLatest as observableCombineLatest,
ObservedValueOf,
BehaviorSubject
} from 'rxjs';
import { defaultIfEmpty, map, mergeMap, switchMap, take } from 'rxjs/operators';
import { buildPaginatedList, PaginatedList } from '../../../../core/data/paginated-list.model';
import { map, switchMap, take } from 'rxjs/operators';
import { PaginatedList } from '../../../../core/data/paginated-list.model';
import { RemoteData } from '../../../../core/data/remote-data';
import { EPersonDataService } from '../../../../core/eperson/eperson-data.service';
import { GroupDataService } from '../../../../core/eperson/group-data.service';
import { EPerson } from '../../../../core/eperson/models/eperson.model';
import { Group } from '../../../../core/eperson/models/group.model';
import {
getFirstSucceededRemoteData,
getFirstCompletedRemoteData,
getAllCompletedRemoteData,
getRemoteDataPayload
} from '../../../../core/shared/operators';
import { NotificationsService } from '../../../../shared/notifications/notifications.service';
import { PaginationComponentOptions } from '../../../../shared/pagination/pagination-component-options.model';
import { EpersonDtoModel } from '../../../../core/eperson/models/eperson-dto.model';
import { PaginationService } from '../../../../core/pagination/pagination.service';
import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service';
import { getEPersonEditRoute } from '../../../access-control-routing-paths';
/**
* Keys to keep track of specific subscriptions
*/
enum SubKey {
ActiveGroup,
MembersDTO,
SearchResultsDTO,
Members,
SearchResults,
}
/**
@@ -95,11 +92,11 @@ export class MembersListComponent implements OnInit, OnDestroy {
/**
* EPeople being displayed in search result, initially all members, after search result of search
*/
ePeopleSearchDtos: BehaviorSubject<PaginatedList<EpersonDtoModel>> = new BehaviorSubject<PaginatedList<EpersonDtoModel>>(undefined);
ePeopleSearch: BehaviorSubject<PaginatedList<EPerson>> = new BehaviorSubject<PaginatedList<EPerson>>(undefined);
/**
* List of EPeople members of currently active group being edited
*/
ePeopleMembersOfGroupDtos: BehaviorSubject<PaginatedList<EpersonDtoModel>> = new BehaviorSubject<PaginatedList<EpersonDtoModel>>(undefined);
ePeopleMembersOfGroup: BehaviorSubject<PaginatedList<EPerson>> = new BehaviorSubject<PaginatedList<EPerson>>(undefined);
/**
* Pagination config used to display the list of EPeople that are result of EPeople search
@@ -128,7 +125,6 @@ export class MembersListComponent implements OnInit, OnDestroy {
// Current search in edit group - epeople search form
currentSearchQuery: string;
currentSearchScope: string;
// Whether or not user has done a EPeople search yet
searchDone: boolean;
@@ -136,28 +132,30 @@ export class MembersListComponent implements OnInit, OnDestroy {
// current active group being edited
groupBeingEdited: Group;
readonly getEPersonEditRoute = getEPersonEditRoute;
constructor(
protected groupDataService: GroupDataService,
public ePersonDataService: EPersonDataService,
protected translateService: TranslateService,
protected notificationsService: NotificationsService,
protected formBuilder: FormBuilder,
protected formBuilder: UntypedFormBuilder,
protected paginationService: PaginationService,
private router: Router
protected router: Router,
public dsoNameService: DSONameService,
) {
this.currentSearchQuery = '';
this.currentSearchScope = 'metadata';
}
ngOnInit(): void {
this.searchForm = this.formBuilder.group(({
scope: 'metadata',
query: '',
}));
this.subs.set(SubKey.ActiveGroup, this.groupDataService.getActiveGroup().subscribe((activeGroup: Group) => {
if (activeGroup != null) {
this.groupBeingEdited = activeGroup;
this.retrieveMembers(this.config.currentPage);
this.search({query: ''});
}
}));
}
@@ -169,8 +167,8 @@ export class MembersListComponent implements OnInit, OnDestroy {
* @private
*/
retrieveMembers(page: number): void {
this.unsubFrom(SubKey.MembersDTO);
this.subs.set(SubKey.MembersDTO,
this.unsubFrom(SubKey.Members);
this.subs.set(SubKey.Members,
this.paginationService.getCurrentPagination(this.config.id, this.config).pipe(
switchMap((currentPagination) => {
return this.ePersonDataService.findListByHref(this.groupBeingEdited._links.epersons.href, {
@@ -187,49 +185,12 @@ export class MembersListComponent implements OnInit, OnDestroy {
return rd;
}
}),
switchMap((epersonListRD: RemoteData<PaginatedList<EPerson>>) => {
const dtos$ = observableCombineLatest([...epersonListRD.payload.page.map((member: EPerson) => {
const dto$: Observable<EpersonDtoModel> = observableCombineLatest(
this.isMemberOfGroup(member), (isMember: ObservedValueOf<Observable<boolean>>) => {
const epersonDtoModel: EpersonDtoModel = new EpersonDtoModel();
epersonDtoModel.eperson = member;
epersonDtoModel.memberOfGroup = isMember;
return epersonDtoModel;
});
return dto$;
})]);
return dtos$.pipe(defaultIfEmpty([]), map((dtos: EpersonDtoModel[]) => {
return buildPaginatedList(epersonListRD.payload.pageInfo, dtos);
}));
}))
.subscribe((paginatedListOfDTOs: PaginatedList<EpersonDtoModel>) => {
this.ePeopleMembersOfGroupDtos.next(paginatedListOfDTOs);
getRemoteDataPayload())
.subscribe((paginatedListOfEPersons: PaginatedList<EPerson>) => {
this.ePeopleMembersOfGroup.next(paginatedListOfEPersons);
}));
}
/**
* Whether the given ePerson is a member of the group currently being edited
* @param possibleMember EPerson that is a possible member (being tested) of the group currently being edited
*/
isMemberOfGroup(possibleMember: EPerson): Observable<boolean> {
return this.groupDataService.getActiveGroup().pipe(take(1),
mergeMap((group: Group) => {
if (group != null) {
return this.ePersonDataService.findListByHref(group._links.epersons.href, {
currentPage: 1,
elementsPerPage: 9999
})
.pipe(
getFirstSucceededRemoteData(),
getRemoteDataPayload(),
map((listEPeopleInGroup: PaginatedList<EPerson>) => listEPeopleInGroup.page.filter((ePersonInList: EPerson) => ePersonInList.id === possibleMember.id)),
map((epeople: EPerson[]) => epeople.length > 0));
} else {
return observableOf(false);
}
}));
}
/**
* Unsubscribe from a subscription if it's still subscribed, and remove it from the map of
* active subscriptions
@@ -246,13 +207,18 @@ export class MembersListComponent implements OnInit, OnDestroy {
/**
* Deletes a given EPerson from the members list of the group currently being edited
* @param ePerson EPerson we want to delete as member from group that is currently being edited
* @param eperson EPerson we want to delete as member from group that is currently being edited
*/
deleteMemberFromGroup(ePerson: EpersonDtoModel) {
deleteMemberFromGroup(eperson: EPerson) {
this.groupDataService.getActiveGroup().pipe(take(1)).subscribe((activeGroup: Group) => {
if (activeGroup != null) {
const response = this.groupDataService.deleteMemberFromGroup(activeGroup, ePerson.eperson);
this.showNotifications('deleteMember', response, ePerson.eperson.name, activeGroup);
const response = this.groupDataService.deleteMemberFromGroup(activeGroup, eperson);
this.showNotifications('deleteMember', response, this.dsoNameService.getName(eperson), activeGroup);
// Reload search results (if there is an active query).
// This will potentially add this deleted subgroup into the list of search results.
if (this.currentSearchQuery != null) {
this.search({query: this.currentSearchQuery});
}
} else {
this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.failure.noActiveGroup'));
}
@@ -261,14 +227,18 @@ export class MembersListComponent implements OnInit, OnDestroy {
/**
* Adds a given EPerson to the members list of the group currently being edited
* @param ePerson EPerson we want to add as member to group that is currently being edited
* @param eperson EPerson we want to add as member to group that is currently being edited
*/
addMemberToGroup(ePerson: EpersonDtoModel) {
ePerson.memberOfGroup = true;
addMemberToGroup(eperson: EPerson) {
this.groupDataService.getActiveGroup().pipe(take(1)).subscribe((activeGroup: Group) => {
if (activeGroup != null) {
const response = this.groupDataService.addMemberToGroup(activeGroup, ePerson.eperson);
this.showNotifications('addMember', response, ePerson.eperson.name, activeGroup);
const response = this.groupDataService.addMemberToGroup(activeGroup, eperson);
this.showNotifications('addMember', response, this.dsoNameService.getName(eperson), activeGroup);
// Reload search results (if there is an active query).
// This will potentially add this deleted subgroup into the list of search results.
if (this.currentSearchQuery != null) {
this.search({query: this.currentSearchQuery});
}
} else {
this.notificationsService.error(this.translateService.get(this.messagePrefix + '.notification.failure.noActiveGroup'));
}
@@ -276,37 +246,25 @@ export class MembersListComponent implements OnInit, OnDestroy {
}
/**
* Search in the EPeople by name, email or metadata
* @param data Contains scope and query param
* Search all EPeople who are NOT a member of the current group by name, email or metadata
* @param data Contains query param
*/
search(data: any) {
this.unsubFrom(SubKey.SearchResultsDTO);
this.subs.set(SubKey.SearchResultsDTO,
this.unsubFrom(SubKey.SearchResults);
this.subs.set(SubKey.SearchResults,
this.paginationService.getCurrentPagination(this.configSearch.id, this.configSearch).pipe(
switchMap((paginationOptions) => {
const query: string = data.query;
const scope: string = data.scope;
if (query != null && this.currentSearchQuery !== query && this.groupBeingEdited) {
this.router.navigate([], {
queryParamsHandling: 'merge'
});
this.currentSearchQuery = query;
this.paginationService.resetPage(this.configSearch.id);
}
if (scope != null && this.currentSearchScope !== scope && this.groupBeingEdited) {
this.router.navigate([], {
queryParamsHandling: 'merge'
});
this.currentSearchScope = scope;
this.paginationService.resetPage(this.configSearch.id);
}
this.searchDone = true;
return this.ePersonDataService.searchByScope(this.currentSearchScope, this.currentSearchQuery, {
return this.ePersonDataService.searchNonMembers(this.currentSearchQuery, this.groupBeingEdited.id, {
currentPage: paginationOptions.currentPage,
elementsPerPage: paginationOptions.pageSize
});
}, false, true);
}),
getAllCompletedRemoteData(),
map((rd: RemoteData<any>) => {
@@ -316,23 +274,9 @@ export class MembersListComponent implements OnInit, OnDestroy {
return rd;
}
}),
switchMap((epersonListRD: RemoteData<PaginatedList<EPerson>>) => {
const dtos$ = observableCombineLatest([...epersonListRD.payload.page.map((member: EPerson) => {
const dto$: Observable<EpersonDtoModel> = observableCombineLatest(
this.isMemberOfGroup(member), (isMember: ObservedValueOf<Observable<boolean>>) => {
const epersonDtoModel: EpersonDtoModel = new EpersonDtoModel();
epersonDtoModel.eperson = member;
epersonDtoModel.memberOfGroup = isMember;
return epersonDtoModel;
});
return dto$;
})]);
return dtos$.pipe(defaultIfEmpty([]), map((dtos: EpersonDtoModel[]) => {
return buildPaginatedList(epersonListRD.payload.pageInfo, dtos);
}));
}))
.subscribe((paginatedListOfDTOs: PaginatedList<EpersonDtoModel>) => {
this.ePeopleSearchDtos.next(paginatedListOfDTOs);
getRemoteDataPayload())
.subscribe((paginatedListOfEPersons: PaginatedList<EPerson>) => {
this.ePeopleSearch.next(paginatedListOfEPersons);
}));
}

View File

@@ -1,6 +1,54 @@
<ng-container>
<h3 class="border-bottom pb-2">{{messagePrefix + '.head' | translate}}</h3>
<h4>{{messagePrefix + '.headSubgroups' | translate}}</h4>
<ds-pagination *ngIf="(subGroups$ | async)?.payload?.totalElements > 0"
[paginationOptions]="config"
[collectionSize]="(subGroups$ | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="subgroupsOfGroup" class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th scope="col" class="align-middle">{{messagePrefix + '.table.id' | translate}}</th>
<th scope="col" class="align-middle">{{messagePrefix + '.table.name' | translate}}</th>
<th scope="col" class="align-middle">{{messagePrefix + '.table.collectionOrCommunity' | translate}}</th>
<th>{{messagePrefix + '.table.edit' | translate}}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let group of (subGroups$ | async)?.payload?.page">
<td class="align-middle">{{group.id}}</td>
<td class="align-middle">
<a (click)="groupDataService.startEditingNewGroup(group)"
[routerLink]="[groupDataService.getGroupEditPageRouterLink(group)]">
{{ dsoNameService.getName(group) }}
</a>
</td>
<td class="align-middle">{{ dsoNameService.getName((group.object | async)?.payload)}}</td>
<td class="align-middle">
<div class="btn-group edit-field">
<button (click)="deleteSubgroupFromGroup(group)"
class="btn btn-outline-danger btn-sm deleteButton"
title="{{messagePrefix + '.table.edit.buttons.remove' | translate: { name: dsoNameService.getName(group) } }}">
<i class="fas fa-trash-alt fa-fw"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</ds-pagination>
<div *ngIf="(subGroups$ | async)?.payload?.totalElements == 0" class="alert alert-info w-100 mb-2"
role="alert">
{{messagePrefix + '.no-subgroups-yet' | translate}}
</div>
<h4 id="search" class="border-bottom pb-2">
<span *dsContextHelp="{
content: 'admin.access-control.groups.form.tooltip.editGroup.addSubgroups',
@@ -35,7 +83,6 @@
<ds-pagination *ngIf="(searchResults$ | async)?.payload?.totalElements > 0"
[paginationOptions]="configSearch"
[pageInfoState]="(searchResults$ | async)?.payload"
[collectionSize]="(searchResults$ | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
@@ -53,24 +100,18 @@
<tbody>
<tr *ngFor="let group of (searchResults$ | async)?.payload?.page">
<td class="align-middle">{{group.id}}</td>
<td class="align-middle"><a (click)="groupDataService.startEditingNewGroup(group)"
[routerLink]="[groupDataService.getGroupEditPageRouterLink(group)]">{{group.name}}</a></td>
<td class="align-middle">{{(group.object | async)?.payload?.name}}</td>
<td class="align-middle">
<a (click)="groupDataService.startEditingNewGroup(group)"
[routerLink]="[groupDataService.getGroupEditPageRouterLink(group)]">
{{ dsoNameService.getName(group) }}
</a>
</td>
<td class="align-middle">{{ dsoNameService.getName((group.object | async)?.payload) }}</td>
<td class="align-middle">
<div class="btn-group edit-field">
<button *ngIf="(isSubgroupOfGroup(group) | async) && !(isActiveGroup(group) | async)"
(click)="deleteSubgroupFromGroup(group)"
class="btn btn-outline-danger btn-sm deleteButton"
title="{{messagePrefix + '.table.edit.buttons.remove' | translate: {name: group.name} }}">
<i class="fas fa-trash-alt fa-fw"></i>
</button>
<p *ngIf="(isActiveGroup(group) | async)">{{ messagePrefix + '.table.edit.currentGroup' | translate }}</p>
<button *ngIf="!(isSubgroupOfGroup(group) | async) && !(isActiveGroup(group) | async)"
(click)="addSubgroupToGroup(group)"
<button (click)="addSubgroupToGroup(group)"
class="btn btn-outline-primary btn-sm addButton"
title="{{messagePrefix + '.table.edit.buttons.add' | translate: {name: group.name} }}">
title="{{messagePrefix + '.table.edit.buttons.add' | translate: { name: dsoNameService.getName(group) } }}">
<i class="fas fa-plus fa-fw"></i>
</button>
</div>
@@ -86,49 +127,4 @@
{{messagePrefix + '.no-items' | translate}}
</div>
<h4>{{messagePrefix + '.headSubgroups' | translate}}</h4>
<ds-pagination *ngIf="(subGroups$ | async)?.payload?.totalElements > 0"
[paginationOptions]="config"
[pageInfoState]="(subGroups$ | async)?.payload"
[collectionSize]="(subGroups$ | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="subgroupsOfGroup" class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th scope="col" class="align-middle">{{messagePrefix + '.table.id' | translate}}</th>
<th scope="col" class="align-middle">{{messagePrefix + '.table.name' | translate}}</th>
<th scope="col" class="align-middle">{{messagePrefix + '.table.collectionOrCommunity' | translate}}</th>
<th>{{messagePrefix + '.table.edit' | translate}}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let group of (subGroups$ | async)?.payload?.page">
<td class="align-middle">{{group.id}}</td>
<td class="align-middle"><a (click)="groupDataService.startEditingNewGroup(group)"
[routerLink]="[groupDataService.getGroupEditPageRouterLink(group)]">{{group.name}}</a></td>
<td class="align-middle">{{(group.object | async)?.payload?.name}}</td>
<td class="align-middle">
<div class="btn-group edit-field">
<button (click)="deleteSubgroupFromGroup(group)"
class="btn btn-outline-danger btn-sm deleteButton"
title="{{messagePrefix + '.table.edit.buttons.remove' | translate: {name: group.name} }}">
<i class="fas fa-trash-alt fa-fw"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</ds-pagination>
<div *ngIf="(subGroups$ | async)?.payload?.totalElements == 0" class="alert alert-info w-100 mb-2"
role="alert">
{{messagePrefix + '.no-subgroups-yet' | translate}}
</div>
</ng-container>

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