Compare commits

..

837 Commits

Author SHA1 Message Date
Tim Donohue
507ecdb1dd Update version tag for release 2025-04-04 13:59:59 -05:00
Tim Donohue
eb8a960ba6 Merge pull request #4129 from tdonohue/add_release_notes
Add note with link to Release Notes on homepage (for Testathon)
2025-04-04 11:39:58 -05:00
Tim Donohue
f4dbfc2f19 Add note with link to Release Notes on homepage 2025-04-04 11:01:01 -05:00
Tim Donohue
de44252a56 Merge pull request #4125 from 4Science/task/main/DURACOM-339
[DURACOM-339] fix downloads not working when matomo is disabled
2025-04-04 09:58:42 -05:00
Tim Donohue
57d5bb0359 Merge pull request #3981 from atmire/no-platform-specific-code-in-abstract-services-main
No platform specific code in abstract services main
2025-04-03 12:10:12 -05:00
Andrea Barbasso
3d36cd2e48 [DURACOM-339] fix downloads not working when matomo is disabled 2025-04-03 17:56:07 +02:00
Tim Donohue
c9654b268e Merge pull request #3994 from atmire/refactor-menu-resolvers-9.0
Refactor menu resolvers 9.0
2025-04-01 14:53:28 -05:00
Abel Gómez
e0393babc9 Retrieve configurable CC license fields from the back-end in DSpace 9.0 (#3165)
* Make the CC license field component configurable

* Retrieve the configuration values from the backend...

... rather than from a frontend configuration

* Remove unused imports

* Restore configurations other than uri and license fields

They were deleted by mistake

* Add missing example config

* Delete config properties that are no longer needed

* Fix lint issues

* Add missing injection token

* Fex minor changes

* Restore the Input properties that allow configuring the license URI and name fields from a template
* Update test cases using a stub configuration data service
* Fix lint issues

* Use optional chaining, in case the property is not exposed

* Reformat some code to ease code review

* Declare static constant at the beginning of the class

* Fix trailing spaces

* Initialize property in declaration

* Multiple changes

* Move all properties dependent of the CC URI field and CC name field to asyncs (since this configuration must be retrieved also asynchronously from the backend)
* Refactor the regex, and create a public static method (that may be used to externally check if a license is a CC license).
* Update test cases

* Move `ccLicense` inside the `item`configuration key

* Change `variant` to `position`

* Make variant property mandatory (since it should be set depending on where the field is placed)
* Finish moving the ccLicense config key into the item key
* Allow rendering only the icon

* Fix lint errors

* Fix lint errors

* Fix test cases to reflect new disclaimer behavior

* Fix missing comma

* Remove look & feel configuration options

* Remove unused import

* Don't subscribe multiple type to same asyncs

* Set type for non-initialiazed properties

* Refactor CC license function to a dedicated utility file

* Do not use manual subscribes

* Reorder imports

* Remove unused method

* Bugfix: check the right property
2025-04-01 09:53:23 -05:00
Yury Bondarenko
39bcaa0318 Update unit test for browse menu provider 2025-04-01 09:52:58 +02:00
Yury Bondarenko
bd0b75c315 Merge remote-tracking branch 'origin/main' into refactor-menu-resolvers-9.0 2025-04-01 09:42:32 +02:00
Tim Donohue
ec6940afbe Merge pull request #3540 from kshepherd/geospatial-maps-main
Geospatial maps for item pages, search, browse
2025-03-31 14:59:53 -05:00
Yana De Pauw
b87380b07d Merge remote-tracking branch 'upstream/main' into refactor-menu-resolvers-9.0 2025-03-31 15:50:40 +02:00
Kim Shepherd
6f7f5450ca Geospatial maps: Better "no points" handling
* If no results for browse or search
  maps are available, zoom to 1 and
  show a i18n tooltip
* Added a missing i18n for point filter
* New default centre point added to
  configuration
2025-03-30 16:56:12 +02:00
Tim Donohue
9c23b4c9f9 Merge pull request #3164 from sistedes/config-default-comcol-tab
Make the default tab for browsing communities and collections configurable in DSpace 8
2025-03-28 13:41:01 -05:00
Kim Shepherd
0bd93ae1d9 Geospatial maps: Review feedback addressed
* Documentation of config
* Set bounding box to use dcterms.spatial by default
* Uncomment geospatial field and wrap in config test
* New config to 'enable' inclusion of geospatial field
* Docs for map and marker detail models
* Bounding box validation
* Fixed view mode control flow
* Tidied console output
2025-03-28 18:27:36 +01:00
Kim Shepherd
6fd36bd2b7 Geospatial maps: Test fixes
Including reverting a nice-to-have improvement
to 'hasNoContent' for field wrapper and non-text
content.
2025-03-28 18:27:36 +01:00
Kim Shepherd
d5c3f4dbe9 Geospatial maps: Remove unwanted deps from package-lock.json 2025-03-28 18:27:36 +01:00
Kim Shepherd
0c5c1e46b0 Geospatial maps: Swap out async() in tests 2025-03-28 18:27:36 +01:00
Kim Shepherd
6f6016a90d Geospatial maps: Review feedback 2025-03-28 18:27:36 +01:00
Kim Shepherd
1f760d882a Geospatial maps: Revert metadata-representation-list.component.ts changes
Note: Might interfere with some nice virtual authority compatibility
2025-03-28 18:27:36 +01:00
Kim Shepherd
d4dee96823 Geospatial maps: Angular control flow refactor 2025-03-28 18:27:36 +01:00
Kim Shepherd
0be836ad80 Geospatial maps: icon and browse page fix 2025-03-28 18:27:36 +01:00
Kim Shepherd
b6cdb7c6b1 Geospatial maps for item pages, search, browse 2025-03-28 18:27:35 +01:00
Yana De Pauw
a16ea97b53 Merge remote-tracking branch 'upstream/main' into refactor-menu-resolvers-9.0 2025-03-28 18:10:02 +01:00
Tim Donohue
8086c2242d Merge pull request #4018 from 4Science/task/main/CST-18964
Add support for Matomo
2025-03-28 11:46:05 -05:00
Andrea Barbasso
4ba9a4bf8f Merge remote-tracking branch 'lyrasis/main' into task/main/CST-18964
# Conflicts:
#	src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts
2025-03-28 16:59:51 +01:00
Tim Donohue
1e4864f45a Merge pull request #3722 from alexandrevryghem/w2p-119915_made-edit-metadata-tab-fields-dynamic_contribute-main
Made edit metadata tab fields dynamic and added entity type support
2025-03-28 10:17:12 -05:00
Tim Donohue
bb18278b2f Merge pull request #3984 from the-library-code/request-a-copy-secure-links_main
Request-a-copy improvements: Support access by secure link
2025-03-28 09:59:58 -05:00
Yana De Pauw
dda32dd81a Implement community feedback p2 2025-03-28 14:46:14 +01:00
Vincenzo Mecca
69472b27c7 [CST-18964] Restored matomo trackerUrl optional setting.
feat:
  - This configuration would be only used on the angular side, if not specified will use the backend default.
2025-03-28 11:50:53 +01:00
Yury Bondarenko
87624c7699 Fix access duration dropdown in custom theme 2025-03-28 11:48:48 +01:00
Kim Shepherd
e9cf183bbf Request-a-copy: Try to address theme compatibility of dropdown 2025-03-27 18:17:53 +01:00
Kim Shepherd
f070dee931 Request-a-copy: Error handling (review feedback)
* New accessExpired flag can be checked along with
  acceptRequest, so expired or not-granted links
  will show an error and draw 'normal' download links
  instead of doing a hard 4xx redirect
* Old ItemWithSupplementaryData component removed
* Notifications moved to sub-component of item page
  and display a warning on valid access token, or a
  danger alert if expired or not-granted, with an
  appropriate error message
* Date formatted in messages as yyyy-MM-dd
2025-03-27 18:17:53 +01:00
Yana De Pauw
51127dc513 Fix accessibility issue 2025-03-27 17:09:20 +01:00
Tim Donohue
11e02c9504 Merge pull request #3355 from 4Science/task/main/CST-15074
ORCID Login flow for private emails
2025-03-26 14:53:46 -05:00
Vincenzo Mecca
ab9cbea7c3 [CST-18964] Fixes empty trackerId for bitstream download feature 2025-03-26 20:23:21 +01:00
Kim Shepherd
58cee5fb2e Request-a-copy: Replace +1WEEK -> +7DAYS delta 2025-03-26 17:08:10 +01:00
Kim Shepherd
7671595665 Request-a-copy: Review feedback addressed
* ALTCHA updated to 0.9.0 and tested
* Alt text for fas-lock-open images
* Typedoc added
* Comments/TODOs removed
* Better expiry date display on notification panel
2025-03-26 17:08:10 +01:00
Kim Shepherd
d8fb9f1195 Request-a-copy: Test fixes 2025-03-26 17:08:10 +01:00
Kim Shepherd
a1e7d653f2 Request-a-copy: Unit tests 2025-03-26 17:08:08 +01:00
Kim Shepherd
1fff3b5b86 Request-a-copy: Changes to support access expiry as delta/date storage - psql max 2025-03-26 17:07:29 +01:00
Kim Shepherd
57b618ce34 Request-a-copy: Changes to support access expiry as delta/date storage 2025-03-26 17:07:29 +01:00
Kim Shepherd
16451807f9 Request-a-copy: Using route only in place of wrapper item 2025-03-26 17:07:28 +01:00
Kim Shepherd
80fafbf2e1 Request-a-copy: Angular flow control changes 2025-03-26 17:06:41 +01:00
Kim Shepherd
d1bcb9fb2e Request-a-copy: Use wrapped ItemWithSupp.. and base item comps, except download link 2025-03-26 17:06:41 +01:00
Kim Shepherd
58d0e7f513 Request-a-copy: Using a resolver to grab the RequestItem 2025-03-26 17:06:41 +01:00
Kim Shepherd
ce93b847d2 Request-a-copy: Code cleanup and comments 2025-03-26 17:06:41 +01:00
Kim Shepherd
c9c2a774ea Request-a-copy: Merge recaptcha headers to generic x-captcha-payload 2025-03-26 17:06:41 +01:00
Kim Shepherd
e928eab96b Request-a-copy improv: altcha fixes 2025-03-26 17:06:41 +01:00
Kim Shepherd
bff5662116 Request-a-copy improv: Add altcha dependency to package.json 2025-03-26 17:06:41 +01:00
Kim Shepherd
585347b1a2 Request-a-copy improv: English i18n 2025-03-26 17:06:41 +01:00
Kim Shepherd
e736bbb9ec Request-a-copy improv: Altcha recaptcha component and service 2025-03-26 17:06:41 +01:00
Kim Shepherd
0c58a5bf05 Request-a-copy: Refactor for angular control flow changes 2025-03-26 17:06:41 +01:00
Kim Shepherd
60bbcf3420 Request-a-copy improv: Changes to bitstream page to support tests 2025-03-26 17:06:41 +01:00
Kim Shepherd
0de6481c24 Request-a-copy improv: Routing and module changes 2025-03-26 17:06:41 +01:00
Kim Shepherd
4281267cb6 Request-a-copy improv: Secure item view comps 2025-03-26 17:06:41 +01:00
Kim Shepherd
f3bb7327dc Request-a-copy improv: Secure file section and download links 2025-03-26 17:06:41 +01:00
Kim Shepherd
aea41d74ec Request-a-copy improv: Secure media and image viewers 2025-03-26 17:06:41 +01:00
Tim Donohue
5a53cc9738 Merge pull request #3882 from nibou230/2413-bitstream-access-status
Display the access status (embargo) for the bitstream
2025-03-26 09:43:04 -05:00
Nicolas Boulay
0976147d07 Replaced the call findItemAccessStatusFor for a resolveLink 2025-03-25 10:55:55 -04:00
Nicolas Boulay
fe3ae0e8b4 Add an input to show/hide the badge on file component 2025-03-25 10:55:55 -04:00
Nicolas Boulay
2c6754a647 Improve the description of the bitsream showAccessStatuses configuration 2025-03-25 10:55:55 -04:00
Nicolas Boulay
96b596491e Add unit tests for the badge on bitstreams 2025-03-25 10:55:55 -04:00
Nicolas Boulay
de512610b4 Merge embargo badge with the existing access-status badge 2025-03-25 10:55:55 -04:00
Nicolas Boulay
61576e94d0 Insert the bitstream access status badge before the element and increase margins 2025-03-25 10:55:54 -04:00
Nicolas Boulay
d72bc0d1bb Remove findBitstreamAccessStatusFor and replace it with followLink('accessStatus') 2025-03-25 10:55:54 -04:00
Nicolas Boulay
5f83139fcd Adding the new embargo badge on the file download component
Fixed lint no-trailing-spaces
2025-03-25 10:55:21 -04:00
jeffmorin
5b7d246f68 CSV export for Filtered Items content report (#4071)
* CSV export for Filtered Items content report

* Fixed lint errors

* Fixed lint errors

* Fixed lint errors

* Make variables for CSV export null-proof

* Attempt to fix unit tests

* Fixed styling errors

* Fixed script references in unit tests

* Fixed typo in script name

* Fixed test parameterization

* Parameterization attempt

* Parameterization test

* Parameterization rollback

* Fixed predicate encoding bug

* Parameterization test

* Fixed styling error

* Fixed query predicate parameter

* Fixed collection parameterization

* Centralized string representation of a predicate

* Fixed parameterization

* Fixed second export test

* Replaced null payload by an empty non-null one

* Requested changes

* Fixed remaining bugs

* Updated Angular control flow syntax

* Improved collection parameter handling

* Fixed styling error

* Updated config.yml to match the central dspace-angular repo

* Removed repeated content

* Cleaned up a now useless import

* Fixed collections loading and added warning message about CSV export

* Fixed styling error

* Forgot to clean up old code

---------

Co-authored-by: Jean-François Morin <jean-francois.morin@bibl.ulaval.ca>
2025-03-25 09:49:46 -05:00
Tim Donohue
fd59ca8053 Merge pull request #4017 from 4Science/task/main/CST-18016
OpenAlex Integration
2025-03-24 17:05:28 -05:00
Vincenzo Mecca
e4e5255a46 [CST-18964] Fixes spec failure 2025-03-24 21:26:10 +01:00
Vincenzo Mecca
6bd4f04174 [CST-18964] PR review 2025-03-24 19:16:50 +01:00
Vincenzo Mecca
1316540765 [CST-15074] Fixes cyclic dependency issue 2025-03-23 22:33:27 +01:00
Vincenzo Mecca
c1b951b18c Merge remote-tracking branch 'github/main' into task/main/CST-15074
# Conflicts:
#	src/assets/i18n/en.json5
2025-03-23 15:44:38 +01:00
Yana De Pauw
d6b674345f Implement feedback 2025-03-19 13:10:26 +01:00
Adamo
02516f2251 [CST-18016] Added OpenAlex Search by DOI label 2025-03-19 08:16:05 +01:00
Tim Donohue
a18e03d754 Merge pull request #3735 from amgciadev/fix-10053-b
#10053: Add support for PCI Endorsement workflow
2025-03-17 10:44:54 -05:00
Tim Donohue
d9c68d41bf Merge pull request #4038 from paulo-graca/translations/access_status_filter
Translations for access status filter
2025-03-17 09:29:25 -05:00
Alexandre Vryghem
41ac417543 119915: Added additional docs 2025-03-14 18:18:35 +01:00
Tim Donohue
3468ef689d Merge pull request #3980 from the-library-code/de_language_updates_main
Translation additions, fixes and updates for German message catalogue
2025-03-14 09:47:14 -05:00
Adamo
7929d8e419 [CST-18016] Added missin label. 2025-03-14 10:27:00 +01:00
Giuseppe Digilio
cfe16892ab [CST-18016] Add i18n labels 2025-03-14 09:25:23 +01:00
Abel Gómez
422a714935 Check the full URL rather than only the collection id to detect the default path 2025-03-14 01:01:52 +01:00
Abel Gómez
30b411285c Fix missing keys in language file 2025-03-14 00:18:38 +01:00
Abel Gómez
53562e5a3e Also load the default tab when navigating using the breadcrumbs 2025-03-14 00:07:26 +01:00
Abel Gómez
5d4006f753 Rework redirection using allOptions 2025-03-13 23:38:56 +01:00
Abel Gómez
262f758699 Simplify page redirection when the default route is used 2025-03-13 22:44:32 +01:00
Abel Gómez
c212b3dccd Add default route for when no page reaload is performed 2025-03-13 22:43:51 +01:00
Giuseppe Digilio
79c5d5a560 [CST-18016] Create a new page to list the suggestion sources 2025-03-13 20:47:47 +01:00
Abel Gómez
cdcd886a3a Merge remote-tracking branch 'upstream/main' into config-default-comcol-tab 2025-03-13 20:02:15 +01:00
Giuseppe Digilio
2df409ca63 [CST-18016] Create suggestions folder to better organize the code relative to notifications functionalities 2025-03-13 13:41:53 +01:00
Yannick Paulsen
26f2b8c5b0 Typo corrections 2025-03-13 09:31:22 +01:00
Tim Donohue
b44b7a66c1 Merge pull request #4069 from tdonohue/fix_e2e_tests
Minor fixes to Cypress e2e tests
2025-03-12 16:33:43 -05:00
Vincenzo Mecca
d6776a8a1e [CST-15074][#3355] PR review 2025-03-12 20:15:57 +01:00
Giuseppe Digilio
117514bace [CST-18016] Create a new component to list the qa sources 2025-03-12 20:10:42 +01:00
Vincenzo Mecca
f2c5912dfa [CST-15074][#3355] Removes unused imports 2025-03-12 17:16:13 +01:00
Vincenzo Mecca
34726614f0 [CST-15074][#3355] Resolved conflicts and updated control-flow syntax 2025-03-12 17:08:07 +01:00
Vincenzo Mecca
0e56427789 Merge remote-tracking branch 'github/main' into task/main/CST-15074
# Conflicts:
#	src/app/shared/log-in/log-in.component.ts
#	src/themes/custom/app/shared/log-in/log-in.component.ts
2025-03-12 16:55:15 +01:00
Yana De Pauw
b009e0b640 Fix dropdown style issue 2025-03-12 16:27:04 +01:00
Yana De Pauw
fca8c6f418 Fix control-flow issues 2025-03-12 14:07:28 +01:00
Yana De Pauw
c53d7187c7 Merge remote-tracking branch 'upstream/main' into refactor-menu-resolvers-9.0 2025-03-12 12:42:34 +01:00
Giuseppe Digilio
20df163444 Merge branch 'refs/heads/main' into task/main/CST-18016 2025-03-12 12:13:29 +01:00
Agustina Martinez
6467b60e65 Merge branch 'main' into fix-10053-b 2025-03-12 08:38:56 +00:00
Alexandre Vryghem
a947e8cbf6 Merge branch 'main' into w2p-119915_made-edit-metadata-tab-fields-dynamic_contribute-main
# Conflicts:
#	src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-field-values/dso-edit-metadata-field-values.component.html
#	src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.html
#	src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.ts
#	src/app/dso-shared/dso-edit-metadata/dso-edit-metadata.component.html
#	src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.html
2025-03-11 21:11:13 +01:00
Tim Donohue
4b921a641c Merge pull request #4039 from tdonohue/date_fixes
System Wide Alerts should send countdown date to REST API in ISO-8601 format
2025-03-11 15:05:40 -05:00
Tim Donohue
15f39ea93e Merge pull request #3997 from 4Science/task/main/DURACOM-307
Migration to new Angular Control Flow syntax
2025-03-11 14:14:47 -05:00
Alexandre Vryghem
2eb34ee634 119915: Fixed bootstrap 5 issues
- Replaced the dropdown icon from DsoEditMetadataEntityFieldComponent from a triangle to an arrow again
- Fixed background color of scrollable select fields always being white, was the only field where this was hardcoded
- Added missing translate pipes on the aria-label attributes from the selectable dropdowns
2025-03-11 14:45:49 +01:00
Andrea Barbasso
601c6cd49d Merge remote-tracking branch 'lyrasis/main' into task/main/CST-18964
# Conflicts:
#	package-lock.json
#	package.json
2025-03-11 10:31:49 +01:00
Andrea Barbasso
923579e702 [CST-18964] fix double search 2025-03-11 10:22:34 +01:00
Tim Donohue
308f0751cf Fix issues in IDEs (especially VS Code) with recognizing Cypress Typescript files. 2025-03-10 14:23:05 -05:00
Tim Donohue
b6a507d2a2 Reenable accessibility test which is now fixed 2025-03-10 14:22:47 -05:00
FrancescoMolinaro
51c95de793 [DURACOM-307] apply migration script to conflicted files resolved in favor of Angular 18 update 2025-03-10 18:11:22 +01:00
FrancescoMolinaro
1aa9faeb2f [DURACOM-307] add eslint rule to enforce control flow 2025-03-10 17:40:58 +01:00
FrancescoMolinaro
b1eb4a8bf9 [DURACOM-307] fix tests 2025-03-10 17:40:56 +01:00
FrancescoMolinaro
dc70ec0ef0 [DURACOM-307] remove not migrated directives, clean up 2025-03-10 17:40:48 +01:00
FrancescoMolinaro
d1b9d4f692 [DURACOM-307] remove NgIf and NgFor imports 2025-03-10 17:40:33 +01:00
FrancescoMolinaro
c4696c9ba8 [DURACOM-307] fix lint 2025-03-10 17:40:12 +01:00
FrancescoMolinaro
069fd02517 [DURACOM-307] start migration and type fixing 2025-03-10 17:39:34 +01:00
Tim Donohue
b9e164de78 Merge pull request #3717 from atmire/w2p-120243_Upgrade-to-Angular-v18
Upgrade to angular v18
2025-03-10 11:24:59 -05:00
Alexandre Vryghem
432b6607c3 Merge branch 'main' into w2p-119915_made-edit-metadata-tab-fields-dynamic_contribute-main 2025-03-10 17:18:28 +01:00
Andreas Awouters
c90b05650a 120243: Disable 'aria-valid-attr-value' for community-list e2e test 2025-03-10 16:47:47 +01:00
Vincenzo Mecca
4d4fe529a5 [CST-15074][#3355] PR review 2025-03-10 16:39:23 +01:00
Tim Donohue
aca14117e7 Merge pull request #4061 from alexandrevryghem/restored-breadcrumbs-on-collection-pages_contribute-main
Restored breadcrumbs on collection pages
2025-03-10 09:09:50 -05:00
Vincenzo Mecca
b6fc9b5444 Merge remote-tracking branch 'github/task/main/CST-15074' into task/main/CST-15074 2025-03-10 11:38:14 +01:00
Vincenzo Mecca
af3c78cc50 [CST-15074][#3355] PR review 2025-03-10 10:21:50 +01:00
Alexandre Vryghem
7d04084642 Restored breadcrumbs on collection pages 2025-03-10 00:27:03 +01:00
Vincenzo Mecca
9065f4f606 Merge branch 'main' into task/main/CST-15074 2025-03-07 21:23:23 +01:00
Vincenzo Mecca
f56b6856dd [CST-15074][#3355] PR review 2025-03-07 21:22:10 +01:00
Vincenzo Mecca
77b027a6c6 [CST-15074][#3355] PR review 2025-03-07 19:51:41 +01:00
Adamo
16eda4f186 [CST-18016] Updated labels. 2025-03-06 23:52:23 +01:00
Vincenzo Mecca
c2701c412c Merge remote-tracking branch 'origin/main' into task/main/CST-15074
# Conflicts:
#	src/assets/i18n/en.json5
2025-03-06 19:47:38 +01:00
Sascha Szott
e976ddb07c remove custom theme dependency in base component SuggestionListElementComponent (#4041)
* remove custom theme dependency

* remove custom theme component

* remove obsolete constructor

* fix lint error

* fix lint error
2025-03-06 10:28:12 -06:00
Tim Donohue
987e146209 Merge pull request #4035 from alanorth/citation-doi-tag
[Port main] Add citation_doi tag to head meta
2025-03-06 10:11:54 -06:00
Paulo Graça
e0e2e5affa removing trailing spaces 2025-03-06 15:40:39 +00:00
Paulo Graça
7fe155103a French translations for access_status filters 2025-03-06 15:29:14 +00:00
Yury Bondarenko
2ea32752bc Recreate lockfile 2025-03-06 14:57:52 +01:00
Yury Bondarenko
a3a2f259b2 Pin notistack v3.0.1 to avoid peer conflict with React 2025-03-06 14:57:44 +01:00
Andreas Awouters
a0c9b3da91 120243: update @angular/cdk
(cherry picked from commit cd7bf4283a236ad0c899bcda5277e605ffa8ddcb)
2025-03-06 14:22:54 +01:00
Andreas Awouters
10dc73498a 120243: npm audit fix --force 2025-03-06 14:17:18 +01:00
Andreas Awouters
0f3a7ff902 120243: npm audit fix 2025-03-06 14:16:46 +01:00
Andreas Awouters
47d55ecd36 120243: Fix xsrf.interceptor tests 2025-03-06 14:16:46 +01:00
Andreas Awouters
1df73d6730 120243: Fix test without spec 2025-03-06 14:16:45 +01:00
Andreas Awouters
540cb86b2d 120243: Fix REST baseUrl in test environment 2025-03-06 14:16:45 +01:00
Andreas Awouters
8d02988da7 120243: Fix test compilation issues after upgrade 2025-03-06 14:16:45 +01:00
Andreas Awouters
2173f3956e 120243: Fix prod compilation issues after upgrade 2025-03-06 14:16:45 +01:00
Andreas Awouters
76e1a39208 120243: Fix dev compilation issues after upgrade 2025-03-06 14:16:45 +01:00
Andreas Awouters
d87b375a35 120243: Fix lint issues after upgrade 2025-03-06 14:16:45 +01:00
Andreas Awouters
ae32581d20 120243: Update overrides after upgrade 2025-03-06 14:16:45 +01:00
Andreas Awouters
c52c4542ce 120243: ng update @angular-builders/custom-webpack 2025-03-06 14:16:45 +01:00
Andreas Awouters
a0f6f4b0cc 120243: Remove @ngtools/webpack from overrides 2025-03-06 14:16:44 +01:00
Andreas Awouters
1ab022ad6c 120243: ng update @ngtools/webpack 2025-03-06 14:16:44 +01:00
Andreas Awouters
8150517f13 120243: ng update ngx-ui-switch 2025-03-06 14:16:44 +01:00
Andreas Awouters
99b3db365a 120243: ng update ngx-infinite-scroll 2025-03-06 14:16:27 +01:00
Andreas Awouters
e259cf4c13 120243: Remove ng2-file-upload from overrides 2025-03-06 14:16:27 +01:00
Andreas Awouters
8072d8f0f2 120243: ng update ng2-file-upload 2025-03-06 14:16:27 +01:00
Andreas Awouters
54e6471fa5 120243: ng update @ngrx-translate/core 2025-03-06 14:16:27 +01:00
Andreas Awouters
3a049da620 120243: ng update @ngrx/effects 2025-03-06 14:16:26 +01:00
Andreas Awouters
bb55534f2c 120243: Restore serve:ssr and build:ssr after upgrade 2025-03-06 14:16:06 +01:00
Andreas Awouters
5e7b066af1 120243: ng update @angular/core @angular/cli --force 2025-03-06 14:16:06 +01:00
Andreas Awouters
16eb620f4f 120243: ng update @angular-eslint/schematics 2025-03-06 14:15:48 +01:00
Alan Orth
9db25ec2c8 Merge pull request #3957 from saschaszott/saschaszott-patch-9
fixed deprecated import of TransferState
2025-03-06 08:23:38 +03:00
Wout-atmire
e0240259ec Upgrade to Bootstrap 5 & realign themes (#3506)
* 117631: upgraded bootstrap, ng-bootstrap and installed popper.js

* 117631: SASS to CSS variables

* 117631: Bootstrap 4 to 5 html/css fixes

* 117631: Theming fixes after bootstrap upgrade

* 117631: More theming fixes: accordions, spacing, search components etc

* 117631: Fixed tests

* 117631: Fixed offset issues

* 117631: Fixed contrast ratio issue

* 117631: Fixed variables, removed unnecessary mapping, fixed tables, upgraded to Bootstrap 5.3.3

* 118113: vertical footer deviders

* 118113: remove button shadow

* 118113: old checkboxes

* 118113: Custom icons font-family

* 118113: accordion color

* 118113: table striped customizable background-color

* 118113: revert vertical deviders in footer bs-secondary change

* 118113: modal close button

* 118113: add w-100 to btn-block elements

* 118113: border radius

* 118113: The date selector on the submission page gets squished to the side of its label fix

* 118113: adding margins to dynamic-form-control-containers

* 118113: adding gaps between sections of item submission form

* 118113: icon font-family removed !important

* 118113: removed !important from #legend_dc_date_issued

* 118113: move --bs-border-radius to $bs-border-radius

* 118113: remove new SCSS variable

* 118113: reduce size for Item type labels

* 118113: date picker border - transparent

* 118113: drag-item-container elements on same line

* 118113: specific border color for ds-number-picker buttons

* Simplify variables & styles

* 118627: html files

* Fix new SCSS compile issues, remove yarn.lock

* 118627: remove footer button shadow

* 118627: custom login button radius

* 118627: success button - white text

* 118627: table alternate colors

* Fix ghostly Bootstrap version, again

* Override (ng-)bootstrap versions for @ng-dynamic-forms

* 118627: Feedback - fix login button radius

* 118627: Feedback - fix footer button shadows

* 118627: Feedback - login border radius use $bs-border-radius-lg + change to rem

* 118627: Tooltip issue

* 118627: Metadata white authority badge

* 118627: Align Back button

* 118627: Bitstreams under Item's Metadata issue fix

* 118627: select on edit collection page "arrow icon"

* 118627: fix alignment issues

* 118627: fix admin sidebar "Managment" label

* 118627: Feedback - login button

* 118627: Line above table heads

* 118627: Remove HMTL accordion expandable arrow

* 118627: bitstream table

* 118627: notification "close button"

* 118627: faint border/shadow around the expand buttons on hierarchical browse pages

* 118627: tooltip margin

* 118627: Bootstrap 5 changed the default gutter size to 24px

* 118627: custom-aligning -> custom-alignment

* 118627: lint-fix

* 118627: lint fix

* 118627: e2e Fix with new "btn-close"

* 118627: e2e Fix heading order for access-control-form-container

* 118627: access-control-form-container mr-4 to me-4

* 118627: update mr to me & ml to ms & pr to ps & pl to ps

* 118627: Access Control "Mode" radiobuttons under Text

* 118627: Item submission Publisher select icon positioning

* 118627: resolved merge conflict with main (and npm install)

* 118627: cherrypicking 3553 commits

* Remove unused angular-idle-preload

(cherry picked from commit fef5dd72b3)

* 118627: npm install - to fix package-lock.json

* 120594: hamberger menu not showing fix

* 120594: big logo header issue

* 120594: remove faint shadow

* 120594: btn-transparent class

* 120594: badge-* to bg-*

* 120594: add padding-right & -left for rounded-pill

* 120594: update test variables to fit the new bootstrap variables

* 120594: add missing rss conditions

* 120594: fix white badges

* 118627: remove shadow on number-picker

* 120594: revert white badge fix

* 120594: re-add dropdown-button in dynamic-lookup-relation-search-tab

* 120594: remove default radio button styling

* 120594: full width radio buttons

* 120594: edit collection page alignment

* 120594: bg -> bg-primary

* 120594: revert to old info color

* 120594: revert media breakpoints

* 120594: recover PR 3227 rss

* 120594: remove login & logout from PR

* 120594: ds-filter input & label gap

* 120594: ds-filter aligning rows

* 120594: remove navbar.module.ts

* 120594: remove item-edit-bitstream.component.html

* 120594: remove item-edit-bitstream-drag-handle.component.html

* 120594: Fix vocabulary-treeview styling

* 120594: Remove unused browse-by-metadata-page.component.html

* 120594: red invalid input label

* 120594: use old link color for number-picker: #1f7293

* 120594: move $theme-colors to sass override

* 120594: spacing for upload icon

* 120594: decrease media-breakpoint-down

* 120594: PR 3227 rss

* 120594: merge in main bootstrap variable mappings

* 120594: restore all mapped variable that have a value

* 120594: fix unset variable item-edit-bitstream-bundle.component.scss

* 120594: old tooltip color

* 120594: edit bitstream render text inline with the icon

* Revert "120594: merge in main bootstrap variable mappings"

This reverts commit 4e61b5fb

* 120594: add non-default mapped variables with references

* 120594: add docs in _bootstrap_variables_mapping.scss

* 120594: use bootstrap variables instead of hardcoded values

---------

Co-authored-by: lotte <lotte_hofstede@hotmail.com>
Co-authored-by: Yura Bondarenko <yura.bondarenko@atmire.com>
Co-authored-by: Yury Bondarenko <ybnd@tuta.io>
Co-authored-by: Tim Donohue <tim.donohue@lyrasis.org>
2025-03-05 12:15:51 -06:00
Yana De Pauw
4b3215412f Move server init menus after authentication is ready 2025-03-05 16:45:45 +01:00
Alan Orth
f28dc8bf72 src/app/core: remove unnecessary comment
Remove commented out this.setCitationDOITag() since it is not used
and we use camel case with this.setCitationDoiTag() now anyway.
2025-03-05 17:01:24 +03:00
Alan Orth
0251aaa3f8 src/app/core: add citation_doi tag to head meta
This is used by harvesters like Altmetric and was present in DSpace
version 6 and previous.
2025-03-05 17:01:23 +03:00
Tim Donohue
b480317599 Merge pull request #2657 from alexandrevryghem/w2p-108608_created-search-scope-selector_contribute-main
Created new custom search scope context
2025-03-04 16:34:44 -06:00
Tim Donohue
fd7a18bfc5 Merge pull request #2937 from ray-lee/saml
Add support for SAML authentication.
2025-03-04 13:55:40 -06:00
Tim Donohue
97312820d6 Merge pull request #3786 from uniba-ub/issue-9636
translation keys for datacite project import
2025-02-27 17:03:22 -06:00
Tim Donohue
47bd509e75 Merge pull request #3785 from uniba-ub/issue-9404-a
change searchFilter isOpenByDefault autoserialization
2025-02-27 13:26:06 -06:00
Agustina Martinez
8402aebde7 Change label quality-assurance.event.table.event.message.serviceUrl to generic "Actor" 2025-02-27 13:37:12 +00:00
Tim Donohue
0dbae112db Use toISOString instead of toUTCString, as ISO puts it in ISO-8601 format 2025-02-26 12:25:46 -06:00
Adamo
66d9c7079b [CST-18016] Updated labels. 2025-02-26 13:47:06 +01:00
Paulo Graça
33ca20fbec remove trailing spaces 2025-02-26 11:38:12 +00:00
Paulo Graça
f7d34899a4 remove Trailing spaces 2025-02-26 11:24:40 +00:00
Paulo Graça
649f64e6e6 remove trailing space 2025-02-26 11:17:45 +00:00
Paulo Graça
52d826eaf6 search.filters.access_status 2025-02-26 11:06:50 +00:00
Paulo Graça
ce30e58c67 search.filters.access_status 2025-02-26 11:05:51 +00:00
Paulo Graça
f456af7a51 Access Status Filter PT translations 2025-02-26 11:03:33 +00:00
Paulo Graça
967a761ac1 Access Status Filter EN translations 2025-02-26 10:57:24 +00:00
Tim Donohue
52392ab719 Merge pull request #4020 from pilasou/pilasou-translations-fr
Changes to fr.json5 following version 8.1
2025-02-24 15:06:37 -06:00
Pierre Lasou
0437ec4c3f Addtion to the fr.json5 following version 8.1
Adding and changing parameters after upgrading to 8.1.
2025-02-21 15:43:59 -05:00
Andrea Barbasso
0bab79bea4 [CST-18694] add TypeDoc comments 2025-02-21 16:22:13 +01:00
Yana De Pauw
43e4f9de49 Fix e2e issues 2025-02-21 14:36:04 +01:00
Yana De Pauw
4a2158a178 Merge branch 'refactor-menu-resolvers-7.6' into refactor-menu-resolvers-9.0 2025-02-21 13:36:23 +01:00
Yana De Pauw
bb02acf13e Fix id related issues and add accessibility handle 2025-02-21 13:23:54 +01:00
Adamo
4235351d74 [CST-18016] Fix on themed-create-item-parent-selector.component.ts 2025-02-21 12:50:18 +01:00
Adamo
eeec2b536d [CST-18016] Lint fix 2025-02-21 10:27:09 +01:00
Adamo
b58dd32bff [CST-18016] Added label for live import 2025-02-21 10:16:17 +01:00
Adamo
caa5b1e29a [CST-18016] Fix import suggestion 2025-02-20 19:51:22 +01:00
Yannick Paulsen
11f79a3e6b Translation corrections 2025-02-19 11:41:26 +01:00
Yana De Pauw
174d185de3 Merge branch 'refactor-menu-resolvers-7.6' into refactor-menu-resolvers-9.0 2025-02-18 15:19:46 +01:00
Yana De Pauw
8b9af3b04c Remove circulary dependency 2025-02-18 15:13:19 +01:00
Yana De Pauw
ea53111aa1 Remove circulary dependency 2025-02-17 12:57:47 +01:00
Yana De Pauw
59481abd7f Remove circulary dependency 2025-02-17 12:57:35 +01:00
Tim Donohue
81ec674f38 Merge pull request #3995 from DSpace/backport-3673-to-main
[Port main] Update fr.json5
2025-02-14 14:49:39 -06:00
Carolyn Sullivan
ead548f499 Update fr.json5
Ajouté les corrections faites par Pierre Lasou :)

(cherry picked from commit e32d9feaf5)
2025-02-14 16:29:39 +00:00
Carolyn Sullivan
5e0ae8a26e Update fr.json5
Ajouté des traductions/noté quelques étiquettes sans traductions

(cherry picked from commit 477ca5e712)
2025-02-14 16:29:39 +00:00
Tim Donohue
3437ee8420 Merge pull request #3960 from pilasou/pilasou-translations-fr
Update fr.json5 to add identifiers deposit's step translations in french
2025-02-14 08:43:24 -06:00
Yana De Pauw
0fec5395ff Fix merge issues and tests
- Migrate create-report sections to a new provider
- Fix menu component test
- Add dso option sections to com/col sub paths
- Fix issue with breadcrumbs on the collection page
2025-02-14 13:11:15 +01:00
Yana De Pauw
c19af67009 Merge remote-tracking branch 'upstream/main' into refactor-menu-resolvers-9.0 2025-02-14 11:23:32 +01:00
Yana De Pauw
4b3d7e8ef7 Merge branch 'refactor-menu-resolvers-7.6' into refactor-menu-resolvers-9.0 2025-02-14 11:20:21 +01:00
Yana De Pauw
276452e4b9 Update DSO menu to also work for subpaths of the DSO and add missing messages 2025-02-14 11:08:47 +01:00
Yana De Pauw
2c49c04819 Merge branch 'refactor-menu-resolvers-7.6' into refactor-menu-resolvers-9.0 2025-02-13 16:12:05 +01:00
Yana De Pauw
f6263f86a4 Fix tests and issue with the getID methods 2025-02-13 15:57:02 +01:00
Andreas Awouters
3197ec911e Merge branch 'no-platform-specific-code-in-abstract-services-7.6' into no-platform-specific-code-in-abstract-services-main
# Conflicts:
#	src/app/core/auth/auth.service.ts
#	src/app/core/auth/server-auth.service.ts
#	src/app/core/services/cookie.service.ts
#	src/app/core/services/server-cookie.service.ts
2025-02-13 14:38:40 +01:00
Yannick Paulsen
41001f186b Translation additions, fixes and updates for German message catalogue
Made with results of the i18n-sync tool against en.json5
2025-02-13 14:38:17 +01:00
Yannick Paulsen
51102e27a1 Translation additions, fixes and updates for German message catalogue
Made with results of the i18n-sync tool against en.json5

All non-conflicting diffs applied during rebase, and some translations
replaced (for review)
2025-02-12 15:33:36 +01:00
Tim Donohue
a01966ac44 Merge pull request #3976 from jeffmorin/main
Added missing line to enable access to Content Reports
2025-02-11 14:19:09 -06:00
Jean-François Morin
a33afbef2b Added missing line for Content Reports section 2025-02-11 14:03:00 -05:00
Tim Donohue
446f681098 Merge pull request #3970 from DSpace/dependabot/npm_and_yarn/sass-fd5fd03206
Bump sass from 1.83.4 to 1.84.0 in the sass group
2025-02-10 15:36:13 -06:00
Tim Donohue
d5ea6f563b Merge pull request #3906 from DSpace/dependabot/npm_and_yarn/babel/runtime-7.26.7
Bump @babel/runtime from 7.26.0 to 7.26.7
2025-02-10 15:23:47 -06:00
Tim Donohue
bf20787a24 Merge pull request #3905 from DSpace/dependabot/npm_and_yarn/eslint-82f73a5bca
Bump eslint-plugin-jsonc from 2.18.2 to 2.19.1 in the eslint group
2025-02-10 12:08:07 -06:00
Tim Donohue
da05c05bb8 Merge pull request #3938 from DSpace/dependabot/npm_and_yarn/types/lodash-4.17.15
Bump @types/lodash from 4.17.14 to 4.17.15
2025-02-10 09:38:20 -06:00
Tim Donohue
8933df4184 Merge pull request #3937 from DSpace/dependabot/npm_and_yarn/isbot-5.1.22
Bump isbot from 5.1.21 to 5.1.22
2025-02-10 09:36:56 -06:00
Tim Donohue
d7c156fce9 Merge pull request #3936 from DSpace/dependabot/npm_and_yarn/testing-206d00ed14
Bump cypress-axe from 1.5.0 to 1.6.0 in the testing group
2025-02-10 09:33:10 -06:00
dependabot[bot]
7a4af88c0d Bump sass from 1.83.4 to 1.84.0 in the sass group
Bumps the sass group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.83.4 to 1.84.0
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.83.4...1.84.0)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: sass
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-10 02:49:15 +00:00
dependabot[bot]
98d32bc7ad Bump cypress-axe from 1.5.0 to 1.6.0 in the testing group
Bumps the testing group with 1 update: [cypress-axe](https://github.com/component-driven/cypress-axe).


Updates `cypress-axe` from 1.5.0 to 1.6.0
- [Release notes](https://github.com/component-driven/cypress-axe/releases)
- [Commits](https://github.com/component-driven/cypress-axe/compare/v1.5.0...v1.6.0)

---
updated-dependencies:
- dependency-name: cypress-axe
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: testing
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-10 02:48:29 +00:00
dependabot[bot]
5bf38231fa Bump eslint-plugin-jsonc from 2.18.2 to 2.19.1 in the eslint group
Bumps the eslint group with 1 update: [eslint-plugin-jsonc](https://github.com/ota-meshi/eslint-plugin-jsonc).


Updates `eslint-plugin-jsonc` from 2.18.2 to 2.19.1
- [Release notes](https://github.com/ota-meshi/eslint-plugin-jsonc/releases)
- [Changelog](https://github.com/ota-meshi/eslint-plugin-jsonc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ota-meshi/eslint-plugin-jsonc/compare/v2.18.2...v2.19.1)

---
updated-dependencies:
- dependency-name: eslint-plugin-jsonc
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-10 02:48:25 +00:00
Tim Donohue
fc5a3843a8 Merge tag 'dspace-8.1' 2025-02-07 14:06:06 -06:00
Tim Donohue
4caa39bddb Merge tag 'dspace-7.6.3' 2025-02-07 14:05:18 -06:00
Yury Bondarenko
516dd99a26 Fix remaining lint issues 2025-02-07 18:31:01 +01:00
Yury Bondarenko
3fecbc245b Fix tests pt. 1 2025-02-07 18:02:31 +01:00
Yury Bondarenko
fbffcca945 Resolve post-merge issues
- Menu providers weren't included because main configuration is no longer a module
- Route definitions didn't get merged because they're no longer modules
- Removed old resolver & service (they're providers now)
2025-02-07 18:02:31 +01:00
Tim Donohue
f08823333f Merge pull request #3966 from tdonohue/fixup_example
Move `enablePerformanceProfiler` option to last in list in `config.example.yml`
2025-02-07 09:34:44 -06:00
Yury Bondarenko
87eee70b0a Merge remote-tracking branch 'contrib/refactor-menu-resolvers-7.6' into main_PR-menus 2025-02-07 16:15:57 +01:00
Yury Bondarenko
3f7c42c51e Menu sections should be inactive by default
If an expandable section in the navbar is acive by default, it will expand whn the page loads
2025-02-07 13:46:24 +01:00
Tim Donohue
a37bb6ade1 Move performanceprofiler option to last in list 2025-02-06 15:21:08 -06:00
Sascha Szott
be6de64fcd use translation service to determine placeholder values of date picker (#2827)
* use translation service to determine placeholder values

* added translation of date-picker placeholder values

* added German translations of date-picker placeholder values

* fix lint warning: added missing comma

* fix lint warning: removed trailing spaces

* fixed broken tests

* fixed lint warning

* try to mock TranslateService correctly

* remove TranslateService mock

* removed imports

* fixed lint warnings

* fixed lint warnings

* fixed lint warning

* fixed lint warning

* fixed lint error

* fixed lint errors

* removed TestComponent

* added imports

* removed declarations

* fixed lint error

* fix lint error (invalid sorting)

* finally fixing lint error

* use translation pipe directly in template

* move translation of placeholders into HTML template

* remove TranslateService dependency
2025-02-06 15:05:36 -06:00
Tim Donohue
8184acc480 Merge pull request #3797 from toniprieto/translate-ca-9x
Update catalan translation
2025-02-06 10:49:00 -06:00
Tim Donohue
3d6af1f8c0 Merge pull request #3358 from 4Science/task/main/DURACOM-288
Provide a setting to use a different REST url during SSR execution
2025-02-06 10:07:17 -06:00
Pierre Lasou
f721028d81 Update fr.json5 2025-02-05 16:19:49 -05:00
Tim Donohue
542e2db930 Merge pull request #3955 from alexandrevryghem/w2p-126015_synchronize-standalone-imports-main
Synchronized standalone imports in custom theme
2025-02-05 15:00:32 -06:00
Sascha Szott
4d85639f31 fixed deprecated import of TransferState 2025-02-05 17:38:57 +01:00
Andrea Barbasso
fd2120904c [CST-18964] add tests 2025-02-05 17:05:18 +01:00
Andrea Barbasso
2225c2e428 [CST-18964] add matomo integration 2025-02-05 12:13:47 +01:00
Alexandre Vryghem
fddc4936e8 126015: Sync standalone imports in custom theme 2025-02-05 10:44:33 +01:00
Tim Donohue
0649342658 Merge pull request #3948 from toniprieto/avoid-retrieve-suggestions-if-disabled
Avoid retrieving user suggestions if Researcher profiles are disabled
2025-02-04 14:09:26 -06:00
Giuseppe Digilio
7acf79370b Merge branch 'main' into task/main/DURACOM-288
# Conflicts:
#	src/environments/environment.production.ts
#	src/environments/environment.test.ts
#	src/environments/environment.ts
2025-02-03 15:12:25 +01:00
Toni Prieto
72919cd867 Avoid retrieving user suggestions if Researcher profiles are disabled 2025-02-03 12:10:51 +01:00
kshepherd
073cd079e8 Merge pull request #3935 from tdonohue/add_reload_to_ssr_paths
Ensure `/reload/` (hard reload) path is included in SSR paths.
2025-02-03 12:10:47 +01:00
dependabot[bot]
21f4dc5fd9 Bump @types/lodash from 4.17.14 to 4.17.15
Bumps [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) from 4.17.14 to 4.17.15.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lodash)

---
updated-dependencies:
- dependency-name: "@types/lodash"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-03 02:34:13 +00:00
dependabot[bot]
65834fc86e Bump isbot from 5.1.21 to 5.1.22
Bumps [isbot](https://github.com/omrilotan/isbot) from 5.1.21 to 5.1.22.
- [Changelog](https://github.com/omrilotan/isbot/blob/main/CHANGELOG.md)
- [Commits](https://github.com/omrilotan/isbot/compare/v5.1.21...v5.1.22)

---
updated-dependencies:
- dependency-name: isbot
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-03 02:33:57 +00:00
Tim Donohue
83d24f8c21 Ensure "/reload/" (hard reload) path is included in SSR paths. 2025-01-31 14:34:35 -06:00
Giuseppe Digilio
ac3e87db05 [DURACOM-288] Add convention SSR REST environment variable 2025-01-31 19:59:33 +01:00
Tim Donohue
7e69b448d6 Merge pull request #3912 from minurmin/authPasswordDialog
Fix auth in UI with LDAP if password authentication is disabled
2025-01-30 16:11:56 -06:00
Giuseppe Digilio
bf2d12a10b Merge branch 'main' into task/main/DURACOM-288
# Conflicts:
#	config/config.example.yml
2025-01-30 20:44:26 +01:00
Giuseppe Digilio
04e5f59cdf [DURACOM-288] Change properties description 2025-01-30 20:42:20 +01:00
Giuseppe Digilio
e1fad603f0 [DURACOM-288] Enable URL replacement by default 2025-01-30 20:41:32 +01:00
AndreaBarbasso
bdac58d7fc Make reorder buttons keyboard accessible (#3372)
* [CST-15595] add keyboard drag and drop functionality

* [CST-15595] add aria live messages

* [CST-15595] fix e2e tests

* [CST-15595] fix unit tests

* [CST-15595] improve drag and drop keyboard functionality

* [CST-15595] add keydown.enter for keyboard drag and drop

---------

Co-authored-by: Andrea Barbasso <´andrea.barbasso@4science.com´>
2025-01-30 11:11:42 -06:00
Vincenzo Mecca
c8aae069f8 [DURACOM-288] Fixes undefined request in thumbnail 2025-01-30 15:42:58 +01:00
Tim Donohue
e867993bb8 Merge pull request #3920 from tdonohue/config_syntax
Fix YAML syntax in config.example.yml
2025-01-29 16:38:31 -06:00
Tim Donohue
cafe88a3b8 Fix syntax in config.example.yml 2025-01-29 15:52:39 -06:00
Tim Donohue
98832f2540 Merge pull request #3581 from alexandrevryghem/made-expandable-navbar-section-more-accessible
Made expandable navbar section more keyboard accessible
2025-01-29 13:56:31 -06:00
Giuseppe Digilio
6e7c0da68a [DURACOM-288] Add unit test to test SSR url replace 2025-01-29 20:06:02 +01:00
Giuseppe Digilio
45ee56fe8f [DURACOM-288] Add missing settings to config.example.yml 2025-01-29 20:05:51 +01:00
Giuseppe Digilio
cfba84ce31 [DURACOM-288] Refactoring configuration to transfer state 2025-01-29 20:05:29 +01:00
Yury Bondarenko
a7276b8a30 Add configuration to toggle replace/transfer 2025-01-29 20:04:09 +01:00
Giuseppe Digilio
587e1546dc [DURACOM-288] Additional test for thumbnail component 2025-01-29 19:58:52 +01:00
Giuseppe Digilio
ec9a1e22f7 [DURACOM-288] Provide a setting to use a different REST url during SSR execution 2025-01-29 19:54:34 +01:00
Alexandre Vryghem
82ed3aadff 116404: Prevent the opening from the modal using mouse interactions from automatically focussing on the first element 2025-01-29 18:17:13 +01:00
Andrea-Guevara
f262299382 Accessibility when selecting a search filter (#3385)
* Creation of a new method so that when a filter is selected a page reload message is announced to the user

* Correcting import formatting errors

* New attempt - Correcting import formatting errors

* New import fix

* New import fix

* Returning to the order of imports more like the original

* Correcting import order errors

* Resolving conflicts

* lint fixes

* Code refactoring

---------

Co-authored-by: root <root@TI-03.OHB.LOCAL>
Co-authored-by: nwoodward <woodward.nicholas@gmail.com>
2025-01-29 10:52:13 -06:00
Tim Donohue
69164837f0 Merge pull request #3915 from tdonohue/port_3818_to_main
[Port main] Changing metadata in a user profile without specifying a password brings up a success and an error panel
2025-01-29 06:49:13 -06:00
VictorDuranEscire
090dda28ad Changing metadata in a user profile without specifying a password brings up a success and an error panel (#3818)
* Agregar validador para mostrar mensaje de error solo si se escribe la contraseña actual

* Agregar validador para mostrar mensaje de error solo si se escribe la contraseña actual

* Set constant variable for valid current password in profile page
2025-01-28 17:22:31 -06:00
Miika Nurminen
83d86d7b68 Ensure that password authentication dialog is shown even if only ldap auth method is present 2025-01-29 01:07:37 +02:00
Tim Donohue
d70fa8f569 Merge pull request #3268 from atmire/w2p-117544_support-for-disabled-elements-for-screen-readers-9.0
support for disabled buttons for screen readers
2025-01-28 16:17:35 -06:00
Tim Donohue
df377804bb Merge pull request #3846 from alexandrevryghem/w2p-122357_browse-performance-fixes_contribute-main
Browse performance fixes
2025-01-28 16:08:01 -06:00
Tim Donohue
84feea9b30 Merge pull request #3909 from saschaszott/saschaszott-patch-8
removal of duplicate keys in en.json5 and de.json5
2025-01-28 09:10:25 -06:00
Sascha Szott
baf3886115 remove duplicate key 2025-01-28 11:31:33 +01:00
Sascha Szott
262723b0ca remove duplicate key 2025-01-28 11:27:36 +01:00
Alexandre Vryghem
196a8c21db Merge branch 'main' into w2p-108608_created-search-scope-selector_contribute-main 2025-01-28 01:35:05 +01:00
Jens Vannerum
920edef155 117544: use directive after latest main merge 2025-01-27 10:20:42 +01:00
dependabot[bot]
7142e66910 Bump @babel/runtime from 7.26.0 to 7.26.7
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.26.0 to 7.26.7.
- [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.26.7/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-27 02:47:50 +00:00
Alexandre Vryghem
6cf62a6c61 Merge branch 'main' into w2p-122357_browse-performance-fixes_contribute-main 2025-01-25 00:12:39 +01:00
Tim Donohue
b49e6fda9a Merge pull request #3862 from DSpace/dependabot/npm_and_yarn/mirador-3.4.3
Bump mirador from 3.4.2 to 3.4.3
2025-01-24 16:18:45 -06:00
Tim Donohue
89b72b9dc1 Merge pull request #3898 from tdonohue/bump_cross-spawn
Bump cross-spawn from 7.0.3 to 7.0.6
2025-01-24 12:51:49 -06:00
Tim Donohue
65e1b8ed60 Merge pull request #3212 from autavares-dev/fix-truncatable-part-keyboard-accessibility
Fix truncatable-part keyboard accessibility
2025-01-24 12:23:53 -06:00
Tim Donohue
2cebbd9b8f Bump cross-spawn from 7.0.3 to 7.0.6 2025-01-24 12:10:18 -06:00
Tim Donohue
c5603c7be2 Merge pull request #3413 from 4Science/task/main/CST-17153
Improve descriptive labels for show/hide x more buttons for related items (Item/Entity Homepage)
2025-01-24 12:05:16 -06:00
Andrea-Guevara
8cfc61c7f3 Improving the color contrast of home news content (#3880)
* Improving the color contrast of home news content

* Improved color contrast

* Adjusting font color changes

---------

Co-authored-by: root <root@TI-03.OHB.LOCAL>
2025-01-24 09:12:45 -06:00
Jens Vannerum
7a948f1e2a Merge remote-tracking branch 'origin/main' into w2p-117544_support-for-disabled-elements-for-screen-readers-9.0 2025-01-24 10:05:09 +01:00
Tim Donohue
d653c011fe Merge pull request #3859 from DSpace/dependabot/npm_and_yarn/jsonschema-1.5.0
Bump jsonschema from 1.4.1 to 1.5.0
2025-01-23 16:50:46 -06:00
Tim Donohue
8dec8e4315 Merge pull request #3854 from DSpace/dependabot/npm_and_yarn/express-4.21.2
Bump express from 4.21.1 to 4.21.2
2025-01-23 16:03:34 -06:00
Tim Donohue
f4bc87d327 Merge pull request #3863 from DSpace/dependabot/npm_and_yarn/core-js-3.40.0
Bump core-js from 3.39.0 to 3.40.0
2025-01-23 16:01:16 -06:00
Tim Donohue
03b4ce3e60 Merge pull request #3853 from DSpace/dependabot/npm_and_yarn/sass-d300448e1c
Bump sass from 1.83.1 to 1.83.4 in the sass group
2025-01-23 15:11:12 -06:00
Tim Donohue
87f05f428f Merge pull request #3850 from DSpace/dependabot/npm_and_yarn/postcss-3a92966d17
Bump postcss from 8.4.49 to 8.5.1 in the postcss group
2025-01-23 14:48:13 -06:00
FrancescoMolinaro
33a091d630 Prevent request with page size of 9999 (#3694)
* [DURACOM-304] Refactored item-bitstreams.component by removing page size of 9999

* [DURACOM-304] Refactored edit-bitstream-page.component by removing page size of 9999

* [DURACOM-304] Refactored scripts-select.component by using infinite scroll instead of page size 9999

* [DURACOM-304] Refactored dynamic-list.component.ts by removing page size of 9999

* [DURACOM-304] Refactored relationship-type-data.service.ts by removing page size of 9999

* [DURACOM-304] removed unneeded selectAll method (dynamic-lookup-relation-search-tab.component)

* [DURACOM-304] Refactored submission-section-cc-licenses.component.ts by removing page size of 9999

* [DURACOM-304] lint fix

* [DURACOM-304] test fix

* [DURACOM-304] fix accessibility issue on scripts-select

* [DURACOM-304] Refactor of bundle-data.service.ts by removing page size of 9999

* [DURACOM-304] other fix related to accessibility

* [DURACOM-304] lint fix

* [DURACOM-304] resolve conflicts

* [DURACOM-304] fix lint

* [DURACOM-304] add support for findAll method in dynamic-scrollable-dropdown.component.ts

* [DURACOM-304] refactor to use lazy data provider

* [DURACOM-304] improve loading logic for cc-licenses section and dynamic-list

* [DURACOM-304] refactor, fix dynamic-list.component loading

* [DURACOM-304] remove br

---------

Co-authored-by: Alisa Ismailati <alisa.ismailati@4science.com>
2025-01-23 12:26:36 -06:00
Tim Donohue
63c98740ba Merge pull request #3886 from tdonohue/port_3709_to_main
[Port main] Exclude search and browse from Angular SSR (#3709)
2025-01-23 11:46:02 -06:00
FrancescoMolinaro
17ecc592f3 Exclude search and browse from Angular SSR (#3709)
* [DURACOM-303] prevent possibly long-lasting search and browse calls in SSR

* [DURACOM-303] implement skeleton component for search results

* [DURACOM-303] add skeleton loader for search results and filters

* [DURACOM-303] minor restyle of skeleton for mobile

* [DURACOM-303] fix lint and tests

* [DURACOM-303] adapt tests

* [DURACOM-303] restyle skeleton, add filter badge skeleton

* [DURACOM-303] add loop for filters count

* [DURACOM-303] add grid layout, make SSR enabling configurable, minor restyle of skeletons

* [DURACOM-303] refactor param, add example of configuration

* [DURACOM-303] rename variable, minor code refactor

* [DURACOM-303] add override possibility with input

* [DURACOM-303] fix SSR check on template and on components missing the environment config. Add descriptive comment for skeleton component. Fix JS error on SSR.

* [DURACOM-303] refactor thumbnail's skeleton style
2025-01-23 10:16:12 -06:00
Tim Donohue
cb8a7cd402 Merge pull request #3884 from tdonohue/port_3876_to_main
[Port main] Fix redirect URLs of bitstreams with spaces in filename (new test ONLY)
2025-01-23 06:57:30 -06:00
dependabot[bot]
09d7a7f257 Bump sass from 1.83.1 to 1.83.4 in the sass group
Bumps the sass group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.83.1 to 1.83.4
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.83.1...1.83.4)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: sass
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-22 23:45:08 +00:00
Tim Donohue
c7ae1d63b5 Merge pull request #3833 from DSpace/dependabot/npm_and_yarn/webpack-2095da29ad
Bump webpack from 5.96.1 to 5.97.1 in the webpack group
2025-01-22 17:04:37 -06:00
Mohana Sarmiento
0475c0b2d9 Add unit test 2025-01-22 16:34:24 -06:00
Tim Donohue
a5fb2e6417 Merge pull request #3344 from 4Science/task/main/CST-15078
Add orcid icon with tooltip
2025-01-22 12:38:11 -06:00
Tim Donohue
f6269a95ee Merge pull request #3883 from tdonohue/port_3875_to_main
[Port main] Stabilize e2e tests that use admin sidebar menu
2025-01-22 10:21:33 -06:00
Tim Donohue
5c50faa319 Ensure admin menu e2e tests hover over admin menu before clicking on it. Attempt to stabilize tests which open this menu. 2025-01-22 09:38:38 -06:00
Tim Donohue
b08edf1ea4 Merge pull request #3682 from alanorth/angular-ssr-sitemap-3110
Restrict Angular SSR to paths in the sitemap
2025-01-21 16:09:31 -06:00
Tim Donohue
0a5d20e236 Merge pull request #3872 from saschaszott/saschaszott-patch-6
SCSS cleanup: remove duplicated line
2025-01-21 13:20:51 -06:00
Sascha Szott
5d04e44ff3 remove duplicated line 2025-01-21 18:29:10 +01:00
Andrea Barbasso
0a7307a515 [CST-15078] improve orcid logo image alt 2025-01-20 15:28:59 +01:00
Yana De Pauw
4f1013a20d Fix small issues 2025-01-20 13:27:36 +01:00
dependabot[bot]
b65f1ee5e3 Bump core-js from 3.39.0 to 3.40.0
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.39.0 to 3.40.0.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/commits/v3.40.0/packages/core-js)

---
updated-dependencies:
- dependency-name: core-js
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-17 22:58:18 +00:00
dependabot[bot]
6eabe425c4 Bump mirador from 3.4.2 to 3.4.3
Bumps [mirador](https://github.com/ProjectMirador/mirador) from 3.4.2 to 3.4.3.
- [Release notes](https://github.com/ProjectMirador/mirador/releases)
- [Commits](https://github.com/ProjectMirador/mirador/compare/v3.4.2...v3.4.3)

---
updated-dependencies:
- dependency-name: mirador
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-17 22:57:55 +00:00
dependabot[bot]
98fd9e7182 Bump jsonschema from 1.4.1 to 1.5.0
Bumps [jsonschema](https://github.com/tdegrunt/jsonschema) from 1.4.1 to 1.5.0.
- [Commits](https://github.com/tdegrunt/jsonschema/commits)

---
updated-dependencies:
- dependency-name: jsonschema
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-17 22:57:40 +00:00
dependabot[bot]
9708c06372 Bump express from 4.21.1 to 4.21.2
Bumps [express](https://github.com/expressjs/express) from 4.21.1 to 4.21.2.
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.2/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.21.1...4.21.2)

---
updated-dependencies:
- dependency-name: express
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-17 22:56:46 +00:00
dependabot[bot]
f02f8bab88 Bump postcss from 8.4.49 to 8.5.1 in the postcss group
Bumps the postcss group with 1 update: [postcss](https://github.com/postcss/postcss).


Updates `postcss` from 8.4.49 to 8.5.1
- [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.49...8.5.1)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: postcss
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-17 22:56:06 +00:00
dependabot[bot]
bb412469c7 Bump webpack from 5.96.1 to 5.97.1 in the webpack group
Bumps the webpack group with 1 update: [webpack](https://github.com/webpack/webpack).


Updates `webpack` from 5.96.1 to 5.97.1
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.96.1...v5.97.1)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: webpack
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-17 22:54:02 +00:00
Tim Donohue
7009cf32cc Merge pull request #3834 from DSpace/dependabot/npm_and_yarn/types/lodash-4.17.14
Bump @types/lodash from 4.17.13 to 4.17.14
2025-01-17 12:02:49 -06:00
Tim Donohue
cd2959603b Merge pull request #3835 from DSpace/dependabot/npm_and_yarn/isbot-5.1.21
Bump isbot from 5.1.17 to 5.1.21
2025-01-17 11:21:50 -06:00
Tim Donohue
3c47acf9f1 Merge pull request #3752 from DSpace/dependabot/npm_and_yarn/nanoid-3.3.8
Bump nanoid from 3.3.7 to 3.3.8
2025-01-17 10:42:21 -06:00
Tim Donohue
570d711e01 Merge pull request #3832 from DSpace/dependabot/npm_and_yarn/testing-905b8585bc
Bump ng-mocks from 14.13.1 to 14.13.2 in the testing group
2025-01-17 10:40:50 -06:00
Tim Donohue
b2a10e4ace Merge pull request #3845 from atmire/issue-3840-scoped-browse-bys
Fix issue where scoped browse by would not inititialze correct component
2025-01-17 09:11:51 -06:00
Alan Orth
5b3b3bfb9c Restrict SSR to paths in the sitemap
Because Angular SSR is not very efficient, after discussion with
the Google Scholar team we realized a compromise would be to only
use SSR for pages in the DSpace sitemap (and the home page).
2025-01-17 15:30:43 +03:00
Alexandre Vryghem
89281d7c99 Merge branch 'w2p-122357_prevent-request-urls-from-being-fired-multiple-times-7.4' into w2p-122357_browse-performance-fixes_contribute-main 2025-01-17 00:52:43 +01:00
Alexandre Vryghem
c3e635bff1 Merge branch 'refactor-comcol-pages_contribute-7.6' into w2p-122357_browse-performance-fixes_contribute-main 2025-01-17 00:47:41 +01:00
Jens Vannerum
32fae27c7a 124382: fix issue where scoped browse by would not init correct components 2025-01-16 12:28:48 +01:00
Tim Donohue
76ae286f2a Merge pull request #3783 from DSpace/dependabot/npm_and_yarn/mirador-3.4.2
Bump mirador from 3.3.0 to 3.4.2
2025-01-15 16:45:48 -06:00
Tim Donohue
0e29c09b7a Merge pull request #3663 from DSpace/dependabot/npm_and_yarn/eslint-6ac3f070f3
Bump eslint-plugin-jsonc from 2.16.0 to 2.18.2 in the eslint group across 1 directory
2025-01-15 15:55:42 -06:00
Tim Donohue
6cf05c1403 Merge pull request #3798 from DSpace/dependabot/npm_and_yarn/sass-fc80c07a3c
Bump sass from 1.80.6 to 1.83.1 in the sass group across 1 directory
2025-01-15 15:52:17 -06:00
Tim Donohue
09c11f8dbc Merge pull request #3782 from DSpace/dependabot/npm_and_yarn/fortawesome/fontawesome-free-6.7.2
Bump @fortawesome/fontawesome-free from 6.6.0 to 6.7.2
2025-01-15 15:11:29 -06:00
Tim Donohue
c20bf58b4b Merge pull request #3842 from tdonohue/test_stabilization
Attempt to stabilize a few randomly failing e2e tests
2025-01-15 12:04:40 -06:00
Tim Donohue
7feb9fc617 Ensure Item Edit page tab is visible before & after clicking it. 2025-01-15 10:37:30 -06:00
Tim Donohue
5623cc9221 Ensure Admin sidebar link is visible before clicking links 2025-01-15 10:30:46 -06:00
Tim Donohue
6dd61ca25e Merge pull request #3734 from DSpace/dependabot/npm_and_yarn/axios-1.7.9
Bump axios from 1.7.7 to 1.7.9
2025-01-14 17:01:24 -06:00
dependabot[bot]
f067eb9aae Bump eslint-plugin-jsonc in the eslint group across 1 directory
Bumps the eslint group with 1 update in the / directory: [eslint-plugin-jsonc](https://github.com/ota-meshi/eslint-plugin-jsonc).


Updates `eslint-plugin-jsonc` from 2.16.0 to 2.18.2
- [Release notes](https://github.com/ota-meshi/eslint-plugin-jsonc/releases)
- [Changelog](https://github.com/ota-meshi/eslint-plugin-jsonc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ota-meshi/eslint-plugin-jsonc/compare/v2.16.0...v2.18.2)

---
updated-dependencies:
- dependency-name: eslint-plugin-jsonc
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 03:08:41 +00:00
dependabot[bot]
d8a73c362c Bump isbot from 5.1.17 to 5.1.21
Bumps [isbot](https://github.com/omrilotan/isbot) from 5.1.17 to 5.1.21.
- [Changelog](https://github.com/omrilotan/isbot/blob/main/CHANGELOG.md)
- [Commits](https://github.com/omrilotan/isbot/compare/v5.1.17...v5.1.21)

---
updated-dependencies:
- dependency-name: isbot
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 03:08:38 +00:00
dependabot[bot]
e02326510f Bump @types/lodash from 4.17.13 to 4.17.14
Bumps [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) from 4.17.13 to 4.17.14.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lodash)

---
updated-dependencies:
- dependency-name: "@types/lodash"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 03:08:15 +00:00
dependabot[bot]
096c5bdedd Bump ng-mocks from 14.13.1 to 14.13.2 in the testing group
Bumps the testing group with 1 update: [ng-mocks](https://github.com/help-me-mom/ng-mocks).


Updates `ng-mocks` from 14.13.1 to 14.13.2
- [Release notes](https://github.com/help-me-mom/ng-mocks/releases)
- [Changelog](https://github.com/help-me-mom/ng-mocks/blob/master/CHANGELOG.md)
- [Commits](https://github.com/help-me-mom/ng-mocks/compare/v14.13.1...v14.13.2)

---
updated-dependencies:
- dependency-name: ng-mocks
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: testing
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 03:07:30 +00:00
dependabot[bot]
ccdf5498d8 Bump sass from 1.80.6 to 1.83.1 in the sass group across 1 directory
Bumps the sass group with 1 update in the / directory: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.80.6 to 1.83.1
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.80.6...1.83.1)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: sass
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 03:07:14 +00:00
VictorHugoDuranS
c5f07daab7 Fix for User profile (/profile): only 20 group memberships shown instead of all (#3105)
* Add - groups paginated on profile page

* Add - groups paginated on profile page

* Add - groups paginated on profile page

* Add - groups paginated on profile page

* Fix UPDATE - Add pagination message error and loader

* Update BRANCH

* Fix - LINT ERRORS

* Fix: Error declaring variable for group pagination

* Fix: Remove unnecessary translations for paging groups

* Fix: Lint erros

* Fix: Remove unnecessary translations

---------

Co-authored-by: VictorDuranEscire <victor@escire.lat>
2025-01-10 15:35:41 -06:00
VictorHugoDuranS
f52aac879a Change - Metadata field selector, add infinite scroll for data paginated (#3096)
* Change - Metadata field selector add infinite scroll for data paginated

* Update change on new BRANCH

* Fix - LINT ERRORS

* Fix - LINT ERRORS
2025-01-10 15:17:08 -06:00
Tim Donohue
08800f4469 Merge pull request #3608 from toniprieto/allow-free-text-edition
Add button to allow free-text editing in the dropdown field of Edit Item
2025-01-10 13:21:09 -06:00
Tim Donohue
952611a3d3 Merge pull request #3814 from toniprieto/translate-es-9x
Update spanish translation
2025-01-09 16:27:42 -06:00
Toni Prieto
050cde3735 Update es.json5 2025-01-08 22:54:11 +01:00
Tim Donohue
272cb656cd Merge pull request #3631 from DSpace/dependabot/npm_and_yarn/orejime-2.3.1
Bump orejime from 2.3.0 to 2.3.1
2025-01-07 17:06:18 -06:00
Tim Donohue
cf87b905b6 Merge pull request #3662 from DSpace/dependabot/npm_and_yarn/postcss-65f8102df2
Bump postcss from 8.4.47 to 8.4.49 in the postcss group across 1 directory
2025-01-07 16:16:57 -06:00
Tim Donohue
c1fb26fe26 Merge pull request #3781 from DSpace/dependabot/npm_and_yarn/testing-4e904f02fc
Bump cypress from 13.16.0 to 13.17.0 in the testing group across 1 directory
2025-01-07 16:03:09 -06:00
Koen Pauwels
8a62deb90b Reduce browse definition requests on simple item page (#3701)
* 121561 Reduce the number of browse definition requests on Item pages by reusing the navbar request for all browse indexes

* Fix test issues.

---------

Co-authored-by: Koen Pauwels <koen.pauwels@atmire.com>
2025-01-07 15:23:48 -06:00
Tim Donohue
f24e53f1ea Merge pull request #3719 from saschaszott/saschaszott-patch-5
Remove nested span elements with duplicate content of parent elements
2025-01-07 09:08:35 -06:00
Tim Donohue
b1c507807a Merge pull request #3632 from DSpace/dependabot/npm_and_yarn/express-static-gzip-2.2.0
Bump express-static-gzip from 2.1.8 to 2.2.0
2025-01-06 16:59:43 -06:00
Tim Donohue
5bd8795262 Merge pull request #3142 from atmire/w2p-115284_add-support-for-non-repeatable-relationships_dspace-8
Add support for non repeatable relationships
2025-01-06 11:58:04 -06:00
Tim Donohue
53f46040d3 Merge pull request #3772 from saschaszott/saschaszott-patch-7
add German translation of process view related keys
2025-01-06 10:48:46 -06:00
Tim Donohue
2c22517090 Merge pull request #3192 from Neki-IT/SpanishTranslationKeys
Spanish translation keys
2025-01-06 09:29:30 -06:00
Tim Donohue
d8246f4550 Merge pull request #3792 from alanorth/node-version-readme
README.md: update Node.js and NPM versions
2025-01-06 09:16:07 -06:00
Yana De Pauw
cb4a7b31f0 Add missing provider tests 2025-01-06 14:38:19 +01:00
root
fda9330221 Advanced search translation keys 2025-01-06 08:21:04 -03:00
dependabot[bot]
9d4542c2a4 Bump cypress in the testing group across 1 directory
Bumps the testing group with 1 update in the / directory: [cypress](https://github.com/cypress-io/cypress).


Updates `cypress` from 13.16.0 to 13.17.0
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/cypress/compare/v13.16.0...v13.17.0)

---
updated-dependencies:
- dependency-name: cypress
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: testing
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-06 02:38:49 +00:00
dependabot[bot]
c1a1fe7443 Bump postcss in the postcss group across 1 directory
Bumps the postcss group with 1 update in the / directory: [postcss](https://github.com/postcss/postcss).


Updates `postcss` from 8.4.47 to 8.4.49
- [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.47...8.4.49)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: postcss
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-06 02:38:29 +00:00
Toni Prieto
e04cdef429 Update ca.json5 2025-01-03 18:02:49 +01:00
root
01cb2c7429 Fixing space error and adding new translation keys 2025-01-03 10:14:47 -03:00
Alan Orth
d1d9f2f7f9 README.md: update Node.js and NPM versions
Angular 17.x needs Node.js 18.x or 20.x, which come with NPM v10.

See: https://angular.dev/reference/versions
See: https://nodejs.org/en/about/previous-releases#looking-for-latest-release-of-a-version-branch
2025-01-03 10:25:37 +03:00
Alexandre Vryghem
2cde0d3f21 Fixed dropdown/lookup & lookup-name fields being reset when hitting enter (#3724) 2025-01-03 09:09:44 +03:00
Alan Orth
08f48d8204 Merge pull request #3737 from TexasDigitalLibrary/fix-typo-browse-metadata 2025-01-03 09:06:46 +03:00
Alan Orth
af7c095af0 Merge pull request #3718 from saschaszott/saschaszott-patch-4 2025-01-03 09:00:48 +03:00
Yana De Pauw
b8bb3ff815 Merge branch 'w2p-121550_refactor-menu-resolvers-7.6_option-1' into refactor-menu-resolvers-7.6_sketch-branch 2025-01-02 17:42:51 +01:00
Andrea-Guevara
fea109117f Merge branch 'main' into SpanishTranslationKeys 2025-01-02 11:02:58 -03:00
Yana De Pauw
4729ae950d Fix merge issues 2025-01-02 14:17:06 +01:00
Yana De Pauw
1c1bcc704a Merge branch 'refactor-menu-resolvers-7.6_basic-providers-tests' into refactor-menu-resolvers-7.6_sketch-branch 2025-01-02 11:14:56 +01:00
Alexandre Vryghem
d85d5fbd71 121550: Use IDs on the routes in order to assign AbstractRouteContextMenuProviders 2025-01-02 10:29:30 +01:00
Gantner, Florian Klaus
4dcc7c282d translation keys for datacite project import
https://github.com/DSpace/DSpace/issues/9636
2024-12-28 12:58:18 +01:00
Gantner, Florian Klaus
d61cb33f9a change search filter isOpenByDefault autoserialization
https://github.com/DSpace/DSpace/issues/9404
2024-12-27 13:14:30 +01:00
dependabot[bot]
741cf66518 Bump mirador from 3.3.0 to 3.4.2
Bumps [mirador](https://github.com/ProjectMirador/mirador) from 3.3.0 to 3.4.2.
- [Release notes](https://github.com/ProjectMirador/mirador/releases)
- [Commits](https://github.com/ProjectMirador/mirador/compare/v3.3.0...v3.4.2)

---
updated-dependencies:
- dependency-name: mirador
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-23 03:04:05 +00:00
dependabot[bot]
b583e17880 Bump @fortawesome/fontawesome-free from 6.6.0 to 6.7.2
Bumps [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) from 6.6.0 to 6.7.2.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/6.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/6.6.0...6.7.2)

---
updated-dependencies:
- dependency-name: "@fortawesome/fontawesome-free"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-23 03:03:54 +00:00
Sascha Szott
85a120da62 add German translation of process view related keys 2024-12-20 14:28:22 +01:00
Tim Donohue
6ac922971d Merge pull request #3679 from 4Science/task/main/DURACOM-297
#3678, #3217 - Fix ordering and changing values of repeatable inputs in submission form
2024-12-19 16:25:35 -06:00
Tim Donohue
225a2b6736 Merge pull request #3367 from Andrea-Guevara/AccessibilityInVocabularyTreeview
Accessibility in vocabulary treeview
2024-12-19 12:08:37 -06:00
Tim Donohue
aba988a6a4 Merge pull request #3322 from Andrea-Guevara/TargetUrl
fix #3241: Configuring the URI link target
2024-12-19 11:44:23 -06:00
Tim Donohue
5b3da0236f Merge pull request #2972 from pcg-kk/issues/2819/linkName-in-the-link-decorator-doesnt-assign-to-the-value-on-the-correct-property
fix: linkName from decorator assign value to the correct property
2024-12-19 11:16:46 -06:00
Nathan Buckingham
d13d8860f2 RSS feed from search results (Angular) (#3227)
* Port rss to 7.6 and upgrades to search functionality

* 116466: add missing imports

* 116466: fix tests and lint issues

* 116466: rss component use activated route data

* 116466: lint fixes

* 116466: More Lint fixes

---------

Co-authored-by: Nathan Buckingham <nathan.buckingham@atmire.com>
2024-12-19 11:03:52 -06:00
Alan Orth
0ade76a99c Merge pull request #3753 from atmire/w2p-121787_Investigate-internal-server-error-on-browse-page-experiment
Get rid of unnecessary and failing REST requests when navigating between different browse indexes
2024-12-19 15:57:21 +03:00
Koen Pauwels
a105bcd6f4 121787: Get rid of multiple unnecessary requests on browse by pages 2024-12-19 11:14:46 +01:00
Tim Donohue
b454e49553 Merge pull request #3607 from DSpace/dependabot/npm_and_yarn/core-js-3.39.0
Bump core-js from 3.38.1 to 3.39.0
2024-12-18 16:51:43 -06:00
Andrea-Guevara
f16015abc2 More accessible file download link for users who use a screen reader (#3264)
* More accessible file download link for users who use a screen reader

* Refactoring implementation - More accessible file download link for users who use a screen reader

* Fixing import error

* Solving the spaces error

* Solving the spaces error

* Solving the spaces error in file pt-BR.json5

---------

Co-authored-by: andreaNeki <root@TI-03.OHB.LOCAL>
2024-12-18 14:18:24 -06:00
Giuseppe
253b2e84d1 Fix issue with submission sections visibility (#3276)
* Removing position-fixed bootstrap class so that navbar links are available again

(cherry picked from commit 351abaa5c2)

* A new approach so that the elements of the ds-file-dropzone-no-uploader component don't overlap the navbar and make it inaccessible

(cherry picked from commit 2c259f5ae9)

* [DURACOM-291] fix submission section visibility in order to rely on the configured section scope

* Removing position-fixed bootstrap class so that navbar links are available again

(cherry picked from commit 351abaa5c2)

* A new approach so that the elements of the ds-file-dropzone-no-uploader component don't overlap the navbar and make it inaccessible

(cherry picked from commit 2c259f5ae9)

---------

Co-authored-by: root <root@TI-03.OHB.LOCAL>
2024-12-18 14:13:44 -06:00
Tim Donohue
05c74123a5 Merge pull request #3224 from 4Science/task/main/CST-15590
Close user profile menu after menu entry is selected
2024-12-18 12:08:00 -06:00
Tim Donohue
f339d8bf37 Merge pull request #3464 from atmire/item-edit-bitstreams-table-main
Edit Item, Bitstreams tab: Accessibility improvements
2024-12-17 16:59:22 -06:00
Tim Donohue
c1aabf6add Merge pull request #3720 from alexandrevryghem/w2p-117573_remove-observable-function-calls-from-template_contribute-main
Embed the community/collection on the edit EPerson page
2024-12-17 16:09:07 -06:00
Tim Donohue
5a7190203a Merge pull request #3754 from tdonohue/update_docker_to_ghcr
[GitHub Actions][Docker] Update Docker scripts & GitHub Actions to use ghcr.io instead of docker.io
2024-12-16 16:03:59 -06:00
Tim Donohue
dab6b1c12e Login to GHCR in order to have access to private Docker images for e2e tests. 2024-12-16 15:09:13 -06:00
Tim Donohue
bad57def74 Update GitHub Actions for Docker & normal build to use GitHub Container Registry 2024-12-16 14:15:52 -06:00
Tim Donohue
0d516bfe9c Allow for other Docker registries to be used with all Docker compose scripts 2024-12-16 14:12:01 -06:00
Tim Donohue
4575c3d7af Use fully qualified image names in Dockerfiles. Minor syntax fixes to ENV variables 2024-12-16 14:06:50 -06:00
dependabot[bot]
494771c0da Bump nanoid from 3.3.7 to 3.3.8
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.7 to 3.3.8.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 13:34:09 +00:00
Alexandre Vryghem
44d2450543 121550: Fixed dso edit menu crashing when dso isn't resolved yet 2024-12-13 11:03:36 +01:00
root
8572bfb1b1 Addition of unit tests for the getLinkAttributes() method 2024-12-11 13:07:48 -03:00
Andreas Awouters
cc70eaa82e Merge branch 'item-edit-bitstreams-table-7.6' into item-edit-bitstreams-table-main 2024-12-11 12:02:55 +01:00
Tim Donohue
ac00f88fe0 Merge pull request #3065 from alexandrevryghem/new-themed-components_contribute-main
Made AdminSearchPageComponent themeable
2024-12-10 09:57:31 -06:00
nwoodward
c67dc4d8e4 fixed typo in descrption 2024-12-09 11:27:00 -06:00
Agustina Martinez
f2d6f774d3 #10053: Add support for PCI Endorsement workflow 2024-12-09 16:28:17 +00:00
dependabot[bot]
1a48a6c853 Bump axios from 1.7.7 to 1.7.9
Bumps [axios](https://github.com/axios/axios) from 1.7.7 to 1.7.9.
- [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/v1.7.7...v1.7.9)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-09 02:56:11 +00:00
Alexandre Vryghem
7ca4d8f2b1 fix: ensure findListByHref correctly calls addDependency 2024-12-07 02:21:41 +01:00
Alexandre Vryghem
e4b2ebe7aa fix: replace 'any' with specific types 2024-12-06 23:29:21 +01:00
Alexandre Vryghem
2fb746f6e6 Merge branch 'main' into linkName-in-the-link-decorator-doesnt-assign-to-the-value-on-the-correct-property
# Conflicts:
#	src/app/core/data/base/base-data.service.spec.ts
2024-12-06 23:29:12 +01:00
Alexandre Vryghem
11626e22eb Merge branch 'w2p-117573_remove-observable-function-calls-from-template-7.6'
# Conflicts:
#	src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts
#	src/app/shared/object-detail/my-dspace-result-detail-element/item-detail-preview/item-detail-preview.component.ts
2024-12-06 18:36:11 +01:00
Sascha Szott
dbd67f056e fix indentation 2024-12-06 18:12:44 +01:00
Sascha Szott
acb7c9bd33 remove nested span element 2024-12-06 18:09:02 +01:00
Sascha Szott
97b5e0cc92 fix nested span element 2024-12-06 18:05:07 +01:00
Sascha Szott
e9a28c6d3d fix nested span element 2024-12-06 18:02:43 +01:00
Sascha Szott
2e174cd9e6 fix nested span element 2024-12-06 18:01:37 +01:00
Sascha Szott
15d3f257b3 fix nested span element 2024-12-06 18:00:47 +01:00
Sascha Szott
8509096c32 fix nested span element 2024-12-06 17:59:56 +01:00
Sascha Szott
84878ede67 fix nested span element 2024-12-06 17:56:50 +01:00
Sascha Szott
394ecea118 fix nested span element in templates 2024-12-06 17:47:14 +01:00
Sascha Szott
71de4b600b fix value of selector in component annotation 2024-12-06 17:34:37 +01:00
Tim Donohue
dcea3baf46 Merge pull request #3677 from alexandrevryghem/w2p-120109_fix-findByHref-and-findListByHref-skipping-their-response
Fix infinite loading on item pages and optimize menu resolver usage
2024-12-05 14:49:05 -06:00
Alexandre Vryghem
446280b59a Fixed search facet deadlock
Also fixed minor issue in MetadataService, but this doesn't cause any issues in the current code
2024-12-05 21:37:45 +01:00
Tim Donohue
37bd26ed1e Merge pull request #3693 from alexandrevryghem/w2p-121534_removed-metadata-export-search-request-for-non-admins-on-search_contribute-main
Removed unauthorized metadata-export-search request on search page
2024-12-03 12:15:45 -06:00
Alan Orth
0b3cb7906c Merge branch 'main' into w2p-121534_removed-metadata-export-search-request-for-non-admins-on-search_contribute-main 2024-12-03 12:13:19 +03:00
Tim Donohue
3ca56c3c28 Merge pull request #3689 from DSpace/dependabot/npm_and_yarn/testing-8ac0a25ce2
Bump cypress from 13.15.1 to 13.16.0 in the testing group across 1 directory
2024-12-02 08:56:41 -06:00
dependabot[bot]
9f74d45e16 Bump cypress in the testing group across 1 directory
Bumps the testing group with 1 update in the / directory: [cypress](https://github.com/cypress-io/cypress).


Updates `cypress` from 13.15.1 to 13.16.0
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/cypress/compare/v13.15.1...v13.16.0)

---
updated-dependencies:
- dependency-name: cypress
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: testing
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-02 02:40:45 +00:00
Giuseppe
67c253bbbb Merge branch 'DSpace:main' into task/main/CST-15590 2024-11-29 13:12:25 +01:00
Alan Orth
05508b63ab Merge pull request #3308 from 4Science/task/main/DURACOM-296 2024-11-28 10:56:47 +03:00
kshepherd
be2662fb92 Merge pull request #3181 from 4Science/task/main/CST-14903
Orcid Authorization / Synchronization Page Fixes
2024-11-27 15:02:38 +01:00
Alexandre Vryghem
feceb21d9c Merge remote-tracking branch 'alex/fix-scope-issues-on-search-form_contribute-7.6' into w2p-121534_removed-metadata-export-search-request-for-non-admins-on-search_contribute-main 2024-11-25 22:31:24 +01:00
Alexandre Vryghem
2011aee21e Merge remote-tracking branch 'alex/w2p-121534_removed-metadata-export-search-request-for-non-admins-on-search_contribute-7.6' into w2p-121534_removed-metadata-export-search-request-for-non-admins-on-search_contribute-main
# Conflicts:
#	src/app/shared/search/search-export-csv/search-export-csv.component.spec.ts
#	src/app/shared/search/search-export-csv/search-export-csv.component.ts
2024-11-25 22:31:04 +01:00
Alexandre Vryghem
70b855e785 121534: Removed unauthorized metadata-export-search request on search page for non-admins 2024-11-25 22:20:36 +01:00
Yury Bondarenko
b2715501b0 Update tests to match 2024-11-25 16:49:16 +01:00
Yury Bondarenko
7cd13f692e Merge remote-tracking branch 'contrib/refactor-menu-resolvers-7.6_basic-providers-tests' into refactor-menu-resolvers-7.6_sketch-branch 2024-11-25 16:38:46 +01:00
Alexandre Vryghem
e4daf2b825 120256: Ensure searchOptions$ is a SearchOptions and not a plain object 2024-11-25 15:17:34 +01:00
Tim Donohue
256d71cc1e Merge pull request #3683 from tdonohue/config_fixes
Fix incorrect example in `config.example.yml`
2024-11-22 11:16:48 -06:00
Tim Donohue
138c007f28 Fix incorrect example. The setting category is called "ssr" and not "universal" 2024-11-22 09:42:14 -06:00
Andrea Barbasso
1c9272107c [DURACOM-297] fix changing values in submission form after ordering 2024-11-21 11:11:53 +01:00
Alexandre Vryghem
5c9f494f76 120109: Updated the route configuration to only resolve the dsoEditMenuResolver on pages who use the DsoEditMenuComponent 2024-11-20 14:46:44 +01:00
Alexandre Vryghem
decacec404 120109: Fixed "no elements in sequence" sometimes being thrown on the item bitstream & relationship tabs 2024-11-20 10:55:41 +01:00
Alexandre Vryghem
0f4d71eb58 120109: Fixed BaseDataService not emitting when the request is too fast and the ResponsePending are not emitted 2024-11-20 10:55:41 +01:00
Tim Donohue
757d23e74d Merge pull request #3671 from 4Science/task/main/DURACOM-305
Fixes the display of the System Wide Alert
2024-11-18 11:01:08 -06:00
Alisa Ismailati
628ec2b6ba [DURACOM-305] Fixes the deserialization of the SystemWideAlert 2024-11-18 15:19:04 +01:00
Tim Donohue
bfefc4139e Merge pull request #3656 from 4Science/task/main/DURACOM-300
#3655 - Fixes Spacing Issue Between Email Label and Email Address on Profile Setup Form
2024-11-15 16:34:23 -06:00
Yana De Pauw
a105131b2b Finalise menu refactor, add typedocs and tests 2024-11-15 18:25:37 +01:00
Simone Ramundi
2b104183f7 [DURACOM-300] Fixed space in registration form 2024-11-15 15:33:23 +01:00
Tim Donohue
aec402e77f Merge pull request #3649 from pilasou/pilasou-translations-fr
French translations for subscriptions feature
2024-11-13 13:51:16 -06:00
Tim Donohue
0417e1de59 Merge pull request #3225 from 4Science/task/main/CST-15591
Fixed headings by their rank
2024-11-13 11:26:02 -06:00
Pierre Lasou
2c16162948 French translations for subscriptions feature
Includes all french labels for subcriptions, plus 2 or 3 other missing things.
2024-11-13 10:19:02 -05:00
Tim Donohue
e267244caa Merge pull request #3646 from alexandrevryghem/w2p-120150_fixed-authorization-tab-not-loading-in-dev-mode
Fixed authorization tab not loading in dev mode
2024-11-12 09:58:01 -06:00
Alexandre Vryghem
c062d95354 120150: Fixed authorization tab not loading in dev mode 2024-11-12 11:33:45 +01:00
Tim Donohue
f6d8446c75 Merge pull request #3585 from alexandrevryghem/w2p-117573_remove-observable-function-calls_contribute-main
Removed observable function calls from template (part 1)
2024-11-11 16:18:46 -06:00
Tim Donohue
3fda97f573 Merge pull request #3644 from pilasou/pilasou-translations-fr
French translations for COAR Notify  LDN Service
2024-11-11 14:23:46 -06:00
Pierre Lasou
60dfe056dd Fixes lint error Trailing spaces 2024-11-11 14:27:41 -05:00
Pierre Lasou
20263073c6 French translations for COAR Notify LDN Service
Contains all translations in french for new DSpace 8 COAR Notify module.
2024-11-11 13:57:43 -05:00
Tim Donohue
a0973090ee Merge pull request #3222 from dataquest-dev/dtq/update-cs-messages
[WIP] Updated `cs` messages following the lindat v5 and clarin-dspace v7 instance
2024-11-11 09:31:10 -06:00
milanmajchrak
4b6e4c60c2 Merge branch 'main' into dtq/update-cs-messages 2024-11-11 10:01:40 +01:00
dependabot[bot]
19da7bf453 Bump express-static-gzip from 2.1.8 to 2.2.0
Bumps [express-static-gzip](https://github.com/tkoenig89/express-static-gzip) from 2.1.8 to 2.2.0.
- [Release notes](https://github.com/tkoenig89/express-static-gzip/releases)
- [Commits](https://github.com/tkoenig89/express-static-gzip/compare/v2.1.8...v2.2.0)

---
updated-dependencies:
- dependency-name: express-static-gzip
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-11 02:18:52 +00:00
dependabot[bot]
fb55a04f70 Bump orejime from 2.3.0 to 2.3.1
Bumps [orejime](https://github.com/empreinte-digitale/orejime) from 2.3.0 to 2.3.1.
- [Changelog](https://github.com/empreinte-digitale/orejime/blob/master/CHANGELOG.md)
- [Commits](https://github.com/empreinte-digitale/orejime/commits)

---
updated-dependencies:
- dependency-name: orejime
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-11 02:18:07 +00:00
Tim Donohue
10ccf32435 Merge pull request #3603 from DSpace/dependabot/npm_and_yarn/sass-8323b2791b
Bump sass from 1.80.4 to 1.80.6 in the sass group
2024-11-08 16:03:04 -06:00
dependabot[bot]
bc7c086ca6 Bump core-js from 3.38.1 to 3.39.0
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.38.1 to 3.39.0.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/commits/v3.39.0/packages/core-js)

---
updated-dependencies:
- dependency-name: core-js
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-08 20:33:00 +00:00
Tim Donohue
0f850f3327 Merge pull request #3606 from DSpace/dependabot/npm_and_yarn/compression-1.7.5
Bump compression from 1.7.4 to 1.7.5
2024-11-08 14:31:54 -06:00
dependabot[bot]
a81799fd07 Bump sass from 1.80.4 to 1.80.6 in the sass group
Bumps the sass group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.80.4 to 1.80.6
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.80.4...1.80.6)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: sass
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-08 20:29:10 +00:00
Tim Donohue
89e458a9f6 Merge pull request #3604 from DSpace/dependabot/npm_and_yarn/webpack-835be9230a
Bump webpack from 5.95.0 to 5.96.1 in the webpack group
2024-11-08 14:27:56 -06:00
dependabot[bot]
821b8ee3f0 Bump webpack from 5.95.0 to 5.96.1 in the webpack group
Bumps the webpack group with 1 update: [webpack](https://github.com/webpack/webpack).


Updates `webpack` from 5.95.0 to 5.96.1
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.95.0...v5.96.1)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: webpack
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-08 19:24:18 +00:00
Tim Donohue
e4cdd73294 Merge pull request #3199 from 4Science/task/main/CST-15593
[#2718] Migrate cookie consent from Klaro to Orejime
2024-11-08 13:21:09 -06:00
milanmajchrak
d819cf4396 Updated supervised by messages following NTK suggestions 2024-11-08 15:24:06 +01:00
Tim Donohue
2c7e30ce21 Merge pull request #3620 from saschaszott/patch-31
class `Metadata`: rename parameter names in JSDoc from `mapOrMaps` to `mdMapOrMaps`
2024-11-07 14:13:07 -06:00
Tim Donohue
1ccdec290a Merge pull request #3619 from saschaszott/patch-30
BitstreamAuthorizationsComponent: update selector and comment to correctly describe component's purpose
2024-11-07 14:12:11 -06:00
Sascha Szott
65d17e4784 rename parameter name in the function JSDoc from 'mapOrMaps' to 'mdMapOrMaps' 2024-11-07 20:09:05 +01:00
Sascha Szott
752951ce3b fix invalid selector 2024-11-07 20:02:39 +01:00
Sascha Szott
33dddc697f update comment to correctly describe component's purpose 2024-11-07 19:58:01 +01:00
pcg-kk
752eb4c57b fix: resolve issue with unit tests 2024-11-06 21:29:34 +01:00
Alexandre Vryghem
ded0079f24 119915: Restored functionality to hide the research profile section on the profile page 2024-11-06 14:08:42 +01:00
Toni Prieto
67f9623cf4 Allow free-text editing for hierarchical vocabulary fields as well 2024-11-05 22:01:05 +01:00
Tim Donohue
25d8f6e323 Merge pull request #3590 from pilasou/pilasou-translations-fr
Complete tag translations in french for ORCID and Researcher Profile
2024-11-04 14:22:31 -06:00
Tim Donohue
da2a9d3389 Merge pull request #3605 from DSpace/dependabot/npm_and_yarn/types/lodash-4.17.13
Bump @types/lodash from 4.17.12 to 4.17.13
2024-11-04 09:04:25 -06:00
milanmajchrak
1aef6ce1d6 Updated messages for the 'supervised' and 'claim' sentenses 2024-11-04 14:37:04 +01:00
Andrea Barbasso
5bd99a1216 [CST-15593] fix authenticated orejime cookie encoding 2024-11-04 12:40:45 +01:00
dependabot[bot]
1645acece4 Bump compression from 1.7.4 to 1.7.5
Bumps [compression](https://github.com/expressjs/compression) from 1.7.4 to 1.7.5.
- [Release notes](https://github.com/expressjs/compression/releases)
- [Changelog](https://github.com/expressjs/compression/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/compression/compare/1.7.4...1.7.5)

---
updated-dependencies:
- dependency-name: compression
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 03:03:36 +00:00
dependabot[bot]
6b521e7505 Bump @types/lodash from 4.17.12 to 4.17.13
Bumps [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) from 4.17.12 to 4.17.13.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lodash)

---
updated-dependencies:
- dependency-name: "@types/lodash"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 03:02:30 +00:00
Ray Lee
449c092bf9 Add support for SAML authentication. 2024-11-01 14:41:34 -04:00
Pierre Lasou
23dd7903ba Correction of 2 lint errors due to spacing. 2024-11-01 14:02:00 -04:00
Pierre Lasou
fde2db85e7 Correct small alignment errors 2024-11-01 11:35:05 -04:00
Tim Donohue
4fd3df4f8a Merge pull request #3272 from Neki-IT/AccessibilityInNewUserRegistration
Improving accessibility on the new user registration page
2024-11-01 09:37:32 -05:00
Alexandre Vryghem
33bdb69dca 119915: Extracted the authority/controlled vocabulary logic out of DsoEditMetadataValueComponent
Also:
- Converted the code to the standalone structure
- Made DsoEditMetadataValueFieldLoaderComponent extend AbstractComponentLoaderComponent
2024-10-31 22:15:55 +01:00
Toni Prieto
28c8550ef5 Add button to enable free-text editing in dropdown fields during item edition and fix error when clicking "Clear selection" option 2024-10-31 21:31:27 +01:00
andreaNeki
009da08177 Adjusting spaces in ts 2024-10-31 15:07:22 -03:00
andreaNeki
fa6e85d6db Simplifying the implementation of dynamic aria-describedby 2024-10-31 15:01:54 -03:00
Pierre Lasou
ac720033dc Complete tag translation in french for ORCID
Contains all french translations for ORCID and Researcher Profile.
2024-10-31 11:12:29 -04:00
andreaNeki
7b72a5f0c2 Resolving a wrongly declared variable error 2024-10-31 11:39:34 -03:00
andreaNeki
e629d9edf0 Dynamic aria-describedby attribute 2024-10-31 11:27:10 -03:00
Andrea Barbasso
6257718377 [CST-15593] improve tests reliability 2024-10-31 13:00:21 +01:00
Andrea Barbasso
e516ae8653 [CST-15593] go back to orejime-anonymous cookie 2024-10-31 11:32:54 +01:00
Andrea Barbasso
0ab4d903d9 [CST-15593] fix orejime cookie name, a11y issues and package-lock 2024-10-31 10:54:03 +01:00
Alexandre Vryghem
017e49aca0 Merge branch 'w2p-119915_made-edit-metadata-tab-fields-dynamic_contribute-7.6' into w2p-119915_made-edit-metadata-tab-fields-dynamic_contribute-main
# Conflicts:
#	src/app/core/shared/context.model.ts
#	src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-field-values/dso-edit-metadata-field-values.component.ts
#	src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.html
#	src/app/dso-shared/dso-edit-metadata/dso-edit-metadata-value/dso-edit-metadata-value.component.ts
#	src/app/dso-shared/dso-edit-metadata/dso-edit-metadata.component.ts
#	src/app/dso-shared/dso-shared.module.ts
#	src/app/shared/testing/entity-type-data.service.stub.ts
2024-10-30 22:52:56 +01:00
Alexandre Vryghem
77b66a57b8 119915: Changed the dspace.entity.type textarea with a select to prevent incorrect values 2024-10-30 22:43:23 +01:00
Alexandre Vryghem
2ba3f0b15e 119915: Retrieve the edit metadata field dynamically 2024-10-30 22:43:23 +01:00
Tim Donohue
f2c2fda9f2 Merge pull request #3415 from alexandrevryghem/w2p-107155_Performance-re-request-embeds-main
Added support for caching embedded objects without a self link & null responses
2024-10-30 16:02:27 -05:00
Tim Donohue
e589e95083 Merge pull request #3587 from nimabehforouz/translations-update-fr
Update fr.json5
2024-10-30 14:59:14 -05:00
Tim Donohue
54e3eeb56d Merge pull request #3378 from DanGastardelli/BitstreamTitleDoesNotBisappear
Changing the bitstream title in the submission form to use the view c…
2024-10-30 10:51:45 -05:00
Andrea Barbasso
9eaaab5dd0 Merge remote-tracking branch 'github/main' into task/main/CST-15593
# Conflicts:
#	package-lock.json
2024-10-30 15:41:07 +01:00
Nima Behforouz
8d00d435c4 Update fr.json5
Translation updates to fr.json5 file regarding the Access Control sections.
2024-10-29 15:48:53 -04:00
Alexandre Vryghem
0cb5b76159 117287: Prevent /api/eperson/epersons/undefined from being fired on the create ePerson page 2024-10-29 18:46:06 +01:00
Alexandre Vryghem
976ac7604b 117287: Fixed UI freezing on withdrawn item pages 2024-10-29 18:46:05 +01:00
Alexandre Vryghem
d3de28d909 Merge branch 'w2p-117573_remove-observable-function-calls-from-template-7.6' into w2p-117573_remove-observable-function-calls_contribute-main
# Conflicts:
#	src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html
#	src/app/access-control/group-registry/group-form/group-form.component.ts
2024-10-29 18:23:49 +01:00
Alexandre Vryghem
2581b66a18 Merge branch 'w2p-117573_remove-observable-function-calls-from-template-7.6' 2024-10-29 17:07:07 +01:00
Alexandre Vryghem
f7bb83013a 116404: Replaced ViewChild logic with a CSS selector
This change avoids triggering an additional change detection cycle
2024-10-28 00:02:25 +01:00
Alexandre Vryghem
84df67c00b 116404: Close modal on escape 2024-10-27 18:13:23 +01:00
Alexandre Vryghem
2152bab717 116404: Apply focus on first item 2024-10-27 18:13:23 +01:00
Alexandre Vryghem
05232cdf2b 116404: Added navigation with arrow keys in navbar & collapsed the expandable menu when hovering outside of it 2024-10-27 18:12:55 +01:00
Alexandre Vryghem
c08c2721ac 116404: Don't navigate in the expandable navbar section with tab
Had to move the @slide animation to prevent focus being lost when tabbing in the expandable section
2024-10-27 18:12:31 +01:00
Alexandre Vryghem
2547b1218f 116404: Fixed expandable navbar section loosing focus on expand through keyboard 2024-10-27 18:12:30 +01:00
Tim Donohue
13cbcd35ff Merge pull request #3575 from DSpace/dependabot/npm_and_yarn/testing-bd64cd6aac
Bump the testing group across 1 directory with 2 updates
2024-10-25 15:54:44 -05:00
Tim Donohue
df08276440 Merge pull request #3570 from DSpace/dependabot/npm_and_yarn/babel/runtime-7.26.0
Bump @babel/runtime from 7.25.9 to 7.26.0
2024-10-25 15:53:43 -05:00
Tim Donohue
835aa2ef87 Merge pull request #3569 from DSpace/dependabot/npm_and_yarn/sass-bcfd08c0da
Bump sass from 1.80.3 to 1.80.4 in the sass group
2024-10-25 14:42:06 -05:00
dependabot[bot]
3a5cf9c6c3 Bump the testing group across 1 directory with 2 updates
Bumps the testing group with 2 updates in the / directory: [axe-core](https://github.com/dequelabs/axe-core) and [cypress](https://github.com/cypress-io/cypress).


Updates `axe-core` from 4.10.0 to 4.10.2
- [Release notes](https://github.com/dequelabs/axe-core/releases)
- [Changelog](https://github.com/dequelabs/axe-core/blob/v4.10.2/CHANGELOG.md)
- [Commits](https://github.com/dequelabs/axe-core/compare/v4.10.0...v4.10.2)

Updates `cypress` from 13.15.0 to 13.15.1
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/cypress/compare/v13.15.0...v13.15.1)

---
updated-dependencies:
- dependency-name: axe-core
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: testing
- dependency-name: cypress
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: testing
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-25 19:34:22 +00:00
dependabot[bot]
efc8cad00f Bump @babel/runtime from 7.25.9 to 7.26.0
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.25.9 to 7.26.0.
- [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.26.0/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-25 19:33:38 +00:00
Tim Donohue
993e109e1f Merge pull request #3560 from DSpace/dependabot/npm_and_yarn/angular-843071ab45
Bump the angular group with 3 updates
2024-10-25 14:31:56 -05:00
dependabot[bot]
31e2bd26ea Bump the angular group with 3 updates
Bumps the angular group with 3 updates: [@angular/ssr](https://github.com/angular/angular-cli), [@angular-devkit/build-angular](https://github.com/angular/angular-cli) and [@angular/cli](https://github.com/angular/angular-cli).


Updates `@angular/ssr` from 17.3.10 to 17.3.11
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/17.3.10...17.3.11)

Updates `@angular-devkit/build-angular` from 17.3.10 to 17.3.11
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/17.3.10...17.3.11)

Updates `@angular/cli` from 17.3.10 to 17.3.11
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/17.3.10...17.3.11)

---
updated-dependencies:
- dependency-name: "@angular/ssr"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular-devkit/build-angular"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/cli"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-25 18:00:11 +00:00
dependabot[bot]
ec4ca74a97 Bump sass from 1.80.3 to 1.80.4 in the sass group
Bumps the sass group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.80.3 to 1.80.4
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.80.3...1.80.4)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: sass
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-25 17:58:20 +00:00
Tim Donohue
497f4fd8d4 Ensure "axe-*" is a member of the "testing" group, as it's only used for e2e tests 2024-10-25 12:57:26 -05:00
kshepherd
43630bb7b6 Merge pull request #3553 from tdonohue/remove_unused_deps
Remove unused dependencies
2024-10-24 22:07:03 +02:00
Tim Donohue
3832851ef4 Remove unused webpack-bundle-analyzer dev dependency 2024-10-24 12:33:58 -05:00
Tim Donohue
3b00cc1080 Remove unused rxjs-spy dev dependency 2024-10-24 12:33:58 -05:00
Tim Donohue
4c5b064cfb Remove unused react dev dependencies 2024-10-24 12:33:54 -05:00
Tim Donohue
426a0ac488 Remove unused browser-sync 2024-10-24 12:31:20 -05:00
Tim Donohue
fef5dd72b3 Remove unused angular-idle-preload 2024-10-24 12:31:20 -05:00
Tim Donohue
217b72a332 Move @types/grecaptcha to dev dependencies 2024-10-24 12:31:20 -05:00
kshepherd
b4231dcf77 Merge pull request #3550 from tdonohue/update_http-proxy-middleware
Bump http-proxy-middleware from 1.0.5 to 2.0.7
2024-10-24 16:04:24 +02:00
kshepherd
660b87355a Merge pull request #3547 from tdonohue/remove_unused_postcss_deps
Remove unused PostCSS plugins
2024-10-24 14:30:55 +02:00
kshepherd
9c4e8a3e68 Merge pull request #3524 from Andrea-Guevara/AligningTheWordBrowse
Aligning the browse button
2024-10-24 13:45:35 +02:00
Andrea Barbasso
8c70ee800b Merge branch 'main' into task/main/CST-15593
# Conflicts:
#	package-lock.json
#	package.json
#	src/assets/i18n/ar.json5
2024-10-24 10:12:18 +02:00
Tim Donohue
693adc7cfc Bump http-proxy-middleware from 1.0.5 to 2.0.7 2024-10-23 14:34:12 -05:00
Tim Donohue
39c5c755d7 Remove unused postcss-responsive-type 2024-10-23 13:39:01 -05:00
Tim Donohue
c93ed03004 Remove unused/unmaintained postcss-apply dep 2024-10-23 13:26:55 -05:00
Tim Donohue
bd43d959ab Merge pull request #3544 from tdonohue/remove_types_sanitize_html
Remove unused `@types/sanitize-html` dependency
2024-10-23 13:16:13 -05:00
Tim Donohue
abd0d696dc Merge pull request #3481 from DSpace/alert-autofix-6
Fix code scanning alert no. 6: Incomplete string escaping or encoding
2024-10-23 12:24:57 -05:00
Tim Donohue
74e85c79e7 Remove unused @types/sanitize-html 2024-10-23 11:42:09 -05:00
Tim Donohue
ea8f24d410 Fix bug where all security-updates need unique IDs 2024-10-23 11:33:28 -05:00
Tim Donohue
92ee89e8e5 Fix bug in dependabot.yml "security-updates" settings
"security-updates" configs can only be in sections where there is no "target-branch". This is because they only apply to the primary branch.
2024-10-23 11:31:16 -05:00
Tim Donohue
c7497cdf4e Merge pull request #3539 from DSpace/dependabot/npm_and_yarn/main/webpack-5.95.0
Bump webpack from 5.94.0 to 5.95.0
2024-10-23 11:01:18 -05:00
Tim Donohue
81fb382b9a Merge pull request #3536 from DSpace/dependabot/npm_and_yarn/main/babel/runtime-7.25.9
Bump @babel/runtime from 7.25.7 to 7.25.9
2024-10-23 10:58:40 -05:00
Tim Donohue
ae816815fc Merge pull request #3538 from DSpace/dependabot/npm_and_yarn/main/postcss-8.4.47
Bump postcss from 8.4.39 to 8.4.47
2024-10-23 10:43:08 -05:00
Tim Donohue
87dc6be213 Remove unnecessary @ts-expect-error, as the bug they are expecting is fixed in webpack 5.95.0. 2024-10-23 10:25:49 -05:00
dependabot[bot]
93c6ab2684 Bump webpack from 5.94.0 to 5.95.0
Bumps [webpack](https://github.com/webpack/webpack) from 5.94.0 to 5.95.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.94.0...v5.95.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 21:34:52 +00:00
dependabot[bot]
2ab1472f22 Bump postcss from 8.4.39 to 8.4.47
Bumps [postcss](https://github.com/postcss/postcss) from 8.4.39 to 8.4.47.
- [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.39...8.4.47)

---
updated-dependencies:
- dependency-name: postcss
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 21:34:01 +00:00
dependabot[bot]
280d6d92ad Bump @babel/runtime from 7.25.7 to 7.25.9
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.25.7 to 7.25.9.
- [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.25.9/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 21:33:30 +00:00
Tim Donohue
b7c4c737c1 Update dependabot.yml 2024-10-22 16:29:48 -05:00
Tim Donohue
f3eb5b8a86 Merge pull request #3480 from DSpace/dependabot/npm_and_yarn/main/typescript-5.4.5
Bump typescript from 5.3.3 to 5.4.5
2024-10-22 13:52:32 -05:00
Tim Donohue
49809da1fb Merge pull request #3476 from DSpace/dependabot/npm_and_yarn/main/mirador-share-plugin-0.16.0
Bump mirador-share-plugin from 0.11.0 to 0.16.0
2024-10-22 12:12:11 -05:00
Tim Donohue
d98ae341fd Must also update typescript version override. 2024-10-22 11:53:20 -05:00
andreaNeki
ddafda33b8 Issue 3426 - Aligning the browse button 2024-10-22 13:29:05 -03:00
Tim Donohue
f758d6250c Merge pull request #3477 from DSpace/dependabot/npm_and_yarn/main/zone.js-0.14.10
Bump zone.js from 0.14.7 to 0.14.10
2024-10-22 11:13:40 -05:00
dependabot[bot]
f0b4a56ed5 Bump zone.js from 0.14.7 to 0.14.10
Bumps [zone.js](https://github.com/angular/angular/tree/HEAD/packages/zone.js) from 0.14.7 to 0.14.10.
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/packages/zone.js/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/zone.js-0.14.10/packages/zone.js)

---
updated-dependencies:
- dependency-name: zone.js
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 13:56:15 +00:00
Tim Donohue
23bc4b286b Merge pull request #3511 from tdonohue/remove_unused_deps_main
[Port main] Remove unused dependencies (sortablejs, sanitize-html, webfontloader)
2024-10-22 08:55:00 -05:00
Tim Donohue
beb05b26ce Remove unused webfontloader 2024-10-21 17:09:06 -05:00
Tim Donohue
2e55f4b47f Remove unused sanitize-html 2024-10-21 17:08:25 -05:00
Tim Donohue
08fe8beaf9 Remove sortablejs which is unused 2024-10-21 17:07:44 -05:00
Tim Donohue
88fd0b0094 Merge pull request #3504 from DSpace/dependabot/npm_and_yarn/main/karma-6.4.4
Bump karma from 6.4.3 to 6.4.4
2024-10-21 15:55:40 -05:00
Tim Donohue
56321e6da8 Merge pull request #3502 from DSpace/dependabot/npm_and_yarn/main/sass-25e7b4912b
Bump sass from 1.80.2 to 1.80.3 in the sass group
2024-10-21 15:54:36 -05:00
dependabot[bot]
65b8ba34e6 Bump typescript from 5.3.3 to 5.4.5
Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.3.3 to 5.4.5.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.3.3...v5.4.5)

---
updated-dependencies:
- dependency-name: typescript
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-21 19:57:39 +00:00
Tim Donohue
57f8660ff1 Merge pull request #3503 from DSpace/dependabot/npm_and_yarn/main/types/lodash-4.17.12
Bump @types/lodash from 4.17.6 to 4.17.12
2024-10-21 14:56:29 -05:00
Tim Donohue
f646f0a350 Merge pull request #3478 from DSpace/dependabot/npm_and_yarn/main/types/deep-freeze-0.1.5
Bump @types/deep-freeze from 0.1.2 to 0.1.5
2024-10-21 14:56:01 -05:00
dependabot[bot]
b170333030 Bump sass from 1.80.2 to 1.80.3 in the sass group
Bumps the sass group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.80.2 to 1.80.3
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.80.2...1.80.3)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: sass
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-21 19:03:51 +00:00
Tim Donohue
ce1dc46857 Update dependabot.yml
Remove @types grouping because Dependabot already groups types with related dependencies.
2024-10-21 14:02:56 -05:00
Tim Donohue
2eaa6b8977 Merge pull request #3209 from rsaraivac/patch-3
Update pt-PT.json5
2024-10-21 13:48:24 -05:00
dependabot[bot]
95d0767137 Bump karma from 6.4.3 to 6.4.4
Bumps [karma](https://github.com/karma-runner/karma) from 6.4.3 to 6.4.4.
- [Release notes](https://github.com/karma-runner/karma/releases)
- [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md)
- [Commits](https://github.com/karma-runner/karma/compare/v6.4.3...v6.4.4)

---
updated-dependencies:
- dependency-name: karma
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-21 03:15:12 +00:00
dependabot[bot]
d0daf9cf49 Bump @types/lodash from 4.17.6 to 4.17.12
Bumps [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) from 4.17.6 to 4.17.12.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lodash)

---
updated-dependencies:
- dependency-name: "@types/lodash"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-21 03:14:33 +00:00
Tim Donohue
a157f9f09f Merge pull request #3469 from DSpace/dependabot/npm_and_yarn/main/sass-1.80.2
Bump sass from 1.62.1 to 1.80.2
2024-10-18 16:56:11 -05:00
Tim Donohue
b80aad1baa Merge pull request #3472 from DSpace/dependabot/npm_and_yarn/main/pem-1.14.8
Bump pem from 1.14.7 to 1.14.8
2024-10-18 16:05:39 -05:00
dependabot[bot]
16bda200c0 Bump @types/deep-freeze from 0.1.2 to 0.1.5
Bumps [@types/deep-freeze](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/deep-freeze) from 0.1.2 to 0.1.5.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/deep-freeze)

---
updated-dependencies:
- dependency-name: "@types/deep-freeze"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-18 21:02:22 +00:00
Tim Donohue
2d44c988e4 Merge pull request #3475 from DSpace/dependabot/npm_and_yarn/main/ngtools/webpack-16.2.16
Bump @ngtools/webpack from 16.2.14 to 16.2.16
2024-10-18 16:01:15 -05:00
Tim Donohue
08e7bdebbc Merge pull request #3473 from DSpace/dependabot/npm_and_yarn/main/core-js-3.38.1
Bump core-js from 3.37.1 to 3.38.1
2024-10-18 15:56:19 -05:00
Tim Donohue
1592763f8a Merge pull request #3482 from DSpace/tdonohue-patch-1
Update dependabot.yml with new PR groups for eslint, testing dependencies, postcss, sass, webpack
2024-10-18 15:15:13 -05:00
Tim Donohue
f750259c50 Update dependabot.yml with new groups for eslint, testing, postcss, sass, webpack 2024-10-18 15:09:55 -05:00
Tim Donohue
372444c50a Fix code scanning alert no. 6: Incomplete string escaping or encoding
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
2024-10-18 14:26:48 -05:00
dependabot[bot]
9e3c02e1f3 Bump mirador-share-plugin from 0.11.0 to 0.16.0
Bumps [mirador-share-plugin]() from 0.11.0 to 0.16.0.

---
updated-dependencies:
- dependency-name: mirador-share-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-18 19:24:43 +00:00
dependabot[bot]
20e67030a9 Bump @ngtools/webpack from 16.2.14 to 16.2.16
Bumps [@ngtools/webpack](https://github.com/angular/angular-cli) from 16.2.14 to 16.2.16.
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/16.2.14...16.2.16)

---
updated-dependencies:
- dependency-name: "@ngtools/webpack"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-18 19:24:26 +00:00
dependabot[bot]
9e79c42a9e Bump core-js from 3.37.1 to 3.38.1
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.37.1 to 3.38.1.
- [Release notes](https://github.com/zloirock/core-js/releases)
- [Changelog](https://github.com/zloirock/core-js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/zloirock/core-js/commits/v3.38.1/packages/core-js)

---
updated-dependencies:
- dependency-name: core-js
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-18 19:23:47 +00:00
dependabot[bot]
acd8cbed50 Bump pem from 1.14.7 to 1.14.8
Bumps [pem](https://github.com/Dexus/pem) from 1.14.7 to 1.14.8.
- [Release notes](https://github.com/Dexus/pem/releases)
- [Changelog](https://github.com/Dexus/pem/blob/master/HISTORY.md)
- [Commits](https://github.com/Dexus/pem/compare/v1.14.7...v1.14.8)

---
updated-dependencies:
- dependency-name: pem
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-18 19:23:27 +00:00
Yana De Pauw
5a7ebd4ba9 Continue the menu refactor and cleanup 2024-10-18 13:01:22 +02:00
dependabot[bot]
1ffb0f94a2 Bump sass from 1.62.1 to 1.80.2
Bumps [sass](https://github.com/sass/dart-sass) from 1.62.1 to 1.80.2.
- [Release notes](https://github.com/sass/dart-sass/releases)
- [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sass/dart-sass/compare/1.62.1...1.80.2)

---
updated-dependencies:
- dependency-name: sass
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-17 21:10:48 +00:00
Tim Donohue
9d6af0a538 Merge pull request #3451 from DSpace/dependabot/npm_and_yarn/main/babel/runtime-7.25.7
Bump @babel/runtime from 7.21.0 to 7.25.7
2024-10-17 16:09:39 -05:00
Tim Donohue
e713092c85 Merge pull request #3450 from DSpace/dependabot/npm_and_yarn/main/eslint-plugin-import-2.31.0
Bump eslint-plugin-import from 2.29.1 to 2.31.0
2024-10-17 14:56:57 -05:00
Tim Donohue
299693dfc3 Merge pull request #3456 from DSpace/dependabot/npm_and_yarn/main/reflect-metadata-0.2.2
Bump reflect-metadata from 0.1.14 to 0.2.2
2024-10-17 14:49:49 -05:00
Tim Donohue
5a02217b45 Merge pull request #3459 from DSpace/dependabot/npm_and_yarn/main/fortawesome/fontawesome-free-6.6.0
Bump @fortawesome/fontawesome-free from 6.5.2 to 6.6.0
2024-10-17 14:42:56 -05:00
Tim Donohue
34b9124bde Merge pull request #3461 from tdonohue/i18n_e2e_test
Add basic e2e testing for i18n
2024-10-17 10:47:02 -05:00
Andreas Awouters
6181adccae Merge branch 'item-edit-bitstreams-table-7.6' into item-edit-bitstreams-table-main
# Conflicts:
#	src/app/item-page/edit-item-page/edit-item-page.module.ts
#	src/app/item-page/edit-item-page/item-bitstreams/item-bitstreams.component.spec.ts
#	src/app/item-page/edit-item-page/item-bitstreams/item-bitstreams.component.ts
#	src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.html
#	src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.spec.ts
#	src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts
#	src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/paginated-drag-and-drop-bitstream-list/paginated-drag-and-drop-bitstream-list.component.html
#	src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/paginated-drag-and-drop-bitstream-list/paginated-drag-and-drop-bitstream-list.component.spec.ts
#	src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/paginated-drag-and-drop-bitstream-list/paginated-drag-and-drop-bitstream-list.component.ts
#	src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-drag-handle/item-edit-bitstream-drag-handle.component.ts
#	src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream/item-edit-bitstream.component.html
#	src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream/item-edit-bitstream.component.spec.ts
#	src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream/item-edit-bitstream.component.ts
#	src/app/shared/notifications/models/notification-options.model.ts
#	src/app/shared/notifications/notifications-board/notifications-board.component.spec.ts
#	src/app/shared/notifications/notifications-board/notifications-board.component.ts
#	src/app/shared/pagination-drag-and-drop/abstract-paginated-drag-and-drop-list.component.spec.ts
#	src/app/shared/pagination-drag-and-drop/abstract-paginated-drag-and-drop-list.component.ts
2024-10-17 14:27:43 +02:00
Tim Donohue
a74cd848fe Add basic e2e testing for i18n 2024-10-16 16:45:43 -05:00
Tim Donohue
12d67ec315 Merge pull request #3455 from DSpace/dependabot/npm_and_yarn/main/ng-mocks-14.13.1
Bump ng-mocks from 14.13.0 to 14.13.1
2024-10-16 16:40:45 -05:00
Tim Donohue
a8115b7201 Move ng-mocks to dev dependencies. It's only for testing 2024-10-16 13:37:32 -05:00
Tim Donohue
7e19686e8d Merge pull request #3458 from DSpace/dependabot/npm_and_yarn/main/express-static-gzip-2.1.8
Bump express-static-gzip from 2.1.7 to 2.1.8
2024-10-16 12:35:35 -05:00
dependabot[bot]
72246bdc60 Bump @fortawesome/fontawesome-free from 6.5.2 to 6.6.0
Bumps [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) from 6.5.2 to 6.6.0.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/6.x/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/6.5.2...6.6.0)

---
updated-dependencies:
- dependency-name: "@fortawesome/fontawesome-free"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-16 16:03:28 +00:00
dependabot[bot]
9c2b12ead8 Bump @babel/runtime from 7.21.0 to 7.25.7
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.21.0 to 7.25.7.
- [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.25.7/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-16 16:03:14 +00:00
Tim Donohue
b1392ff009 Merge pull request #3447 from DSpace/dependabot/npm_and_yarn/main/angular-ac94266e48
Bump the angular group with 21 updates
2024-10-16 11:02:06 -05:00
Tim Donohue
479e1be216 Add missing @angular-eslint/utils dependency. Update all @angular-eslint deps to use caret versioning 2024-10-16 10:18:55 -05:00
dependabot[bot]
696ce32ab4 Bump the angular group with 21 updates
Bumps the angular group with 21 updates:

| Package | From | To |
| --- | --- | --- |
| [@angular/animations](https://github.com/angular/angular/tree/HEAD/packages/animations) | `17.3.11` | `17.3.12` |
| [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `17.3.11` | `17.3.12` |
| [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `17.3.11` | `17.3.12` |
| [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `17.3.11` | `17.3.12` |
| [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `17.3.11` | `17.3.12` |
| [@angular/localize](https://github.com/angular/angular) | `17.3.11` | `17.3.12` |
| [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `17.3.11` | `17.3.12` |
| [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) | `17.3.11` | `17.3.12` |
| [@angular/platform-server](https://github.com/angular/angular/tree/HEAD/packages/platform-server) | `17.3.11` | `17.3.12` |
| [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `17.3.11` | `17.3.12` |
| [@angular/ssr](https://github.com/angular/angular-cli) | `17.3.8` | `17.3.10` |
| [@angular-devkit/build-angular](https://github.com/angular/angular-cli) | `17.3.8` | `17.3.10` |
| [@angular-eslint/builder](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/builder) | `17.2.1` | `17.5.3` |
| [@angular-eslint/bundled-angular-compiler](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/bundled-angular-compiler) | `17.2.1` | `17.5.3` |
| [@angular-eslint/eslint-plugin](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin) | `17.2.1` | `17.5.3` |
| [@angular-eslint/eslint-plugin-template](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin-template) | `17.2.1` | `17.5.3` |
| [@angular-eslint/schematics](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/schematics) | `17.2.1` | `17.5.3` |
| [@angular-eslint/template-parser](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/template-parser) | `17.2.1` | `17.5.3` |
| [@angular/cli](https://github.com/angular/angular-cli) | `17.3.8` | `17.3.10` |
| [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `17.3.11` | `17.3.12` |
| [@angular/language-service](https://github.com/angular/angular/tree/HEAD/packages/language-service) | `17.3.11` | `17.3.12` |


Updates `@angular/animations` from 17.3.11 to 17.3.12
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/17.3.12/packages/animations)

Updates `@angular/common` from 17.3.11 to 17.3.12
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/17.3.12/packages/common)

Updates `@angular/compiler` from 17.3.11 to 17.3.12
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/17.3.12/packages/compiler)

Updates `@angular/core` from 17.3.11 to 17.3.12
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/17.3.12/packages/core)

Updates `@angular/forms` from 17.3.11 to 17.3.12
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/17.3.12/packages/forms)

Updates `@angular/localize` from 17.3.11 to 17.3.12
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/compare/17.3.11...17.3.12)

Updates `@angular/platform-browser` from 17.3.11 to 17.3.12
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/17.3.12/packages/platform-browser)

Updates `@angular/platform-browser-dynamic` from 17.3.11 to 17.3.12
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/17.3.12/packages/platform-browser-dynamic)

Updates `@angular/platform-server` from 17.3.11 to 17.3.12
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/17.3.12/packages/platform-server)

Updates `@angular/router` from 17.3.11 to 17.3.12
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/17.3.12/packages/router)

Updates `@angular/ssr` from 17.3.8 to 17.3.10
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/17.3.8...17.3.10)

Updates `@angular-devkit/build-angular` from 17.3.8 to 17.3.10
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/17.3.8...17.3.10)

Updates `@angular-eslint/builder` from 17.2.1 to 17.5.3
- [Release notes](https://github.com/angular-eslint/angular-eslint/releases)
- [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/builder/CHANGELOG.md)
- [Commits](https://github.com/angular-eslint/angular-eslint/commits/HEAD/packages/builder)

Updates `@angular-eslint/bundled-angular-compiler` from 17.2.1 to 17.5.3
- [Release notes](https://github.com/angular-eslint/angular-eslint/releases)
- [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/bundled-angular-compiler/CHANGELOG.md)
- [Commits](https://github.com/angular-eslint/angular-eslint/commits/HEAD/packages/bundled-angular-compiler)

Updates `@angular-eslint/eslint-plugin` from 17.2.1 to 17.5.3
- [Release notes](https://github.com/angular-eslint/angular-eslint/releases)
- [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/angular-eslint/angular-eslint/commits/HEAD/packages/eslint-plugin)

Updates `@angular-eslint/eslint-plugin-template` from 17.2.1 to 17.5.3
- [Release notes](https://github.com/angular-eslint/angular-eslint/releases)
- [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/CHANGELOG.md)
- [Commits](https://github.com/angular-eslint/angular-eslint/commits/HEAD/packages/eslint-plugin-template)

Updates `@angular-eslint/schematics` from 17.2.1 to 17.5.3
- [Release notes](https://github.com/angular-eslint/angular-eslint/releases)
- [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/schematics/CHANGELOG.md)
- [Commits](https://github.com/angular-eslint/angular-eslint/commits/HEAD/packages/schematics)

Updates `@angular-eslint/template-parser` from 17.2.1 to 17.5.3
- [Release notes](https://github.com/angular-eslint/angular-eslint/releases)
- [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/template-parser/CHANGELOG.md)
- [Commits](https://github.com/angular-eslint/angular-eslint/commits/HEAD/packages/template-parser)

Updates `@angular/cli` from 17.3.8 to 17.3.10
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/17.3.8...17.3.10)

Updates `@angular/compiler-cli` from 17.3.11 to 17.3.12
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/17.3.12/packages/compiler-cli)

Updates `@angular/language-service` from 17.3.11 to 17.3.12
- [Release notes](https://github.com/angular/angular/releases)
- [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular/commits/17.3.12/packages/language-service)

---
updated-dependencies:
- dependency-name: "@angular/animations"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/common"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/compiler"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/core"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/forms"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/localize"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/platform-browser"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/platform-browser-dynamic"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/platform-server"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/router"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/ssr"
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular-devkit/build-angular"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular-eslint/builder"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: angular
- dependency-name: "@angular-eslint/bundled-angular-compiler"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: angular
- dependency-name: "@angular-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: angular
- dependency-name: "@angular-eslint/eslint-plugin-template"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: angular
- dependency-name: "@angular-eslint/schematics"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: angular
- dependency-name: "@angular-eslint/template-parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: angular
- dependency-name: "@angular/cli"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/compiler-cli"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
- dependency-name: "@angular/language-service"
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: angular
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-15 22:37:54 +00:00
dependabot[bot]
63a5217f6b Bump express-static-gzip from 2.1.7 to 2.1.8
Bumps [express-static-gzip](https://github.com/tkoenig89/express-static-gzip) from 2.1.7 to 2.1.8.
- [Release notes](https://github.com/tkoenig89/express-static-gzip/releases)
- [Commits](https://github.com/tkoenig89/express-static-gzip/compare/v2.1.7...v2.1.8)

---
updated-dependencies:
- dependency-name: express-static-gzip
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-15 22:31:55 +00:00
Tim Donohue
a1fcc2e3ba Merge pull request #3457 from tdonohue/update_all_eslint
Bump all `@typescript-eslint/*` dependencies to 7.18.0
2024-10-15 17:30:29 -05:00
Tim Donohue
77c245ae53 Ensure @typescript-eslint dependency updates are grouped by dependabot 2024-10-15 16:44:50 -05:00
Tim Donohue
9a2b794c8e Update all @typescript-eslint dependencies to 7.18.0 2024-10-15 16:41:11 -05:00
Tim Donohue
5e2809d14c Merge pull request #3449 from DSpace/dependabot/npm_and_yarn/main/axe-core-4.10.0
Bump axe-core from 4.9.1 to 4.10.0
2024-10-15 14:34:34 -05:00
Tim Donohue
cacb1f9e44 Merge pull request #3453 from DSpace/dependabot/npm_and_yarn/main/typescript-eslint/eslint-plugin-7.18.0
Bump @typescript-eslint/eslint-plugin from 7.15.0 to 7.18.0
2024-10-15 14:31:59 -05:00
dependabot[bot]
3ad1f6e69c Bump reflect-metadata from 0.1.14 to 0.2.2
Bumps [reflect-metadata](https://github.com/rbuckton/reflect-metadata) from 0.1.14 to 0.2.2.
- [Release notes](https://github.com/rbuckton/reflect-metadata/releases)
- [Changelog](https://github.com/rbuckton/reflect-metadata/blob/main/tsconfig-release.json)
- [Commits](https://github.com/rbuckton/reflect-metadata/commits)

---
updated-dependencies:
- dependency-name: reflect-metadata
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-15 14:05:44 +00:00
dependabot[bot]
4bb1baf638 Bump ng-mocks from 14.13.0 to 14.13.1
Bumps [ng-mocks](https://github.com/help-me-mom/ng-mocks) from 14.13.0 to 14.13.1.
- [Release notes](https://github.com/help-me-mom/ng-mocks/releases)
- [Changelog](https://github.com/help-me-mom/ng-mocks/blob/master/CHANGELOG.md)
- [Commits](https://github.com/help-me-mom/ng-mocks/compare/v14.13.0...v14.13.1)

---
updated-dependencies:
- dependency-name: ng-mocks
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-15 14:05:24 +00:00
dependabot[bot]
9033e020ee Bump @typescript-eslint/eslint-plugin from 7.15.0 to 7.18.0
Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 7.15.0 to 7.18.0.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.18.0/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-15 14:04:47 +00:00
dependabot[bot]
68d27e59bb Bump eslint-plugin-import from 2.29.1 to 2.31.0
Bumps [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) from 2.29.1 to 2.31.0.
- [Release notes](https://github.com/import-js/eslint-plugin-import/releases)
- [Changelog](https://github.com/import-js/eslint-plugin-import/blob/main/CHANGELOG.md)
- [Commits](https://github.com/import-js/eslint-plugin-import/compare/v2.29.1...v2.31.0)

---
updated-dependencies:
- dependency-name: eslint-plugin-import
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-15 14:03:34 +00:00
dependabot[bot]
2044f7b2d5 Bump axe-core from 4.9.1 to 4.10.0
Bumps [axe-core](https://github.com/dequelabs/axe-core) from 4.9.1 to 4.10.0.
- [Release notes](https://github.com/dequelabs/axe-core/releases)
- [Changelog](https://github.com/dequelabs/axe-core/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/dequelabs/axe-core/compare/v4.9.1...v4.10.0)

---
updated-dependencies:
- dependency-name: axe-core
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-15 14:03:00 +00:00
Tim Donohue
47e89426d9 Merge pull request #3420 from DSpace/tdonohue-dependabot
Configure Dependabot to also attempt minor/patch updates for dependencies
2024-10-15 08:52:42 -05:00
Tim Donohue
db695d134f Merge pull request #3176 from saschaszott/patch-23
Add German translations (metadata import)
2024-10-14 17:00:48 -05:00
Tim Donohue
fa601fcbb4 Merge pull request #3144 from knowledgeWare-Tech/main
Update Arabic Translation
2024-10-14 16:48:34 -05:00
Tim Donohue
2cf3682473 Enable dependabot on 7.x and 8.x maintenance branches. 2024-10-14 15:52:50 -05:00
Tim Donohue
0d36bcec2e Fix yaml alignment 2024-10-14 12:22:53 -05:00
Tim Donohue
f9fa586060 Create dependabot.yml
Add configs for version dependency updates
2024-10-14 12:08:33 -05:00
Yana De Pauw
005936b18d Support withSubs on the menuproviders in appmenu
Adds support to define child providers for a parent menu using a .withSubs option. This parent menu will always be displayed as an expandable menu.
When no children are visible, the expandable menus will be hidden.
2024-10-11 15:51:34 +02:00
Alexandre Vryghem
1975c63ad1 Merge branch 'w2p-107155_Performance-re-request-embeds-7.6' into w2p-107155_Performance-re-request-embeds-main
# Conflicts:
#	src/app/collection-page/collection-page.component.ts
#	src/app/core/breadcrumbs/item-breadcrumb.resolver.ts
#	src/app/core/browse/browse.service.spec.ts
#	src/app/core/browse/browse.service.ts
#	src/app/core/data/relationship-data.service.spec.ts
#	src/app/core/data/relationship-data.service.ts
#	src/app/item-page/edit-item-page/abstract-item-update/abstract-item-update.component.ts
#	src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts
#	src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.ts
#	src/app/item-page/item.resolver.ts
#	src/app/shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component.ts
#	src/app/shared/utils/relation-query.utils.ts
2024-10-11 15:35:58 +02:00
milanmajchrak
680d6c9416 Fixed small cs localization mistakes 2024-10-11 13:37:24 +02:00
Alexandre Vryghem
ecb0de7374 Merge branch 'w2p-107155_Performance-re-request-embeds-7.6'
# Conflicts:
#	src/app/core/cache/object-cache.reducer.ts
#	src/app/core/cache/object-cache.service.ts
2024-10-11 11:05:26 +02:00
Alexandre Vryghem
86ae3e4d47 Merge branch 'fix-versioning-button-7.6' 2024-10-11 11:01:45 +02:00
Alexandre Vryghem
704cc06f16 118944: Fix hasDraftVersion$ not working for embedded payloads with no content 2024-10-11 10:59:47 +02:00
Tim Donohue
9ddfa27d0c Merge pull request #3407 from DSpace/dependabot/npm_and_yarn/multi-c0b71ba702
Bump cookie, cookie-parser and socket.io
2024-10-10 13:13:15 -05:00
Alisa Ismailati
7cd82e542b [CST-17153] improve descriptive labels for show/hide more buttons on related items lists 2024-10-10 18:13:34 +02:00
dependabot[bot]
101a3d70ce Bump cookie, cookie-parser and socket.io
Bumps [cookie](https://github.com/jshttp/cookie) to 0.7.2 and updates ancestor dependencies [cookie](https://github.com/jshttp/cookie), [cookie-parser](https://github.com/expressjs/cookie-parser) and [socket.io](https://github.com/socketio/socket.io). These dependencies need to be updated together.


Updates `cookie` from 0.4.1 to 0.7.2
- [Release notes](https://github.com/jshttp/cookie/releases)
- [Commits](https://github.com/jshttp/cookie/compare/v0.4.1...v0.7.2)

Updates `cookie-parser` from 1.4.6 to 1.4.7
- [Release notes](https://github.com/expressjs/cookie-parser/releases)
- [Changelog](https://github.com/expressjs/cookie-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/cookie-parser/compare/1.4.6...1.4.7)

Updates `socket.io` from 4.7.5 to 4.8.0
- [Release notes](https://github.com/socketio/socket.io/releases)
- [Changelog](https://github.com/socketio/socket.io/blob/main/CHANGELOG.md)
- [Commits](https://github.com/socketio/socket.io/compare/socket.io@4.7.5...socket.io@4.8.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-10 15:09:10 +00:00
Tim Donohue
1443e5b3e1 Merge pull request #3343 from DSpace/dependabot/npm_and_yarn/multi-c9b7225f9e
Bump send, express, browser-sync and serve-static
2024-10-10 10:08:11 -05:00
Tim Donohue
e13b0e3e13 Merge pull request #3400 from aseyedia/fix-issue-3399
Fixed #3399 - minor typo
2024-10-09 13:52:58 -05:00
Arta Seyedian
c6a3794a76 Fixed #3399 - minor typo 2024-10-09 13:55:39 -04:00
Tim Donohue
d7ff9c3ec0 Merge pull request #3315 from tdonohue/upgrade_cypress
Upgrade to Cypress 13.15.0
2024-10-09 11:09:14 -05:00
dependabot[bot]
8e1736f608 Bump send, express, browser-sync and serve-static
Bumps [send](https://github.com/pillarjs/send) to 0.19.0 and updates ancestor dependencies [send](https://github.com/pillarjs/send), [express](https://github.com/expressjs/express), [browser-sync](https://github.com/BrowserSync/browser-sync) and [serve-static](https://github.com/expressjs/serve-static). These dependencies need to be updated together.


Updates `send` from 0.18.0 to 0.19.0
- [Release notes](https://github.com/pillarjs/send/releases)
- [Changelog](https://github.com/pillarjs/send/blob/master/HISTORY.md)
- [Commits](https://github.com/pillarjs/send/compare/0.18.0...0.19.0)

Updates `express` from 4.20.0 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.20.0...4.21.0)

Updates `browser-sync` from 3.0.2 to 3.0.3
- [Release notes](https://github.com/BrowserSync/browser-sync/releases)
- [Changelog](https://github.com/BrowserSync/browser-sync/blob/master/CHANGELOG.md)
- [Commits](https://github.com/BrowserSync/browser-sync/compare/v3.0.2...v3.0.3)

Updates `serve-static` from 1.15.0 to 1.16.2
- [Release notes](https://github.com/expressjs/serve-static/releases)
- [Changelog](https://github.com/expressjs/serve-static/blob/v1.16.2/HISTORY.md)
- [Commits](https://github.com/expressjs/serve-static/compare/v1.15.0...v1.16.2)

---
updated-dependencies:
- dependency-name: send
  dependency-type: indirect
- dependency-name: express
  dependency-type: direct:production
- dependency-name: browser-sync
  dependency-type: direct:development
- dependency-name: serve-static
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-09 15:30:21 +00:00
Tim Donohue
c1cc9ba2d6 Merge pull request #3395 from DSpace/dependabot/npm_and_yarn/rollup-4.24.0
Bump rollup from 4.18.0 to 4.24.0
2024-10-09 10:29:11 -05:00
Tim Donohue
b4d932a91b Bump to Cypress 13.5.0 2024-10-09 10:24:42 -05:00
Alisa Ismailati
b0356c58fb Merge branch 'main' into task/main/CST-15591
# Conflicts:
#	src/app/notifications/qa/source/quality-assurance-source.component.html
2024-10-09 16:57:16 +02:00
dependabot[bot]
75655f1bb8 Bump rollup from 4.18.0 to 4.24.0
Bumps [rollup](https://github.com/rollup/rollup) from 4.18.0 to 4.24.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.18.0...v4.24.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-09 14:52:39 +00:00
Alisa Ismailati
c2d3d8b216 Merge branch 'main' into task/main/CST-15591 2024-10-09 16:51:37 +02:00
Tim Donohue
b543b32a37 Bump cypress-axe to 1.5.0 2024-10-09 09:42:30 -05:00
Tim Donohue
a012e4cea2 Test stability fixes. Ensure Item Edit tests wait on tabs to load by testing if tab is active. Fix small bug in login-modal test. 2024-10-09 09:42:30 -05:00
Tim Donohue
968c5bda71 Simplify login CSS selectors 2024-10-09 09:42:30 -05:00
Tim Donohue
7aba69edd6 Minor changes to login-modal.cy.ts to cleanup CSS selectors 2024-10-09 09:42:30 -05:00
Tim Donohue
f9911ce5ba Ensure Cypress still creates videos in GitHub Actions 2024-10-09 09:42:30 -05:00
Tim Donohue
59ba031b1f Upgrade to Cypress 13 2024-10-09 09:42:30 -05:00
Tim Donohue
7611635ad0 Merge pull request #3213 from 4Science/task/main/CST-15592
Implement e2e accessibility tests for pages in DSpace User Interface
2024-10-09 09:20:52 -05:00
milanmajchrak
9badd4a4b6 Updated cs localization for subcommunities and subcollections 2024-10-09 16:14:04 +02:00
milanmajchrak
5e5c627b8b Fixed messages following the PR from the UFAL - f18d45ce23 2024-10-09 16:09:51 +02:00
FrancescoMolinaro
9e985cf2d4 [CST-15592] remove interceptor for edit group 2024-10-09 15:13:14 +02:00
milanmajchrak
813d644b32 Updated cs messages following review requirements 2024-10-09 15:08:31 +02:00
FrancescoMolinaro
2b466bb382 [CST-15592] add interceptor for edit group, fix landmark-unique accessibility issue in pagination component 2024-10-09 14:16:47 +02:00
FrancescoMolinaro
55ab43f132 [CST-15592] add interceptor for item edit page 2024-10-09 13:15:07 +02:00
FrancescoMolinaro
0e5b924f42 [CST-15592] add interceptor to prevent sudden timeout failure 2024-10-09 11:44:44 +02:00
FrancescoMolinaro
f131ae2f6b [CST-15592] refine health page tests 2024-10-09 11:44:44 +02:00
FrancescoMolinaro
2369b27178 [CST-15592] change health page test target for second tab 2024-10-09 11:44:44 +02:00
FrancescoMolinaro
69f618e856 [CST-15592] improve tests, add attributes for testing, fix wrong references 2024-10-09 11:44:44 +02:00
FrancescoMolinaro
4cd55d6669 [CST-15592] add accessibility tests for:
Admin Add New Modals
Admin Edit Modals
Admin Export Modals
Admin Workflow Page
End User Agreement
Feedback
Profile Page
System Wide Alert
2024-10-09 11:44:44 +02:00
FrancescoMolinaro
d12d0faf09 [CST-15592] add accessibility tests for:
Admin Curation Task
Bitstream Format
Health Page
Metadata Schema
2024-10-09 11:44:44 +02:00
FrancescoMolinaro
85e486438a [CST-15592] add accessibility tests for:
Admin Notifications Publication Claim
Admin Search Page
Bulk Access
Create Group
Metadata Registry
2024-10-09 11:44:44 +02:00
FrancescoMolinaro
a0e3c41be6 [CST-15592] add accessibility tests for:
Edit Eperson
Edit Group
Create EPerson
Epeople Registry
Groups Registry
2024-10-09 11:44:44 +02:00
FrancescoMolinaro
e6a7fb852a [CST-15592] add accessibility tests for following pages:
Metadata Import
Batch Import
Processes Overview
New Process
Quality Assurance Sources
2024-10-09 11:44:44 +02:00
Tim Donohue
b9c712c72f Merge pull request #3221 from alexandrevryghem/w2p-116728_removed-unnecessary-ngvars_contribute-main
Removed unnecessary *ngVars from ThumbnailComponent
2024-10-08 15:07:51 -05:00
Tim Donohue
035ae803e2 Merge pull request #3386 from alphapetjg/patch-1
Update fr.json5 to add capitalization
2024-10-04 10:17:49 -05:00
Julia
c5b395802c Update fr.json5 to add capitalization 2024-10-04 10:24:27 -04:00
Tim Donohue
bbc93291ea Merge pull request #3148 from Neki-IT/StatusPageAccessibility
Accessibility of the status page
2024-10-02 16:48:58 -05:00
DanGastardelli
2643a459b6 Import order adjustment 2024-10-02 09:24:46 -03:00
DanGastardelli
eeaac8965b Import order adjustment 2024-10-02 09:10:48 -03:00
DanGastardelli
62006c00ca Fix last commit 2024-10-02 09:01:56 -03:00
DanGastardelli
762bc8ce8c Adjusting spacing 2024-10-02 08:46:37 -03:00
andreaNeki
4aed1b6056 Adjusting bold text on labels 2024-10-02 08:45:52 -03:00
DanGastardelli
df24a63a46 Adjusting spacing and good rules 2024-10-02 08:38:42 -03:00
Yana De Pauw
161daffcc0 115284: Add tests for isRepeatable 2024-10-02 11:09:30 +02:00
DanGastardelli
fec4aa6df1 Changing the bitstream title in the submission form to use the view component title, avoiding disappearance with changes to the form 2024-10-01 17:15:53 -03:00
andreaNeki
f975e1da89 Edit item - making page content more responsive and accessible 2024-10-01 14:34:43 -03:00
Andrea-Guevara
dd93a10007 Merge branch 'DSpace:main' into StatusPageAccessibility 2024-10-01 12:13:09 -03:00
Tim Donohue
3d057bb1b2 Merge pull request #3375 from kshepherd/markdown_directive_force_sanitization
Always sanitize HTML passed to dsMarkdown even if markdown rendering is disabled
2024-10-01 09:52:15 -05:00
Kim Shepherd
8fb4772b6c Always sanitize HTML in dsMarkdown even if markdown disabled
Instead of setting innerHTML directly to value, sanitize
the value, even if not passing to renderMarkdown/Mathjax
2024-10-01 14:03:46 +02:00
Andrea Barbasso
ad7bbb85cb Merge remote-tracking branch 'github/main' into task/main/CST-15593 2024-09-30 11:20:18 +02:00
andreaNeki
73d39abfe5 Trying to correct an error in the focus implementation 2024-09-27 16:18:56 -03:00
andreaNeki
3658ad1ec0 Ensuring that the message “There were no items to show” is announced to the screen reader when necessary 2024-09-27 15:08:53 -03:00
andreaNeki
e54b1ce274 Adding focus to the input after the reset button is clicked 2024-09-27 14:01:44 -03:00
andreaNeki
9565f9b9ee Adding the aria-label attribute to buttons 2024-09-27 13:44:31 -03:00
Tim Donohue
052b6a9bdd Merge pull request #3337 from atmire/live-region-main
Live Region
2024-09-27 11:09:56 -05:00
Andreas Awouters
0f5a50a868 Merge branch 'live-region-8.0' into live-region-main 2024-09-27 10:15:51 +02:00
Andrea Barbasso
a2193a186a Merge branch 'main' into task/main/CST-15593 2024-09-27 10:06:39 +02:00
Tim Donohue
cbd681d440 Merge pull request #3153 from eulereadgbe/patch-1
Fix to Mobile navbar hamburger menu for base (custom) theme
2024-09-26 13:21:53 -05:00
Tim Donohue
ff322e2ae1 Merge pull request #3340 from alphapetjg/main
DS-3330: Updated en.json5 to fixed typo for 'occurred'
2024-09-26 11:56:48 -05:00
Pascal-Nicolas Becker
af7b14851c Merge pull request #3175 from saschaszott/patch-22
minor change: added missing periods in German translations
2024-09-26 16:45:10 +02:00
Pascal-Nicolas Becker
3664512e27 Merge pull request #3149 from saschaszott/patch-21
missing German translations (500 error)
2024-09-26 16:43:07 +02:00
Jens Vannerum
1b17879d7a documentation file 2024-09-25 14:56:00 +02:00
Alisa Ismailati
bcaa73a161 [CST-15073][CST-15074] removed unnecessary additions 2024-09-25 10:18:32 +02:00
Alisa Ismailati
1565a1dc32 [CST-15073][CST-15074] Fixes 2024-09-25 10:18:24 +02:00
Alisa Ismailati
83615a1c90 [CST-15073][CST-15074] Adaptation with standalone components 2024-09-25 10:18:14 +02:00
Alisa Ismailati
214a77a65c [CST-14902][CST-15073][CST-15074] Adds ORCID login flow with private email 2024-09-25 10:17:53 +02:00
Andrea Barbasso
99100371b8 [CST-15078] add orcid icon with tooltip 2024-09-24 11:03:36 +02:00
Alan Orth
fca5700012 Merge pull request #3329 from TexasDigitalLibrary/update-isbot 2024-09-24 09:55:32 +03:00
Julia
ed5ac47f88 Update en.json5 - fixed typo for occurred 2024-09-23 15:53:55 -04:00
Jens Vannerum
ee83beae94 fix bug in lint rule, add docs for rule and update name so it's clear this is only for buttons currently
(cherry picked from commit 2380d4e751)
2024-09-20 16:45:48 +02:00
Andreas Awouters
debc2325cd Merge branch 'live-region-8.0' into live-region-main 2024-09-20 14:25:03 +02:00
Andrea Barbasso
e2dc89c737 [CST-15595] fix tests 2024-09-20 10:26:46 +02:00
Jens Vannerum
c249afdb3f lint rule with autofix to disallow the disabled input on button elements 2024-09-18 13:09:25 +02:00
nwoodward
c419dd608b updates isbot dependency to newest version 2024-09-16 15:07:08 -05:00
Jens Vannerum
1209b40ac9 117544: fix remaining bug 2024-09-16 16:09:41 +02:00
Andrea Barbasso
80e1daeb65 [CST-15593] allow orejime to start if privacy statement is disabled 2024-09-16 14:22:13 +02:00
Jens Vannerum
0928dc1ca9 117544: linting 2024-09-16 14:11:59 +02:00
Jens Vannerum
5a609d5bb1 117544: rename directive to be clear it should currently only be used for buttons 2024-09-16 13:45:33 +02:00
Jens Vannerum
9fd3c2d734 117544: PR feedback
- added typedocs
- changed directive to only be present for buttons
- various other small fixes
2024-09-16 13:44:06 +02:00
Andrea Barbasso
58c5d742b7 [CST-15593] fix orejime startup error
this was happening because of hidden apps not being removed from category arrays.
2024-09-16 11:44:08 +02:00
Jens Vannerum
363356b47c Merge remote-tracking branch 'upstream/main' into w2p-117544_support-for-disabled-elements-for-screen-readers-9.0 2024-09-16 10:56:09 +02:00
Andrea Barbasso
a9da80caae [CST-15593] run npm i for orejime 2024-09-16 10:23:26 +02:00
Andrea Barbasso
7966efcaf2 Merge remote-tracking branch 'origin/main' into task/main/CST-15593
# Conflicts:
#	yarn.lock
2024-09-16 10:17:06 +02:00
Tim Donohue
779ff47260 Merge pull request #3318 from DSpace/dependabot/npm_and_yarn/multi-27a054522e
Bump body-parser and express
2024-09-11 14:02:52 -05:00
igorbaptist4
d7869f408e fix identation 2024-09-11 15:15:26 -03:00
igorbaptist4
0ef2db146b Configuring the URI link target 2024-09-11 14:48:59 -03:00
Yana De Pauw
83dc069673 Make tests compile 2024-09-11 11:38:02 +02:00
dependabot[bot]
45875f13c4 Bump body-parser and express
Bumps [body-parser](https://github.com/expressjs/body-parser) to 1.20.3 and updates ancestor dependency [express](https://github.com/expressjs/express). These dependencies need to be updated together.


Updates `body-parser` from 1.20.2 to 1.20.3
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.20.2...1.20.3)

Updates `express` from 4.19.2 to 4.20.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/master/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.20.0)

---
updated-dependencies:
- dependency-name: body-parser
  dependency-type: indirect
- dependency-name: express
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-10 21:48:08 +00:00
Tim Donohue
16943fef16 Merge pull request #3171 from pastr/remove-material-ui
Remove material-ui dependency
2024-09-10 16:47:11 -05:00
kshepherd
8f70d3da25 Merge pull request #3233 from cclauss/codespell
Fix typos discovered by codespell
2024-09-07 10:22:32 +02:00
Christian Clauss
1a9d68c260 Merge branch 'main' into codespell 2024-09-06 22:53:45 +02:00
Emmanuel Pastor
a737719468 Remove unused react dependencies 2024-09-06 22:20:17 +02:00
Tim Donohue
ba05b22fae Merge pull request #3173 from alanorth/use-npm
Use npm instead of Yarn
2024-09-06 13:38:27 -05:00
Tim Donohue
8144d1bb9e Add yarn.lock to .gitignore 2024-09-06 12:35:52 -05:00
Tim Donohue
202e765b43 Add yarn.lock to .dockerignore 2024-09-06 12:33:26 -05:00
Simone Ramundi
2def01b8c2 Merge branch 'main' into task/main/DURACOM-296 2024-09-06 17:29:41 +02:00
Simone Ramundi
4d5910981a [DURACOM-296] Enabled 'admin-div' only for Site Administrator 2024-09-06 17:10:09 +02:00
Nona Luypaert
5e24ed1fb6 117648: Add tests for basic MenuProviders 2024-09-06 16:55:25 +02:00
Tim Donohue
b5c00dd7d9 Merge pull request #3011 from mspalti/shibboleth-fix
Fixed page and admin menu for Shibboleth auth
2024-09-05 15:54:42 -05:00
andreaNeki
f00eae6760 Code refactoring - Accessibility on the new user registration and forgotten password forms 2024-09-05 09:35:55 -03:00
Alan Orth
576aece31d README.md: use npm
Use npm instead of yarn. Mostly a search and replace, minus some
changes in terminology, for example "yarn add" vs "npm install".
2024-09-05 14:56:24 +03:00
Alan Orth
d11e4170fd .github/pull_request_template.md: use npm
Use npm instead of yarn.
2024-09-05 14:56:24 +03:00
Alan Orth
3894c87ba2 .dockerignore: remove package-lock.json
We need this now that we are using npm instead of yarn.
2024-09-05 14:56:24 +03:00
Alan Orth
fbf2aee48f package.json: fix @angular/localize version pin
This was the only Angular package not using a "^" to specify the
semver range.
2024-09-05 14:56:24 +03:00
Alan Orth
10df0ac366 Use npm instead of yarn in Dockerfile
There is a minor difference in syntax when starting the application
with `npm run serve`. We use `--` to make sure npm doesn't try to
parse the `--host 0.0.0.0` as an option, allowing it instead to be
read by Angular CLI (ng).

Also, there is no direct npm equivalent to yarn's --network-timeout
option so I will remove it. If we need something similar later we
might be able to use these config options:

    npm config set fetch-retry-mintimeout 300000
    npm config set fetch-retry-maxtimeout 300000
2024-09-05 14:56:24 +03:00
Alan Orth
f3619ff4d8 Use eslint-plugin-unused-imports v3.x.x
Fix lint error. According to the docs we should be using v3.x.x:

> * Version 3.x.x is for eslint 8 with @typescript-eslint/eslint-plugin 6 - 7
> * Version 2.x.x is for eslint 8 with @typescript-eslint/eslint-plugin 5

See: https://www.npmjs.com/package/eslint-plugin-unused-imports
2024-09-05 14:56:23 +03:00
Alan Orth
e29a6a3c0a lint/src/util: fix TS2314
Fix error in lint:

> lint/src/util/structure.ts:16:20 - error TS2314: Generic type 'RuleMetaData<MessageIds, Options>' requires 2 type argument(s).
>
> 16 export type Meta = RuleMetaData<string>;
2024-09-05 14:56:23 +03:00
Alan Orth
da1789aece .github/workflows/build.yml: use npm
Use npm instead of yarn in GitHub Actions.
2024-09-05 14:56:19 +03:00
Alan Orth
c6f984b4cb package.json: add overrides for conflicts
Add overrides for conflicting peer dependencies. In yarn these were
handled less noisily, but in npm we need to add explicit overrides
for each. This allows us to use `npm install` without forcing or
using `--legacy-peer-deps`.
2024-09-05 10:30:12 +03:00
Alan Orth
ee33b8f9cc package.json: remove resolutions
These are a yarn-specific concept that we don't need for npm.
2024-09-05 10:30:11 +03:00
Alan Orth
ce3285c1f2 .gitignore: remove package-lock.json
Now that we are using npm we need to commit this.
2024-09-05 10:30:11 +03:00
Alan Orth
74ac315b58 package.json: update scripts to use "npm run"
All scripts should use "npm run" instead of "yarn".
2024-09-05 10:30:05 +03:00
Alan Orth
84c88a118f package.json: use "file:" for local dependencies
Instead of using the Yarn link protocol, we can use npm's built-in
support for local dependencies using "file:".
2024-09-05 08:40:08 +03:00
Alan Orth
7fc54ec6f7 Remove yarn.lock 2024-09-05 08:40:07 +03:00
Tim Donohue
ab4d32a04e Merge pull request #3284 from DSpace/dependabot/npm_and_yarn/micromatch-4.0.8
Bump micromatch from 4.0.5 to 4.0.8
2024-09-04 16:51:41 -05:00
Tim Donohue
d42d275b9e Merge pull request #3289 from kshepherd/filewatcher_ignores
Ignore some paths from file watcher
2024-09-04 10:46:44 -05:00
Tim Donohue
88e145c0a9 Merge pull request #3283 from DSpace/dependabot/npm_and_yarn/webpack-5.94.0
Bump webpack from 5.90.3 to 5.94.0
2024-09-03 16:37:42 -05:00
Tim Donohue
027a4e5d41 Merge pull request #3287 from 4Science/task/main/DURACOM-265
DURACOM-265 provided label for cclicense required error
2024-09-03 16:14:13 -05:00
Kim Shepherd
8152d39ad0 Ignore some paths from file watcher
Watching all these directories can cause systems to exceed
maximum watched files / inotify limits, especially in dev
mode with IDEs etc also watching files.
2024-09-03 14:52:10 +02:00
Mattia Vianelli
b17cc5d3c3 DSC-1709 provided label for cclicense required error 2024-09-03 14:19:27 +02:00
Alexandre Vryghem
5f922c06e0 Remove webpack@5.90.3 since it causes issues with the tests
This automatically removed some old eslint dependencies, which caused some conflicts in the custom linting plugin
2024-08-30 22:42:47 +02:00
Alexandre Vryghem
7dea5f7d98 Temporarily ignore type errors from EnvironmentPlugin since type matching is currently too strict 2024-08-30 20:59:24 +02:00
dependabot[bot]
aca752a01e Bump micromatch from 4.0.5 to 4.0.8
Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8.
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-30 17:02:42 +00:00
dependabot[bot]
81b89f5d0c Bump webpack from 5.90.3 to 5.94.0
Bumps [webpack](https://github.com/webpack/webpack) from 5.90.3 to 5.94.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.90.3...v5.94.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-30 17:00:42 +00:00
Tim Donohue
1c1497422b Merge pull request #3273 from DSpace/dependabot/npm_and_yarn/axios-1.7.4
Bump axios from 1.6.7 to 1.7.4
2024-08-30 11:59:31 -05:00
Tim Donohue
c659061ff0 Merge pull request #3253 from alexandrevryghem/w2p-117287_fix-item-version-performance-issues_contribute-main
Fixed Edit Item's Version History crashing
2024-08-29 16:43:02 -05:00
Tim Donohue
843056d960 Merge pull request #3280 from DSpace/backport-3035-to-main
[Port main] Set color black on filter section for mobile
2024-08-29 15:55:15 -05:00
Victor Hugo Duran Santiago
3a5e309d38 Set color black on filter section for mobile
(cherry picked from commit 36c95db7bf)
2024-08-29 19:59:42 +00:00
Tim Donohue
27ee094310 Merge pull request #3277 from vNovski/Fix/#3259-typo-in-german-translation
Typo in German translation
2024-08-29 13:28:58 -05:00
Vlad Novski
3b4e0d51cd fix[i18n]: typo in German translation 2024-08-29 18:56:28 +02:00
kshepherd
332be2bdb2 Merge pull request #3251 from alexandrevryghem/w2p-110615_minor-accessibibity-fixes_contribute-main
Minor accessibibity fixes
2024-08-29 15:33:56 +02:00
dependabot[bot]
b22ba6f3ef Bump axios from 1.6.7 to 1.7.4
Bumps [axios](https://github.com/axios/axios) from 1.6.7 to 1.7.4.
- [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/v1.6.7...v1.7.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-28 16:56:56 +00:00
Yana De Pauw
297562249a Support onRoute on the menuproviders in appmenu
Adds support to define routes for which the menu providers needs to be present in appmenu
Moves menu adding away from the resolver and to the init service
Refactored statsmenu to show stats on all pages based on dso somewhere in the route
2024-08-28 11:08:56 +02:00
andreaNeki
0eb2d5ce58 Improving accessibility on the new user registration page 2024-08-27 17:02:12 -03:00
Jens Vannerum
bde12bab38 Merge branch 'w2p-117544_support-for-disabled-elements-for-screen-readers-8.0' into w2p-117544_support-for-disabled-elements-for-screen-readers-9.0 2024-08-27 10:49:28 +02:00
Yury Bondarenko
0291942613 Proof-of-concept: independent menu section providers
- Replace god-class resolvers with a service that populates the menus from lists of injectable providers
- Static menu sections are resolved at the root route ~ `resolveStatic`
- Route-dependent menu sections can be declared in the same structure, but are resolved on-demand ~ `resolveRoute`
- More and more easily customizable
  - Parts can be moved between menus, removed, replaced or extended individually
  - The dependencies of each provider are independent of each other
  - Order of providers determines the order of each menu → single source of truth for the order
2024-08-23 18:39:41 +02:00
Andrea-Guevara
c75f1f031a Merge branch 'DSpace:main' into StatusPageAccessibility 2024-08-23 11:03:33 -03:00
Alexandre Vryghem
04bbaf9cb9 117287: Simplified the if conditions on the edit/save/discard buttons on item versions 2024-08-14 23:50:28 +02:00
Alexandre Vryghem
9c2909933c Merge branch 'w2p-117287_fix-item-version-performance-issues_contribute-7.6' into w2p-117287_fix-item-version-performance-issues_contribute-main
# Conflicts:
#	src/app/item-page/versions/item-versions.component.html
#	src/app/item-page/versions/item-versions.component.ts
2024-08-14 23:04:54 +02:00
pcg-kk
d9d39b0cb5 fix: use the correct link name for find by href for findListByHref 2024-08-13 19:36:02 +02:00
pcg-kk
a862d84738 fix: use the correct link name for find by href 2024-08-13 19:34:13 +02:00
pcg-kk
973fd339da fix: add unit test for rename property case 2024-08-13 19:34:13 +02:00
pcg-kk
3351615140 fix: linkName from decorator assign value to the correct property 2024-08-13 19:34:12 +02:00
Alexandre Vryghem
f61e8652d7 Merge branch 'w2p-110615_minor-accessibibity-fixes_contribute-7.6' into w2p-110615_minor-accessibibity-fixes_contribute-main
# Conflicts:
#	src/app/item-page/simple/related-entities/tabbed-related-entities-search/tabbed-related-entities-search.component.html
#	src/app/navbar/expandable-navbar-section/expandable-navbar-section.component.html
#	src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html
2024-08-13 13:45:10 +02:00
Tim Donohue
ee7e8358e7 Merge pull request #3243 from tdonohue/fix_lint_error
Fix lint error regarding missing interface
2024-08-09 08:58:46 -05:00
Alan Orth
fd7fb5de37 Merge pull request #3236 from 4Science/task/main/CST-15589 2024-08-08 20:27:15 -07:00
Tim Donohue
ad6a9438de Fix lint error regarding missing interface 2024-08-08 16:49:20 -05:00
Tim Donohue
7a24bf2c7f Merge pull request #3048 from saschaszott/patch-21-squashed
add import of missing Angular interfaces (squashed version)
2024-08-08 16:33:50 -05:00
Tim Donohue
84b32b70a5 Merge pull request #3235 from saschaszott/patch-26
Missing translations in de.json5 (translation key prefix workspace-item)
2024-08-07 14:18:08 -05:00
Tim Donohue
f719fde602 Merge pull request #3234 from saschaszott/patch-25
WorkspaceitemsEditPageModule: remove duplicated delete route
2024-08-07 14:14:48 -05:00
Sascha Szott
92dcffcba1 fix space issue 2024-08-07 16:57:02 +02:00
Sascha Szott
45c018f5f6 added missing translations in de.json5 (prefix workspace-item) 2024-08-07 16:50:17 +02:00
Sascha Szott
cddceadea1 remove duplicated delete route 2024-08-07 16:05:17 +02:00
Simone Ramundi
56ba23fc3d [CST-15589] Updated slider implementation in template 2024-08-07 14:30:44 +02:00
Simone Ramundi
6c2d541b89 [CST-15589] Updated slider implementation in SearchRangeFilterComponent 2024-08-07 14:30:24 +02:00
Christian Clauss
bfd61b2f19 Fix typos discovered by codespell 2024-08-06 15:52:15 +02:00
kshepherd
e7f235a90b Merge pull request #3230 from Neki-IT/FileBrowserForImportingMetadata
Improving the file browser for importing metadata
2024-08-03 17:31:25 +02:00
root
ce2abfe584 Improving the file browser for importing metadata 2024-08-01 13:04:17 -03:00
kshepherd
a6e3bc3e41 Merge pull request #3220 from Neki-IT/EnablingNavbarLinksInImportSection
Enabling navbar links in import section
2024-08-01 15:46:44 +02:00
root
2c259f5ae9 A new approach so that the elements of the ds-file-dropzone-no-uploader component don't overlap the navbar and make it inaccessible 2024-07-30 17:20:47 -03:00
milanmajchrak
7e864d27b4 Fixed linting error. 2024-07-26 15:49:37 +02:00
milanmajchrak
b10563ea53 Updated some messages following the lindat v5 and clarin-dspace v7 instance. 2024-07-26 15:32:57 +02:00
Alexandre Vryghem
7d5ae8e209 Merge branch 'w2p-116728_removed-unnecessary-ngvars_contribute-7.6' into w2p-116728_removed-unnecessary-ngvars_contribute-main
# Conflicts:
#	src/app/thumbnail/thumbnail.component.ts
2024-07-26 14:56:41 +02:00
root
351abaa5c2 Removing position-fixed bootstrap class so that navbar links are available again 2024-07-25 10:44:00 -03:00
kshepherd
6657b46a6b Merge pull request #3112 from 4Science/task/main/DURACOM-273
[#3111] fix markdown rendering applying before mathjax rendering
2024-07-25 14:42:25 +02:00
autavares-dev
6cb4faa8d3 Fix truncatable-part keyboard accessibility 2024-07-22 21:20:05 -03:00
Alisa Ismailati
fa0ec0bf0c [CST-15590] Close user profile menu after menu entry is selected 2024-07-19 16:43:39 +02:00
Alisa Ismailati
703945c804 [CST-15591] Fixed headings by their rank 2024-07-19 14:54:39 +02:00
Ricardo Saraiva
43071da3eb Update pt-PT.json5
Lint errors review.
2024-07-18 14:20:55 +01:00
Ricardo Saraiva
2c20833410 Update pt-PT.json5
Extensive revision of i18n pt-PT with the news translation strings introduced by DSpace v8.0 and other improvements > last updated 18th of july 2024.
2024-07-18 14:06:48 +01:00
Andrea Barbasso
84069055f5 [CST-15593] migrate from klaro to orejime 2024-07-18 11:51:47 +02:00
root
8c60a67e8e Fixing trailing spaces error 2024-07-17 17:09:58 -03:00
root
d252108f85 Keys for the notifications menu section translated into Spanish 2024-07-17 16:14:09 -03:00
Andrea-Guevara
3ba8019872 Merge branch 'DSpace:main' into SpanishTranslationKeys 2024-07-17 16:06:13 -03:00
Tim Donohue
1efa88641b Merge pull request #3186 from saschaszott/patch-24
Docker build: fix FromAsCasing warning
2024-07-17 11:29:28 -05:00
root
65ce727157 Issue-2913 Keys that refer to the research translated into Spanish 2024-07-17 12:46:35 -03:00
Tim Donohue
941dbe2871 Merge pull request #3172 from pastr/minor-fr-i18n-fix
Minor fix in french translation file
2024-07-17 10:22:59 -05:00
Sascha Szott
f4fe2b8632 fix FromAsCasing warning 2024-07-17 15:42:48 +02:00
root
3800021ed3 Issue-1190/PR-3148 Removing 100% height from the column containing the button text and leaving it automatic 2024-07-15 09:30:20 -03:00
Emmanuel
8eec2cdccb Fix a french translation for consistency 2024-07-12 19:37:47 +02:00
Tim Donohue
f195484674 Update pull_request_template.md
Add note that PRs should be against main, if possible.
2024-07-11 14:57:25 -05:00
root
5f4a049fdd Issue-1190/PR-3148 Improve the space between the text and the button 2024-07-11 15:51:33 -03:00
Vincenzo Mecca
4ff15ec9bb [CST-14903] Orcid Synchronization improvements
feat:
- Introduces reactive states derived from item inside orcid-sync page
- Removes unnecessary navigation
ref:
- Introduces catchError operator and handles failures with error messages
2024-07-11 14:48:00 +02:00
Tim Donohue
ddbcfa0268 Merge pull request #3166 from balmas/docker-entities-fix
fixes image path for dspace-postgres-pgcrypto
2024-07-10 16:34:37 -05:00
Tim Donohue
c6ee4a477f Merge pull request #3146 from atmire/w2p-116132_fixed-cookie-issues_contribute-8
Fixed bug when declining Google ReCaptcha cookie preferences
2024-07-10 15:23:11 -05:00
Tim Donohue
5a62342251 Merge pull request #3155 from Neki-IT/ItemEditMetadataTab
Accessibility on the Edit metadata tab
2024-07-10 14:52:59 -05:00
Tim Donohue
ef89e3a9e3 Merge tag 'dspace-7.6.2' 2024-07-09 15:00:28 -05:00
Sascha Szott
2af168bd54 add missing German translations 2024-07-09 17:56:06 +02:00
Sascha Szott
e26ab86dd3 minor change: added missing periods in German translations 2024-07-09 17:42:49 +02:00
Emmanuel Pastor
eec1071f06 Rephrase one instruction sentence to make it clearer 2024-07-07 16:05:44 +02:00
Emmanuel Pastor
ecacd14410 Fix a french translation for consistency 2024-07-07 16:04:14 +02:00
Bridget Almas
7e600bef57 fixes error in image command for dspace-postgres-pgcrypto 2024-07-05 13:00:22 -04:00
Abel Gómez
583dc1f368 Fix SubComColSectionComponent test 2024-07-04 17:25:00 +02:00
Abel Gómez
4de99ba19d Refactor condition 2024-07-04 06:03:07 +02:00
Abel Gómez
6306776f8b Simplify code detecting a navigation to the default route 2024-07-04 05:55:15 +02:00
Abel Gómez
531d328663 Fix resolving the wrong segment of the route in the comcol search component 2024-07-04 05:36:49 +02:00
Abel Gómez
6cecd0abbe Fix imports 2024-07-04 00:48:48 +02:00
Abel Gómez
b49216c173 Fix trailing spaces 2024-07-04 00:11:53 +02:00
Abel Gómez
b7f3711de1 Other minor lint fixes 2024-07-04 00:05:03 +02:00
Abel Gómez
33764f4caa Minor fixes to avoid lint errors 2024-07-03 23:55:37 +02:00
Abel Gómez
961e15fe5f Make the default tab for browsing communities and collections configurable 2024-07-03 23:33:38 +02:00
Tim Donohue
c3a26ea89e Merge pull request #3158 from pilasou/pilasou-docker-compose-syntax-change
Docker compose syntax changes
2024-07-03 13:55:26 -05:00
Tim Donohue
6695cf44fa Merge pull request #3156 from DSpace/backport-3152-to-main
[Port main] Forward client's user-agent instead of Node's
2024-07-03 13:48:00 -05:00
Pierre Lasou
da8a73ba0b Update docker command syntax docker-compose-rest.yml 2024-07-03 11:26:22 -04:00
Pierre Lasou
5e3d0fbdef Update Docker Angular README.md
Change the docker-compose syntax to V2 syntax docker compose
2024-07-03 11:22:27 -04:00
Alan Orth
c06cd98a2e src/app/core: forward client user-agent
Forward the client's user-agent instead of sending Node's.

(cherry picked from commit 5b2966cf48)
2024-07-03 05:54:45 +00:00
root
4e783e76d1 Resolution of issue #1193 - Addition of the aria-label attribute to the add, save, discard and undo buttons on the metadata editing page 2024-07-01 15:00:07 -03:00
Elvi Nemiz
a3b6aef66a Fix to Mobile navbar hamburger menu for base (custom) theme
https://github.com/DSpace/dspace-angular/pull/2444 only fixes the DSpace theme, not the base (and custom) theme.
2024-06-29 08:14:10 +08:00
Tim Donohue
77081e80c3 Merge pull request #3151 from tdonohue/update_contributing
[GitHub Config] Minor updates to Contribution docs & issue/PR templates
2024-06-27 15:21:31 -05:00
Tim Donohue
9277908f77 Minor updates to issue templates. Instead of bold text, use headers to make sections more readable. 2024-06-27 14:37:04 -05:00
Tim Donohue
9a5cbba888 Minor updates to contribution checklist / PR template. Add requirement that PRs need details on how to test them. Add requirement for accessibility & i18n. 2024-06-27 14:36:15 -05:00
Tim Donohue
f7a2e76cad Update CONTRIBUTING.md
Minor updates and linking to developer meetings
2024-06-27 11:12:21 -05:00
Tim Donohue
a0e23bd5d9 Update homepage to say DSpace 9 2024-06-26 15:22:21 -05:00
Tim Donohue
e95d5bd73e Update version tag for development of next major release 2024-06-26 14:05:49 -05:00
Sascha Szott
5f6b6ef984 added missing German translations (500 error) 2024-06-26 14:46:13 +02:00
root
e06b67fd73 Resolution of issue #1190 - Improving the accessibility of the status page using the item-operation component 2024-06-26 08:29:32 -03:00
Mohamed Ali
f5f40c3dc7 Update Arabic Translation
Update Arabic Translation

Update  ar.json5 translation
2024-06-26 00:51:14 -07:00
Yana De Pauw
105547598f 115284: Add repeatable based on relationship max cardinality 2024-06-26 08:42:07 +02:00
lotte
78e5f66144 Merge branch 'w2p-116132_fixed-cookie-issues_contribute-7.6' 2024-06-25 18:30:27 +02:00
Sascha Szott
2d9ad8e5cf add missing imports of Angular lifecycle interfaces 2024-06-13 13:46:57 +02:00
Sascha Szott
3cedeffec9 add missing comma 2024-06-13 13:12:35 +02:00
Sascha Szott
cc975bb0b5 add lint rule (use-lifecycle-interface) 2024-06-13 13:07:51 +02:00
Sascha Szott
a0e7e2c617 Merge branch 'DSpace:main' into patch-21-squashed 2024-06-13 13:05:22 +02:00
Andrea Barbasso
66e1a2488b [DURACOM-273] fix markdown rendering applying before mathjax rendering 2024-06-11 15:43:40 +02:00
Alexandre Vryghem
25e2e291cb Merge remote-tracking branch 'w2p-115051_themed-admin-search-page_contribute-7.4' into new-themed-components_contribute-main
# Conflicts:
#	src/app/admin/admin-routing.module.ts
#	src/app/admin/admin-workflow-page/admin-workflow.module.ts
#	src/themes/custom/lazy-theme.module.ts
2024-05-24 15:47:26 +02:00
Alexandre Vryghem
61e52cd2ab Fixed navbar overflowing over breadcrumbs in mobile mode in custom theme 2024-05-21 13:26:19 +02:00
Alexandre Vryghem
89e4d3b9da Merge branch 'w2p-115051_themed-admin-search-page_contribute-7.4' into new-themed-components_contribute-main
# Conflicts:
#	src/app/admin/admin-routing.module.ts
#	src/app/admin/admin-search-page/admin-search.module.ts
#	src/themes/custom/lazy-theme.module.ts
2024-05-21 13:20:24 +02:00
Sascha Szott
96748b9bac added missing interfaces 2024-05-15 10:49:05 +02:00
Michael Spalti
4a236906eb Updated browser init to update cache after external auth. 2024-05-09 12:45:03 -07:00
Alexandre Vryghem
8166c2ebfa Merge remote-tracking branch 'upstream/main' into w2p-108608_created-search-scope-selector_contribute-main
# Conflicts:
#	src/app/shared/search-form/scope-selector-modal/scope-selector-modal.component.ts
2024-03-09 04:30:31 +01:00
Alexandre Vryghem
30aa34d1c0 Merge branch 'w2p-108608_created-search-scope-selector_contribute-7.2' into w2p-108608_created-search-scope-selector_contribute-main
# Conflicts:
#	src/app/core/shared/context.model.ts
#	src/app/shared/search-form/scope-selector-modal/scope-selector-modal.component.html
#	src/app/shared/search-form/scope-selector-modal/scope-selector-modal.component.ts
2023-11-22 16:45:33 +01:00
Alexandre Vryghem
9c3e3d9c29 108608: Created new ScopeSelectorModal & ScopeSelectorModalCurrent context 2023-11-22 14:51:17 +01:00
1558 changed files with 74698 additions and 176092 deletions

View File

@@ -25,4 +25,6 @@ npm-debug.log.*
# Webpack files
webpack.records.json
package-lock.json
# Yarn no longer used
yarn.lock

View File

@@ -12,6 +12,7 @@
"eslint-plugin-rxjs",
"eslint-plugin-simple-import-sort",
"eslint-plugin-import-newlines",
"eslint-plugin-jsonc",
"dspace-angular-ts",
"dspace-angular-html"
],
@@ -293,7 +294,8 @@
"rules": {
// Custom DSpace Angular rules
"dspace-angular-html/themed-component-usages": "error",
"dspace-angular-html/no-disabled-attribute-on-button": "error"
"dspace-angular-html/no-disabled-attribute-on-button": "error",
"@angular-eslint/template/prefer-control-flow": "error"
}
},
{
@@ -301,13 +303,10 @@
"*.json5"
],
"extends": [
"plugin:jsonc/recommended-with-json5"
"plugin:jsonc/recommended-with-jsonc"
],
"rules": {
// The ESLint core no-irregular-whitespace rule doesn't work well in JSON
// See: https://ota-meshi.github.io/eslint-plugin-jsonc/rules/no-irregular-whitespace.html
"no-irregular-whitespace": "off",
"jsonc/no-irregular-whitespace": "error",
"no-irregular-whitespace": "error",
"no-trailing-spaces": "error",
"jsonc/comma-dangle": [
"error",

View File

@@ -7,16 +7,16 @@ assignees: ''
---
**Describe the bug**
## Describe the bug
A clear and concise description of what the bug is. Include the version(s) of DSpace where you've seen this problem & what *web browser* you were using. Link to examples if they are public.
**To Reproduce**
## To Reproduce
Steps to reproduce the behavior:
1. Do this
2. Then this...
**Expected behavior**
## Expected behavior
A clear and concise description of what you expected to happen.
**Related work**
## Related work
Link to any related tickets or PRs here.

View File

@@ -7,14 +7,14 @@ assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
## Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem or use case is. For example, I'm always frustrated when [...]
**Describe the solution you'd like**
## Describe the solution you'd like
A clear and concise description of what you want to happen.
**Describe alternatives or workarounds you've considered**
## Describe alternatives or workarounds you've considered
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
## Additional information
Add any other information, related tickets or screenshots about the feature request here.

298
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,298 @@
#-------------------
# DSpace's dependabot rules. Enables npm updates for all dependencies on a weekly basis
# for main and any maintenance branches. Security updates only apply to main.
#-------------------
version: 2
updates:
###############
## Main branch
###############
# NOTE: At this time, "security-updates" rules only apply if "target-branch" is unspecified
# So, only this first section can include "applies-to: security-updates"
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
# Allow up to 10 open PRs for dependencies
open-pull-requests-limit: 10
# Group together Angular package upgrades
groups:
# Group together all minor/patch version updates for Angular in a single PR
angular:
applies-to: version-updates
patterns:
- "@angular*"
update-types:
- "minor"
- "patch"
# Group together all security updates for Angular. Only accept minor/patch types.
angular-security:
applies-to: security-updates
patterns:
- "@angular*"
update-types:
- "minor"
- "patch"
# Group together all minor/patch version updates for NgRx in a single PR
ngrx:
applies-to: version-updates
patterns:
- "@ngrx*"
update-types:
- "minor"
- "patch"
# Group together all security updates for NgRx. Only accept minor/patch types.
ngrx-security:
applies-to: security-updates
patterns:
- "@ngrx*"
update-types:
- "minor"
- "patch"
# Group together all patch version updates for eslint in a single PR
eslint:
applies-to: version-updates
patterns:
- "@typescript-eslint*"
- "eslint*"
update-types:
- "minor"
- "patch"
# Group together all security updates for eslint.
eslint-security:
applies-to: security-updates
patterns:
- "@typescript-eslint*"
- "eslint*"
update-types:
- "minor"
- "patch"
# Group together any testing related version updates
testing:
applies-to: version-updates
patterns:
- "@cypress*"
- "axe-*"
- "cypress*"
- "jasmine*"
- "karma*"
- "ng-mocks"
update-types:
- "minor"
- "patch"
# Group together any testing related security updates
testing-security:
applies-to: security-updates
patterns:
- "@cypress*"
- "axe-*"
- "cypress*"
- "jasmine*"
- "karma*"
- "ng-mocks"
update-types:
- "minor"
- "patch"
# Group together any postcss related version updates
postcss:
applies-to: version-updates
patterns:
- "postcss*"
update-types:
- "minor"
- "patch"
# Group together any postcss related security updates
postcss-security:
applies-to: security-updates
patterns:
- "postcss*"
update-types:
- "minor"
- "patch"
# Group together any sass related version updates
sass:
applies-to: version-updates
patterns:
- "sass*"
update-types:
- "minor"
- "patch"
# Group together any sass related security updates
sass-security:
applies-to: security-updates
patterns:
- "sass*"
update-types:
- "minor"
- "patch"
# Group together any webpack related version updates
webpack:
applies-to: version-updates
patterns:
- "webpack*"
update-types:
- "minor"
- "patch"
# Group together any webpack related seurity updates
webpack-security:
applies-to: security-updates
patterns:
- "webpack*"
update-types:
- "minor"
- "patch"
ignore:
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
- dependency-name: "*"
update-types: ["version-update:semver-major"]
#####################
## dspace-8_x branch
#####################
- package-ecosystem: "npm"
directory: "/"
target-branch: dspace-8_x
schedule:
interval: "weekly"
# Allow up to 10 open PRs for dependencies
open-pull-requests-limit: 10
# Group together Angular package upgrades
groups:
# Group together all patch version updates for Angular in a single PR
angular:
applies-to: version-updates
patterns:
- "@angular*"
update-types:
- "minor"
- "patch"
# Group together all minor/patch version updates for NgRx in a single PR
ngrx:
applies-to: version-updates
patterns:
- "@ngrx*"
update-types:
- "minor"
- "patch"
# Group together all patch version updates for eslint in a single PR
eslint:
applies-to: version-updates
patterns:
- "@typescript-eslint*"
- "eslint*"
update-types:
- "minor"
- "patch"
# Group together any testing related version updates
testing:
applies-to: version-updates
patterns:
- "@cypress*"
- "axe-*"
- "cypress*"
- "jasmine*"
- "karma*"
- "ng-mocks"
update-types:
- "minor"
- "patch"
# Group together any postcss related version updates
postcss:
applies-to: version-updates
patterns:
- "postcss*"
update-types:
- "minor"
- "patch"
# Group together any sass related version updates
sass:
applies-to: version-updates
patterns:
- "sass*"
update-types:
- "minor"
- "patch"
# Group together any webpack related version updates
webpack:
applies-to: version-updates
patterns:
- "webpack*"
update-types:
- "minor"
- "patch"
ignore:
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
- dependency-name: "*"
update-types: ["version-update:semver-major"]
#####################
## dspace-7_x branch
#####################
- package-ecosystem: "npm"
directory: "/"
target-branch: dspace-7_x
schedule:
interval: "weekly"
# Allow up to 10 open PRs for dependencies
open-pull-requests-limit: 10
# Group together Angular package upgrades
groups:
# Group together all minor/patch version updates for Angular in a single PR
angular:
applies-to: version-updates
patterns:
- "@angular*"
update-types:
- "minor"
- "patch"
# Group together all minor/patch version updates for NgRx in a single PR
ngrx:
applies-to: version-updates
patterns:
- "@ngrx*"
update-types:
- "minor"
- "patch"
# Group together all patch version updates for eslint in a single PR
eslint:
applies-to: version-updates
patterns:
- "@typescript-eslint*"
- "eslint*"
update-types:
- "minor"
- "patch"
# Group together any testing related version updates
testing:
applies-to: version-updates
patterns:
- "@cypress*"
- "axe-*"
- "cypress*"
- "jasmine*"
- "karma*"
- "ng-mocks"
update-types:
- "minor"
- "patch"
# Group together any postcss related version updates
postcss:
applies-to: version-updates
patterns:
- "postcss*"
update-types:
- "minor"
- "patch"
# Group together any sass related version updates
sass:
applies-to: version-updates
patterns:
- "sass*"
update-types:
- "minor"
- "patch"
ignore:
# 7.x Cannot update Webpack past v5.76.1 as later versions not supported by Angular 15
# See also https://github.com/DSpace/dspace-angular/pull/3283#issuecomment-2372488489
- dependency-name: "webpack"
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
- dependency-name: "*"
update-types: ["version-update:semver-major"]

View File

@@ -1,7 +1,7 @@
## References
_Add references/links to any related issues or PRs. These may include:_
* Fixes #`issue-number` (if this fixes an issue ticket)
* Requires DSpace/DSpace#`pr-number` (if a REST API PR is required to test this)
* Fixes #issue-number (if this fixes an issue ticket)
* Requires DSpace/DSpace#pr-number (if a REST API PR is required to test this)
## Description
Short summary of changes (1-2 sentences).
@@ -16,13 +16,18 @@ List of changes in this PR:
**Include guidance for how to test or review your PR.** This may include: steps to reproduce a bug, screenshots or description of a new feature, or reasons behind specific changes.
## Checklist
_This checklist provides a reminder of what we are going to look for when reviewing your PR. You need not complete this checklist prior to creating your PR (draft PRs are always welcome). If you are unsure about an item in the checklist, don't hesitate to ask. We're here to help!_
_This checklist provides a reminder of what we are going to look for when reviewing your PR. You do not need to complete this checklist prior creating your PR (draft PRs are always welcome).
However, reviewers may request that you complete any actions in this list if you have not done so. If you are unsure about an item in the checklist, don't hesitate to ask. We're here to help!_
- [ ] My PR is small in size (e.g. less than 1,000 lines of code, not including comments & specs/tests), or I have provided reasons as to why that's not possible.
- [ ] My PR passes [ESLint](https://eslint.org/) validation using `yarn lint`
- [ ] My PR doesn't introduce circular dependencies (verified via `yarn check-circ-deps`)
- [ ] My PR includes [TypeDoc](https://typedoc.org/) comments for _all new (or modified) public methods and classes_. It also includes TypeDoc for large or complex private methods.
- [ ] My PR passes all specs/tests and includes new/updated specs or tests based on the [Code Testing Guide](https://wiki.lyrasis.org/display/DSPACE/Code+Testing+Guide).
- [ ] My PR is **created against the `main` branch** of code (unless it is a backport or is fixing an issue specific to an older branch).
- [ ] My PR is **small in size** (e.g. less than 1,000 lines of code, not including comments & specs/tests), or I have provided reasons as to why that's not possible.
- [ ] My PR **passes [ESLint](https://eslint.org/)** validation using `npm run lint`
- [ ] My PR **doesn't introduce circular dependencies** (verified via `npm run check-circ-deps`)
- [ ] My PR **includes [TypeDoc](https://typedoc.org/) comments** for _all new (or modified) public methods and classes_. It also includes TypeDoc for large or complex private methods.
- [ ] My PR **passes all specs/tests and includes new/updated specs or tests** based on the [Code Testing Guide](https://wiki.lyrasis.org/display/DSPACE/Code+Testing+Guide).
- [ ] My PR **aligns with [Accessibility guidelines](https://wiki.lyrasis.org/display/DSDOC8x/Accessibility)** if it makes changes to the user interface.
- [ ] My PR **uses i18n (internationalization) keys** instead of hardcoded English text, to allow for translations.
- [ ] My PR **includes details on how to test it**. I've provided clear instructions to reviewers on how to successfully test this fix or feature.
- [ ] If my PR includes new libraries/dependencies (in `package.json`), I've made sure their licenses align with the [DSpace BSD License](https://github.com/DSpace/DSpace/blob/main/LICENSE) based on the [Licensing of Contributions](https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines#CodeContributionGuidelines-LicensingofContributions) documentation.
- [ ] If my PR includes new features or configurations, I've provided basic technical documentation in the PR itself.
- [ ] If my PR fixes an issue ticket, I've [linked them together](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue).

View File

@@ -29,8 +29,6 @@ jobs:
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
# Disable the cookie consent banner in e2e tests to avoid errors because of elements hidden by it
DSPACE_INFO_ENABLECOOKIECONSENTPOPUP: false
# 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"
@@ -75,39 +73,39 @@ jobs:
fi
google-chrome --version
# https://github.com/actions/cache/blob/main/examples.md#node---yarn
- name: Get Yarn cache directory
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
- name: Cache Yarn dependencies
# https://github.com/actions/cache/blob/main/examples.md#node---npm
- name: Get NPM cache directory
id: npm-cache-dir
run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT
- name: Cache NPM dependencies
uses: actions/cache@v4
with:
# Cache entire Yarn cache directory (see previous step)
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
# Cache key is hash of yarn.lock. Therefore changes to yarn.lock will invalidate cache
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: ${{ runner.os }}-yarn-
# Cache entire NPM cache directory (see previous step)
path: ${{ steps.npm-cache-dir.outputs.dir }}
# Cache key is hash of package-lock.json. Therefore changes to package-lock.json will invalidate cache
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
restore-keys: ${{ runner.os }}-npm-
- name: Install Yarn dependencies
run: yarn install --frozen-lockfile
- name: Install NPM dependencies
run: npm clean-install
- name: Build lint plugins
run: yarn run build:lint
run: npm run build:lint
- name: Run lint plugin tests
run: yarn run test:lint:nobuild
run: npm run test:lint:nobuild
- name: Run lint
run: yarn run lint:nobuild --quiet
run: npm run lint:nobuild -- --quiet
- name: Check for circular dependencies
run: yarn run check-circ-deps
run: npm run check-circ-deps
- name: Run build
run: yarn run build:prod
run: npm run build:prod
- name: Run specs (unit tests)
run: yarn run test:headless
run: npm 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)
@@ -145,7 +143,7 @@ jobs:
# Run tests in Chrome, headless mode (default)
browser: chrome
# Start app before running tests (will be stopped automatically after tests finish)
start: yarn run serve:ssr
start: npm run serve:ssr
# Wait for backend & frontend to be available
# NOTE: We use the 'sites' REST endpoint to also ensure the database is ready
wait-on: http://127.0.0.1:8080/server/api/core/sites, http://127.0.0.1:4000
@@ -181,7 +179,7 @@ jobs:
# Start up the app with SSR enabled (run in background)
- name: Start app in SSR (server-side rendering) mode
run: |
nohup yarn run serve:ssr &
nohup npm run serve:ssr &
printf 'Waiting for app to start'
until curl --output /dev/null --silent --head --fail http://127.0.0.1:4000/home; do
printf '.'
@@ -192,115 +190,12 @@ jobs:
# Get homepage and verify that the <meta name="title"> tag includes "DSpace".
# If it does, then SSR is working, as this tag is created by our MetadataService.
# This step also prints entire HTML of homepage for easier debugging if grep fails.
- name: Verify SSR (server-side rendering) on Homepage
- name: Verify SSR (server-side rendering)
run: |
result=$(wget -O- -q http://127.0.0.1:4000/home)
echo "$result"
echo "$result" | grep -oE "<meta name=\"title\" [^>]*>" | grep DSpace
# Get a specific community in our test data and verify that the "<h1>" tag includes "Publications" (the community name).
# If it does, then SSR is working.
- name: Verify SSR on a Community page
run: |
result=$(wget -O- -q http://127.0.0.1:4000/communities/0958c910-2037-42a9-81c7-dca80e3892b4)
echo "$result"
echo "$result" | grep -oE "<h1 [^>]*>[^><]*</h1>" | grep Publications
# Get a specific collection in our test data and verify that the "<h1>" tag includes "Articles" (the collection name).
# If it does, then SSR is working.
- name: Verify SSR on a Collection page
run: |
result=$(wget -O- -q http://127.0.0.1:4000/collections/282164f5-d325-4740-8dd1-fa4d6d3e7200)
echo "$result"
echo "$result" | grep -oE "<h1 [^>]*>[^><]*</h1>" | grep Articles
# Get a specific publication in our test data and verify that the <meta name="title"> tag includes
# the title of this publication. If it does, then SSR is working.
- name: Verify SSR on a Publication page
run: |
result=$(wget -O- -q http://127.0.0.1:4000/entities/publication/6160810f-1e53-40db-81ef-f6621a727398)
echo "$result"
echo "$result" | grep -oE "<meta name=\"title\" [^>]*>" | grep "An Economic Model of Mortality Salience"
# Get a specific person in our test data and verify that the <meta name="title"> tag includes
# the name of the person. If it does, then SSR is working.
- name: Verify SSR on a Person page
run: |
result=$(wget -O- -q http://127.0.0.1:4000/entities/person/b1b2c768-bda1-448a-a073-fc541e8b24d9)
echo "$result"
echo "$result" | grep -oE "<meta name=\"title\" [^>]*>" | grep "Simmons, Cameron"
# Get a specific project in our test data and verify that the <meta name="title"> tag includes
# the name of the project. If it does, then SSR is working.
- name: Verify SSR on a Project page
run: |
result=$(wget -O- -q http://127.0.0.1:4000/entities/project/46ccb608-a74c-4bf6-bc7a-e29cc7defea9)
echo "$result"
echo "$result" | grep -oE "<meta name=\"title\" [^>]*>" | grep "University Research Fellowship"
# Get a specific orgunit in our test data and verify that the <meta name="title"> tag includes
# the name of the orgunit. If it does, then SSR is working.
- name: Verify SSR on an OrgUnit page
run: |
result=$(wget -O- -q http://127.0.0.1:4000/entities/orgunit/9851674d-bd9a-467b-8d84-068deb568ccf)
echo "$result"
echo "$result" | grep -oE "<meta name=\"title\" [^>]*>" | grep "Law and Development"
# Get a specific journal in our test data and verify that the <meta name="title"> tag includes
# the name of the journal. If it does, then SSR is working.
- name: Verify SSR on a Journal page
run: |
result=$(wget -O- -q http://127.0.0.1:4000/entities/journal/d4af6c3e-53d0-4757-81eb-566f3b45d63a)
echo "$result"
echo "$result" | grep -oE "<meta name=\"title\" [^>]*>" | grep "Environmental &amp; Architectural Phenomenology"
# Get a specific journal volume in our test data and verify that the <meta name="title"> tag includes
# the name of the volume. If it does, then SSR is working.
- name: Verify SSR on a Journal Volume page
run: |
result=$(wget -O- -q http://127.0.0.1:4000/entities/journalvolume/07c6249f-4bf7-494d-9ce3-6ffdb2aed538)
echo "$result"
echo "$result" | grep -oE "<meta name=\"title\" [^>]*>" | grep "Environmental &amp; Architectural Phenomenology Volume 28 (2017)"
# Get a specific journal issue in our test data and verify that the <meta name="title"> tag includes
# the name of the issue. If it does, then SSR is working.
- name: Verify SSR on a Journal Issue page
run: |
result=$(wget -O- -q http://127.0.0.1:4000/entities/journalissue/44c29473-5de2-48fa-b005-e5029aa1a50b)
echo "$result"
echo "$result" | grep -oE "<meta name=\"title\" [^>]*>" | grep "Environmental &amp; Architectural Phenomenology Vol. 28, No. 1"
# Verify 301 Handle redirect behavior
# Note: /handle/123456789/260 is the same test Publication used by our e2e tests
- name: Verify 301 redirect from '/handle' URLs
run: |
result=$(wget --server-response --quiet http://127.0.0.1:4000/handle/123456789/260 2>&1 | head -1 | awk '{print $2}')
echo "$result"
[[ "$result" -eq "301" ]]
# Verify 403 error code behavior
- name: Verify 403 error code from '/403'
run: |
result=$(wget --server-response --quiet http://127.0.0.1:4000/403 2>&1 | head -1 | awk '{print $2}')
echo "$result"
[[ "$result" -eq "403" ]]
# Verify 404 error code behavior
- name: Verify 404 error code from '/404' and on invalid pages
run: |
result=$(wget --server-response --quiet http://127.0.0.1:4000/404 2>&1 | head -1 | awk '{print $2}')
echo "$result"
result2=$(wget --server-response --quiet http://127.0.0.1:4000/invalidurl 2>&1 | head -1 | awk '{print $2}')
echo "$result2"
[[ "$result" -eq "404" && "$result2" -eq "404" ]]
# Verify 500 error code behavior
- name: Verify 500 error code from '/500'
run: |
result=$(wget --server-response --quiet http://127.0.0.1:4000/500 2>&1 | head -1 | awk '{print $2}')
echo "$result"
[[ "$result" -eq "500" ]]
- name: Stop running app
run: kill -9 $(lsof -t -i:4000)

View File

@@ -40,14 +40,14 @@ jobs:
# Initializes the CodeQL tools for scanning.
# https://github.com/github/codeql-action
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v2
with:
languages: javascript
# Autobuild attempts to build any compiled languages
- name: Autobuild
uses: github/codeql-action/autobuild@v3
uses: github/codeql-action/autobuild@v2
# Perform GitHub Code Scanning.
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v2

4
.gitignore vendored
View File

@@ -28,12 +28,12 @@ webpack.records.json
morgan.log
# Yarn no longer used
yarn.lock
yarn-error.log
*.css
package-lock.json
.java-version
.env

View File

@@ -10,7 +10,7 @@ DSpace is a community built and supported project. We do not have a centralized
## Contribute new code via a Pull Request
We accept [GitHub Pull Requests (PRs)](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork) at any time from anyone.
Contributors to each release are recognized in our [Release Notes](https://wiki.lyrasis.org/display/DSDOC7x/Release+Notes).
Contributors to each release are recognized in our [Release Notes](https://wiki.lyrasis.org/display/DSDOC8x/Release+Notes).
Code Contribution Checklist
- [ ] PRs _should_ be smaller in size (ideally less than 1,000 lines of code, not including comments & tests)
@@ -18,6 +18,9 @@ Code Contribution Checklist
- [ ] PRs **must** not introduce circular dependencies (verified via `yarn check-circ-deps`)
- [ ] PRs **must** include [TypeDoc](https://typedoc.org/) comments for _all new (or modified) public methods and classes_. Large or complex private methods should also have TypeDoc.
- [ ] PRs **must** pass all automated pecs/tests and includes new/updated specs or tests based on the [Code Testing Guide](https://wiki.lyrasis.org/display/DSPACE/Code+Testing+Guide).
- [ ] User interface changes **must** align with [Accessibility guidelines](https://wiki.lyrasis.org/display/DSDOC8x/Accessibility)
- [ ] PRs **must** use i18n (internationalization) keys instead of hardcoded English text, to allow for translations.
- [ ] Details on how to test the PR **must** be provided. Reviewers must be aware of any steps they need to take to successfully test your fix or feature.
- [ ] If a PR includes new libraries/dependencies (in `package.json`), then their software licenses **must** align with the [DSpace BSD License](https://github.com/DSpace/dspace-angular/blob/main/LICENSE) based on the [Licensing of Contributions](https://wiki.lyrasis.org/display/DSPACE/Code+Contribution+Guidelines#CodeContributionGuidelines-LicensingofContributions) documentation.
- [ ] Basic technical documentation _should_ be provided for any new features or configuration, either in the PR itself or in the DSpace Wiki documentation.
- [ ] If a PR fixes an issue ticket, please [link them together](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue).
@@ -26,7 +29,7 @@ Additional details on the code contribution process can be found in our [Code Co
## Contribute documentation
DSpace Documentation is a collaborative effort in a shared Wiki. The latest documentation is at https://wiki.lyrasis.org/display/DSDOC7x
DSpace Documentation is a collaborative effort in a shared Wiki. The latest documentation is at https://wiki.lyrasis.org/display/DSDOC
If you find areas of the DSpace Documentation which you wish to improve, please request a Wiki account by emailing wikihelp@lyrasis.org.
Once you have an account setup, contact @tdonohue (via [Slack](https://wiki.lyrasis.org/display/DSPACE/Slack) or email) for access to edit our Documentation.
@@ -34,7 +37,7 @@ Once you have an account setup, contact @tdonohue (via [Slack](https://wiki.lyra
## Help others on mailing lists or Slack
DSpace has our own [Slack](https://wiki.lyrasis.org/display/DSPACE/Slack) community and [Mailing Lists](https://wiki.lyrasis.org/display/DSPACE/Mailing+Lists) where discussions take place and questions are answered.
Anyone is welcome to join and help others. We just ask you to follow our [Code of Conduct](https://www.lyrasis.org/about/Pages/Code-of-Conduct.aspx) (adopted via LYRASIS).
Anyone is welcome to join and help others. We just ask you to follow our [Code of Conduct](https://www.lyrasis.org/about/Pages/Code-of-Conduct.aspx) (adopted via Lyrasis).
## Join a working or interest group
@@ -42,5 +45,5 @@ Most of the work in building/improving DSpace comes via [Working Groups](https:/
All working/interest groups are open to anyone to join and participate. A few key groups to be aware of include:
* [DSpace 7 Working Group](https://wiki.lyrasis.org/display/DSPACE/DSpace+7+Working+Group) - This is the main (mostly volunteer) development team. We meet weekly to review our current development [project board](https://github.com/orgs/DSpace/projects), assigning tickets and/or PRs.
* [DSpace Community Advisory Team (DCAT)](https://wiki.lyrasis.org/display/cmtygp/DSpace+Community+Advisory+Team) - This is an interest group for repository managers/administrators. We meet monthly to discuss DSpace, share tips & provide feedback back to developers.
* [DSpace Developer Team](https://wiki.lyrasis.org/display/DSPACE/Developer+Meetings) - This is the primary, volunteer development team. We meet weekly to review our current development [project board](https://github.com/orgs/DSpace/projects), assigning tickets and/or PRs. This is also were discussions of the next release or major issues occur. Anyone is welcome to attend.
* [DSpace Community Advisory Team (DCAT)](https://wiki.lyrasis.org/display/cmtygp/DSpace+Community+Advisory+Team) - This is an interest group for repository managers/administrators. We meet monthly to discuss DSpace, share tips & provide feedback back to developers. Anyone is welcome to attend.

View File

@@ -11,9 +11,7 @@ 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
RUN npm install
# 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.
@@ -25,4 +23,4 @@ ENV NODE_OPTIONS="--max_old_space_size=4096"
# NOTE: At this time it is only possible to run Docker container in Production mode
# 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
CMD npm run serve -- --host 0.0.0.0

View File

@@ -2,7 +2,7 @@
# 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-8_x-dist .
# docker build -f Dockerfile.dist -t dspace/dspace-angular:latest-dist .
FROM docker.io/node:18-alpine AS build
@@ -11,11 +11,11 @@ FROM docker.io/node:18-alpine AS build
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
COPY package.json package-lock.json ./
RUN npm install
ADD . /app/
RUN yarn build:prod
RUN npm run build:prod
FROM node:18-alpine
RUN npm install --global pm2

View File

@@ -35,7 +35,7 @@ https://wiki.lyrasis.org/display/DSDOC7x/Installing+DSpace
Quick start
-----------
**Ensure you're running [Node](https://nodejs.org) `v18.x` or `v20.x`, [npm](https://www.npmjs.com/) >= `v10.x` and [yarn](https://yarnpkg.com) == `v1.x`**
**Ensure you're running [Node](https://nodejs.org) `v18.x` or `v20.x`, [npm](https://www.npmjs.com/) >= `v10.x`**
```bash
# clone the repo
@@ -45,10 +45,10 @@ git clone https://github.com/DSpace/dspace-angular.git
cd dspace-angular
# install the local dependencies
yarn install
npm install
# start the server
yarn start
npm start
```
Then go to [http://localhost:4000](http://localhost:4000) in your browser
@@ -77,7 +77,7 @@ Table of Contents
- [Recommended Editors/IDEs](#recommended-editorsides)
- [Collaborating](#collaborating)
- [File Structure](#file-structure)
- [Managing Dependencies (via yarn)](#managing-dependencies-via-yarn)
- [Managing Dependencies (via npm)](#managing-dependencies-via-npm)
- [Frequently asked questions](#frequently-asked-questions)
- [License](#license)
@@ -89,15 +89,15 @@ You can find more information on the technologies used in this project (Angular.
Requirements
------------
- [Node.js](https://nodejs.org) and [yarn](https://yarnpkg.com)
- Ensure you're running node `v18.x` or `v20.x` and yarn == `v1.x`
- [Node.js](https://nodejs.org)
- Ensure you're running node `v18.x` or `v20.x`
If you have [`nvm`](https://github.com/creationix/nvm#install-script) or [`nvm-windows`](https://github.com/coreybutler/nvm-windows) installed, which is highly recommended, you can run `nvm install --lts && nvm use` to install and start using the latest Node LTS.
Installing
----------
- `yarn install` to install the local dependencies
- `npm install` to install the local dependencies
### Configuring
@@ -202,7 +202,7 @@ import { environment } from '../environment.ts';
Running the app
---------------
After you have installed all dependencies you can now run the app. Run `yarn run start:dev` to start a local server which will watch for changes, rebuild the code, and reload the server for you. You can visit it at `http://localhost:4000`.
After you have installed all dependencies you can now run the app. Run `npm run start:dev` to start a local server which will watch for changes, rebuild the code, and reload the server for you. You can visit it at `http://localhost:4000`.
### Running in production mode
@@ -211,20 +211,20 @@ When building for production we're using Ahead of Time (AoT) compilation. With A
To build the app for production and start the server (in one command) run:
```bash
yarn start
npm start
```
This will run the application in an instance of the Express server, which is included.
If you only want to build for production, without starting, run:
```bash
yarn run build:prod
npm run build:prod
```
This will build the application and put the result in the `dist` folder. You can copy this folder to wherever you need it for your application server. If you will be using the built-in Express server, you'll also need a copy of the `node_modules` folder tucked inside your copy of `dist`.
After building the app for production, it can be started by running:
```bash
yarn run serve:ssr
npm run serve:ssr
```
### Running the application with Docker
@@ -238,14 +238,14 @@ Cleaning
--------
```bash
# clean everything, including node_modules. You'll need to run yarn install again afterwards.
yarn run clean
# clean everything, including node_modules. You'll need to run npm install again afterwards.
npm run clean
# clean files generated by the production build (.ngfactory files, css files, etc)
yarn run clean:prod
npm run clean:prod
# cleans the distribution directory
yarn run clean:dist
npm run clean:dist
```
@@ -259,9 +259,9 @@ If you would like to contribute by testing a Pull Request (PR), here's how to do
1. Pull down the branch that the Pull Request was built from. Easy instructions for doing so can be found on the Pull Request itself.
* Next to the "Merge" button, you'll see a link that says "command line instructions".
* Click it, and follow "Step 1" of those instructions to checkout the pull down the PR branch.
2. `yarn run clean` (This resets your local dependencies to ensure you are up-to-date with this PR)
3. `yarn install` (Updates your local dependencies to those in the PR)
4. `yarn start` (Rebuilds the project, and deploys to localhost:4000, by default)
2. `npm run clean` (This resets your local dependencies to ensure you are up-to-date with this PR)
3. `npm install` (Updates your local dependencies to those in the PR)
4. `npm start` (Rebuilds the project, and deploys to localhost:4000, by default)
5. At this point, the code from the PR will be deployed to http://localhost:4000. Test it out, and ensure that it does what is described in the PR (or fixes the bug described in the ticket linked to the PR).
Once you have tested the Pull Request, please add a comment and/or approval to the PR to let us know whether you found it to be successful (or not). Thanks!
@@ -271,13 +271,13 @@ Once you have tested the Pull Request, please add a comment and/or approval to t
Unit tests use the [Jasmine test framework](https://jasmine.github.io/), and are run via [Karma](https://karma-runner.github.io/).
You can find the Karma configuration file at the same level of this README file:`./karma.conf.js` If you are going to use a remote test environment you need to edit the `./karma.conf.js`. Follow the instructions you will find inside it. To executing tests whenever any file changes you can modify the 'autoWatch' option to 'true' and 'singleRun' option to 'false'. A coverage report is also available at: http://localhost:9876/ after you run: `yarn run coverage`.
You can find the Karma configuration file at the same level of this README file:`./karma.conf.js` If you are going to use a remote test environment you need to edit the `./karma.conf.js`. Follow the instructions you will find inside it. To executing tests whenever any file changes you can modify the 'autoWatch' option to 'true' and 'singleRun' option to 'false'. A coverage report is also available at: http://localhost:9876/ after you run: `npm run coverage`.
The default browser is Google Chrome.
Place your tests in the same location of the application source code files that they test, e.g. ending with `*.component.spec.ts`
and run: `yarn test`
and run: `npm test`
If you run into odd test errors, see the Angular guide to debugging tests: https://angular.io/guide/test-debugging
@@ -330,9 +330,9 @@ All E2E tests must be created under the `./cypress/integration/` folder, and mus
* In the [Cypress Test Runner](https://docs.cypress.io/guides/core-concepts/test-runner), you'll Cypress automatically visit the page. This first test will succeed, as all you are doing is making sure the _page exists_.
* From here, you can use the [Selector Playground](https://docs.cypress.io/guides/core-concepts/test-runner#Selector-Playground) in the Cypress Test Runner window to determine how to tell Cypress to interact with a specific HTML element on that page.
* Most commands start by telling Cypress to [get()](https://docs.cypress.io/api/commands/get) a specific element, using a CSS or jQuery style selector
* It's generally best not to rely on attributes like `class` and `id` in tests, as those are likely to change later on. Instead, you can add a `data-test` attribute to makes it clear that it's required for a test.
* It's generally best not to rely on attributes like `class` and `id` in tests, as those are likely to change later on. Instead, you can add a `data-test` attribute to makes it clear that it's required for a test.
* Cypress can then do actions like [click()](https://docs.cypress.io/api/commands/click) an element, or [type()](https://docs.cypress.io/api/commands/type) text in an input field, etc.
* When running with server-side rendering enabled, the client first receives HTML without the JS; only once the page is rendered client-side do some elements (e.g. a button that toggles a Bootstrap dropdown) become fully interactive. This can trip up Cypress in some cases as it may try to `click` or `type` in an element that's not fully loaded yet, causing tests to fail.
* When running with server-side rendering enabled, the client first receives HTML without the JS; only once the page is rendered client-side do some elements (e.g. a button that toggles a Bootstrap dropdown) become fully interactive. This can trip up Cypress in some cases as it may try to `click` or `type` in an element that's not fully loaded yet, causing tests to fail.
* To work around this issue, define the attributes you use for Cypress selectors as `[attr.data-test]="'button' | ngBrowserOnly"`. This will only show the attribute in CSR HTML, forcing Cypress to wait until CSR is complete before interacting with the element.
* Cypress can also validate that something occurs, using [should()](https://docs.cypress.io/api/commands/should) assertions.
* Any time you save your test file, the Cypress Test Runner will reload & rerun it. This allows you can see your results quickly as you write the tests & correct any broken tests rapidly.
@@ -357,14 +357,14 @@ Some UI specific configuration documentation is also found in the [`./docs`](doc
To build the code documentation we use [TYPEDOC](http://typedoc.org). TYPEDOC is a documentation generator for TypeScript projects. It extracts information from properly formatted comments that can be written within the code files. Follow the instructions [here](http://typedoc.org/guides/doccomments/) to know how to make those comments.
Run:`yarn run docs` to produce the documentation that will be available in the 'doc' folder.
Run:`npm run docs` to produce the documentation that will be available in the 'doc' folder.
Other commands
--------------
There are many more commands in the `scripts` section of `package.json`. Most of these are executed by one of the commands mentioned above.
A command with a name that starts with `pre` or `post` will be executed automatically before or after the script with the matching name. e.g. if you type `yarn run start` the `prestart` script will run first, then the `start` script will trigger.
A command with a name that starts with `pre` or `post` will be executed automatically before or after the script with the matching name. e.g. if you type `npm run start` the `prestart` script will run first, then the `start` script will trigger.
Recommended Editors/IDEs
------------------------
@@ -456,6 +456,7 @@ dspace-angular
├── LICENSES_THIRD_PARTY *
├── nodemon.json * Nodemon (https://nodemon.io/) configuration
├── package.json * This file describes the npm package for this project, its dependencies, scripts, etc.
├── package-lock.json * npm lockfile (https://docs.npmjs.com/cli/v10/configuring-npm/package-lock-json)
├── postcss.config.js * PostCSS (http://postcss.org/) configuration
├── README.md * This document
├── SECURITY.md *
@@ -466,30 +467,29 @@ dspace-angular
├── tsconfig.spec.json * TypeScript config for tests
├── tsconfig.ts-node.json * TypeScript config for using ts-node directly
├── tslint.json * TSLint (https://palantir.github.io/tslint/) configuration
── typedoc.json * TYPEDOC configuration
└── yarn.lock * Yarn lockfile (https://yarnpkg.com/en/docs/yarn-lock)
── typedoc.json * TYPEDOC configuration
```
Managing Dependencies (via yarn)
Managing Dependencies (via npm)
-------------
This project makes use of [`yarn`](https://yarnpkg.com/en/) to ensure that the exact same dependency versions are used every time you install it.
This project makes use of [`npm`](https://docs.npmjs.com/about-npm) to ensure that the exact same dependency versions are used every time you install it.
* `yarn` creates a [`yarn.lock`](https://yarnpkg.com/en/docs/yarn-lock) to track those versions. That file is updated automatically by whenever dependencies are added/updated/removed via yarn.
* **Adding new dependencies**: To install/add a new dependency (third party library), use [`yarn add`](https://yarnpkg.com/en/docs/cli/add). For example: `yarn add some-lib`.
* If you are adding a new build tool dependency (to `devDependencies`), use `yarn add some-lib --dev`
* **Upgrading existing dependencies**: To upgrade existing dependencies, you can use [`yarn upgrade`](https://yarnpkg.com/en/docs/cli/upgrade). For example: `yarn upgrade some-lib` or `yarn upgrade some-lib@version`
* **Removing dependencies**: If a dependency is no longer needed, or replaced, use [`yarn remove`](https://yarnpkg.com/en/docs/cli/remove) to remove it.
* `npm` creates a [`package-lock.json`](https://docs.npmjs.com/cli/v10/configuring-npm/package-lock-json) to track those versions. That file is updated automatically by whenever dependencies are added/updated/removed via npm.
* **Adding new dependencies**: To install/add a new dependency (third party library), use [`npm install`](https://docs.npmjs.com/cli/v10/commands/npm-install). For example: `npm install some-lib`.
* If you are adding a new build tool dependency (to `devDependencies`), use `npm install some-lib --save--dev`
* **Upgrading existing dependencies**: To upgrade existing dependencies, you can use [`npm update`](https://docs.npmjs.com/cli/v10/commands/npm-update). For example: `npm update some-lib` or `npm update some-lib@version`
* **Removing dependencies**: If a dependency is no longer needed, or replaced, use [`npm uninstall`](https://docs.npmjs.com/cli/v10/commands/npm-uninstall) to remove it.
As you can see above, using `yarn` commandline tools means that you should never need to modify the `package.json` manually. *We recommend always using `yarn` to keep dependencies updated / in sync.*
As you can see above, using `npm` commandline tools means that you should never need to modify the `package.json` manually. *We recommend always using `npm` to keep dependencies updated / in sync.*
### Adding Typings for libraries
If the library does not include typings, you can install them using yarn:
If the library does not include typings, you can install them using npm:
```bash
yarn add d3
yarn add @types/d3 --dev
npm install d3
npm install @types/d3 --save-dev
```
If the library doesn't have typings available at `@types/`, you can still use it by manually adding typings for it:
@@ -527,13 +527,13 @@ Frequently asked questions
- What are the naming conventions for Angular?
- See [the official angular style guide](https://angular.io/styleguide)
- Why is the size of my app larger in development?
- The production build uses a whole host of techniques (ahead-of-time compilation, rollup to remove unreachable code, minification, etc.) to reduce the size, that aren't used during development in the intrest of build speed.
- node-pre-gyp ERR in yarn install (Windows)
- The production build uses a whole host of techniques (ahead-of-time compilation, rollup to remove unreachable code, minification, etc.) to reduce the size, that aren't used during development in the interest of build speed.
- node-pre-gyp ERR in npm install (Windows)
- install Python x86 version between 2.5 and 3.0 on windows. See [this issue](https://github.com/AngularClass/angular2-webpack-starter/issues/626)
- How do I handle merge conflicts in yarn.lock?
- first check out the yarn.lock file from the branch you're merging in to yours: e.g. `git checkout --theirs yarn.lock`
- now run `yarn install` again. Yarn will create a new lockfile that contains both sets of changes.
- then run `git add yarn.lock` to stage the lockfile for commit
- How do I handle merge conflicts in package-lock.json?
- first check out the package-lock.json file from the branch you're merging in to yours: e.g. `git checkout --theirs package-lock.json`
- now run `npm install` again. NPM will create a new lockfile that contains both sets of changes.
- then run `git add package-lock.json` to stage the lockfile for commit
- and `git commit` to conclude the merge
Getting Help

View File

@@ -58,7 +58,10 @@
"input": "src/themes/dspace/styles/theme.scss",
"inject": false,
"bundleName": "dspace-theme"
}
},
"node_modules/leaflet/dist/leaflet.css",
"node_modules/leaflet.markercluster/dist/MarkerCluster.Default.css",
"node_modules/leaflet.markercluster/dist/MarkerCluster.css"
],
"scripts": [],
"baseHref": "/"

View File

@@ -23,24 +23,10 @@ ssr:
# Determining which styles are critical is a relatively expensive operation; this option is
# disabled (false) by default to boost server performance at the expense of loading smoothness.
inlineCriticalCss: false
# Patterns to be run as regexes against the path of the page to check if SSR is allowed.
# If the path match any of the regexes it will be served directly in CSR.
# By default, excludes community and collection browse, global browse, global search, community list, statistics and various administrative tools.
excludePathPatterns:
- pattern: "^/communities/[a-f0-9-]{36}/browse(/.*)?$"
flag: "i"
- pattern: "^/collections/[a-f0-9-]{36}/browse(/.*)?$"
flag: "i"
- pattern: "^/browse/"
- pattern: "^/search$"
- pattern: "^/community-list$"
- pattern: "^/admin/"
- pattern: "^/processes/?"
- pattern: "^/notifications/"
- pattern: "^/statistics/?"
- pattern: "^/access-control/"
- pattern: "^/health$"
# Path prefixes to enable SSR for. By default these are limited to paths of primary DSpace objects.
# NOTE: The "/handle/" path ensures Handle redirects work via SSR. The "/reload/" path ensures
# hard refreshes (e.g. after login) trigger SSR while fully reloading the page.
paths: [ '/home', '/items/', '/entities/', '/collections/', '/communities/', '/bitstream/', '/bitstreams/', '/handle/', '/reload/' ]
# Whether to enable rendering of Search component on SSR.
# If set to true the component will be included in the HTML returned from the server side rendering.
# If set to false the component will not be included in the HTML returned from the server side rendering.
@@ -101,7 +87,7 @@ cache:
# Set to true to see all cache hits/misses/refreshes in your console logs. Useful for debugging SSR caching issues.
debug: false
# When enabled (i.e. max > 0), known bots will be sent pages from a server side cache specific for bots.
# (Keep in mind, bot detection cannot be guarranteed. It is possible some bots will bypass this cache.)
# (Keep in mind, bot detection cannot be guaranteed. It is possible some bots will bypass this cache.)
botCache:
# Maximum number of pages to cache for known bots. Set to zero (0) to disable server side caching for bots.
# Default is 1000, which means the 1000 most recently accessed public pages will be cached.
@@ -364,6 +350,8 @@ item:
# Rounded to the nearest size in the list of selectable sizes on the
# settings menu. See pageSizeOptions in 'pagination-component-options.model.ts'.
pageSize: 5
# Show the bitstream access status label on the item page
showAccessStatuses: false
# Community Page Config
community:
@@ -558,7 +546,6 @@ notifyMetrics:
config: 'NOTIFY.outgoing.delivered'
description: 'admin-notify-dashboard.NOTIFY.outgoing.delivered.description'
# Live Region configuration
# Live Region as defined by w3c, https://www.w3.org/TR/wai-aria-1.1/#terms:
# Live regions are perceivable regions of a web page that are typically updated as a
@@ -573,7 +560,36 @@ liveRegion:
# The visibility of the live region. Setting this to true is only useful for debugging purposes.
isVisible: false
# Configuration for storing accessibility settings, used by the AccessibilitySettingsService
accessibility:
# The duration in days after which the accessibility settings cookie expires
cookieExpirationDuration: 7
# Geospatial Map display options
geospatialMapViewer:
# Which fields to use for parsing as geospatial points in search maps
# (note, the item page field component allows any field(s) to be used
# and is set as an input when declaring the component)
spatialMetadataFields:
- 'dcterms.spatial'
# Which discovery configuration to use for 'geospatial search', used
# in the browse map
spatialFacetDiscoveryConfiguration: 'geospatial'
# Which filter / facet name to use for faceted geospatial search
# used in the browse map
spatialPointFilterName: 'point'
# Whether item page geospatial metadata should be displayed
# (assumes they are wrapped in a test for this config in the template as
# per the default templates supplied with DSpace for untyped-item and publication)
enableItemPageFields: false
# Whether the browse map should be enabled and included in the browse menu
enableBrowseMap: false
# Whether a 'map view' mode should be included alongside list and grid views
# in search result pages
enableSearchViewMode: false
# The tile provider(s) to use for the map tiles drawn in the leaflet maps.
# (see https://leaflet-extras.github.io/leaflet-providers/preview/) for a full list
tileProviders:
- 'OpenStreetMap.Mapnik'
# Starting centre point for the map, as lat and lng coordinates. This is useful
# to set the centre of the map when the map is first loaded and if there are no
# points, shapes or markers to display.
# Defaults to the centre of Istanbul
defaultCentrePoint:
lat: 41.015137
lng: 28.979530

View File

@@ -9,12 +9,12 @@ describe('Admin Add New Modals', () => {
it('Add new Community modal should pass accessibility tests', () => {
// Pin the sidebar open
cy.get('#sidebar-collapse-toggle').trigger('mouseover');
cy.get('#sidebar-collapse-toggle').click();
cy.get('[data-test="sidebar-collapse-toggle"]').trigger('mouseover');
cy.get('[data-test="sidebar-collapse-toggle"]').click();
// Click on entry of menu
cy.get('#admin-menu-section-new-title').should('be.visible');
cy.get('#admin-menu-section-new-title').click();
cy.get('[data-test="admin-menu-section-new-title"]').should('be.visible');
cy.get('[data-test="admin-menu-section-new-title"]').click();
cy.get('a[data-test="menu.section.new_community"]').click();
@@ -24,12 +24,12 @@ describe('Admin Add New Modals', () => {
it('Add new Collection modal should pass accessibility tests', () => {
// Pin the sidebar open
cy.get('#sidebar-collapse-toggle').trigger('mouseover');
cy.get('#sidebar-collapse-toggle').click();
cy.get('[data-test="sidebar-collapse-toggle"]').trigger('mouseover');
cy.get('[data-test="sidebar-collapse-toggle"]').click();
// Click on entry of menu
cy.get('#admin-menu-section-new-title').should('be.visible');
cy.get('#admin-menu-section-new-title').click();
cy.get('[data-test="admin-menu-section-new-title"]').should('be.visible');
cy.get('[data-test="admin-menu-section-new-title"]').click();
cy.get('a[data-test="menu.section.new_collection"]').click();
@@ -39,12 +39,12 @@ describe('Admin Add New Modals', () => {
it('Add new Item modal should pass accessibility tests', () => {
// Pin the sidebar open
cy.get('#sidebar-collapse-toggle').trigger('mouseover');
cy.get('#sidebar-collapse-toggle').click();
cy.get('[data-test="sidebar-collapse-toggle"]').trigger('mouseover');
cy.get('[data-test="sidebar-collapse-toggle"]').click();
// Click on entry of menu
cy.get('#admin-menu-section-new-title').should('be.visible');
cy.get('#admin-menu-section-new-title').click();
cy.get('[data-test="admin-menu-section-new-title"]').should('be.visible');
cy.get('[data-test="admin-menu-section-new-title"]').click();
cy.get('a[data-test="menu.section.new_item"]').click();

View File

@@ -9,12 +9,12 @@ describe('Admin Edit Modals', () => {
it('Edit Community modal should pass accessibility tests', () => {
// Pin the sidebar open
cy.get('#sidebar-collapse-toggle').trigger('mouseover');
cy.get('#sidebar-collapse-toggle').click();
cy.get('[data-test="sidebar-collapse-toggle"]').trigger('mouseover');
cy.get('[data-test="sidebar-collapse-toggle"]').click();
// Click on entry of menu
cy.get('#admin-menu-section-edit-title').should('be.visible');
cy.get('#admin-menu-section-edit-title').click();
cy.get('[data-test="admin-menu-section-edit-title"]').should('be.visible');
cy.get('[data-test="admin-menu-section-edit-title"]').click();
cy.get('a[data-test="menu.section.edit_community"]').click();
@@ -24,12 +24,12 @@ describe('Admin Edit Modals', () => {
it('Edit Collection modal should pass accessibility tests', () => {
// Pin the sidebar open
cy.get('#sidebar-collapse-toggle').trigger('mouseover');
cy.get('#sidebar-collapse-toggle').click();
cy.get('[data-test="sidebar-collapse-toggle"]').trigger('mouseover');
cy.get('[data-test="sidebar-collapse-toggle"]').click();
// Click on entry of menu
cy.get('#admin-menu-section-edit-title').should('be.visible');
cy.get('#admin-menu-section-edit-title').click();
cy.get('[data-test="admin-menu-section-edit-title"]').should('be.visible');
cy.get('[data-test="admin-menu-section-edit-title"]').click();
cy.get('a[data-test="menu.section.edit_collection"]').click();
@@ -39,12 +39,12 @@ describe('Admin Edit Modals', () => {
it('Edit Item modal should pass accessibility tests', () => {
// Pin the sidebar open
cy.get('#sidebar-collapse-toggle').trigger('mouseover');
cy.get('#sidebar-collapse-toggle').click();
cy.get('[data-test="sidebar-collapse-toggle"]').trigger('mouseover');
cy.get('[data-test="sidebar-collapse-toggle"]').click();
// Click on entry of menu
cy.get('#admin-menu-section-edit-title').should('be.visible');
cy.get('#admin-menu-section-edit-title').click();
cy.get('[data-test="admin-menu-section-edit-title"]').should('be.visible');
cy.get('[data-test="admin-menu-section-edit-title"]').click();
cy.get('a[data-test="menu.section.edit_item"]').click();

View File

@@ -9,12 +9,12 @@ describe('Admin Export Modals', () => {
it('Export metadata modal should pass accessibility tests', () => {
// Pin the sidebar open
cy.get('#sidebar-collapse-toggle').trigger('mouseover');
cy.get('#sidebar-collapse-toggle').click();
cy.get('[data-test="sidebar-collapse-toggle"]').trigger('mouseover');
cy.get('[data-test="sidebar-collapse-toggle"]').click();
// Click on entry of menu
cy.get('#admin-menu-section-export-title').should('be.visible');
cy.get('#admin-menu-section-export-title').click();
cy.get('[data-test="admin-menu-section-export-title"]').should('be.visible');
cy.get('[data-test="admin-menu-section-export-title"]').click();
cy.get('a[data-test="menu.section.export_metadata"]').click();
@@ -24,12 +24,12 @@ describe('Admin Export Modals', () => {
it('Export batch modal should pass accessibility tests', () => {
// Pin the sidebar open
cy.get('#sidebar-collapse-toggle').trigger('mouseover');
cy.get('#sidebar-collapse-toggle').click();
cy.get('[data-test="sidebar-collapse-toggle"]').trigger('mouseover');
cy.get('[data-test="sidebar-collapse-toggle"]').click();
// Click on entry of menu
cy.get('#admin-menu-section-export-title').should('be.visible');
cy.get('#admin-menu-section-export-title').click();
cy.get('[data-test="admin-menu-section-export-title"]').should('be.visible');
cy.get('[data-test="admin-menu-section-export-title"]').click();
cy.get('a[data-test="menu.section.export_batch"]').click();

View File

@@ -1,5 +1,4 @@
import { testA11y } from 'cypress/support/utils';
import { Options } from 'cypress-axe';
describe('Admin Sidebar', () => {
beforeEach(() => {
@@ -10,19 +9,12 @@ describe('Admin Sidebar', () => {
it('should be pinnable and pass accessibility tests', () => {
// Pin the sidebar open
cy.get('#sidebar-collapse-toggle').click();
cy.get('[data-test="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);
testA11y('ds-admin-sidebar');
});
});

View File

@@ -12,6 +12,13 @@ describe('Community List Page', () => {
cy.get('[data-test="expand-button"]').click({ multiple: true });
// Analyze <ds-community-list-page> for accessibility issues
testA11y('ds-community-list-page');
testA11y('ds-community-list-page', {
rules: {
// When expanding a cdk node on the community-list page, the 'aria-posinset' property becomes 0.
// 0 is not a valid value for 'aria-posinset' so the test fails.
// see https://github.com/DSpace/dspace-angular/issues/4068
'aria-valid-attr-value': { enabled: false },
},
});
});
});

View File

@@ -15,24 +15,24 @@ describe('Header', () => {
cy.visit('/');
// Click the language switcher (globe) in header
cy.get('button[data-test="lang-switch"]').click();
cy.get('a[data-test="lang-switch"]').click();
// Click on the "Deusch" language in dropdown
cy.get('#language-menu-list div[role="option"]').contains('Deutsch').click();
cy.get('#language-menu-list li').contains('Deutsch').click();
// HTML "lang" attribute should switch to "de"
cy.get('html').invoke('attr', 'lang').should('eq', 'de');
// Login menu should now be in German
cy.get('[data-test="login-menu"]').contains('Anmelden');
cy.get('a[data-test="login-menu"]').contains('Anmelden');
// Change back to English from language switcher
cy.get('button[data-test="lang-switch"]').click();
cy.get('#language-menu-list div[role="option"]').contains('English').click();
cy.get('a[data-test="lang-switch"]').click();
cy.get('#language-menu-list li').contains('English').click();
// HTML "lang" attribute should switch to "en"
cy.get('html').invoke('attr', 'lang').should('eq', 'en');
// Login menu should now be in English
cy.get('[data-test="login-menu"]').contains('Log In');
cy.get('a[data-test="login-menu"]').contains('Log In');
});
});

View File

@@ -17,7 +17,7 @@ describe('Site Statistics Page', () => {
cy.visit('/statistics');
// <ds-site-statistics-page> tag must be visable
// <ds-site-statistics-page> tag must be visible
cy.get('ds-site-statistics-page').should('be.visible');
// Verify / wait until "Total Visits" table's *last* label is non-empty

View File

@@ -7,7 +7,7 @@ describe('Item Statistics Page', () => {
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);
cy.location('pathname').should('eq', '/statistics/entities/publication/'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION')));
});
it('should contain element ds-item-statistics-page when navigating to an item statistics page', () => {

View File

@@ -142,7 +142,7 @@ describe('Login Modal', () => {
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
// Open user menu, verify user menu accessibility
page.openUserMenu();
cy.get('ds-user-menu').should('be.visible');
testA11y('ds-user-menu');

View File

@@ -1,7 +1,7 @@
import { testA11y } from 'cypress/support/utils';
describe('PageNotFound', () => {
it('should contain element ds-pagenotfound when navigating to page that doesnt exist', () => {
it('should contain element ds-pagenotfound when navigating to page that does not 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('be.visible');

View File

@@ -34,7 +34,7 @@ describe('New Submission page', () => {
// 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".
// All panels are accordions & 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 },
@@ -192,7 +192,7 @@ describe('New Submission page', () => {
testA11y('ds-submission-edit',
{
rules: {
// All panels are accordians & fail "aria-required-children" and "nested-interactive".
// All panels are accordions & 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 },
@@ -217,7 +217,7 @@ describe('New Submission page', () => {
});
// Close popup window
cy.get('ds-dynamic-lookup-relation-modal button.close').click();
cy.get('ds-dynamic-lookup-relation-modal button.btn-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

View File

@@ -54,9 +54,9 @@ before(() => {
// Runs once before the first test in each "block"
beforeEach(() => {
// Pre-agree to all Klaro cookies by setting the klaro-anonymous cookie
// Pre-agree to all Orejime cookies by setting the orejime-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}');
cy.setCookie('orejime-anonymous', '{"authentication":true,"preferences":true,"acknowledgement":true,"google-analytics":true}');
// Remove any CSRF cookies saved from prior tests
cy.clearCookie(DSPACE_XSRF_COOKIE);

View File

@@ -1,10 +1,16 @@
{
"extends": "../tsconfig.json",
"include": [
"**/*.ts"
"**/*.ts",
"../cypress.config.ts"
],
"compilerOptions": {
"sourceMap": false,
"typeRoots": [
"../node_modules",
"../node_modules/@types",
"../src/typings.d.ts"
],
"types": [
"cypress",
"cypress-axe",

View File

@@ -23,14 +23,14 @@ the Docker compose scripts in this 'docker' folder.
This Dockerfile is used to build a *development* DSpace Angular UI image, published as 'dspace/dspace-angular'
```
docker build -t dspace/dspace-angular:dspace-8_x .
docker build -t dspace/dspace-angular:latest .
```
This image is built *automatically* after each commit is made to the `main` branch.
Admins to our DockerHub repo can manually publish with the following command.
```
docker push dspace/dspace-angular:dspace-8_x
docker push dspace/dspace-angular:latest
```
### Dockerfile.dist
@@ -39,7 +39,7 @@ The `Dockerfile.dist` is used to generate a *production* build and runtime envir
```bash
# build the latest image
docker build -f Dockerfile.dist -t dspace/dspace-angular:dspace-8_x-dist .
docker build -f Dockerfile.dist -t dspace/dspace-angular:latest-dist .
```
A default/demo version of this image is built *automatically*.

View File

@@ -14,14 +14,14 @@
# Therefore, it should be kept in sync with that file
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 d8" means it will be named "d8_dspacenet")
# 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_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-cli:${DSPACE_VER:-dspace-8_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-cli:${DSPACE_VER:-latest}"
container_name: dspace-cli
environment:
# Below syntax may look odd, but it is how to override dspace.cfg settings via env variables.

View File

@@ -14,11 +14,10 @@
# # Therefore, it should be kept in sync with that file
services:
dspacedb:
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-8_x}-loadsql"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-latest}-loadsql"
environment:
# This LOADSQL should be kept in sync with the URL in DSpace/DSpace
# This SQL is available from https://github.com/DSpace-Labs/AIP-Files/releases/tag/demo-entities-data
# NOTE: currently there is no dspace8 version
- LOADSQL=https://github.com/DSpace-Labs/AIP-Files/releases/download/demo-entities-data/dspace7-entities-data.sql
dspace:
### OVERRIDE default 'entrypoint' in 'docker-compose-rest.yml' ####

View File

@@ -33,7 +33,7 @@ services:
# 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_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-8_x-test}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-latest-test}"
depends_on:
- dspacedb
networks:
@@ -60,12 +60,11 @@ 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_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-8_x}-loadsql"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-latest}-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
# NOTE: currently there is no dspace8 version
LOADSQL: https://github.com/DSpace-Labs/AIP-Files/releases/download/demo-entities-data/dspace7-entities-data.sql
PGDATA: /pgdata
POSTGRES_PASSWORD: dspace
@@ -82,7 +81,7 @@ services:
# DSpace Solr container
dspacesolr:
container_name: dspacesolr
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-8_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-latest}"
networks:
- dspacenet
ports:

View File

@@ -26,7 +26,7 @@ services:
DSPACE_REST_HOST: sandbox.dspace.org
DSPACE_REST_PORT: 443
DSPACE_REST_NAMESPACE: /server
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-angular:${DSPACE_VER:-dspace-8_x}-dist"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-angular:${DSPACE_VER:-latest}-dist"
build:
context: ..
dockerfile: Dockerfile.dist

View File

@@ -40,7 +40,7 @@ services:
# from the host machine. This IP range MUST correspond to the 'dspacenet' subnet defined above.
proxies__P__trusted__P__ipranges: '172.23.0'
LOGGING_CONFIG: /dspace/config/log4j2-container.xml
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-8_x-test}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-latest-test}"
depends_on:
- dspacedb
networks:
@@ -68,7 +68,7 @@ services:
dspacedb:
container_name: dspacedb
# Uses a custom Postgres image with pgcrypto installed
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-8_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-latest}"
environment:
PGDATA: /pgdata
POSTGRES_PASSWORD: dspace
@@ -85,7 +85,7 @@ services:
# DSpace Solr container
dspacesolr:
container_name: dspacesolr
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-8_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-latest}"
networks:
- dspacenet
ports:

View File

@@ -23,7 +23,7 @@ services:
DSPACE_REST_HOST: localhost
DSPACE_REST_PORT: 8080
DSPACE_REST_NAMESPACE: /server
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-angular:${DSPACE_VER:-dspace-8_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-angular:${DSPACE_VER:-latest}"
build:
context: ..
dockerfile: Dockerfile

View File

@@ -15,7 +15,7 @@ DSPACE_APP_CONFIG_PATH=/usr/local/dspace/config/config.yml
Configuration options can be overridden by setting environment variables.
## Nodejs server
When you start dspace-angular on node, it spins up an http server on which it listens for incoming connections. You can define the ip address and port the server should bind itsself to, and if ssl should be enabled not. By default it listens on `localhost:4000`. If you want it to listen on all your network connections, configure it to bind itself to `0.0.0.0`.
When you start dspace-angular on node, it spins up an http server on which it listens for incoming connections. You can define the ip address and port the server should bind itself to, and if ssl should be enabled not. By default it listens on `localhost:4000`. If you want it to listen on all your network connections, configure it to bind itself to `0.0.0.0`.
To change this configuration, change the options `ui.host`, `ui.port` and `ui.ssl` in the appropriate configuration file (see above):

23988
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,30 +1,31 @@
{
"name": "dspace-angular",
"version": "8.3.0-next",
"version": "9.0.0-rc1",
"scripts": {
"ng": "ng",
"config:watch": "nodemon",
"test:rest": "ts-node --project ./tsconfig.ts-node.json scripts/test-rest.ts",
"start": "yarn run start:prod",
"start:dev": "nodemon --exec \"cross-env NODE_ENV=development yarn run serve\"",
"start:prod": "yarn run build:prod && cross-env NODE_ENV=production yarn run serve:ssr",
"start:mirador:prod": "yarn run build:mirador && yarn run start:prod",
"preserve": "yarn base-href",
"start": "npm run start:prod",
"start:dev": "nodemon --exec \"cross-env NODE_ENV=development npm run serve\"",
"start:prod": "npm run build:prod && cross-env NODE_ENV=production npm run serve:ssr",
"start:mirador:prod": "npm run build:mirador && npm run start:prod",
"preserve": "npm run base-href",
"serve": "ts-node --project ./tsconfig.ts-node.json scripts/serve.ts",
"serve:ssr": "node dist/server/main",
"analyze": "webpack-bundle-analyzer dist/browser/stats.json",
"build": "ng build --configuration development",
"build:stats": "ng build --stats-json",
"build:prod": "cross-env NODE_ENV=production yarn run build:ssr",
"build:prod": "cross-env NODE_ENV=production npm run build:ssr",
"build:ssr": "ng build --configuration production && ng run dspace-angular:server:production",
"build:lint": "rimraf 'lint/dist/**/*.js' 'lint/dist/**/*.js.map' && tsc -b lint/tsconfig.json",
"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",
"test:lint": "yarn build:lint && yarn test:lint:nobuild",
"test:lint": "npm run build:lint && npm run test:lint:nobuild",
"test:lint:nobuild": "jasmine --config=lint/jasmine.json",
"lint": "yarn build:lint && yarn lint:nobuild",
"lint": "npm run build:lint && npm run lint:nobuild",
"lint:nobuild": "ng lint",
"lint-fix": "yarn build:lint && ng lint --fix=true",
"lint-fix": "npm run build:lint && ng lint --fix=true",
"docs:lint": "ts-node --project ./lint/tsconfig.json ./lint/generate-docs.ts",
"e2e": "cross-env NODE_ENV=production ng e2e",
"clean:dev:config": "rimraf src/assets/config.json",
@@ -35,8 +36,8 @@
"clean:json": "rimraf *.records.json",
"clean:node": "rimraf node_modules",
"clean:cli": "rimraf .angular/cache",
"clean:prod": "yarn run clean:dist && yarn run clean:log && yarn run clean:doc && yarn run clean:coverage && yarn run clean:json",
"clean": "yarn run clean:prod && yarn run clean:dev:config && yarn run clean:cli && yarn run clean:node",
"clean:prod": "npm run clean:dist && npm run clean:log && npm run clean:doc && npm run clean:coverage && npm run clean:json",
"clean": "npm run clean:prod && npm run clean:dev:config && npm run clean:cli && npm run clean:node",
"sync-i18n": "ts-node --project ./tsconfig.ts-node.json scripts/sync-i18n-files.ts",
"build:mirador": "webpack --config webpack/webpack.mirador.config.ts",
"merge-i18n": "ts-node --project ./tsconfig.ts-node.json scripts/merge-i18n-files.ts",
@@ -45,7 +46,7 @@
"env:yaml": "ts-node --project ./tsconfig.ts-node.json scripts/env-to-yaml.ts",
"base-href": "ts-node --project ./tsconfig.ts-node.json scripts/base-href.ts",
"check-circ-deps": "npx madge --exclude '(bitstream|bundle|collection|config-submission-form|eperson|item|version)\\.model\\.ts$' --circular --extensions ts ./",
"postinstall": "yarn build:lint || echo 'Skipped DSpace ESLint plugins.'"
"postinstall": "npm run build:lint || echo 'Skipped DSpace ESLint plugins.'"
},
"browser": {
"fs": false,
@@ -54,38 +55,76 @@
"https": false
},
"private": true,
"overrides": {
"@kolkov/ngx-gallery": {
"@angular/animations": "^18.2.12",
"@angular/common": "^18.2.12",
"@angular/core": "^18.2.12"
},
"@ng-bootstrap/ng-bootstrap": {
"@angular/common": "^18.2.12",
"@angular/core": "^18.2.12",
"@angular/forms": "^18.2.12",
"@angular/localize": "^18.2.12"
},
"@ng-dynamic-forms/core": {
"@angular/common": "^18.2.12",
"@angular/core": "^18.2.12",
"@angular/forms": "^18.2.12"
},
"@ng-dynamic-forms/ui-ng-bootstrap": {
"ngx-mask": "14.2.4",
"@ng-bootstrap/ng-bootstrap": "^12.0.0",
"bootstrap": "^5.3"
},
"@nicky-lenaers/ngx-scroll-to": {
"@angular/common": "^18.2.12",
"@angular/core": "^18.2.12"
},
"eslint-plugin-unused-imports": {
"@typescript-eslint/eslint-plugin": "^7.2.0"
},
"ngx-infinite-scroll": {
"@angular/common": "^18.2.12",
"@angular/core": "^18.2.12"
},
"notistack": "3.0.1"
},
"dependencies": {
"@angular/animations": "^17.3.11",
"@angular/cdk": "^17.3.10",
"@angular/common": "^17.3.11",
"@angular/compiler": "^17.3.11",
"@angular/core": "^17.3.11",
"@angular/forms": "^17.3.11",
"@angular/localize": "17.3.12",
"@angular/platform-browser": "^17.3.11",
"@angular/platform-browser-dynamic": "^17.3.11",
"@angular/platform-server": "^17.3.11",
"@angular/router": "^17.3.11",
"@angular/ssr": "^17.3.17",
"@babel/runtime": "7.28.4",
"@angular/animations": "^18.2.12",
"@angular/cdk": "^18.2.12",
"@angular/common": "^18.2.12",
"@angular/compiler": "^18.2.12",
"@angular/core": "^18.2.12",
"@angular/forms": "^18.2.12",
"@angular/localize": "^18.2.12",
"@angular/platform-browser": "^18.2.12",
"@angular/platform-browser-dynamic": "^18.2.12",
"@angular/platform-server": "^18.2.12",
"@angular/router": "^18.2.12",
"@angular/ssr": "^18.2.12",
"@babel/runtime": "7.26.0",
"@kolkov/ngx-gallery": "^2.0.1",
"@ng-bootstrap/ng-bootstrap": "^11.0.0",
"@ng-bootstrap/ng-bootstrap": "^12.0.0",
"@ng-dynamic-forms/core": "^16.0.0",
"@ng-dynamic-forms/ui-ng-bootstrap": "^16.0.0",
"@ngrx/effects": "^17.1.1",
"@ngrx/router-store": "^17.1.1",
"@ngrx/store": "^17.1.1",
"@ngx-translate/core": "^14.0.0",
"@ngrx/effects": "^18.1.1",
"@ngrx/operators": "^18.0.0",
"@ngrx/router-store": "^18.1.1",
"@ngrx/store": "^18.1.1",
"@ngx-translate/core": "^16.0.3",
"@nicky-lenaers/ngx-scroll-to": "^14.0.0",
"@terraformer/wkt": "^2.2.1",
"altcha": "^0.9.0",
"angulartics2": "^12.2.0",
"axios": "^1.11.0",
"bootstrap": "^4.6.1",
"axios": "^1.7.9",
"bootstrap": "^5.3",
"cerialize": "0.1.18",
"cli-progress": "^3.12.0",
"colors": "^1.4.0",
"compression": "^1.8.1",
"compression": "^1.7.5",
"cookie-parser": "1.4.7",
"core-js": "^3.45.1",
"core-js": "^3.40.0",
"date-fns": "^2.29.3",
"date-fns-tz": "^1.3.7",
"deepmerge": "^4.3.1",
@@ -94,81 +133,83 @@
"express-rate-limit": "^5.1.3",
"fast-json-patch": "^3.1.1",
"filesize": "^6.1.0",
"http-proxy-middleware": "^2.0.9",
"http-proxy-middleware": "^2.0.7",
"http-terminator": "^3.2.0",
"isbot": "^5.1.30",
"isbot": "^5.1.22",
"js-cookie": "2.2.1",
"js-yaml": "^4.1.0",
"json5": "^2.2.3",
"jsonschema": "1.5.0",
"jwt-decode": "^3.1.2",
"klaro": "^0.7.18",
"leaflet": "^1.9.4",
"leaflet-providers": "^2.0.0",
"leaflet.markercluster": "^1.5.3",
"lodash": "^4.17.21",
"lru-cache": "^7.14.1",
"markdown-it": "^13.0.1",
"mirador": "^3.4.3",
"mirador-dl-plugin": "^0.13.0",
"mirador-share-plugin": "^0.16.0",
"morgan": "^1.10.1",
"ng2-file-upload": "5.0.0",
"morgan": "^1.10.0",
"ng2-file-upload": "7.0.1",
"ng2-nouislider": "^2.0.0",
"ngx-infinite-scroll": "^16.0.0",
"ngx-infinite-scroll": "^18.0.0",
"ngx-matomo-client": "^6.4.1",
"ngx-pagination": "6.0.3",
"ngx-skeleton-loader": "^9.0.0",
"ngx-ui-switch": "^14.1.0",
"ngx-ui-switch": "^15.0.0",
"nouislider": "^15.7.1",
"orejime": "^2.3.1",
"pem": "1.14.8",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.8.2",
"rxjs": "^7.8.0",
"uuid": "^8.3.2",
"zone.js": "~0.14.0"
"zone.js": "~0.14.10"
},
"devDependencies": {
"@angular-builders/custom-webpack": "~17.0.2",
"@angular-devkit/build-angular": "^17.3.17",
"@angular-eslint/builder": "17.5.3",
"@angular-eslint/bundled-angular-compiler": "17.5.3",
"@angular-eslint/eslint-plugin": "17.5.3",
"@angular-eslint/eslint-plugin-template": "17.5.3",
"@angular-eslint/schematics": "17.5.3",
"@angular-eslint/template-parser": "17.5.3",
"@angular/cli": "^17.3.17",
"@angular/compiler-cli": "^17.3.11",
"@angular/language-service": "^17.3.11",
"@angular-builders/custom-webpack": "~18.0.0",
"@angular-devkit/build-angular": "^18.2.12",
"@angular-eslint/builder": "^18.4.1",
"@angular-eslint/bundled-angular-compiler": "^18.4.1",
"@angular-eslint/eslint-plugin": "^18.4.1",
"@angular-eslint/eslint-plugin-template": "^18.4.1",
"@angular-eslint/schematics": "^18.4.1",
"@angular-eslint/template-parser": "^18.4.1",
"@angular-eslint/utils": "^18.4.1",
"@angular/cli": "^18.2.12",
"@angular/compiler-cli": "^18.2.12",
"@angular/language-service": "^18.2.12",
"@cypress/schematic": "^1.5.0",
"@fortawesome/fontawesome-free": "^6.7.2",
"@material-ui/core": "^4.12.4",
"@material-ui/icons": "^4.11.3",
"@ngrx/store-devtools": "^17.1.1",
"@ngtools/webpack": "^16.2.16",
"@ngrx/store-devtools": "^18.1.1",
"@ngtools/webpack": "^18.2.12",
"@types/deep-freeze": "0.1.5",
"@types/ejs": "^3.1.2",
"@types/express": "^4.17.17",
"@types/grecaptcha": "^3.0.9",
"@types/jasmine": "~3.6.0",
"@types/js-cookie": "2.2.6",
"@types/lodash": "^4.17.20",
"@types/lodash": "^4.17.15",
"@types/node": "^14.14.9",
"@typescript-eslint/eslint-plugin": "^7.2.0",
"@typescript-eslint/parser": "^7.2.0",
"@typescript-eslint/rule-tester": "^7.2.0",
"@typescript-eslint/utils": "^7.2.0",
"axe-core": "^4.10.3",
"@typescript-eslint/eslint-plugin": "^7.18.0",
"@typescript-eslint/parser": "^7.18.0",
"@typescript-eslint/rule-tester": "^7.18.0",
"@typescript-eslint/utils": "^7.18.0",
"axe-core": "^4.10.2",
"compression-webpack-plugin": "^9.2.0",
"copy-webpack-plugin": "^6.4.1",
"cross-env": "^7.0.3",
"csstype": "^3.1.3",
"cypress": "^13.17.0",
"cypress-axe": "^1.7.0",
"cypress-axe": "^1.6.0",
"deep-freeze": "0.0.1",
"eslint": "^8.39.0",
"eslint-plugin-deprecation": "^1.4.1",
"eslint-plugin-dspace-angular-html": "link:./lint/dist/src/rules/html",
"eslint-plugin-dspace-angular-ts": "link:./lint/dist/src/rules/ts",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-dspace-angular-html": "file:./lint/dist/src/rules/html",
"eslint-plugin-dspace-angular-ts": "file:./lint/dist/src/rules/ts",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-import-newlines": "^1.3.1",
"eslint-plugin-jsdoc": "^45.0.0",
"eslint-plugin-jsonc": "^2.20.1",
"eslint-plugin-jsonc": "^2.19.1",
"eslint-plugin-lodash": "^7.4.0",
"eslint-plugin-rxjs": "^5.0.3",
"eslint-plugin-simple-import-sort": "^10.0.0",
@@ -177,31 +218,27 @@
"jasmine": "^3.8.0",
"jasmine-core": "^3.8.0",
"jasmine-marbles": "0.9.2",
"karma": "^6.4.2",
"karma": "^6.4.4",
"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",
"ng-mocks": "^14.13.5",
"ng-mocks": "^14.13.2",
"ngx-mask": "14.2.4",
"nodemon": "^2.0.22",
"postcss": "^8.5",
"postcss-import": "^14.0.0",
"postcss-loader": "^4.0.3",
"postcss-preset-env": "^7.4.2",
"prop-types": "^15.8.1",
"react": "^16.14.0",
"react-copy-to-clipboard": "^5.1.0",
"react-dom": "^16.14.0",
"rimraf": "^3.0.2",
"sass": "~1.92.1",
"sass": "~1.84.0",
"sass-loader": "^12.6.0",
"sass-resources-loader": "^2.2.5",
"ts-node": "^8.10.2",
"typescript": "~5.4.5",
"webpack": "5.101.0",
"webpack": "5.97.1",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.2.2"
"webpack-dev-server": "^4.15.1"
}
}

View File

@@ -38,7 +38,7 @@ parseCliInput();
function parseCliInput() {
program
.option('-d, --output-dir <output-dir>', 'output dir when running script on all language files', projectRoot(LANGUAGE_FILES_LOCATION))
.option('-s, --source-dir <source-dir>', 'source dir of transalations to be merged')
.option('-s, --source-dir <source-dir>', 'source dir of translations to be merged')
.usage('(-s <source-dir> [-d <output-dir>])')
.parse(process.argv);

View File

@@ -20,10 +20,10 @@ import 'reflect-metadata';
/* eslint-disable import/no-namespace */
import * as morgan from 'morgan';
import * as express from 'express';
import express from 'express';
import * as ejs from 'ejs';
import * as compression from 'compression';
import * as expressStaticGzip from 'express-static-gzip';
import expressStaticGzip from 'express-static-gzip';
/* eslint-enable import/no-namespace */
import axios from 'axios';
import LRU from 'lru-cache';
@@ -58,7 +58,6 @@ import {
REQUEST,
RESPONSE,
} from './src/express.tokens';
import { SsrExcludePatterns } from "./src/config/ssr-config.interface";
/*
* Set path for the browser application's dist folder
@@ -103,7 +102,7 @@ export function app() {
* If production mode is enabled in the environment file:
* - Enable Angular's production mode
* - Initialize caching of SSR rendered pages (if enabled in config.yml)
* - Enable compression for SSR reponses. See [compression](https://github.com/expressjs/compression)
* - Enable compression for SSR responses. See [compression](https://github.com/expressjs/compression)
*/
if (environment.production) {
enableProdMode();
@@ -222,7 +221,7 @@ export function app() {
* The callback function to serve server side angular
*/
function ngApp(req, res, next) {
if (environment.ssr.enabled && req.method === 'GET' && (req.path === '/' || !isExcludedFromSsr(req.path, environment.ssr.excludePathPatterns))) {
if (environment.ssr.enabled && req.method === 'GET' && (req.path === '/' || environment.ssr.paths.some(pathPrefix => req.path.startsWith(pathPrefix)))) {
// Render the page to user via SSR (server side rendering)
serverSideRender(req, res, next);
} else {
@@ -437,7 +436,7 @@ function checkCacheForRequest(cacheName: string, cache: LRU<string, any>, req, r
if (environment.cache.serverSide.debug) { console.log(`CACHE EXPIRED FOR ${key} in ${cacheName} cache. Re-rendering...`); }
// Update cached copy by rerendering server-side
// NOTE: In this scenario the currently cached copy will be returned to the current user.
// This re-render is peformed behind the scenes to update cached copy for next user.
// This re-render is performed behind the scenes to update cached copy for next user.
serverSideRender(req, res, next, false);
}
} else {
@@ -561,8 +560,8 @@ function createHttpsServer(keys) {
* Create an HTTP server with the configured port and host.
*/
function run() {
const port = environment.ui.port;
const host = environment.ui.host;
const port = environment.ui.port || 4000;
const host = environment.ui.host || '/';
// Start up the Node server
const server = app();
@@ -628,21 +627,6 @@ function start() {
}
}
/**
* Check if SSR should be skipped for path
*
* @param path
* @param excludePathPattern
*/
function isExcludedFromSsr(path: string, excludePathPattern: SsrExcludePatterns[]): boolean {
const patterns = excludePathPattern.map(p =>
new RegExp(p.pattern, p.flag || '')
);
return patterns.some((regex) => {
return regex.test(path)
});
}
/*
* The callback function to serve health check requests
*/

View File

@@ -1,19 +1,13 @@
<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">
<ng-template ngbPanelTitle>
<div class="w-100 d-flex gap-3 justify-content-between collapse-toggle" (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">
[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>
@@ -22,11 +16,11 @@
<li [ngbNavItem]="'search'" role="presentation">
<a ngbNavLink>{{'admin.access-control.bulk-access-browse.search.header' | translate}}</a>
<ng-template ngbNavContent>
<div class="mx-n3">
<div class="bulk-access-search">
<ds-search [configuration]="'administrativeBulkAccess'"
[selectable]="true"
[selectionConfig]="{ repeatable: true, listId: listId }"
[showThumbnails]="false"></ds-search>
[selectable]="true"
[selectionConfig]="{ repeatable: true, listId: listId }"
[showThumbnails]="false"></ds-search>
</div>
</ng-template>
</li>
@@ -42,21 +36,25 @@
[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>
@if ((objectsSelected$|async)?.hasSucceeded) {
<ul class="list-unstyled ms-4">
@for (object of (objectsSelected$|async)?.payload?.page | paginate: { itemsPerPage: (paginationOptions$ | async).pageSize,
currentPage: (paginationOptions$ | async).currentPage, totalItems: (objectsSelected$|async)?.payload?.page.length }; track object; let i = $index; let last = $last) {
<li
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>

View File

@@ -0,0 +1,4 @@
.bulk-access-search {
margin-right: calc(var(--bs-gutter-x, 1.5rem) / -2);
margin-left: calc(var(--bs-gutter-x, 1.5rem) / -2);
}

View File

@@ -1,8 +1,4 @@
import {
AsyncPipe,
NgForOf,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
Component,
Input,
@@ -59,11 +55,9 @@ import { BrowserOnlyPipe } from '../../../shared/utils/browser-only.pipe';
AsyncPipe,
NgbAccordionModule,
TranslateModule,
NgIf,
NgbNavModule,
ThemedSearchComponent,
BrowserOnlyPipe,
NgForOf,
NgxPaginationModule,
SelectableListItemControlComponent,
ListableObjectComponentLoaderComponent,

View File

@@ -7,7 +7,7 @@
<hr>
<div class="d-flex justify-content-end">
<button class="btn btn-outline-primary mr-3" (click)="reset()">
<button class="btn btn-outline-primary me-3" (click)="reset()">
{{ 'access-control-cancel' | translate }}
</button>
<button class="btn btn-primary" [dsBtnDisabled]="!canExport()" (click)="submit()">

View File

@@ -1,7 +1,4 @@
import {
Component,
NO_ERRORS_SCHEMA,
} from '@angular/core';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import {
ComponentFixture,
TestBed,
@@ -65,17 +62,10 @@ describe('BulkAccessComponent', () => {
'file': { },
};
@Component({
selector: 'ds-bulk-access-settings',
template: '',
exportAs: 'dsBulkSettings',
standalone: true,
})
class MockBulkAccessSettingsComponent {
isFormValid = jasmine.createSpy('isFormValid').and.returnValue(false);
getValue = jasmine.createSpy('getValue');
reset = jasmine.createSpy('reset');
}
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'];
@@ -103,9 +93,6 @@ describe('BulkAccessComponent', () => {
BulkAccessSettingsComponent,
],
},
add: {
imports: [MockBulkAccessSettingsComponent],
},
})
.compileComponents();
});
@@ -122,12 +109,13 @@ describe('BulkAccessComponent', () => {
fixture.destroy();
});
describe('when there are no elements selected and step two form is invalid', () => {
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', () => {
@@ -150,6 +138,7 @@ describe('BulkAccessComponent', () => {
(component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState));
fixture.detectChanges();
component.settings = mockSettings;
});
it('should create', () => {
@@ -160,29 +149,15 @@ describe('BulkAccessComponent', () => {
expect(component.objectsSelected$.value).toEqual(expectedIdList);
});
it('should not enable the execute button when there are objects selected and step two form is invalid', () => {
it('should enable the execute button when there are objects selected', () => {
component.objectsSelected$.next(['1234']);
expect(component.canExport()).toBe(false);
expect(component.canExport()).toBe(true);
});
it('should call the settings reset method when reset is called', () => {
component.reset();
expect(component.settings.reset).toHaveBeenCalled();
});
});
describe('when there are elements selected and the step two form is valid', () => {
beforeEach(() => {
(component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState));
fixture.detectChanges();
(component as any).settings.isFormValid.and.returnValue(true);
});
it('should enable the execute button when there are objects selected and step two form is valid', () => {
component.objectsSelected$.next(['1234']);
expect(component.canExport()).toBe(true);
});
it('should call the bulkAccessControlService executeScript method when submit is called', () => {
(component.settings as any).getValue.and.returnValue(mockFormState);

View File

@@ -1,5 +1,4 @@
import {
ChangeDetectionStrategy,
Component,
OnInit,
ViewChild,
@@ -32,7 +31,6 @@ import { BulkAccessSettingsComponent } from './settings/bulk-access-settings.com
BtnDisabledDirective,
],
standalone: true,
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class BulkAccessComponent implements OnInit {
@@ -72,7 +70,7 @@ export class BulkAccessComponent implements OnInit {
}
canExport(): boolean {
return this.objectsSelected$.value?.length > 0 && this.settings?.isFormValid();
return this.objectsSelected$.value?.length > 0;
}
/**

View File

@@ -1,17 +1,11 @@
<ngb-accordion #acc="ngbAccordion" [activeIds]="'settings'">
<ngb-panel [id]="'settings'">
<ng-template ngbPanelHeader>
<ng-template ngbPanelTitle>
<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>

View File

@@ -1,4 +1,4 @@
import { NgIf } from '@angular/common';
import {
Component,
ViewChild,
@@ -16,7 +16,6 @@ import { AccessControlFormContainerComponent } from '../../../shared/access-cont
imports: [
NgbAccordionModule,
TranslateModule,
NgIf,
AccessControlFormContainerComponent,
],
standalone: true,
@@ -43,8 +42,4 @@ export class BulkAccessSettingsComponent {
this.controlForm.reset();
}
isFormValid() {
return this.controlForm.isValid();
}
}

View File

@@ -5,10 +5,10 @@
<h1 id="header" class="pb-2">{{labelPrefix + 'head' | translate}}</h1>
<div>
<button class="mr-auto btn btn-success addEPerson-button"
[routerLink]="'create'">
<button class="me-auto btn btn-success addEPerson-button"
[routerLink]="'create'">
<i class="fas fa-plus"></i>
<span class="d-none d-sm-inline ml-1">{{labelPrefix + 'button.add' | translate}}</span>
<span class="d-none d-sm-inline ms-1">{{labelPrefix + 'button.add' | translate}}</span>
</button>
</div>
</div>
@@ -18,77 +18,84 @@
</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">
<select name="scope" id="scope" formControlName="scope" class="form-select" 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">
<div class="flex-grow-1 me-3 ms-3">
<div class="mb-3 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)">
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>
<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>
class="search-button btn btn-secondary">{{labelPrefix + 'button.see-all' | translate}}</button>
</div>
</form>
<ds-loading *ngIf="searching$ | async"></ds-loading>
<ds-pagination
*ngIf="(pageInfoState$ | async)?.totalElements > 0 && (searching$ | async) !== true"
[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' : (activeEPerson$ | async) === epersonDto.eperson}">
<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)"
@if (searching$ | async) {
<ds-loading></ds-loading>
}
@if ((pageInfoState$ | async)?.totalElements > 0 && (searching$ | async) !== true) {
<ds-pagination
[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>
@for (epersonDto of (ePeopleDto$ | async)?.page; track epersonDto) {
<tr
[ngClass]="{'table-primary' : (activeEPerson$ | async) === epersonDto.eperson}">
<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>
<i class="fas fa-edit fa-fw"></i>
</button>
@if (epersonDto.ableToDelete) {
<button (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>
}
@if ((pageInfoState$ | async)?.totalElements === 0) {
<div class="alert alert-info w-100 mb-2" role="alert">
{{labelPrefix + 'no-items' | translate}}
</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>
</div>

View File

@@ -1,8 +1,6 @@
import {
AsyncPipe,
NgClass,
NgForOf,
NgIf,
} from '@angular/common';
import {
Component,
@@ -72,13 +70,11 @@ import { EPersonFormComponent } from './eperson-form/eperson-form.component';
TranslateModule,
RouterModule,
AsyncPipe,
NgIf,
EPersonFormComponent,
ReactiveFormsModule,
ThemedLoadingComponent,
PaginationComponent,
NgClass,
NgForOf,
],
standalone: true,
})

View File

@@ -2,97 +2,111 @@
<div class="group-form row">
<div class="col-12">
<div *ngIf="activeEPerson$ | async; then editHeader; else createHeader"></div>
<ng-template #createHeader>
<h1 class="border-bottom pb-2">{{messagePrefix + '.create' | translate}}</h1>
</ng-template>
<ng-template #editHeader>
@if (activeEPerson$ | async) {
<h1 class="border-bottom pb-2">{{messagePrefix + '.edit' | translate}}</h1>
</ng-template>
} @else {
<h1 class="border-bottom pb-2">{{messagePrefix + '.create' | translate}}</h1>
}
<ds-form [formId]="formId"
[formModel]="formModel"
[formGroup]="formGroup"
[formLayout]="formLayout"
[displayCancel]="false"
[submitLabel]="submitLabel"
(submitForm)="onSubmit()">
[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" [dsBtnDisabled]="(canReset$ | async) !== true" type="button" (click)="resetPassword()">
<i class="fa fa-key"></i> {{'admin.access-control.epeople.actions.reset' | translate}}
@if (displayResetPassword) {
<div between class="btn-group">
<button class="btn btn-primary" [dsBtnDisabled]="(canReset$ | async) !== true" type="button" (click)="resetPassword()">
<i class="fa fa-key"></i> {{'admin.access-control.epeople.actions.reset' | translate}}
</button>
</div>
}
@if (canImpersonate$ | async) {
<div between class="btn-group ms-1">
@if (!isImpersonated) {
<button class="btn btn-primary" type="button" (click)="impersonate()">
<i class="fa fa-user-secret"></i> {{'admin.access-control.epeople.actions.impersonate' | translate}}
</button>
}
@if (isImpersonated) {
<button 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>
}
@if (canDelete$ | async) {
<button 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>
</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>
<ds-loading [showMessage]="false" *ngIf="!formGroup"></ds-loading>
@if (!formGroup) {
<ds-loading [showMessage]="false"></ds-loading>
}
<div *ngIf="activeEPerson$ | async">
<h2>{{messagePrefix + '.groupsEPersonIsMemberOf' | translate}}</h2>
<ds-loading [showMessage]="false" *ngIf="groups$ | async | dsHasNoValue"></ds-loading>
<ds-pagination
*ngIf="(groups$ | async)?.payload?.totalElements > 0"
[paginationOptions]="config"
[collectionSize]="(groups$ | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true"
(pageChange)="onPageChange($event)">
<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((group.object | async)?.payload) }}
</td>
</tr>
</tbody>
</table>
</div>
</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>
@if (activeEPerson$ | async) {
<div>
<h2>{{messagePrefix + '.groupsEPersonIsMemberOf' | translate}}</h2>
@if (groups$ | async | dsHasNoValue) {
<ds-loading [showMessage]="false"></ds-loading>
}
@if ((groups$ | async)?.payload?.totalElements > 0) {
<ds-pagination
[paginationOptions]="config"
[collectionSize]="(groups$ | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true"
(pageChange)="onPageChange($event)">
<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>
@for (group of (groups$ | async)?.payload?.page; track group) {
<tr>
<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((group.object | async)?.payload) }}
</td>
</tr>
}
</tbody>
</table>
</div>
</ds-pagination>
}
@if ((groups$ | async)?.payload?.totalElements === 0) {
<div 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>
</div>

View File

@@ -1,7 +1,6 @@
import {
AsyncPipe,
NgFor,
NgIf,
NgClass,
} from '@angular/common';
import {
ChangeDetectorRef,
@@ -83,10 +82,9 @@ import { ValidateEmailNotTaken } from './validators/email-taken.validator';
templateUrl: './eperson-form.component.html',
imports: [
FormComponent,
NgIf,
NgFor,
AsyncPipe,
TranslateModule,
NgClass,
ThemedLoadingComponent,
PaginationComponent,
RouterLink,

View File

@@ -2,13 +2,7 @@
<div class="group-form row">
<div class="col-12">
<div *ngIf="activeGroup$ | async; then editHeader; else createHeader"></div>
<ng-template #createHeader>
<h1 class="border-bottom pb-2">{{messagePrefix + '.head.create' | translate}}</h1>
</ng-template>
<ng-template #editHeader>
@if (activeGroup$ | async) {
<h1 class="border-bottom pb-2">
<span
*dsContextHelp="{
@@ -17,47 +11,61 @@
iconPlacement: 'right',
tooltipPlacement: ['right', 'bottom']
}"
>
>
{{messagePrefix + '.head.edit' | translate}}
</span>
</h1>
</ng-template>
} @else {
<h1 class="border-bottom pb-2">{{messagePrefix + '.head.create' | translate}}</h1>
}
<ng-container *ngIf="(activeGroup$ | async) as groupBeingEdited">
<ds-alert *ngIf="groupBeingEdited?.permanent" [type]="AlertType.Warning"
[content]="messagePrefix + '.alert.permanent'"></ds-alert>
<ng-container *ngIf="(activeGroupLinkedDSO$ | async) as activeGroupLinkedDSO">
<ds-alert *ngIf="(canEdit$ | async) !== true" [type]="AlertType.Warning"
[content]="(messagePrefix + '.alert.workflowGroup' | translate:{ name: dsoNameService.getName(activeGroupLinkedDSO), comcol: activeGroupLinkedDSO.type, comcolEditRolesRoute: (linkedEditRolesRoute$ | async) })">
</ds-alert>
</ng-container>
</ng-container>
@if ((activeGroup$ | async); as groupBeingEdited) {
@if (groupBeingEdited?.permanent) {
<ds-alert [type]="AlertType.Warning"
[content]="messagePrefix + '.alert.permanent'"></ds-alert>
}
@if ((activeGroupLinkedDSO$ | async); as activeGroupLinkedDSO) {
@if ((canEdit$ | async) !== true) {
<ds-alert [type]="AlertType.Warning"
[content]="(messagePrefix + '.alert.workflowGroup' | translate:{ name: dsoNameService.getName(activeGroupLinkedDSO), comcol: activeGroupLinkedDSO.type, comcolEditRolesRoute: (linkedEditRolesRoute$ | async) })">
</ds-alert>
}
}
}
<ds-form [formId]="formId"
[formModel]="formModel"
[formGroup]="formGroup"
[formLayout]="formLayout"
[displayCancel]="false"
(submitForm)="onSubmit()">
[formModel]="formModel"
[formGroup]="formGroup"
[formLayout]="formLayout"
[displayCancel]="false"
(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 after *ngIf="(canEdit$ | async) && !(activeGroup$ | async)?.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>
</ds-form>
class="btn btn-outline-secondary"><i class="fas fa-arrow-left"></i> {{messagePrefix + '.return' | translate}}</button>
</div>
@if ((canEdit$ | async) && !(activeGroup$ | async)?.permanent) {
<div after 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>
}
</ds-form>
<ng-container *ngIf="(activeGroup$ | async) as groupBeingEdited">
<div class="mb-5">
<ds-members-list *ngIf="groupBeingEdited !== undefined"
[messagePrefix]="messagePrefix + '.members-list'"></ds-members-list>
</div>
<ds-subgroups-list *ngIf="groupBeingEdited !== undefined"
[messagePrefix]="messagePrefix + '.subgroups-list'"></ds-subgroups-list>
</ng-container>
@if ((activeGroup$ | async); as groupBeingEdited) {
<div class="mb-5">
@if (groupBeingEdited !== undefined) {
<ds-members-list
[messagePrefix]="messagePrefix + '.members-list'"></ds-members-list>
}
</div>
@if (groupBeingEdited !== undefined) {
<ds-subgroups-list
[messagePrefix]="messagePrefix + '.subgroups-list'"></ds-subgroups-list>
}
}
</div>
</div>
</div>
</div>

View File

@@ -1,7 +1,4 @@
import {
AsyncPipe,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
ChangeDetectorRef,
Component,
@@ -92,7 +89,6 @@ import { ValidateGroupExists } from './validators/group-exists.validator';
imports: [
FormComponent,
AlertComponent,
NgIf,
AsyncPipe,
TranslateModule,
ContextHelpDirective,
@@ -504,7 +500,7 @@ export class GroupFormComponent implements OnInit, OnDestroy {
this.groupDataService.cancelEditGroup();
this.subs.filter((sub) => hasValue(sub)).forEach((sub) => sub.unsubscribe());
if (hasValue(this.groupNameValueChangeSubscribe)) {
if ( hasValue(this.groupNameValueChangeSubscribe) ) {
this.groupNameValueChangeSubscribe.unsubscribe();
}

View File

@@ -3,63 +3,70 @@
<h3>{{messagePrefix + '.headMembers' | translate}}</h3>
<ds-pagination *ngIf="(ePeopleMembersOfGroup | async)?.totalElements > 0"
[paginationOptions]="config"
[collectionSize]="(ePeopleMembersOfGroup | async)?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
@if ((ePeopleMembersOfGroup | async)?.totalElements > 0) {
<ds-pagination
[paginationOptions]="config"
[collectionSize]="(ePeopleMembersOfGroup | async)?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="ePeopleMembersOfGroup" 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>
@for (epersonDTO of (ePeopleMembersOfGroup | async)?.page; track epersonDTO) {
<tr>
<td class="align-middle">{{epersonDTO.eperson.id}}</td>
<td class="align-middle">
<a [routerLink]="getEPersonEditRoute(epersonDTO.eperson.id)">
{{ dsoNameService.getName(epersonDTO.eperson) }}
</a>
</td>
<td class="align-middle">
{{messagePrefix + '.table.email' | translate}}: {{ epersonDTO.eperson.email ? epersonDTO.eperson.email : '-' }}<br/>
{{messagePrefix + '.table.netid' | translate}}: {{ epersonDTO.eperson.netid ? epersonDTO.eperson.netid : '-' }}
</td>
<td class="align-middle">
<div class="btn-group edit-field">
@if (epersonDTO.ableToDelete) {
<button (click)="deleteMemberFromGroup(epersonDTO.eperson)"
[dsBtnDisabled]="actionConfig.remove.disabled"
[ngClass]="['btn btn-sm', actionConfig.remove.css]"
title="{{messagePrefix + '.table.edit.buttons.remove' | translate: { name: dsoNameService.getName(epersonDTO.eperson) } }}">
<i [ngClass]="actionConfig.remove.icon"></i>
</button>
}
@if (!epersonDTO.ableToDelete) {
<button
(click)="addMemberToGroup(epersonDTO.eperson)"
[dsBtnDisabled]="actionConfig.add.disabled"
[ngClass]="['btn btn-sm', actionConfig.add.css]"
title="{{messagePrefix + '.table.edit.buttons.add' | translate: { name: dsoNameService.getName(epersonDTO.eperson) } }}">
<i [ngClass]="actionConfig.add.icon"></i>
</button>
}
</div>
</td>
</tr>
}
</tbody>
</table>
</div>
</ds-pagination>
}
<div class="table-responsive">
<table id="ePeopleMembersOfGroup" 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 epersonDTO of (ePeopleMembersOfGroup | async)?.page">
<td class="align-middle">{{epersonDTO.eperson.id}}</td>
<td class="align-middle">
<a [routerLink]="getEPersonEditRoute(epersonDTO.eperson.id)">
{{ dsoNameService.getName(epersonDTO.eperson) }}
</a>
</td>
<td class="align-middle">
{{messagePrefix + '.table.email' | translate}}: {{ epersonDTO.eperson.email ? epersonDTO.eperson.email : '-' }}<br/>
{{messagePrefix + '.table.netid' | translate}}: {{ epersonDTO.eperson.netid ? epersonDTO.eperson.netid : '-' }}
</td>
<td class="align-middle">
<div class="btn-group edit-field">
<button (click)="deleteMemberFromGroup(epersonDTO.eperson)"
*ngIf="epersonDTO.ableToDelete"
[dsBtnDisabled]="actionConfig.remove.disabled"
[ngClass]="['btn btn-sm', actionConfig.remove.css]"
title="{{messagePrefix + '.table.edit.buttons.remove' | translate: { name: dsoNameService.getName(epersonDTO.eperson) } }}">
<i [ngClass]="actionConfig.remove.icon"></i>
</button>
<button *ngIf="!epersonDTO.ableToDelete"
(click)="addMemberToGroup(epersonDTO.eperson)"
[dsBtnDisabled]="actionConfig.add.disabled"
[ngClass]="['btn btn-sm', actionConfig.add.css]"
title="{{messagePrefix + '.table.edit.buttons.add' | translate: { name: dsoNameService.getName(epersonDTO.eperson) } }}">
<i [ngClass]="actionConfig.add.icon"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
@if ((ePeopleMembersOfGroup | async) === undefined || (ePeopleMembersOfGroup | async)?.totalElements === 0) {
<div class="alert alert-info w-100 mb-2"
role="alert">
{{messagePrefix + '.no-members-yet' | translate}}
</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
@@ -69,77 +76,81 @@
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">
<div class="flex-grow-1 me-3">
<div class="form-group input-group me-3">
<input type="text" name="query" id="query" formControlName="query"
class="form-control" aria-label="Search input">
class="form-control" aria-label="Search input">
<span class="input-group-append">
<button type="submit" class="search-button btn btn-primary">
<i class="fas fa-search"></i> {{ messagePrefix + '.search.button' | translate }}</button>
</span>
<button type="submit" class="search-button btn btn-primary">
<i class="fas fa-search"></i> {{ messagePrefix + '.search.button' | translate }}</button>
</span>
</div>
</div>
</div>
<div>
<button (click)="clearFormAndResetResult();"
class="btn btn-secondary">{{messagePrefix + '.button.see-all' | translate}}</button>
</div>
</form>
<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">
@if ((ePeopleSearch | async)?.totalElements > 0) {
<ds-pagination
[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>
@for (eperson of (ePeopleSearch | async)?.page; track eperson) {
<tr>
<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)"
[dsBtnDisabled]="actionConfig.add.disabled"
[ngClass]="['btn btn-sm', actionConfig.add.css]"
title="{{messagePrefix + '.table.edit.buttons.add' | translate: { name: dsoNameService.getName(eperson) } }}">
<i [ngClass]="actionConfig.add.icon"></i>
</button>
</div>
</td>
</tr>
}
</tbody>
</table>
</div>
</ds-pagination>
}
<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)"
[dsBtnDisabled]="actionConfig.add.disabled"
[ngClass]="['btn btn-sm', actionConfig.add.css]"
title="{{messagePrefix + '.table.edit.buttons.add' | translate: { name: dsoNameService.getName(eperson) } }}">
<i [ngClass]="actionConfig.add.icon"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
@if ((ePeopleSearch | async)?.totalElements === 0 && searchDone) {
<div
class="alert alert-info w-100 mb-2"
role="alert">
{{messagePrefix + '.no-items' | translate}}
</div>
}
</ds-pagination>
<div *ngIf="(ePeopleSearch | async)?.totalElements === 0 && searchDone"
class="alert alert-info w-100 mb-2"
role="alert">
{{messagePrefix + '.no-items' | translate}}
</div>
</ng-container>
</ng-container>

View File

@@ -1,8 +1,6 @@
import {
AsyncPipe,
NgClass,
NgForOf,
NgIf,
} from '@angular/common';
import {
Component,
@@ -109,11 +107,9 @@ export interface EPersonListActionConfig {
ContextHelpDirective,
ReactiveFormsModule,
PaginationComponent,
NgIf,
AsyncPipe,
RouterLink,
NgClass,
NgForOf,
BtnDisabledDirective,
],
standalone: true,

View File

@@ -3,51 +3,56 @@
<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)"
@if ((subGroups$ | async)?.payload?.totalElements > 0) {
<ds-pagination
[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>
@for (group of (subGroups$ | async)?.payload?.page; track group) {
<tr>
<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>
<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>
@if ((subGroups$ | async)?.payload?.totalElements === 0) {
<div 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="{
@@ -56,75 +61,80 @@
iconPlacement: 'right',
tooltipPlacement: ['top', 'right', 'bottom']
}"
>
>
{{messagePrefix + '.search.head' | translate}}
</span>
</h4>
<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">
<div class="flex-grow-1 me-3">
<div class="mb-3 input-group me-3">
<input type="text" name="query" id="query" formControlName="query"
class="form-control" aria-label="Search input">
class="form-control" aria-label="Search input">
<span class="input-group-append">
<button type="submit" class="search-button btn btn-primary">
<i class="fas fa-search"></i> {{ messagePrefix + '.search.button' | translate }}
</button>
<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 float-right">
<button (click)="clearFormAndResetResult();" class="btn btn-secondary float-end">
{{messagePrefix + '.button.see-all' | translate}}
</button>
</div>
</form>
<ds-pagination *ngIf="(searchResults$ | async)?.payload?.totalElements > 0"
[paginationOptions]="configSearch"
[collectionSize]="(searchResults$ | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="groupsSearch" 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 class="align-middle">{{messagePrefix + '.table.edit' | translate}}</th>
</tr>
</thead>
<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)]">
{{ 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)="addSubgroupToGroup(group)"
@if ((searchResults$ | async)?.payload?.totalElements > 0) {
<ds-pagination
[paginationOptions]="configSearch"
[collectionSize]="(searchResults$ | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="groupsSearch" 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 class="align-middle">{{messagePrefix + '.table.edit' | translate}}</th>
</tr>
</thead>
<tbody>
@for (group of (searchResults$ | async)?.payload?.page; track group) {
<tr>
<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)="addSubgroupToGroup(group)"
class="btn btn-outline-primary btn-sm addButton"
title="{{messagePrefix + '.table.edit.buttons.add' | translate: { name: dsoNameService.getName(group) } }}">
<i class="fas fa-plus fa-fw"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</ds-pagination>
<i class="fas fa-plus fa-fw"></i>
</button>
</div>
</td>
</tr>
}
</tbody>
</table>
</div>
</ds-pagination>
}
<div *ngIf="(searchResults$ | async)?.payload?.totalElements === 0 && searchDone" class="alert alert-info w-100 mb-2"
role="alert">
{{messagePrefix + '.no-items' | translate}}
</div>
@if ((searchResults$ | async)?.payload?.totalElements === 0 && searchDone) {
<div class="alert alert-info w-100 mb-2"
role="alert">
{{messagePrefix + '.no-items' | translate}}
</div>
}
</ng-container>

View File

@@ -1,8 +1,4 @@
import {
AsyncPipe,
NgForOf,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
Component,
Input,
@@ -65,12 +61,10 @@ enum SubKey {
imports: [
RouterLink,
AsyncPipe,
NgForOf,
ContextHelpDirective,
TranslateModule,
ReactiveFormsModule,
PaginationComponent,
NgIf,
],
standalone: true,
})

View File

@@ -4,21 +4,21 @@
<div class="d-flex justify-content-between border-bottom mb-3">
<h1 id="header" class="pb-2">{{messagePrefix + 'head' | translate}}</h1>
<div>
<button class="mr-auto btn btn-success"
[routerLink]="'create'">
<button class="me-auto btn btn-success"
[routerLink]="'create'">
<i class="fas fa-plus"></i>
<span class="d-none d-sm-inline ml-1">{{messagePrefix + 'button.add' | translate}}</span>
<span class="d-none d-sm-inline ms-1">{{messagePrefix + 'button.add' | translate}}</span>
</button>
</div>
</div>
<h2 id="search" class="border-bottom pb-2">{{messagePrefix + 'search.head' | translate}}</h2>
<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">
<div class="flex-grow-1 me-3">
<div class="mb-3 input-group">
<input type="text" name="query" id="query" formControlName="query"
class="form-control" [attr.aria-label]="messagePrefix + 'search.placeholder' | translate"
[placeholder]="(messagePrefix + 'search.placeholder' | translate)" >
class="form-control" [attr.aria-label]="messagePrefix + 'search.placeholder' | translate"
[placeholder]="(messagePrefix + 'search.placeholder' | translate)" >
<span class="input-group-append">
<button type="submit" class="search-button btn btn-primary">
<i class="fas fa-search"></i> {{ messagePrefix + 'search.button' | translate }}
@@ -33,66 +33,78 @@
</div>
</form>
<ds-loading *ngIf="loading$ | async"></ds-loading>
<ds-pagination
*ngIf="(pageInfoState$ | async)?.totalElements > 0 && (loading$ | async) !== true"
[paginationOptions]="config"
[collectionSize]="(pageInfoState$ | async)?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
@if (loading$ | async) {
<ds-loading></ds-loading>
}
@if ((pageInfoState$ | async)?.totalElements > 0 && (loading$ | async) !== true) {
<ds-pagination
[paginationOptions]="config"
[collectionSize]="(pageInfoState$ | async)?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="groups" class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th scope="col">{{messagePrefix + 'table.id' | translate}}</th>
<th scope="col">{{messagePrefix + 'table.name' | translate}}</th>
<th scope="col">{{messagePrefix + 'table.collectionOrCommunity' | translate}}</th>
<th scope="col">{{messagePrefix + 'table.members' | translate}}</th>
<th>{{messagePrefix + 'table.edit' | translate}}</th>
</tr>
</thead>
<tbody>
@for (groupDto of (groupsDto$ | async)?.page; track groupDto) {
<tr>
<td>{{groupDto.group.id}}</td>
<td>{{ dsoNameService.getName(groupDto.group) }}</td>
<td>{{ dsoNameService.getName((groupDto.group.object | async)?.payload) }}</td>
<td>{{groupDto.epersons?.totalElements + groupDto.subgroups?.totalElements}}</td>
<td>
<div class="btn-group edit-field">
@switch (groupDto.ableToEdit) {
@case (true) {
<button
[routerLink]="groupService.getGroupEditPageRouterLink(groupDto.group)"
class="btn btn-outline-primary btn-sm btn-edit"
title="{{messagePrefix + 'table.edit.buttons.edit' | translate: {name: dsoNameService.getName(groupDto.group) } }}"
>
<i class="fas fa-edit fa-fw"></i>
</button>
}
@case (false) {
<button
[dsBtnDisabled]="true"
class="btn btn-outline-primary btn-sm btn-edit"
placement="left"
[ngbTooltip]="'admin.access-control.epeople.table.edit.buttons.edit-disabled' | translate"
>
<i class="fas fa-edit fa-fw"></i>
</button>
}
}
@if (!groupDto.group?.permanent && groupDto.ableToDelete) {
<button
(click)="deleteGroup(groupDto)" class="btn btn-outline-danger btn-sm btn-delete"
title="{{messagePrefix + 'table.edit.buttons.remove' | translate: {name: dsoNameService.getName(groupDto.group) } }}">
<i class="fas fa-trash-alt fa-fw"></i>
</button>
}
</div>
</td>
</tr>
}
</tbody>
</table>
</div>
</ds-pagination>
}
<div class="table-responsive">
<table id="groups" class="table table-striped table-hover table-bordered">
<thead>
<tr>
<th scope="col">{{messagePrefix + 'table.id' | translate}}</th>
<th scope="col">{{messagePrefix + 'table.name' | translate}}</th>
<th scope="col">{{messagePrefix + 'table.collectionOrCommunity' | translate}}</th>
<th scope="col">{{messagePrefix + 'table.members' | translate}}</th>
<th>{{messagePrefix + 'table.edit' | translate}}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let groupDto of (groupsDto$ | async)?.page">
<td>{{groupDto.group.id}}</td>
<td>{{ dsoNameService.getName(groupDto.group) }}</td>
<td>{{ dsoNameService.getName((groupDto.group.object | async)?.payload) }}</td>
<td>{{groupDto.epersons?.totalElements + groupDto.subgroups?.totalElements}}</td>
<td>
<div class="btn-group edit-field">
<ng-container [ngSwitch]="groupDto.ableToEdit">
<button *ngSwitchCase="true"
[routerLink]="groupService.getGroupEditPageRouterLink(groupDto.group)"
class="btn btn-outline-primary btn-sm btn-edit"
title="{{messagePrefix + 'table.edit.buttons.edit' | translate: {name: dsoNameService.getName(groupDto.group) } }}"
>
<i class="fas fa-edit fa-fw"></i>
</button>
<button *ngSwitchCase="false"
[dsBtnDisabled]="true"
class="btn btn-outline-primary btn-sm btn-edit"
placement="left"
[ngbTooltip]="'admin.access-control.epeople.table.edit.buttons.edit-disabled' | translate"
>
<i class="fas fa-edit fa-fw"></i>
</button>
</ng-container>
<button *ngIf="!groupDto.group?.permanent && groupDto.ableToDelete"
(click)="deleteGroup(groupDto)" class="btn btn-outline-danger btn-sm btn-delete"
title="{{messagePrefix + 'table.edit.buttons.remove' | translate: {name: dsoNameService.getName(groupDto.group) } }}">
<i class="fas fa-trash-alt fa-fw"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
@if ((pageInfoState$ | async)?.totalElements === 0) {
<div class="alert alert-info w-100 mb-2" role="alert">
{{messagePrefix + 'no-items' | translate}}
</div>
</ds-pagination>
<div *ngIf="(pageInfoState$ | async)?.totalElements === 0" class="alert alert-info w-100 mb-2" role="alert">
{{messagePrefix + 'no-items' | translate}}
</div>
}
</div>
</div>

View File

@@ -1,10 +1,4 @@
import {
AsyncPipe,
NgForOf,
NgIf,
NgSwitch,
NgSwitchCase,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
Component,
OnDestroy,
@@ -79,12 +73,8 @@ import { followLink } from '../../shared/utils/follow-link-config.model';
RouterLink,
ReactiveFormsModule,
AsyncPipe,
NgIf,
PaginationComponent,
NgSwitch,
NgSwitchCase,
NgbTooltipModule,
NgForOf,
BtnDisabledDirective,
],
standalone: true,

View File

@@ -1,11 +0,0 @@
import { Config } from '../../config/config.interface';
/**
* Configuration interface used by the AccessibilitySettingsService
*/
export class AccessibilitySettingsConfig implements Config {
/**
* The duration in days after which the accessibility settings cookie expires
*/
cookieExpirationDuration: number;
}

View File

@@ -1,419 +0,0 @@
import {
fakeAsync,
flush,
} from '@angular/core/testing';
import { of } from 'rxjs';
import { AppConfig } from '../../config/app-config.interface';
import { AuthService } from '../core/auth/auth.service';
import { EPersonDataService } from '../core/eperson/eperson-data.service';
import { EPerson } from '../core/eperson/models/eperson.model';
import { CookieService } from '../core/services/cookie.service';
import { KlaroServiceStub } from '../shared/cookies/klaro.service.stub';
import { CookieServiceMock } from '../shared/mocks/cookie.service.mock';
import {
createFailedRemoteDataObject$,
createSuccessfulRemoteDataObject$,
} from '../shared/remote-data.utils';
import { AuthServiceStub } from '../shared/testing/auth-service.stub';
import {
ACCESSIBILITY_COOKIE,
ACCESSIBILITY_SETTINGS_METADATA_KEY,
AccessibilitySettings,
AccessibilitySettingsFormValues,
AccessibilitySettingsService,
FullAccessibilitySettings,
} from './accessibility-settings.service';
describe('accessibilitySettingsService', () => {
let service: AccessibilitySettingsService;
let cookieService: CookieServiceMock;
let authService: AuthServiceStub;
let ePersonService: EPersonDataService;
let klaroService: KlaroServiceStub;
let appConfig: AppConfig;
beforeEach(() => {
cookieService = new CookieServiceMock();
authService = new AuthServiceStub();
klaroService = new KlaroServiceStub();
appConfig = { accessibility: { cookieExpirationDuration: 10 } } as AppConfig;
klaroService.getSavedPreferences.and.returnValue(of({ accessibility: true }));
ePersonService = jasmine.createSpyObj('ePersonService', {
createPatchFromCache: of([{
op: 'add',
value: null,
}]),
patch: of({}),
});
service = new AccessibilitySettingsService(
cookieService as unknown as CookieService,
authService as unknown as AuthService,
ePersonService,
klaroService,
appConfig,
);
});
describe('get', () => {
it('should return the setting if it is set', () => {
const settings: AccessibilitySettings = {
notificationTimeOut: '1000',
};
service.getAll = jasmine.createSpy('getAll').and.returnValue(of(settings));
service.get('notificationTimeOut', 'default').subscribe(value =>
expect(value).toEqual('1000'),
);
});
it('should return the default value if the setting is not set', () => {
const settings: AccessibilitySettings = {
notificationTimeOut: '1000',
};
service.getAll = jasmine.createSpy('getAll').and.returnValue(of(settings));
service.get('liveRegionTimeOut', 'default').subscribe(value =>
expect(value).toEqual('default'),
);
});
});
describe('getAsNumber', () => {
it('should return the setting as number if the value for the setting can be parsed to a number', () => {
service.get = jasmine.createSpy('get').and.returnValue(of('1000'));
service.getAsNumber('notificationTimeOut').subscribe(value =>
expect(value).toEqual(1000),
);
});
it('should return the default value if no value is set for the setting', () => {
service.get = jasmine.createSpy('get').and.returnValue(of(null));
service.getAsNumber('notificationTimeOut', 123).subscribe(value =>
expect(value).toEqual(123),
);
});
it('should return the default value if the value for the setting can not be parsed to a number', () => {
service.get = jasmine.createSpy('get').and.returnValue(of('text'));
service.getAsNumber('notificationTimeOut', 123).subscribe(value =>
expect(value).toEqual(123),
);
});
});
describe('getAll', () => {
it('should attempt to get the settings from metadata first', () => {
service.getAllSettingsFromAuthenticatedUserMetadata =
jasmine.createSpy('getAllSettingsFromAuthenticatedUserMetadata').and.returnValue(of({ }));
service.getAll().subscribe();
expect(service.getAllSettingsFromAuthenticatedUserMetadata).toHaveBeenCalled();
});
it('should attempt to get the settings from the cookie if the settings from metadata are empty', () => {
service.getAllSettingsFromAuthenticatedUserMetadata =
jasmine.createSpy('getAllSettingsFromAuthenticatedUserMetadata').and.returnValue(of({ }));
service.getAllSettingsFromCookie = jasmine.createSpy('getAllSettingsFromCookie').and.returnValue({ });
service.getAll().subscribe();
expect(service.getAllSettingsFromCookie).toHaveBeenCalled();
});
it('should not attempt to get the settings from the cookie if the settings from metadata are not empty', () => {
const settings: AccessibilitySettings = {
notificationTimeOut: '1000',
};
service.getAllSettingsFromAuthenticatedUserMetadata =
jasmine.createSpy('getAllSettingsFromAuthenticatedUserMetadata').and.returnValue(of(settings));
service.getAllSettingsFromCookie = jasmine.createSpy('getAllSettingsFromCookie').and.returnValue({ });
service.getAll().subscribe();
expect(service.getAllSettingsFromCookie).not.toHaveBeenCalled();
});
it('should return an empty object if both are empty', () => {
service.getAllSettingsFromAuthenticatedUserMetadata =
jasmine.createSpy('getAllSettingsFromAuthenticatedUserMetadata').and.returnValue(of({ }));
service.getAllSettingsFromCookie = jasmine.createSpy('getAllSettingsFromCookie').and.returnValue({ });
service.getAll().subscribe(value => expect(value).toEqual({}));
});
});
describe('getAllSettingsFromCookie', () => {
it('should retrieve the settings from the cookie', () => {
cookieService.get = jasmine.createSpy();
service.getAllSettingsFromCookie();
expect(cookieService.get).toHaveBeenCalledWith(ACCESSIBILITY_COOKIE);
});
});
describe('getAllSettingsFromAuthenticatedUserMetadata', () => {
it('should retrieve all settings from the user\'s metadata', () => {
const settings = { 'liveRegionTimeOut': '1000' };
const user = new EPerson();
user.setMetadata(ACCESSIBILITY_SETTINGS_METADATA_KEY, null, JSON.stringify(settings));
authService.getAuthenticatedUserFromStoreIfAuthenticated =
jasmine.createSpy('getAuthenticatedUserFromStoreIfAuthenticated').and.returnValue(of(user));
service.getAllSettingsFromAuthenticatedUserMetadata().subscribe(value =>
expect(value).toEqual(settings),
);
});
});
describe('set', () => {
it('should correctly update the chosen setting', () => {
service.updateSettings = jasmine.createSpy('updateSettings');
service.set('liveRegionTimeOut', '500');
expect(service.updateSettings).toHaveBeenCalledWith({ liveRegionTimeOut: '500' });
});
});
describe('setSettings', () => {
beforeEach(() => {
service.setSettingsInCookie = jasmine.createSpy('setSettingsInCookie').and.returnValue(of('cookie'));
});
it('should attempt to set settings in metadata', () => {
service.setSettingsInAuthenticatedUserMetadata =
jasmine.createSpy('setSettingsInAuthenticatedUserMetadata').and.returnValue(of('failed'));
const settings: AccessibilitySettings = {
notificationTimeOut: '1000',
};
service.setSettings(settings).subscribe();
expect(service.setSettingsInAuthenticatedUserMetadata).toHaveBeenCalledWith(settings);
});
it('should set settings in cookie if metadata failed', () => {
service.setSettingsInAuthenticatedUserMetadata =
jasmine.createSpy('setSettingsInAuthenticatedUserMetadata').and.returnValue(of(false));
const settings: AccessibilitySettings = {
notificationTimeOut: '1000',
};
service.setSettings(settings).subscribe();
expect(service.setSettingsInCookie).toHaveBeenCalled();
});
it('should not set settings in cookie if metadata succeeded', () => {
service.setSettingsInAuthenticatedUserMetadata =
jasmine.createSpy('setSettingsInAuthenticatedUserMetadata').and.returnValue(of('metadata'));
const settings: AccessibilitySettings = {
notificationTimeOut: '1000',
};
service.setSettings(settings).subscribe();
expect(service.setSettingsInCookie).not.toHaveBeenCalled();
});
it('should return \'metadata\' if settings are stored in metadata', () => {
service.setSettingsInAuthenticatedUserMetadata =
jasmine.createSpy('setSettingsInAuthenticatedUserMetadata').and.returnValue(of('metadata'));
const settings: AccessibilitySettings = {
notificationTimeOut: '1000',
};
service.setSettings(settings).subscribe(value =>
expect(value).toEqual('metadata'),
);
});
it('should return \'cookie\' if settings are stored in cookie', () => {
service.setSettingsInAuthenticatedUserMetadata =
jasmine.createSpy('setSettingsInAuthenticatedUserMetadata').and.returnValue(of(false));
const settings: AccessibilitySettings = {
notificationTimeOut: '1000',
};
service.setSettings(settings).subscribe(value =>
expect(value).toEqual('cookie'),
);
});
});
describe('updateSettings', () => {
it('should call setSettings with the updated settings', () => {
const beforeSettings: AccessibilitySettings = {
notificationTimeOut: '1000',
};
service.getAll = jasmine.createSpy('getAll').and.returnValue(of(beforeSettings));
service.setSettings = jasmine.createSpy('setSettings').and.returnValue(of('cookie'));
const newSettings: AccessibilitySettings = {
liveRegionTimeOut: '2000',
};
const combinedSettings: AccessibilitySettings = {
notificationTimeOut: '1000',
liveRegionTimeOut: '2000',
};
service.updateSettings(newSettings).subscribe();
expect(service.setSettings).toHaveBeenCalledWith(combinedSettings);
});
});
describe('setSettingsInAuthenticatedUserMetadata', () => {
beforeEach(() => {
service.setSettingsInMetadata = jasmine.createSpy('setSettingsInMetadata').and.returnValue(of(null));
});
it('should store settings in metadata when the user is authenticated', fakeAsync(() => {
const user = new EPerson();
authService.getAuthenticatedUserFromStoreIfAuthenticated = jasmine.createSpy().and.returnValue(of(user));
service.setSettingsInAuthenticatedUserMetadata({}).subscribe();
flush();
expect(service.setSettingsInMetadata).toHaveBeenCalled();
}));
it('should emit "failed" when the user is not authenticated', fakeAsync(() => {
authService.getAuthenticatedUserFromStoreIfAuthenticated = jasmine.createSpy().and.returnValue(of(null));
service.setSettingsInAuthenticatedUserMetadata({})
.subscribe(value => expect(value).toEqual('failed'));
flush();
expect(service.setSettingsInMetadata).not.toHaveBeenCalled();
}));
});
describe('setSettingsInMetadata', () => {
const ePerson = new EPerson();
beforeEach(() => {
ePerson.setMetadata = jasmine.createSpy('setMetadata');
ePerson.removeMetadata = jasmine.createSpy('removeMetadata');
});
it('should set the settings in metadata', () => {
service.setSettingsInMetadata(ePerson, { ['liveRegionTimeOut']: '500' }).subscribe();
expect(ePerson.setMetadata).toHaveBeenCalled();
});
it('should remove the metadata when the settings are emtpy', () => {
service.setSettingsInMetadata(ePerson, {}).subscribe();
expect(ePerson.setMetadata).not.toHaveBeenCalled();
expect(ePerson.removeMetadata).toHaveBeenCalled();
});
it('should create a patch with the metadata changes', () => {
service.setSettingsInMetadata(ePerson, { ['liveRegionTimeOut']: '500' }).subscribe();
expect(ePersonService.createPatchFromCache).toHaveBeenCalled();
});
it('should send the patch request', () => {
service.setSettingsInMetadata(ePerson, { ['liveRegionTimeOut']: '500' }).subscribe();
expect(ePersonService.patch).toHaveBeenCalled();
});
it('should emit "metadata" when the update succeeded', fakeAsync(() => {
ePersonService.patch = jasmine.createSpy().and.returnValue(createSuccessfulRemoteDataObject$({}));
service.setSettingsInMetadata(ePerson, { ['liveRegionTimeOut']: '500' })
.subscribe(value => {
expect(value).toEqual('metadata');
});
flush();
}));
it('should emit "failed" when the update failed', fakeAsync(() => {
ePersonService.patch = jasmine.createSpy().and.returnValue(createFailedRemoteDataObject$());
service.setSettingsInMetadata(ePerson, { ['liveRegionTimeOut']: '500' })
.subscribe(value => {
expect(value).toEqual('failed');
});
flush();
}));
});
describe('setSettingsInCookie', () => {
beforeEach(() => {
cookieService.set = jasmine.createSpy('set');
cookieService.remove = jasmine.createSpy('remove');
});
it('should fail to store settings in the cookie when the user has not accepted the cookie', fakeAsync(() => {
klaroService.getSavedPreferences.and.returnValue(of({ accessibility: false }));
service.setSettingsInCookie({ ['liveRegionTimeOut']: '500' }).subscribe(value => {
expect(value).toEqual('failed');
});
flush();
expect(cookieService.set).not.toHaveBeenCalled();
}));
it('should store the settings in a cookie', fakeAsync(() => {
service.setSettingsInCookie({ ['liveRegionTimeOut']: '500' }).subscribe(value => {
expect(value).toEqual('cookie');
});
flush();
expect(cookieService.set).toHaveBeenCalled();
}));
it('should remove the cookie when the settings are empty', fakeAsync(() => {
service.setSettingsInCookie({}).subscribe(value => {
expect(value).toEqual('cookie');
});
flush();
expect(cookieService.set).not.toHaveBeenCalled();
expect(cookieService.remove).toHaveBeenCalled();
}));
});
describe('convertFormValuesToStoredValues', () => {
it('should reset the notificationTimeOut when timeOut is enabled but set to "0"', () => {
const formValues: AccessibilitySettingsFormValues = {
notificationTimeOutEnabled: true,
notificationTimeOut: '0',
liveRegionTimeOut: null,
};
const storedValues: FullAccessibilitySettings = service.convertFormValuesToStoredValues(formValues);
expect('notificationTimeOut' in storedValues).toBeFalse();
});
});
it('should keep the notificationTimeOut when timeOut is enabled and differs from "0"', () => {
const formValues: AccessibilitySettingsFormValues = {
notificationTimeOutEnabled: true,
notificationTimeOut: '3',
liveRegionTimeOut: null,
};
const storedValues: FullAccessibilitySettings = service.convertFormValuesToStoredValues(formValues);
expect('notificationTimeOut' in storedValues).toBeTrue();
});
});

View File

@@ -1,45 +0,0 @@
import { of } from 'rxjs';
import { AccessibilitySettingsService } from './accessibility-settings.service';
export function getAccessibilitySettingsServiceStub(): AccessibilitySettingsService {
return new AccessibilitySettingsServiceStub() as unknown as AccessibilitySettingsService;
}
export class AccessibilitySettingsServiceStub {
getAllAccessibilitySettingKeys = jasmine.createSpy('getAllAccessibilitySettingKeys').and.returnValue([]);
get = jasmine.createSpy('get').and.returnValue(of(null));
getAsNumber = jasmine.createSpy('getAsNumber').and.returnValue(of(0));
getAll = jasmine.createSpy('getAll').and.returnValue(of({}));
getAllSettingsFromCookie = jasmine.createSpy('getAllSettingsFromCookie').and.returnValue({});
getAllSettingsFromAuthenticatedUserMetadata = jasmine.createSpy('getAllSettingsFromAuthenticatedUserMetadata')
.and.returnValue(of({}));
set = jasmine.createSpy('setSettings').and.returnValue(of('cookie'));
updateSettings = jasmine.createSpy('updateSettings').and.returnValue(of('cookie'));
setSettingsInAuthenticatedUserMetadata = jasmine.createSpy('setSettingsInAuthenticatedUserMetadata')
.and.returnValue(of(false));
setSettingsInMetadata = jasmine.createSpy('setSettingsInMetadata').and.returnValue(of(false));
setSettingsInCookie = jasmine.createSpy('setSettingsInCookie');
getInputType = jasmine.createSpy('getInputType').and.returnValue('text');
convertFormValuesToStoredValues = jasmine.createSpy('convertFormValuesToStoredValues').and.returnValue({});
convertStoredValuesToFormValues = jasmine.createSpy('convertStoredValuesToFormValues').and.returnValue({});
getDefaultValue = jasmine.createSpy('getPlaceholder').and.returnValue('placeholder');
isValid = jasmine.createSpy('isValid').and.returnValue(true);
formValuesValid = jasmine.createSpy('allValid').and.returnValue(true);
}

View File

@@ -1,381 +0,0 @@
import {
Inject,
Injectable,
Optional,
} from '@angular/core';
import cloneDeep from 'lodash/cloneDeep';
import {
combineLatest,
Observable,
of,
switchMap,
} from 'rxjs';
import {
map,
take,
} from 'rxjs/operators';
import {
APP_CONFIG,
AppConfig,
} from '../../config/app-config.interface';
import { environment } from '../../environments/environment';
import { AuthService } from '../core/auth/auth.service';
import { EPersonDataService } from '../core/eperson/eperson-data.service';
import { EPerson } from '../core/eperson/models/eperson.model';
import { CookieService } from '../core/services/cookie.service';
import { getFirstCompletedRemoteData } from '../core/shared/operators';
import { KlaroService } from '../shared/cookies/klaro.service';
import {
hasNoValue,
hasValue,
isNotEmpty,
} from '../shared/empty.util';
import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils';
/**
* Name of the cookie used to store the settings locally
*/
export const ACCESSIBILITY_COOKIE = 'dsAccessibilityCookie';
/**
* Name of the metadata field to store settings on the ePerson
*/
export const ACCESSIBILITY_SETTINGS_METADATA_KEY = 'dspace.accessibility.settings';
/**
* Array containing all possible accessibility settings.
* When adding new settings, make sure to add the new setting to the accessibility-settings component form.
* The converter methods to convert from stored format to form format (and vice-versa) need to be updated as well.
*/
export const accessibilitySettingKeys = ['notificationTimeOut', 'liveRegionTimeOut'] as const;
/**
* Type representing the possible accessibility settings
*/
export type AccessibilitySetting = typeof accessibilitySettingKeys[number];
/**
* Type representing an object that contains accessibility settings values for all accessibility settings.
*/
export type FullAccessibilitySettings = { [key in AccessibilitySetting]: string };
/**
* Type representing an object that contains accessibility settings values for some accessibility settings.
*/
export type AccessibilitySettings = Partial<FullAccessibilitySettings>;
/**
* The accessibility settings object format used by the accessibility-settings component form.
*/
export interface AccessibilitySettingsFormValues {
notificationTimeOutEnabled: boolean,
notificationTimeOut: string,
liveRegionTimeOut: string,
}
/**
* Service handling the retrieval and configuration of accessibility settings.
*
* This service stores the configured settings in either a cookie or on the user's metadata depending on whether
* the user is authenticated.
*/
@Injectable({
providedIn: 'root',
})
export class AccessibilitySettingsService {
constructor(
protected cookieService: CookieService,
protected authService: AuthService,
protected ePersonService: EPersonDataService,
@Optional() protected klaroService: KlaroService,
@Inject(APP_CONFIG) protected appConfig: AppConfig,
) {
}
/**
* Get the stored value for the provided {@link AccessibilitySetting}. If the value does not exist or if it is empty,
* the provided defaultValue is emitted instead.
*/
get(setting: AccessibilitySetting, defaultValue: string = null): Observable<string> {
return this.getAll().pipe(
map(settings => settings[setting]),
map(value => isNotEmpty(value) ? value : defaultValue),
);
}
/**
* Get the stored value for the provided {@link AccessibilitySetting} as a number. If the stored value
* could not be converted to a number, the value of the defaultValue parameter is emitted instead.
*/
getAsNumber(setting: AccessibilitySetting, defaultValue: number = null): Observable<number> {
return this.get(setting).pipe(
map(value => hasValue(value) ? parseInt(value, 10) : NaN),
map(number => !isNaN(number) ? number : defaultValue),
);
}
/**
* Get all currently stored accessibility settings
*/
getAll(): Observable<AccessibilitySettings> {
return this.getAllSettingsFromAuthenticatedUserMetadata().pipe(
map(value => isNotEmpty(value) ? value : this.getAllSettingsFromCookie()),
map(value => isNotEmpty(value) ? value : {}),
);
}
/**
* Get all settings from the accessibility settings cookie
*/
getAllSettingsFromCookie(): AccessibilitySettings {
return this.cookieService.get(ACCESSIBILITY_COOKIE);
}
/**
* Attempts to retrieve all settings from the authenticated user's metadata.
* Returns an empty object when no user is authenticated.
*/
getAllSettingsFromAuthenticatedUserMetadata(): Observable<AccessibilitySettings> {
return this.authService.getAuthenticatedUserFromStoreIfAuthenticated().pipe(
take(1),
map(user => hasValue(user) && hasValue(user.firstMetadataValue(ACCESSIBILITY_SETTINGS_METADATA_KEY)) ?
JSON.parse(user.firstMetadataValue(ACCESSIBILITY_SETTINGS_METADATA_KEY)) :
{},
),
);
}
/**
* Set a single accessibility setting value, leaving all other settings unchanged.
* When setting all values, {@link AccessibilitySettingsService#setSettings} should be used.
* When updating multiple values, {@link AccessibilitySettingsService#updateSettings} should be used.
*
* Returns 'cookie' when the changes were stored in the cookie.
* Returns 'metadata' when the changes were stored in metadata.
* Returns 'failed' when both options failed.
*/
set(setting: AccessibilitySetting, value: string): Observable<'metadata' | 'cookie' | 'failed'> {
return this.updateSettings({ [setting]: value });
}
/**
* Set all accessibility settings simultaneously.
* This method removes existing settings if they are missing from the provided {@link AccessibilitySettings} object.
* Removes all settings if the provided object is empty.
*
* Returns 'cookie' when the changes were stored in the cookie.
* Returns 'metadata' when the changes were stored in metadata.
* Returns 'failed' when both options failed.
*/
setSettings(settings: AccessibilitySettings): Observable<'metadata' | 'cookie' | 'failed'> {
return this.setSettingsInAuthenticatedUserMetadata(settings).pipe(
take(1),
map(saveLocation => saveLocation === 'metadata'),
switchMap((savedInMetadata) =>
savedInMetadata ? ofMetadata() : this.setSettingsInCookie(settings),
),
);
}
/**
* Update multiple accessibility settings simultaneously.
* This method does not change the settings that are missing from the provided {@link AccessibilitySettings} object.
*
* Returns 'cookie' when the changes were stored in the cookie.
* Returns 'metadata' when the changes were stored in metadata.
* Returns 'failed' when both options failed.
*/
updateSettings(settings: AccessibilitySettings): Observable<'metadata' | 'cookie' | 'failed'> {
return this.getAll().pipe(
take(1),
map(currentSettings => Object.assign({}, currentSettings, settings)),
switchMap(newSettings => this.setSettings(newSettings)),
);
}
/**
* Attempts to set the provided settings on the currently authorized user's metadata.
* Emits false when no user is authenticated or when the metadata update failed.
* Emits 'metadata' when the metadata update succeeded, and 'failed' otherwise.
*/
setSettingsInAuthenticatedUserMetadata(settings: AccessibilitySettings): Observable<'metadata' | 'failed'> {
return this.authService.getAuthenticatedUserFromStoreIfAuthenticated().pipe(
take(1),
switchMap(user => {
if (hasValue(user)) {
// EPerson has to be cloned, otherwise the EPerson's metadata can't be modified
const clonedUser = cloneDeep(user);
return this.setSettingsInMetadata(clonedUser, settings);
} else {
return ofFailed();
}
}),
);
}
/**
* Attempts to set the provided settings on the user's metadata.
* Emits false when the update failed, true when the update succeeded.
*/
setSettingsInMetadata(
user: EPerson,
settings: AccessibilitySettings,
): Observable<'metadata' | 'failed'> {
if (isNotEmpty(settings)) {
user.setMetadata(ACCESSIBILITY_SETTINGS_METADATA_KEY, null, JSON.stringify(settings));
} else {
user.removeMetadata(ACCESSIBILITY_SETTINGS_METADATA_KEY);
}
return this.ePersonService.createPatchFromCache(user).pipe(
take(1),
switchMap(operations =>
isNotEmpty(operations) ? this.ePersonService.patch(user, operations) : createSuccessfulRemoteDataObject$({})),
getFirstCompletedRemoteData(),
switchMap(rd => rd.hasSucceeded ? ofMetadata() : ofFailed()),
);
}
/**
* Attempts to set the provided settings in a cookie.
* Emits 'failed' when setting in a cookie failed due to the cookie not being accepted, 'cookie' when it succeeded.
*/
setSettingsInCookie(settings: AccessibilitySettings): Observable<'cookie' | 'failed'> {
if (hasNoValue(this.klaroService)) {
return of('failed');
}
return this.klaroService.getSavedPreferences().pipe(
map(preferences => preferences.accessibility),
map((accessibilityCookieAccepted: boolean) => {
if (accessibilityCookieAccepted) {
if (isNotEmpty(settings)) {
this.cookieService.set(ACCESSIBILITY_COOKIE, settings, { expires: this.appConfig.accessibility.cookieExpirationDuration });
} else {
this.cookieService.remove(ACCESSIBILITY_COOKIE);
}
return 'cookie';
} else {
return 'failed';
}
}),
);
}
/**
* Clears all settings in the cookie and attempts to clear settings in metadata.
* Emits an array mentioning which settings succeeded or failed.
*/
clearSettings(): Observable<['cookie' | 'failed', 'metadata' | 'failed']> {
return combineLatest([
this.setSettingsInCookie({}),
this.setSettingsInAuthenticatedUserMetadata({}),
]);
}
/**
* Retrieve the default value to be used for the provided AccessibilitySetting.
* Returns an empty string when no default value is specified for the provided setting.
*/
getDefaultValue(setting: AccessibilitySetting): string {
switch (setting) {
case 'notificationTimeOut':
return millisecondsToSeconds(environment.notifications.timeOut.toString());
case 'liveRegionTimeOut':
return millisecondsToSeconds(environment.liveRegion.messageTimeOutDurationMs.toString());
default:
return '';
}
}
/**
* Convert values in the provided accessibility settings object to values ready to be stored.
*/
convertFormValuesToStoredValues(settings: AccessibilitySettingsFormValues): FullAccessibilitySettings {
const storedValues = {
notificationTimeOut: settings.notificationTimeOutEnabled ?
secondsToMilliseconds(settings.notificationTimeOut) : '0',
liveRegionTimeOut: secondsToMilliseconds(settings.liveRegionTimeOut),
};
// When the user enables the timeout but does not change the timeout duration from 0,
// it is removed from the values to be stored so the default value is used.
// Keeping it at 0 would mean the notifications are not automatically removed.
if (settings.notificationTimeOutEnabled && settings.notificationTimeOut === '0') {
delete storedValues.notificationTimeOut;
}
return storedValues;
}
/**
* Convert values in the provided accessibility settings object to values ready to show in the form.
*/
convertStoredValuesToFormValues(settings: AccessibilitySettings): AccessibilitySettingsFormValues {
return {
notificationTimeOutEnabled: parseFloat(settings.notificationTimeOut) !== 0,
notificationTimeOut: millisecondsToSeconds(settings.notificationTimeOut),
liveRegionTimeOut: millisecondsToSeconds(settings.liveRegionTimeOut),
};
}
/**
* Returns true if the provided AccessibilitySetting is valid in regard to the provided formValues.
*/
isValid(setting: AccessibilitySetting, formValues: AccessibilitySettingsFormValues): boolean {
switch (setting) {
case 'notificationTimeOut':
return formValues.notificationTimeOutEnabled ?
hasNoValue(formValues.notificationTimeOut) || parseFloat(formValues.notificationTimeOut) > 0 :
true;
case 'liveRegionTimeOut':
return hasNoValue(formValues.liveRegionTimeOut) || parseFloat(formValues.liveRegionTimeOut) > 0;
default:
throw new Error(`Unhandled accessibility setting during validity check: ${setting}`);
}
}
/**
* Returns true if all settings in the provided AccessibilitySettingsFormValues object are valid
*/
formValuesValid(formValues: AccessibilitySettingsFormValues) {
return accessibilitySettingKeys.every(setting => this.isValid(setting, formValues));
}
}
/**
* Converts a string representing seconds to a string representing milliseconds
* Returns null if the input could not be parsed to a float
*/
function secondsToMilliseconds(secondsStr: string): string {
const seconds = parseFloat(secondsStr);
if (isNaN(seconds)) {
return null;
} else {
return (seconds * 1000).toString();
}
}
/**
* Converts a string representing milliseconds to a string representing seconds
* Returns null if the input could not be parsed to a float
*/
function millisecondsToSeconds(millisecondsStr: string): string {
const milliseconds = parseFloat(millisecondsStr);
if (isNaN(milliseconds)) {
return null;
} else {
return (milliseconds / 1000).toString();
}
}
function ofMetadata(): Observable<'metadata'> {
return of('metadata');
}
function ofFailed(): Observable<'failed'> {
return of('failed');
}

View File

@@ -1,14 +1,16 @@
<div class="container">
<h1 id="header">{{'admin.batch-import.page.header' | translate}}</h1>
<p>{{'admin.batch-import.page.help' | translate}}</p>
<p *ngIf="dso">
selected collection: <b>{{getDspaceObjectName()}}</b>&nbsp;
<a href="javascript:void(0)" (click)="removeDspaceObject()">{{'admin.batch-import.page.remove' | translate}}</a>
</p>
@if (dso) {
<p>
selected collection: <b>{{getDspaceObjectName()}}</b>&nbsp;
<a href="javascript:void(0)" (click)="removeDspaceObject()">{{'admin.batch-import.page.remove' | translate}}</a>
</p>
}
<p>
<button class="btn btn-primary" (click)="this.selectCollection();">{{'admin.metadata-import.page.button.select-collection' | translate}}</button>
</p>
<div class="form-group">
<div class="mb-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="validateOnly" [(ngModel)]="validateOnly">
<label class="form-check-label" for="validateOnly">
@@ -21,32 +23,35 @@
</div>
<ui-switch color="#ebebeb"
[checkedLabel]="'admin.metadata-import.page.toggle.upload' | translate"
[uncheckedLabel]="'admin.metadata-import.page.toggle.url' | translate"
[checked]="isUpload"
(change)="toggleUpload()" ></ui-switch>
<small class="form-text text-muted">
[checkedLabel]="'admin.metadata-import.page.toggle.upload' | translate"
[uncheckedLabel]="'admin.metadata-import.page.toggle.url' | translate"
[checked]="isUpload"
(change)="toggleUpload()" ></ui-switch>
<small class="form-text text-muted d-block">
{{'admin.batch-import.page.toggle.help' | translate}}
</small>
<ds-file-dropzone-no-uploader
*ngIf="isUpload"
data-test="file-dropzone"
(onFileAdded)="setFile($event)"
[dropMessageLabel]="'admin.batch-import.page.dropMsg'"
[dropMessageLabelReplacement]="'admin.batch-import.page.dropMsgReplace'">
</ds-file-dropzone-no-uploader>
@if (isUpload) {
<ds-file-dropzone-no-uploader
data-test="file-dropzone"
(onFileAdded)="setFile($event)"
[dropMessageLabel]="'admin.batch-import.page.dropMsg'"
[dropMessageLabelReplacement]="'admin.batch-import.page.dropMsgReplace'">
</ds-file-dropzone-no-uploader>
}
<div class="form-group mt-2" *ngIf="!isUpload">
<input class="form-control" type="text" placeholder="{{'admin.metadata-import.page.urlMsg' | translate}}"
data-test="file-url-input" [(ngModel)]="fileURL">
</div>
@if (!isUpload) {
<div class="mb-3 mt-2">
<input class="form-control" type="text" placeholder="{{'admin.metadata-import.page.urlMsg' | translate}}"
data-test="file-url-input" [(ngModel)]="fileURL">
</div>
}
<div class="space-children-mr">
<button class="btn btn-secondary" id="backButton"
(click)="this.onReturn();">{{'admin.metadata-import.page.button.return' | translate}}</button>
(click)="this.onReturn();">{{'admin.metadata-import.page.button.return' | translate}}</button>
<button class="btn btn-primary" id="proceedButton"
(click)="this.importMetadata();">{{'admin.metadata-import.page.button.proceed' | translate}}</button>
(click)="this.importMetadata();">{{'admin.metadata-import.page.button.proceed' | translate}}</button>
</div>
</div>

View File

@@ -1,7 +1,4 @@
import {
Location,
NgIf,
} from '@angular/common';
import { Location } from '@angular/common';
import { Component } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { Router } from '@angular/router';
@@ -36,7 +33,6 @@ import { FileDropzoneNoUploaderComponent } from '../../shared/upload/file-dropzo
selector: 'ds-batch-import-page',
templateUrl: './batch-import-page.component.html',
imports: [
NgIf,
TranslateModule,
FormsModule,
UiSwitchModule,

View File

@@ -1,7 +1,7 @@
<div class="container">
<h1 id="header">{{'admin.metadata-import.page.header' | translate}}</h1>
<p>{{'admin.metadata-import.page.help' | translate}}</p>
<div class="form-group">
<div class="mb-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="validateOnly" [(ngModel)]="validateOnly">
<label class="form-check-label" for="validateOnly">

View File

@@ -4,66 +4,74 @@
<h1 class="flex-grow-1">{{ isNewService ? ('ldn-create-service.title' | translate) : ('ldn-edit-registered-service.title' | translate) }}</h1>
</div>
<!-- In the toggle section -->
<div class="toggle-switch-container" *ngIf="!isNewService">
<label class="status-label font-weight-bold" for="enabled">{{ 'ldn-service-status' | translate }}</label>
<div>
<input formControlName="enabled" hidden id="enabled" name="enabled" type="checkbox">
<div (click)="toggleEnabled()" [class.checked]="formModel.get('enabled').value" class="toggle-switch">
<div class="slider"></div>
@if (!isNewService) {
<div class="toggle-switch-container">
<label class="status-label font-weight-bold" for="enabled">{{ 'ldn-service-status' | translate }}</label>
<div>
<input formControlName="enabled" hidden id="enabled" name="enabled" type="checkbox">
<div (click)="toggleEnabled()" [class.checked]="formModel.get('enabled').value" class="toggle-switch">
<div class="slider"></div>
</div>
</div>
</div>
</div>
}
<!-- In the Name section -->
<div class="mb-5">
<label for="name" class="font-weight-bold">{{ 'ldn-new-service.form.label.name' | translate }}</label>
<input [class.invalid-field]="formModel.get('name').invalid && formModel.get('name').touched"
[placeholder]="'ldn-new-service.form.placeholder.name' | translate" class="form-control"
formControlName="name"
id="name"
name="name"
type="text">
<div *ngIf="formModel.get('name').invalid && formModel.get('name').touched" class="error-text">
{{ 'ldn-new-service.form.error.name' | translate }}
</div>
[placeholder]="'ldn-new-service.form.placeholder.name' | translate" class="form-control"
formControlName="name"
id="name"
name="name"
type="text">
@if (formModel.get('name').invalid && formModel.get('name').touched) {
<div class="error-text">
{{ 'ldn-new-service.form.error.name' | translate }}
</div>
}
</div>
<!-- In the description section -->
<div class="mb-5 mt-5 d-flex flex-column">
<label for="description" class="font-weight-bold">{{ 'ldn-new-service.form.label.description' | translate }}</label>
<textarea [placeholder]="'ldn-new-service.form.placeholder.description' | translate"
class="form-control" formControlName="description" id="description" name="description"></textarea>
class="form-control" formControlName="description" id="description" name="description"></textarea>
</div>
<div class="mb-5 mt-5">
<!-- In the url section -->
<div class="d-flex align-items-center">
<div class="d-flex flex-column w-50 mr-2">
<div class="d-flex flex-column w-50 me-2">
<label for="url" class="font-weight-bold">{{ 'ldn-new-service.form.label.url' | translate }}</label>
<input [class.invalid-field]="formModel.get('url').invalid && formModel.get('url').touched"
[placeholder]="'ldn-new-service.form.placeholder.url' | translate" class="form-control"
formControlName="url"
id="url"
name="url"
type="text">
<div *ngIf="formModel.get('url').invalid && formModel.get('url').touched" class="error-text">
{{ 'ldn-new-service.form.error.url' | translate }}
</div>
[placeholder]="'ldn-new-service.form.placeholder.url' | translate" class="form-control"
formControlName="url"
id="url"
name="url"
type="text">
@if (formModel.get('url').invalid && formModel.get('url').touched) {
<div class="error-text">
{{ 'ldn-new-service.form.error.url' | translate }}
</div>
}
</div>
<div class="d-flex flex-column w-50">
<label for="score" class="font-weight-bold">{{ 'ldn-new-service.form.label.score' | translate }}</label>
<input [class.invalid-field]="formModel.get('score').invalid && formModel.get('score').touched"
[placeholder]="'ldn-new-service.form.placeholder.score' | translate" formControlName="score"
id="score"
name="score"
min="0"
max="1"
step=".01"
class="form-control"
type="number">
<div *ngIf="formModel.get('score').invalid && formModel.get('score').touched" class="error-text">
{{ 'ldn-new-service.form.error.score' | translate }}
</div>
[placeholder]="'ldn-new-service.form.placeholder.score' | translate" formControlName="score"
id="score"
name="score"
min="0"
max="1"
step=".01"
class="form-control"
type="number">
@if (formModel.get('score').invalid && formModel.get('score').touched) {
<div class="error-text">
{{ 'ldn-new-service.form.error.score' | translate }}
</div>
}
</div>
</div>
</div>
@@ -73,21 +81,23 @@
<label for="lowerIp" class="font-weight-bold">{{ 'ldn-new-service.form.label.ip-range' | translate }}</label>
<div class="d-flex">
<input [class.invalid-field]="formModel.get('lowerIp').invalid && formModel.get('lowerIp').touched"
[placeholder]="'ldn-new-service.form.placeholder.lowerIp' | translate" class="form-control mr-2"
formControlName="lowerIp"
id="lowerIp"
name="lowerIp"
type="text">
[placeholder]="'ldn-new-service.form.placeholder.lowerIp' | translate" class="form-control me-2"
formControlName="lowerIp"
id="lowerIp"
name="lowerIp"
type="text">
<input [class.invalid-field]="formModel.get('upperIp').invalid && formModel.get('upperIp').touched"
[placeholder]="'ldn-new-service.form.placeholder.upperIp' | translate" class="form-control"
formControlName="upperIp"
id="upperIp"
name="upperIp"
type="text">
</div>
<div *ngIf="(formModel.get('lowerIp').invalid && formModel.get('lowerIp').touched) || (formModel.get('upperIp').invalid && formModel.get('upperIp').touched)" class="error-text">
{{ 'ldn-new-service.form.error.ipRange' | translate }}
[placeholder]="'ldn-new-service.form.placeholder.upperIp' | translate" class="form-control"
formControlName="upperIp"
id="upperIp"
name="upperIp"
type="text">
</div>
@if ((formModel.get('lowerIp').invalid && formModel.get('lowerIp').touched) || (formModel.get('upperIp').invalid && formModel.get('upperIp').touched)) {
<div class="error-text">
{{ 'ldn-new-service.form.error.ipRange' | translate }}
</div>
}
<div class="text-muted">
{{ 'ldn-new-service.form.hint.ipRange' | translate }}
</div>
@@ -97,223 +107,258 @@
<div class="mb-5 mt-5">
<label for="ldnUrl" class="font-weight-bold">{{ 'ldn-new-service.form.label.ldnUrl' | translate }}</label>
<input [class.invalid-field]="formModel.get('ldnUrl').invalid && formModel.get('ldnUrl').touched"
[placeholder]="'ldn-new-service.form.placeholder.ldnUrl' | translate" class="form-control"
formControlName="ldnUrl"
id="ldnUrl"
name="ldnUrl"
type="text">
<div *ngIf="formModel.get('ldnUrl').invalid && formModel.get('ldnUrl').touched" >
<div *ngIf="formModel.get('ldnUrl').errors['required']" class="error-text">
{{ 'ldn-new-service.form.error.ldnurl' | translate }}
[placeholder]="'ldn-new-service.form.placeholder.ldnUrl' | translate" class="form-control"
formControlName="ldnUrl"
id="ldnUrl"
name="ldnUrl"
type="text">
@if (formModel.get('ldnUrl').invalid && formModel.get('ldnUrl').touched) {
<div >
@if (formModel.get('ldnUrl').errors['required']) {
<div class="error-text">
{{ 'ldn-new-service.form.error.ldnurl' | translate }}
</div>
}
@if (formModel.get('ldnUrl').errors['ldnUrlAlreadyAssociated']) {
<div class="error-text">
{{ 'ldn-new-service.form.error.ldnurl.ldnUrlAlreadyAssociated' | translate }}
</div>
}
</div>
<div *ngIf="formModel.get('ldnUrl').errors['ldnUrlAlreadyAssociated']" class="error-text">
{{ 'ldn-new-service.form.error.ldnurl.ldnUrlAlreadyAssociated' | translate }}
}
</div>
<!-- In the usesActorEmailId section -->
<div class="mb-5 mt-5">
<label class="status-label font-weight-bold" for="usesActorEmailId">{{ 'ldn-service-usesActorEmailId' | translate }}</label>
<div>
<input formControlName="usesActorEmailId" hidden id="usesActorEmailId"
name="usesActorEmailId" type="checkbox">
<div (click)="toggleUsesActorEmailId()"
[class.checked]="formModel.get('usesActorEmailId').value" class="toggle-switch">
<div class="slider"></div>
</div>
<div class="text-muted">
{{ 'ldn-service-usesActorEmailId-description' | translate }}
</div>
</div>
</div>
<!-- In the Inbound Patterns Labels section -->
<div class="row mb-1 mt-5" *ngIf="areControlsInitialized">
<div class="col">
<label class="font-weight-bold">{{ 'ldn-new-service.form.label.inboundPattern' | translate }} </label>
</div>
<ng-container *ngIf="formModel.get('notifyServiceInboundPatterns')['controls'][0]?.value?.pattern">
@if (areControlsInitialized) {
<div class="row mb-1 mt-5">
<div class="col">
<label class="font-weight-bold">{{ 'ldn-new-service.form.label.ItemFilter' | translate }}</label>
<label class="font-weight-bold">{{ 'ldn-new-service.form.label.inboundPattern' | translate }} </label>
</div>
<div class="col-sm-1">
<label class="font-weight-bold">{{ 'ldn-new-service.form.label.automatic' | translate }}</label>
@if (formModel.get('notifyServiceInboundPatterns')['controls'][0]?.value?.pattern) {
<div class="col">
<label class="font-weight-bold">{{ 'ldn-new-service.form.label.ItemFilter' | translate }}</label>
</div>
<div class="col-sm-1">
<label class="font-weight-bold">{{ 'ldn-new-service.form.label.automatic' | translate }}</label>
</div>
}
<div class="col-sm-2">
</div>
</ng-container>
<div class="col-sm-2">
</div>
</div>
}
<!-- In the Inbound Patterns section -->
<div *ngIf="areControlsInitialized">
<div *ngFor="let patternGroup of formModel.get('notifyServiceInboundPatterns')['controls']; let i = index"
[class.marked-for-deletion]="markedForDeletionInboundPattern.includes(i)"
formGroupName="notifyServiceInboundPatterns">
<ng-container [formGroupName]="i">
<div class="row mb-1 align-items-center">
<div class="col">
<div #inboundPatternDropdown="ngbDropdown" class="w-80" display="dynamic"
id="additionalInboundPattern{{i}}"
ngbDropdown placement="top-start">
<div class="position-relative right-addon" role="combobox" aria-expanded="false" aria-controls="inboundPatternDropdownButton">
<i aria-hidden="true" class="position-absolute scrollable-dropdown-toggle"
ngbDropdownToggle></i>
<input
(click)="inboundPatternDropdown.open();"
[readonly]="true"
[value]="selectedInboundPatterns"
class="form-control w-80 scrollable-dropdown-input"
formControlName="patternLabel"
id="inboundPatternDropdownButton"
ngbDropdownAnchor
type="text"
[attr.aria-label]="'ldn-service-input-inbound-pattern-dropdown' | translate"
/>
<div aria-labelledby="inboundPatternDropdownButton"
class="dropdown-menu dropdown-menu-top w-100 "
ngbDropdownMenu>
<div class="scrollable-menu" role="listbox">
<button (click)="selectInboundPattern(pattern, i); $event.stopPropagation()"
*ngFor="let pattern of inboundPatterns; let internalIndex = index"
@if (areControlsInitialized) {
<div>
@for (patternGroup of formModel.get('notifyServiceInboundPatterns')['controls']; track patternGroup; let i = $index) {
<div
[class.marked-for-deletion]="markedForDeletionInboundPattern.includes(i)"
formGroupName="notifyServiceInboundPatterns">
<ng-container [formGroupName]="i">
<div class="row mb-1 align-items-center">
<div class="col">
<div #inboundPatternDropdown="ngbDropdown" class="w-80" display="dynamic"
id="additionalInboundPattern{{i}}"
ngbDropdown placement="top-start">
<div class="position-relative right-addon" role="combobox" aria-expanded="false" aria-controls="inboundPatternDropdownButton">
<i aria-hidden="true" class="position-absolute scrollable-dropdown-toggle"
ngbDropdownToggle></i>
<input
(click)="inboundPatternDropdown.open();"
[readonly]="true"
[value]="selectedInboundPatterns"
class="form-control w-80 scrollable-dropdown-input"
formControlName="patternLabel"
id="inboundPatternDropdownButton"
ngbDropdownAnchor
type="text"
[attr.aria-label]="'ldn-service-input-inbound-pattern-dropdown' | translate"
/>
<div aria-labelledby="inboundPatternDropdownButton"
class="dropdown-menu dropdown-menu-top w-100 "
ngbDropdownMenu>
<div class="scrollable-menu" role="listbox">
@for (pattern of inboundPatterns; track pattern; let internalIndex = $index) {
<button (click)="selectInboundPattern(pattern, i); $event.stopPropagation()"
[title]="'ldn-service.form.pattern.' + pattern + '.description' | translate"
class="dropdown-item collection-item text-truncate w-100"
ngbDropdownItem
type="button">
<div>{{ 'ldn-service.form.pattern.' + pattern + '.label' | translate }}</div>
</button>
</div>
</div>
</div>
</div>
</div>
<div class="col">
<ng-container
*ngIf="formModel.get('notifyServiceInboundPatterns')['controls'][i].value.pattern">
<div #inboundItemfilterDropdown="ngbDropdown" class="w-100" id="constraint{{i}}" ngbDropdown
placement="top-start">
<div class="position-relative right-addon" aria-expanded="false" aria-controls="inboundItemfilterDropdown" role="combobox">
<i aria-hidden="true" class="position-absolute scrollable-dropdown-toggle"
ngbDropdownToggle></i>
<input
[readonly]="true"
class="form-control d-none w-100 scrollable-dropdown-input"
formControlName="constraint"
id="inboundItemfilterDropdown"
ngbDropdownAnchor
type="text"
[attr.aria-label]="'ldn-service-input-inbound-item-filter-dropdown' | translate"
/>
<input
(click)="inboundItemfilterDropdown.open();"
[readonly]="true"
class="form-control w-100 scrollable-dropdown-input"
formControlName="constraintFormatted"
id="inboundItemfilterDropdownPrettified"
ngbDropdownAnchor
type="text"
[attr.aria-label]="'ldn-service-input-inbound-item-filter-dropdown' | translate"
/>
<div aria-labelledby="inboundItemfilterDropdownButton"
class="dropdown-menu scrollable-dropdown-menu w-100 "
ngbDropdownMenu>
<div class="scrollable-menu" role="listbox">
<button (click)="selectInboundItemFilter('', i); $event.stopPropagation()"
class="dropdown-item collection-item text-truncate w-100" ngbDropdownItem type="button">
<span> {{'ldn-service.control-constaint-select-none' | translate}} </span>
</button>
<button (click)="selectInboundItemFilter(constraint.id, i); $event.stopPropagation()"
*ngFor="let constraint of (itemFiltersRD$ | async)?.payload?.page; let internalIndex = index"
class="dropdown-item collection-item text-truncate w-100"
ngbDropdownItem
type="button">
<div>{{ constraint.id + '.label' | translate }}</div>
</button>
<div>{{ 'ldn-service.form.pattern.' + pattern + '.label' | translate }}</div>
</button>
}
</div>
</div>
</div>
</div>
</div>
</ng-container>
</div>
<div
[style.visibility]="formModel.get('notifyServiceInboundPatterns')['controls'][i].value.pattern ? 'visible' : 'hidden'"
class="col-sm-1">
<input formControlName="automatic" hidden id="automatic{{i}}" name="automatic{{i}}"
type="checkbox">
<div (click)="toggleAutomatic(i)"
[class.checked]="formModel.get('notifyServiceInboundPatterns.' + i + '.automatic').value"
class="toggle-switch">
<div class="slider"></div>
</div>
</div>
<div class="col-sm-2">
<div class="btn-group">
<button (click)="markForInboundPatternDeletion(i)" class="btn btn-outline-dark trash-button"
[title]="'ldn-service-button-mark-inbound-deletion' | translate"
type="button">
<i class="fas fa-trash"></i>
</button>
<button (click)="unmarkForInboundPatternDeletion(i)"
*ngIf="markedForDeletionInboundPattern.includes(i)"
<div class="col">
@if (formModel.get('notifyServiceInboundPatterns')['controls'][i].value.pattern) {
<div #inboundItemfilterDropdown="ngbDropdown" class="w-100" id="constraint{{i}}" ngbDropdown
placement="top-start">
<div class="position-relative right-addon" aria-expanded="false" aria-controls="inboundItemfilterDropdown" role="combobox">
<i aria-hidden="true" class="position-absolute scrollable-dropdown-toggle"
ngbDropdownToggle></i>
<input
[readonly]="true"
class="form-control d-none w-100 scrollable-dropdown-input"
formControlName="constraint"
id="inboundItemfilterDropdown"
ngbDropdownAnchor
type="text"
[attr.aria-label]="'ldn-service-input-inbound-item-filter-dropdown' | translate"
/>
<input
(click)="inboundItemfilterDropdown.open();"
[readonly]="true"
class="form-control w-100 scrollable-dropdown-input"
formControlName="constraintFormatted"
id="inboundItemfilterDropdownPrettified"
ngbDropdownAnchor
type="text"
[attr.aria-label]="'ldn-service-input-inbound-item-filter-dropdown' | translate"
/>
<div aria-labelledby="inboundItemfilterDropdownButton"
class="dropdown-menu scrollable-dropdown-menu w-100 "
ngbDropdownMenu>
<div class="scrollable-menu" role="listbox">
<button (click)="selectInboundItemFilter('', i); $event.stopPropagation()"
class="dropdown-item collection-item text-truncate w-100" ngbDropdownItem type="button">
<span> {{'ldn-service.control-constaint-select-none' | translate}} </span>
</button>
@for (constraint of (itemFiltersRD$ | async)?.payload?.page; track constraint; let internalIndex = $index) {
<button (click)="selectInboundItemFilter(constraint.id, i); $event.stopPropagation()"
class="dropdown-item collection-item text-truncate w-100"
ngbDropdownItem
type="button">
<div>{{ constraint.id + '.label' | translate }}</div>
</button>
}
</div>
</div>
</div>
</div>
}
</div>
<div
[style.visibility]="formModel.get('notifyServiceInboundPatterns')['controls'][i].value.pattern ? 'visible' : 'hidden'"
class="col-sm-1">
<input formControlName="automatic" hidden id="automatic{{i}}" name="automatic{{i}}"
type="checkbox">
<div (click)="toggleAutomatic(i)"
[class.checked]="formModel.get('notifyServiceInboundPatterns.' + i + '.automatic').value"
class="toggle-switch">
<div class="slider"></div>
</div>
</div>
<div class="col-sm-2">
<div class="btn-group">
<button (click)="markForInboundPatternDeletion(i)" class="btn btn-outline-dark trash-button"
[title]="'ldn-service-button-mark-inbound-deletion' | translate"
type="button">
<i class="fas fa-trash"></i>
</button>
@if (markedForDeletionInboundPattern.includes(i)) {
<button (click)="unmarkForInboundPatternDeletion(i)"
[title]="'ldn-service-button-unmark-inbound-deletion' | translate"
class="btn btn-warning "
type="button">
<i class="fas fa-undo"></i>
</button>
<i class="fas fa-undo"></i>
</button>
}
</div>
</div>
</div>
</div>
</ng-container>
</div>
</ng-container>
}
</div>
</div>
}
<span (click)="addInboundPattern()"
class="add-pattern-link mb-2">{{ 'ldn-new-service.form.label.addPattern' | translate }}</span>
class="add-pattern-link mb-2">{{ 'ldn-new-service.form.label.addPattern' | translate }}</span>
<hr>
<div class="form-group row">
<div class="col text-right space-children-mr">
<ng-content select="[before]"></ng-content>
<button (click)="resetFormAndLeave()" class="btn btn-outline-secondary" type="button">
<span>&nbsp;{{ 'submission.general.back.submit' | translate }}</span>
</button>
<button class="btn btn-primary" type="submit">
<span><i class="fas fa-save"></i>&nbsp;{{ 'ldn-new-service.form.label.submit' | translate }}</span>
</button>
<div class="form-group row">
<div class="col text-right space-children-mr">
<ng-content select="[before]"></ng-content>
<button (click)="resetFormAndLeave()" class="btn btn-outline-secondary" type="button">
<span>&nbsp;{{ 'submission.general.back.submit' | translate }}</span>
</button>
<button class="btn btn-primary" type="submit">
<span><i class="fas fa-save"></i>&nbsp;{{ 'ldn-new-service.form.label.submit' | translate }}</span>
</button>
</div>
</div>
</div>
</form>
</div>
<ng-template #confirmModal>
</form>
</div>
<ng-template #confirmModal>
<div class="modal-header">
<h4 *ngIf="!isNewService">{{'service.overview.edit.modal' | translate }}</h4>
<h4 *ngIf="isNewService">{{'service.overview.create.modal' | translate }}</h4>
@if (!isNewService) {
<h4>{{'service.overview.edit.modal' | translate }}</h4>
}
@if (isNewService) {
<h4>{{'service.overview.create.modal' | translate }}</h4>
}
<button (click)="closeModal()" aria-label="Close"
class="close" type="button">
class="close" type="button">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div *ngIf="!isNewService">
{{ 'service.overview.edit.body' | translate }}
</div>
<span *ngIf="isNewService">
{{ 'service.overview.create.body' | translate }}
</span>
</div>
<div class="modal-footer">
<div *ngIf="!isNewService">
<button (click)="closeModal()" class="btn btn-outline-secondary mr-2"
id="delete-confirm-edit">{{ 'service.detail.return' | translate }}
</button>
<button *ngIf="!isNewService" (click)="patchService()"
class="btn btn-primary">{{ 'service.detail.update' | translate }}
</button>
@if (!isNewService) {
<div>
{{ 'service.overview.edit.body' | translate }}
</div>
<div *ngIf="isNewService">
<button (click)="closeModal()" class="btn btn-outline-secondary mr-2 "
id="delete-confirm-new">{{ 'service.refuse.create' | translate }}
}
@if (isNewService) {
<span>
{{ 'service.overview.create.body' | translate }}
</span>
}
</div>
<div class="modal-footer">
@if (!isNewService) {
<div>
<button (click)="closeModal()" class="btn btn-outline-secondary me-2"
id="delete-confirm-edit">{{ 'service.detail.return' | translate }}
</button>
@if (!isNewService) {
<button (click)="patchService()"
class="btn btn-primary">{{ 'service.detail.update' | translate }}
</button>
}
</div>
}
@if (isNewService) {
<div>
<button (click)="closeModal()" class="btn btn-outline-secondary me-2 "
id="delete-confirm-new">{{ 'service.refuse.create' | translate }}
</button>
<button (click)="createService()"
class="btn btn-primary">{{ 'service.confirm.create' | translate }}
class="btn btn-primary">{{ 'service.confirm.create' | translate }}
</button>
</div>
</div>
</ng-template>
}
</div>
</ng-template>

View File

@@ -5,11 +5,7 @@ import {
transition,
trigger,
} from '@angular/animations';
import {
AsyncPipe,
NgForOf,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
ChangeDetectorRef,
Component,
@@ -77,9 +73,7 @@ import { notifyPatterns } from '../ldn-services-patterns/ldn-service-coar-patter
imports: [
ReactiveFormsModule,
TranslateModule,
NgIf,
NgbDropdownModule,
NgForOf,
AsyncPipe,
],
})
@@ -131,6 +125,7 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy {
score: ['', [Validators.required, Validators.pattern('^0*(\.[0-9]+)?$|^1(\.0+)?$')]], inboundPattern: [''],
constraintPattern: [''],
enabled: [''],
usesActorEmailId: [''],
type: LDN_SERVICE.value,
});
}
@@ -184,7 +179,8 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy {
return rest;
});
const values = { ...this.formModel.value, enabled: true };
const values = { ...this.formModel.value, enabled: true,
usesActorEmailId: this.formModel.get('usesActorEmailId').value };
const ldnServiceData = this.ldnServicesService.create(values);
@@ -243,6 +239,7 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy {
ldnUrl: this.ldnService.ldnUrl,
type: this.ldnService.type,
enabled: this.ldnService.enabled,
usesActorEmailId: this.ldnService.usesActorEmailId,
lowerIp: this.ldnService.lowerIp,
upperIp: this.ldnService.upperIp,
});
@@ -390,6 +387,32 @@ export class LdnServiceFormComponent implements OnInit, OnDestroy {
);
}
/**
* Toggles the usesActorEmailId field of the LDN service by sending a patch request
*/
toggleUsesActorEmailId() {
const newStatus = !this.formModel.get('usesActorEmailId').value;
if (!this.isNewService) {
const patchOperation: Operation = {
op: 'replace',
path: '/usesActorEmailId',
value: newStatus,
};
this.ldnServicesService.patch(this.ldnService, [patchOperation]).pipe(
getFirstCompletedRemoteData(),
).subscribe(
() => {
this.formModel.get('usesActorEmailId').setValue(newStatus);
this.cdRef.detectChanges();
},
);
} else {
this.formModel.get('usesActorEmailId').setValue(newStatus);
this.cdRef.detectChanges();
}
}
/**
* Closes the modal
*/

View File

@@ -12,6 +12,7 @@ import { LdnService } from '../ldn-services-model/ldn-services.model';
export const mockLdnService: LdnService = {
uuid: '1',
enabled: false,
usesActorEmailId: false,
score: 0,
id: 1,
lowerIp: '192.0.2.146',
@@ -49,6 +50,7 @@ export const mockLdnServiceRD$ = createSuccessfulRemoteDataObject$(mockLdnServic
export const mockLdnServices: LdnService[] = [{
uuid: '1',
enabled: false,
usesActorEmailId: false,
score: 0,
id: 1,
lowerIp: '192.0.2.146',
@@ -81,6 +83,7 @@ export const mockLdnServices: LdnService[] = [{
}, {
uuid: '2',
enabled: false,
usesActorEmailId: false,
score: 0,
id: 2,
lowerIp: '192.0.2.146',

View File

@@ -4,63 +4,67 @@
</div>
<div class="d-flex justify-content-end">
<button class="btn btn-success" routerLink="/admin/ldn/services/new"><i
class="fas fa-plus pr-2"></i>{{ 'process.overview.new' | translate }}</button>
class="fas fa-plus pe-2"></i>{{ 'process.overview.new' | translate }}</button>
</div>
<ds-pagination *ngIf="(ldnServicesRD$ | async)?.payload?.totalElements > 0"
[collectionSize]="(ldnServicesRD$ | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true"
[paginationOptions]="pageConfig">
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr>
<th scope="col">{{ 'service.overview.table.name' | translate }}</th>
<th scope="col">{{ 'service.overview.table.description' | translate }}</th>
<th scope="col">{{ 'service.overview.table.status' | translate }}</th>
<th scope="col">{{ 'service.overview.table.actions' | translate }}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let ldnService of (ldnServicesRD$ | async)?.payload?.page">
<td class="col-3">{{ ldnService.name }}</td>
<td>
<ds-truncatable [id]="ldnService.id">
<ds-truncatable-part [id]="ldnService.id" [minLines]="2">
<div>
{{ ldnService.description }}
</div>
</ds-truncatable-part>
</ds-truncatable>
</td>
<td>
<span (click)="toggleStatus(ldnService, ldnServicesService)"
[ngClass]="{ 'status-enabled': ldnService.enabled, 'status-disabled': !ldnService.enabled }"
[title]="ldnService.enabled ? ('ldn-service.overview.table.clickToDisable' | translate) : ('ldn-service.overview.table.clickToEnable' | translate)"
class="status-indicator">
{{ ldnService.enabled ? ('ldn-service.overview.table.enabled' | translate) : ('ldn-service.overview.table.disabled' | translate) }}
</span>
</td>
<td>
<div class="btn-group">
<button
(click)="selectServiceToDelete(ldnService.id)"
[attr.aria-label]="'ldn-service-overview-select-delete' | translate"
class="btn btn-outline-danger">
<i class="fas fa-trash"></i>
</button>
<button [routerLink]="['/admin/ldn/services/edit/', ldnService.id]"
@if ((ldnServicesRD$ | async)?.payload?.totalElements > 0) {
<ds-pagination
[collectionSize]="(ldnServicesRD$ | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true"
[paginationOptions]="pageConfig">
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr>
<th scope="col">{{ 'service.overview.table.name' | translate }}</th>
<th scope="col">{{ 'service.overview.table.description' | translate }}</th>
<th scope="col">{{ 'service.overview.table.status' | translate }}</th>
<th scope="col">{{ 'service.overview.table.actions' | translate }}</th>
</tr>
</thead>
<tbody>
@for (ldnService of (ldnServicesRD$ | async)?.payload?.page; track ldnService) {
<tr>
<td class="col-3">{{ ldnService.name }}</td>
<td>
<ds-truncatable [id]="ldnService.id">
<ds-truncatable-part [id]="ldnService.id" [minLines]="2">
<div>
{{ ldnService.description }}
</div>
</ds-truncatable-part>
</ds-truncatable>
</td>
<td>
<span (click)="toggleStatus(ldnService, ldnServicesService)"
[ngClass]="{ 'status-enabled': ldnService.enabled, 'status-disabled': !ldnService.enabled }"
[title]="ldnService.enabled ? ('ldn-service.overview.table.clickToDisable' | translate) : ('ldn-service.overview.table.clickToEnable' | translate)"
class="status-indicator">
{{ ldnService.enabled ? ('ldn-service.overview.table.enabled' | translate) : ('ldn-service.overview.table.disabled' | translate) }}
</span>
</td>
<td>
<div class="btn-group">
<button
(click)="selectServiceToDelete(ldnService.id)"
[attr.aria-label]="'ldn-service-overview-select-delete' | translate"
class="btn btn-outline-danger">
<i class="fas fa-trash"></i>
</button>
<button [routerLink]="['/admin/ldn/services/edit/', ldnService.id]"
[attr.aria-label]="'ldn-service-overview-select-edit' | translate"
class="btn btn-outline-dark">
<i class="fas fa-edit"></i>
</button>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</ds-pagination>
<i class="fas fa-edit"></i>
</button>
</div>
</td>
</tr>
}
</tbody>
</table>
</div>
</ds-pagination>
}
</div>
<ng-template #deleteModal>
@@ -72,8 +76,8 @@
<h4>{{'service.overview.delete.header' | translate }}</h4>
</div>
<button (click)="closeModal()" aria-label="Close"
[attr.aria-label]="'ldn-service-overview-close-modal' | translate"
class="close" type="button">
[attr.aria-label]="'ldn-service-overview-close-modal' | translate"
class="close" type="button">
<span aria-hidden="true">×</span>
</button>
</div>
@@ -84,12 +88,12 @@
</div>
<div class="mt-4 text-right">
<button (click)="closeModal()"
[attr.aria-label]="'ldn-service-overview-close-modal' | translate"
class="btn btn-outline-secondary mr-2">{{ 'service.detail.delete.cancel' | translate }}</button>
[attr.aria-label]="'ldn-service-overview-close-modal' | translate"
class="btn btn-outline-secondary me-2">{{ 'service.detail.delete.cancel' | translate }}</button>
<button (click)="deleteSelected(this.selectedServiceId.toString(), ldnServicesService)"
class="btn btn-danger"
[attr.aria-label]="'ldn-service-overview-select-delete' | translate"
id="delete-confirm">{{ 'service.overview.delete' | translate }}
class="btn btn-danger"
[attr.aria-label]="'ldn-service-overview-select-delete' | translate"
id="delete-confirm">{{ 'service.overview.delete' | translate }}
</button>
</div>
</div>

View File

@@ -1,8 +1,6 @@
import {
AsyncPipe,
NgClass,
NgFor,
NgIf,
} from '@angular/common';
import {
ChangeDetectionStrategy,
@@ -54,8 +52,6 @@ import { LdnService } from '../ldn-services-model/ldn-services.model';
styleUrls: ['./ldn-services-directory.component.scss'],
changeDetection: ChangeDetectionStrategy.Default,
imports: [
NgIf,
NgFor,
TranslateModule,
AsyncPipe,
PaginationComponent,

View File

@@ -2,7 +2,7 @@
* List of services statuses
*/
export enum LdnServiceStatus {
UNKOWN,
UNKNOWN,
DISABLED,
ENABLED,
}

View File

@@ -52,6 +52,9 @@ export class LdnService extends CacheableObject {
@autoserialize
enabled: boolean;
@autoserialize
usesActorEmailId: boolean;
@autoserialize
ldnUrl: string;

View File

@@ -1 +1 @@
<ds-publication-claim [source]="'openaire'"></ds-publication-claim>
<ds-suggestion-sources></ds-suggestion-sources>

View File

@@ -6,8 +6,9 @@ import {
waitForAsync,
} from '@angular/core/testing';
import { TranslateModule } from '@ngx-translate/core';
import { MockComponent } from 'ng-mocks';
import { PublicationClaimComponent } from '../../../notifications/suggestion-targets/publication-claim/publication-claim.component';
import { SuggestionSourcesComponent } from '../../../notifications/suggestions/sources/suggestion-sources.component';
import { AdminNotificationsPublicationClaimPageComponent } from './admin-notifications-publication-claim-page.component';
describe('AdminNotificationsPublicationClaimPageComponent', () => {
@@ -20,17 +21,10 @@ describe('AdminNotificationsPublicationClaimPageComponent', () => {
CommonModule,
TranslateModule.forRoot(),
AdminNotificationsPublicationClaimPageComponent,
],
providers: [
AdminNotificationsPublicationClaimPageComponent,
MockComponent(SuggestionSourcesComponent),
],
schemas: [NO_ERRORS_SCHEMA],
}).overrideComponent(AdminNotificationsPublicationClaimPageComponent, {
remove: {
imports: [PublicationClaimComponent],
},
})
.compileComponents();
}).compileComponents();
}));
beforeEach(() => {

View File

@@ -1,14 +1,12 @@
import { Component } from '@angular/core';
import { PublicationClaimComponent } from '../../../notifications/suggestion-targets/publication-claim/publication-claim.component';
import { SuggestionSourcesComponent } from '../../../notifications/suggestions/sources/suggestion-sources.component';
@Component({
selector: 'ds-admin-notifications-publication-claim-page',
templateUrl: './admin-notifications-publication-claim-page.component.html',
styleUrls: ['./admin-notifications-publication-claim-page.component.scss'],
imports: [
PublicationClaimComponent,
],
imports: [ SuggestionSourcesComponent ],
standalone: true,
})
export class AdminNotificationsPublicationClaimPageComponent {

View File

@@ -2,7 +2,8 @@ import { Route } from '@angular/router';
import { authenticatedGuard } from '../../core/auth/authenticated.guard';
import { i18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver';
import { qualityAssuranceBreadcrumbResolver } from '../../core/breadcrumbs/quality-assurance-breadcrumb.resolver';
import { sourcesBreadcrumbResolver } from '../../core/breadcrumbs/sources-breadcrumb.resolver';
import { PublicationClaimComponent } from '../../notifications/suggestions/targets/publication-claim/publication-claim.component';
import { AdminNotificationsPublicationClaimPageResolver } from '../../quality-assurance-notifications-pages/notifications-suggestion-targets-page/notifications-suggestion-targets-page-resolver.service';
import { QualityAssuranceEventsPageComponent } from '../../quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.component';
import { qualityAssuranceEventsPageResolver } from '../../quality-assurance-notifications-pages/quality-assurance-events-page/quality-assurance-events-page.resolver';
@@ -33,13 +34,28 @@ export const ROUTES: Route[] = [
showBreadcrumbsFluid: false,
},
},
{
canActivate: [ authenticatedGuard ],
path: `${PUBLICATION_CLAIMS_PATH}/:sourceId`,
pathMatch: 'full',
component: PublicationClaimComponent,
resolve: {
breadcrumb: sourcesBreadcrumbResolver,
openaireQualityAssuranceEventsParams: AdminNotificationsPublicationClaimPageResolver,
},
data: {
title: 'admin.notifications.publicationclaim.page.title',
breadcrumbKey: 'admin.notifications.publicationclaim',
showBreadcrumbsFluid: false,
},
},
{
canActivate: [authenticatedGuard],
path: `${QUALITY_ASSURANCE_EDIT_PATH}/:sourceId`,
component: QualityAssuranceTopicsPageComponent,
pathMatch: 'full',
resolve: {
breadcrumb: qualityAssuranceBreadcrumbResolver,
breadcrumb: sourcesBreadcrumbResolver,
openaireQualityAssuranceTopicsParams: QualityAssuranceTopicsPageResolver,
},
data: {
@@ -85,7 +101,7 @@ export const ROUTES: Route[] = [
component: QualityAssuranceEventsPageComponent,
pathMatch: 'full',
resolve: {
breadcrumb: qualityAssuranceBreadcrumbResolver,
breadcrumb: sourcesBreadcrumbResolver,
openaireQualityAssuranceEventsParams: qualityAssuranceEventsPageResolver,
},
data: {

View File

@@ -13,11 +13,13 @@
</li>
<li class="nav-item">
<a class="nav-link" [routerLink]="'outbound'" [queryParams]="{view: 'table'}">{{'admin.notify.dashboard.outbound-logs' | translate}}</a>
</ul>
<div class="mt-2">
<ds-admin-notify-metrics *ngIf="(notifyMetricsRows$ | async)?.length" [boxesConfig]="notifyMetricsRows$ | async"></ds-admin-notify-metrics>
</ul>
<div class="mt-2">
@if ((notifyMetricsRows$ | async)?.length) {
<ds-admin-notify-metrics [boxesConfig]="notifyMetricsRows$ | async"></ds-admin-notify-metrics>
}
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -1,7 +1,4 @@
import {
AsyncPipe,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
Component,
Inject,
@@ -46,7 +43,6 @@ import {
imports: [
AdminNotifyMetricsComponent,
RouterLink,
NgIf,
TranslateModule,
AsyncPipe,
],

View File

@@ -5,12 +5,14 @@
</button>
</div>
<div class="modal-body p-4">
<div *ngFor="let key of notifyMessageKeys">
@for (key of notifyMessageKeys; track key) {
<div>
<div class="row mb-4">
<div class="font-weight-bold col">{{ key + '.notify-detail-modal' | translate}}</div>
<div class="col text-right">{{'notify-detail-modal.' + notifyMessage[key] | translate: {default: notifyMessage[key] ?? "n/a" } }}</div>
</div>
</div>
}
<div class="d-flex justify-content-end">
<button class="btn-primary" (click)="toggleCoarMessage()">
@@ -18,5 +20,7 @@
</button>
</div>
<pre @fadeIn [innerHTML]="notifyMessage.message" class="bg-secondary text-white mt-2 p-2" *ngIf="isCoarMessageVisible"></pre>
@if (isCoarMessageVisible) {
<pre @fadeIn [innerHTML]="notifyMessage.message" class="bg-secondary text-white mt-2 p-2"></pre>
}
</div>

View File

@@ -1,7 +1,4 @@
import {
NgForOf,
NgIf,
} from '@angular/common';
import {
Component,
EventEmitter,
@@ -26,9 +23,7 @@ import { AdminNotifyMessage } from '../models/admin-notify-message.model';
],
standalone: true,
imports: [
NgForOf,
TranslateModule,
NgIf,
],
})
/**

View File

@@ -3,10 +3,12 @@
<div class="col-12 col-md-3 text-left h4">{{((isInbound$ | async) ? 'admin.notify.dashboard.inbound' : 'admin.notify.dashboard.outbound') | translate}}</div>
<div class="col-md-9">
<div class="h4">
<button (click)="resetDefaultConfiguration()" *ngIf="(selectedSearchConfig$ | async) !== defaultConfiguration" class="badge badge-primary mr-1 mb-1">
{{ 'admin-notify-logs.' + (selectedSearchConfig$ | async) | translate}}
<span> ×</span>
</button>
@if ((selectedSearchConfig$ | async) !== defaultConfiguration) {
<button (click)="resetDefaultConfiguration()" class="badge bg-primary me-1 mb-1">
{{ 'admin-notify-logs.' + (selectedSearchConfig$ | async) | translate}}
<span> ×</span>
</button>
}
</div>
<ds-search-labels [inPlaceSearch]="true"></ds-search-labels>
</div>

View File

@@ -1,7 +1,4 @@
import {
AsyncPipe,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
Component,
Inject,
@@ -39,7 +36,6 @@ import { ThemedSearchComponent } from '../../../../shared/search/themed-search.c
ThemedSearchComponent,
AsyncPipe,
TranslateModule,
NgIf,
],
})

View File

@@ -1,9 +1,13 @@
<div class="mb-5" *ngFor="let row of boxesConfig">
<div class="mb-2">{{ row.title | translate }}</div>
<div class="row justify-content-between">
<div class="col-sm" *ngFor="let box of row.boxes">
<ds-notification-box (selectedBoxConfig)="navigateToSelectedSearchConfig($event)" [boxConfig]="box"></ds-notification-box>
@for (row of boxesConfig; track row) {
<div class="mb-5">
<div class="mb-2">{{ row.title | translate }}</div>
<div class="row justify-content-between">
@for (box of row.boxes; track box) {
<div class="col-sm">
<ds-notification-box (selectedBoxConfig)="navigateToSelectedSearchConfig($event)" [boxConfig]="box"></ds-notification-box>
</div>
}
</div>
</div>
</div>
}

View File

@@ -1,4 +1,4 @@
import { NgForOf } from '@angular/common';
import {
Component,
Input,
@@ -17,7 +17,6 @@ import { AdminNotifyMetricsRow } from './admin-notify-metrics.model';
imports: [
NotificationBoxComponent,
TranslateModule,
NgForOf,
],
})
/**

View File

@@ -11,41 +11,57 @@
</tr>
</thead>
<tbody>
<tr *ngFor="let message of (messagesSubject$ | async)">
<td class="text-nowrap">
<div *ngIf="message.queueLastStartTime">{{ message.queueLastStartTime | date:"YYYY/MM/d hh:mm:ss" }}</div>
<div *ngIf="!message.queueLastStartTime">n/a</div>
</td>
<td>
<ds-truncatable [id]="message.id">
<ds-truncatable-part [id]="message.id" [minLines]="2">
<a *ngIf="message.relatedItem" [routerLink]="'/items/' + (message.context || message.object)">{{ message.relatedItem }}</a>
</ds-truncatable-part>
</ds-truncatable>
<div *ngIf="!message.relatedItem">n/a</div>
</td>
<td>
<div *ngIf="message.ldnService">{{ message.ldnService }}</div>
<div *ngIf="!message.ldnService">n/a</div>
</td>
<td>
<div>{{ message.activityStreamType }}</div>
</td>
<td>
<div class="text-nowrap">{{ 'notify-detail-modal.' + message.queueStatusLabel | translate }}</div>
</td>
<td>
<div class="d-flex flex-column">
<button class="btn mb-2 btn-dark" (click)="openDetailModal(message)">{{ 'notify-message-result.detail' | translate }}</button>
<button *ngIf="message.queueStatusLabel !== reprocessStatus && validStatusesForReprocess.includes(message.queueStatusLabel)"
(click)="reprocessMessage(message)"
class="btn btn-warning"
>
{{ 'notify-message-result.reprocess' | translate }}
</button>
</div>
</td>
</tr>
@for (message of (messagesSubject$ | async); track message) {
<tr>
<td class="text-nowrap">
@if (message.queueLastStartTime) {
<div>{{ message.queueLastStartTime | date:"YYYY/MM/d hh:mm:ss" }}</div>
}
@if (!message.queueLastStartTime) {
<div>n/a</div>
}
</td>
<td>
<ds-truncatable [id]="message.id">
<ds-truncatable-part [id]="message.id" [minLines]="2">
@if (message.relatedItem) {
<a [routerLink]="'/items/' + (message.context || message.object)">{{ message.relatedItem }}</a>
}
</ds-truncatable-part>
</ds-truncatable>
@if (!message.relatedItem) {
<div>n/a</div>
}
</td>
<td>
@if (message.ldnService) {
<div>{{ message.ldnService }}</div>
}
@if (!message.ldnService) {
<div>n/a</div>
}
</td>
<td>
<div>{{ message.activityStreamType }}</div>
</td>
<td>
<div class="text-nowrap">{{ 'notify-detail-modal.' + message.queueStatusLabel | translate }}</div>
</td>
<td>
<div class="d-flex flex-column">
<button class="btn mb-2 btn-dark" (click)="openDetailModal(message)">{{ 'notify-message-result.detail' | translate }}</button>
@if (message.queueStatusLabel !== reprocessStatus && validStatusesForReprocess.includes(message.queueStatusLabel)) {
<button
(click)="reprocessMessage(message)"
class="btn btn-warning"
>
{{ 'notify-message-result.reprocess' | translate }}
</button>
}
</div>
</td>
</tr>
}
</tbody>
</table>
</div>

View File

@@ -1,8 +1,6 @@
import {
AsyncPipe,
DatePipe,
NgForOf,
NgIf,
} from '@angular/common';
import {
Component,
@@ -42,8 +40,6 @@ import { AdminNotifyMessagesService } from '../services/admin-notify-messages.se
standalone: true,
imports: [
TranslateModule,
NgForOf,
NgIf,
DatePipe,
AsyncPipe,
TruncatableComponent,

View File

@@ -8,51 +8,62 @@
<p id="create-new" class="mb-2"><a [routerLink]="'add'" class="btn btn-success">{{'admin.registries.bitstream-formats.create.new' | translate}}</a></p>
<ds-pagination
*ngIf="(bitstreamFormats$ | async)?.payload?.totalElements > 0"
[paginationOptions]="pageConfig"
[collectionSize]="(bitstreamFormats$ | async)?.payload?.totalElements"
[hideGear]="false"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="formats" class="table table-striped table-hover">
<thead>
<tr>
<th scope="col"><span class="sr-only">{{'admin.registries.bitstream-formats.table.selected' | translate}}</span></th>
<th scope="col">{{'admin.registries.bitstream-formats.table.id' | translate}}</th>
<th scope="col">{{'admin.registries.bitstream-formats.table.name' | translate}}</th>
<th scope="col">{{'admin.registries.bitstream-formats.table.mimetype' | translate}}</th>
<th scope="col">{{'admin.registries.bitstream-formats.table.supportLevel.head' | translate}}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let bitstreamFormat of (bitstreamFormats$ | async)?.payload?.page">
<td>
<label class="mb-0">
<input type="checkbox"
[attr.aria-label]="'admin.registries.bitstream-formats.select' | translate"
[checked]="(selectedBitstreamFormatIDs$ | async)?.includes(bitstreamFormat.id)"
(change)="selectBitStreamFormat(bitstreamFormat, $event)"
>
<span class="sr-only">{{'admin.registries.bitstream-formats.select' | translate}}&#125;</span>
</label>
</td>
<td><a [routerLink]="['/admin/registries/bitstream-formats', bitstreamFormat.id, 'edit']">{{bitstreamFormat.id}}</a></td>
<td><a [routerLink]="['/admin/registries/bitstream-formats', bitstreamFormat.id, 'edit']">{{bitstreamFormat.shortDescription}}</a></td>
<td><a [routerLink]="['/admin/registries/bitstream-formats', bitstreamFormat.id, 'edit']">{{bitstreamFormat.mimetype}} <span *ngIf="bitstreamFormat.internal">({{'admin.registries.bitstream-formats.table.internal' | translate}})</span></a></td>
<td><a [routerLink]="['/admin/registries/bitstream-formats', bitstreamFormat.id, 'edit']">{{'admin.registries.bitstream-formats.table.supportLevel.'+bitstreamFormat.supportLevel | translate}}</a></td>
</tr>
</tbody>
</table>
@if ((bitstreamFormats$ | async)?.payload?.totalElements > 0) {
<ds-pagination
[paginationOptions]="pageConfig"
[collectionSize]="(bitstreamFormats$ | async)?.payload?.totalElements"
[hideGear]="false"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="formats" class="table table-striped table-hover">
<thead>
<tr>
<th scope="col"><span class="sr-only">{{'admin.registries.bitstream-formats.table.selected' | translate}}</span></th>
<th scope="col">{{'admin.registries.bitstream-formats.table.id' | translate}}</th>
<th scope="col">{{'admin.registries.bitstream-formats.table.name' | translate}}</th>
<th scope="col">{{'admin.registries.bitstream-formats.table.mimetype' | translate}}</th>
<th scope="col">{{'admin.registries.bitstream-formats.table.supportLevel.head' | translate}}</th>
</tr>
</thead>
<tbody>
@for (bitstreamFormat of (bitstreamFormats$ | async)?.payload?.page; track bitstreamFormat) {
<tr>
<td>
<label class="form-label mb-0">
<input type="checkbox"
[attr.aria-label]="'admin.registries.bitstream-formats.select' | translate"
[checked]="(selectedBitstreamFormatIDs$ | async)?.includes(bitstreamFormat.id)"
(change)="selectBitStreamFormat(bitstreamFormat, $event)"
>
<span class="sr-only">{{'admin.registries.bitstream-formats.select' | translate}}&#125;</span>
</label>
</td>
<td><a [routerLink]="['/admin/registries/bitstream-formats', bitstreamFormat.id, 'edit']">{{bitstreamFormat.id}}</a></td>
<td><a [routerLink]="['/admin/registries/bitstream-formats', bitstreamFormat.id, 'edit']">{{bitstreamFormat.shortDescription}}</a></td>
<td><a [routerLink]="['/admin/registries/bitstream-formats', bitstreamFormat.id, 'edit']">{{bitstreamFormat.mimetype}} @if (bitstreamFormat.internal) {
<span>({{'admin.registries.bitstream-formats.table.internal' | translate}})</span>
}</a></td>
<td><a [routerLink]="['/admin/registries/bitstream-formats', bitstreamFormat.id, 'edit']">{{'admin.registries.bitstream-formats.table.supportLevel.'+bitstreamFormat.supportLevel | translate}}</a></td>
</tr>
}
</tbody>
</table>
</div>
</ds-pagination>
}
@if ((bitstreamFormats$ | async)?.payload?.totalElements === 0) {
<div class="alert alert-info" role="alert">
{{'admin.registries.bitstream-formats.no-items' | translate}}
</div>
</ds-pagination>
<div *ngIf="(bitstreamFormats$ | async)?.payload?.totalElements === 0" class="alert alert-info" role="alert">
{{'admin.registries.bitstream-formats.no-items' | translate}}
</div>
}
<div>
<button *ngIf="(bitstreamFormats$ | async)?.payload?.page?.length > 0" class="btn btn-primary deselect" (click)="deselectAll()">{{'admin.registries.bitstream-formats.table.deselect-all' | translate}}</button>
<button *ngIf="(bitstreamFormats$ | async)?.payload?.page?.length > 0" type="submit" class="btn btn-danger float-right" (click)="deleteFormats()">{{'admin.registries.bitstream-formats.table.delete' | translate}}</button>
@if ((bitstreamFormats$ | async)?.payload?.page?.length > 0) {
<button class="btn btn-primary deselect" (click)="deselectAll()">{{'admin.registries.bitstream-formats.table.deselect-all' | translate}}</button>
}
@if ((bitstreamFormats$ | async)?.payload?.page?.length > 0) {
<button type="submit" class="btn btn-danger float-end" (click)="deleteFormats()">{{'admin.registries.bitstream-formats.table.delete' | translate}}</button>
}
</div>
</div>
</div>

View File

@@ -187,12 +187,12 @@ describe('BitstreamFormatsComponent', () => {
describe('isSelected', () => {
beforeEach(waitForAsync(initAsync));
beforeEach(initBeforeEach);
it('should return an observable of true if the provided bistream is in the list returned by the service', () => {
it('should return an observable of true if the provided bitstream is in the list returned by the service', () => {
comp.selectedBitstreamFormatIDs().subscribe((selectedBitstreamFormatIDs: string[]) => {
expect(selectedBitstreamFormatIDs).toContain(bitstreamFormat1.id);
});
});
it('should return an observable of false if the provided bistream is not in the list returned by the service', () => {
it('should return an observable of false if the provided bitstream is not in the list returned by the service', () => {
const format = new BitstreamFormat();
format.uuid = 'new';

View File

@@ -1,8 +1,4 @@
import {
AsyncPipe,
NgForOf,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
Component,
OnDestroy,
@@ -41,12 +37,10 @@ import { PaginationComponentOptions } from '../../../shared/pagination/paginatio
selector: 'ds-bitstream-formats',
templateUrl: './bitstream-formats.component.html',
imports: [
NgIf,
AsyncPipe,
RouterLink,
TranslateModule,
PaginationComponent,
NgForOf,
],
standalone: true,
})
@@ -120,7 +114,7 @@ export class BitstreamFormatsComponent implements OnInit, OnDestroy {
}
/**
* Deselects all selecetd bitstream formats
* Deselects all selected bitstream formats
*/
deselectAll() {
this.bitstreamFormatService.deselectAllBitstreamFormats();

View File

@@ -1,3 +1,5 @@
<ds-form *ngIf="formModel"
[formId]="'comcol-form-id'"
[formModel]="formModel" (submitForm)="onSubmit()" (cancel)="onCancel()"></ds-form>
@if (formModel) {
<ds-form
[formId]="'comcol-form-id'"
[formModel]="formModel" (submitForm)="onSubmit()" (cancel)="onCancel()"></ds-form>
}

View File

@@ -1,4 +1,4 @@
import { NgIf } from '@angular/common';
import {
Component,
EventEmitter,
@@ -35,7 +35,6 @@ import { getBitstreamFormatsModuleRoute } from '../../admin-registries-routing-p
templateUrl: './format-form.component.html',
imports: [
FormComponent,
NgIf,
],
standalone: true,
})
@@ -64,7 +63,7 @@ export class FormatFormComponent implements OnInit {
*/
arrayElementLayout: DynamicFormControlLayout = {
grid: {
group: 'form-row',
group: 'row',
},
};
@@ -154,12 +153,12 @@ export class FormatFormComponent implements OnInit {
(fieldModel: DynamicFormControlModel) => {
if (fieldModel.name === 'extensions') {
if (hasValue(this.bitstreamFormat.extensions)) {
const extenstions = this.bitstreamFormat.extensions;
const extensions = this.bitstreamFormat.extensions;
const formArray = (fieldModel as DynamicFormArrayModel);
for (let i = 0; i < extenstions.length; i++) {
for (let i = 0; i < extensions.length; i++) {
formArray.insertGroup(i).group[0] = new DynamicInputModel({
id: `extension-${i}`,
value: extenstions[i],
value: extensions[i],
}, this.arrayInputElementLayout);
}
}
@@ -172,7 +171,7 @@ export class FormatFormComponent implements OnInit {
}
/**
* Creates an updated bistream format based on the current values in the form
* Creates an updated bitstream format based on the current values in the form
* Emits the updated bitstream format trouhg the updatedFormat emitter
*/
onSubmit() {

View File

@@ -1,60 +1,65 @@
<div class="container">
<div class="metadata-registry row">
<div class="col-12">
<div class="metadata-registry row">
<div class="col-12">
<h1 id="header" class="border-bottom pb-2">{{'admin.registries.metadata.head' | translate}}</h1>
<h1 id="header" class="border-bottom pb-2">{{'admin.registries.metadata.head' | translate}}</h1>
<p id="description" class="pb-2">{{'admin.registries.metadata.description' | translate}}</p>
<p id="description" class="pb-2">{{'admin.registries.metadata.description' | translate}}</p>
<ds-metadata-schema-form (submitForm)="forceUpdateSchemas()"></ds-metadata-schema-form>
<ds-metadata-schema-form (submitForm)="forceUpdateSchemas()"></ds-metadata-schema-form>
<ds-pagination
*ngIf="(metadataSchemas | async)?.payload?.totalElements > 0"
[paginationOptions]="config"
[collectionSize]="(metadataSchemas | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="metadata-schemas" class="table table-striped table-hover">
<thead>
<tr>
<th scope="col"><span class="sr-only">{{'admin.registries.metadata.schemas.table.selected' | translate}}</span></th>
<th scope="col">{{'admin.registries.metadata.schemas.table.id' | translate}}</th>
<th scope="col">{{'admin.registries.metadata.schemas.table.namespace' | translate}}</th>
<th scope="col">{{'admin.registries.metadata.schemas.table.name' | translate}}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let schema of (metadataSchemas | async)?.payload?.page"
[ngClass]="{'table-primary' : (activeMetadataSchema$ | async)?.id === schema.id}">
<td>
<label class="mb-0">
<input type="checkbox"
[checked]="(selectedMetadataSchemaIDs$ | async)?.includes(schema.id)"
(change)="selectMetadataSchema(schema, $event)"
>
<span class="sr-only">{{(((selectedMetadataSchemaIDs$ | async)?.includes(schema.id)) ? 'admin.registries.metadata.schemas.deselect' : 'admin.registries.metadata.schemas.select') | translate}}</span>
</label>
</td>
<td class="selectable-row" (click)="editSchema(schema)"><a [routerLink]="[schema.prefix]">{{schema.id}}</a></td>
<td class="selectable-row" (click)="editSchema(schema)"><a [routerLink]="[schema.prefix]">{{schema.namespace}}</a></td>
<td class="selectable-row" (click)="editSchema(schema)"><a [routerLink]="[schema.prefix]">{{schema.prefix}}</a></td>
</tr>
</tbody>
</table>
</div>
</ds-pagination>
<div *ngIf="(metadataSchemas | async)?.payload?.totalElements === 0" class="alert alert-info w-100 mb-2" role="alert">
{{'admin.registries.metadata.schemas.no-items' | translate}}
</div>
<div>
<button *ngIf="(metadataSchemas | async)?.payload?.page?.length > 0" type="submit" class="btn btn-danger float-right" (click)="deleteSchemas()">{{'admin.registries.metadata.schemas.table.delete' | translate}}</button>
</div>
@if ((metadataSchemas | async)?.payload?.totalElements > 0) {
<ds-pagination
[paginationOptions]="config"
[collectionSize]="(metadataSchemas | async)?.payload?.totalElements"
[hideGear]="true"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="metadata-schemas" class="table table-striped table-hover">
<thead>
<tr>
<th scope="col"><span class="sr-only">{{'admin.registries.metadata.schemas.table.selected' | translate}}</span></th>
<th scope="col">{{'admin.registries.metadata.schemas.table.id' | translate}}</th>
<th scope="col">{{'admin.registries.metadata.schemas.table.namespace' | translate}}</th>
<th scope="col">{{'admin.registries.metadata.schemas.table.name' | translate}}</th>
</tr>
</thead>
<tbody>
@for (schema of (metadataSchemas | async)?.payload?.page; track schema) {
<tr
[ngClass]="{'table-primary' : (activeMetadataSchema$ | async)?.id === schema.id}">
<td>
<label class="form-label mb-0">
<input type="checkbox"
[checked]="(selectedMetadataSchemaIDs$ | async)?.includes(schema.id)"
(change)="selectMetadataSchema(schema, $event)"
>
<span class="sr-only">{{(((selectedMetadataSchemaIDs$ | async)?.includes(schema.id)) ? 'admin.registries.metadata.schemas.deselect' : 'admin.registries.metadata.schemas.select') | translate}}</span>
</label>
</td>
<td class="selectable-row" (click)="editSchema(schema)"><a [routerLink]="[schema.prefix]">{{schema.id}}</a></td>
<td class="selectable-row" (click)="editSchema(schema)"><a [routerLink]="[schema.prefix]">{{schema.namespace}}</a></td>
<td class="selectable-row" (click)="editSchema(schema)"><a [routerLink]="[schema.prefix]">{{schema.prefix}}</a></td>
</tr>
}
</tbody>
</table>
</div>
</ds-pagination>
}
@if ((metadataSchemas | async)?.payload?.totalElements === 0) {
<div class="alert alert-info w-100 mb-2" role="alert">
{{'admin.registries.metadata.schemas.no-items' | translate}}
</div>
}
<div>
@if ((metadataSchemas | async)?.payload?.page?.length > 0) {
<button type="submit" class="btn btn-danger float-end" (click)="deleteSchemas()">{{'admin.registries.metadata.schemas.table.delete' | translate}}</button>
}
</div>
</div>
</div>
</div>

View File

@@ -1,8 +1,6 @@
import {
AsyncPipe,
NgClass,
NgForOf,
NgIf,
} from '@angular/common';
import {
Component,
@@ -49,8 +47,6 @@ import { MetadataSchemaFormComponent } from './metadata-schema-form/metadata-sch
TranslateModule,
AsyncPipe,
PaginationComponent,
NgIf,
NgForOf,
NgClass,
RouterLink,
],

View File

@@ -1,18 +1,16 @@
<div *ngIf="activeMetadataSchema$ | async; then editheader; else createHeader"></div>
@if (activeMetadataSchema$ | async) {
<h2>{{messagePrefix + '.edit' | translate}}</h2>
} @else {
<h2>{{messagePrefix + '.create' | translate}}</h2>
}
<ng-template #createHeader>
<h2>{{messagePrefix + '.create' | translate}}</h2>
</ng-template>
<ng-template #editheader>
<h2>{{messagePrefix + '.edit' | translate}}</h2>
</ng-template>
<ds-form [formId]="formId"
[formModel]="formModel"
[formGroup]="formGroup"
[formLayout]="formLayout"
(cancel)="onCancel()"
(submitForm)="onSubmit()">
[formModel]="formModel"
[formGroup]="formGroup"
[formLayout]="formLayout"
(cancel)="onCancel()"
(submitForm)="onSubmit()">
</ds-form>

View File

@@ -1,7 +1,4 @@
import {
AsyncPipe,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
Component,
EventEmitter,
@@ -39,7 +36,6 @@ import { FormComponent } from '../../../../shared/form/form.component';
selector: 'ds-metadata-schema-form',
templateUrl: './metadata-schema-form.component.html',
imports: [
NgIf,
AsyncPipe,
TranslateModule,
FormComponent,

View File

@@ -1,18 +1,16 @@
<div *ngIf="activeMetadataField$ | async; then editheader; else createHeader"></div>
@if (registryService.getActiveMetadataField() | async) {
<h2>{{messagePrefix + '.edit' | translate}}</h2>
} @else {
<h2>{{messagePrefix + '.create' | translate}}</h2>
}
<ng-template #createHeader>
<h2>{{messagePrefix + '.create' | translate}}</h2>
</ng-template>
<ng-template #editheader>
<h2>{{messagePrefix + '.edit' | translate}}</h2>
</ng-template>
<ds-form [formId]="formId"
[formModel]="formModel"
[formLayout]="formLayout"
[formGroup]="formGroup"
(cancel)="onCancel()"
(submit)="onSubmit()">
[formModel]="formModel"
[formLayout]="formLayout"
[formGroup]="formGroup"
(cancel)="onCancel()"
(submit)="onSubmit()">
</ds-form>

View File

@@ -1,7 +1,4 @@
import {
AsyncPipe,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
Component,
EventEmitter,
@@ -22,7 +19,7 @@ import {
TranslateModule,
TranslateService,
} from '@ngx-translate/core';
import { Observable } from 'rxjs';
import { combineLatest } from 'rxjs';
import { take } from 'rxjs/operators';
import { MetadataField } from '../../../../core/metadata/metadata-field.model';
@@ -35,7 +32,6 @@ import { FormComponent } from '../../../../shared/form/form.component';
selector: 'ds-metadata-field-form',
templateUrl: './metadata-field-form.component.html',
imports: [
NgIf,
FormComponent,
TranslateModule,
AsyncPipe,
@@ -113,8 +109,6 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy {
*/
@Output() submitForm: EventEmitter<any> = new EventEmitter();
activeMetadataField$: Observable<MetadataField>;
constructor(public registryService: RegistryService,
private formBuilderService: FormBuilderService,
private translateService: TranslateService) {
@@ -123,66 +117,71 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy {
/**
* Initialize the component, setting up the necessary Models for the dynamic form
*/
ngOnInit(): void {
this.activeMetadataField$ = this.registryService.getActiveMetadataField();
this.element = new DynamicInputModel({
id: 'element',
label: this.translateService.instant(`${this.messagePrefix}.element`),
name: 'element',
validators: {
required: null,
pattern: '^[^. ,]*$',
maxLength: 64,
},
required: true,
errorMessages: {
pattern: 'error.validation.metadata.element.invalid-pattern',
maxLength: 'error.validation.metadata.element.max-length',
},
});
this.qualifier = new DynamicInputModel({
id: 'qualifier',
label: this.translateService.instant(`${this.messagePrefix}.qualifier`),
name: 'qualifier',
validators: {
pattern: '^[^. ,]*$',
maxLength: 64,
},
required: false,
errorMessages: {
pattern: 'error.validation.metadata.qualifier.invalid-pattern',
maxLength: 'error.validation.metadata.qualifier.max-length',
},
});
this.scopeNote = new DynamicTextAreaModel({
id: 'scopeNote',
label: this.translateService.instant(`${this.messagePrefix}.scopenote`),
name: 'scopeNote',
required: false,
rows: 5,
});
this.formModel = [
new DynamicFormGroupModel(
{
id: 'metadatadatafieldgroup',
group:[this.element, this.qualifier, this.scopeNote],
}),
];
this.formGroup = this.formBuilderService.createFormGroup(this.formModel);
this.registryService.getActiveMetadataField().subscribe((field: MetadataField): void => {
if (field == null) {
this.clearFields();
} else {
this.formGroup.patchValue({
metadatadatafieldgroup: {
element: field.element,
qualifier: field.qualifier,
scopeNote: field.scopeNote,
},
});
this.element.disabled = true;
this.qualifier.disabled = true;
}
ngOnInit() {
combineLatest([
this.translateService.get(`${this.messagePrefix}.element`),
this.translateService.get(`${this.messagePrefix}.qualifier`),
this.translateService.get(`${this.messagePrefix}.scopenote`),
]).subscribe(([element, qualifier, scopenote]) => {
this.element = new DynamicInputModel({
id: 'element',
label: element,
name: 'element',
validators: {
required: null,
pattern: '^[^. ,]*$',
maxLength: 64,
},
required: true,
errorMessages: {
pattern: 'error.validation.metadata.element.invalid-pattern',
maxLength: 'error.validation.metadata.element.max-length',
},
});
this.qualifier = new DynamicInputModel({
id: 'qualifier',
label: qualifier,
name: 'qualifier',
validators: {
pattern: '^[^. ,]*$',
maxLength: 64,
},
required: false,
errorMessages: {
pattern: 'error.validation.metadata.qualifier.invalid-pattern',
maxLength: 'error.validation.metadata.qualifier.max-length',
},
});
this.scopeNote = new DynamicTextAreaModel({
id: 'scopeNote',
label: scopenote,
name: 'scopeNote',
required: false,
rows: 5,
});
this.formModel = [
new DynamicFormGroupModel(
{
id: 'metadatadatafieldgroup',
group:[this.element, this.qualifier, this.scopeNote],
}),
];
this.formGroup = this.formBuilderService.createFormGroup(this.formModel);
this.registryService.getActiveMetadataField().subscribe((field: MetadataField): void => {
if (field == null) {
this.clearFields();
} else {
this.formGroup.patchValue({
metadatadatafieldgroup: {
element: field.element,
qualifier: field.qualifier,
scopeNote: field.scopeNote,
},
});
this.element.disabled = true;
this.qualifier.disabled = true;
}
});
});
}

View File

@@ -8,52 +8,59 @@
<ds-metadata-field-form
[metadataSchema]="schema"
(submitForm)="forceUpdateFields()"></ds-metadata-field-form>
(submitForm)="forceUpdateFields()"></ds-metadata-field-form>
<h2>{{'admin.registries.schema.fields.head' | translate}}</h2>
<ng-container *ngVar="(metadataFields$ | async)?.payload as fields">
<ds-pagination
*ngIf="fields?.totalElements > 0"
[paginationOptions]="config"
[collectionSize]="fields?.totalElements"
[hideGear]="false"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="metadata-fields" class="table table-striped table-hover">
<thead>
<tr>
<th><span class="sr-only">{{'admin.registries.schema.fields.table.selected' | translate}}</span></th>
<th scope="col">{{'admin.registries.schema.fields.table.id' | translate}}</th>
<th scope="col">{{'admin.registries.schema.fields.table.field' | translate}}</th>
<th scope="col">{{'admin.registries.schema.fields.table.scopenote' | translate}}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let field of fields?.page"
[ngClass]="{'table-primary' : (activeField$ | async)?.id === field.id}">
<td *ngVar="(selectedMetadataFieldIDs$ | async)?.includes(field.id) as selected">
<input type="checkbox"
[attr.aria-label]="(selected ? 'admin.registries.schema.fields.deselect' : 'admin.registries.schema.fields.select') | translate"
[checked]="selected"
(change)="selectMetadataField(field, $event)">
</td>
<td class="selectable-row" (click)="editField(field)">{{field.id}}</td>
<td class="selectable-row" (click)="editField(field)">{{schema?.prefix}}.{{field.element}}{{field.qualifier ? '.' + field.qualifier : ''}}</td>
<td class="selectable-row" (click)="editField(field)">{{field.scopeNote}}</td>
</tr>
</tbody>
</table>
</div>
</ds-pagination>
@if (fields?.totalElements > 0) {
<ds-pagination
[paginationOptions]="config"
[collectionSize]="fields?.totalElements"
[hideGear]="false"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
<table id="metadata-fields" class="table table-striped table-hover">
<thead>
<tr>
<th><span class="sr-only">{{'admin.registries.schema.fields.table.selected' | translate}}</span></th>
<th scope="col">{{'admin.registries.schema.fields.table.id' | translate}}</th>
<th scope="col">{{'admin.registries.schema.fields.table.field' | translate}}</th>
<th scope="col">{{'admin.registries.schema.fields.table.scopenote' | translate}}</th>
</tr>
</thead>
<tbody>
@for (field of fields?.page; track field) {
<tr
[ngClass]="{'table-primary' : (activeField$ | async)?.id === field.id}">
<td *ngVar="(selectedMetadataFieldIDs$ | async)?.includes(field.id) as selected">
<input type="checkbox"
[attr.aria-label]="(selected ? 'admin.registries.schema.fields.deselect' : 'admin.registries.schema.fields.select') | translate"
[checked]="selected"
(change)="selectMetadataField(field, $event)">
</td>
<td class="selectable-row" (click)="editField(field)">{{field.id}}</td>
<td class="selectable-row" (click)="editField(field)">{{schema?.prefix}}.{{field.element}}{{field.qualifier ? '.' + field.qualifier : ''}}</td>
<td class="selectable-row" (click)="editField(field)">{{field.scopeNote}}</td>
</tr>
}
</tbody>
</table>
</div>
</ds-pagination>
}
<div *ngIf="fields?.totalElements === 0" class="alert alert-info w-100 mb-2" role="alert">
{{'admin.registries.schema.fields.no-items' | translate}}
</div>
@if (fields?.totalElements === 0) {
<div class="alert alert-info w-100 mb-2" role="alert">
{{'admin.registries.schema.fields.no-items' | translate}}
</div>
}
<div>
<button [routerLink]="['/admin/registries/metadata']" class="btn btn-primary">{{'admin.registries.schema.return' | translate}}</button>
<button *ngIf="fields?.page?.length > 0" type="submit" class="btn btn-danger float-right" (click)="deleteFields()">{{'admin.registries.schema.fields.table.delete' | translate}}</button>
@if (fields?.page?.length > 0) {
<button type="submit" class="btn btn-danger float-end" (click)="deleteFields()">{{'admin.registries.schema.fields.table.delete' | translate}}</button>
}
</div>
</ng-container>

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