Compare commits

...

853 Commits

Author SHA1 Message Date
Tim Donohue
d6c4dad800 Merge pull request #4730 from alanorth/collection-mapper-trash-icon-7x
[Port dspace-7_x] src/app: use correct icon in item mapper
2025-09-22 16:59:47 -05:00
Alan Orth
15525b5df1 src/app: use correct icon in item mapper
When adding mappings in the item mapper we should use the save icon
rather than the trash icon!
2025-09-19 16:41:37 +03:00
Alan Orth
92ffac6eaa Merge pull request #4369 from atmire/w2p-130679_fix-back-button-on-group-roles-page-contribute_7.6 2025-09-15 08:56:29 +03:00
Tim Donohue
ab53a7e7db Merge pull request #4702 from DSpace/dependabot/npm_and_yarn/dspace-7_x/core-js-3.45.1
Bump core-js from 3.44.0 to 3.45.1
2025-09-12 14:07:07 -05:00
Tim Donohue
b97f02ed7a Merge pull request #4704 from DSpace/dependabot/npm_and_yarn/dspace-7_x/babel/runtime-7.28.4
Bump @babel/runtime from 7.28.2 to 7.28.4
2025-09-12 12:32:39 -05:00
Tim Donohue
50123adc36 Merge pull request #4703 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-2e0f0fb0cc
Bump sass from 1.89.2 to 1.92.1 in the sass group
2025-09-10 16:58:51 -05:00
Tim Donohue
a36131557f Merge pull request #4705 from DSpace/dependabot/npm_and_yarn/dspace-7_x/isbot-5.1.30
Bump isbot from 5.1.29 to 5.1.30
2025-09-10 16:36:19 -05:00
Tim Donohue
2c4790c9ae Merge pull request #4701 from DSpace/dependabot/npm_and_yarn/dspace-7_x/testing-c9201e7a88
Bump cypress-axe from 1.6.0 to 1.7.0 in the testing group
2025-09-10 15:55:49 -05:00
Tim Donohue
7154bc0689 Merge pull request #4717 from DSpace/backport-4634-to-dspace-7_x
[Port dspace-7_x] server.ts: remove port and host fallbacks in run
2025-09-10 15:51:18 -05:00
Tim Donohue
42419d12ee Merge pull request #4714 from DSpace/backport-4636-to-dspace-7_x
[Port dspace-7_x] src/themes/dspace: rework banner image
2025-09-10 14:57:10 -05:00
Alan Orth
65cd1df6ef server.ts: remove port fallback
If a user has messed up their config so much that the fallbacks in
our default configuration interface don't work then we should just
fail here.

(cherry picked from commit 6c09677510)
2025-09-10 19:48:58 +00:00
Alan Orth
66cdc972d2 server.ts: remove invalid host fallback
If `environment.ui.host` is Falsy, then we attempt to fall back to
a host value of '/', which is invalid. I think that, if a user has
messed up their config so much that defaults in our configuration
interface don't work, then we should actually fail here.

(cherry picked from commit f622d58917)
2025-09-10 19:48:58 +00:00
Alan Orth
be06c4fcd1 src/themes/dspace: rework banner image
For some reason our version of this image is twice the size of the
original (~860KiB vs 1.6MiB). To make matters worse, the dimensions
of the image are 4777x3166 pixels, but we display it at 2000 pixels
wide.

This regenerates the images based on the original and adjusts the
dimensions to be more appropriate. Generated using ImageMagick 7
on Linux:

$ magick pexels-inspiredimages-132477.jpg -resize 2000x src/themes/dspace/assets/images/banner.jpg
$ magick pexels-inspiredimages-132477.jpg -resize 2000x src/themes/dspace/assets/images/banner.webp
$ magick pexels-inspiredimages-132477.jpg -resize 1200x src/themes/dspace/assets/images/banner-half.jpg
$ magick pexels-inspiredimages-132477.jpg -resize 1200x src/themes/dspace/assets/images/banner-half.webp

See: https://www.pexels.com/photo/clear-water-drops-132477/
(cherry picked from commit d9e8fea5bf)
2025-09-10 19:07:59 +00:00
Tim Donohue
ccd8d433ee Merge pull request #4180 from alanorth/port-4136-dspace-7
[Port dspace-7_x] Clean up spacing in input forms
2025-09-10 13:36:46 -05:00
Tim Donohue
c186423ad7 Merge pull request #4707 from DSpace/backport-4644-to-dspace-7_x
[Port dspace-7_x] fix: call parent ngOnDestroy in dynamic form control container
2025-09-10 08:52:50 -05:00
Jukka Lipka
826157c1d4 fix: call parent ngOnDestroy in dynamic form control container
(cherry picked from commit 4d803a58d4)
2025-09-09 21:36:50 +00:00
dependabot[bot]
96422c2909 Bump isbot from 5.1.29 to 5.1.30
Bumps [isbot](https://github.com/omrilotan/isbot) from 5.1.29 to 5.1.30.
- [Changelog](https://github.com/omrilotan/isbot/blob/main/CHANGELOG.md)
- [Commits](https://github.com/omrilotan/isbot/compare/v5.1.29...v5.1.30)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 22:40:59 +00:00
dependabot[bot]
57c75d06f9 Bump @babel/runtime from 7.28.2 to 7.28.4
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.28.2 to 7.28.4.
- [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.28.4/packages/babel-runtime)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 22:40:21 +00:00
dependabot[bot]
0a63a34533 Bump sass from 1.89.2 to 1.92.1 in the sass group
Bumps the sass group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.89.2 to 1.92.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.89.2...1.92.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 22:39:53 +00:00
dependabot[bot]
fffbe2d62c Bump core-js from 3.44.0 to 3.45.1
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.44.0 to 3.45.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.45.1/packages/core-js)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 22:39:48 +00:00
dependabot[bot]
b1bd60ca79 Bump cypress-axe from 1.6.0 to 1.7.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.6.0 to 1.7.0
- [Release notes](https://github.com/component-driven/cypress-axe/releases)
- [Commits](https://github.com/component-driven/cypress-axe/compare/v1.6.0...v1.7.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 22:39:16 +00:00
Atmire-Kristof
90a1ca6f5d 7.x - Clear url parameters for entity search tabs (#2735)
* 110878: Entity search - clear params on tab switch

* 110878: Properly clear browse-by values when navigating

* 132230: Related entity tab switching: only keep query & scope, reset page to 1

---------

Co-authored-by: Nona Luypaert <nona.luypaert@atmire.com>
2025-09-05 16:47:44 -05:00
Art Lowel
6071065c12 Merge pull request #4669 from DSpace/backport-4664-to-dspace-7_x
[Port dspace-7_x] Inspect event key characters, not keyCodes on tag keyUp for dynamic tag input
2025-09-04 17:38:01 +02:00
Kim Shepherd
86a18f31d9 Create dynamic tag test events with key chars, not keyCodes
(cherry picked from commit 98fc76d867)
2025-09-04 14:46:06 +00:00
Kim Shepherd
1ade04398a Inspect event key characters, not keyCodes on tag keyUp
(cherry picked from commit f313b4a8fd)
2025-09-04 14:46:06 +00:00
Tim Donohue
f5314156f6 Merge pull request #4616 from nimabehforouz/translate-7x-fr
Adding the missing French translations (dspace-7_x)
2025-08-28 16:01:12 -05:00
Tim Donohue
a833ba3d3c Merge pull request #4649 from DSpace/backport-4640-to-dspace-7_x
[Port dspace-7_x] .github/workflows/codescan.yml: use codeql-action v3
2025-08-20 17:16:34 -05:00
Alan Orth
4392a4b67e .github/workflows/codescan.yml: use codeql-action v3
Version 2 was deprecated in January, 2024 after the release of v3.

See: https://github.blog/changelog/2025-01-10-code-scanning-codeql-action-v2-is-now-deprecated/
(cherry picked from commit 3333ee4fbb)
2025-08-20 21:10:47 +00:00
Tim Donohue
d98963c9d1 Merge pull request #4588 from DSpace/dependabot/npm_and_yarn/dspace-7_x/babel/runtime-7.28.2
Bump @babel/runtime from 7.27.6 to 7.28.2
2025-08-01 10:47:59 -05:00
Tim Donohue
d6a39f2164 Merge pull request #4618 from DSpace/dependabot/npm_and_yarn/dspace-7_x/webpack-dev-server-5.2.2
Bump webpack-dev-server from 5.2.1 to 5.2.2
2025-08-01 10:00:59 -05:00
dependabot[bot]
81648512e9 Bump webpack-dev-server from 5.2.1 to 5.2.2
Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 5.2.1 to 5.2.2.
- [Release notes](https://github.com/webpack/webpack-dev-server/releases)
- [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-server/compare/v5.2.1...v5.2.2)

---
updated-dependencies:
- dependency-name: webpack-dev-server
  dependency-version: 5.2.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-31 21:28:11 +00:00
Nima Behforouz
414589ee89 Updates French translations for 7.x 2025-07-31 11:28:55 -04:00
dependabot[bot]
21d6c54183 Bump @babel/runtime from 7.27.6 to 7.28.2
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.27.6 to 7.28.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.28.2/packages/babel-runtime)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-30 20:57:54 +00:00
Tim Donohue
e92a96bd92 Merge pull request #4608 from DSpace-Labs/dependabot/npm_and_yarn/babel/helpers-7.27.6
[Dependabot] Bump @babel/helpers from 7.21.0 to 7.27.6
2025-07-30 15:36:29 -05:00
Tim Donohue
37d6c0d61d Merge pull request #4609 from DSpace-Labs/dependabot/npm_and_yarn/webpack-dev-server-5.2.1
[Dependabot] Bump webpack-dev-server from 4.15.2 to 5.2.1
2025-07-30 15:19:03 -05:00
Tim Donohue
88e18a3559 Merge pull request #4542 from DSpace/dependabot/npm_and_yarn/dspace-7_x/core-js-3.44.0
Bump core-js from 3.42.0 to 3.44.0
2025-07-30 11:44:20 -05:00
Tim Donohue
18e2446a7e Merge pull request #4601 from DSpace/backport-4344-to-dspace-7_x
[Port dspace-7_x] fix(versioning): Encode summary
2025-07-30 11:02:00 -05:00
dependabot[bot]
376a731beb Bump webpack-dev-server from 4.15.2 to 5.2.1
Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 4.15.2 to 5.2.1.
- [Release notes](https://github.com/webpack/webpack-dev-server/releases)
- [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-server/compare/v4.15.2...v5.2.1)

---
updated-dependencies:
- dependency-name: webpack-dev-server
  dependency-version: 5.2.1
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-30 15:43:23 +00:00
Tim Donohue
e41f576d3a Merge pull request #4535 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/lodash-4.17.20
Bump @types/lodash from 4.17.17 to 4.17.20
2025-07-30 10:09:10 -05:00
Tim Donohue
d919d255c1 Merge pull request #4587 from DSpace/dependabot/npm_and_yarn/dspace-7_x/axios-1.11.0
Bump axios from 1.10.0 to 1.11.0
2025-07-30 10:00:53 -05:00
Jukka Lipka
0988c41c19 fix(versioning): encode summary
The reason for creating a new version is now encoded in the URL.

(cherry picked from commit 2dd870ea7e)
2025-07-30 14:21:07 +00:00
Tim Donohue
a7a543cfb0 Merge pull request #4596 from DSpace/dependabot/npm_and_yarn/dspace-7_x/isbot-5.1.29
Bump isbot from 5.1.28 to 5.1.29
2025-07-29 13:29:58 -05:00
dependabot[bot]
07d3c7aa15 Bump isbot from 5.1.28 to 5.1.29
Bumps [isbot](https://github.com/omrilotan/isbot) from 5.1.28 to 5.1.29.
- [Changelog](https://github.com/omrilotan/isbot/blob/main/CHANGELOG.md)
- [Commits](https://github.com/omrilotan/isbot/compare/v5.1.28...v5.1.29)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-29 14:33:25 +00:00
dependabot[bot]
57b1de3b94 Bump axios from 1.10.0 to 1.11.0
Bumps [axios](https://github.com/axios/axios) from 1.10.0 to 1.11.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.10.0...v1.11.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-28 07:31:25 +00:00
Tim Donohue
5a08173f5e Merge pull request #4579 from DSpace/backport-4536-to-dspace-7_x
[Port dspace-7_x] Fix empty search query after previous non-empty search
2025-07-24 13:42:09 -05:00
Jesiel Viana
be8def0064 fix empty search query after previous non-empty search
(cherry picked from commit cf34198d54)
2025-07-24 17:58:57 +00:00
dependabot[bot]
d9d0032378 Bump @babel/helpers from 7.21.0 to 7.27.6
Bumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers) from 7.21.0 to 7.27.6.
- [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.27.6/packages/babel-helpers)

---
updated-dependencies:
- dependency-name: "@babel/helpers"
  dependency-version: 7.27.6
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-23 19:13:16 +00:00
Tim Donohue
da99511ff3 Merge pull request #4571 from DSpace/backport-4568-to-dspace-7_x
[Port dspace-7_x] Fix current parent order when creating subcommunity
2025-07-23 12:31:24 -05:00
Jesiel Viana
08eb6def3e Fix current parent order when creating subcommunity
(cherry picked from commit 44fcc7221b)
2025-07-23 15:42:12 +00:00
Tim Donohue
1419ed9a22 Update version tag for development of next release 2025-07-22 15:33:00 -05:00
Tim Donohue
9497decf07 Update version tag for release 2025-07-22 15:30:23 -05:00
Tim Donohue
d4edbf2e25 Automatic update to yarn.locak after various dependency updates. This dependency is no longer needed. 2025-07-22 11:26:15 -05:00
dependabot[bot]
7376ae2b26 Bump core-js from 3.42.0 to 3.44.0
---
updated-dependencies:
- dependency-name: core-js
  dependency-version: 3.44.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-22 15:55:48 +00:00
Tim Donohue
f80992f1fc Merge pull request #4559 from DSpace/dependabot/npm_and_yarn/dspace-7_x/morgan-1.10.1
Bump morgan from 1.10.0 to 1.10.1
2025-07-22 10:52:57 -05:00
Alan Orth
bb3af14b6c Merge pull request #4560 from DSpace/dependabot/npm_and_yarn/dspace-7_x/compression-1.8.1 2025-07-21 21:27:13 -07:00
Alan Orth
3a5f4565a5 Merge pull request #4493 from DSpace/dependabot/npm_and_yarn/dspace-7_x/eslint-036d341c50 2025-07-21 21:07:37 -07:00
Alan Orth
fc43e2473d Merge pull request #4457 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-63defccb8e 2025-07-21 18:17:26 -07:00
dependabot[bot]
16da9855fc Bump compression from 1.8.0 to 1.8.1
---
updated-dependencies:
- dependency-name: compression
  dependency-version: 1.8.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-21 06:47:30 +00:00
dependabot[bot]
821f16ea1d Bump morgan from 1.10.0 to 1.10.1
---
updated-dependencies:
- dependency-name: morgan
  dependency-version: 1.10.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-21 06:45:01 +00:00
dependabot[bot]
f9fb6d06f1 Bump eslint-plugin-import from 2.31.0 to 2.32.0 in the eslint group
Bumps the eslint group with 1 update: [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import).


Updates `eslint-plugin-import` from 2.31.0 to 2.32.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.31.0...v2.32.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-21 05:38:45 +00:00
dependabot[bot]
4fa71b801c Bump sass from 1.89.1 to 1.89.2 in the sass group
Bumps the sass group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.89.1 to 1.89.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.89.1...1.89.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-21 05:38:29 +00:00
Tim Donohue
7a7e468492 Update version tag for development of next release 2025-07-14 14:10:06 -05:00
Tim Donohue
34fc08766d Update version tag for release 2025-07-14 14:04:48 -05:00
Tim Donohue
13d6acaf76 Sync i18n files to prepare for the 7.6.4 release 2025-07-11 13:43:39 -05:00
Tim Donohue
d9c0401bdd Merge pull request #4530 from atmire/w2p-119612_export-item-limit-7_x
[Port dspace-7_x] UI warning for export item limit
2025-07-10 13:25:34 -05:00
Jens Vannerum
5a2702c797 fix missing imports after backport 2025-07-10 10:39:55 +02:00
dependabot[bot]
ac5ef72bbe Bump @types/lodash from 4.17.17 to 4.17.20
Bumps [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) from 4.17.17 to 4.17.20.
- [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-version: 4.17.20
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-07 07:34:47 +00:00
Jens Vannerum
dabc3b400b 119612: fix spec test
(cherry picked from commit 6232d4e9cf)
2025-07-04 10:26:25 +02:00
Jens Vannerum
5b19ebe48c 119612: aria-label to also include warning message if applicable
(cherry picked from commit 8eaff78737)
2025-07-04 10:25:51 +02:00
Jens Vannerum
32511b0f50 119612: Check if a warning should be shown on changes to the total elements of the search, default to 500 if no value for the configuration property was returned
(cherry picked from commit e1b773c097)
2025-07-04 10:25:43 +02:00
Jens Vannerum
17e58ae5e3 119612: UI warning that only first part of configured items will be exported
(cherry picked from commit b69b21af6c)
2025-07-04 10:24:36 +02:00
Tim Donohue
0d87a72f41 Merge pull request #4417 from atmire/w2p-131442_backport-4335-to-dspace-7_x
[Port dspace-7_x] Improve accessibility for screen readers
2025-07-03 15:14:03 -05:00
Tim Donohue
a17d58acc5 Merge pull request #4277 from DSpace/backport-3888-to-dspace-7_x
[Port dspace-7_x] Fixed search page still returning stale data after invalidating a request
2025-07-03 14:42:57 -05:00
Tim Donohue
44f2ad7f4f Merge pull request #3821 from atmire/vocabulary-preloadlevel-fix-7_x
[Port dspace-7_x] Vocabulary preloadlevel fix
2025-07-01 17:02:27 -05:00
Tim Donohue
c7f8ed1f42 Merge pull request #4519 from atmire/accessibility-settings-7_x
[Port dspace-7_x] Accessibility settings page SSR Fix
2025-07-01 13:58:20 -05:00
Andreas Awouters
c6ef2467bc 119602: Fix SSR error by making klaroService optional
KlaroService handles cookies which are not applicable during SSR. By
making the service optional, and handling the case when it is not
available, SSR can do its work without throwing NullInjectorErrors.
2025-07-01 09:06:40 +02:00
Tim Donohue
c07bc3c379 Merge pull request #3615 from atmire/accessibility-settings-7_x
[Port dspace-7_x] Accessibility settings page
2025-06-30 11:03:38 -05:00
Andreas Awouters
b44f74a20a 119602: Port disabling of cookie popup from main 2025-06-30 11:54:20 +02:00
Andreas Awouters
50757247ab Merge branch 'dspace-7_x' into accessibility-settings-7_x 2025-06-30 10:37:10 +02:00
Andreas Awouters
1883d93198 119602: Open tooltip to left of info icon 2025-06-30 10:35:47 +02:00
Andreas Awouters
d9ab4bca65 119602: Align accessibility link with other footer links 2025-06-30 10:35:26 +02:00
Alan Orth
edeb2d2e3a Merge pull request #4492 from DSpace/dependabot/npm_and_yarn/dspace-7_x/postcss-bff535204e 2025-06-28 11:57:44 +03:00
Tim Donohue
c2257ebc81 Merge pull request #4449 from 4Science/task/dspace-7_x/DURACOM-291
[Port dspace-7_x] Fix submission section visibility in order to rely on the configured section scope
2025-06-26 16:41:09 -05:00
Tim Donohue
cf2407ba90 Merge pull request #4488 from alexandrevryghem/w2p-117573_remove-observable-function-calls-from-template-7_x
[Port dspace-7_x] Removed observable function calls from template (part 2)
2025-06-26 11:36:11 -05:00
dependabot[bot]
e0af01ff43 Bump postcss from 8.5.5 to 8.5.6 in the postcss group
Bumps the postcss group with 1 update: [postcss](https://github.com/postcss/postcss).


Updates `postcss` from 8.5.5 to 8.5.6
- [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.5.5...8.5.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-23 06:08:24 +00:00
Alexandre Vryghem
7afe49d2b0 117287: Fixed various layout issues
- The unthemed home news didn't stick to the header like the dspace theme
- Impersonate user button has additional margin
- Submission form loading icon is not translatable
- Create resource policy page doesn't have the correct heading

(cherry picked from commit 56e45a9f08)
2025-06-21 01:38:08 +02:00
Alexandre Vryghem
c89ad9f22a 122464: Fixed a memory leak when initComponentInstance is called multiple times
(cherry picked from commit 62f15668b6)
2025-06-21 01:33:21 +02:00
Alexandre Vryghem
391e87a11f Merge branch 'w2p-117573_remove-observable-function-calls-from-template-7.6' 2025-06-21 01:26:12 +02:00
Alan Orth
a864260d00 Merge pull request #4458 from DSpace/dependabot/npm_and_yarn/dspace-7_x/postcss-ff1e1e588d 2025-06-17 09:26:32 +03:00
Alan Orth
abfdf63482 Merge pull request #4463 from DSpace/dependabot/npm_and_yarn/dspace-7_x/axios-1.10.0 2025-06-17 07:06:53 +03:00
dependabot[bot]
7f3b3370d9 Bump axios from 1.9.0 to 1.10.0
Bumps [axios](https://github.com/axios/axios) from 1.9.0 to 1.10.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.9.0...v1.10.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-16 05:40:32 +00:00
dependabot[bot]
d56119793f Bump postcss from 8.5.4 to 8.5.5 in the postcss group
Bumps the postcss group with 1 update: [postcss](https://github.com/postcss/postcss).


Updates `postcss` from 8.5.4 to 8.5.5
- [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.5.4...8.5.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-16 05:38:56 +00:00
Tim Donohue
7677f2941d Merge pull request #4450 from DSpace/backport-4434-to-dspace-7_x
[Port dspace-7_x] Resolve field instance models using index when filtering errors
2025-06-12 12:47:31 -05:00
Kim Shepherd
7ef44c5e35 Resolve field instance models using index when filtering errors
(cherry picked from commit d218e22944)
2025-06-12 16:40:39 +00:00
Giuseppe Digilio
a77f98e29e [DURACOM-291] back porting of fix submission section visibility in order to rely on the configured section scope 2025-06-12 15:53:21 +02:00
Alan Orth
5c66bb9d2b Merge pull request #4442 from DSpace/dependabot/npm_and_yarn/dspace-7_x/babel/runtime-7.27.6
Bump @babel/runtime from 7.27.4 to 7.27.6
2025-06-11 12:23:18 +03:00
dependabot[bot]
7cc17a5544 Bump @babel/runtime from 7.27.4 to 7.27.6
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.27.4 to 7.27.6.
- [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.27.6/packages/babel-runtime)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-09 05:32:54 +00:00
Alan Orth
b7b1e368d6 Merge pull request #4430 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-d83863101d
Bump sass from 1.89.0 to 1.89.1 in the sass group
2025-06-05 08:54:07 +03:00
dependabot[bot]
5e8dd3480f Bump sass from 1.89.0 to 1.89.1 in the sass group
Bumps the sass group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.89.0 to 1.89.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.89.0...1.89.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-04 13:49:29 +00:00
Alan Orth
f2131ec757 Merge pull request #4427 from DSpace/backport-4076-to-dspace-7_x
[Port dspace-7_x] fix typo in German translation of bitstream.edit.form.description.hint
2025-06-04 14:05:27 +03:00
Sascha Szott
c52c7e778a fix typo in German translation of bitstream.edit.form.description.hint
(cherry picked from commit c72af8edb5)
2025-06-04 09:52:26 +00:00
Alan Orth
b870c54c83 Merge pull request #4357 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sanitize-html-2.17.0
Bump sanitize-html from 2.16.0 to 2.17.0
2025-06-04 12:39:34 +03:00
Alan Orth
f58ab77d5d Merge pull request #4409 from DSpace/dependabot/npm_and_yarn/dspace-7_x/postcss-3f4fa9ea8d
Bump postcss from 8.5.3 to 8.5.4 in the postcss group
2025-06-03 09:07:50 +03:00
Alan Orth
406b46ba3f Merge pull request #4410 from DSpace/dependabot/npm_and_yarn/dspace-7_x/babel/runtime-7.27.4
Bump @babel/runtime from 7.27.3 to 7.27.4
2025-06-03 09:03:45 +03:00
Alexandre Vryghem
b6448a7caf 129964: Fixed the header role structure being invalid in the custom theme
- Replaced the menubar role from the parent of all the header buttons like lang switch, auth menu & help toggle with toolbar
- Replaced the remaining `<a>` buttons in the header with `<button>` to make them expandable with space
- Fixed accessibility issues flagged by axe DevTools in the user menu dropdown
2025-06-02 13:55:33 +02:00
dependabot[bot]
8a1daa5cf9 Bump @babel/runtime from 7.27.3 to 7.27.4
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.27.3 to 7.27.4.
- [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.27.4/packages/babel-runtime)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-02 06:45:45 +00:00
dependabot[bot]
fa9ddefb59 Bump postcss from 8.5.3 to 8.5.4 in the postcss group
Bumps the postcss group with 1 update: [postcss](https://github.com/postcss/postcss).


Updates `postcss` from 8.5.3 to 8.5.4
- [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.5.3...8.5.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-02 06:42:07 +00:00
Alan Orth
8a1ca84d91 Merge pull request #4402 from DSpace/backport-2774-to-dspace-7_x
[Port dspace-7_x] German translation improvements in cookie consent dialog
2025-06-01 17:42:12 +03:00
Tim Donohue
06e30050a4 Merge pull request #4384 from atmire/w2p-131441_backport-3065-7.6
[Port dspace-7_x] Made AdminSearchPageComponent themeable
2025-05-30 10:38:39 -05:00
Tim Donohue
ffda0d6521 Merge pull request #4379 from DSpace/dependabot/npm_and_yarn/dspace-7_x/testing-ff22ddd0c9
Bump ng-mocks from 14.13.4 to 14.13.5 in the testing group
2025-05-29 08:49:39 -05:00
Sascha Szott
a692a6762d added german translations
(cherry picked from commit 4ca1edfc63)
2025-05-29 05:53:54 +00:00
Sascha Szott
2687ded0df added German translations
(cherry picked from commit f12fae3865)
2025-05-29 05:53:54 +00:00
Sascha Szott
e387be1e10 minor translation improvement: use plural in German translation
(cherry picked from commit 027a5ec5f0)
2025-05-29 05:53:54 +00:00
Alan Orth
b0e56c4129 Merge pull request #4398 from DSpace/dependabot/npm_and_yarn/dspace-7_x/babel/runtime-7.27.3
Bump @babel/runtime from 7.27.1 to 7.27.3
2025-05-29 08:39:56 +03:00
dependabot[bot]
9a11618d11 Bump sanitize-html from 2.16.0 to 2.17.0
Bumps [sanitize-html](https://github.com/apostrophecms/sanitize-html) from 2.16.0 to 2.17.0.
- [Changelog](https://github.com/apostrophecms/sanitize-html/blob/main/CHANGELOG.md)
- [Commits](https://github.com/apostrophecms/sanitize-html/compare/2.16.0...2.17.0)

---
updated-dependencies:
- dependency-name: sanitize-html
  dependency-version: 2.17.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-28 21:27:11 +00:00
Tim Donohue
5b47170b6d Merge pull request #4380 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/lodash-4.17.17
Bump @types/lodash from 4.17.16 to 4.17.17
2025-05-28 16:10:09 -05:00
dependabot[bot]
983551aea8 Bump @babel/runtime from 7.27.1 to 7.27.3
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.27.1 to 7.27.3.
- [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.27.3/packages/babel-runtime)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-28 18:33:15 +00:00
dependabot[bot]
1727acab33 Bump ng-mocks from 14.13.4 to 14.13.5 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.4 to 14.13.5
- [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.4...v14.13.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-28 18:08:28 +00:00
Joran De Braekeleer
bf585e77c3 Merge remote-tracking branch 'upstream/dspace-7_x' into w2p-131442_backport-4335-to-dspace-7_x 2025-05-28 18:02:40 +02:00
Tim Donohue
a226502c72 Merge pull request #4387 from atmire/w2p-127655_fix-submission-form-getting-stuck-in-loop_contribute-7.6
[Port dspace-7_x] Fix infinite loading submission forms
2025-05-27 16:43:54 -05:00
Tim Donohue
4f79574a76 Merge pull request #4383 from atmire/w2p-130424_impossible-to-add-new-values-for-fields-without-qualifiers_contribute-7.6
[Port dspace-7_x] Fix unqualified metadata field validation in Edit Metadata tab by sorting fields in validation request
2025-05-27 14:55:33 -05:00
frabacche
cb0ac0c9e5 fix e2e test 18x aria on <ul> html tag
(cherry picked from commit e6389a73df)
2025-05-26 13:18:46 +02:00
abhinav
d3876c7c0a Merge branch 'dspace-7_x' into w2p-127655_fix-submission-form-getting-stuck-in-loop_contribute-7.6 2025-05-26 11:23:24 +02:00
Alexandre Vryghem
db119e4118 Fixed search facet deadlock
Also fixed minor issue in MetadataService, but this doesn't cause any issues in the current code

(cherry picked from commit 446280b59a)
2025-05-26 10:50:48 +02:00
abhinav
0c9f8c02f6 Merge remote-tracking branch 'alex-upstream/w2p-115051_themed-admin-search-page_contribute-7.4' into w2p-131441_backport-3065-7.6 2025-05-26 10:45:44 +02:00
dependabot[bot]
e42d4228ed Bump @types/lodash from 4.17.16 to 4.17.17
Bumps [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) from 4.17.16 to 4.17.17.
- [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-version: 4.17.17
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-26 02:53:33 +00:00
abhinav
38812a3e04 Merge branch 'dspace-7_x' into w2p-130424_impossible-to-add-new-values-for-fields-without-qualifiers_contribute-7.6 2025-05-23 18:11:40 +02:00
abhinav
084cad6e46 Fix back button behavior on roles page 2025-05-23 13:56:46 +02:00
Tim Donohue
1aaa20ec73 Merge pull request #4365 from DSpace/backport-4364-to-dspace-7_x
[Port dspace-7_x] Remove stray comma from `config.example.yml` which makes example config invalid
2025-05-22 13:58:46 -05:00
Tim Donohue
e7709b8091 Remove stray comma
(cherry picked from commit bcd2081ee3)
2025-05-22 17:05:11 +00:00
Tim Donohue
6971ac98c2 Merge pull request #4354 from DSpace/dependabot/npm_and_yarn/dspace-7_x/eslint-1ccb09f07e
Bump eslint-plugin-jsonc from 2.20.0 to 2.20.1 in the eslint group
2025-05-19 11:07:07 -05:00
Tim Donohue
280866a58f Merge pull request #4355 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-5219375de9
Bump sass from 1.88.0 to 1.89.0 in the sass group
2025-05-19 11:05:57 -05:00
Tim Donohue
c8b375d238 Merge pull request #4356 from DSpace/dependabot/npm_and_yarn/dspace-7_x/isbot-5.1.28
Bump isbot from 5.1.27 to 5.1.28
2025-05-19 10:22:32 -05:00
dependabot[bot]
37383acb6b Bump isbot from 5.1.27 to 5.1.28
Bumps [isbot](https://github.com/omrilotan/isbot) from 5.1.27 to 5.1.28.
- [Changelog](https://github.com/omrilotan/isbot/blob/main/CHANGELOG.md)
- [Commits](https://github.com/omrilotan/isbot/compare/v5.1.27...v5.1.28)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 03:06:55 +00:00
dependabot[bot]
277eca837e Bump sass from 1.88.0 to 1.89.0 in the sass group
Bumps the sass group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.88.0 to 1.89.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.88.0...1.89.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 03:06:09 +00:00
dependabot[bot]
160f33f98a Bump eslint-plugin-jsonc from 2.20.0 to 2.20.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.20.0 to 2.20.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.20.0...v2.20.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 03:05:35 +00:00
Tim Donohue
ca92b4cf0e Merge pull request #4342 from DSpace/backport-4341-to-dspace-7_x
[Port dspace-7_x] Use ellipsis for truncatable parts
2025-05-15 15:54:06 -05:00
Andrea Barbasso
46b58c369e [CST-19327] use ellipsis for truncatable parts
(cherry picked from commit 6703a07207)
2025-05-15 19:55:45 +00:00
Tim Donohue
a0ebf4af63 Merge pull request #4322 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-d0f2b75659
Bump sass from 1.87.0 to 1.88.0 in the sass group
2025-05-14 10:02:48 -05:00
Alexandre Vryghem
c58b398e43 129964: Restored language button border on focus 2025-05-14 13:49:16 +02:00
Tim Donohue
df2d18b5f1 Merge pull request #4336 from DSpace/backport-3373-to-dspace-7_x
[Port dspace-7_x] Adjust the font size of the 'No thumbnails available' text.
2025-05-13 17:34:16 -05:00
DanGastardelli
1e8c55faf4 Adjust thumb text for smaller resolutions
(cherry picked from commit fa723c17a9)
2025-05-13 21:41:21 +00:00
DanGastardelli
9273c83179 Key spacing adjustment
(cherry picked from commit 829d406808)
2025-05-13 21:41:21 +00:00
DanGastardelli
e06caab25c Adding treatment for the use of the thumb-font-2 class
(cherry picked from commit e06db4cbab)
2025-05-13 21:41:21 +00:00
DanGastardelli
a21db5b887 Changed the implementation of changing the text font size when there is no thumbnail.
(cherry picked from commit 3cd5432034)
2025-05-13 21:41:21 +00:00
DanGastardelli
cae435a5c7 Adjust the font size of the 'No thumbnails available' text.
(cherry picked from commit c4dfed0e02)
2025-05-13 21:41:21 +00:00
Tim Donohue
974e3bf3f3 Merge pull request #4323 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/sanitize-html-2.16.0
Bump @types/sanitize-html from 2.15.0 to 2.16.0
2025-05-13 14:42:28 -05:00
Tim Donohue
f0ce4b2170 Merge pull request #4314 from oscar-escire/new-dspace-7_x
[Port dspace-7_x] Keyboard 'tab' key navigation improved
2025-05-13 12:08:40 -05:00
Alexandre Vryghem
830be1f15a 129964: Hide duplicate links for keyboard navigators 2025-05-13 18:59:04 +02:00
Alexandre Vryghem
8ff943b084 129964: Made DSO badges more screen-reader friendly
- Added commas between the labels to prevent screen readers from reading it as a sentence
- Added hidden text describing what the badges represent
2025-05-13 18:52:14 +02:00
Tim Donohue
206df7781e Merge pull request #4334 from tdonohue/port_4326_to_7x
[Port dspace-7_x] Add basic automated tests to ensure common HTTP Return Codes do not break
2025-05-13 11:35:48 -05:00
Alexandre Vryghem
545b2ff8a7 130479: Hide no results status when query is empty 2025-05-13 18:30:38 +02:00
wout
163cc75437 130479: using ul > li in recent-item + "Load more ..." to "<a>" element 2025-05-13 18:30:38 +02:00
wout
e9940f4005 130479: add aria-selected to selected language + globe button uses a button element 2025-05-13 18:30:37 +02:00
Tim Donohue
2301a8fd52 Add basic tests to our build to verify correct HTTP return codes for 301, 403, 404 and 500. 2025-05-13 10:59:45 -05:00
Tim Donohue
f9aa721ec8 Merge pull request #4332 from 4Science/task/dspace-7_x/DURACOM-344
[Port dspace-7_x] Remove `ssr.paths` configuration and replace with `ssr.excludePathPatterns` which excludes specific paths from SSR
2025-05-13 10:58:45 -05:00
FrancescoMolinaro
d47baab3a1 [DURACOM-344] fix property name 2025-05-13 16:11:00 +02:00
FrancescoMolinaro
c0e71a0e68 [DURACOM-344] refactor solution to avoid double slashes 2025-05-13 15:41:21 +02:00
FrancescoMolinaro
21ac024423 [DURACOM-344] adapt patterns and example file, fix possible error from YAML 2025-05-13 15:38:42 +02:00
FrancescoMolinaro
ce0f6153b9 [DURACOM-344] Adapt SSR page filtering mechanism to a not allowed list 2025-05-13 15:37:31 +02:00
dependabot[bot]
cafcee110e Bump @types/sanitize-html from 2.15.0 to 2.16.0
Bumps [@types/sanitize-html](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/sanitize-html) from 2.15.0 to 2.16.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/sanitize-html)

---
updated-dependencies:
- dependency-name: "@types/sanitize-html"
  dependency-version: 2.16.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-12 03:09:54 +00:00
dependabot[bot]
a8fcad7b6a Bump sass from 1.87.0 to 1.88.0 in the sass group
Bumps the sass group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.87.0 to 1.88.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.87.0...1.88.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-12 03:09:06 +00:00
Oscar Chacón
5c446d18f7 fixed accessibility tests on filters 2025-05-09 15:56:13 -06:00
Oscar Chacón
cd0aa134f8 fixed some dynamic params over <a> components 2025-05-09 15:07:55 -06:00
Oscar Chacón
9aed649160 improved "tab" navigation in safari 2025-05-09 13:27:29 -06:00
Tim Donohue
fbbf16f387 Merge pull request #4250 from atmire/fix-embargoed-thumbnails_contribute-7.6
[Port dspace-7_x] Show restricted thumbnails to users with access rights
2025-05-08 16:09:07 -05:00
Art Lowel
283b345cdc always use thumbnail component for files not supported by the media viewer, and switch to themed version of thumbnail component 2025-05-08 11:26:14 +02:00
Alexandre Vryghem
da6ace1882 130424: Fix validation on the edit metadata tab sometimes wrongly displaying an error message
This only happens when the request that validates the metadata field doesn't return the field with qualifier null on the first page
2025-05-08 01:48:52 +02:00
Tim Donohue
aaa4b910e2 Merge pull request #4307 from DSpace/backport-4288-to-dspace-7_x
[Port dspace-7_x] Bitstream upload failure during the workflow editing process when impersonating an editor
2025-05-07 17:10:02 -05:00
Adamo
926abe6241 [DURACOM-312] lint fix
(cherry picked from commit c68e5a181d)
2025-05-07 21:42:14 +00:00
Adamo
97fd42a2e1 [DURACOM-312] set the X-On-Behalf-Of header with impersonatingID in FileUploader.
(cherry picked from commit 727bcdc2cb23ae7fcff1d9ddfa794f872f1d1b8c)
(cherry picked from commit 0574c8ed98)
2025-05-07 21:42:14 +00:00
Adamo
3cff971297 [DURACOM-312] set the newly created impersonatingID filed in UploaderOptions.
(cherry picked from commit c70fe184208805be8657d4373f50f193e2c6e85f)
(cherry picked from commit 70c6af3630)
2025-05-07 21:42:14 +00:00
Adamo
49b27b5bc0 [DURACOM-312] updated UploaderOptions to include impersonatingID.
(cherry picked from commit 2c79be1456c753665e27b58563e56accc87b0383)
(cherry picked from commit 4b0ab8161f)
2025-05-07 21:42:14 +00:00
Tim Donohue
f9f3d186c5 Merge pull request #4305 from 4Science/task/dspace-7_x/DURACOM-326
[Port dspace-7_x] [DURACOM-326] fix possible issue on missing value for eperson patch #4289
2025-05-07 09:19:27 -05:00
FrancescoMolinaro
05e1fc3505 [DURACOM-326] fix possible issue on missing value for eperson patch 2025-05-07 14:36:26 +02:00
Tim Donohue
3635bf40fe Merge pull request #4296 from DSpace/dependabot/npm_and_yarn/dspace-7_x/core-js-3.42.0
Bump core-js from 3.41.0 to 3.42.0
2025-05-06 17:07:06 -05:00
Art Lowel
70d1e499c1 don't show the loading animation when src is set to null 2025-05-06 14:58:53 +02:00
Art Lowel
e40a44c5ac fix issue where thumbnail would sometimes keep loading indefinitely 2025-05-06 14:38:45 +02:00
Alexandre Vryghem
3d32715d25 127655: Fixed getFirstDataDefinition not always returning a correct SubmitDataResponseDefinitionObject, leading to an infinite loading screen
- Also fixed an issue where the collection switcher could accidentally show the old collection name instead of the new one
- Also updated the WorkspaceItemPageResolver & WorkflowItemPageResolver to embed the collection to use fewer requests
2025-05-06 14:15:34 +02:00
Alan Orth
498fad9e76 Merge pull request #4295 from DSpace/dependabot/npm_and_yarn/dspace-7_x/babel/runtime-7.27.1
Bump @babel/runtime from 7.27.0 to 7.27.1
2025-05-06 07:50:55 +03:00
Alexandre Vryghem
e9061a46b6 117287: Fixed broken pagination on resource policy page 2025-05-06 00:49:01 +02:00
dependabot[bot]
a1d391576e Bump core-js from 3.41.0 to 3.42.0
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.41.0 to 3.42.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.42.0/packages/core-js)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-05 02:46:13 +00:00
dependabot[bot]
d985bfa091 Bump @babel/runtime from 7.27.0 to 7.27.1
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.27.0 to 7.27.1.
- [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.27.1/packages/babel-runtime)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-05 02:45:34 +00:00
Tim Donohue
4eb827c089 Merge pull request #4286 from tdonohue/port_4282_to_7x
[Port dspace-7_x] Fixed Missing Tags in Import Popup from External Sources - 4220
2025-05-01 12:59:42 -05:00
guillermo2519
43db1731ec Fixed Missing Tags in Import Popup from External Sources - 4220 2025-05-01 12:21:29 -05:00
Tim Donohue
e2b72201b2 Merge pull request #4258 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-f1c32079c7
Bump sass from 1.86.3 to 1.87.0 in the sass group
2025-05-01 10:04:10 -05:00
Tim Donohue
34248186e8 Merge pull request #4260 from DSpace/dependabot/npm_and_yarn/dspace-7_x/axios-1.9.0
Bump axios from 1.8.4 to 1.9.0
2025-04-30 17:18:15 -05:00
Tim Donohue
9dca838f25 Merge pull request #4281 from atmire/w2p-130484_bitstreams-tables-keep-being-duplicated-7_x
[Port dspace-7_x] Fix bitstream tables being duplicated
2025-04-30 11:26:43 -05:00
Andreas Awouters
ae23e68d12 130484: Filter new bundles 2025-04-30 15:51:57 +02:00
Alexandre Vryghem
dc8b10593c 117287: Removed remaining observable function calls from the HTML templates 2025-04-30 15:37:06 +02:00
Andreas Awouters
501ccfea1b 130484: Correctly update the 'showLoadMoreLink$' observable 2025-04-30 14:15:52 +02:00
Andreas Awouters
02be3e0ad5 130484: Only add bundles when they are missing from the subject 2025-04-30 14:15:03 +02:00
Alexandre Vryghem
d34dafd838 119276: Added tests to prove that cached stale requests are not emitted
Also cleaned up test class

(cherry picked from commit 58ff240c05)
2025-04-29 18:58:02 +00:00
Alexandre Vryghem
85610d4eb6 119276: Fixed search service first emitting cached stale values instead of waiting for non-stale response
This was problematic for the places that used getFist operators. This is because they only emit data once, and the first value could be the old cached value

(cherry picked from commit edfaee6aab)
2025-04-29 18:58:01 +00:00
Kristof De Langhe
c1bd65e8c6 127655: avoid nullpointer 2025-04-29 10:46:45 +02:00
Kristof De Langhe
0dabc8ed8f 127655: refactor to use buildFromRequestUUID 2025-04-28 17:47:17 +02:00
Tim Donohue
da12147043 Merge pull request #4259 from DSpace/dependabot/npm_and_yarn/dspace-7_x/isbot-5.1.27
Bump isbot from 5.1.26 to 5.1.27
2025-04-28 10:16:16 -05:00
Kristof De Langhe
99e8c1044c 127655: Submission get data stale re-request 2025-04-28 15:15:26 +02:00
Kristof De Langhe
287d35cb26 127655: Fix submission infinite loading 2025-04-28 13:04:44 +02:00
dependabot[bot]
15a8008869 Bump axios from 1.8.4 to 1.9.0
Bumps [axios](https://github.com/axios/axios) from 1.8.4 to 1.9.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.8.4...v1.9.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-28 02:45:21 +00:00
dependabot[bot]
e35adee7f8 Bump isbot from 5.1.26 to 5.1.27
Bumps [isbot](https://github.com/omrilotan/isbot) from 5.1.26 to 5.1.27.
- [Changelog](https://github.com/omrilotan/isbot/blob/main/CHANGELOG.md)
- [Commits](https://github.com/omrilotan/isbot/compare/v5.1.26...v5.1.27)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-28 02:45:12 +00:00
dependabot[bot]
ee3154c069 Bump sass from 1.86.3 to 1.87.0 in the sass group
Bumps the sass group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.86.3 to 1.87.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.86.3...1.87.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-28 02:44:10 +00:00
Tim Donohue
b491ed3c27 Merge pull request #4253 from tdonohue/port_4212_to_7x
[Port dspace-7_x] Fix: prevent bitstream format cache issue by disabling cached version
2025-04-25 17:15:38 -05:00
Jesiel Viana
b184db7a99 fix unit tests for bitstream-data.service.ts 2025-04-25 16:47:58 -05:00
Jesiel Viana
eac787f1f4 fix: invalidate cache only for the modified bitstream 2025-04-25 16:45:58 -05:00
Jesiel Viana
8dbdb27c67 fix: prevent bitstream format cache issue by disabling cached version 2025-04-25 16:45:43 -05:00
Tim Donohue
02f30ab331 Merge pull request #4247 from DSpace/backport-4243-to-dspace-7_x
[Port dspace-7_x] Add translation keys for journal submission volume lookup
2025-04-25 12:23:38 -05:00
Joran De Braekeleer
523c13ff3d 130405: Add translations for journal submission volume lookup
(cherry picked from commit fef16bca14)
2025-04-25 15:31:43 +00:00
Art Lowel
1ddd248d0e Merge remote-tracking branch 'upstream/dspace-7_x' into fix-embargoed-thumbnails_contribute-7.6 2025-04-25 15:39:20 +02:00
Art Lowel
11f251755b fix issue where thumnails of embargoed bitstreams wouldn't show up for users with access rights 2025-04-25 14:55:52 +02:00
Tim Donohue
7b25b1d63c Merge pull request #4233 from atmire/4099-duplicate-view-events_contibute-7.x
[Port to dspace-7_x] Fix for double view events when using dynamic themes
2025-04-23 17:01:35 -05:00
Tim Donohue
d43730a542 Merge pull request #4237 from DSpace/backport-4167-to-dspace-7_x
[Port dspace-7_x] Fix unable to remove data from a submission form field of type "name"
2025-04-23 13:44:34 -05:00
Tim Donohue
1c1b129068 Merge pull request #4238 from DSpace/backport-3968-to-dspace-7_x
[Port dspace-7_x] Fix - previously entered qualdrop value field is deleted when adding a new (emtpy) line with the same(!) qualifier and then deleting it
2025-04-23 12:53:22 -05:00
VictorDuranEscire
ae563442e7 Fix - Validate value on remove item for submission form only for qualdrop component
(cherry picked from commit 1e73fa626d)
2025-04-23 16:38:38 +00:00
abhinav
08d56407ff 129621: Add a not empty check
This check is present in the other event handlers above so adding it here as well.

(cherry picked from commit 0b28789e4f)
2025-04-23 16:07:11 +00:00
lotte
8bc2c8768f Merge branch 'dspace-7_x' into 4099-duplicate-view-events_contibute-7.x 2025-04-22 12:30:15 +02:00
lotte
9a0e4ec107 Merge branch '4099-duplicate-view-events_contibute-7.6.3' into 4099-duplicate-view-events_contibute-7.x 2025-04-22 10:43:32 +02:00
Tim Donohue
3a04ea8f79 Merge pull request #4222 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sanitize-html-2.16.0
Bump sanitize-html from 2.15.0 to 2.16.0
2025-04-21 08:58:16 -05:00
dependabot[bot]
c272e51aeb Bump sanitize-html from 2.15.0 to 2.16.0
Bumps [sanitize-html](https://github.com/apostrophecms/sanitize-html) from 2.15.0 to 2.16.0.
- [Changelog](https://github.com/apostrophecms/sanitize-html/blob/main/CHANGELOG.md)
- [Commits](https://github.com/apostrophecms/sanitize-html/compare/2.15.0...2.16.0)

---
updated-dependencies:
- dependency-name: sanitize-html
  dependency-version: 2.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-21 02:50:44 +00:00
kshepherd
c6a1401f34 Merge pull request #4210 from alanorth/eslint-json5-dspace7
[Port dspace-7_x] Update ESLint configuration for json5 files
2025-04-17 00:44:27 +02:00
Alan Orth
19c680ebf0 .eslintrc.json: use jsonc/no-irregular-whitespace
The eslint-plugin-jsonc documentation recommends turning ESLint's
own no-irregular-whitespace plugin off for JSON files in favor of
its own jsonc/no-irregular-whitespace plugin.

See: https://ota-meshi.github.io/eslint-plugin-jsonc/rules/no-irregular-whitespace.html
2025-04-16 23:24:06 +03:00
Alan Orth
9a025f6610 .eslintrc.json: use plugin:jsonc/recommended-with-json5
The eslint-plugin-jsonc has a recommended configuration for json5.

See: https://ota-meshi.github.io/eslint-plugin-jsonc/user-guide/#usage
2025-04-16 23:21:52 +03:00
Tim Donohue
ac940c1bb2 Merge pull request #4026 from DSpace/dependabot/npm_and_yarn/dspace-7_x/postcss-c120d6abdd
Bump postcss from 8.5.1 to 8.5.3 in the postcss group across 1 directory
2025-04-16 11:47:22 -05:00
Tim Donohue
1c4f650ef9 Merge pull request #4186 from DSpace/dependabot/npm_and_yarn/dspace-7_x/http-proxy-middleware-2.0.9
Bump http-proxy-middleware from 2.0.7 to 2.0.9
2025-04-15 14:13:24 -05:00
Tim Donohue
6ef781822d Merge pull request #4150 from DSpace/dependabot/npm_and_yarn/dspace-7_x/multi-02a33f2273
Bump sanitize-html and @types/sanitize-html
2025-04-15 14:10:12 -05:00
Tim Donohue
0115edaa07 Merge pull request #4120 from DSpace/dependabot/npm_and_yarn/dspace-7_x/babel/runtime-7.27.0
Bump @babel/runtime from 7.26.7 to 7.27.0
2025-04-15 14:04:37 -05:00
Tim Donohue
faebbbe680 Merge pull request #4197 from tdonohue/port_4189_to_7x
[Port dspace-7_x] Add additional automated server-side rendering (SSR) tests for all Entity Types
2025-04-15 13:14:39 -05:00
dependabot[bot]
0ff0b5298a Bump http-proxy-middleware from 2.0.7 to 2.0.9
Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 2.0.7 to 2.0.9.
- [Release notes](https://github.com/chimurai/http-proxy-middleware/releases)
- [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md)
- [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v2.0.7...v2.0.9)

---
updated-dependencies:
- dependency-name: http-proxy-middleware
  dependency-version: 2.0.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-15 15:09:53 +00:00
dependabot[bot]
87bb0d4e5a Bump sanitize-html and @types/sanitize-html
Bumps [sanitize-html](https://github.com/apostrophecms/sanitize-html) and [@types/sanitize-html](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/sanitize-html). These dependencies needed to be updated together.

Updates `sanitize-html` from 2.14.0 to 2.15.0
- [Changelog](https://github.com/apostrophecms/sanitize-html/blob/main/CHANGELOG.md)
- [Commits](https://github.com/apostrophecms/sanitize-html/compare/2.14.0...2.15.0)

Updates `@types/sanitize-html` from 2.13.0 to 2.15.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/sanitize-html)

---
updated-dependencies:
- dependency-name: sanitize-html
  dependency-version: 2.15.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: "@types/sanitize-html"
  dependency-version: 2.15.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-15 15:04:44 +00:00
Tim Donohue
eee9897312 Merge pull request #4153 from DSpace/dependabot/npm_and_yarn/dspace-7_x/isbot-5.1.26
Bump isbot from 5.1.25 to 5.1.26
2025-04-15 09:51:13 -05:00
Tim Donohue
fdc23a3350 Merge pull request #4028 from DSpace/dependabot/npm_and_yarn/dspace-7_x/rxjs-7.8.2
Bump rxjs from 7.8.1 to 7.8.2
2025-04-15 09:49:12 -05:00
Tim Donohue
c4104be75b Add additional automated SSR tests for Community, Collection, Publication/Item, Person, OrgUnit and all Journal entities 2025-04-15 09:36:33 -05:00
dependabot[bot]
08a707477c Bump rxjs from 7.8.1 to 7.8.2
Bumps [rxjs](https://github.com/reactivex/rxjs) from 7.8.1 to 7.8.2.
- [Release notes](https://github.com/reactivex/rxjs/releases)
- [Changelog](https://github.com/ReactiveX/rxjs/blob/7.8.2/CHANGELOG.md)
- [Commits](https://github.com/reactivex/rxjs/compare/7.8.1...7.8.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-15 10:05:42 +00:00
Tim Donohue
d4efd6a8ef Merge pull request #4176 from DSpace/backport-4143-to-dspace-7_x
[Port dspace-7_x] Fix pagination on the "Select bitstreams" modal of the "Access Control" tab
2025-04-14 11:33:04 -05:00
dependabot[bot]
04516fad5a Bump postcss from 8.5.1 to 8.5.3 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.5.1 to 8.5.3
- [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.5.1...8.5.3)

---
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-04-14 03:16:07 +00:00
Alan Orth
377c7034ff [Port dspace-7_x] Clean up spacing in input forms
Manual port of #4136 by @gingyx to DSpace 7.x.
2025-04-12 16:28:11 +03:00
Tim Donohue
28eb709ef5 Merge pull request #4169 from atmire/w29-129641_fix-export-button_contribute-7_x
[Port dspace-7_x] Fix export button enabled in bulk access management without selecting step 2
2025-04-11 14:45:08 -05:00
Nona Luypaert
cc202b7adb 130081: Fix pagination on 'Select bistreams' modal on 'Access Control' tab
(cherry picked from commit c03bbb01a2)
2025-04-11 18:55:22 +00:00
Tim Donohue
f5df726a18 Merge pull request #4121 from arvoConsultores/DS-4097
Store the state of the computed filters
2025-04-11 11:28:51 -05:00
Tim Donohue
077467efa2 Merge pull request #4111 from DSpace/dependabot/npm_and_yarn/dspace-7_x/axios-1.8.4
Bump axios from 1.7.9 to 1.8.4
2025-04-11 06:53:08 -05:00
Sergio Fernández Celorio
dc3e842747 No need to subscribe anymore to the router events 2025-04-11 11:39:41 +02:00
dependabot[bot]
828648aa7e Bump axios from 1.7.9 to 1.8.4
Bumps [axios](https://github.com/axios/axios) from 1.7.9 to 1.8.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.7.9...v1.8.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-10 21:56:43 +00:00
Tim Donohue
7063c49072 Merge pull request #4065 from DSpace/dependabot/npm_and_yarn/dspace-7_x/testing-64070fe020
Bump the testing group with 2 updates
2025-04-10 16:53:53 -05:00
dependabot[bot]
036fd1c871 Bump the testing group with 2 updates
Bumps the testing group with 2 updates: [axe-core](https://github.com/dequelabs/axe-core) and [ng-mocks](https://github.com/help-me-mom/ng-mocks).


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

Updates `ng-mocks` from 14.13.2 to 14.13.3
- [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.2...v14.13.3)

---
updated-dependencies:
- dependency-name: axe-core
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: testing
- 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-04-10 19:27:52 +00:00
Tim Donohue
22db6745b8 Merge pull request #4148 from DSpace/dependabot/npm_and_yarn/dspace-7_x/eslint-7904436953
Bump eslint-plugin-jsonc from 2.19.1 to 2.20.0 in the eslint group
2025-04-10 10:55:12 -05:00
Sergio Fernández Celorio
4f42c1e95f Use take instead unsubscribe 2025-04-10 17:34:36 +02:00
dependabot[bot]
b37a7a1456 Bump isbot from 5.1.25 to 5.1.26
Bumps [isbot](https://github.com/omrilotan/isbot) from 5.1.25 to 5.1.26.
- [Changelog](https://github.com/omrilotan/isbot/blob/main/CHANGELOG.md)
- [Commits](https://github.com/omrilotan/isbot/compare/v5.1.25...v5.1.26)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-09 22:27:19 +00:00
dependabot[bot]
33146603df Bump eslint-plugin-jsonc from 2.19.1 to 2.20.0 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.19.1 to 2.20.0
- [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.19.1...v2.20.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-09 22:26:28 +00:00
Tim Donohue
d3a97d9d15 Merge pull request #4007 from DSpace/dependabot/npm_and_yarn/dspace-7_x/compression-1.8.0
Bump compression from 1.7.5 to 1.8.0
2025-04-09 17:16:35 -05:00
Tim Donohue
2a1c762e73 Merge pull request #4049 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/lodash-4.17.16
Bump @types/lodash from 4.17.15 to 4.17.16
2025-04-09 16:49:42 -05:00
Tim Donohue
c94279edc0 Merge pull request #4051 from DSpace/dependabot/npm_and_yarn/dspace-7_x/core-js-3.41.0
Bump core-js from 3.40.0 to 3.41.0
2025-04-09 16:31:36 -05:00
Tim Donohue
878b2dba4a Merge pull request #4050 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-b0ce3413d9
Bump sass from 1.84.0 to 1.85.1 in the sass group across 1 directory
2025-04-09 16:16:14 -05:00
Tim Donohue
2eca99379f Merge pull request #4112 from DSpace/dependabot/npm_and_yarn/dspace-7_x/isbot-5.1.25
Bump isbot from 5.1.22 to 5.1.25
2025-04-09 12:30:57 -05:00
lotte
8a4405c473 Merge branch 'backport-4099-duplicate-view-events-7.6' into 4099-duplicate-view-events_contibute-7.6.3 2025-04-07 10:43:09 +02:00
dependabot[bot]
0d2e49b12c Bump sass from 1.84.0 to 1.85.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.84.0 to 1.85.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.84.0...1.85.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-04-07 03:06:35 +00:00
lotte
edd5496a4d 129694: Fixed lint issues 2025-04-04 15:11:02 +02:00
lotte
01becae7d0 129694: backported view tracker resolver 2025-04-04 13:31:49 +02:00
Tim Donohue
eef6bbe134 Merge pull request #3983 from atmire/no-platform-specific-code-in-abstract-services-7_x
No platform specific code in abstract services 7_x
2025-04-03 12:11:45 -05:00
lotte
ff5f23017a 129694: PoC #4099 solution with resolvers 2025-04-02 14:49:23 +02:00
Sergio Fernández Celorio
7dd6ab79ff Store the state of the computed filters 2025-03-31 09:14:32 +02:00
dependabot[bot]
ecc03343b7 Bump @babel/runtime from 7.26.7 to 7.27.0
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.26.7 to 7.27.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.27.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>
2025-03-31 02:43:43 +00:00
abhinav
fa6b8cc21d 129641: Fix Export button is enabled wrongly
This fixes the export button being enabled when the second step is not active in bulk access edit. The tests have been updated accordingly
2025-03-26 15:47:17 +01:00
dependabot[bot]
6c11621d91 Bump isbot from 5.1.22 to 5.1.25
Bumps [isbot](https://github.com/omrilotan/isbot) from 5.1.22 to 5.1.25.
- [Changelog](https://github.com/omrilotan/isbot/blob/main/CHANGELOG.md)
- [Commits](https://github.com/omrilotan/isbot/compare/v5.1.22...v5.1.25)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-24 02:47:30 +00:00
Alan Orth
d65ff20777 Merge pull request #4077 from arvoConsultores/DS-4053
Filters disappeared on reload
2025-03-14 16:23:57 +03:00
ana
c2528a9c1f Filters disappeared on reload 2025-03-13 09:51:17 +01:00
Andreas Awouters
3ad99804d1 Merge branch 'accessibility-settings-7.6' into accessibility-settings-7_x 2025-03-07 13:40:49 +01:00
Andreas Awouters
122d31b11b 119602: Make KlaroService optional in AccSettingsService 2025-03-07 12:58:31 +01:00
Andreas Awouters
7ab598d571 119602: Reorder footer links 2025-03-07 10:03:57 +01:00
Andreas Awouters
bd06eded8c 119602: Fix small accessibility settings typo 2025-03-07 10:02:57 +01:00
kshepherd
99840ba3bc Merge pull request #4034 from alanorth/7_x-citation-doi
Add citation_doi tag to head meta
2025-03-06 13:43:08 +01:00
Alan Orth
204556de20 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 16:40:14 +03:00
Alan Orth
8d7b4cd101 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 16:40:12 +03:00
dependabot[bot]
ac5c5c8a14 Bump core-js from 3.40.0 to 3.41.0
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.40.0 to 3.41.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.41.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-03-03 03:10:19 +00:00
dependabot[bot]
008fe0151b Bump @types/lodash from 4.17.15 to 4.17.16
Bumps [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) from 4.17.15 to 4.17.16.
- [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-03-03 03:10:07 +00:00
Andreas Awouters
f8bcce43b5 119602: Fix tests after merge 2025-02-21 13:19:01 +01:00
Andreas Awouters
e75052bbcf Merge branch 'dspace-7_x' into accessibility-settings-7_x
# Conflicts:
#	config/config.example.yml
#	src/config/app-config.interface.ts
#	src/config/default-app-config.ts
#	src/environments/environment.test.ts
2025-02-21 13:01:18 +01:00
Andreas Awouters
3340192382 Merge branch 'accessibility-settings-7.6' into accessibility-settings-7_x 2025-02-21 12:58:42 +01:00
Andreas Awouters
dcd32c48c3 119602: Rework settings validation 2025-02-21 12:53:44 +01:00
Andreas Awouters
cd825ac0da 119602: Inject AppConfig instead of using environment directly 2025-02-21 10:51:30 +01:00
Andreas Awouters
ca80812d0a 119602: Add additional accessibility-settings.component test 2025-02-21 10:27:44 +01:00
Andreas Awouters
4a74a3ac99 119602: Fix existing accessibility-settings.component tests 2025-02-21 10:10:35 +01:00
Andreas Awouters
62904747fc 119602: Add accessibility-settings.service tests for cookie functionality 2025-02-21 10:03:43 +01:00
Andreas Awouters
4c30e2d0be 119602: Fix existing accessibility-settings.service tests 2025-02-21 09:56:00 +01:00
Andreas Awouters
d05096c015 119602: Add KlaroServiceStub 2025-02-21 09:16:41 +01:00
Andreas Awouters
b837f63b7c 119602: Add 'Accessibility Settings' Klaro option & respect user choice 2025-02-18 10:22:59 +01:00
Andreas Awouters
e838873235 119602: Set default value as actual value instead of placeholder 2025-02-17 13:37:07 +01:00
dependabot[bot]
e9fa2812a0 Bump compression from 1.7.5 to 1.8.0
Bumps [compression](https://github.com/expressjs/compression) from 1.7.5 to 1.8.0.
- [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.5...1.8.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-17 02:52:11 +00:00
Tim Donohue
885c52ed34 Merge pull request #3996 from DSpace/backport-3673-to-dspace-7_x
[Port dspace-7_x] Update fr.json5
2025-02-14 14:49:32 -06:00
Carolyn Sullivan
9b0669f76c Update fr.json5
Ajouté les corrections faites par Pierre Lasou :)

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

(cherry picked from commit 477ca5e712)
2025-02-14 16:29:44 +00:00
Tim Donohue
d9c6856d9c Merge pull request #3990 from DSpace/backport-3960-to-dspace-7_x
[Port dspace-7_x] Update fr.json5 to add identifiers deposit's step translations in french
2025-02-14 10:26:03 -06:00
Pierre Lasou
3372110839 Update fr.json5
(cherry picked from commit f721028d81)
2025-02-14 14:43:40 +00:00
Andreas Awouters
ddd7c323ab Merge branch 'no-platform-specific-code-in-abstract-services-7.6' into no-platform-specific-code-in-abstract-services-7_x 2025-02-13 13:31:21 +01:00
Andreas Awouters
961bb11b59 125969: Fix auth service tests 2025-02-13 13:15:24 +01:00
Andreas Awouters
f82426b1dc 125969: Get rid of REQUEST and RESPONSE imports in AuthService 2025-02-13 13:15:24 +01:00
Andreas Awouters
8b90d999ac 125969: Move constructor to server-cookie.service
This makes it possible to remove the REQUEST import from
cookie.service.ts which solves a typescript issue.
2025-02-13 13:15:24 +01:00
Andreas Awouters
80948d98f0 119602: Force minimum time out 2025-02-11 09:33:03 +01:00
Tim Donohue
6446a52e46 Merge pull request #3969 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-fd5fd03206
Bump sass from 1.83.4 to 1.84.0 in the sass group
2025-02-10 15:37:11 -06:00
Tim Donohue
e58a66f849 Merge pull request #3904 from DSpace/dependabot/npm_and_yarn/dspace-7_x/babel/runtime-7.26.7
Bump @babel/runtime from 7.26.0 to 7.26.7
2025-02-10 15:24:24 -06:00
Tim Donohue
1167f8a414 Merge pull request #3903 from DSpace/dependabot/npm_and_yarn/dspace-7_x/eslint-82f73a5bca
Bump eslint-plugin-jsonc from 2.18.2 to 2.19.1 in the eslint group
2025-02-10 12:08:30 -06:00
Tim Donohue
eee851f001 Merge pull request #3941 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/lodash-4.17.15
Bump @types/lodash from 4.17.14 to 4.17.15
2025-02-10 09:38:57 -06:00
Tim Donohue
b18ff86894 Merge pull request #3942 from DSpace/dependabot/npm_and_yarn/dspace-7_x/isbot-5.1.22
Bump isbot from 5.1.21 to 5.1.22
2025-02-10 09:36:29 -06:00
Tim Donohue
e811083339 Merge pull request #3940 from DSpace/dependabot/npm_and_yarn/dspace-7_x/testing-206d00ed14
Bump cypress-axe from 1.5.0 to 1.6.0 in the testing group
2025-02-10 09:33:34 -06:00
dependabot[bot]
e0590109c1 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:18:27 +00:00
dependabot[bot]
ed1aa37100 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:18:04 +00:00
dependabot[bot]
601850cb6a 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:18:00 +00:00
Tim Donohue
ebe26a7eb0 Update version tag for development of next release 2025-02-07 11:21:57 -06:00
Tim Donohue
6eb5eec050 Update version tag for release 2025-02-07 11:17:42 -06:00
Tim Donohue
1956e25a83 Merge pull request #3962 from 4Science/task/dspace-7_x/DURACOM-288
[Port dspace-7_x] Provide a setting to use a different REST url during SSR execution
2025-02-07 09:33:23 -06:00
Andreas Awouters
59cb19ae80 119602: Restructure labels 2025-02-07 14:54:24 +01:00
Giuseppe Digilio
2e28a51b02 [DURACOM-288] fix tests 2025-02-07 09:00:10 +01:00
Tim Donohue
7fab9633ea Merge pull request #3965 from tdonohue/port_2827_to_7x
[Port dspace-7_x] use translation service to determine placeholder values of date picker
2025-02-06 16:33:33 -06:00
Sascha Szott
7584b9e1c3 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:18:41 -06:00
Vincenzo Mecca
7660dd8d95 [DURACOM-288] Fixes undefined request in thumbnail 2025-02-06 17:27:54 +01:00
Giuseppe Digilio
6f4c3860a3 [DURACOM-288] Add convention SSR REST environment variable 2025-02-06 17:27:39 +01:00
Giuseppe Digilio
d73885137a [DURACOM-288] Change properties description 2025-02-06 17:27:27 +01:00
Giuseppe Digilio
290c24b448 [DURACOM-288] Enable URL replacement by default 2025-02-06 17:26:41 +01:00
Giuseppe Digilio
21dac408ee [DURACOM-288] Add unit test to test SSR url replace 2025-02-06 17:26:30 +01:00
Giuseppe Digilio
d118496075 [DURACOM-288] Add missing settings to config.example.yml 2025-02-06 17:26:16 +01:00
Giuseppe Digilio
cb5deb644e [DURACOM-288] Refactoring configuration to transfer state 2025-02-06 17:25:26 +01:00
Yury Bondarenko
f9d8e4e0b7 Add configuration to toggle replace/transfer 2025-02-06 17:19:44 +01:00
Giuseppe Digilio
a3ffda3bf8 [DURACOM-288] Additional test for thumbnail component 2025-02-06 17:18:28 +01:00
Giuseppe Digilio
8ca668159e [DURACOM-288] Provide a setting to use a different REST url during SSR execution
# Conflicts:
#	src/app/app.config.ts
#	src/app/core/services/server-hard-redirect.service.spec.ts
#	src/app/core/services/server-hard-redirect.service.ts
#	src/app/thumbnail/thumbnail.component.ts
#	src/modules/app/browser-init.service.ts
#	src/modules/app/server-init.service.ts
2025-02-06 17:15:42 +01:00
kshepherd
95064122d0 Merge pull request #3946 from DSpace/backport-3935-to-dspace-7_x
[Port dspace-7_x] Ensure `/reload/` (hard reload) path is included in SSR paths.
2025-02-03 12:44:36 +01:00
Tim Donohue
d92424e2f4 Ensure "/reload/" (hard reload) path is included in SSR paths.
(cherry picked from commit 83d24f8c21)
2025-02-03 11:11:04 +00:00
dependabot[bot]
45cc177cab 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 03:04:40 +00:00
dependabot[bot]
59b39f12d6 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 03:03:49 +00:00
Tim Donohue
636fba40f7 Merge pull request #3932 from 4Science/task/dspace-7_x/CST-15595
[Port dspace-7_x] Make submission reorder buttons keyboard accessible
2025-01-31 10:38:45 -06:00
Andrea Barbasso
f8123fbbfd Merge branch 'dspace-7_x' into task/dspace-7_x/CST-15595
# Conflicts:
#	src/assets/i18n/en.json5
2025-01-31 15:09:03 +01:00
Andrea Barbasso
8313b9a929 [CST-15595] add keyboard drag and drop functionality 2025-01-31 15:05:36 +01:00
Tim Donohue
51aa5fb61c Merge pull request #3926 from Andrea-Guevara/AccessibilityInSearchFilterDspace7
[Port dspace-7_x] Accessibility when selecting a search filter
2025-01-31 06:54:15 -06:00
Tim Donohue
a5378e0cf5 Add missing UUIDService to test to fix "No provider for UUIDService" errors 2025-01-30 16:55:28 -06:00
Tim Donohue
0abbf80c1d Merge pull request #3929 from DSpace/backport-3912-to-dspace-7_x
[Port dspace-7_x] Fix auth in UI with LDAP if password authentication is disabled
2025-01-30 16:39:41 -06:00
Miika Nurminen
d4536ffbf4 Ensure that password authentication dialog is shown even if only ldap auth method is present
(cherry picked from commit 83d86d7b68)
2025-01-30 22:12:12 +00:00
Tim Donohue
6b73c75205 Merge pull request #3925 from 4Science/task/dspace-7_X/DURACOM-304
[Port dspace-7_x] Prevent request with page size of 9999
2025-01-30 12:25:52 -06:00
Tim Donohue
f01e49f05f Merge pull request #3924 from alexandrevryghem/made-expandable-navbar-section-more-accessible-7_x
[Port dspace-7_x] Made expandable navbar section more keyboard accessible
2025-01-30 11:58:31 -06:00
root
073b2b0acd Accessibility when selecting a search filter v7 2025-01-30 09:27:55 -03:00
FrancescoMolinaro
d155d778ee [DURACOM-304] fix tests and lint 2025-01-30 12:32:58 +01:00
FrancescoMolinaro
50e440bcf5 [DURACOM-304] remove br 2025-01-30 12:15:54 +01:00
FrancescoMolinaro
af39526d77 [DURACOM-304] refactor, fix dynamic-list.component loading 2025-01-30 12:15:41 +01:00
FrancescoMolinaro
f77ce869f8 [DURACOM-304] remove control flow 2025-01-30 12:14:07 +01:00
FrancescoMolinaro
bc06839926 [DURACOM-304] improve loading logic for cc-licenses section and dynamic-list 2025-01-30 12:13:52 +01:00
FrancescoMolinaro
a3ebfc0f36 [DURACOM-304] fix missing import 2025-01-30 12:02:29 +01:00
FrancescoMolinaro
362364136d [DURACOM-304] add support for findAll method in dynamic-scrollable-dropdown.component.ts 2025-01-30 12:02:12 +01:00
FrancescoMolinaro
b892b13529 [DURACOM-304] adapt call to bitstream service 2025-01-30 11:53:31 +01:00
Alisa Ismailati
b220e20053 [DURACOM-304] other fix related to accessibility 2025-01-30 11:52:47 +01:00
Alisa Ismailati
eaff0b1397 [DURACOM-304] Refactor of bundle-data.service.ts by removing page size of 9999 2025-01-30 11:52:31 +01:00
Alisa Ismailati
0108f525ba [DURACOM-304] fix accessibility issue on scripts-select 2025-01-30 11:47:42 +01:00
Alisa Ismailati
3f5de295a7 [DURACOM-304] test fix 2025-01-30 11:47:27 +01:00
Alisa Ismailati
62924cc5e0 [DURACOM-304] Refactored submission-section-cc-licenses.component.ts by removing page size of 9999 2025-01-30 11:47:00 +01:00
Alisa Ismailati
8453b667cb [DURACOM-304] removed unneeded selectAll method (dynamic-lookup-relation-search-tab.component) 2025-01-30 11:41:12 +01:00
Alisa Ismailati
3922130434 [DURACOM-304] Refactored relationship-type-data.service.ts by removing page size of 9999 2025-01-30 11:39:15 +01:00
Alisa Ismailati
c3b265d213 [DURACOM-304] Refactored dynamic-list.component.ts by removing page size of 9999 2025-01-30 11:38:14 +01:00
Alisa Ismailati
2b58377830 [DURACOM-304] Refactored scripts-select.component by using infinite scroll instead of page size 9999 2025-01-30 11:37:03 +01:00
Alisa Ismailati
4536d9c74d [DURACOM-304] Refactored edit-bitstream-page.component by removing page size of 9999 2025-01-30 11:34:39 +01:00
Alisa Ismailati
a3b7125ef9 [DURACOM-304] Refactored item-bitstreams.component by removing page size of 9999 2025-01-30 11:30:45 +01:00
Alexandre Vryghem
6f9c55d250 116404: Prevent the opening from the modal using mouse interactions from automatically focussing on the first element
(cherry picked from commit 82ed3aadff)
2025-01-30 00:52:16 +01:00
Alexandre Vryghem
9c6fb1794f 116404: Replaced ViewChild logic with a CSS selector
This change avoids triggering an additional change detection cycle

(cherry picked from commit f7bb83013a)
2025-01-30 00:52:16 +01:00
Alexandre Vryghem
0f27ae1125 116404: Close modal on escape
(cherry picked from commit 84df67c00b)
2025-01-30 00:52:16 +01:00
Alexandre Vryghem
73285284ce 116404: Apply focus on first item
(cherry picked from commit 2152bab717)
2025-01-30 00:52:16 +01:00
Alexandre Vryghem
53186988f5 116404: Added navigation with arrow keys in navbar & collapsed the expandable menu when hovering outside of it
(cherry picked from commit 05232cdf2b)
2025-01-30 00:52:16 +01:00
Alexandre Vryghem
8f9236f06d 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

(cherry picked from commit c08c2721ac)
2025-01-30 00:03:55 +01:00
Alexandre Vryghem
470ad80741 116404: Fixed expandable navbar section loosing focus on expand through keyboard
(cherry picked from commit 2547b1218f)
2025-01-30 00:03:10 +01:00
Tim Donohue
c3f17b9754 Merge pull request #3921 from tdonohue/config_syntax_7x
[Port dspace-7_x] Fix YAML syntax and revert section name to "universal"
2025-01-29 16:39:06 -06:00
Tim Donohue
e296295df5 Fix YAML syntax and revert section name to "universal" as that's the name in 7.x 2025-01-29 15:57:55 -06:00
Tim Donohue
795f300158 Merge pull request #3913 from alexandrevryghem/w2p-122357_browse-performance-fixes_contribute-7_x
[Port dspace-7_x] Browse performance fixes
2025-01-29 10:02:28 -06:00
Tim Donohue
38d5f87d3e Merge pull request #3916 from tdonohue/port_3818_to_7x
[Port dspace-7_x] Changing metadata in a user profile without specifying a password brings up a success and an error panel
2025-01-29 06:48:54 -06:00
VictorDuranEscire
5a5c1f18e3 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:26:43 -06:00
Alexandre Vryghem
bb3d2bb483 122357: Reduced the amount of times the browse observables are fired again
(cherry picked from commit 0570542b1e)
2025-01-28 23:48:07 +01:00
Alexandre Vryghem
8c92364d43 122357: Ensure the request href$ observable aren't triggered multiple times
(cherry picked from commit 3ecdfe422d)
2025-01-28 23:38:23 +01:00
Tim Donohue
1cc4756ee2 Merge pull request #3270 from atmire/w2p-117544_support-for-disabled-elements-for-screen-readers-7.x
[Port dspace-7_x] support for disabled buttons for screen readers
2025-01-28 16:36:24 -06:00
Tim Donohue
08bda53a2e Merge pull request #3907 from 4Science/task/dspace-7_x/DURACOM-303
[Port dspace-7_x] Exclude search and browse from Angular SSR
2025-01-27 10:25:50 -06:00
Jens Vannerum
cd2f8abd2d 117544: fix issues latest 7.x merge 2025-01-27 10:23:49 +01:00
FrancescoMolinaro
8a4f24fc31 [DURACOM-303] adapt tests dependencies and template variable 2025-01-27 09:34:42 +01:00
dependabot[bot]
868b021118 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:35:56 +00:00
Tim Donohue
c7d8949c82 Merge pull request #3861 from DSpace/dependabot/npm_and_yarn/dspace-7_x/mirador-3.4.3
Bump mirador from 3.4.2 to 3.4.3
2025-01-24 16:19:29 -06:00
Tim Donohue
7f1ae419af Merge pull request #3899 from DSpace/backport-3212-to-dspace-7_x
[Port dspace-7_x] Fix truncatable-part keyboard accessibility
2025-01-24 13:48:27 -06:00
Tim Donohue
30d57174e6 Merge pull request #3896 from DSpace/backport-3413-to-dspace-7_x
[Port dspace-7_x] Improve descriptive labels for show/hide x more buttons for related items (Item/Entity Homepage)
2025-01-24 12:52:04 -06:00
Tim Donohue
c155a60a7e Merge pull request #3895 from DSpace-Labs/dependabot/npm_and_yarn/cross-spawn-7.0.6
Bump cross-spawn from 7.0.3 to 7.0.6
2025-01-24 12:29:05 -06:00
autavares-dev
5d6bf0bb33 Fix truncatable-part keyboard accessibility
(cherry picked from commit 6cb4faa8d3)
2025-01-24 18:26:41 +00:00
Alisa Ismailati
147564b114 [CST-17153] improve descriptive labels for show/hide more buttons on related items lists
(cherry picked from commit 7cd82e542b)
2025-01-24 18:05:32 +00:00
dependabot[bot]
ecd2faea4a Bump cross-spawn from 7.0.3 to 7.0.6
Bumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.6.
- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.6)

---
updated-dependencies:
- dependency-name: cross-spawn
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-24 17:43:00 +00:00
FrancescoMolinaro
990f00b129 [DURACOM-303] adapt solution to older version of angular 2025-01-24 18:26:28 +01:00
FrancescoMolinaro
483b97d9c1 [DURACOM-303] refactor thumbnail's skeleton style 2025-01-24 17:41:56 +01:00
FrancescoMolinaro
171a971572 [DURACOM-303] resolve conflicts 2025-01-24 17:41:38 +01:00
FrancescoMolinaro
8a4e8f6045 [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. 2025-01-24 17:41:28 +01:00
FrancescoMolinaro
32364e4f68 [DURACOM-303] add override possibility with input 2025-01-24 17:38:26 +01:00
FrancescoMolinaro
311f648c3f [DURACOM-303] rename variable, minor code refactor 2025-01-24 17:35:36 +01:00
FrancescoMolinaro
2c28f75263 [DURACOM-303] refactor param, add example of configuration 2025-01-24 17:32:31 +01:00
FrancescoMolinaro
53335658e0 [DURACOM-303] adapt interface for ssr 2025-01-24 17:29:37 +01:00
FrancescoMolinaro
9467838066 [DURACOM-303] add grid layout, make SSR enabling configurable, minor restyle of skeletons 2025-01-24 17:29:19 +01:00
FrancescoMolinaro
99656f1357 [DURACOM-303] add loop for filters count 2025-01-24 17:16:20 +01:00
FrancescoMolinaro
8ee05f4352 [DURACOM-303] fix missing url link 2025-01-24 17:11:13 +01:00
FrancescoMolinaro
6756a78ba0 [DURACOM-303] restyle skeleton, add filter badge skeleton 2025-01-24 17:10:20 +01:00
FrancescoMolinaro
b482b58d53 [DURACOM-303] adapt tests 2025-01-24 17:08:39 +01:00
FrancescoMolinaro
312a2a7f58 [DURACOM-303] fix lint and tests 2025-01-24 17:07:27 +01:00
FrancescoMolinaro
d6f0f02c1a [DURACOM-303] minor restyle of skeleton for mobile 2025-01-24 17:05:26 +01:00
FrancescoMolinaro
61eb14783e [DURACOM-303] resolve conflicts 2025-01-24 17:03:47 +01:00
FrancescoMolinaro
126f3c71f4 [DURACOM-303] add skeleton loader for search results and filters 2025-01-24 17:03:29 +01:00
DSpace Bot
6cd092671f [Port dspace-7_x] Improving the color contrast of home news content (#3890)
* Improving the color contrast of home news content

(cherry picked from commit 2290b871f7)

* Improved color contrast

(cherry picked from commit 62b6677e04)

* Adjusting font color changes

(cherry picked from commit be335415fd)

---------

Co-authored-by: root <root@TI-03.OHB.LOCAL>
2025-01-24 09:58:41 -06:00
FrancescoMolinaro
39c5de6e18 [DURACOM-303] implement skeleton component for search results 2025-01-24 16:54:23 +01:00
FrancescoMolinaro
5868a3198f [DURACOM-303] fix missing imports 2025-01-24 16:49:25 +01:00
FrancescoMolinaro
c5fd4426cd [DURACOM-303] prevent possibly long-lasting search and browse calls in SSR 2025-01-24 16:44:39 +01:00
Jens Vannerum
ea715ba9f5 Merge remote-tracking branch 'origin/dspace-7_x' into w2p-117544_support-for-disabled-elements-for-screen-readers-7.x 2025-01-24 10:17:33 +01:00
Tim Donohue
f097652594 Merge pull request #3865 from DSpace/dependabot/npm_and_yarn/dspace-7_x/jsonschema-1.5.0
Bump jsonschema from 1.4.1 to 1.5.0
2025-01-23 16:50:21 -06:00
Tim Donohue
cecf87364e Merge pull request #3864 from DSpace/dependabot/npm_and_yarn/dspace-7_x/core-js-3.40.0
Bump core-js from 3.39.0 to 3.40.0
2025-01-23 16:02:02 -06:00
Tim Donohue
afa0a9017f Merge pull request #3858 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-d300448e1c
Bump sass from 1.83.1 to 1.83.4 in the sass group
2025-01-23 15:12:00 -06:00
Tim Donohue
7638511762 Merge pull request #3856 from DSpace/dependabot/npm_and_yarn/dspace-7_x/postcss-3a92966d17
Bump postcss from 8.4.49 to 8.5.1 in the postcss group
2025-01-23 14:49:30 -06:00
Tim Donohue
31336efad2 Merge pull request #3860 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/lodash-4.17.14
Bump @types/lodash from 4.17.13 to 4.17.14
2025-01-23 11:11:53 -06:00
dependabot[bot]
fc2d3f0a23 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:47:29 +00:00
dependabot[bot]
6cb3e8bbfb 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-22 23:47:21 +00:00
Tim Donohue
00ff0cc7e4 Merge pull request #3876 from scholarsportal/fix-bitsream-filename-encoding-url-dspace-7_x
Fix redirect URLs of bitstreams with spaces in filename
2025-01-22 16:04:49 -06:00
Tim Donohue
81fa0ba446 Merge pull request #3346 from 4Science/task/dspace-7_x/CST-14904
[Port dspace-7_x] Add orcid icon with tooltip
2025-01-22 12:39:51 -06:00
Tim Donohue
5342653b99 Merge pull request #3879 from alanorth/angular-ssr-sitemap-dspace7
[Post dspace-7_x] Restrict Angular SSR to paths in the sitemap
2025-01-22 10:21:10 -06:00
Andreas Awouters
d4b0cf21d3 Merge remote-tracking branch 'dspace/dspace-7_x' into accessibility-settings-7_x
# Conflicts:
#	src/app/profile-page/profile-page.component.html
#	src/app/shared/notifications/notifications-board/notifications-board.component.spec.ts
#	src/app/shared/notifications/notifications-board/notifications-board.component.ts
2025-01-22 15:56:10 +01:00
Tim Donohue
88fb275017 Merge pull request #3878 from DSpace/backport-3875-to-dspace-7_x
[Port dspace-7_x] Stabilize e2e tests that use admin sidebar menu
2025-01-22 08:55:54 -06:00
Andreas Awouters
d9614b9a1b Merge branch 'accessibility-settings-7.6' into accessibility-settings-7_x 2025-01-22 15:50:41 +01:00
Andreas Awouters
b55a318676 119602: Reset notificationTimeOut when left on 0 2025-01-22 15:47:13 +01:00
Alan Orth
b839252ed7 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-22 11:02:35 +03:00
Tim Donohue
e3f13f8c54 Ensure admin menu e2e tests hover over admin menu before clicking on it. Attempt to stabilize tests which open this menu.
(cherry picked from commit e9cd0f4c64)
2025-01-21 23:12:01 +00:00
Mohana Sarmiento
2bd53d822a Add unit test 2025-01-21 16:26:01 -05:00
Tim Donohue
b11543c3a5 Merge pull request #3873 from DSpace/backport-3872-to-dspace-7_x
[Port dspace-7_x] SCSS cleanup: remove duplicated line
2025-01-21 14:46:03 -06:00
Sascha Szott
6035d9e925 remove duplicated line
(cherry picked from commit 5d04e44ff3)
2025-01-21 19:37:19 +00:00
Mohana Sarmiento
74d6dbb454 Fix double encoding of bitstream filenames in URL 2025-01-20 18:13:35 -05:00
Andrea Barbasso
d0b6571954 [CST-14904] improve orcid logo image alt 2025-01-20 15:31:31 +01:00
dependabot[bot]
39ddc5cbcd 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:58:28 +00:00
dependabot[bot]
9bc65b99a6 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:20 +00:00
dependabot[bot]
9741ce3e69 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:54 +00:00
dependabot[bot]
7472be0098 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-17 22:57:43 +00:00
Tim Donohue
f3df3cc96c Merge pull request #3830 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sanitize-html-2.14.0
Bump sanitize-html from 2.13.1 to 2.14.0
2025-01-17 16:29:44 -06:00
Tim Donohue
8ef53178db Merge pull request #3831 from DSpace/dependabot/npm_and_yarn/dspace-7_x/isbot-5.1.21
Bump isbot from 5.1.17 to 5.1.21
2025-01-17 12:04:19 -06:00
Tim Donohue
395a5b2cb1 Merge pull request #3828 from DSpace/dependabot/npm_and_yarn/dspace-7_x/testing-752a8f7b41
Bump the testing group across 1 directory with 2 updates
2025-01-17 10:40:14 -06:00
dependabot[bot]
ce5ab70fd4 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-15 23:48:52 +00:00
dependabot[bot]
2abdf122b4 Bump sanitize-html from 2.13.1 to 2.14.0
Bumps [sanitize-html](https://github.com/apostrophecms/sanitize-html) from 2.13.1 to 2.14.0.
- [Changelog](https://github.com/apostrophecms/sanitize-html/blob/main/CHANGELOG.md)
- [Commits](https://github.com/apostrophecms/sanitize-html/compare/2.13.1...2.14.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-15 23:46:54 +00:00
dependabot[bot]
31c9b854c6 Bump the testing group across 1 directory with 2 updates
Bumps the testing group with 2 updates in the / directory: [cypress](https://github.com/cypress-io/cypress) and [ng-mocks](https://github.com/help-me-mom/ng-mocks).


Updates `cypress` from 13.15.1 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.15.1...v13.17.0)

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: cypress
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: testing
- 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-15 22:54:06 +00:00
Tim Donohue
75e45d4c15 Merge pull request #3774 from DSpace/dependabot/npm_and_yarn/dspace-7_x/mirador-3.4.2
Bump mirador from 3.3.0 to 3.4.2
2025-01-15 16:47:00 -06:00
Tim Donohue
d88c8ef986 Merge pull request #3669 from DSpace/dependabot/npm_and_yarn/dspace-7_x/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:56:34 -06:00
Tim Donohue
f07a62b8b6 Merge pull request #3799 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-fc80c07a3c
Bump sass from 1.80.6 to 1.83.1 in the sass group across 1 directory
2025-01-15 15:53:30 -06:00
Tim Donohue
2b96983f9d Merge pull request #3775 from DSpace/dependabot/npm_and_yarn/dspace-7_x/fortawesome/fontawesome-free-6.7.2
Bump @fortawesome/fontawesome-free from 6.6.0 to 6.7.2
2025-01-15 15:12:53 -06:00
Tim Donohue
c8b2642f57 Merge pull request #3829 from DSpace/dependabot/npm_and_yarn/dspace-7_x/express-4.21.2
Bump express from 4.21.1 to 4.21.2
2025-01-15 15:00:29 -06:00
dependabot[bot]
fd166fe79a 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-15 19:51:07 +00:00
Tim Donohue
6446911441 Merge pull request #3844 from tdonohue/port_3842_to_7x
[Port dspace-7_x] Attempt to stabilize a few randomly failing e2e tests
2025-01-15 13:45:19 -06:00
Tim Donohue
9e1ce916f6 Ensure Item Edit page tab is visible before & after clicking it. 2025-01-15 13:01:58 -06:00
Tim Donohue
ecceaf9ee1 Ensure Admin sidebar link is visible before clicking links 2025-01-15 13:01:58 -06:00
Tim Donohue
fcf3370d66 Merge pull request #3727 from DSpace/dependabot/npm_and_yarn/dspace-7_x/axios-1.7.9
Bump axios from 1.7.7 to 1.7.9
2025-01-14 17:02:24 -06:00
Tim Donohue
813e965938 Merge pull request #3702 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sortablejs-1.15.6
Bump sortablejs from 1.15.3 to 1.15.6
2025-01-14 16:53:20 -06:00
dependabot[bot]
3c16537fe4 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-13 02:39:41 +00:00
dependabot[bot]
a57fd1a069 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 02:39:03 +00:00
Tim Donohue
6f5864d106 Merge pull request #3826 from tdonohue/port_3105_to_7x
[Port dspace-7_x] Fix for User profile (/profile): only 20 group memberships shown instead of all
2025-01-10 17:07:33 -06:00
Tim Donohue
fbe4ce5829 Merge pull request #3824 from tdonohue/port_3096_to_7x
[Port dspace-7_x] Change - Metadata field selector, add infinite scroll for data paginated
2025-01-10 16:23:13 -06:00
VictorHugoDuranS
112bed787a 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:53:09 -06:00
VictorHugoDuranS
05d5a0816d 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:42:33 -06:00
Alan Orth
58e9a60812 Merge pull request #3812 from tdonohue/port_3701_to_7x 2025-01-08 10:20:58 +03:00
Koen Pauwels
76539dd8a1 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 17:00:53 -06:00
Tim Donohue
d0a8448de6 Merge pull request #3668 from DSpace/dependabot/npm_and_yarn/dspace-7_x/postcss-65f8102df2
Bump postcss from 8.4.47 to 8.4.49 in the postcss group across 1 directory
2025-01-07 16:18:38 -06:00
Tim Donohue
9fce33f514 Merge pull request #3805 from DSpace/backport-3719-to-dspace-7_x
[Port dspace-7_x] Remove nested span elements with duplicate content of parent elements
2025-01-07 10:46:04 -06:00
Sascha Szott
04123f92aa fix indentation
(cherry picked from commit dbd67f056e)
2025-01-07 15:08:57 +00:00
Sascha Szott
7538f49a36 remove nested span element
(cherry picked from commit acb7c9bd33)
2025-01-07 15:08:57 +00:00
Sascha Szott
60586f6c33 fix nested span element
(cherry picked from commit 97b5e0cc92)
2025-01-07 15:08:57 +00:00
Sascha Szott
86a6897861 fix nested span element
(cherry picked from commit e9a28c6d3d)
2025-01-07 15:08:57 +00:00
Sascha Szott
68372b2cb8 fix nested span element
(cherry picked from commit 2e174cd9e6)
2025-01-07 15:08:57 +00:00
Sascha Szott
cefeb6a1d6 fix nested span element
(cherry picked from commit 15d3f257b3)
2025-01-07 15:08:57 +00:00
Sascha Szott
9c859b1fdc fix nested span element
(cherry picked from commit 8509096c32)
2025-01-07 15:08:57 +00:00
Sascha Szott
fbaa5068af fix nested span element
(cherry picked from commit 84878ede67)
2025-01-07 15:08:56 +00:00
Sascha Szott
8515de3d10 fix nested span element in templates
(cherry picked from commit 394ecea118)
2025-01-07 15:08:56 +00:00
Tim Donohue
96cdab8d6a Merge pull request #3640 from DSpace/dependabot/npm_and_yarn/dspace-7_x/express-static-gzip-2.2.0
Bump express-static-gzip from 2.1.8 to 2.2.0
2025-01-06 17:00:32 -06:00
Tim Donohue
ebc7799404 Merge pull request #3795 from alexandrevryghem/w2p-122005_fixed-dropdown-values-resetting-on-enter_contribute-7_x
[Port dspace-7_x] Fixed dropdown/lookup & lookup-name fields being reset when hitting enter
2025-01-06 16:24:11 -06:00
Alexandre Vryghem
d3d86f4f2d 119799: Prevent the lookup/lookup-name fields from resetting when hitting the enter key in another input field
(cherry picked from commit c8694e1a87)
2025-01-06 22:38:58 +01:00
Tim Donohue
a078932857 Merge pull request #3143 from atmire/w2p-115284_add-support-for-non-repeatable-relationships_dspace-7-x
[Port dspace-7_x] Add support for non repeatable relationships
2025-01-06 11:59:13 -06:00
Tim Donohue
a1b7c8d9c5 Merge pull request #3789 from DSpace/backport-3718-to-dspace-7_x
[Port dspace-7_x] fix selector in OrgUnitSearchResultListSubmissionElementComponent compontent
2025-01-06 09:00:57 -06:00
dependabot[bot]
894448e3dc 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 03:04:09 +00:00
Alexandre Vryghem
b25294c872 Merge branch 'w2p-122005_fixed-dropdown-values-resetting-on-enter_contribute-7.6' into dspace-7_x
# Conflicts:
#	src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.component.html
2025-01-03 17:08:46 +01:00
Sascha Szott
ecf3298345 fix value of selector in component annotation
(cherry picked from commit 71de4b600b)
2025-01-03 06:01:04 +00:00
Andreas Awouters
18819b76a8 Merge branch 'w2p-122839_vocabulary-preloadlevel-fix' into vocabulary-preloadlevel-fix-7_x
# Conflicts:
#	src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.ts
2025-01-02 15:12:50 +01:00
Andreas Awouters
4ffde928d4 122839: Fix vocabulary-treeview component tests 2025-01-02 14:42:17 +01:00
Andreas Awouters
9406f7b085 122839: Retrieve preloadLevel from vocabulary before creating tree 2025-01-02 12:04:40 +01:00
jensvannerum
33fdee554e [Port dspace-7_x] Get rid of unnecessary and failing REST requests when navigating between different browse indexes (#3788)
Co-authored-by: Koen Pauwels <koen.pauwels@atmire.com>
Co-authored-by: Jens Vannerum <jens.vannerum@atmire.com>
2025-01-01 12:50:30 +03:00
Andreas Awouters
cee9d0422b 122839: Load nodes up to defined preloadLevel 2024-12-24 15:17:27 +01:00
dependabot[bot]
5c8eabddab 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 02:28:53 +00:00
dependabot[bot]
a18225aa4d 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 02:28:39 +00:00
Tim Donohue
d578222f8f Merge pull request #3770 from DSpace/backport-3679-to-dspace-7_x
[Port dspace-7_x] #3678, #3217 - Fix ordering and changing values of repeatable inputs in submission form
2024-12-19 16:58:03 -06:00
Andrea Barbasso
abc3c41c63 [DURACOM-297] fix changing values in submission form after ordering
(cherry picked from commit 1c9272107c)
2024-12-19 22:25:50 +00:00
Tim Donohue
a8e658a399 Merge pull request #3768 from tdonohue/port_3367_to_7x
[Port dspace-7_x] Accessibility in vocabulary treeview
2024-12-19 14:31:25 -06:00
Tim Donohue
81522586dd Merge pull request #3766 from tdonohue/port_3322_to_7x
[Port dspace-7_x] fix #3241: Configuring the URI link target
2024-12-19 12:26:22 -06:00
andreaNeki
a8ff6a41e0 Trying to correct an error in the focus implementation 2024-12-19 12:18:08 -06:00
andreaNeki
75260b00d9 Ensuring that the message “There were no items to show” is announced to the screen reader when necessary 2024-12-19 12:17:53 -06:00
andreaNeki
14680b013e Adding focus to the input after the reset button is clicked 2024-12-19 12:15:47 -06:00
andreaNeki
b601405e56 Adding the aria-label attribute to buttons 2024-12-19 12:14:10 -06:00
root
c6ef2f1bd0 Addition of unit tests for the getLinkAttributes() method 2024-12-19 11:50:28 -06:00
igorbaptist4
2a1ef02d75 fix identation 2024-12-19 11:50:21 -06:00
igorbaptist4
25ab69ff21 Configuring the URI link target 2024-12-19 11:50:07 -06:00
Tim Donohue
eb3db9ceb6 Merge pull request #3597 from DSpace/dependabot/npm_and_yarn/dspace-7_x/core-js-3.39.0
Bump core-js from 3.38.1 to 3.39.0
2024-12-18 16:52:22 -06:00
Tim Donohue
84c0371aab Merge pull request #3763 from tdonohue/port_3264_to_7x
[Port dspace-7_x] More accessible file download link for users who use a screen reader
2024-12-18 15:55:48 -06:00
Andrea-Guevara
4bf4e18389 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:48:08 -06:00
Tim Donohue
2ff5350302 Merge pull request #3716 from alexandrevryghem/w2p-120109_fix-findByHref-and-findListByHref-skipping-their-response_contribute-7_x
[Port dspace-7_x] Fix infinite loading on item pages and optimize menu resolver usage
2024-12-18 11:17:35 -06:00
Tim Donohue
36dd4762ed Merge pull request #3466 from atmire/item-edit-bitstreams-table-7_x
[Port dspace-7_x] Edit Item, Bitstreams tab: Accessibility improvements
2024-12-18 10:49:01 -06:00
Tim Donohue
655558538c Merge pull request #3721 from alexandrevryghem/w2p-117573_remove-observable-function-calls-from-template_contribute-7_x
[Port dspace-7_x] Removed observable function calls from template (part 1)
2024-12-18 10:38:54 -06:00
Tim Donohue
12fc5aff71 Merge pull request #3756 from tdonohue/port_3754_to_7x
[Port dspace-7_x][GitHub Actions][Docker] Update Docker scripts & GitHub Actions to use ghcr.io instead of docker.io
2024-12-16 17:26:51 -06:00
Tim Donohue
cd500007b6 Login to GHCR in order to have access to private Docker images for e2e tests. 2024-12-16 16:31:17 -06:00
Tim Donohue
686b61915a Update GitHub Actions for Docker & normal build to use GitHub Container Registry 2024-12-16 16:31:11 -06:00
Tim Donohue
996c877412 Allow for other Docker registries to be used with all Docker compose scripts 2024-12-16 16:30:53 -06:00
Tim Donohue
c9d6c95563 Use fully qualified image names in Dockerfiles. Minor syntax fixes to ENV variables 2024-12-16 16:24:14 -06:00
Andreas Awouters
bee8bde87f Merge branch 'item-edit-bitstreams-table-7.6' into item-edit-bitstreams-table-7_x 2024-12-11 11:22:56 +01:00
Andreas Awouters
5a88cedc22 118223: Remove console.log 2024-12-11 11:17:01 +01:00
Andreas Awouters
442b4ea284 Merge branch 'accessibility-settings-7.6' into accessibility-settings-7_x 2024-12-11 10:12:14 +01:00
Andreas Awouters
c71c6667e0 119602: Improve notification hiding toggle useability 2024-12-11 10:10:16 +01:00
Andreas Awouters
010b2f9693 119602: Improve types & docs 2024-12-11 09:35:01 +01:00
dependabot[bot]
297fc01892 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:29:01 +00:00
Alexandre Vryghem
f9e67dc513 Merge branch 'w2p-117573_remove-observable-function-calls-from-template-7.6' into w2p-117573_remove-observable-function-calls-from-template_contribute-7_x 2024-12-06 18:09:13 +01:00
Alexandre Vryghem
5ee721f2c4 117287: Embed the communities/collections on the EPerson groups 2024-12-06 18:08:57 +01:00
Alexandre Vryghem
830ada37f5 119915: Restored functionality to hide the research profile section on the profile page
(cherry picked from commit ded0079f24)
2024-12-06 17:18:29 +01:00
Alexandre Vryghem
b5a8b56473 117287: Prevent /api/eperson/epersons/undefined from being fired on the create ePerson page
(cherry picked from commit 0cb5b76159)
2024-12-06 17:18:13 +01:00
Alexandre Vryghem
2a72fac646 Merge branch 'w2p-117573_remove-observable-function-calls-from-template-7.6' into dspace-7_x
# Conflicts:
#	src/app/access-control/epeople-registry/epeople-registry.component.html
#	src/app/access-control/epeople-registry/epeople-registry.component.ts
#	src/app/access-control/epeople-registry/eperson-form/eperson-form.component.html
#	src/app/access-control/epeople-registry/eperson-form/eperson-form.component.spec.ts
#	src/app/access-control/epeople-registry/eperson-form/eperson-form.component.ts
#	src/app/access-control/group-registry/group-form/group-form.component.html
#	src/app/access-control/group-registry/group-form/group-form.component.ts
#	src/app/admin/admin-registries/bitstream-formats/bitstream-formats.component.html
#	src/app/admin/admin-registries/bitstream-formats/bitstream-formats.component.spec.ts
#	src/app/admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts
#	src/app/admin/admin-registries/metadata-schema/metadata-schema.component.html
#	src/app/admin/admin-registries/metadata-schema/metadata-schema.component.ts
#	src/app/shared/pagination/pagination.component.ts
2024-12-06 17:14:51 +01:00
Alexandre Vryghem
6988df519e Merge branch 'w2p-120109_fix-findByHref-and-findListByHref-skipping-their-response_contribute-7.6' into dspace-7_x
# Conflicts:
#	src/app/core/data/base/base-data.service.spec.ts
#	src/app/core/data/base/base-data.service.ts
#	src/app/item-page/edit-item-page/abstract-item-update/abstract-item-update.component.ts
2024-12-05 23:49:13 +01:00
Alexandre Vryghem
ce17d23c08 120109: Updated the route configuration to only resolve the dsoEditMenuResolver on pages who use the DsoEditMenuComponent
(cherry picked from commit 5c9f494f76)
2024-12-05 23:27:55 +01:00
Alexandre Vryghem
91acc957b1 120109: Fixed "no elements in sequence" sometimes being thrown on the item bitstream & relationship tabs
(cherry picked from commit decacec404)
2024-12-05 23:27:54 +01:00
Alexandre Vryghem
987ea5104a 120109: Fixed BaseDataService not emitting when the request is too fast and the ResponsePending are not emitted
(cherry picked from commit 0f4d71eb58)
2024-12-05 23:27:54 +01:00
Tim Donohue
135c085024 Merge pull request #3710 from DSpace/backport-3693-to-dspace-7_x
[Port dspace-7_x] Removed unauthorized metadata-export-search request on search page
2024-12-04 11:10:21 -06:00
Alexandre Vryghem
ed4e794d46 119799: Prevent submission from updating the dropdown values when hitting enter in another input form (onsubmit) 2024-12-04 17:16:14 +01:00
Alexandre Vryghem
80e938b1f2 121534: Removed unauthorized metadata-export-search request on search page for non-admins
(cherry picked from commit 70b855e785)
2024-12-03 18:16:02 +00:00
Alexandre Vryghem
c9df52cba2 120256: Ensure searchOptions$ is a SearchOptions and not a plain object
(cherry picked from commit e4daf2b825)
2024-12-03 18:16:02 +00:00
Tim Donohue
e975585350 Merge pull request #3182 from 4Science/task/dspace-7_x/CST-14903
[Port dspace-7_x] Orcid Authorization / Synchronization Page Fixes
2024-12-02 09:38:55 -06:00
dependabot[bot]
7eeeab4c26 Bump sortablejs from 1.15.3 to 1.15.6
Bumps [sortablejs](https://github.com/SortableJS/Sortable) from 1.15.3 to 1.15.6.
- [Release notes](https://github.com/SortableJS/Sortable/releases)
- [Commits](https://github.com/SortableJS/Sortable/compare/1.15.3...1.15.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-02 02:38:03 +00:00
Alan Orth
a53df4fed4 Merge pull request #3696 from 4Science/backport-3308-to-dspace-7_x 2024-11-29 13:58:04 +03:00
Andreas Awouters
cdec4880d2 119602: Compare notifications by id to correctly update store 2024-11-29 10:44:44 +01:00
Alexandre Vryghem
8849f140fb 117287: Removed method calls returning observables from ItemDetailPreviewComponent 2024-11-28 23:47:29 +01:00
Simone Ramundi
c743387a26 [DURACOM-296] Enabled 'admin-div' only for Site Administrator 2024-11-28 12:36:55 +01:00
Andreas Awouters
c38352ed22 119602: Update doc comments 2024-11-25 10:29:16 +01:00
Andreas Awouters
deb4a63c88 119602: Add additional accessibilitySettingsComponent tests 2024-11-25 10:12:39 +01:00
Andreas Awouters
ec016e80fb 119602: Update AccessibilitySettingsService stub 2024-11-25 10:00:04 +01:00
Andreas Awouters
ced163a25f 119602: Remove obsolete tests 2024-11-25 09:58:50 +01:00
Andreas Awouters
5a28e66b2f 119602: Move hints to contextHelp 2024-11-25 09:44:27 +01:00
Tim Donohue
35a25b372d Merge pull request #3685 from tdonohue/port_3683_to_7x
[Port dspace-7_x] Fix incorrect example in `config.example.yml`
2024-11-22 11:51:30 -06:00
Tim Donohue
62b31ea8c5 Fix incorrect example. The setting category is called "ssr" and not "universal" 2024-11-22 11:19:08 -06:00
Andreas Awouters
9ac92e0196 119602: Add unit after input fields 2024-11-22 16:09:12 +01:00
Andreas Awouters
287d028331 119602: Make input boxes smaller 2024-11-22 16:03:52 +01:00
Andreas Awouters
cae13942e2 119602: Allow resetting accessibility settings 2024-11-22 15:54:21 +01:00
Andreas Awouters
b16cec631d 119602: Add automatic notification hiding toggle 2024-11-22 13:56:39 +01:00
Andreas Awouters
dc8a699e94 119602: Rework convertion & form format 2024-11-22 11:55:05 +01:00
Tim Donohue
b54e54da30 Merge pull request #3660 from alexandrevryghem/w2p-107155_Performance-re-request-embeds_contribute-7_x
[Port dspace-7_x] Added support for caching embedded objects without a self link & null responses
2024-11-18 10:26:38 -06:00
Andreas Awouters
fdfa6e2c06 119602: Update values after converters implementation 2024-11-18 14:26:48 +01:00
Andreas Awouters
ecb00a95a0 119602: Implement converting of accessibility settings values 2024-11-18 13:50:46 +01:00
Andreas Awouters
fe90d39943 119602: Add placeholder in form 2024-11-18 11:36:10 +01:00
Alexandre Vryghem
e2615a798e Fixed flaky item-edit tests
This simply restores the accidental changes made during this cherry-pick: 3df66e0257
2024-11-17 02:33:53 +01:00
Alexandre Vryghem
ff42b65fc9 118944: Fix hasDraftVersion$ not working for embedded payloads with no content
(cherry picked from commit 704cc06f16)
2024-11-16 22:24:02 +01:00
Alexandre Vryghem
1e5eff918d Merge remote-tracking branch 'contributions/w2p-107155_Performance-re-request-embeds-7.6' into w2p-107155_Performance-re-request-embeds_contribute-7_x
# Conflicts:
#	src/app/core/browse/browse.service.ts
#	src/app/item-page/edit-item-page/item-relationships/edit-relationship-list/edit-relationship-list.component.spec.ts
2024-11-16 22:16:52 +01:00
Tim Donohue
e59674b5ac Merge pull request #3658 from DSpace/backport-3656-to-dspace-7_x
[Port dspace-7_x] #3655 - Fixes Spacing Issue Between Email Label and Email Address on Profile Setup Form
2024-11-15 17:12:29 -06:00
Simone Ramundi
5a1522deac [DURACOM-300] Fixed space in registration form
(cherry picked from commit 2b104183f7)
2024-11-15 22:34:39 +00:00
Tim Donohue
a5dff6df87 Merge pull request #3651 from tdonohue/port_3225_to_7x
[Port dspace-7_x] Fixed headings by their rank
2024-11-13 15:04:03 -06:00
Tim Donohue
790fa26953 Merge pull request #3652 from DSpace/backport-3649-to-dspace-7_x
[Port dspace-7_x] French translations for subscriptions feature
2024-11-13 14:29:58 -06:00
Pierre Lasou
b2f9743f9f French translations for subscriptions feature
Includes all french labels for subcriptions, plus 2 or 3 other missing things.

(cherry picked from commit 2c16162948)
2024-11-13 19:51:37 +00:00
Alisa Ismailati
66dedc5b2e [CST-15591] Fixed headings by their rank 2024-11-13 11:40:48 -06:00
Tim Donohue
6330516630 Merge pull request #3642 from DSpace/backport-3222-to-dspace-7_x
[Port dspace-7_x] Updated `cs` messages following the lindat v5 and clarin-dspace v7 instance
2024-11-11 10:40:20 -06:00
milanmajchrak
bd638f0356 Updated supervised by messages following NTK suggestions
(cherry picked from commit d819cf4396)
2024-11-11 15:31:30 +00:00
milanmajchrak
b11efbbf0c Updated messages for the 'supervised' and 'claim' sentenses
(cherry picked from commit 1aef6ce1d6)
2024-11-11 15:31:30 +00:00
milanmajchrak
68b6cc9bd4 Fixed small cs localization mistakes
(cherry picked from commit 680d6c9416)
2024-11-11 15:31:30 +00:00
milanmajchrak
d586a8450d Updated cs localization for subcommunities and subcollections
(cherry picked from commit 9badd4a4b6)
2024-11-11 15:31:30 +00:00
milanmajchrak
33bc8ba1a3 Fixed messages following the PR from the UFAL - f18d45ce23
(cherry picked from commit 5e5c627b8b)
2024-11-11 15:31:30 +00:00
milanmajchrak
865268e820 Updated cs messages following review requirements
(cherry picked from commit 813d644b32)
2024-11-11 15:31:30 +00:00
milanmajchrak
e5ea435cbe Fixed linting error.
(cherry picked from commit 7e864d27b4)
2024-11-11 15:31:30 +00:00
milanmajchrak
6b32d04aec Updated some messages following the lindat v5 and clarin-dspace v7 instance.
(cherry picked from commit b10563ea53)
2024-11-11 15:31:30 +00:00
dependabot[bot]
06783364c4 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 03:15:03 +00:00
Tim Donohue
a812e6ae27 Merge pull request #3594 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-8323b2791b
Bump sass from 1.80.4 to 1.80.6 in the sass group
2024-11-08 16:05:14 -06:00
Tim Donohue
841caec3e6 Merge pull request #3627 from tdonohue/port_3328_to_7x
[Port dspace-7_x] Klaro Accessibility cookie settings
2024-11-08 16:01:49 -06:00
Tim Donohue
9715eaba36 Merge pull request #3626 from DSpace/backport-3625-to-dspace-7_x
[Port dspace-7_x] Fix Klaro translations by forcing Klaro to use a zy language code that DSpace will translate
2024-11-08 16:01:40 -06:00
dependabot[bot]
bc50efec5e 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:35:42 +00:00
Tim Donohue
25fd1a9d76 Merge pull request #3595 from DSpace/dependabot/npm_and_yarn/dspace-7_x/compression-1.7.5
Bump compression from 1.7.4 to 1.7.5
2024-11-08 14:33:17 -06:00
andreaNeki
64628f7e0d DSpace#2668 - Adding and changing classes in global scss to make cookie settings more accessible 2024-11-08 14:21:54 -06:00
Tim Donohue
4353c57cd0 Fix Klaro translations by forcing Klaro to use a 'zy' language key which DSpace will translate
(cherry picked from commit 6076423907)
2024-11-08 20:13:18 +00:00
Tim Donohue
ce010725ac Merge pull request #3596 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/lodash-4.17.13
Bump @types/lodash from 4.17.12 to 4.17.13
2024-11-08 10:56:45 -06:00
Tim Donohue
7b4d5f9aad Merge pull request #3621 from DSpace/backport-3619-to-dspace-7_x
[Port dspace-7_x] BitstreamAuthorizationsComponent: update selector and comment to correctly describe component's purpose
2024-11-07 14:53:05 -06:00
Sascha Szott
9f879d3850 fix invalid selector
(cherry picked from commit 752951ce3b)
2024-11-07 20:12:29 +00:00
Sascha Szott
87f5b50201 update comment to correctly describe component's purpose
(cherry picked from commit 33dddc697f)
2024-11-07 20:12:29 +00:00
Andreas Awouters
bb7f0cd3a5 119602: Improve profile page link accessibility 2024-11-07 10:18:11 +01:00
Andreas Awouters
3c92acb770 Merge branch 'accessibility-settings-7.6' into accessibility-settings-7_x 2024-11-06 10:59:32 +01:00
Andreas Awouters
04515591e2 119602: Add link to AccessibilitySettings on profile page 2024-11-06 10:53:41 +01:00
Andreas Awouters
37455a8b6c 119602: Make AccessibilitySettings cookie expiration configurable 2024-11-06 10:53:41 +01:00
Andreas Awouters
82fd9539b7 119602: Add AccessibilitySettingsComponent tests 2024-11-06 10:53:41 +01:00
Andreas Awouters
52eabec70d 119602: Add AccessibilitySettingsService tests 2024-11-06 10:53:41 +01:00
Andreas Awouters
cad086c945 119602: Add AccessibilitySettingsService stub & fix live-region test 2024-11-06 10:53:41 +01:00
Andreas Awouters
6a49df59af 119602: Integrate accessibility settings into notifications-board 2024-11-06 10:53:41 +01:00
Andreas Awouters
d224a2c47d 119602: Integrate accessibility settings into live-region 2024-11-06 09:58:19 +01:00
Andreas Awouters
b72ce73931 119602: Add Accessibility Settings page 2024-11-06 09:58:19 +01:00
Andreas Awouters
8f708d0e28 119602: Add AccessibilitySettingsService 2024-11-06 09:58:19 +01:00
Tim Donohue
38c7988274 Merge pull request #3609 from DSpace/backport-3590-to-dspace-7_x
[Port dspace-7_x] Complete tag translations in french for ORCID and Researcher Profile
2024-11-04 15:15:41 -06:00
Pierre Lasou
9c3363d465 Correction of 2 lint errors due to spacing.
(cherry picked from commit 23dd7903ba)
2024-11-04 20:22:48 +00:00
Pierre Lasou
33262795ba Correct small alignment errors
(cherry picked from commit fde2db85e7)
2024-11-04 20:22:48 +00:00
Pierre Lasou
2aaa32ae5f Complete tag translation in french for ORCID
Contains all french translations for ORCID and Researcher Profile.

(cherry picked from commit ac720033dc)
2024-11-04 20:22:48 +00:00
dependabot[bot]
1b77530a31 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 02:47:05 +00:00
dependabot[bot]
2eb120909b 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 02:46:50 +00:00
dependabot[bot]
26f4d1d329 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-04 02:46:18 +00:00
Tim Donohue
9d4eeb9c9f Merge pull request #3592 from DSpace/backport-3272-to-dspace-7_x
[Port dspace-7_x] Improving accessibility on the new user registration page
2024-11-01 12:17:11 -05:00
andreaNeki
1011468273 Adjusting spaces in ts
(cherry picked from commit 009da08177)
2024-11-01 14:37:49 +00:00
andreaNeki
1fad3cffc7 Simplifying the implementation of dynamic aria-describedby
(cherry picked from commit fa6e85d6db)
2024-11-01 14:37:49 +00:00
andreaNeki
c330e83095 Resolving a wrongly declared variable error
(cherry picked from commit 7b72a5f0c2)
2024-11-01 14:37:49 +00:00
andreaNeki
3b3fa4f643 Dynamic aria-describedby attribute
(cherry picked from commit e629d9edf0)
2024-11-01 14:37:49 +00:00
andreaNeki
a6b45f777c Code refactoring - Accessibility on the new user registration and forgotten password forms
(cherry picked from commit f00eae6760)
2024-11-01 14:37:49 +00:00
andreaNeki
585bbec5d5 Improving accessibility on the new user registration page
(cherry picked from commit 0eb2d5ce58)
2024-11-01 14:37:49 +00:00
Alexandre Vryghem
59e5f71a73 117287: Fixed group form not working correctly anymore when switching between different groups
Also fixed edit ePerson not showing the group names
2024-10-29 18:21:34 +01:00
Tim Donohue
0a005c2d95 Merge pull request #3579 from DSpace-Labs/dependabot/npm_and_yarn/dompurify-2.5.7
Bump dompurify from 2.4.5 to 2.5.7
2024-10-25 17:06:40 -05:00
Tim Donohue
dda9c6ec09 Merge pull request #3580 from DSpace-Labs/dependabot/npm_and_yarn/tough-cookie-4.1.4
Bump tough-cookie from 4.1.2 to 4.1.4
2024-10-25 17:06:04 -05:00
Tim Donohue
5b8cc3c9da Merge pull request #3577 from DSpace/dependabot/npm_and_yarn/dspace-7_x/testing-bd64cd6aac
Bump the testing group across 1 directory with 2 updates
2024-10-25 16:26:47 -05:00
dependabot[bot]
45fb5aa611 Bump dompurify from 2.4.5 to 2.5.7
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 2.4.5 to 2.5.7.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/2.4.5...2.5.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-25 21:00:31 +00:00
dependabot[bot]
6f360a6a2d 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.7.2 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.7.2...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-minor
  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 20:05:40 +00:00
dependabot[bot]
4a394a2a38 Bump tough-cookie from 4.1.2 to 4.1.4
Bumps [tough-cookie](https://github.com/salesforce/tough-cookie) from 4.1.2 to 4.1.4.
- [Release notes](https://github.com/salesforce/tough-cookie/releases)
- [Changelog](https://github.com/salesforce/tough-cookie/blob/master/CHANGELOG.md)
- [Commits](https://github.com/salesforce/tough-cookie/compare/v4.1.2...v4.1.4)

---
updated-dependencies:
- dependency-name: tough-cookie
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-25 20:04:27 +00:00
Tim Donohue
da9e856369 Merge pull request #3574 from tdonohue/remove_unused_deps_7x
[Port dspace-7_x] Remove unused dependencies (& additional Mirador dependency cleanup)
2024-10-25 15:02:00 -05:00
Tim Donohue
eedaa2c120 Move ng-mocks to dev dependencies 2024-10-25 14:07:34 -05:00
Tim Donohue
d4e6aa8660 Move @material-ui depedencies & other mirador dependencies to dev dependencies. Only needed to avoid yarn install warnings 2024-10-25 14:07:34 -05:00
Tim Donohue
4d365936f2 Remove unused dependencies listed in "resolutions" 2024-10-25 14:07:34 -05:00
Tim Donohue
6655dec1ec Remove "analyze" command and webpack-bundle-analyzer dev dependency 2024-10-25 14:07:34 -05:00
Tim Donohue
99d421caec Remove unused rxjs-spy dev dependency 2024-10-25 14:07:34 -05:00
Tim Donohue
8d33d52174 Move @types/grecaptcha to dev dependencies 2024-10-25 14:01:27 -05:00
Tim Donohue
6a7c19ae4b Merge pull request #3565 from DSpace/dependabot/npm_and_yarn/dspace-7_x/babel/runtime-7.26.0
Bump @babel/runtime from 7.25.9 to 7.26.0
2024-10-25 13:59:38 -05:00
Tim Donohue
fc9eb1157b Merge pull request #3561 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-bcfd08c0da
Bump sass from 1.80.3 to 1.80.4 in the sass group
2024-10-25 13:50:19 -05:00
dependabot[bot]
c83b6ff036 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 13:34:55 +00:00
dependabot[bot]
e93e66d3e4 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 13:34:03 +00:00
kshepherd
ef11340280 Merge pull request #3554 from DSpace/backport-3524-to-dspace-7_x
[Port dspace-7_x] Aligning the browse button
2024-10-24 15:28:14 +02:00
andreaNeki
d4bb79ca18 Issue 3426 - Aligning the browse button
(cherry picked from commit ddafda33b8)
2024-10-24 11:45:55 +00:00
Alan Orth
40e805f90f Merge pull request #3552 from tdonohue/update_http-proxy-middleware_7x 2024-10-24 08:44:25 +03:00
Alan Orth
a719a2337a Merge pull request #3549 from tdonohue/remove_unused_postcss_deps_7x 2024-10-24 08:41:56 +03:00
Tim Donohue
0ed8c05e1c Bump http-proxy-middleware from 1.0.5 to 2.0.7 2024-10-23 15:05:01 -05:00
Tim Donohue
3deef34f5b Merge pull request #3545 from DSpace/backport-3481-to-dspace-7_x
[Port dspace-7_x] Fix code scanning alert no. 6: Incomplete string escaping or encoding
2024-10-23 14:33:08 -05:00
Tim Donohue
425078dc4e Remove unused postcss-responsive-type 2024-10-23 14:13:33 -05:00
Tim Donohue
5c877f56e9 Remove unused/unmaintained postcss-apply 2024-10-23 14:11:53 -05:00
Tim Donohue
9486ab5fa1 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>
(cherry picked from commit 372444c50a)
2024-10-23 17:25:14 +00:00
Tim Donohue
7c6ecf8e9e Merge pull request #3530 from DSpace/dependabot/npm_and_yarn/dspace-7_x/reflect-metadata-0.2.2
Bump reflect-metadata from 0.1.13 to 0.2.2
2024-10-23 11:37:24 -05:00
Tim Donohue
ee36bab60b Merge pull request #3531 from DSpace/dependabot/npm_and_yarn/dspace-7_x/babel/runtime-7.25.9
Bump @babel/runtime from 7.21.0 to 7.25.9
2024-10-23 10:12:06 -05:00
Andreas Awouters
1a816228e8 118223: Add 'loading' overlay while bitstream is moving 2024-10-23 13:59:23 +02:00
Alan Orth
ccf6f36ade Merge pull request #3526 from DSpace/dependabot/npm_and_yarn/dspace-7_x/angulartics2-12.2.1 2024-10-23 09:39:21 +03:00
dependabot[bot]
5cb22bb1d0 Bump reflect-metadata from 0.1.13 to 0.2.2
Bumps [reflect-metadata](https://github.com/rbuckton/reflect-metadata) from 0.1.13 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-22 21:58:01 +00:00
Tim Donohue
b237c7f5cb Merge pull request #3525 from DSpace/dependabot/npm_and_yarn/dspace-7_x/multi-c55d84953a
Bump sanitize-html and @types/sanitize-html
2024-10-22 16:56:11 -05:00
Tim Donohue
30c3e3db0c Merge pull request #3532 from DSpace/dependabot/npm_and_yarn/dspace-7_x/zone.js-0.13.3
Bump zone.js from 0.11.8 to 0.13.3
2024-10-22 16:55:24 -05:00
Tim Donohue
39cdd1692a Merge pull request #3528 from DSpace/dependabot/npm_and_yarn/dspace-7_x/webpack-dev-server-4.15.2
Bump webpack-dev-server from 4.13.3 to 4.15.2
2024-10-22 16:51:38 -05:00
dependabot[bot]
603e46283f Bump angulartics2 from 12.2.0 to 12.2.1
Bumps [angulartics2](https://github.com/angulartics/angulartics2) from 12.2.0 to 12.2.1.
- [Release notes](https://github.com/angulartics/angulartics2/releases)
- [Commits](https://github.com/angulartics/angulartics2/compare/v12.2.0...v12.2.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 19:31:16 +00:00
Tim Donohue
c17adef242 Merge pull request #3523 from DSpace/dependabot/npm_and_yarn/dspace-7_x/axios-1.7.7
Bump axios from 1.7.5 to 1.7.7
2024-10-22 14:29:41 -05:00
Tim Donohue
bacd484832 Merge pull request #3515 from DSpace/dependabot/npm_and_yarn/dspace-7_x/ng-mocks-14.13.1
Bump ng-mocks from 14.10.0 to 14.13.1
2024-10-22 14:21:04 -05:00
dependabot[bot]
7eb0a47fca Bump zone.js from 0.11.8 to 0.13.3
Bumps [zone.js](https://github.com/angular/angular/tree/HEAD/packages/zone.js) from 0.11.8 to 0.13.3.
- [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.13.3/packages/zone.js)

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

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 19:20:30 +00:00
dependabot[bot]
47db669191 Bump webpack-dev-server from 4.13.3 to 4.15.2
Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 4.13.3 to 4.15.2.
- [Release notes](https://github.com/webpack/webpack-dev-server/releases)
- [Changelog](https://github.com/webpack/webpack-dev-server/blob/v4.15.2/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-server/compare/v4.13.3...v4.15.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 19:19:40 +00:00
dependabot[bot]
ab60ad2072 Bump sanitize-html and @types/sanitize-html
Bumps [sanitize-html](https://github.com/apostrophecms/sanitize-html) and [@types/sanitize-html](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/sanitize-html). These dependencies needed to be updated together.

Updates `sanitize-html` from 2.12.1 to 2.13.1
- [Changelog](https://github.com/apostrophecms/sanitize-html/blob/main/CHANGELOG.md)
- [Commits](https://github.com/apostrophecms/sanitize-html/compare/2.12.1...2.13.1)

Updates `@types/sanitize-html` from 2.9.0 to 2.13.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/sanitize-html)

---
updated-dependencies:
- dependency-name: sanitize-html
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: "@types/sanitize-html"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 19:18:46 +00:00
Tim Donohue
081c573653 Merge pull request #3521 from DSpace/dependabot/npm_and_yarn/dspace-7_x/date-fns-2.30.0
Bump date-fns from 2.29.3 to 2.30.0
2024-10-22 13:48:32 -05:00
Tim Donohue
e22ed77527 Merge pull request #3520 from DSpace/dependabot/npm_and_yarn/dspace-7_x/webpack-bundle-analyzer-4.10.2
Bump webpack-bundle-analyzer from 4.8.0 to 4.10.2
2024-10-22 13:31:32 -05:00
Tim Donohue
4eca7c062c Merge pull request #3514 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sortablejs-1.15.3
Bump sortablejs from 1.15.0 to 1.15.3
2024-10-22 13:30:29 -05:00
Tim Donohue
bef3d37802 Merge pull request #3517 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/express-4.17.21
Bump @types/express from 4.17.17 to 4.17.21
2024-10-22 13:18:47 -05:00
Tim Donohue
2ab52dad8e Merge pull request #3522 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/deep-freeze-0.1.5
Bump @types/deep-freeze from 0.1.2 to 0.1.5
2024-10-22 13:17:41 -05:00
Tim Donohue
6bd66910a9 Merge pull request #3518 from DSpace/dependabot/npm_and_yarn/dspace-7_x/fortawesome/fontawesome-free-6.6.0
Bump @fortawesome/fontawesome-free from 6.4.0 to 6.6.0
2024-10-22 13:16:03 -05:00
dependabot[bot]
cfecf0ff62 Bump ng-mocks from 14.10.0 to 14.13.1
Bumps [ng-mocks](https://github.com/help-me-mom/ng-mocks) from 14.10.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.10.0...v14.13.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 17:16:48 +00:00
Tim Donohue
1bea5f8e6c Merge pull request #3519 from DSpace/dependabot/npm_and_yarn/dspace-7_x/mirador-share-plugin-0.16.0
Bump mirador-share-plugin from 0.11.0 to 0.16.0
2024-10-22 12:14:27 -05:00
dependabot[bot]
7ee4fd5b06 Bump axios from 1.7.5 to 1.7.7
Bumps [axios](https://github.com/axios/axios) from 1.7.5 to 1.7.7.
- [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.5...v1.7.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 16:24:48 +00:00
dependabot[bot]
b90f8e1b49 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-22 16:24:35 +00:00
dependabot[bot]
2a92215d82 Bump date-fns from 2.29.3 to 2.30.0
Bumps [date-fns](https://github.com/date-fns/date-fns) from 2.29.3 to 2.30.0.
- [Release notes](https://github.com/date-fns/date-fns/releases)
- [Changelog](https://github.com/date-fns/date-fns/blob/main/CHANGELOG.md)
- [Commits](https://github.com/date-fns/date-fns/compare/v2.29.3...v2.30.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 16:24:25 +00:00
dependabot[bot]
d03b3c3a48 Bump webpack-bundle-analyzer from 4.8.0 to 4.10.2
Bumps [webpack-bundle-analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer) from 4.8.0 to 4.10.2.
- [Changelog](https://github.com/webpack-contrib/webpack-bundle-analyzer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/webpack-bundle-analyzer/compare/v4.8.0...v4.10.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 16:24:02 +00:00
dependabot[bot]
5ac126250e 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-22 16:23:38 +00:00
dependabot[bot]
a1919a7a1f Bump @fortawesome/fontawesome-free from 6.4.0 to 6.6.0
Bumps [@fortawesome/fontawesome-free](https://github.com/FortAwesome/Font-Awesome) from 6.4.0 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.4.0...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-22 16:23:20 +00:00
dependabot[bot]
dfae913dea Bump @types/express from 4.17.17 to 4.17.21
Bumps [@types/express](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/express) from 4.17.17 to 4.17.21.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/express)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 16:22:59 +00:00
dependabot[bot]
627d8097ac Bump sortablejs from 1.15.0 to 1.15.3
Bumps [sortablejs](https://github.com/SortableJS/Sortable) from 1.15.0 to 1.15.3.
- [Release notes](https://github.com/SortableJS/Sortable/releases)
- [Commits](https://github.com/SortableJS/Sortable/compare/1.15.0...1.15.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-22 16:21:46 +00:00
Alan Orth
8dc777fc46 Merge pull request #3510 from tdonohue/remove_unused_deps_7x 2024-10-22 11:36:11 +03:00
Tim Donohue
e7430b9c1a Remove unused webfontloader 2024-10-21 17:01:49 -05:00
Tim Donohue
4543285a9d Merge pull request #3499 from DSpace/dependabot/npm_and_yarn/dspace-7_x/markdown-it-13.0.2
Bump markdown-it from 13.0.1 to 13.0.2
2024-10-21 16:08:59 -05:00
Tim Donohue
86ea2dc5cb Merge pull request #3498 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-25e7b4912b
Bump sass from 1.80.2 to 1.80.3 in the sass group
2024-10-21 15:53:18 -05:00
Tim Donohue
43d4122bc5 Merge pull request #3485 from DSpace/dependabot/npm_and_yarn/dspace-7_x/eslint-dda39ca691
Bump the eslint group with 5 updates
2024-10-21 15:01:17 -05:00
Tim Donohue
e87da70191 Merge pull request #3492 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/ejs-3.1.5
Bump @types/ejs from 3.1.2 to 3.1.5
2024-10-21 14:51:41 -05:00
Tim Donohue
4f24f2d12f Merge pull request #3495 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/grecaptcha-3.0.9
Bump @types/grecaptcha from 3.0.4 to 3.0.9
2024-10-21 14:50:33 -05:00
Tim Donohue
44fdc49e26 Merge pull request #3496 from DSpace/dependabot/npm_and_yarn/dspace-7_x/postcss-8.4.47
Bump postcss from 8.4.38 to 8.4.47
2024-10-21 14:45:04 -05:00
dependabot[bot]
610bd32869 Bump the eslint group with 5 updates
Bumps the eslint group with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `5.59.1` | `5.62.0` |
| [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `5.59.1` | `5.62.0` |
| [eslint-plugin-deprecation](https://github.com/gund/eslint-plugin-deprecation) | `1.4.1` | `1.5.0` |
| [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) | `2.27.5` | `2.31.0` |
| [eslint-plugin-jsonc](https://github.com/ota-meshi/eslint-plugin-jsonc) | `2.6.0` | `2.16.0` |


Updates `@typescript-eslint/eslint-plugin` from 5.59.1 to 5.62.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/v5.62.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 5.59.1 to 5.62.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.62.0/packages/parser)

Updates `eslint-plugin-deprecation` from 1.4.1 to 1.5.0
- [Release notes](https://github.com/gund/eslint-plugin-deprecation/releases)
- [Changelog](https://github.com/gund/eslint-plugin-deprecation/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gund/eslint-plugin-deprecation/compare/v1.4.1...v1.5.0)

Updates `eslint-plugin-import` from 2.27.5 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.27.5...v2.31.0)

Updates `eslint-plugin-jsonc` from 2.6.0 to 2.16.0
- [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.6.0...v2.16.0)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: eslint-plugin-deprecation
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: eslint-plugin-import
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- 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>
2024-10-21 19:22:59 +00:00
dependabot[bot]
059da40c64 Bump markdown-it from 13.0.1 to 13.0.2
Bumps [markdown-it](https://github.com/markdown-it/markdown-it) from 13.0.1 to 13.0.2.
- [Changelog](https://github.com/markdown-it/markdown-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/markdown-it/markdown-it/compare/13.0.1...13.0.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-21 19:18:12 +00:00
dependabot[bot]
6f7c64e8ca 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:18:08 +00:00
Tim Donohue
1b99ffbf58 Merge pull request #3435 from DSpace/dependabot/npm_and_yarn/dspace-7_x/klaro-0.7.21
Bump klaro from 0.7.18 to 0.7.21
2024-10-21 14:16:06 -05:00
Tim Donohue
36195a9ed1 Merge pull request #3500 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/lodash-4.17.12
Bump @types/lodash from 4.14.194 to 4.17.12
2024-10-21 14:14:45 -05:00
Tim Donohue
d784a28ddb Merge pull request #3489 from DSpace/dependabot/npm_and_yarn/dspace-7_x/pem-1.14.8
Bump pem from 1.14.7 to 1.14.8
2024-10-21 14:11:47 -05:00
dependabot[bot]
e1619e6a6b Bump @types/lodash from 4.14.194 to 4.17.12
Bumps [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) from 4.14.194 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-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-21 02:31:33 +00:00
dependabot[bot]
e3be0cd794 Bump postcss from 8.4.38 to 8.4.47
Bumps [postcss](https://github.com/postcss/postcss) from 8.4.38 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.38...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-18 21:54:22 +00:00
dependabot[bot]
ac3bccc67d Bump klaro from 0.7.18 to 0.7.21
Bumps [klaro](https://github.com/kiprotect/klaro) from 0.7.18 to 0.7.21.
- [Changelog](https://github.com/klaro-org/klaro-js/blob/master/releases.json)
- [Commits](https://github.com/kiprotect/klaro/compare/v0.7.18...v0.7.21)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-18 21:53:59 +00:00
Tim Donohue
b2d46190cb Merge pull request #3488 from DSpace/dependabot/npm_and_yarn/dspace-7_x/sass-7fd8873515
Bump sass from 1.62.0 to 1.80.2 in the sass group
2024-10-18 16:52:20 -05:00
Tim Donohue
532da9d21f Merge pull request #3440 from DSpace/dependabot/npm_and_yarn/dspace-7_x/karma-6.4.4
Bump karma from 6.4.2 to 6.4.4
2024-10-18 15:53:22 -05:00
dependabot[bot]
dc73f85458 Bump @types/grecaptcha from 3.0.4 to 3.0.9
Bumps [@types/grecaptcha](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/grecaptcha) from 3.0.4 to 3.0.9.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/grecaptcha)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-18 20:19:21 +00:00
dependabot[bot]
ac1adefeec Bump @types/ejs from 3.1.2 to 3.1.5
Bumps [@types/ejs](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/ejs) from 3.1.2 to 3.1.5.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/ejs)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-18 20:19:00 +00:00
dependabot[bot]
6eb407ff3b 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 20:18:37 +00:00
dependabot[bot]
2c152e632b Bump sass from 1.62.0 to 1.80.2 in the sass group
Bumps the sass group with 1 update: [sass](https://github.com/sass/dart-sass).


Updates `sass` from 1.62.0 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.0...1.80.2)

---
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>
2024-10-18 20:18:26 +00:00
dependabot[bot]
047b4629bf Bump karma from 6.4.2 to 6.4.4
Bumps [karma](https://github.com/karma-runner/karma) from 6.4.2 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.2...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-18 19:35:07 +00:00
Tim Donohue
1244f23522 Merge pull request #3471 from tdonohue/flakey_item_page_tests
[dspace-7_x] Fix flakey Item page accessibility tests by waiting for pages to fuly load
2024-10-18 14:33:12 -05:00
Tim Donohue
5275f8d13f Fix flakey Item page accessibility tests by waiting for pages to fully load. 2024-10-18 14:01:19 -05:00
Tim Donohue
c3eaf8bd6f Merge pull request #3442 from DSpace/dependabot/npm_and_yarn/dspace-7_x/nouislider-15.8.1
Bump nouislider from 15.7.1 to 15.8.1
2024-10-18 12:25:34 -05:00
Tim Donohue
53c6e89486 Merge pull request #3443 from DSpace/dependabot/npm_and_yarn/dspace-7_x/core-js-3.38.1
Bump core-js from 3.30.1 to 3.38.1
2024-10-18 12:14:46 -05:00
Tim Donohue
1bfd68bd34 Merge pull request #3444 from DSpace/dependabot/npm_and_yarn/dspace-7_x/types/node-14.18.63
Bump @types/node from 14.18.42 to 14.18.63
2024-10-18 11:56:38 -05:00
Tim Donohue
9410114be3 Merge pull request #3432 from DSpace/dependabot/npm_and_yarn/dspace-7_x/angular-99dae2292d
Bump the angular group with 15 updates
2024-10-18 11:53:53 -05:00
Tim Donohue
5a3b0c6d78 Merge pull request #3446 from DSpace/dependabot/npm_and_yarn/dspace-7_x/express-static-gzip-2.1.8
Bump express-static-gzip from 2.1.7 to 2.1.8
2024-10-17 16:51:22 -05:00
dependabot[bot]
3459bf68cb Bump the angular group with 15 updates
Bumps the angular group with 15 updates:

| Package | From | To |
| --- | --- | --- |
| [@angular/animations](https://github.com/angular/angular/tree/HEAD/packages/animations) | `15.2.8` | `15.2.10` |
| [@angular/cdk](https://github.com/angular/components) | `15.2.8` | `15.2.9` |
| [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `15.2.8` | `15.2.10` |
| [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `15.2.8` | `15.2.10` |
| [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `15.2.8` | `15.2.10` |
| [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `15.2.8` | `15.2.10` |
| [@angular/localize](https://github.com/angular/angular) | `15.2.8` | `15.2.10` |
| [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `15.2.8` | `15.2.10` |
| [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) | `15.2.8` | `15.2.10` |
| [@angular/platform-server](https://github.com/angular/angular/tree/HEAD/packages/platform-server) | `15.2.8` | `15.2.10` |
| [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `15.2.8` | `15.2.10` |
| [@angular-devkit/build-angular](https://github.com/angular/angular-cli) | `15.2.6` | `15.2.11` |
| [@angular/cli](https://github.com/angular/angular-cli) | `16.2.12` | `16.2.16` |
| [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `15.2.8` | `15.2.10` |
| [@angular/language-service](https://github.com/angular/angular/tree/HEAD/packages/language-service) | `15.2.8` | `15.2.10` |


Updates `@angular/animations` from 15.2.8 to 15.2.10
- [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/15.2.10/packages/animations)

Updates `@angular/cdk` from 15.2.8 to 15.2.9
- [Release notes](https://github.com/angular/components/releases)
- [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/components/compare/15.2.8...15.2.9)

Updates `@angular/common` from 15.2.8 to 15.2.10
- [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/15.2.10/packages/common)

Updates `@angular/compiler` from 15.2.8 to 15.2.10
- [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/15.2.10/packages/compiler)

Updates `@angular/core` from 15.2.8 to 15.2.10
- [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/15.2.10/packages/core)

Updates `@angular/forms` from 15.2.8 to 15.2.10
- [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/15.2.10/packages/forms)

Updates `@angular/localize` from 15.2.8 to 15.2.10
- [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/15.2.8...15.2.10)

Updates `@angular/platform-browser` from 15.2.8 to 15.2.10
- [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/15.2.10/packages/platform-browser)

Updates `@angular/platform-browser-dynamic` from 15.2.8 to 15.2.10
- [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/15.2.10/packages/platform-browser-dynamic)

Updates `@angular/platform-server` from 15.2.8 to 15.2.10
- [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/15.2.10/packages/platform-server)

Updates `@angular/router` from 15.2.8 to 15.2.10
- [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/15.2.10/packages/router)

Updates `@angular-devkit/build-angular` from 15.2.6 to 15.2.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/15.2.6...15.2.11)

Updates `@angular/cli` from 16.2.12 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.12...16.2.16)

Updates `@angular/compiler-cli` from 15.2.8 to 15.2.10
- [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/15.2.10/packages/compiler-cli)

Updates `@angular/language-service` from 15.2.8 to 15.2.10
- [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/15.2.10/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/cdk"
  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-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
- 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-17 19:59:07 +00:00
dependabot[bot]
ab7bded221 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-17 19:56:44 +00:00
Tim Donohue
14a6894540 Merge pull request #3468 from tdonohue/port_3461_to_7x
[Port dspace-7_x] Add basic e2e testing for i18n
2024-10-17 14:55:04 -05:00
Tim Donohue
946a3afde8 Add basic e2e testing for i18n 2024-10-17 14:25:59 -05:00
Andreas Awouters
b0900d5aa9 Merge branch 'item-edit-bitstreams-table-7.6' into item-edit-bitstreams-table-7_x
# Conflicts:
#	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/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/item-edit-bitstream.component.html
#	src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream/item-edit-bitstream.component.spec.ts
2024-10-17 09:11:47 +02:00
Andreas Awouters
6644714bb7 119176: clear viewContainerRef on destroy 2024-10-17 08:26:39 +02:00
Andreas Awouters
93f9341387 119176: Add aria-labels to buttons 2024-10-17 08:26:39 +02:00
Andreas Awouters
5bb6f6d34c 119176: Announce notification content in live region 2024-10-17 08:26:39 +02:00
Andreas Awouters
8d93f22767 119176: Make table horizontally scrollable
For most screen sizes, the ResponsiveTableSizes is enough to resize the
table columns. On very small screens, or when zoomed in a lot, even the
smallest column sizes are too big. To make it possible to view the
rest of the content even in these situations, the ability to scroll
horizontally is added.
2024-10-17 08:26:39 +02:00
Andreas Awouters
2b1b9d83d7 118223: Include selection action with selection 2024-10-17 08:26:39 +02:00
Andreas Awouters
7fb4755aba 118223: Add item-edit-bitstream-bundle component tests 2024-10-17 08:26:39 +02:00
Andreas Awouters
e8379db987 118223: Add item-bitstreams component tests 2024-10-17 08:26:39 +02:00
Andreas Awouters
0bdb5742e0 118223: Remove unused item-edit-bitstream component 2024-10-17 08:26:39 +02:00
Andreas Awouters
1dcc5d1ec5 118223: Add ItemBitstreams service tests 2024-10-17 08:26:39 +02:00
Andreas Awouters
b158c5c2a2 118223: Move drag tooltip to center of pagination numbers 2024-10-17 08:26:39 +02:00
Andreas Awouters
0920a21876 118223: Stop sending success notificiations on every move 2024-10-17 08:26:39 +02:00
Andreas Awouters
2e1b1489b6 118223: Stop space from scrolling down page 2024-10-17 08:26:39 +02:00
Andreas Awouters
181ea6d7c9 118223: Implement bitstream reordering with keyboard 2024-10-17 08:26:39 +02:00
Andreas Awouters
1f909dc6ea 118223: Add instructive alert to item-bitstreams edit page 2024-10-17 08:26:39 +02:00
Andreas Awouters
d674bcc390 118220: Integrate live-region component into item-edit-bitsream page 2024-10-17 08:26:39 +02:00
dependabot[bot]
e181e854cc Bump @types/node from 14.18.42 to 14.18.63
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 14.18.42 to 14.18.63.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-16 21:47:00 +00:00
dependabot[bot]
ad8dd8b648 Bump core-js from 3.30.1 to 3.38.1
Bumps [core-js](https://github.com/zloirock/core-js/tree/HEAD/packages/core-js) from 3.30.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-16 21:45:45 +00:00
dependabot[bot]
dfe2d4580e Bump nouislider from 15.7.1 to 15.8.1
Bumps [nouislider](https://github.com/leongersen/noUiSlider) from 15.7.1 to 15.8.1.
- [Release notes](https://github.com/leongersen/noUiSlider/releases)
- [Changelog](https://github.com/leongersen/noUiSlider/blob/master/CHANGELOG.MD)
- [Commits](https://github.com/leongersen/noUiSlider/compare/15.7.1...15.8.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-16 21:43:58 +00:00
Tim Donohue
7f1e267b2d Merge pull request #3460 from tdonohue/fix_collection_e2e_test
[dspace-7_x] Fix Collection Page e2e test. Wait on Recent Submissions
2024-10-16 16:39:11 -05:00
Tim Donohue
8c88f7052a Wait on viewevent to trigger before checking Collection Page in e2e tests. This ensures Collection page is fully loaded because viewevent triggers upon loading. 2024-10-16 16:08:39 -05:00
Tim Donohue
f749ade52c Merge pull request #3422 from DSpace/backport-3176-to-dspace-7_x
[Port dspace-7_x] Add German translations (metadata import)
2024-10-14 17:02:02 -05:00
Sascha Szott
533da6624f add missing German translations
(cherry picked from commit 2af168bd54)
2024-10-14 22:01:05 +00:00
Tim Donohue
f7063d4eaf Merge pull request #3411 from alexandrevryghem/w2p-119207_fix-browse-startwith-options-not-loading_contribute-7_x
Fix browse by date's year dropdown being empty on DSpace 7.6.2+
2024-10-11 15:03:16 -05:00
Alexandre Vryghem
4de3c58e06 119207: Reinitialize the BrowseByComponent's objectInjector when startsWithOptions don't exist yet OnInit 2024-10-11 16:23:46 +02:00
Alexandre Vryghem
b709ee0300 118944: Embed the accessStatus link on collection, browse, recent item submissions & the item page related items & delete tab when enabled 2024-10-11 15:08:31 +02:00
Alexandre Vryghem
4af88997e8 Merge branch 'w2p-107155_Performance-re-request-embeds-7.4' into w2p-107155_Performance-re-request-embeds-7.6 2024-10-11 11:02:50 +02:00
Tim Donohue
e74dc22077 Merge pull request #3405 from 4Science/task/backport-3213-to-dspace-7_x
[Port dspace-7_x] Implement e2e accessibility tests for pages in DSpace User Interface
2024-10-10 13:20:34 -05:00
Tim Donohue
7884de94e0 Merge pull request #3409 from tdonohue/port_3407_to_7x
[Port dspace-7_x] Bump cookie, cookie-parser and socket.io
2024-10-10 13:13:51 -05:00
Tim Donohue
169ae41d49 Bump cookie, cookie-parser and socket.io 2024-10-10 11:17:17 -05:00
FrancescoMolinaro
6388613948 revert adding interceptor as not reliable on remote test 2024-10-10 18:00:35 +02:00
Tim Donohue
34a4f5b597 Merge pull request #3368 from alexandrevryghem/w2p-117287_fix-item-version-performance-issues_contribute-7_x
[Port dspace-7_x] Fixed Edit Item's Version History crashing
2024-10-10 10:46:07 -05:00
FrancescoMolinaro
7cf7749367 correct intercept to dso resolved for route 2024-10-10 17:32:46 +02:00
Tim Donohue
adcc6f564d Merge pull request #3404 from tdonohue/port_3343_to_7x
[Port dspace-7_x] Bump send, express and serve-static
2024-10-10 10:08:37 -05:00
FrancescoMolinaro
ba2570b83b Add interceptor for collection page to avoid timeout 2024-10-10 16:18:01 +02:00
FrancescoMolinaro
7ac14daf46 remove interceptors 2024-10-10 15:42:47 +02:00
FrancescoMolinaro
caed26d191 resolve differences with version 8 2024-10-10 14:32:20 +02:00
FrancescoMolinaro
5c0c559685 [CST-15592] remove interceptor for edit group 2024-10-10 12:28:48 +02:00
FrancescoMolinaro
9079a968f0 [CST-15592] add interceptor for edit group, fix landmark-unique accessibility issue in pagination component 2024-10-10 12:28:41 +02:00
FrancescoMolinaro
3df66e0257 [CST-15592] add interceptor for item edit page 2024-10-10 12:28:33 +02:00
FrancescoMolinaro
be36175bb8 [CST-15592] add interceptor to prevent sudden timeout failure 2024-10-10 12:27:48 +02:00
FrancescoMolinaro
d0265eb3f6 [CST-15592] refine health page tests 2024-10-10 12:27:41 +02:00
FrancescoMolinaro
5479cc6274 [CST-15592] change health page test target for second tab 2024-10-10 12:27:31 +02:00
FrancescoMolinaro
db891f2f16 [CST-15592] improve tests, add attributes for testing, fix wrong references 2024-10-10 12:27:22 +02:00
FrancescoMolinaro
543cc42bf3 [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-10 12:27:09 +02:00
FrancescoMolinaro
2ad9a44b99 [CST-15592] add accessibility tests for:
Admin Curation Task
Bitstream Format
Health Page
Metadata Schema
2024-10-10 12:27:02 +02:00
FrancescoMolinaro
ecd2275e1b [CST-15592] add accessibility tests for:
Admin Notifications Publication Claim
Admin Search Page
Bulk Access
Create Group
Metadata Registry
2024-10-10 12:26:54 +02:00
FrancescoMolinaro
f904c0f67d [CST-15592] add accessibility tests for:
Edit Eperson
Edit Group
Create EPerson
Epeople Registry
Groups Registry
2024-10-10 12:26:47 +02:00
FrancescoMolinaro
64855c9cf8 [CST-15592] add accessibility tests for following pages:
Metadata Import
Batch Import
Processes Overview
New Process
Quality Assurance Sources
2024-10-10 12:26:36 +02:00
Tim Donohue
9a7b242827 Bump send, express and serve-static 2024-10-09 16:55:38 -05:00
Tim Donohue
e46c801554 Merge pull request #3402 from tdonohue/port_3400_to_7x
[Port dspace-7_x] Fixed #3399 - minor typo
2024-10-09 15:55:32 -05:00
Arta Seyedian
7be3f1fada Fixed #3399 - minor typo 2024-10-09 14:01:14 -05:00
Tim Donohue
144b455eae Merge pull request #3398 from tdonohue/port_3315_to_7x
[Port dspace-7_x] Upgrade to Cypress 13.15.0
2024-10-09 13:03:19 -05:00
Tim Donohue
bd8659ac11 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 12:08:11 -05:00
Tim Donohue
5636db84a8 Simplify login CSS selectors 2024-10-09 12:00:02 -05:00
Tim Donohue
5621b84284 Minor changes to login-modal.cy.ts to cleanup CSS selectors 2024-10-09 11:58:55 -05:00
Tim Donohue
35cc7a8096 Ensure Cypress still creates videos in GitHub Actions 2024-10-09 11:56:46 -05:00
Tim Donohue
a4e2c47c51 Bump cypress-axe to 1.5.0 2024-10-09 11:56:11 -05:00
Tim Donohue
7a60cd9aaf Bump to Cypress 13.15.0 2024-10-09 11:55:32 -05:00
Tim Donohue
2f94f49c06 Merge pull request #3391 from DSpace/backport-3221-to-dspace-7_x
[Port dspace-7_x] Removed unnecessary *ngVars from ThumbnailComponent
2024-10-08 16:55:35 -05:00
Alexandre Vryghem
3306d0d699 116728: Removed unnecessary *ngVars from the ThumbnailComponent
(cherry picked from commit d31e17894c)
2024-10-08 20:08:09 +00:00
Tim Donohue
bf9590c1e6 Merge pull request #3387 from DSpace/backport-3386-to-dspace-7_x
[Port dspace-7_x] Update fr.json5 to add capitalization
2024-10-04 10:18:54 -05:00
Julia
e2a84b2145 Update fr.json5 to add capitalization
(cherry picked from commit c5b395802c)
2024-10-04 15:18:06 +00:00
Tim Donohue
3e01912eb2 Merge pull request #3382 from tdonohue/port_3148_to_7x
[Port dspace-7_x] Accessibility of the status page
2024-10-02 17:07:06 -05:00
Tim Donohue
4bd6071071 Squashed commit of changes in #3148 from @Andrea-Guevara
Co-authored-by: @Andrea-Guevara
2024-10-02 17:02:12 -05:00
Yana De Pauw
876d94e124 115284: Add tests for isRepeatable 2024-10-02 10:03:53 +02:00
Andreas Awouters
a207fb51e9 118219: Remove unused paginated-drag-and-drop components 2024-10-01 10:37:39 +02:00
Andreas Awouters
8a16597b69 118219: Fix tests 2024-10-01 10:37:39 +02:00
Andreas Awouters
6a2c7d09d6 118219: Add dragging tooltip explaining how to drag to other page 2024-10-01 10:37:39 +02:00
Andreas Awouters
eadbcdbe14 118219: Store result of drag & dropping bitstream 2024-10-01 10:37:39 +02:00
Andreas Awouters
be99cc5c23 118219: Allow dragging of table rows 2024-10-01 10:37:39 +02:00
Andreas Awouters
a230eee76d 117803: Add negative top-margin to subsequent tables 2024-10-01 10:37:39 +02:00
Andreas Awouters
6a8095d456 117803: Change pagination settings styling 2024-10-01 10:37:39 +02:00
Andreas Awouters
79f3a3116e 117803: Set header border to background color 2024-10-01 10:37:39 +02:00
Andreas Awouters
8481604b1e 117803: Fix table & pagination margin 2024-10-01 10:37:39 +02:00
Andreas Awouters
cc5b841a65 117803: Only visually hide header rows 2024-10-01 10:37:39 +02:00
Andreas Awouters
d8b426d745 117803: Add ItemBitsreamsService tests 2024-10-01 10:37:39 +02:00
Andreas Awouters
3f4bf7ce0f 117803: Fix existing tests 2024-10-01 10:37:39 +02:00
Andreas Awouters
374a9ae14e 117803: Add item-bitstream service 2024-10-01 10:37:39 +02:00
Andreas Awouters
d85124c121 117803: Fix deleted bitstreams not being removed from list 2024-10-01 10:37:39 +02:00
Andreas Awouters
1773a75e98 117803: Allow changing page size of Bitstream list 2024-10-01 10:37:39 +02:00
Andreas Awouters
a11bfc80ad 117803: Hide table headers for subsequent bundle tables 2024-10-01 10:37:39 +02:00
Andreas Awouters
cf54af2c22 117803: Refactor Item Edit Bitstreams page to use HTML Table elements 2024-10-01 10:37:39 +02:00
Andrea Barbasso
a8e5b26744 Merge remote-tracking branch 'lyrasis/dspace-7_x' into task/dspace-7_x/CST-14904
# Conflicts:
#	src/app/shared/shared.module.ts
2024-10-01 09:27:53 +02:00
Tim Donohue
6c0514ab48 Merge pull request #3371 from atmire/live-region-7_x
[Port dspace-7_x] Live region
2024-09-30 16:41:06 -05:00
Andreas Awouters
bc84bc867b Merge branch 'live-region-7.6' into live-region-7_x
# Conflicts:
#	config/config.example.yml
#	src/app/shared/shared.module.ts
2024-09-30 09:09:44 +02:00
Alexandre Vryghem
98c49231b4 Merge branch 'w2p-117287_fix-item-version-performance-issues_contribute-7.6' into w2p-117287_fix-item-version-performance-issues_contribute-7_x
# Conflicts:
#	src/app/item-page/versions/item-versions.component.html
2024-09-29 00:19:11 +02:00
Andreas Awouters
751d689ff6 118220: Add additional TypeDocs 2024-09-27 10:02:26 +02:00
Tim Donohue
cf5ac335ca Merge pull request #3364 from DSpace/backport-3153-to-dspace-7_x
[Port dspace-7_x] Fix to Mobile navbar hamburger menu for base (custom) theme
2024-09-26 16:13:04 -05:00
Elvi Nemiz
fe7d2a8a7e 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.
(cherry picked from commit a3b6aef66a)
2024-09-26 18:22:10 +00:00
Tim Donohue
5ffd405ba6 Merge pull request #3362 from DSpace/backport-3340-to-dspace-7_x
[Port dspace-7_x] DS-3330: Updated en.json5 to fixed typo for 'occurred'
2024-09-26 12:04:02 -05:00
Julia
edc738ae39 Update en.json5 - fixed typo for occurred
(cherry picked from commit ed5ac47f88)
2024-09-26 16:57:08 +00:00
Tim Donohue
46b241eda5 Merge pull request #3354 from alanorth/update-isbot-7x
[Port dspace-7_x] updates isbot dependency to newest version
2024-09-26 11:14:38 -05:00
Pascal-Nicolas Becker
f244d388be Merge pull request #3359 from DSpace/backport-3149-to-dspace-7_x
[Port dspace-7_x] missing German translations (500 error)
2024-09-26 17:54:02 +02:00
Tim Donohue
59fd32ac68 Merge pull request #3360 from DSpace/backport-3175-to-dspace-7_x
[Port dspace-7_x] minor change: added missing periods in German translations
2024-09-26 10:52:54 -05:00
Sascha Szott
48ec0cdc34 minor change: added missing periods in German translations
(cherry picked from commit e26ab86dd3)
2024-09-26 14:45:31 +00:00
Sascha Szott
aed97c9dcc added missing German translations (500 error)
(cherry picked from commit 5f6b6ef984)
2024-09-26 14:43:28 +00:00
kshepherd
26dcb6b8b0 Merge pull request #3352 from alexandrevryghem/w2p-110615_minor-accessibility-fixes_contribute-7_x
[Port dspace-7_x] Minor accessibility fixes
2024-09-26 11:29:24 +02:00
Andreas Awouters
c1fa52ee64 118220: Store messages with ID so clears can be targeted 2024-09-25 09:50:33 +02:00
Alan Orth
29c1b51073 .github/workflows/build.yml: use Node.js v18 and v20
Node.js v16 LTS is end of life since October, 2023.

See: https://nodejs.org/en/about/previous-releases
2024-09-25 08:34:04 +03:00
Alan Orth
35946dcf7c Update isbot dependency
Note that the minimum supported Node.js version is now v18, as v16
is now end of life.
2024-09-25 08:17:03 +03:00
Alexandre Vryghem
f49bdcd8c8 Merge branch 'w2p-110615_minor-accessibibity-fixes_contribute-7.6' into w2p-110615_minor-accessibility-fixes_contribute-7_x
# 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-09-24 22:03:46 +02:00
Andrea Barbasso
cd51baa5f1 [CST-14904] add orcid icon with tooltip 2024-09-24 12:04:22 +02:00
Andreas Awouters
35d29c8425 118220: Add LiveRegion to RootComponent 2024-09-20 13:31:45 +02:00
Andreas Awouters
e987c35450 118220: Add liveRegionComponent & Service tests 2024-09-20 13:31:45 +02:00
Andreas Awouters
83a44ba924 118220: Add live-region service and component 2024-09-20 13:31:44 +02:00
Jens Vannerum
4a7ebeea16 117544: fix remaining bug 2024-09-16 16:10:36 +02:00
Jens Vannerum
f65d6c5775 117544: rename directive to be clear it should currently only be used for buttons 2024-09-16 14:27:37 +02:00
Jens Vannerum
685e6d83c5 117544: PR feedback
- added typedocs
- changed directive to only be present for buttons
- various other small fixes
2024-09-16 14:24:51 +02:00
Tim Donohue
593e67fe72 Merge pull request #3326 from tdonohue/port_3318_to_7x
[Port dspace-7_x] Bump Express to v4.20.0
2024-09-11 16:58:35 -05:00
Tim Donohue
f7706760cd Bump Express to v4.20.0 2024-09-11 16:30:40 -05:00
Tim Donohue
350cbea6d5 Merge pull request #3306 from tdonohue/port_3011_to_7x
[Port dspace-7_x] Fixed page and admin menu for Shibboleth auth
2024-09-05 16:37:58 -05:00
Michael Spalti
98d9f639f7 Updated browser init to update cache after external auth. 2024-09-05 16:06:42 -05:00
Alexandre Vryghem
f03ed89687 117287: Removed method calls returning observables from the metadata schema registry 2024-09-05 20:09:03 +02:00
Alexandre Vryghem
c74c178533 117287: Removed method calls returning observables from the metadata registry 2024-09-05 19:38:18 +02:00
Tim Donohue
36f07604ae Merge pull request #3302 from tdonohue/port_3284_to_7x
[Port dspace-7_x] Bump micromatch to 4.0.8
2024-09-05 08:41:02 -05:00
Alexandre Vryghem
b55686e187 117287: Removed method calls returning observables from the pagination component 2024-09-05 01:09:05 +02:00
Alexandre Vryghem
680ed3bccf 117287: Removed method calls returning observables from the Group form 2024-09-05 01:09:04 +02:00
Tim Donohue
4ee1c83073 Bump micromatch to 4.0.8 2024-09-04 17:02:50 -05:00
Tim Donohue
e73139d977 Merge pull request #3297 from DSpace/backport-3289-to-dspace-7_x
[Port dspace-7_x] Ignore some paths from file watcher
2024-09-04 11:29:41 -05:00
Kim Shepherd
fa95f56be0 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.

(cherry picked from commit 8152d39ad0)
2024-09-04 15:47:12 +00:00
Alexandre Vryghem
d3019e4006 117287: Removed method calls returning observables from the Registry Formats page 2024-09-03 18:44:49 +02:00
Alexandre Vryghem
70f0af6611 117287: Removed method calls returning observables from the EPerson form 2024-09-03 11:36:04 +02:00
Tim Donohue
ef4496fd21 Merge pull request #3285 from tdonohue/port_3273_to_7x
[Port dspace-7_x] Bump axios from 1.6.7 to 1.7.4
2024-08-30 13:27:05 -05:00
Tim Donohue
dc3bf37521 Bump axios from 1.6.7 to 1.7.4 2024-08-30 12:05:04 -05:00
Tim Donohue
b00470aca0 Merge pull request #3035 from VictorHugoDuranS/dspace_7_2682
Set color black on filter section for mobile
2024-08-29 14:59:23 -05:00
Tim Donohue
c9ecc560ee Merge pull request #3278 from DSpace/backport-3277-to-dspace-7_x
[Port dspace-7_x] Typo in German translation
2024-08-29 13:29:54 -05:00
Vlad Novski
d697d0f7a7 fix[i18n]: typo in German translation
(cherry picked from commit 3b4e0d51cd)
2024-08-29 18:29:16 +00:00
Jens Vannerum
0945021378 117544: resolve conflicts after merging in latest 7.x branch 2024-08-27 12:30:18 +02:00
Jens Vannerum
b5d301e53c Merge branch 'w2p-117544_support-for-disabled-elements-for-screen-readers-7.6' into w2p-117544_support-for-disabled-elements-for-screen-readers-7.x 2024-08-27 11:34:57 +02:00
Jens Vannerum
2d48cc0f69 117544: add spec for directive 2024-08-26 10:46:45 +02:00
Jens Vannerum
4527349dcf 117544: alter specs to match new logic 2024-08-26 10:46:45 +02:00
Jens Vannerum
43745d830b 117544: replace all disabled states with our dsDisabled directive 2024-08-23 14:52:16 +02:00
Jens Vannerum
63c76644c1 117544: First implementation of an aria friendly disabled state 2024-08-23 14:10:58 +02:00
Alexandre Vryghem
d09f5297a1 117287: Removed method calls returning observables from the item versions overview 2024-08-14 22:46:14 +02:00
Alexandre Vryghem
54d99a84c9 110615: Added missing vocabulary search input label 2024-08-13 12:05:16 +02:00
Alexandre Vryghem
655813a8af Merge branch 'refs/heads/w2p-110615_minor-accessibibity-fixes_contribute-7.2' into w2p-110615_minor-accessibibity-fixes_contribute-7.6
# Conflicts:
#	src/app/navbar/expandable-navbar-section/expandable-navbar-section.component.html
2024-08-13 11:48:45 +02:00
Alexandre Vryghem
a0515c4121 110615: Fixed related entities ay11 tab issue & removed potential duplicate ID issue by removing the unused #browseDropdown ID 2024-08-13 11:43:36 +02:00
Tim Donohue
fd2bc90ae2 Merge pull request #3245 from alanorth/backport-3236-to-dspace-7_x
[Port dspace-7_x] #3094 - Update date slider to prevent automatic page reloads
2024-08-09 09:31:21 -05:00
Alan Orth
288c75851e src/app/shared/search: date slider accessibility
Update date slider to prevent automatic page reloads.
2024-08-08 23:17:22 -07:00
Tim Donohue
d5a375ee65 Merge pull request #3240 from tdonohue/port_3235_to_7x
[Port dspace-7_x] Missing translations in de.json5 (translation key prefix workspace-item)
2024-08-07 14:22:23 -05:00
Sascha Szott
5101677d9a fix space issue 2024-08-07 14:21:03 -05:00
Sascha Szott
9135c6318d added missing translations in de.json5 (prefix workspace-item) 2024-08-07 14:21:00 -05:00
Alexandre Vryghem
d31e17894c 116728: Removed unnecessary *ngVars from the ThumbnailComponent 2024-07-26 14:50:34 +02:00
Tim Donohue
11fad8d3ce Merge pull request #3190 from DSpace/backport-3186-to-dspace-7_x
[Port dspace-7_x] Docker build: fix FromAsCasing warning
2024-07-17 16:33:28 -05:00
Sascha Szott
f7f279c5ed fix FromAsCasing warning
(cherry picked from commit f4fe2b8632)
2024-07-17 16:33:36 +00:00
Tim Donohue
35b83cc168 Merge pull request #3187 from tdonohue/port_3172_to_7x
[Port dspace-7_x] Minor fix in french translation file
2024-07-17 11:19:35 -05:00
Emmanuel
73b5d776da Fix a french translation for consistency 2024-07-17 10:36:08 -05:00
Emmanuel Pastor
b08b6cca8c Fix a french translation for consistency 2024-07-17 10:36:03 -05:00
Tim Donohue
e2c886c9a4 Merge pull request #3177 from DSpace/backport-3155-to-dspace-7_x
[Port dspace-7_x] Accessibility on the Edit metadata tab
2024-07-10 16:26:09 -05:00
Tim Donohue
b00ce65e8b Merge pull request #3147 from atmire/w2p-116132_fixed-cookie-issues_contribute-7.6
[Port dspace-7_x] Fixed bug when declining Google ReCaptcha cookie preferences
2024-07-10 15:22:24 -05:00
root
bdea9a6d71 Resolution of issue #1193 - Addition of the aria-label attribute to the add, save, discard and undo buttons on the metadata editing page
(cherry picked from commit 4e783e76d1)
2024-07-10 19:53:17 +00:00
Vincenzo Mecca
bb770ba65b [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-10 11:42:07 +02:00
Tim Donohue
1d8d3b3c27 Update version tag for development of next release 2024-07-09 14:34:17 -05:00
Yana De Pauw
a5595015e6 Merge remote-tracking branch 'upstream/dspace-7_x' into w2p-115284_add-support-for-non-repeatable-relaationships_dspace-7-x 2024-06-26 08:38:48 +02:00
Yana De Pauw
a23cdfbc2b 115284: Add repeatable based on relationship max cardinality 2024-06-26 08:32:43 +02:00
lotte
087c203f72 116132: Fixed cookie issue 2024-06-25 18:28:56 +02:00
Alexandre Vryghem
970b19bf01 115051: Created ThemedAdminWorkflowPageComponent 2024-05-22 14:02:41 +02:00
Alexandre Vryghem
99384a7060 115051: Created ThemedAdminSearchPageComponent 2024-05-21 12:53:02 +02:00
Victor Hugo Duran Santiago
36c95db7bf Set color black on filter section for mobile 2024-05-09 20:50:51 -06:00
Kristof De Langhe
984c9bfc2a 107155: Allow caching of embedded objects without selflink 2023-10-26 16:33:14 +02:00
Kristof De Langhe
be6dbdec66 107155: Allow caching null objects 2023-10-02 13:31:25 +02:00
620 changed files with 117619 additions and 27692 deletions

View File

@@ -231,10 +231,13 @@
"*.json5"
],
"extends": [
"plugin:jsonc/recommended-with-jsonc"
"plugin:jsonc/recommended-with-json5"
],
"rules": {
"no-irregular-whitespace": "error",
// 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-trailing-spaces": "error",
"jsonc/comma-dangle": [
"error",

View File

@@ -8,6 +8,7 @@ on: [push, pull_request]
permissions:
contents: read # to fetch code (actions/checkout)
packages: read # to fetch private images from GitHub Container Registry (GHCR)
jobs:
tests:
@@ -28,6 +29,8 @@ 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"
@@ -35,10 +38,13 @@ jobs:
NODE_OPTIONS: '--max-old-space-size=4096'
# Project name to use when running "docker compose" prior to e2e tests
COMPOSE_PROJECT_NAME: 'ci'
# Docker Registry to use for Docker compose scripts below.
# We use GitHub's Container Registry to avoid aggressive rate limits at DockerHub.
DOCKER_REGISTRY: ghcr.io
strategy:
# Create a matrix of Node versions to test against (in parallel)
matrix:
node-version: [16.x, 18.x]
node-version: [18.x, 20.x]
# Do NOT exit immediately if one matrix job fails
fail-fast: false
# These are the actual CI steps to perform per job
@@ -108,6 +114,14 @@ jobs:
path: 'coverage/dspace-angular/lcov.info'
retention-days: 14
# Login to our Docker registry, so that we can access private Docker images using "docker compose" below.
- name: Login to ${{ env.DOCKER_REGISTRY }}
uses: docker/login-action@v3
with:
registry: ${{ env.DOCKER_REGISTRY }}
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
# Using "docker compose" start backend using CI configuration
# and load assetstore from a cached copy
- name: Start DSpace REST Backend via Docker (for e2e tests)
@@ -172,12 +186,115 @@ 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)
- name: Verify SSR (server-side rendering) on Homepage
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@v2
uses: github/codeql-action/init@v3
with:
languages: javascript
# Autobuild attempts to build any compiled languages
- name: Autobuild
uses: github/codeql-action/autobuild@v2
uses: github/codeql-action/autobuild@v3
# Perform GitHub Code Scanning.
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v3

View File

@@ -17,6 +17,7 @@ on:
permissions:
contents: read # to fetch code (actions/checkout)
packages: write # to write images to GitHub Container Registry (GHCR)
jobs:
#############################################################

View File

@@ -1,7 +1,7 @@
# This image will be published as dspace/dspace-angular
# See https://github.com/DSpace/dspace-angular/tree/main/docker for usage details
FROM node:18-alpine
FROM docker.io/node:18-alpine
# Ensure Python and other build tools are available
# These are needed to install some node modules, especially on linux/arm64
@@ -24,5 +24,5 @@ ENV NODE_OPTIONS="--max_old_space_size=4096"
# Listen / accept connections from all IP addresses.
# NOTE: At this time it is only possible to run Docker container in Production mode
# if you have a public URL. See https://github.com/DSpace/dspace-angular/issues/1485
ENV NODE_ENV development
ENV NODE_ENV=development
CMD yarn serve --host 0.0.0.0

View File

@@ -4,7 +4,7 @@
# Test build:
# docker build -f Dockerfile.dist -t dspace/dspace-angular:dspace-7_x-dist .
FROM node:18-alpine as build
FROM docker.io/node:18-alpine AS build
# Ensure Python and other build tools are available
# These are needed to install some node modules, especially on linux/arm64
@@ -26,6 +26,6 @@ COPY --chown=node:node docker/dspace-ui.json /app/dspace-ui.json
WORKDIR /app
USER node
ENV NODE_ENV production
ENV NODE_ENV=production
EXPOSE 4000
CMD pm2-runtime start dspace-ui.json --json

View File

@@ -30,7 +30,6 @@
"lodash",
"jwt-decode",
"uuid",
"webfontloader",
"zone.js"
],
"outputPath": "dist/browser",

View File

@@ -1,7 +1,7 @@
# NOTE: will log all redux actions and transfers in console
debug: false
# Angular Universal server settings
# Angular User Inteface settings
# NOTE: these settings define where Node.js will start your UI application. Therefore, these
# "ui" settings usually specify a localhost port/URL which is later proxied to a public URL (using Apache or similar)
ui:
@@ -17,12 +17,48 @@ ui:
# Trust X-FORWARDED-* headers from proxies (default = true)
useProxies: true
# Angular Universal / Server Side Rendering (SSR) settings
universal:
# Whether to inline "critical" styles into the server-side rendered HTML.
# Determining which styles are critical is a relatively expensive operation;
# this option can be disabled to boost server performance at the expense of
# loading smoothness. For improved SSR performance, DSpace defaults this to false (disabled).
# Whether to tell Angular to inline "critical" styles into the server-side rendered HTML.
# 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$"
# 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.
enableSearchComponent: false
# Whether to enable rendering of Browse 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.
enableBrowseComponent: false
# Enable state transfer from the server-side application to the client-side application.
# Defaults to true.
# Note: When using an external application cache layer, it's recommended not to transfer the state to avoid caching it.
# Disabling it ensures that dynamic state information is not inadvertently cached, which can improve security and
# ensure that users always use the most up-to-date state.
transferState: true
# When a different REST base URL is used for the server-side application, the generated state contains references to
# REST resources with the internal URL configured. By default, these internal URLs are replaced with public URLs.
# Disable this setting to avoid URL replacement during SSR. In this the state is not transferred to avoid security issues.
replaceRestUrl: true
# The REST API server settings
# NOTE: these settings define which (publicly available) REST API to use. They are usually
@@ -33,6 +69,9 @@ rest:
port: 443
# NOTE: Space is capitalized because 'namespace' is a reserved string in TypeScript
nameSpace: /server
# Provide a different REST url to be used during SSR execution. It must contain the whole url including protocol, server port and
# server namespace (uncomment to use it).
#ssrBaseUrl: http://localhost:8080/server
# Caching settings
cache:
@@ -396,3 +435,31 @@ vocabularies:
comcolSelectionSort:
sortField: 'dc.title'
sortDirection: 'ASC'
# 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
# result of an external event when user focus may be elsewhere.
#
# The DSpace live region is a component present at the bottom of all pages that is invisible by default, but is useful
# for screen readers. Any message pushed to the live region will be announced by the screen reader. These messages
# usually contain information about changes on the page that might not be in focus.
liveRegion:
# The duration after which messages disappear from the live region in milliseconds
messageTimeOutDurationMs: 30000
# The visibility of the live region. Setting this to true is only useful for debugging purposes.
isVisible: false
# Search settings
search:
# Number used to render n UI elements called loading skeletons that act as placeholders.
# These elements indicate that some content will be loaded in their stead.
# Since we don't know how many filters will be loaded before we receive a response from the server we use this parameter for the skeletons count.
# e.g. If we set 5 then 5 loading skeletons will be visualized before the actual filters are retrieved.
defaultFiltersCount: 5
# Configuration for storing accessibility settings, used by the AccessibilitySettingsService
accessibility:
# The duration in days after which the accessibility settings cookie expires
cookieExpirationDuration: 7

View File

@@ -1,6 +1,7 @@
import { defineConfig } from 'cypress';
export default defineConfig({
video: true,
videosFolder: 'cypress/videos',
screenshotsFolder: 'cypress/screenshots',
fixturesFolder: 'cypress/fixtures',
@@ -18,6 +19,7 @@ export default defineConfig({
// Admin account used for administrative tests
DSPACE_TEST_ADMIN_USER: 'dspacedemo+admin@gmail.com',
DSPACE_TEST_ADMIN_USER_UUID: '335647b6-8a52-4ecb-a8c1-7ebabb199bda',
DSPACE_TEST_ADMIN_PASSWORD: 'dspace',
// Community/collection/publication used for view/edit tests
DSPACE_TEST_COMMUNITY: '0958c910-2037-42a9-81c7-dca80e3892b4',
@@ -33,6 +35,8 @@ export default defineConfig({
// Account used to test basic submission process
DSPACE_TEST_SUBMIT_USER: 'dspacedemo+submit@gmail.com',
DSPACE_TEST_SUBMIT_USER_PASSWORD: 'dspace',
// Administrator users group
DSPACE_ADMINISTRATOR_GROUP: 'e59f5659-bff9-451e-b28f-439e7bd467e4'
},
e2e: {
// Setup our plugins for e2e tests

View File

@@ -0,0 +1,54 @@
import { testA11y } from 'cypress/support/utils';
describe('Admin Add New Modals', () => {
beforeEach(() => {
// Must login as an Admin for sidebar to appear
cy.visit('/login');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('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();
// 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('a[data-test="menu.section.new_community"]').click();
// Analyze <ds-create-community-parent-selector> for accessibility
testA11y('ds-create-community-parent-selector');
});
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();
// 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('a[data-test="menu.section.new_collection"]').click();
// Analyze <ds-create-collection-parent-selector> for accessibility
testA11y('ds-create-collection-parent-selector');
});
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();
// 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('a[data-test="menu.section.new_item"]').click();
// Analyze <ds-create-item-parent-selector> for accessibility
testA11y('ds-create-item-parent-selector');
});
});

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Admin Curation Tasks', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/admin/curation-tasks');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Page must first be visible
cy.get('ds-admin-curation-task').should('be.visible');
// Analyze <ds-admin-curation-task> for accessibility issues
testA11y('ds-admin-curation-task');
});
});

View File

@@ -0,0 +1,54 @@
import { testA11y } from 'cypress/support/utils';
describe('Admin Edit Modals', () => {
beforeEach(() => {
// Must login as an Admin for sidebar to appear
cy.visit('/login');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('Edit Community modal should pass accessibility tests', () => {
// Pin the sidebar open
cy.get('#sidebar-collapse-toggle').trigger('mouseover');
cy.get('#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('a[data-test="menu.section.edit_community"]').click();
// Analyze <ds-edit-community-selector> for accessibility
testA11y('ds-edit-community-selector');
});
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();
// 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('a[data-test="menu.section.edit_collection"]').click();
// Analyze <ds-edit-collection-selector> for accessibility
testA11y('ds-edit-collection-selector');
});
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();
// 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('a[data-test="menu.section.edit_item"]').click();
// Analyze <ds-edit-item-selector> for accessibility
testA11y('ds-edit-item-selector');
});
});

View File

@@ -0,0 +1,39 @@
import { testA11y } from 'cypress/support/utils';
describe('Admin Export Modals', () => {
beforeEach(() => {
// Must login as an Admin for sidebar to appear
cy.visit('/login');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('Export metadata modal should pass accessibility tests', () => {
// Pin the sidebar open
cy.get('#sidebar-collapse-toggle').trigger('mouseover');
cy.get('#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('a[data-test="menu.section.export_metadata"]').click();
// Analyze <ds-export-metadata-selector> for accessibility
testA11y('ds-export-metadata-selector');
});
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();
// 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('a[data-test="menu.section.export_batch"]').click();
// Analyze <ds-export-batch-selector> for accessibility
testA11y('ds-export-metadata-selector');
});
});

View File

@@ -0,0 +1,21 @@
import { testA11y } from 'cypress/support/utils';
describe('Admin Search Page', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/admin/search');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
//Page must first be visible
cy.get('ds-admin-search-page').should('be.visible');
// At least one search result should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
// Click each filter toggle to open *every* filter
// (As we want to scan filter section for accessibility issues as well)
cy.get('[data-test="filter-toggle"]').click({ multiple: true });
// Analyze <ds-admin-search-page> for accessibility issues
testA11y('ds-admin-search-page');
});
});

View File

@@ -0,0 +1,21 @@
import { testA11y } from 'cypress/support/utils';
describe('Admin Workflow Page', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/admin/workflow');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Page must first be visible
cy.get('ds-admin-workflow-page').should('be.visible');
// At least one search result should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
// Click each filter toggle to open *every* filter
// (As we want to scan filter section for accessibility issues as well)
cy.get('[data-test="filter-toggle"]').click({ multiple: true });
// Analyze <ds-admin-workflow-page> for accessibility issues
testA11y('ds-admin-workflow-page');
});
});

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Batch Import Page', () => {
beforeEach(() => {
// Must login as an Admin to see processes
cy.visit('/admin/batch-import');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Batch import form must first be visible
cy.get('ds-batch-import-page').should('be.visible');
// Analyze <ds-batch-import-page> for accessibility issues
testA11y('ds-batch-import-page');
});
});

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Bitstreams Formats', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/admin/registries/bitstream-formats');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Page must first be visible
cy.get('ds-bitstream-formats').should('be.visible');
// Analyze <ds-bitstream-formats> for accessibility issues
testA11y('ds-bitstream-formats');
});
});

View File

@@ -0,0 +1,31 @@
import { testA11y } from 'cypress/support/utils';
import { Options } from 'cypress-axe';
describe('Bulk Access', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/access-control/bulk-access');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Page must first be visible
cy.get('ds-bulk-access').should('be.visible');
// At least one search result should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
// Click each filter toggle to open *every* filter
// (As we want to scan filter section for accessibility issues as well)
cy.get('[data-test="filter-toggle"]').click({ multiple: true });
// Analyze <ds-bulk-access> for accessibility issues
testA11y('ds-bulk-access', {
rules: {
// All panels are accordians & fail "aria-required-children" and "nested-interactive".
// Seem to require updating ng-bootstrap and https://github.com/DSpace/dspace-angular/issues/2216
'aria-required-children': { enabled: false },
'nested-interactive': { enabled: false },
// Card titles fail this test currently
'heading-order': { enabled: false },
},
} as Options);
});
});

View File

@@ -3,8 +3,15 @@ import { testA11y } from 'cypress/support/utils';
describe('Collection Page', () => {
it('should pass accessibility tests', () => {
cy.intercept('POST', '/server/api/statistics/viewevents').as('viewevent');
// Visit Collections page
cy.visit('/collections/'.concat(Cypress.env('DSPACE_TEST_COLLECTION')));
// Wait for the "viewevent" to trigger on the Collection page.
// This ensures our <ds-collection-page> tag is fully loaded, as the <ds-view-event> tag is contained within it.
cy.wait('@viewevent');
// <ds-collection-page> tag must be loaded
cy.get('ds-collection-page').should('be.visible');

View File

@@ -6,7 +6,7 @@ describe('Community Statistics Page', () => {
it('should load if you click on "Statistics" from a Community page', () => {
cy.visit('/communities/'.concat(Cypress.env('DSPACE_TEST_COMMUNITY')));
cy.get('ds-navbar ds-link-menu-item a[data-test="link-menu-item.menu.section.statistics"]').click();
cy.get('a[data-test="link-menu-item.menu.section.statistics"]').click();
cy.location('pathname').should('eq', COMMUNITYSTATISTICSPAGE);
});

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Create Eperson', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/access-control/epeople/create');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Form must first be visible
cy.get('ds-eperson-form').should('be.visible');
// Analyze <ds-eperson-form> for accessibility issues
testA11y('ds-eperson-form');
});
});

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Create Group', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/access-control/groups/create');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Form must first be visible
cy.get('ds-group-form').should('be.visible');
// Analyze <ds-group-form> for accessibility issues
testA11y('ds-group-form');
});
});

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Edit Eperson', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/access-control/epeople/'.concat(Cypress.env('DSPACE_TEST_ADMIN_USER_UUID')).concat('/edit'));
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Form must first be visible
cy.get('ds-eperson-form').should('be.visible');
// Analyze <ds-eperson-form> for accessibility issues
testA11y('ds-eperson-form');
});
});

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Edit Group', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/access-control/groups/'.concat(Cypress.env('DSPACE_ADMINISTRATOR_GROUP')).concat('/edit'));
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Form must first be visible
cy.get('ds-group-form').should('be.visible');
// Analyze <ds-group-form> for accessibility issues
testA11y('ds-group-form');
});
});

View File

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

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Epeople registry', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/access-control/epeople');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Epeople registry page must first be visible
cy.get('ds-epeople-registry').should('be.visible');
// Analyze <ds-epeople-registry> for accessibility issues
testA11y('ds-epeople-registry');
});
});

View File

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

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Groups registry', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/access-control/groups');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Epeople registry page must first be visible
cy.get('ds-groups-registry').should('be.visible');
// Analyze <ds-groups-registry> for accessibility issues
testA11y('ds-groups-registry');
});
});

View File

@@ -10,4 +10,29 @@ describe('Header', () => {
// Analyze <ds-header> for accessibility
testA11y('ds-header');
});
it('should allow for changing language to German (for example)', () => {
cy.visit('/');
// Click the language switcher (globe) in header
cy.get('button[data-test="lang-switch"]').click();
// Click on the "Deusch" language in dropdown
cy.get('#language-menu-list div[role="option"]').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');
// 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();
// 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');
});
});

View File

@@ -0,0 +1,62 @@
import { testA11y } from 'cypress/support/utils';
import { Options } from 'cypress-axe';
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/health');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
describe('Health Page > Status Tab', () => {
it('should pass accessibility tests', () => {
cy.intercept('GET', '/server/actuator/health').as('status');
cy.wait('@status');
cy.get('a[data-test="health-page.status-tab"]').click();
// Page must first be visible
cy.get('ds-health-page').should('be.visible');
cy.get('ds-health-panel').should('be.visible');
// wait for all the ds-health-info-component components to be rendered
cy.get('div[role="tabpanel"]').each(($panel: HTMLDivElement) => {
cy.wrap($panel).find('ds-health-component').should('be.visible');
});
// Analyze <ds-health-page> for accessibility issues
testA11y('ds-health-page', {
rules: {
// All panels are accordians & fail "aria-required-children" and "nested-interactive".
// Seem to require updating ng-bootstrap and https://github.com/DSpace/dspace-angular/issues/2216
'aria-required-children': { enabled: false },
'nested-interactive': { enabled: false },
},
} as Options);
});
});
describe('Health Page > Info Tab', () => {
it('should pass accessibility tests', () => {
cy.intercept('GET', '/server/actuator/info').as('info');
cy.wait('@info');
cy.get('a[data-test="health-page.info-tab"]').click();
// Page must first be visible
cy.get('ds-health-page').should('be.visible');
cy.get('ds-health-info').should('be.visible');
// wait for all the ds-health-info-component components to be rendered
cy.get('div[role="tabpanel"]').each(($panel: HTMLDivElement) => {
cy.wrap($panel).find('ds-health-info-component').should('be.visible');
});
// Analyze <ds-health-info> for accessibility issues
testA11y('ds-health-info', {
rules: {
// 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 },
},
} as Options);
});
});

View File

@@ -5,7 +5,7 @@ import '../support/commands';
describe('Site Statistics Page', () => {
it('should load if you click on "Statistics" from homepage', () => {
cy.visit('/');
cy.get('ds-navbar ds-link-menu-item a[data-test="link-menu-item.menu.section.statistics"]').click();
cy.get('a[data-test="link-menu-item.menu.section.statistics"]').click();
cy.location('pathname').should('eq', '/statistics');
});

View File

@@ -1,5 +1,5 @@
import { Options } from 'cypress-axe';
import { testA11y } from 'cypress/support/utils';
import { Options } from 'cypress-axe';
const ITEM_EDIT_PAGE = '/items/'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION')).concat('/edit');
@@ -13,8 +13,13 @@ beforeEach(() => {
describe('Edit Item > Edit Metadata tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="metadata"]').should('be.visible');
cy.get('a[data-test="metadata"]').click();
// Our selected tab should be both visible & active
cy.get('a[data-test="metadata"]').should('be.visible');
cy.get('a[data-test="metadata"]').should('have.class', 'active');
// <ds-edit-item-page> tag must be loaded
cy.get('ds-edit-item-page').should('be.visible');
@@ -31,8 +36,13 @@ describe('Edit Item > Edit Metadata tab', () => {
describe('Edit Item > Status tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="status"]').should('be.visible');
cy.get('a[data-test="status"]').click();
// Our selected tab should be both visible & active
cy.get('a[data-test="status"]').should('be.visible');
cy.get('a[data-test="status"]').should('have.class', 'active');
// <ds-item-status> tag must be loaded
cy.get('ds-item-status').should('be.visible');
@@ -44,8 +54,13 @@ describe('Edit Item > Status tab', () => {
describe('Edit Item > Bitstreams tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="bitstreams"]').should('be.visible');
cy.get('a[data-test="bitstreams"]').click();
// Our selected tab should be both visible & active
cy.get('a[data-test="bitstreams"]').should('be.visible');
cy.get('a[data-test="bitstreams"]').should('have.class', 'active');
// <ds-item-bitstreams> tag must be loaded
cy.get('ds-item-bitstreams').should('be.visible');
@@ -59,8 +74,8 @@ describe('Edit Item > Bitstreams tab', () => {
// Currently Bitstreams page loads a pagination component per Bundle
// and they all use the same 'id="p-dad"'.
'duplicate-id': { enabled: false },
}
} as Options
},
} as Options,
);
});
});
@@ -68,8 +83,13 @@ describe('Edit Item > Bitstreams tab', () => {
describe('Edit Item > Curate tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="curate"]').should('be.visible');
cy.get('a[data-test="curate"]').click();
// Our selected tab should be both visible & active
cy.get('a[data-test="curate"]').should('be.visible');
cy.get('a[data-test="curate"]').should('have.class', 'active');
// <ds-item-curate> tag must be loaded
cy.get('ds-item-curate').should('be.visible');
@@ -81,8 +101,13 @@ describe('Edit Item > Curate tab', () => {
describe('Edit Item > Relationships tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="relationships"]').should('be.visible');
cy.get('a[data-test="relationships"]').click();
// Our selected tab should be both visible & active
cy.get('a[data-test="relationships"]').should('be.visible');
cy.get('a[data-test="relationships"]').should('have.class', 'active');
// <ds-item-relationships> tag must be loaded
cy.get('ds-item-relationships').should('be.visible');
@@ -94,8 +119,13 @@ describe('Edit Item > Relationships tab', () => {
describe('Edit Item > Version History tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="versionhistory"]').should('be.visible');
cy.get('a[data-test="versionhistory"]').click();
// Our selected tab should be both visible & active
cy.get('a[data-test="versionhistory"]').should('be.visible');
cy.get('a[data-test="versionhistory"]').should('have.class', 'active');
// <ds-item-version-history> tag must be loaded
cy.get('ds-item-version-history').should('be.visible');
@@ -107,8 +137,13 @@ describe('Edit Item > Version History tab', () => {
describe('Edit Item > Access Control tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="access-control"]').should('be.visible');
cy.get('a[data-test="access-control"]').click();
// Our selected tab should be both visible & active
cy.get('a[data-test="access-control"]').should('be.visible');
cy.get('a[data-test="access-control"]').should('have.class', 'active');
// <ds-item-access-control> tag must be loaded
cy.get('ds-item-access-control').should('be.visible');
@@ -120,8 +155,13 @@ describe('Edit Item > Access Control tab', () => {
describe('Edit Item > Collection Mapper tab', () => {
it('should pass accessibility tests', () => {
cy.get('a[data-test="mapper"]').should('be.visible');
cy.get('a[data-test="mapper"]').click();
// Our selected tab should be both visible & active
cy.get('a[data-test="mapper"]').should('be.visible');
cy.get('a[data-test="mapper"]').should('have.class', 'active');
// <ds-item-collection-mapper> tag must be loaded
cy.get('ds-item-collection-mapper').should('be.visible');

View File

@@ -7,12 +7,19 @@ describe('Item Page', () => {
// Test that entities will redirect to /entities/[type]/[uuid] when accessed via /items/[uuid]
it('should redirect to the entity page when navigating to an item page', () => {
cy.visit(ITEMPAGE);
cy.wait(1000);
cy.location('pathname').should('eq', ENTITYPAGE);
});
it('should pass accessibility tests', () => {
cy.intercept('POST', '/server/api/statistics/viewevents').as('viewevent');
cy.visit(ENTITYPAGE);
// Wait for the "viewevent" to trigger on the Item page.
// This ensures our <ds-item-page> tag is fully loaded, as the <ds-view-event> tag is contained within it.
cy.wait('@viewevent');
// <ds-item-page> tag must be loaded
cy.get('ds-item-page').should('be.visible');
@@ -21,8 +28,14 @@ describe('Item Page', () => {
});
it('should pass accessibility tests on full item page', () => {
cy.intercept('POST', '/server/api/statistics/viewevents').as('viewevent');
cy.visit(ENTITYPAGE + '/full');
// Wait for the "viewevent" to trigger on the Item page.
// This ensures our <ds-item-page> tag is fully loaded, as the <ds-view-event> tag is contained within it.
cy.wait('@viewevent');
// <ds-full-item-page> tag must be loaded
cy.get('ds-full-item-page').should('be.visible');

View File

@@ -6,7 +6,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.get('a[data-test="link-menu-item.menu.section.statistics"]').click();
cy.location('pathname').should('eq', ITEMSTATISTICSPAGE);
});
@@ -23,8 +23,7 @@ describe('Item Statistics Page', () => {
it('should contain a "Total visits per month" section', () => {
cy.visit(ITEMSTATISTICSPAGE);
// Check just for existence because this table is empty in CI environment as it's historical data
cy.get('.'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION')).concat('_TotalVisitsPerMonth')).should('exist');
cy.get('table[data-test="TotalVisitsPerMonth"]').should('be.visible');
});
it('should pass accessibility tests', () => {

View File

@@ -3,35 +3,35 @@ import { testA11y } from 'cypress/support/utils';
const page = {
openLoginMenu() {
// Click the "Log In" dropdown menu in header
cy.get('ds-themed-header [data-test="login-menu"]').click();
cy.get('[data-test="login-menu"]').click();
},
openUserMenu() {
// Once logged in, click the User menu in header
cy.get('ds-themed-header [data-test="user-menu"]').click();
cy.get('[data-test="user-menu"]').click();
},
submitLoginAndPasswordByPressingButton(email, password) {
// Enter email
cy.get('ds-themed-header [data-test="email"]').type(email);
cy.get('[data-test="email"]').type(email);
// Enter password
cy.get('ds-themed-header [data-test="password"]').type(password);
cy.get('[data-test="password"]').type(password);
// Click login button
cy.get('ds-themed-header [data-test="login-button"]').click();
cy.get('[data-test="login-button"]').click();
},
submitLoginAndPasswordByPressingEnter(email, password) {
// In opened Login modal, fill out email & password, then click Enter
cy.get('ds-themed-header [data-test="email"]').type(email);
cy.get('ds-themed-header [data-test="password"]').type(password);
cy.get('ds-themed-header [data-test="password"]').type('{enter}');
cy.get('[data-test="email"]').type(email);
cy.get('[data-test="password"]').type(password);
cy.get('[data-test="password"]').type('{enter}');
},
submitLogoutByPressingButton() {
// This is the POST command that will actually log us out
cy.intercept('POST', '/server/api/authn/logout').as('logout');
// Click logout button
cy.get('ds-themed-header [data-test="logout-button"]').click();
cy.get('[data-test="logout-button"]').click();
// Wait until above POST command responds before continuing
// (This ensures next action waits until logout completes)
cy.wait('@logout');
}
},
};
describe('Login Modal', () => {
@@ -67,7 +67,7 @@ describe('Login Modal', () => {
// Login, and the <ds-log-in> tag should no longer exist
page.submitLoginAndPasswordByPressingEnter(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
cy.get('.form-login').should('not.exist');
cy.get('ds-log-in').should('not.exist');
// Verify we are still on homepage
cy.url().should('include', '/home');

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Metadata Import Page', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/admin/metadata-import');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Metadata import form must first be visible
cy.get('ds-metadata-import-page').should('be.visible');
// Analyze <ds-metadata-import-page> for accessibility issues
testA11y('ds-metadata-import-page');
});
});

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Metadata Registry', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/admin/registries/metadata');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Page must first be visible
cy.get('ds-metadata-registry').should('be.visible');
// Analyze <ds-metadata-registry> for accessibility issues
testA11y('ds-metadata-registry');
});
});

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Metadata Schema', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/admin/registries/metadata/dc');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Page must first be visible
cy.get('ds-metadata-schema').should('be.visible');
// Analyze <ds-metadata-schema> for accessibility issues
testA11y('ds-metadata-schema');
});
});

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('New Process', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/processes/new');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Process form must first be visible
cy.get('ds-new-process').should('be.visible');
// Analyze <ds-new-process> for accessibility issues
testA11y('ds-new-process');
});
});

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

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

View File

@@ -0,0 +1,17 @@
import { testA11y } from 'cypress/support/utils';
describe('Processes Overview', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/processes');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Process overview must first be visible
cy.get('ds-process-overview').should('be.visible');
// Analyze <ds-process-overview> for accessibility issues
testA11y('ds-process-overview');
});
});

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('Profile page', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/profile');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Process form must first be visible
cy.get('ds-profile-page').should('be.visible');
// Analyze <ds-profile-page> for accessibility issues
testA11y('ds-profile-page');
});
});

View File

@@ -0,0 +1,16 @@
import { testA11y } from 'cypress/support/utils';
describe('System Wide Alert', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/admin/system-wide-alert');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should pass accessibility tests', () => {
// Page must first be visible
cy.get('ds-system-wide-alert-form').should('be.visible');
// Analyze <ds-system-wide-alert-form> for accessibility issues
testA11y('ds-system-wide-alert-form');
});
});

View File

@@ -95,11 +95,11 @@ Cypress.Commands.add('login', login);
*/
function loginViaForm(email: string, password: string): void {
// Enter email
cy.get('ds-log-in [data-test="email"]').type(email);
cy.get('[data-test="email"]').type(email);
// Enter password
cy.get('ds-log-in [data-test="password"]').type(password);
cy.get('[data-test="password"]').type(password);
// Click login button
cy.get('ds-log-in [data-test="login-button"]').click();
cy.get('[data-test="login-button"]').click();
}
// Add as a Cypress command (i.e. assign to 'cy.loginViaForm')
Cypress.Commands.add('loginViaForm', loginViaForm);

View File

@@ -21,7 +21,7 @@ networks:
external: true
services:
dspace-cli:
image: "${DOCKER_OWNER:-dspace}/dspace-cli:${DSPACE_VER:-dspace-7_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-cli:${DSPACE_VER:-dspace-7_x}"
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,7 +14,7 @@
# # Therefore, it should be kept in sync with that file
services:
dspacedb:
image: dspace/dspace-postgres-pgcrypto:loadsql
image: ${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-7_x}-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

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_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-7_x-test}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-7_x-test}"
depends_on:
- dspacedb
networks:
@@ -60,7 +60,7 @@ services:
# NOTE: This is customized to use our loadsql image, so that we are using a database with existing test data
dspacedb:
container_name: dspacedb
image: "${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-7_x-loadsql}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-7_x}-loadsql"
environment:
# This LOADSQL should be kept in sync with the LOADSQL in
# https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/db.entities.yml
@@ -81,7 +81,7 @@ services:
# DSpace Solr container
dspacesolr:
container_name: dspacesolr
image: "${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-7_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-7_x}"
networks:
- dspacenet
ports:

View File

@@ -26,7 +26,7 @@ services:
DSPACE_REST_HOST: demo.dspace.org
DSPACE_REST_PORT: 443
DSPACE_REST_NAMESPACE: /server
image: dspace/dspace-angular:dspace-7_x-dist
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-angular:${DSPACE_VER:-dspace-7_x}-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_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-7_x-test}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-7_x-test}"
depends_on:
- dspacedb
networks:
@@ -67,7 +67,7 @@ services:
dspacedb:
container_name: dspacedb
# Uses a custom Postgres image with pgcrypto installed
image: "${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-7_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-7_x}"
environment:
PGDATA: /pgdata
POSTGRES_PASSWORD: dspace
@@ -84,7 +84,7 @@ services:
# DSpace Solr container
dspacesolr:
container_name: dspacesolr
image: "${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-7_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-7_x}"
networks:
- dspacenet
ports:

View File

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

View File

@@ -1,6 +1,6 @@
{
"name": "dspace-angular",
"version": "7.6.2",
"version": "7.6.6-next",
"scripts": {
"ng": "ng",
"config:watch": "nodemon",
@@ -12,7 +12,6 @@
"preserve": "yarn 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",
@@ -49,27 +48,20 @@
"https": false
},
"private": true,
"resolutions": {
"minimist": "^1.2.5",
"webdriver-manager": "^12.1.8",
"ts-node": "10.2.1"
},
"dependencies": {
"@angular/animations": "^15.2.8",
"@angular/cdk": "^15.2.8",
"@angular/common": "^15.2.8",
"@angular/compiler": "^15.2.8",
"@angular/core": "^15.2.8",
"@angular/forms": "^15.2.8",
"@angular/localize": "15.2.8",
"@angular/platform-browser": "^15.2.8",
"@angular/platform-browser-dynamic": "^15.2.8",
"@angular/platform-server": "^15.2.8",
"@angular/router": "^15.2.8",
"@babel/runtime": "7.21.0",
"@angular/animations": "^15.2.10",
"@angular/cdk": "^15.2.9",
"@angular/common": "^15.2.10",
"@angular/compiler": "^15.2.10",
"@angular/core": "^15.2.10",
"@angular/forms": "^15.2.10",
"@angular/localize": "15.2.10",
"@angular/platform-browser": "^15.2.10",
"@angular/platform-browser-dynamic": "^15.2.10",
"@angular/platform-server": "^15.2.10",
"@angular/router": "^15.2.10",
"@babel/runtime": "7.28.4",
"@kolkov/ngx-gallery": "^2.0.1",
"@material-ui/core": "^4.11.0",
"@material-ui/icons": "^4.11.3",
"@ng-bootstrap/ng-bootstrap": "^11.0.0",
"@ng-dynamic-forms/core": "^15.0.0",
"@ng-dynamic-forms/ui-ng-bootstrap": "^15.0.0",
@@ -79,130 +71,129 @@
"@nguniversal/express-engine": "^15.2.1",
"@ngx-translate/core": "^14.0.0",
"@nicky-lenaers/ngx-scroll-to": "^14.0.0",
"@types/grecaptcha": "^3.0.4",
"angular-idle-preload": "3.0.0",
"angulartics2": "^12.2.0",
"axios": "^1.6.0",
"angulartics2": "^12.2.1",
"axios": "^1.11.0",
"bootstrap": "^4.6.1",
"cerialize": "0.1.18",
"cli-progress": "^3.12.0",
"colors": "^1.4.0",
"compression": "^1.7.4",
"cookie-parser": "1.4.6",
"core-js": "^3.30.1",
"date-fns": "^2.29.3",
"compression": "^1.8.1",
"cookie-parser": "1.4.7",
"core-js": "^3.45.1",
"date-fns": "^2.30.0",
"date-fns-tz": "^1.3.7",
"deepmerge": "^4.3.1",
"ejs": "^3.1.10",
"express": "^4.19.2",
"express": "^4.21.2",
"express-rate-limit": "^5.1.3",
"fast-json-patch": "^3.1.1",
"filesize": "^6.1.0",
"http-proxy-middleware": "^1.0.5",
"http-proxy-middleware": "^2.0.9",
"http-terminator": "^3.2.0",
"isbot": "^3.6.10",
"isbot": "^5.1.30",
"js-cookie": "2.2.1",
"js-yaml": "^4.1.0",
"json5": "^2.2.3",
"jsonschema": "1.4.1",
"jsonschema": "1.5.0",
"jwt-decode": "^3.1.2",
"klaro": "^0.7.18",
"klaro": "^0.7.21",
"lodash": "^4.17.21",
"lru-cache": "^7.14.1",
"markdown-it": "^13.0.1",
"markdown-it": "^13.0.2",
"markdown-it-mathjax3": "^4.3.2",
"mirador": "^3.3.0",
"mirador": "^3.4.3",
"mirador-dl-plugin": "^0.13.0",
"mirador-share-plugin": "^0.11.0",
"morgan": "^1.10.0",
"ng-mocks": "^14.10.0",
"mirador-share-plugin": "^0.16.0",
"morgan": "^1.10.1",
"ng2-file-upload": "1.4.0",
"ng2-nouislider": "^2.0.0",
"ngx-infinite-scroll": "^15.0.0",
"ngx-pagination": "6.0.3",
"ngx-skeleton-loader": "^7.0.0",
"ngx-sortablejs": "^11.1.0",
"ngx-ui-switch": "^14.1.0",
"nouislider": "^15.7.1",
"pem": "1.14.7",
"prop-types": "^15.8.1",
"react-copy-to-clipboard": "^5.1.0",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.8.0",
"sanitize-html": "^2.12.1",
"sortablejs": "1.15.0",
"nouislider": "^15.8.1",
"pem": "1.14.8",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.8.2",
"sanitize-html": "^2.17.0",
"sortablejs": "1.15.6",
"uuid": "^8.3.2",
"webfontloader": "1.6.28",
"zone.js": "~0.11.5"
"zone.js": "~0.13.3"
},
"devDependencies": {
"@angular-builders/custom-webpack": "~15.0.0",
"@angular-devkit/build-angular": "^15.2.6",
"@angular-devkit/build-angular": "^15.2.11",
"@angular-eslint/builder": "15.2.1",
"@angular-eslint/eslint-plugin": "15.2.1",
"@angular-eslint/eslint-plugin-template": "15.2.1",
"@angular-eslint/schematics": "15.2.1",
"@angular-eslint/template-parser": "15.2.1",
"@angular/cli": "^16.0.4",
"@angular/compiler-cli": "^15.2.8",
"@angular/language-service": "^15.2.8",
"@angular/cli": "^16.2.16",
"@angular/compiler-cli": "^15.2.10",
"@angular/language-service": "^15.2.10",
"@cypress/schematic": "^1.5.0",
"@fortawesome/fontawesome-free": "^6.4.0",
"@fortawesome/fontawesome-free": "^6.7.2",
"@material-ui/core": "^4.12.4",
"@material-ui/icons": "^4.11.3",
"@ngrx/store-devtools": "^15.4.0",
"@ngtools/webpack": "^15.2.6",
"@nguniversal/builders": "^15.2.1",
"@types/deep-freeze": "0.1.2",
"@types/ejs": "^3.1.2",
"@types/express": "^4.17.17",
"@types/deep-freeze": "0.1.5",
"@types/ejs": "^3.1.5",
"@types/express": "^4.17.21",
"@types/grecaptcha": "^3.0.9",
"@types/jasmine": "~3.6.0",
"@types/js-cookie": "2.2.6",
"@types/lodash": "^4.14.194",
"@types/node": "^14.14.9",
"@types/sanitize-html": "^2.9.0",
"@typescript-eslint/eslint-plugin": "^5.59.1",
"@typescript-eslint/parser": "^5.59.1",
"axe-core": "^4.7.2",
"@types/lodash": "^4.17.20",
"@types/node": "^14.18.63",
"@types/sanitize-html": "^2.16.0",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"axe-core": "^4.10.3",
"compression-webpack-plugin": "^9.2.0",
"copy-webpack-plugin": "^6.4.1",
"cross-env": "^7.0.3",
"cypress": "12.17.4",
"cypress-axe": "^1.4.0",
"csstype": "^3.1.3",
"cypress": "^13.17.0",
"cypress-axe": "^1.7.0",
"deep-freeze": "0.0.1",
"eslint": "^8.39.0",
"eslint-plugin-deprecation": "^1.4.1",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-deprecation": "^1.5.0",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jsdoc": "^45.0.0",
"eslint-plugin-jsonc": "^2.6.0",
"eslint-plugin-jsonc": "^2.20.1",
"eslint-plugin-lodash": "^7.4.0",
"eslint-plugin-unused-imports": "^2.0.0",
"express-static-gzip": "^2.1.7",
"express-static-gzip": "^2.2.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",
"ngx-mask": "^13.1.7",
"nodemon": "^2.0.22",
"postcss": "^8.4",
"postcss-apply": "0.12.0",
"postcss": "^8.5",
"postcss-import": "^14.0.0",
"postcss-loader": "^4.0.3",
"postcss-preset-env": "^7.4.2",
"postcss-responsive-type": "1.0.0",
"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",
"rxjs-spy": "^8.0.2",
"sass": "~1.62.0",
"sass": "~1.92.1",
"sass-loader": "^12.6.0",
"sass-resources-loader": "^2.2.5",
"ts-node": "^8.10.2",
"typescript": "~4.8.4",
"webpack": "5.76.1",
"webpack-bundle-analyzer": "^4.8.0",
"webpack-cli": "^4.2.0",
"webpack-dev-server": "^4.13.3"
"webpack-dev-server": "^5.2.2"
}
}

View File

@@ -1,8 +1,6 @@
module.exports = {
plugins: [
require('postcss-import')(),
require('postcss-preset-env')(),
require('postcss-apply')(),
require('postcss-responsive-type')()
require('postcss-preset-env')()
]
};

View File

@@ -28,7 +28,7 @@ import * as expressStaticGzip from 'express-static-gzip';
/* eslint-enable import/no-namespace */
import axios from 'axios';
import LRU from 'lru-cache';
import isbot from 'isbot';
import { isbot } from 'isbot';
import { createCertificate } from 'pem';
import { createServer } from 'https';
import { json } from 'body-parser';
@@ -55,6 +55,7 @@ import { APP_CONFIG, AppConfig } from './src/config/app-config.interface';
import { extendEnvironmentWithAppConfig } from './src/config/config.util';
import { logStartupMessage } from './startup-message';
import { TOKENITEM } from './src/app/core/auth/models/auth-token-info.model';
import { SsrExcludePatterns } from './src/config/universal-config.interface';
/*
@@ -79,6 +80,9 @@ let anonymousCache: LRU<string, any>;
// extend environment with app config for server
extendEnvironmentWithAppConfig(environment, appConfig);
// The REST server base URL
const REST_BASE_URL = environment.rest.ssrBaseUrl || environment.rest.baseUrl;
// The Express app is exported so that it can be used by serverless Functions.
export function app() {
@@ -176,7 +180,7 @@ export function app() {
* Proxy the sitemaps
*/
router.use('/sitemap**', createProxyMiddleware({
target: `${environment.rest.baseUrl}/sitemaps`,
target: `${REST_BASE_URL}/sitemaps`,
pathRewrite: path => path.replace(environment.ui.nameSpace, '/'),
changeOrigin: true
}));
@@ -185,7 +189,7 @@ export function app() {
* Proxy the linksets
*/
router.use('/signposting**', createProxyMiddleware({
target: `${environment.rest.baseUrl}`,
target: `${REST_BASE_URL}`,
pathRewrite: path => path.replace(environment.ui.nameSpace, '/'),
changeOrigin: true
}));
@@ -238,7 +242,7 @@ export function app() {
* The callback function to serve server side angular
*/
function ngApp(req, res) {
if (environment.universal.preboot) {
if (environment.universal.preboot && req.method === 'GET' && (req.path === '/' || !isExcludedFromSsr(req.path, environment.universal.excludePathPatterns))) {
// Render the page to user via SSR (server side rendering)
serverSideRender(req, res);
} else {
@@ -269,6 +273,11 @@ function serverSideRender(req, res, sendToUser: boolean = true) {
requestUrl: req.originalUrl,
}, (err, data) => {
if (hasNoValue(err) && hasValue(data)) {
// Replace REST URL with UI URL
if (environment.universal.replaceRestUrl && REST_BASE_URL !== environment.rest.baseUrl) {
data = data.replace(new RegExp(REST_BASE_URL, 'g'), environment.rest.baseUrl);
}
// save server side rendered page to cache (if any are enabled)
saveToCache(req, data);
if (sendToUser) {
@@ -550,8 +559,8 @@ function createHttpsServer(keys) {
* Create an HTTP server with the configured port and host.
*/
function run() {
const port = environment.ui.port || 4000;
const host = environment.ui.host || '/';
const port = environment.ui.port;
const host = environment.ui.host;
// Start up the Node server
const server = app();
@@ -617,11 +626,26 @@ 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
*/
function healthCheck(req, res) {
const baseUrl = `${environment.rest.baseUrl}${environment.actuators.endpointPath}`;
const baseUrl = `${REST_BASE_URL}${environment.actuators.endpointPath}`;
axios.get(baseUrl)
.then((response) => {
res.status(response.status).send(response.data);

View File

@@ -10,7 +10,7 @@
<button class="btn btn-outline-primary mr-3" (click)="reset()">
{{ 'access-control-cancel' | translate }}
</button>
<button class="btn btn-primary" [disabled]="!canExport()" (click)="submit()">
<button class="btn btn-primary" [dsBtnDisabled]="!canExport()" (click)="submit()">
{{ 'access-control-execute' | translate }}
</button>
</div>

View File

@@ -1,5 +1,5 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { NO_ERRORS_SCHEMA, Component } from '@angular/core';
import { TranslateModule } from '@ngx-translate/core';
import { of } from 'rxjs';
@@ -57,10 +57,15 @@ describe('BulkAccessComponent', () => {
'file': { }
};
const mockSettings: any = jasmine.createSpyObj('AccessControlFormContainerComponent', {
getValue: jasmine.createSpy('getValue'),
reset: jasmine.createSpy('reset')
});
@Component({
selector: 'ds-bulk-access-settings',
template: ''
})
class MockBulkAccessSettingsComponent {
isFormValid = jasmine.createSpy('isFormValid').and.returnValue(false);
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'];
@@ -73,7 +78,10 @@ describe('BulkAccessComponent', () => {
RouterTestingModule,
TranslateModule.forRoot()
],
declarations: [ BulkAccessComponent ],
declarations: [
BulkAccessComponent,
MockBulkAccessSettingsComponent,
],
providers: [
{ provide: BulkAccessControlService, useValue: bulkAccessControlServiceMock },
{ provide: NotificationsService, useValue: NotificationsServiceStub },
@@ -102,7 +110,6 @@ describe('BulkAccessComponent', () => {
(component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListStateEmpty));
fixture.detectChanges();
component.settings = mockSettings;
});
it('should create', () => {
@@ -119,13 +126,12 @@ describe('BulkAccessComponent', () => {
});
describe('when there are elements selected', () => {
describe('when there are elements selected and step two form is invalid', () => {
beforeEach(() => {
(component as any).selectableListService.getSelectableList.and.returnValue(of(selectableListState));
fixture.detectChanges();
component.settings = mockSettings;
});
it('should create', () => {
@@ -136,9 +142,9 @@ describe('BulkAccessComponent', () => {
expect(component.objectsSelected$.value).toEqual(expectedIdList);
});
it('should enable the execute button when there are objects selected', () => {
it('should not enable the execute button when there are objects selected and step two form is invalid', () => {
component.objectsSelected$.next(['1234']);
expect(component.canExport()).toBe(true);
expect(component.canExport()).toBe(false);
});
it('should call the settings reset method when reset is called', () => {
@@ -146,6 +152,23 @@ describe('BulkAccessComponent', () => {
expect(component.settings.reset).toHaveBeenCalled();
});
});
describe('when there are elements selectedted 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);
bulkAccessControlService.createPayloadFile.and.returnValue(mockFile);

View File

@@ -37,7 +37,7 @@ export class BulkAccessComponent implements OnInit {
constructor(
private bulkAccessControlService: BulkAccessControlService,
private selectableListService: SelectableListService
private selectableListService: SelectableListService,
) {
}
@@ -51,7 +51,7 @@ export class BulkAccessComponent implements OnInit {
}
canExport(): boolean {
return this.objectsSelected$.value?.length > 0;
return this.objectsSelected$.value?.length > 0 && this.settings?.isFormValid();
}
/**

View File

@@ -31,4 +31,8 @@ export class BulkAccessSettingsComponent {
this.controlForm.reset();
}
isFormValid() {
return this.controlForm.isValid();
}
}

View File

@@ -61,7 +61,7 @@
</thead>
<tbody>
<tr *ngFor="let epersonDto of (ePeopleDto$ | async)?.page"
[ngClass]="{'table-primary' : isActive(epersonDto.eperson) | async}">
[ngClass]="{'table-primary' : (activeEPerson$ | async) === epersonDto.eperson}">
<td>{{epersonDto.eperson.id}}</td>
<td>{{ dsoNameService.getName(epersonDto.eperson) }}</td>
<td>{{epersonDto.eperson.email}}</td>

View File

@@ -27,6 +27,7 @@ import { RequestService } from '../../core/data/request.service';
import { PaginationService } from '../../core/pagination/pagination.service';
import { PaginationServiceStub } from '../../shared/testing/pagination-service.stub';
import { FindListOptions } from '../../core/data/find-list-options.model';
import {BtnDisabledDirective} from '../../shared/btn-disabled.directive';
describe('EPeopleRegistryComponent', () => {
let component: EPeopleRegistryComponent;
@@ -131,7 +132,7 @@ describe('EPeopleRegistryComponent', () => {
}
}),
],
declarations: [EPeopleRegistryComponent],
declarations: [EPeopleRegistryComponent, BtnDisabledDirective],
providers: [
{ provide: EPersonDataService, useValue: ePersonDataServiceStub },
{ provide: NotificationsService, useValue: new NotificationsServiceStub() },
@@ -239,7 +240,8 @@ describe('EPeopleRegistryComponent', () => {
it('should be disabled', () => {
ePeopleDeleteButton = fixture.debugElement.queryAll(By.css('#epeople tr td div button.delete-button'));
ePeopleDeleteButton.forEach((deleteButton: DebugElement) => {
expect(deleteButton.nativeElement.disabled).toBe(true);
expect(deleteButton.nativeElement.getAttribute('aria-disabled')).toBe('true');
expect(deleteButton.nativeElement.classList.contains('disabled')).toBeTrue();
});
});
});

View File

@@ -46,6 +46,8 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy {
*/
ePeopleDto$: BehaviorSubject<PaginatedList<EpersonDtoModel>> = new BehaviorSubject<PaginatedList<EpersonDtoModel>>({} as any);
activeEPerson$: Observable<EPerson>;
/**
* An observable for the pageInfo, needed to pass to the pagination component
*/
@@ -111,6 +113,7 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy {
initialisePage() {
this.searching$.next(true);
this.search({scope: this.currentSearchScope, query: this.currentSearchQuery});
this.activeEPerson$ = this.epersonService.getActiveEPerson();
this.subs.push(this.ePeople$.pipe(
switchMap((epeople: PaginatedList<EPerson>) => {
if (epeople.pageInfo.totalElements > 0) {
@@ -178,23 +181,6 @@ export class EPeopleRegistryComponent implements OnInit, OnDestroy {
);
}
/**
* Checks whether the given EPerson is active (being edited)
* @param eperson
*/
isActive(eperson: EPerson): Observable<boolean> {
return this.getActiveEPerson().pipe(
map((activeEPerson) => eperson === activeEPerson)
);
}
/**
* Gets the active eperson (being edited)
*/
getActiveEPerson(): Observable<EPerson> {
return this.epersonService.getActiveEPerson();
}
/**
* Deletes EPerson, show notification on success/failure & updates EPeople list
*/

View File

@@ -2,7 +2,7 @@
<div class="group-form row">
<div class="col-12">
<div *ngIf="epersonService.getActiveEPerson() | async; then editHeader; else createHeader"></div>
<div *ngIf="activeEPerson$ | async; then editHeader; else createHeader"></div>
<ng-template #createHeader>
<h1 class="border-bottom pb-2">{{messagePrefix + '.create' | translate}}</h1>
@@ -25,7 +25,7 @@
</button>
</div>
<div *ngIf="displayResetPassword" between class="btn-group">
<button class="btn btn-primary" [disabled]="!(canReset$ | async)" type="button" (click)="resetPassword()">
<button class="btn btn-primary" [dsBtnDisabled]="!(canReset$ | async)" type="button" (click)="resetPassword()">
<i class="fa fa-key"></i> {{'admin.access-control.epeople.actions.reset' | translate}}
</button>
</div>
@@ -44,7 +44,7 @@
<ds-themed-loading [showMessage]="false" *ngIf="!formGroup"></ds-themed-loading>
<div *ngIf="epersonService.getActiveEPerson() | async">
<div *ngIf="activeEPerson$ | async">
<h2>{{messagePrefix + '.groupsEPersonIsMemberOf' | translate}}</h2>
<ds-themed-loading [showMessage]="false" *ngIf="!(groups | async)"></ds-themed-loading>
@@ -75,7 +75,9 @@
{{ dsoNameService.getName(group) }}
</a>
</td>
<td class="align-middle">{{ dsoNameService.getName(undefined) }}</td>
<td class="align-middle">
{{ dsoNameService.getName((group.object | async)?.payload) }}
</td>
</tr>
</tbody>
</table>

View File

@@ -1,11 +1,11 @@
import { Observable, of as observableOf } from 'rxjs';
import { CommonModule } from '@angular/common';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
import { BrowserModule, By } from '@angular/platform-browser';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
import { TranslateModule } from '@ngx-translate/core';
import { buildPaginatedList, PaginatedList } from '../../../core/data/paginated-list.model';
import { RemoteData } from '../../../core/data/remote-data';
import { EPersonDataService } from '../../../core/eperson/eperson-data.service';
@@ -19,7 +19,6 @@ import { EPersonMock, EPersonMock2 } from '../../../shared/testing/eperson.mock'
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
import { getMockFormBuilderService } from '../../../shared/mocks/form-builder-service.mock';
import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub';
import { TranslateLoaderMock } from '../../../shared/mocks/translate-loader.mock';
import { AuthService } from '../../../core/auth/auth.service';
import { AuthServiceStub } from '../../../shared/testing/auth-service.stub';
import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service';
@@ -35,6 +34,8 @@ import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model
import { ActivatedRoute, Router } from '@angular/router';
import { RouterStub } from '../../../shared/testing/router.stub';
import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub';
import { RouterTestingModule } from '@angular/router/testing';
import {BtnDisabledDirective} from '../../../shared/btn-disabled.directive';
describe('EPersonFormComponent', () => {
let component: EPersonFormComponent;
@@ -59,9 +60,6 @@ describe('EPersonFormComponent', () => {
ePersonDataServiceStub = {
activeEPerson: null,
allEpeople: mockEPeople,
getEPeople(): Observable<RemoteData<PaginatedList<EPerson>>> {
return createSuccessfulRemoteDataObject$(buildPaginatedList(null, this.allEpeople));
},
getActiveEPerson(): Observable<EPerson> {
return observableOf(this.activeEPerson);
},
@@ -195,14 +193,10 @@ describe('EPersonFormComponent', () => {
router = new RouterStub();
TestBed.configureTestingModule({
imports: [CommonModule, NgbModule, FormsModule, ReactiveFormsModule, BrowserModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: TranslateLoaderMock
}
}),
RouterTestingModule,
TranslateModule.forRoot(),
],
declarations: [EPersonFormComponent],
declarations: [EPersonFormComponent, BtnDisabledDirective],
providers: [
{ provide: EPersonDataService, useValue: ePersonDataServiceStub },
{ provide: GroupDataService, useValue: groupsDataService },
@@ -217,7 +211,7 @@ describe('EPersonFormComponent', () => {
{ provide: Router, useValue: router },
EPeopleRegistryComponent
],
schemas: [NO_ERRORS_SCHEMA]
schemas: [CUSTOM_ELEMENTS_SCHEMA],
}).compileComponents();
}));
@@ -236,37 +230,13 @@ describe('EPersonFormComponent', () => {
});
describe('check form validation', () => {
let firstName;
let lastName;
let email;
let canLogIn;
let requireCertificate;
let canLogIn: boolean;
let requireCertificate: boolean;
let expected;
beforeEach(() => {
firstName = 'testName';
lastName = 'testLastName';
email = 'testEmail@test.com';
canLogIn = false;
requireCertificate = false;
expected = Object.assign(new EPerson(), {
metadata: {
'eperson.firstname': [
{
value: firstName
}
],
'eperson.lastname': [
{
value: lastName
},
],
},
email: email,
canLogIn: canLogIn,
requireCertificate: requireCertificate,
});
spyOn(component.submitForm, 'emit');
component.canLogIn.value = canLogIn;
component.requireCertificate.value = requireCertificate;
@@ -340,15 +310,13 @@ describe('EPersonFormComponent', () => {
expect(component.formGroup.controls.email.errors.emailTaken).toBeTruthy();
});
});
});
describe('when submitting the form', () => {
let firstName;
let lastName;
let email;
let canLogIn;
let canLogIn: boolean;
let requireCertificate;
let expected;
@@ -377,6 +345,7 @@ describe('EPersonFormComponent', () => {
requireCertificate: requireCertificate,
});
spyOn(component.submitForm, 'emit');
component.ngOnInit();
component.firstName.value = firstName;
component.lastName.value = lastName;
component.email.value = email;
@@ -416,9 +385,17 @@ describe('EPersonFormComponent', () => {
email: email,
canLogIn: canLogIn,
requireCertificate: requireCertificate,
_links: undefined
_links: {
groups: {
href: '',
},
self: {
href: '',
},
},
});
spyOn(ePersonDataServiceStub, 'getActiveEPerson').and.returnValue(observableOf(expectedWithId));
component.ngOnInit();
component.onSubmit();
fixture.detectChanges();
});
@@ -466,22 +443,19 @@ describe('EPersonFormComponent', () => {
});
describe('delete', () => {
let ePersonId;
let eperson: EPerson;
let modalService;
beforeEach(() => {
spyOn(authService, 'impersonate').and.callThrough();
ePersonId = 'testEPersonId';
eperson = EPersonMock;
component.epersonInitial = eperson;
component.canDelete$ = observableOf(true);
spyOn(component.epersonService, 'getActiveEPerson').and.returnValue(observableOf(eperson));
modalService = (component as any).modalService;
spyOn(modalService, 'open').and.returnValue(Object.assign({ componentInstance: Object.assign({ response: observableOf(true) }) }));
component.ngOnInit();
fixture.detectChanges();
});
it('the delete button should be visible if the ePerson can be deleted', () => {
@@ -508,7 +482,8 @@ describe('EPersonFormComponent', () => {
// ePersonDataServiceStub.activeEPerson = eperson;
spyOn(component.epersonService, 'deleteEPerson').and.returnValue(createSuccessfulRemoteDataObject$('No Content', 204));
const deleteButton = fixture.debugElement.query(By.css('.delete-button'));
expect(deleteButton.nativeElement.disabled).toBe(false);
expect(deleteButton.nativeElement.getAttribute('aria-disabled')).toBeNull();
expect(deleteButton.nativeElement.classList.contains('disabled')).toBeFalse();
deleteButton.triggerEventHandler('click', null);
fixture.detectChanges();
expect(component.epersonService.deleteEPerson).toHaveBeenCalledWith(eperson);

View File

@@ -139,6 +139,11 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
*/
canImpersonate$: Observable<boolean>;
/**
* The current {@link EPerson}
*/
activeEPerson$: Observable<EPerson>;
/**
* List of subscriptions
*/
@@ -199,7 +204,11 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
protected route: ActivatedRoute,
protected router: Router,
) {
this.subs.push(this.epersonService.getActiveEPerson().subscribe((eperson: EPerson) => {
}
ngOnInit() {
this.activeEPerson$ = this.epersonService.getActiveEPerson();
this.subs.push(this.activeEPerson$.subscribe((eperson: EPerson) => {
this.epersonInitial = eperson;
if (hasValue(eperson)) {
this.isImpersonated = this.authService.isImpersonatingUser(eperson.id);
@@ -207,9 +216,6 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
this.submitLabel = 'form.submit';
}
}));
}
ngOnInit() {
this.initialisePage();
}
@@ -217,20 +223,14 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
* This method will initialise the page
*/
initialisePage() {
if (this.route.snapshot.params.id) {
this.subs.push(this.epersonService.findById(this.route.snapshot.params.id).subscribe((ePersonRD: RemoteData<EPerson>) => {
this.epersonService.editEPerson(ePersonRD.payload);
}));
observableCombineLatest([
this.translateService.get(`${this.messagePrefix}.firstName`),
this.translateService.get(`${this.messagePrefix}.lastName`),
this.translateService.get(`${this.messagePrefix}.email`),
this.translateService.get(`${this.messagePrefix}.canLogIn`),
this.translateService.get(`${this.messagePrefix}.requireCertificate`),
this.translateService.get(`${this.messagePrefix}.emailHint`),
]).subscribe(([firstName, lastName, email, canLogIn, requireCertificate, emailHint]) => {
}
this.firstName = new DynamicInputModel({
id: 'firstName',
label: firstName,
label: this.translateService.instant(`${this.messagePrefix}.firstName`),
name: 'firstName',
validators: {
required: null,
@@ -239,7 +239,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
});
this.lastName = new DynamicInputModel({
id: 'lastName',
label: lastName,
label: this.translateService.instant(`${this.messagePrefix}.lastName`),
name: 'lastName',
validators: {
required: null,
@@ -248,7 +248,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
});
this.email = new DynamicInputModel({
id: 'email',
label: email,
label: this.translateService.instant(`${this.messagePrefix}.email`),
name: 'email',
validators: {
required: null,
@@ -259,19 +259,19 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
emailTaken: 'error.validation.emailTaken',
pattern: 'error.validation.NotValidEmail'
},
hint: emailHint
hint: this.translateService.instant(`${this.messagePrefix}.emailHint`),
});
this.canLogIn = new DynamicCheckboxModel(
{
id: 'canLogIn',
label: canLogIn,
label: this.translateService.instant(`${this.messagePrefix}.canLogIn`),
name: 'canLogIn',
value: (this.epersonInitial != null ? this.epersonInitial.canLogIn : true)
});
this.requireCertificate = new DynamicCheckboxModel(
{
id: 'requireCertificate',
label: requireCertificate,
label: this.translateService.instant(`${this.messagePrefix}.requireCertificate`),
name: 'requireCertificate',
value: (this.epersonInitial != null ? this.epersonInitial.requireCertificate : false)
});
@@ -283,12 +283,12 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
this.requireCertificate,
];
this.formGroup = this.formBuilderService.createFormGroup(this.formModel);
this.subs.push(this.epersonService.getActiveEPerson().subscribe((eperson: EPerson) => {
this.subs.push(this.activeEPerson$.subscribe((eperson: EPerson) => {
if (eperson != null) {
this.groups = this.groupsDataService.findListByHref(eperson._links.groups.href, {
currentPage: 1,
elementsPerPage: this.config.pageSize
});
}, undefined, undefined, followLink('object'));
}
this.formGroup.patchValue({
firstName: eperson != null ? eperson.firstMetadataValue('eperson.firstname') : '',
@@ -306,9 +306,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
}
}));
const activeEPerson$ = this.epersonService.getActiveEPerson();
this.groups = activeEPerson$.pipe(
this.groups = this.activeEPerson$.pipe(
switchMap((eperson) => {
return observableCombineLatest([observableOf(eperson), this.paginationService.getFindListOptions(this.config.id, {
currentPage: 1,
@@ -323,7 +321,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
})
);
this.canImpersonate$ = activeEPerson$.pipe(
this.canImpersonate$ = this.activeEPerson$.pipe(
switchMap((eperson) => {
if (hasValue(eperson)) {
return this.authorizationService.isAuthorized(FeatureID.LoginOnBehalfOf, eperson.self);
@@ -332,11 +330,10 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
}
})
);
this.canDelete$ = activeEPerson$.pipe(
this.canDelete$ = this.activeEPerson$.pipe(
switchMap((eperson) => this.authorizationService.isAuthorized(FeatureID.CanDelete, hasValue(eperson) ? eperson.self : undefined))
);
this.canReset$ = observableOf(true);
});
}
/**
@@ -355,7 +352,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
* Emit the updated/created eperson using the EventEmitter submitForm
*/
onSubmit() {
this.epersonService.getActiveEPerson().pipe(take(1)).subscribe(
this.activeEPerson$.pipe(take(1)).subscribe(
(ePerson: EPerson) => {
const values = {
metadata: {
@@ -474,7 +471,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
* It'll either show a success or error message depending on whether the delete was successful or not.
*/
delete(): void {
this.epersonService.getActiveEPerson().pipe(
this.activeEPerson$.pipe(
take(1),
switchMap((eperson: EPerson) => {
const modalRef = this.modalService.open(ConfirmationModalComponent);
@@ -578,7 +575,7 @@ export class EPersonFormComponent implements OnInit, OnDestroy {
* Update the list of groups by fetching it from the rest api or cache
*/
private updateGroups(options) {
this.subs.push(this.epersonService.getActiveEPerson().subscribe((eperson: EPerson) => {
this.subs.push(this.activeEPerson$.subscribe((eperson: EPerson) => {
this.groups = this.groupsDataService.findListByHref(eperson._links.groups.href, options);
}));
}

View File

@@ -2,7 +2,7 @@
<div class="group-form row">
<div class="col-12">
<div *ngIf="groupDataService.getActiveGroup() | async; then editHeader; else createHeader"></div>
<div *ngIf="activeGroup$ | async; then editHeader; else createHeader"></div>
<ng-template #createHeader>
<h1 class="border-bottom pb-2">{{messagePrefix + '.head.create' | translate}}</h1>
@@ -23,11 +23,15 @@
</h1>
</ng-template>
<ds-alert *ngIf="groupBeingEdited?.permanent" [type]="AlertTypeEnum.Warning"
<ng-container *ngIf="(activeGroup$ | async) as groupBeingEdited">
<ds-alert *ngIf="groupBeingEdited?.permanent" [type]="AlertType.Warning"
[content]="messagePrefix + '.alert.permanent'"></ds-alert>
<ds-alert *ngIf="!(canEdit$ | async) && (groupDataService.getActiveGroup() | async)" [type]="AlertTypeEnum.Warning"
[content]="(messagePrefix + '.alert.workflowGroup' | translate:{ name: dsoNameService.getName((getLinkedDSO(groupBeingEdited) | async)?.payload), comcol: (getLinkedDSO(groupBeingEdited) | async)?.payload?.type, comcolEditRolesRoute: (getLinkedEditRolesRoute(groupBeingEdited) | async) })">
<ng-container *ngIf="(activeGroupLinkedDSO$ | async) as activeGroupLinkedDSO">
<ds-alert *ngIf="!(canEdit$ | async)" [type]="AlertType.Warning"
[content]="(messagePrefix + '.alert.workflowGroup' | translate:{ name: dsoNameService.getName(activeGroupLinkedDSO), comcol: activeGroupLinkedDSO.type, comcolEditRolesRoute: (linkedEditRolesRoute$ | async) })">
</ds-alert>
</ng-container>
</ng-container>
<ds-form [formId]="formId"
[formModel]="formModel"
@@ -39,22 +43,21 @@
<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) && !groupBeingEdited?.permanent" class="btn-group">
<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>
<ng-container *ngIf="(activeGroup$ | async) as groupBeingEdited">
<div class="mb-5">
<ds-members-list *ngIf="groupBeingEdited != null"
[messagePrefix]="messagePrefix + '.members-list'"></ds-members-list>
</div>
<ds-subgroups-list *ngIf="groupBeingEdited != null"
[messagePrefix]="messagePrefix + '.subgroups-list'"></ds-subgroups-list>
</ng-container>
</div>
</div>
</div>

View File

@@ -1,13 +1,13 @@
import { CommonModule } from '@angular/common';
import { HttpClient } from '@angular/common/http';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { UntypedFormControl, UntypedFormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
import { BrowserModule, By } from '@angular/platform-browser';
import { ActivatedRoute, Router } from '@angular/router';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { Store } from '@ngrx/store';
import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
import { TranslateModule } from '@ngx-translate/core';
import { Observable, of as observableOf } from 'rxjs';
import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service';
import { ObjectCacheService } from '../../../core/cache/object-cache.service';
@@ -30,8 +30,6 @@ import { GroupMock, GroupMock2 } from '../../../shared/testing/group-mock';
import { GroupFormComponent } from './group-form.component';
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
import { getMockFormBuilderService } from '../../../shared/mocks/form-builder-service.mock';
import { getMockTranslateService } from '../../../shared/mocks/translate.service.mock';
import { TranslateLoaderMock } from '../../../shared/testing/translate-loader.mock';
import { RouterMock } from '../../../shared/mocks/router.mock';
import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub';
import { Operation } from 'fast-json-patch';
@@ -39,23 +37,26 @@ import { ValidateGroupExists } from './validators/group-exists.validator';
import { NoContent } from '../../../core/shared/NoContent.model';
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
import { DSONameServiceMock } from '../../../shared/mocks/dso-name.service.mock';
import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub';
import { routeServiceStub } from '../../../shared/testing/route-service.stub';
import { RouteService } from '../../../core/services/route.service';
describe('GroupFormComponent', () => {
let component: GroupFormComponent;
let fixture: ComponentFixture<GroupFormComponent>;
let translateService: TranslateService;
let builderService: FormBuilderService;
let ePersonDataServiceStub: any;
let groupsDataServiceStub: any;
let dsoDataServiceStub: any;
let authorizationService: AuthorizationDataService;
let notificationService: NotificationsServiceStub;
let router;
let router: RouterMock;
let route: ActivatedRouteStub;
let groups;
let groupName;
let groupDescription;
let expected;
let groups: Group[];
let groupName: string;
let groupDescription: string;
let expected: Group;
beforeEach(waitForAsync(() => {
groups = [GroupMock, GroupMock2];
@@ -70,6 +71,15 @@ describe('GroupFormComponent', () => {
}
],
},
object: createSuccessfulRemoteDataObject$(undefined),
_links: {
self: {
href: 'group-selflink',
},
object: {
href: 'group-objectlink',
}
},
});
ePersonDataServiceStub = {};
groupsDataServiceStub = {
@@ -106,7 +116,14 @@ describe('GroupFormComponent', () => {
create(group: Group): Observable<RemoteData<Group>> {
this.allGroups = [...this.allGroups, group];
this.createdGroup = Object.assign({}, group, {
_links: { self: { href: 'group-selflink' } }
_links: {
self: {
href: 'group-selflink',
},
object: {
href: 'group-objectlink',
},
},
});
return createSuccessfulRemoteDataObject$(this.createdGroup);
},
@@ -188,17 +205,13 @@ describe('GroupFormComponent', () => {
return typeof value === 'object' && value !== null;
}
});
translateService = getMockTranslateService();
router = new RouterMock();
route = new ActivatedRouteStub();
notificationService = new NotificationsServiceStub();
return TestBed.configureTestingModule({
imports: [CommonModule, NgbModule, FormsModule, ReactiveFormsModule, BrowserModule,
TranslateModule.forRoot({
loader: {
provide: TranslateLoader,
useClass: TranslateLoaderMock
}
}),
TranslateModule.forRoot(),
],
declarations: [GroupFormComponent],
providers: [
@@ -216,14 +229,12 @@ describe('GroupFormComponent', () => {
{ provide: Store, useValue: {} },
{ provide: RemoteDataBuildService, useValue: {} },
{ provide: HALEndpointService, useValue: {} },
{
provide: ActivatedRoute,
useValue: { data: observableOf({ dso: { payload: {} } }), params: observableOf({}) }
},
{ provide: ActivatedRoute, useValue: route },
{ provide: Router, useValue: router },
{ provide: AuthorizationDataService, useValue: authorizationService },
{ provide: RouteService, useValue: routeServiceStub },
],
schemas: [NO_ERRORS_SCHEMA]
schemas: [CUSTOM_ELEMENTS_SCHEMA],
}).compileComponents();
}));
@@ -236,8 +247,8 @@ describe('GroupFormComponent', () => {
describe('when submitting the form', () => {
beforeEach(() => {
spyOn(component.submitForm, 'emit');
component.groupName.value = groupName;
component.groupDescription.value = groupDescription;
component.groupName.setValue(groupName);
component.groupDescription.setValue(groupDescription);
});
describe('without active Group', () => {
beforeEach(() => {
@@ -245,14 +256,22 @@ describe('GroupFormComponent', () => {
fixture.detectChanges();
});
it('should emit a new group using the correct values', (async () => {
await fixture.whenStable().then(() => {
expect(component.submitForm.emit).toHaveBeenCalledWith(expected);
});
it('should emit a new group using the correct values', (() => {
expect(component.submitForm.emit).toHaveBeenCalledWith(jasmine.objectContaining({
name: groupName,
metadata: {
'dc.description': [
{
value: groupDescription,
},
],
},
}));
}));
});
describe('with active Group', () => {
let expected2;
let expected2: Group;
beforeEach(() => {
expected2 = Object.assign(new Group(), {
name: 'newGroupName',
@@ -263,15 +282,24 @@ describe('GroupFormComponent', () => {
}
],
},
object: createSuccessfulRemoteDataObject$(undefined),
_links: {
self: {
href: 'group-selflink',
},
object: {
href: 'group-objectlink',
},
},
});
spyOn(groupsDataServiceStub, 'getActiveGroup').and.returnValue(observableOf(expected));
spyOn(groupsDataServiceStub, 'patch').and.returnValue(createSuccessfulRemoteDataObject$(expected2));
component.groupName.value = 'newGroupName';
component.onSubmit();
fixture.detectChanges();
component.ngOnInit();
});
it('should edit with name and description operations', () => {
component.groupName.setValue('newGroupName');
component.onSubmit();
const operations = [{
op: 'add',
path: '/metadata/dc.description',
@@ -285,9 +313,8 @@ describe('GroupFormComponent', () => {
});
it('should edit with description operations', () => {
component.groupName.value = null;
component.groupName.setValue(null);
component.onSubmit();
fixture.detectChanges();
const operations = [{
op: 'add',
path: '/metadata/dc.description',
@@ -297,9 +324,9 @@ describe('GroupFormComponent', () => {
});
it('should edit with name operations', () => {
component.groupDescription.value = null;
component.groupName.setValue('newGroupName');
component.groupDescription.setValue(null);
component.onSubmit();
fixture.detectChanges();
const operations = [{
op: 'replace',
path: '/name',
@@ -308,12 +335,13 @@ describe('GroupFormComponent', () => {
expect(groupsDataServiceStub.patch).toHaveBeenCalledWith(expected, operations);
});
it('should emit the existing group using the correct new values', (async () => {
await fixture.whenStable().then(() => {
it('should emit the existing group using the correct new values', () => {
component.onSubmit();
expect(component.submitForm.emit).toHaveBeenCalledWith(expected2);
});
}));
it('should emit success notification', () => {
component.onSubmit();
expect(notificationService.success).toHaveBeenCalled();
});
});
@@ -328,11 +356,8 @@ describe('GroupFormComponent', () => {
describe('check form validation', () => {
let groupCommunity;
beforeEach(() => {
groupName = 'testName';
groupCommunity = 'testgroupCommunity';
groupDescription = 'testgroupDescription';
expected = Object.assign(new Group(), {
@@ -344,8 +369,17 @@ describe('GroupFormComponent', () => {
}
],
},
_links: {
self: {
href: 'group-selflink',
},
object: {
href: 'group-objectlink',
},
},
});
spyOn(component.submitForm, 'emit');
spyOn(dsoDataServiceStub, 'findByHref').and.returnValue(observableOf(expected));
fixture.detectChanges();
component.initialisePage();
@@ -395,21 +429,20 @@ describe('GroupFormComponent', () => {
});
describe('delete', () => {
let deleteButton;
beforeEach(() => {
component.initialisePage();
let deleteButton: HTMLButtonElement;
beforeEach(async () => {
spyOn(groupsDataServiceStub, 'delete').and.callThrough();
component.activeGroup$ = observableOf({
id: 'active-group',
permanent: false,
} as Group);
component.canEdit$ = observableOf(true);
component.groupBeingEdited = {
permanent: false
} as Group;
component.initialisePage();
fixture.detectChanges();
deleteButton = fixture.debugElement.query(By.css('.delete-button')).nativeElement;
spyOn(groupsDataServiceStub, 'delete').and.callThrough();
spyOn(groupsDataServiceStub, 'getActiveGroup').and.returnValue(observableOf({ id: 'active-group' }));
});
describe('if confirmed via modal', () => {

View File

@@ -1,5 +1,5 @@
import { Component, EventEmitter, HostListener, OnDestroy, OnInit, Output, ChangeDetectorRef } from '@angular/core';
import { UntypedFormGroup } from '@angular/forms';
import { UntypedFormGroup, AbstractControl } from '@angular/forms';
import { ActivatedRoute, Router } from '@angular/router';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import {
@@ -12,10 +12,9 @@ import { TranslateService } from '@ngx-translate/core';
import {
combineLatest as observableCombineLatest,
Observable,
of as observableOf,
Subscription,
} from 'rxjs';
import { catchError, map, switchMap, take, filter, debounceTime } from 'rxjs/operators';
import { map, switchMap, take, debounceTime } from 'rxjs/operators';
import { getCollectionEditRolesRoute } from '../../../collection-page/collection-page-routing-paths';
import { getCommunityEditRolesRoute } from '../../../community-page/community-page-routing-paths';
import { DSpaceObjectDataService } from '../../../core/data/dspace-object-data.service';
@@ -24,17 +23,16 @@ import { FeatureID } from '../../../core/data/feature-authorization/feature-id';
import { PaginatedList } from '../../../core/data/paginated-list.model';
import { RemoteData } from '../../../core/data/remote-data';
import { RequestService } from '../../../core/data/request.service';
import { EPersonDataService } from '../../../core/eperson/eperson-data.service';
import { GroupDataService } from '../../../core/eperson/group-data.service';
import { Group } from '../../../core/eperson/models/group.model';
import { Collection } from '../../../core/shared/collection.model';
import { Community } from '../../../core/shared/community.model';
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import {
getAllCompletedRemoteData,
getRemoteDataPayload,
getFirstSucceededRemoteData,
getFirstCompletedRemoteData,
getFirstSucceededRemoteDataPayload
} from '../../../core/shared/operators';
import { AlertType } from '../../../shared/alert/alert-type';
import { ConfirmationModalComponent } from '../../../shared/confirmation-modal/confirmation-modal.component';
@@ -48,6 +46,7 @@ import { ValidateGroupExists } from './validators/group-exists.validator';
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
import { environment } from '../../../../environments/environment';
import { getGroupEditRoute, getGroupsRoute } from '../../access-control-routing-paths';
import { RouteService } from '../../../core/services/route.service';
@Component({
selector: 'ds-group-form',
@@ -68,9 +67,9 @@ export class GroupFormComponent implements OnInit, OnDestroy {
/**
* Dynamic models for the inputs of form
*/
groupName: DynamicInputModel;
groupCommunity: DynamicInputModel;
groupDescription: DynamicTextAreaModel;
groupName: AbstractControl;
groupCommunity: AbstractControl;
groupDescription: AbstractControl;
/**
* A list of all dynamic input models
@@ -113,21 +112,30 @@ export class GroupFormComponent implements OnInit, OnDestroy {
*/
subs: Subscription[] = [];
/**
* Group currently being edited
*/
groupBeingEdited: Group;
/**
* Observable whether or not the logged in user is allowed to delete the Group & doesn't have a linked object (community / collection linked to workspace group
*/
canEdit$: Observable<boolean>;
/**
* The AlertType enumeration
* @type {AlertType}
* The current {@link Group}
*/
public AlertTypeEnum = AlertType;
activeGroup$: Observable<Group>;
/**
* The current {@link Group}'s linked {@link Community}/{@link Collection}
*/
activeGroupLinkedDSO$: Observable<DSpaceObject>;
/**
* Link to the current {@link Group}'s {@link Community}/{@link Collection} edit role tab
*/
linkedEditRolesRoute$: Observable<string>;
/**
* The AlertType enumeration
*/
public readonly AlertType = AlertType;
/**
* Subscription to email field value change
@@ -137,78 +145,77 @@ export class GroupFormComponent implements OnInit, OnDestroy {
constructor(
public groupDataService: GroupDataService,
private ePersonDataService: EPersonDataService,
private dSpaceObjectDataService: DSpaceObjectDataService,
private formBuilderService: FormBuilderService,
private translateService: TranslateService,
private notificationsService: NotificationsService,
private route: ActivatedRoute,
protected dSpaceObjectDataService: DSpaceObjectDataService,
protected formBuilderService: FormBuilderService,
protected translateService: TranslateService,
protected notificationsService: NotificationsService,
protected route: ActivatedRoute,
protected router: Router,
private authorizationService: AuthorizationDataService,
private modalService: NgbModal,
protected authorizationService: AuthorizationDataService,
protected modalService: NgbModal,
public requestService: RequestService,
protected changeDetectorRef: ChangeDetectorRef,
public dsoNameService: DSONameService,
protected routeService: RouteService,
) {
}
ngOnInit() {
ngOnInit(): void {
if (this.route.snapshot.params.groupId !== 'newGroup') {
this.setActiveGroup(this.route.snapshot.params.groupId);
}
this.activeGroup$ = this.groupDataService.getActiveGroup();
this.activeGroupLinkedDSO$ = this.getActiveGroupLinkedDSO();
this.linkedEditRolesRoute$ = this.getLinkedEditRolesRoute();
this.canEdit$ = this.activeGroupLinkedDSO$.pipe(
switchMap((dso: DSpaceObject) => {
if (hasValue(dso)) {
return [false];
} else {
return this.activeGroup$.pipe(
hasValueOperator(),
switchMap((group: Group) => this.authorizationService.isAuthorized(FeatureID.CanDelete, group.self)),
);
}
}),
);
this.initialisePage();
}
initialisePage() {
this.subs.push(this.route.params.subscribe((params) => {
if (params.groupId !== 'newGroup') {
this.setActiveGroup(params.groupId);
}
}));
this.canEdit$ = this.groupDataService.getActiveGroup().pipe(
hasValueOperator(),
switchMap((group: Group) => {
return observableCombineLatest([
this.authorizationService.isAuthorized(FeatureID.CanDelete, isNotEmpty(group) ? group.self : undefined),
this.hasLinkedDSO(group),
]).pipe(
map(([isAuthorized, hasLinkedDSO]: [boolean, boolean]) => isAuthorized && !hasLinkedDSO),
);
}),
);
observableCombineLatest([
this.translateService.get(`${this.messagePrefix}.groupName`),
this.translateService.get(`${this.messagePrefix}.groupCommunity`),
this.translateService.get(`${this.messagePrefix}.groupDescription`)
]).subscribe(([groupName, groupCommunity, groupDescription]) => {
this.groupName = new DynamicInputModel({
const groupNameModel = new DynamicInputModel({
id: 'groupName',
label: groupName,
label: this.translateService.instant(`${this.messagePrefix}.groupName`),
name: 'groupName',
validators: {
required: null,
},
required: true,
});
this.groupCommunity = new DynamicInputModel({
const groupCommunityModel = new DynamicInputModel({
id: 'groupCommunity',
label: groupCommunity,
label: this.translateService.instant(`${this.messagePrefix}.groupCommunity`),
name: 'groupCommunity',
required: false,
readOnly: true,
});
this.groupDescription = new DynamicTextAreaModel({
const groupDescriptionModel = new DynamicTextAreaModel({
id: 'groupDescription',
label: groupDescription,
label: this.translateService.instant(`${this.messagePrefix}.groupDescription`),
name: 'groupDescription',
required: false,
spellCheck: environment.form.spellCheck,
});
this.formModel = [
this.groupName,
this.groupDescription,
groupNameModel,
groupDescriptionModel,
];
this.formGroup = this.formBuilderService.createFormGroup(this.formModel);
this.groupName = this.formGroup.get('groupName');
this.groupDescription = this.formGroup.get('groupDescription');
if (!!this.formGroup.controls.groupName) {
this.formGroup.controls.groupName.setAsyncValidators(ValidateGroupExists.createValidator(this.groupDataService));
if (hasValue(this.groupName)) {
this.groupName.setAsyncValidators(ValidateGroupExists.createValidator(this.groupDataService));
this.groupNameValueChangeSubscribe = this.groupName.valueChanges.pipe(debounceTime(300)).subscribe(() => {
this.changeDetectorRef.detectChanges();
});
@@ -216,10 +223,9 @@ export class GroupFormComponent implements OnInit, OnDestroy {
this.subs.push(
observableCombineLatest([
this.groupDataService.getActiveGroup(),
this.activeGroup$,
this.canEdit$,
this.groupDataService.getActiveGroup()
.pipe(filter((activeGroup) => hasValue(activeGroup)),switchMap((activeGroup) => this.getLinkedDSO(activeGroup).pipe(getFirstSucceededRemoteDataPayload())))
this.activeGroupLinkedDSO$,
]).subscribe(([activeGroup, canEdit, linkedObject]) => {
if (activeGroup != null) {
@@ -227,36 +233,34 @@ export class GroupFormComponent implements OnInit, OnDestroy {
// Disable group name exists validator
this.formGroup.controls.groupName.clearAsyncValidators();
this.groupBeingEdited = activeGroup;
if (linkedObject?.name) {
if (isNotEmpty(linkedObject?.name)) {
if (!this.formGroup.controls.groupCommunity) {
this.formBuilderService.insertFormGroupControl(1, this.formGroup, this.formModel, this.groupCommunity);
this.formBuilderService.insertFormGroupControl(1, this.formGroup, this.formModel, groupCommunityModel);
this.groupDescription = this.formGroup.get('groupCommunity');
}
this.formGroup.patchValue({
groupName: activeGroup.name,
groupCommunity: linkedObject?.name ?? '',
groupDescription: activeGroup.firstMetadataValue('dc.description'),
});
}
} else {
this.formModel = [
this.groupName,
this.groupDescription,
groupNameModel,
groupDescriptionModel,
];
this.formGroup.patchValue({
groupName: activeGroup.name,
groupDescription: activeGroup.firstMetadataValue('dc.description'),
});
}
setTimeout(() => {
if (!canEdit || activeGroup.permanent) {
this.formGroup.disable();
} else {
this.formGroup.enable();
}
}, 200);
}
})
);
});
}
/**
@@ -265,7 +269,11 @@ export class GroupFormComponent implements OnInit, OnDestroy {
onCancel() {
this.groupDataService.cancelEditGroup();
this.cancelForm.emit();
void this.router.navigate([getGroupsRoute()]);
this.routeService.getPreviousUrl().pipe(
take(1),
).subscribe((previousURL) => {
void this.router.navigate([previousURL && previousURL.trim().length > 0 ? previousURL : getGroupsRoute()]);
});
}
/**
@@ -275,25 +283,22 @@ export class GroupFormComponent implements OnInit, OnDestroy {
* Emit the updated/created eperson using the EventEmitter submitForm
*/
onSubmit() {
this.groupDataService.getActiveGroup().pipe(take(1)).subscribe(
(group: Group) => {
const values = {
this.activeGroup$.pipe(take(1)).subscribe((group: Group) => {
if (group === null) {
this.createNewGroup({
name: this.groupName.value,
metadata: {
'dc.description': [
{
value: this.groupDescription.value
}
]
value: this.groupDescription.value,
},
};
if (group === null) {
this.createNewGroup(values);
],
},
});
} else {
this.editGroup(group);
}
}
);
});
}
/**
@@ -399,7 +404,7 @@ export class GroupFormComponent implements OnInit, OnDestroy {
* @param groupSelfLink SelfLink of group to set as active
*/
setActiveGroupWithLink(groupSelfLink: string) {
this.groupDataService.getActiveGroup().pipe(take(1)).subscribe((activeGroup: Group) => {
this.activeGroup$.pipe(take(1)).subscribe((activeGroup: Group) => {
if (activeGroup === null) {
this.groupDataService.cancelEditGroup();
this.groupDataService.findByHref(groupSelfLink, false, false, followLink('subgroups'), followLink('epersons'), followLink('object'))
@@ -418,7 +423,7 @@ export class GroupFormComponent implements OnInit, OnDestroy {
* It'll either show a success or error message depending on whether the delete was successful or not.
*/
delete() {
this.groupDataService.getActiveGroup().pipe(take(1)).subscribe((group: Group) => {
this.activeGroup$.pipe(take(1)).subscribe((group: Group) => {
const modalRef = this.modalService.open(ConfirmationModalComponent);
modalRef.componentInstance.dso = group;
modalRef.componentInstance.headerLabel = this.messagePrefix + '.delete-group.modal.header';
@@ -462,52 +467,38 @@ export class GroupFormComponent implements OnInit, OnDestroy {
}
/**
* Check if group has a linked object (community or collection linked to a workflow group)
* @param group
* Get the active {@link Group}'s linked object if it has one ({@link Community} or {@link Collection} linked to a
* workflow group)
*/
hasLinkedDSO(group: Group): Observable<boolean> {
if (hasValue(group) && hasValue(group._links.object.href)) {
return this.getLinkedDSO(group).pipe(
map((rd: RemoteData<DSpaceObject>) => {
return hasValue(rd) && hasValue(rd.payload);
}),
catchError(() => observableOf(false)),
);
}
}
/**
* Get group's linked object if it has one (community or collection linked to a workflow group)
* @param group
*/
getLinkedDSO(group: Group): Observable<RemoteData<DSpaceObject>> {
if (hasValue(group) && hasValue(group._links.object.href)) {
getActiveGroupLinkedDSO(): Observable<DSpaceObject> {
return this.activeGroup$.pipe(
hasValueOperator(),
switchMap((group: Group) => {
if (group.object === undefined) {
return this.dSpaceObjectDataService.findByHref(group._links.object.href);
}
return group.object;
}
}),
getAllCompletedRemoteData(),
getRemoteDataPayload(),
);
}
/**
* Get the route to the edit roles tab of the group's linked object (community or collection linked to a workflow group) if it has one
* @param group
* Get the route to the edit roles tab of the active {@link Group}'s linked object (community or collection linked
* to a workflow group) if it has one
*/
getLinkedEditRolesRoute(group: Group): Observable<string> {
if (hasValue(group) && hasValue(group._links.object.href)) {
return this.getLinkedDSO(group).pipe(
map((rd: RemoteData<DSpaceObject>) => {
if (hasValue(rd) && hasValue(rd.payload)) {
const dso = rd.payload;
getLinkedEditRolesRoute(): Observable<string> {
return this.activeGroupLinkedDSO$.pipe(
hasValueOperator(),
map((dso: DSpaceObject) => {
switch ((dso as any).type) {
case Community.type.value:
return getCommunityEditRolesRoute(rd.payload.id);
return getCommunityEditRolesRoute(dso.id);
case Collection.type.value:
return getCollectionEditRolesRoute(rd.payload.id);
return getCollectionEditRolesRoute(dso.id);
}
}
})
}),
);
}
}
}

View File

@@ -34,7 +34,7 @@
<td class="align-middle">
<div class="btn-group edit-field">
<button (click)="deleteMemberFromGroup(eperson)"
[disabled]="actionConfig.remove.disabled"
[dsBtnDisabled]="actionConfig.remove.disabled"
[ngClass]="['btn btn-sm', actionConfig.remove.css]"
title="{{messagePrefix + '.table.edit.buttons.remove' | translate: { name: dsoNameService.getName(eperson) } }}">
<i [ngClass]="actionConfig.remove.icon"></i>
@@ -114,7 +114,7 @@
<td class="align-middle">
<div class="btn-group edit-field">
<button (click)="addMemberToGroup(eperson)"
[disabled]="actionConfig.add.disabled"
[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>

View File

@@ -69,7 +69,7 @@
<i class="fas fa-edit fa-fw"></i>
</button>
<button *ngSwitchCase="false"
[disabled]="true"
[dsBtnDisabled]="true"
class="btn btn-outline-primary btn-sm btn-edit"
placement="left"
[ngbTooltip]="'admin.access-control.epeople.table.edit.buttons.edit-disabled' | translate"

View File

@@ -34,6 +34,7 @@ import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { NoContent } from '../../core/shared/NoContent.model';
import { DSONameService } from '../../core/breadcrumbs/dso-name.service';
import { DSONameServiceMock, UNDEFINED_NAME } from '../../shared/mocks/dso-name.service.mock';
import {BtnDisabledDirective} from '../../shared/btn-disabled.directive';
describe('GroupsRegistryComponent', () => {
let component: GroupsRegistryComponent;
@@ -171,7 +172,7 @@ describe('GroupsRegistryComponent', () => {
}
}),
],
declarations: [GroupsRegistryComponent],
declarations: [GroupsRegistryComponent, BtnDisabledDirective],
providers: [GroupsRegistryComponent,
{ provide: DSONameService, useValue: new DSONameServiceMock() },
{ provide: EPersonDataService, useValue: ePersonDataServiceStub },
@@ -231,7 +232,8 @@ describe('GroupsRegistryComponent', () => {
const editButtonsFound = fixture.debugElement.queryAll(By.css('#groups tr td:nth-child(5) button.btn-edit'));
expect(editButtonsFound.length).toEqual(2);
editButtonsFound.forEach((editButtonFound) => {
expect(editButtonFound.nativeElement.disabled).toBeFalse();
expect(editButtonFound.nativeElement.getAttribute('aria-disabled')).toBeNull();
expect(editButtonFound.nativeElement.classList.contains('disabled')).toBeFalse();
});
});
@@ -265,7 +267,8 @@ describe('GroupsRegistryComponent', () => {
const editButtonsFound = fixture.debugElement.queryAll(By.css('#groups tr td:nth-child(5) button.btn-edit'));
expect(editButtonsFound.length).toEqual(2);
editButtonsFound.forEach((editButtonFound) => {
expect(editButtonFound.nativeElement.disabled).toBeFalse();
expect(editButtonFound.nativeElement.getAttribute('aria-disabled')).toBeNull();
expect(editButtonFound.nativeElement.classList.contains('disabled')).toBeFalse();
});
});
});
@@ -284,7 +287,8 @@ describe('GroupsRegistryComponent', () => {
const editButtonsFound = fixture.debugElement.queryAll(By.css('#groups tr td:nth-child(5) button.btn-edit'));
expect(editButtonsFound.length).toEqual(2);
editButtonsFound.forEach((editButtonFound) => {
expect(editButtonFound.nativeElement.disabled).toBeTrue();
expect(editButtonFound.nativeElement.getAttribute('aria-disabled')).toBe('true');
expect(editButtonFound.nativeElement.classList.contains('disabled')).toBeTrue();
});
});
});

View File

@@ -0,0 +1,11 @@
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

@@ -0,0 +1,410 @@
import {
AccessibilitySettingsService,
AccessibilitySettings,
ACCESSIBILITY_SETTINGS_METADATA_KEY,
ACCESSIBILITY_COOKIE, AccessibilitySettingsFormValues, FullAccessibilitySettings
} from './accessibility-settings.service';
import { CookieService } from '../core/services/cookie.service';
import { AuthService } from '../core/auth/auth.service';
import { EPersonDataService } from '../core/eperson/eperson-data.service';
import { CookieServiceMock } from '../shared/mocks/cookie.service.mock';
import { AuthServiceStub } from '../shared/testing/auth-service.stub';
import { of } from 'rxjs';
import { EPerson } from '../core/eperson/models/eperson.model';
import { fakeAsync, flush } from '@angular/core/testing';
import { createSuccessfulRemoteDataObject$, createFailedRemoteDataObject$ } from '../shared/remote-data.utils';
import { KlaroServiceStub } from '../shared/cookies/klaro.service.stub';
import { AppConfig } from '../../config/app-config.interface';
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

@@ -0,0 +1,44 @@
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

@@ -0,0 +1,361 @@
import { Inject, Injectable, Optional } from '@angular/core';
import { Observable, of, switchMap, combineLatest } from 'rxjs';
import { map, take } from 'rxjs/operators';
import { CookieService } from '../core/services/cookie.service';
import { hasValue, isNotEmpty, hasNoValue } from '../shared/empty.util';
import { AuthService } from '../core/auth/auth.service';
import { EPerson } from '../core/eperson/models/eperson.model';
import { EPersonDataService } from '../core/eperson/eperson-data.service';
import { getFirstCompletedRemoteData } from '../core/shared/operators';
import cloneDeep from 'lodash/cloneDeep';
import { environment } from '../../environments/environment';
import { createSuccessfulRemoteDataObject$ } from '../shared/remote-data.utils';
import { KlaroService } from '../shared/cookies/klaro.service';
import { AppConfig, APP_CONFIG } from '../../config/app-config.interface';
/**
* 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

@@ -9,9 +9,9 @@
<ds-pagination
*ngIf="(bitstreamFormats | async)?.payload?.totalElements > 0"
*ngIf="(bitstreamFormats$ | async)?.payload?.totalElements > 0"
[paginationOptions]="pageConfig"
[collectionSize]="(bitstreamFormats | async)?.payload?.totalElements"
[collectionSize]="(bitstreamFormats$ | async)?.payload?.totalElements"
[hideGear]="false"
[hidePagerWhenSinglePage]="true">
<div class="table-responsive">
@@ -26,12 +26,12 @@
</tr>
</thead>
<tbody>
<tr *ngFor="let bitstreamFormat of (bitstreamFormats | async)?.payload?.page">
<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]="isSelected(bitstreamFormat) | async"
[checked]="(selectedBitstreamFormatIDs$ | async)?.includes(bitstreamFormat.id)"
(change)="selectBitStreamFormat(bitstreamFormat, $event)"
>
<span class="sr-only">{{'admin.registries.bitstream-formats.select' | translate}}}</span>
@@ -46,13 +46,13 @@
</table>
</div>
</ds-pagination>
<div *ngIf="(bitstreamFormats | async)?.payload?.totalElements == 0" class="alert alert-info" role="alert">
<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>
<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>
</div>
</div>
</div>

View File

@@ -16,8 +16,7 @@ import { NotificationsServiceStub } from '../../../shared/testing/notifications-
import { BitstreamFormat } from '../../../core/shared/bitstream-format.model';
import { BitstreamFormatSupportLevel } from '../../../core/shared/bitstream-format-support-level';
import { XSRFService } from '../../../core/xsrf/xsrf.service';
import { cold, getTestScheduler, hot } from 'jasmine-marbles';
import { TestScheduler } from 'rxjs/testing';
import { hot } from 'jasmine-marbles';
import {
createNoContentRemoteDataObject$,
createSuccessfulRemoteDataObject,
@@ -32,7 +31,6 @@ describe('BitstreamFormatsComponent', () => {
let comp: BitstreamFormatsComponent;
let fixture: ComponentFixture<BitstreamFormatsComponent>;
let bitstreamFormatService;
let scheduler: TestScheduler;
let notificationsServiceStub;
let paginationService;
@@ -87,8 +85,6 @@ describe('BitstreamFormatsComponent', () => {
const initAsync = () => {
notificationsServiceStub = new NotificationsServiceStub();
scheduler = getTestScheduler();
bitstreamFormatService = jasmine.createSpyObj('bitstreamFormatService', {
findAll: observableOf(mockFormatsRD),
find: createSuccessfulRemoteDataObject$(mockFormatsList[0]),
@@ -180,17 +176,17 @@ describe('BitstreamFormatsComponent', () => {
beforeEach(waitForAsync(initAsync));
beforeEach(initBeforeEach);
it('should return an observable of true if the provided bistream is in the list returned by the service', () => {
const result = comp.isSelected(bitstreamFormat1);
expect(result).toBeObservable(cold('b', { b: true }));
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', () => {
const format = new BitstreamFormat();
format.uuid = 'new';
const result = comp.isSelected(format);
expect(result).toBeObservable(cold('b', { b: false }));
comp.selectedBitstreamFormatIDs().subscribe((selectedBitstreamFormatIDs: string[]) => {
expect(selectedBitstreamFormatIDs).not.toContain(format.id);
});
});
});
@@ -216,8 +212,6 @@ describe('BitstreamFormatsComponent', () => {
beforeEach(waitForAsync(() => {
notificationsServiceStub = new NotificationsServiceStub();
scheduler = getTestScheduler();
bitstreamFormatService = jasmine.createSpyObj('bitstreamFormatService', {
findAll: observableOf(mockFormatsRD),
find: createSuccessfulRemoteDataObject$(mockFormatsList[0]),
@@ -265,8 +259,6 @@ describe('BitstreamFormatsComponent', () => {
beforeEach(waitForAsync(() => {
notificationsServiceStub = new NotificationsServiceStub();
scheduler = getTestScheduler();
bitstreamFormatService = jasmine.createSpyObj('bitstreamFormatService', {
findAll: observableOf(mockFormatsRD),
find: createSuccessfulRemoteDataObject$(mockFormatsList[0]),

View File

@@ -1,5 +1,5 @@
import { Component, OnDestroy, OnInit } from '@angular/core';
import { combineLatest as observableCombineLatest, Observable} from 'rxjs';
import { Observable} from 'rxjs';
import { RemoteData } from '../../../core/data/remote-data';
import { PaginatedList } from '../../../core/data/paginated-list.model';
import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model';
@@ -7,7 +7,6 @@ import { BitstreamFormat } from '../../../core/shared/bitstream-format.model';
import { BitstreamFormatDataService } from '../../../core/data/bitstream-format-data.service';
import { map, mergeMap, switchMap, take, toArray } from 'rxjs/operators';
import { NotificationsService } from '../../../shared/notifications/notifications.service';
import { Router } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
import { NoContent } from '../../../core/shared/NoContent.model';
import { PaginationService } from '../../../core/pagination/pagination.service';
@@ -26,7 +25,12 @@ export class BitstreamFormatsComponent implements OnInit, OnDestroy {
/**
* A paginated list of bitstream formats to be shown on the page
*/
bitstreamFormats: Observable<RemoteData<PaginatedList<BitstreamFormat>>>;
bitstreamFormats$: Observable<RemoteData<PaginatedList<BitstreamFormat>>>;
/**
* The currently selected {@link BitstreamFormat} IDs
*/
selectedBitstreamFormatIDs$: Observable<string[]>;
/**
* The current pagination configuration for the page
@@ -39,7 +43,6 @@ export class BitstreamFormatsComponent implements OnInit, OnDestroy {
});
constructor(private notificationsService: NotificationsService,
private router: Router,
private translateService: TranslateService,
private bitstreamFormatService: BitstreamFormatDataService,
private paginationService: PaginationService,
@@ -94,14 +97,11 @@ export class BitstreamFormatsComponent implements OnInit, OnDestroy {
}
/**
* Checks whether a given bitstream format is selected in the list (checkbox)
* @param bitstreamFormat
* Returns the list of all the bitstream formats that are selected in the list (checkbox)
*/
isSelected(bitstreamFormat: BitstreamFormat): Observable<boolean> {
selectedBitstreamFormatIDs(): Observable<string[]> {
return this.bitstreamFormatService.getSelectedBitstreamFormats().pipe(
map((bitstreamFormats: BitstreamFormat[]) => {
return bitstreamFormats.find((selectedFormat) => selectedFormat.id === bitstreamFormat.id) != null;
})
map((bitstreamFormats: BitstreamFormat[]) => bitstreamFormats.map((selectedFormat) => selectedFormat.id)),
);
}
@@ -125,27 +125,23 @@ export class BitstreamFormatsComponent implements OnInit, OnDestroy {
const prefix = 'admin.registries.bitstream-formats.delete';
const suffix = success ? 'success' : 'failure';
const messages = observableCombineLatest(
this.translateService.get(`${prefix}.${suffix}.head`),
this.translateService.get(`${prefix}.${suffix}.amount`, {amount: amount})
);
messages.subscribe(([head, content]) => {
const head: string = this.translateService.instant(`${prefix}.${suffix}.head`);
const content: string = this.translateService.instant(`${prefix}.${suffix}.amount`, { amount: amount });
if (success) {
this.notificationsService.success(head, content);
} else {
this.notificationsService.error(head, content);
}
});
}
ngOnInit(): void {
this.bitstreamFormats = this.paginationService.getFindListOptions(this.pageConfig.id, this.pageConfig).pipe(
this.bitstreamFormats$ = this.paginationService.getFindListOptions(this.pageConfig.id, this.pageConfig).pipe(
switchMap((findListOptions: FindListOptions) => {
return this.bitstreamFormatService.findAll(findListOptions);
})
);
this.selectedBitstreamFormatIDs$ = this.selectedBitstreamFormatIDs();
}

View File

@@ -27,14 +27,15 @@
</thead>
<tbody>
<tr *ngFor="let schema of (metadataSchemas | async)?.payload?.page"
[ngClass]="{'table-primary' : isActive(schema) | async}">
[ngClass]="{'table-primary' : (activeMetadataSchema$ | async)?.id === schema.id}">
<td>
<label class="mb-0">
<input type="checkbox"
[checked]="isSelected(schema) | async"
[checked]="(selectedMetadataSchemaIDs$ | async)?.includes(schema.id)"
(change)="selectMetadataSchema(schema, $event)"
>
<span class="sr-only">{{((isSelected(schema) | async) ? 'admin.registries.metadata.schemas.deselect' : 'admin.registries.metadata.schemas.select') | translate}}</span>
<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>

View File

@@ -1,7 +1,6 @@
import { MetadataRegistryComponent } from './metadata-registry.component';
import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing';
import { of as observableOf } from 'rxjs';
import { buildPaginatedList } from '../../../core/data/paginated-list.model';
import { TranslateModule } from '@ngx-translate/core';
import { By } from '@angular/platform-browser';
import { CommonModule } from '@angular/common';
@@ -15,18 +14,21 @@ import { HostWindowService } from '../../../shared/host-window.service';
import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core';
import { NotificationsService } from '../../../shared/notifications/notifications.service';
import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub';
import { RestResponse } from '../../../core/cache/response.models';
import { MetadataSchema } from '../../../core/metadata/metadata-schema.model';
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
import { PaginationService } from '../../../core/pagination/pagination.service';
import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub';
import { RegistryServiceStub } from '../../../shared/testing/registry.service.stub';
import { createPaginatedList } from '../../../shared/testing/utils.test';
describe('MetadataRegistryComponent', () => {
let comp: MetadataRegistryComponent;
let fixture: ComponentFixture<MetadataRegistryComponent>;
let registryService: RegistryService;
let paginationService;
const mockSchemasList = [
let paginationService: PaginationServiceStub;
let registryService: RegistryServiceStub;
const mockSchemasList: MetadataSchema[] = [
{
id: 1,
_links: {
@@ -47,32 +49,18 @@ describe('MetadataRegistryComponent', () => {
prefix: 'mock',
namespace: 'http://dspace.org/mockschema'
}
];
const mockSchemas = createSuccessfulRemoteDataObject$(buildPaginatedList(null, mockSchemasList));
/* eslint-disable no-empty,@typescript-eslint/no-empty-function */
const registryServiceStub = {
getMetadataSchemas: () => mockSchemas,
getActiveMetadataSchema: () => observableOf(undefined),
getSelectedMetadataSchemas: () => observableOf([]),
editMetadataSchema: (schema) => {
},
cancelEditMetadataSchema: () => {
},
deleteMetadataSchema: () => observableOf(new RestResponse(true, 200, 'OK')),
deselectAllMetadataSchema: () => {
},
clearMetadataSchemaRequests: () => observableOf(undefined)
};
/* eslint-enable no-empty, @typescript-eslint/no-empty-function */
paginationService = new PaginationServiceStub();
] as MetadataSchema[];
beforeEach(waitForAsync(() => {
paginationService = new PaginationServiceStub();
registryService = new RegistryServiceStub();
spyOn(registryService, 'getMetadataSchemas').and.returnValue(createSuccessfulRemoteDataObject$(createPaginatedList(mockSchemasList)));
TestBed.configureTestingModule({
imports: [CommonModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule],
declarations: [MetadataRegistryComponent, PaginationComponent, EnumKeysPipe],
providers: [
{ provide: RegistryService, useValue: registryServiceStub },
{ provide: RegistryService, useValue: registryService },
{ provide: HostWindowService, useValue: new HostWindowServiceStub(0) },
{ provide: PaginationService, useValue: paginationService },
{ provide: NotificationsService, useValue: new NotificationsServiceStub() }
@@ -123,7 +111,7 @@ describe('MetadataRegistryComponent', () => {
}));
it('should cancel editing the selected schema when clicked again', waitForAsync(() => {
spyOn(registryService, 'getActiveMetadataSchema').and.returnValue(observableOf(mockSchemasList[0] as MetadataSchema));
comp.activeMetadataSchema$ = observableOf(mockSchemasList[0] as MetadataSchema);
spyOn(registryService, 'cancelEditMetadataSchema');
row.click();
fixture.detectChanges();
@@ -138,7 +126,7 @@ describe('MetadataRegistryComponent', () => {
beforeEach(() => {
spyOn(registryService, 'deleteMetadataSchema').and.callThrough();
spyOn(registryService, 'getSelectedMetadataSchemas').and.returnValue(observableOf(selectedSchemas as MetadataSchema[]));
comp.selectedMetadataSchemaIDs$ = observableOf(selectedSchemas.map((selectedSchema: MetadataSchema) => selectedSchema.id));
comp.deleteSchemas();
fixture.detectChanges();
});

View File

@@ -1,13 +1,11 @@
import { Component } from '@angular/core';
import { Component, OnInit, OnDestroy } from '@angular/core';
import { RegistryService } from '../../../core/registry/registry.service';
import { BehaviorSubject, combineLatest as observableCombineLatest, Observable, zip } from 'rxjs';
import { BehaviorSubject, Observable, zip, Subscription } from 'rxjs';
import { RemoteData } from '../../../core/data/remote-data';
import { PaginatedList } from '../../../core/data/paginated-list.model';
import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model';
import { filter, map, switchMap, take } from 'rxjs/operators';
import { hasValue } from '../../../shared/empty.util';
import { NotificationsService } from '../../../shared/notifications/notifications.service';
import { Router } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
import { MetadataSchema } from '../../../core/metadata/metadata-schema.model';
import { toFindListOptions } from '../../../shared/pagination/pagination.utils';
@@ -24,13 +22,23 @@ import { PaginationService } from '../../../core/pagination/pagination.service';
* A component used for managing all existing metadata schemas within the repository.
* The admin can create, edit or delete metadata schemas here.
*/
export class MetadataRegistryComponent {
export class MetadataRegistryComponent implements OnDestroy, OnInit {
/**
* A list of all the current metadata schemas within the repository
*/
metadataSchemas: Observable<RemoteData<PaginatedList<MetadataSchema>>>;
/**
* The {@link MetadataSchema}that is being edited
*/
activeMetadataSchema$: Observable<MetadataSchema>;
/**
* The selected {@link MetadataSchema} IDs
*/
selectedMetadataSchemaIDs$: Observable<number[]>;
/**
* Pagination config used to display the list of metadata schemas
*/
@@ -40,15 +48,25 @@ export class MetadataRegistryComponent {
});
/**
* Whether or not the list of MetadataSchemas needs an update
* Whether the list of MetadataSchemas needs an update
*/
needsUpdate$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);
constructor(private registryService: RegistryService,
private notificationsService: NotificationsService,
private router: Router,
private paginationService: PaginationService,
private translateService: TranslateService) {
subscriptions: Subscription[] = [];
constructor(
protected registryService: RegistryService,
protected notificationsService: NotificationsService,
protected paginationService: PaginationService,
protected translateService: TranslateService,
) {
}
ngOnInit(): void {
this.activeMetadataSchema$ = this.registryService.getActiveMetadataSchema();
this.selectedMetadataSchemaIDs$ = this.registryService.getSelectedMetadataSchemas().pipe(
map((schemas: MetadataSchema[]) => schemas.map((schema: MetadataSchema) => schema.id)),
);
this.updateSchemas();
}
@@ -77,30 +95,13 @@ export class MetadataRegistryComponent {
* @param schema
*/
editSchema(schema: MetadataSchema) {
this.getActiveSchema().pipe(take(1)).subscribe((activeSchema) => {
this.subscriptions.push(this.activeMetadataSchema$.pipe(take(1)).subscribe((activeSchema: MetadataSchema) => {
if (schema === activeSchema) {
this.registryService.cancelEditMetadataSchema();
} else {
this.registryService.editMetadataSchema(schema);
}
});
}
/**
* Checks whether the given metadata schema is active (being edited)
* @param schema
*/
isActive(schema: MetadataSchema): Observable<boolean> {
return this.getActiveSchema().pipe(
map((activeSchema) => schema === activeSchema)
);
}
/**
* Gets the active metadata schema (being edited)
*/
getActiveSchema(): Observable<MetadataSchema> {
return this.registryService.getActiveMetadataSchema();
}));
}
/**
@@ -114,31 +115,16 @@ export class MetadataRegistryComponent {
this.registryService.deselectMetadataSchema(schema);
}
/**
* Checks whether a given metadata schema is selected in the list (checkbox)
* @param schema
*/
isSelected(schema: MetadataSchema): Observable<boolean> {
return this.registryService.getSelectedMetadataSchemas().pipe(
map((schemas) => schemas.find((selectedSchema) => selectedSchema === schema) != null)
);
}
/**
* Delete all the selected metadata schemas
*/
deleteSchemas() {
this.registryService.getSelectedMetadataSchemas().pipe(take(1)).subscribe(
(schemas) => {
const tasks$ = [];
for (const schema of schemas) {
if (hasValue(schema.id)) {
tasks$.push(this.registryService.deleteMetadataSchema(schema.id).pipe(getFirstCompletedRemoteData()));
}
}
zip(...tasks$).subscribe((responses: RemoteData<NoContent>[]) => {
const successResponses = responses.filter((response: RemoteData<NoContent>) => response.hasSucceeded);
const failedResponses = responses.filter((response: RemoteData<NoContent>) => response.hasFailed);
this.subscriptions.push(this.selectedMetadataSchemaIDs$.pipe(
take(1),
switchMap((schemaIDs: number[]) => zip(schemaIDs.map((schemaID: number) => this.registryService.deleteMetadataSchema(schemaID).pipe(getFirstCompletedRemoteData())))),
).subscribe((responses: RemoteData<NoContent>[]) => {
const successResponses: RemoteData<NoContent>[] = responses.filter((response: RemoteData<NoContent>) => response.hasSucceeded);
const failedResponses: RemoteData<NoContent>[] = responses.filter((response: RemoteData<NoContent>) => response.hasFailed);
if (successResponses.length > 0) {
this.showNotification(true, successResponses.length);
}
@@ -147,9 +133,7 @@ export class MetadataRegistryComponent {
}
this.registryService.deselectAllMetadataSchema();
this.registryService.cancelEditMetadataSchema();
});
}
);
}));
}
/**
@@ -160,20 +144,20 @@ export class MetadataRegistryComponent {
showNotification(success: boolean, amount: number) {
const prefix = 'admin.registries.schema.notification';
const suffix = success ? 'success' : 'failure';
const messages = observableCombineLatest(
this.translateService.get(success ? `${prefix}.${suffix}` : `${prefix}.${suffix}`),
this.translateService.get(`${prefix}.deleted.${suffix}`, {amount: amount})
);
messages.subscribe(([head, content]) => {
const head: string = this.translateService.instant(success ? `${prefix}.${suffix}` : `${prefix}.${suffix}`);
const content: string = this.translateService.instant(`${prefix}.deleted.${suffix}`, {amount: amount});
if (success) {
this.notificationsService.success(head, content);
} else {
this.notificationsService.error(head, content);
}
});
}
ngOnDestroy(): void {
this.paginationService.clearPagination(this.config.id);
this.subscriptions.map((subscription: Subscription) => subscription.unsubscribe());
}
}

View File

@@ -1,4 +1,4 @@
<div *ngIf="registryService.getActiveMetadataSchema() | async; then editheader; else createHeader"></div>
<div *ngIf="activeMetadataSchema$ | async; then editheader; else createHeader"></div>
<ng-template #createHeader>
<h2>{{messagePrefix + '.create' | translate}}</h2>

View File

@@ -1,6 +1,6 @@
import { ComponentFixture, inject, TestBed, waitForAsync } from '@angular/core/testing';
import { MetadataSchemaFormComponent } from './metadata-schema-form.component';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterTestingModule } from '@angular/router/testing';
import { TranslateModule } from '@ngx-translate/core';
@@ -10,41 +10,26 @@ import { RegistryService } from '../../../../core/registry/registry.service';
import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service';
import { of as observableOf } from 'rxjs';
import { MetadataSchema } from '../../../../core/metadata/metadata-schema.model';
import { RegistryServiceStub } from '../../../../shared/testing/registry.service.stub';
import { getMockFormBuilderService } from '../../../../shared/mocks/form-builder-service.mock';
describe('MetadataSchemaFormComponent', () => {
let component: MetadataSchemaFormComponent;
let fixture: ComponentFixture<MetadataSchemaFormComponent>;
let registryService: RegistryService;
/* eslint-disable no-empty,@typescript-eslint/no-empty-function */
const registryServiceStub = {
getActiveMetadataSchema: () => observableOf(undefined),
createOrUpdateMetadataSchema: (schema: MetadataSchema) => observableOf(schema),
cancelEditMetadataSchema: () => {
},
clearMetadataSchemaRequests: () => observableOf(undefined)
};
const formBuilderServiceStub = {
createFormGroup: () => {
return {
patchValue: () => {
},
reset(_value?: any, _options?: { onlySelf?: boolean; emitEvent?: boolean; }): void {
},
};
}
};
/* eslint-enable no-empty, @typescript-eslint/no-empty-function */
let registryService: RegistryServiceStub;
beforeEach(waitForAsync(() => {
registryService = new RegistryServiceStub();
return TestBed.configureTestingModule({
imports: [CommonModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule],
declarations: [MetadataSchemaFormComponent, EnumKeysPipe],
providers: [
{ provide: RegistryService, useValue: registryServiceStub },
{ provide: FormBuilderService, useValue: formBuilderServiceStub }
{ provide: RegistryService, useValue: registryService },
{ provide: FormBuilderService, useValue: getMockFormBuilderService() }
],
schemas: [NO_ERRORS_SCHEMA]
schemas: [CUSTOM_ELEMENTS_SCHEMA],
}).compileComponents();
}));
@@ -75,7 +60,7 @@ describe('MetadataSchemaFormComponent', () => {
describe('without an active schema', () => {
beforeEach(() => {
spyOn(registryService, 'getActiveMetadataSchema').and.returnValue(observableOf(undefined));
component.activeMetadataSchema$ = observableOf(undefined);
component.onSubmit();
fixture.detectChanges();
});
@@ -94,7 +79,7 @@ describe('MetadataSchemaFormComponent', () => {
} as MetadataSchema);
beforeEach(() => {
spyOn(registryService, 'getActiveMetadataSchema').and.returnValue(observableOf(expectedWithId));
component.activeMetadataSchema$ = observableOf(expectedWithId);
component.onSubmit();
fixture.detectChanges();
});

View File

@@ -8,10 +8,10 @@ import {
import { UntypedFormGroup } from '@angular/forms';
import { RegistryService } from '../../../../core/registry/registry.service';
import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service';
import { switchMap, take, tap } from 'rxjs/operators';
import { map, switchMap, take } from 'rxjs/operators';
import { TranslateService } from '@ngx-translate/core';
import { Observable, combineLatest } from 'rxjs';
import { MetadataSchema } from '../../../../core/metadata/metadata-schema.model';
import { Subscription, Observable } from 'rxjs';
@Component({
selector: 'ds-metadata-schema-form',
@@ -73,17 +73,24 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy {
*/
@Output() submitForm: EventEmitter<any> = new EventEmitter();
constructor(public registryService: RegistryService, private formBuilderService: FormBuilderService, private translateService: TranslateService) {
/**
* The {@link MetadataSchema} that is currently being edited
*/
activeMetadataSchema$: Observable<MetadataSchema>;
subscriptions: Subscription[] = [];
constructor(
protected registryService: RegistryService,
protected formBuilderService: FormBuilderService,
protected translateService: TranslateService,
) {
}
ngOnInit() {
combineLatest([
this.translateService.get(`${this.messagePrefix}.name`),
this.translateService.get(`${this.messagePrefix}.namespace`)
]).subscribe(([name, namespace]) => {
this.name = new DynamicInputModel({
id: 'name',
label: name,
label: this.translateService.instant(`${this.messagePrefix}.name`),
name: 'name',
validators: {
required: null,
@@ -98,7 +105,7 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy {
});
this.namespace = new DynamicInputModel({
id: 'namespace',
label: namespace,
label: this.translateService.instant(`${this.messagePrefix}.namespace`),
name: 'namespace',
validators: {
required: null,
@@ -117,7 +124,8 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy {
})
];
this.formGroup = this.formBuilderService.createFormGroup(this.formModel);
this.registryService.getActiveMetadataSchema().subscribe((schema: MetadataSchema) => {
this.activeMetadataSchema$ = this.registryService.getActiveMetadataSchema();
this.subscriptions.push(this.activeMetadataSchema$.subscribe((schema: MetadataSchema) => {
if (schema == null) {
this.clearFields();
} else {
@@ -129,8 +137,7 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy {
});
this.name.disabled = true;
}
});
});
}));
}
/**
@@ -147,44 +154,25 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy {
* Emit the updated/created schema using the EventEmitter submitForm
*/
onSubmit(): void {
this.registryService
.getActiveMetadataSchema()
.pipe(
this.activeMetadataSchema$.pipe(
take(1),
switchMap((schema: MetadataSchema) => {
const metadataValues = {
prefix: this.name.value,
namespace: this.namespace.value,
};
let createOrUpdate$: Observable<MetadataSchema>;
if (schema == null) {
createOrUpdate$ =
this.registryService.createOrUpdateMetadataSchema(
Object.assign(new MetadataSchema(), metadataValues)
);
return this.registryService.createOrUpdateMetadataSchema(Object.assign(new MetadataSchema(), metadataValues));
} else {
const updatedSchema = Object.assign(
new MetadataSchema(),
schema,
{
return this.registryService.createOrUpdateMetadataSchema(Object.assign(new MetadataSchema(), schema, {
namespace: metadataValues.namespace,
}));
}
);
createOrUpdate$ =
this.registryService.createOrUpdateMetadataSchema(
updatedSchema
);
}
return createOrUpdate$;
}),
tap(() => {
this.registryService.clearMetadataSchemaRequests().subscribe();
})
)
.subscribe((updatedOrCreatedSchema: MetadataSchema) => {
switchMap((updatedOrCreatedSchema: MetadataSchema) => this.registryService.clearMetadataSchemaRequests().pipe(
map(() => updatedOrCreatedSchema),
)),
).subscribe((updatedOrCreatedSchema: MetadataSchema) => {
this.submitForm.emit(updatedOrCreatedSchema);
this.clearFields();
this.registryService.cancelEditMetadataSchema();
@@ -204,5 +192,6 @@ export class MetadataSchemaFormComponent implements OnInit, OnDestroy {
*/
ngOnDestroy(): void {
this.onCancel();
this.subscriptions.forEach((subscription: Subscription) => subscription.unsubscribe());
}
}

View File

@@ -1,4 +1,4 @@
<div *ngIf="registryService.getActiveMetadataField() | async; then editheader; else createHeader"></div>
<div *ngIf="activeMetadataField$ | async; then editheader; else createHeader"></div>
<ng-template #createHeader>
<h2>{{messagePrefix + '.create' | translate}}</h2>

View File

@@ -9,14 +9,17 @@ import { TranslateModule } from '@ngx-translate/core';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
import { EnumKeysPipe } from '../../../../shared/utils/enum-keys-pipe';
import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { MetadataField } from '../../../../core/metadata/metadata-field.model';
import { MetadataSchema } from '../../../../core/metadata/metadata-schema.model';
import { getMockFormBuilderService } from '../../../../shared/mocks/form-builder-service.mock';
import { RegistryServiceStub } from '../../../../shared/testing/registry.service.stub';
describe('MetadataFieldFormComponent', () => {
let component: MetadataFieldFormComponent;
let fixture: ComponentFixture<MetadataFieldFormComponent>;
let registryService: RegistryService;
let registryService: RegistryServiceStub;
const metadataSchema = Object.assign(new MetadataSchema(), {
id: 1,
@@ -24,38 +27,17 @@ describe('MetadataFieldFormComponent', () => {
prefix: 'fake'
});
/* eslint-disable no-empty,@typescript-eslint/no-empty-function */
const registryServiceStub = {
getActiveMetadataField: () => observableOf(undefined),
createMetadataField: (field: MetadataField) => observableOf(field),
updateMetadataField: (field: MetadataField) => observableOf(field),
cancelEditMetadataField: () => {
},
cancelEditMetadataSchema: () => {
},
clearMetadataFieldRequests: () => observableOf(undefined)
};
const formBuilderServiceStub = {
createFormGroup: () => {
return {
patchValue: () => {
},
reset(_value?: any, _options?: { onlySelf?: boolean; emitEvent?: boolean; }): void {
},
};
}
};
/* eslint-enable no-empty, @typescript-eslint/no-empty-function */
beforeEach(waitForAsync(() => {
registryService = new RegistryServiceStub();
return TestBed.configureTestingModule({
imports: [CommonModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule],
declarations: [MetadataFieldFormComponent, EnumKeysPipe],
providers: [
{ provide: RegistryService, useValue: registryServiceStub },
{ provide: FormBuilderService, useValue: formBuilderServiceStub }
{ provide: RegistryService, useValue: registryService },
{ provide: FormBuilderService, useValue: getMockFormBuilderService() }
],
schemas: [NO_ERRORS_SCHEMA]
schemas: [CUSTOM_ELEMENTS_SCHEMA]
}).compileComponents();
}));

View File

@@ -11,7 +11,7 @@ import { RegistryService } from '../../../../core/registry/registry.service';
import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service';
import { take } from 'rxjs/operators';
import { TranslateService } from '@ngx-translate/core';
import { combineLatest } from 'rxjs';
import { Observable } from 'rxjs';
import { MetadataSchema } from '../../../../core/metadata/metadata-schema.model';
import { MetadataField } from '../../../../core/metadata/metadata-field.model';
@@ -90,6 +90,8 @@ 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) {
@@ -99,14 +101,9 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy {
* Initialize the component, setting up the necessary Models for the dynamic form
*/
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,
label: this.translateService.instant(`${this.messagePrefix}.element`),
name: 'element',
validators: {
required: null,
@@ -121,7 +118,7 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy {
});
this.qualifier = new DynamicInputModel({
id: 'qualifier',
label: qualifier,
label: this.translateService.instant(`${this.messagePrefix}.qualifier`),
name: 'qualifier',
validators: {
pattern: '^[^. ,]*$',
@@ -135,7 +132,7 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy {
});
this.scopeNote = new DynamicTextAreaModel({
id: 'scopeNote',
label: scopenote,
label: this.translateService.instant(`${this.messagePrefix}.scopenote`),
name: 'scopeNote',
required: false,
rows: 5,
@@ -163,7 +160,6 @@ export class MetadataFieldFormComponent implements OnInit, OnDestroy {
this.qualifier.disabled = true;
}
});
});
}
/**

View File

@@ -31,8 +31,8 @@
</thead>
<tbody>
<tr *ngFor="let field of fields?.page"
[ngClass]="{'table-primary' : isActive(field) | async}">
<td *ngVar="(isSelected(field) | async) as selected">
[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"

View File

@@ -4,7 +4,7 @@ import { of as observableOf } from 'rxjs';
import { buildPaginatedList } from '../../../core/data/paginated-list.model';
import { TranslateModule } from '@ngx-translate/core';
import { CommonModule } from '@angular/common';
import { ActivatedRoute, Router } from '@angular/router';
import { ActivatedRoute } from '@angular/router';
import { By } from '@angular/platform-browser';
import { RegistryService } from '../../../core/registry/registry.service';
import { NgbModule } from '@ng-bootstrap/ng-bootstrap';
@@ -12,25 +12,28 @@ import { EnumKeysPipe } from '../../../shared/utils/enum-keys-pipe';
import { PaginationComponent } from '../../../shared/pagination/pagination.component';
import { HostWindowServiceStub } from '../../../shared/testing/host-window-service.stub';
import { HostWindowService } from '../../../shared/host-window.service';
import { RouterStub } from '../../../shared/testing/router.stub';
import { RouterTestingModule } from '@angular/router/testing';
import { ActivatedRouteStub } from '../../../shared/testing/active-router.stub';
import { NO_ERRORS_SCHEMA } from '@angular/core';
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { NotificationsService } from '../../../shared/notifications/notifications.service';
import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub';
import { RestResponse } from '../../../core/cache/response.models';
import { MetadataSchema } from '../../../core/metadata/metadata-schema.model';
import { MetadataField } from '../../../core/metadata/metadata-field.model';
import { createSuccessfulRemoteDataObject$ } from '../../../shared/remote-data.utils';
import { VarDirective } from '../../../shared/utils/var.directive';
import { PaginationService } from '../../../core/pagination/pagination.service';
import { PaginationServiceStub } from '../../../shared/testing/pagination-service.stub';
import { RegistryServiceStub } from '../../../shared/testing/registry.service.stub';
describe('MetadataSchemaComponent', () => {
let comp: MetadataSchemaComponent;
let fixture: ComponentFixture<MetadataSchemaComponent>;
let registryService: RegistryService;
const mockSchemasList = [
let registryService: RegistryServiceStub;
let activatedRoute: ActivatedRouteStub;
let paginationService: PaginationServiceStub;
const mockSchemasList: MetadataSchema[] = [
{
id: 1,
_links: {
@@ -51,8 +54,8 @@ describe('MetadataSchemaComponent', () => {
prefix: 'mock',
namespace: 'http://dspace.org/mockschema'
}
];
const mockFieldsList = [
] as MetadataSchema[];
const mockFieldsList: MetadataField[] = [
{
id: 1,
_links: {
@@ -101,47 +104,29 @@ describe('MetadataSchemaComponent', () => {
scopeNote: null,
schema: createSuccessfulRemoteDataObject$(mockSchemasList[1])
}
];
const mockSchemas = createSuccessfulRemoteDataObject$(buildPaginatedList(null, mockSchemasList));
/* eslint-disable no-empty,@typescript-eslint/no-empty-function */
const registryServiceStub = {
getMetadataSchemas: () => mockSchemas,
getMetadataFieldsBySchema: (schema: MetadataSchema) => createSuccessfulRemoteDataObject$(buildPaginatedList(null, mockFieldsList.filter((value) => value.id === 3 || value.id === 4))),
getMetadataSchemaByPrefix: (schemaName: string) => createSuccessfulRemoteDataObject$(mockSchemasList.filter((value) => value.prefix === schemaName)[0]),
getActiveMetadataField: () => observableOf(undefined),
getSelectedMetadataFields: () => observableOf([]),
editMetadataField: (schema) => {
},
cancelEditMetadataField: () => {
},
deleteMetadataField: () => observableOf(new RestResponse(true, 200, 'OK')),
deselectAllMetadataField: () => {
},
clearMetadataFieldRequests: () => observableOf(undefined)
};
/* eslint-enable no-empty, @typescript-eslint/no-empty-function */
] as MetadataField[];
const schemaNameParam = 'mock';
const activatedRouteStub = Object.assign(new ActivatedRouteStub(), {
params: observableOf({
schemaName: schemaNameParam
})
});
const paginationService = new PaginationServiceStub();
beforeEach(waitForAsync(() => {
activatedRoute = new ActivatedRouteStub({
schemaName: schemaNameParam,
});
paginationService = new PaginationServiceStub();
registryService = new RegistryServiceStub();
spyOn(registryService, 'getMetadataFieldsBySchema').and.returnValue(createSuccessfulRemoteDataObject$(buildPaginatedList(null, mockFieldsList.filter((value) => value.id === 3 || value.id === 4))));
spyOn(registryService, 'getMetadataSchemaByPrefix').and.callFake((schemaName) => createSuccessfulRemoteDataObject$(mockSchemasList.filter((value) => value.prefix === schemaName)[0]));
TestBed.configureTestingModule({
imports: [CommonModule, RouterTestingModule.withRoutes([]), TranslateModule.forRoot(), NgbModule],
declarations: [MetadataSchemaComponent, PaginationComponent, EnumKeysPipe, VarDirective],
providers: [
{ provide: RegistryService, useValue: registryServiceStub },
{ provide: ActivatedRoute, useValue: activatedRouteStub },
{ provide: RegistryService, useValue: registryService },
{ provide: ActivatedRoute, useValue: activatedRoute },
{ provide: HostWindowService, useValue: new HostWindowServiceStub(0) },
{ provide: Router, useValue: new RouterStub() },
{ provide: PaginationService, useValue: paginationService },
{ provide: NotificationsService, useValue: new NotificationsServiceStub() }
],
schemas: [NO_ERRORS_SCHEMA]
schemas: [CUSTOM_ELEMENTS_SCHEMA],
}).compileComponents();
}));
@@ -190,7 +175,7 @@ describe('MetadataSchemaComponent', () => {
}));
it('should cancel editing the selected field when clicked again', waitForAsync(() => {
spyOn(registryService, 'getActiveMetadataField').and.returnValue(observableOf(mockFieldsList[2] as MetadataField));
comp.activeField$ = observableOf(mockFieldsList[2] as MetadataField);
spyOn(registryService, 'cancelEditMetadataField');
row.click();
fixture.detectChanges();
@@ -205,7 +190,7 @@ describe('MetadataSchemaComponent', () => {
beforeEach(() => {
spyOn(registryService, 'deleteMetadataField').and.callThrough();
spyOn(registryService, 'getSelectedMetadataFields').and.returnValue(observableOf(selectedFields as MetadataField[]));
comp.selectedMetadataFieldIDs$ = observableOf(selectedFields.map((metadataField: MetadataField) => metadataField.id));
comp.deleteFields();
fixture.detectChanges();
});

View File

@@ -3,17 +3,16 @@ import { RegistryService } from '../../../core/registry/registry.service';
import { ActivatedRoute } from '@angular/router';
import {
BehaviorSubject,
combineLatest as observableCombineLatest,
combineLatest,
Observable,
of as observableOf,
zip
zip,
Subscription,
} from 'rxjs';
import { RemoteData } from '../../../core/data/remote-data';
import { PaginatedList } from '../../../core/data/paginated-list.model';
import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model';
import { map, switchMap, take } from 'rxjs/operators';
import { hasValue } from '../../../shared/empty.util';
import { NotificationsService } from '../../../shared/notifications/notifications.service';
import { TranslateService } from '@ngx-translate/core';
import { MetadataField } from '../../../core/metadata/metadata-field.model';
@@ -32,7 +31,7 @@ import { PaginationService } from '../../../core/pagination/pagination.service';
* A component used for managing all existing metadata fields within the current metadata schema.
* The admin can create, edit or delete metadata fields here.
*/
export class MetadataSchemaComponent implements OnInit, OnDestroy {
export class MetadataSchemaComponent implements OnDestroy, OnInit {
/**
* The metadata schema
*/
@@ -57,26 +56,33 @@ export class MetadataSchemaComponent implements OnInit, OnDestroy {
*/
needsUpdate$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(true);
constructor(private registryService: RegistryService,
private route: ActivatedRoute,
private notificationsService: NotificationsService,
private paginationService: PaginationService,
private translateService: TranslateService) {
/**
* The current {@link MetadataField} that is being edited
*/
activeField$: Observable<MetadataField>;
/**
* The selected {@link MetadataField} IDs
*/
selectedMetadataFieldIDs$: Observable<number[]>;
subscriptions: Subscription[] = [];
constructor(
protected registryService: RegistryService,
protected route: ActivatedRoute,
protected notificationsService: NotificationsService,
protected paginationService: PaginationService,
protected translateService: TranslateService,
) {
}
ngOnInit(): void {
this.route.params.subscribe((params) => {
this.initialize(params);
});
}
/**
* Initialize the component using the params within the url (schemaName)
* @param params
*/
initialize(params) {
this.metadataSchema$ = this.registryService.getMetadataSchemaByPrefix(params.schemaName).pipe(getFirstSucceededRemoteDataPayload());
this.metadataSchema$ = this.registryService.getMetadataSchemaByPrefix(this.route.snapshot.params.schemaName).pipe(getFirstSucceededRemoteDataPayload());
this.activeField$ = this.registryService.getActiveMetadataField();
this.selectedMetadataFieldIDs$ = this.registryService.getSelectedMetadataFields().pipe(
map((metadataFields: MetadataField[]) => metadataFields.map((metadataField: MetadataField) => metadataField.id)),
);
this.updateFields();
}
@@ -109,30 +115,13 @@ export class MetadataSchemaComponent implements OnInit, OnDestroy {
* @param field
*/
editField(field: MetadataField) {
this.getActiveField().pipe(take(1)).subscribe((activeField) => {
this.subscriptions.push(this.activeField$.pipe(take(1)).subscribe((activeField) => {
if (field === activeField) {
this.registryService.cancelEditMetadataField();
} else {
this.registryService.editMetadataField(field);
}
});
}
/**
* Checks whether the given metadata field is active (being edited)
* @param field
*/
isActive(field: MetadataField): Observable<boolean> {
return this.getActiveField().pipe(
map((activeField) => field === activeField)
);
}
/**
* Gets the active metadata field (being edited)
*/
getActiveField(): Observable<MetadataField> {
return this.registryService.getActiveMetadataField();
}));
}
/**
@@ -146,29 +135,14 @@ export class MetadataSchemaComponent implements OnInit, OnDestroy {
this.registryService.deselectMetadataField(field);
}
/**
* Checks whether a given metadata field is selected in the list (checkbox)
* @param field
*/
isSelected(field: MetadataField): Observable<boolean> {
return this.registryService.getSelectedMetadataFields().pipe(
map((fields) => fields.find((selectedField) => selectedField === field) != null)
);
}
/**
* Delete all the selected metadata fields
*/
deleteFields() {
this.registryService.getSelectedMetadataFields().pipe(take(1)).subscribe(
(fields) => {
const tasks$ = [];
for (const field of fields) {
if (hasValue(field.id)) {
tasks$.push(this.registryService.deleteMetadataField(field.id).pipe(getFirstCompletedRemoteData()));
}
}
zip(...tasks$).subscribe((responses: RemoteData<NoContent>[]) => {
this.subscriptions.push(this.selectedMetadataFieldIDs$.pipe(
take(1),
switchMap((fieldIDs) => zip(fieldIDs.map((fieldID) => this.registryService.deleteMetadataField(fieldID).pipe(getFirstCompletedRemoteData())))),
).subscribe((responses: RemoteData<NoContent>[]) => {
const successResponses = responses.filter((response: RemoteData<NoContent>) => response.hasSucceeded);
const failedResponses = responses.filter((response: RemoteData<NoContent>) => response.hasFailed);
if (successResponses.length > 0) {
@@ -179,9 +153,7 @@ export class MetadataSchemaComponent implements OnInit, OnDestroy {
}
this.registryService.deselectAllMetadataField();
this.registryService.cancelEditMetadataField();
});
}
);
}));
}
/**
@@ -192,21 +164,19 @@ export class MetadataSchemaComponent implements OnInit, OnDestroy {
showNotification(success: boolean, amount: number) {
const prefix = 'admin.registries.schema.notification';
const suffix = success ? 'success' : 'failure';
const messages = observableCombineLatest([
this.translateService.get(success ? `${prefix}.${suffix}` : `${prefix}.${suffix}`),
this.translateService.get(`${prefix}.field.deleted.${suffix}`, { amount: amount })
]);
messages.subscribe(([head, content]) => {
const head = this.translateService.instant(success ? `${prefix}.${suffix}` : `${prefix}.${suffix}`);
const content = this.translateService.instant(`${prefix}.field.deleted.${suffix}`, { amount: amount });
if (success) {
this.notificationsService.success(head, content);
} else {
this.notificationsService.error(head, content);
}
});
}
ngOnDestroy(): void {
this.paginationService.clearPagination(this.config.id);
this.registryService.deselectAllMetadataField();
this.subscriptions.forEach((subscription: Subscription) => subscription.unsubscribe());
}
}

View File

@@ -1,13 +1,13 @@
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { MetadataImportPageComponent } from './admin-import-metadata-page/metadata-import-page.component';
import { AdminSearchPageComponent } from './admin-search-page/admin-search-page.component';
import { ThemedAdminSearchPageComponent } from './admin-search-page/themed-admin-search-page.component';
import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver';
import { AdminWorkflowPageComponent } from './admin-workflow-page/admin-workflow-page.component';
import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.service';
import { AdminCurationTasksComponent } from './admin-curation-tasks/admin-curation-tasks.component';
import { REGISTRIES_MODULE_PATH } from './admin-routing-paths';
import { BatchImportPageComponent } from './admin-import-batch-page/batch-import-page.component';
import { ThemedAdminWorkflowPageComponent } from './admin-workflow-page/themed-admin-workflow-page.component';
@NgModule({
imports: [
@@ -20,13 +20,13 @@ import { BatchImportPageComponent } from './admin-import-batch-page/batch-import
{
path: 'search',
resolve: { breadcrumb: I18nBreadcrumbResolver },
component: AdminSearchPageComponent,
component: ThemedAdminSearchPageComponent,
data: { title: 'admin.search.title', breadcrumbKey: 'admin.search' }
},
{
path: 'workflow',
resolve: { breadcrumb: I18nBreadcrumbResolver },
component: AdminWorkflowPageComponent,
component: ThemedAdminWorkflowPageComponent,
data: { title: 'admin.workflow.title', breadcrumbKey: 'admin.workflow' }
},
{

View File

@@ -1,5 +1,6 @@
import { NgModule } from '@angular/core';
import { SharedModule } from '../../shared/shared.module';
import { ThemedAdminSearchPageComponent } from './themed-admin-search-page.component';
import { AdminSearchPageComponent } from './admin-search-page.component';
import { ItemAdminSearchResultListElementComponent } from './admin-search-results/admin-search-result-list-element/item-search-result/item-admin-search-result-list-element.component';
import { CommunityAdminSearchResultListElementComponent } from './admin-search-results/admin-search-result-list-element/community-search-result/community-admin-search-result-list-element.component';
@@ -31,6 +32,7 @@ const ENTRY_COMPONENTS = [
ResearchEntitiesModule.withEntryComponents()
],
declarations: [
ThemedAdminSearchPageComponent,
AdminSearchPageComponent,
...ENTRY_COMPONENTS
]

View File

@@ -0,0 +1,26 @@
import { Component } from '@angular/core';
import { ThemedComponent } from '../../shared/theme-support/themed.component';
import { AdminSearchPageComponent } from './admin-search-page.component';
/**
* Themed wrapper for {@link AdminSearchPageComponent}
*/
@Component({
selector: 'ds-themed-admin-search-page',
templateUrl: '../../shared/theme-support/themed.component.html',
})
export class ThemedAdminSearchPageComponent extends ThemedComponent<AdminSearchPageComponent> {
protected getComponentName(): string {
return 'AdminSearchPageComponent';
}
protected importThemedComponent(themeName: string): Promise<any> {
return import(`../../../themes/${themeName}/app/admin/admin-search-page/admin-search-page.component`);
}
protected importUnthemedComponent(): Promise<any> {
return import('./admin-search-page.component');
}
}

View File

@@ -67,8 +67,8 @@ export class ExpandableAdminSidebarSectionComponent extends AdminSidebarSectionC
this.sidebarActiveBg$ = this.variableService.getVariable('--ds-admin-sidebar-active-bg');
this.isSidebarCollapsed$ = this.menuService.isMenuCollapsed(this.menuID);
this.isSidebarPreviewCollapsed$ = this.menuService.isMenuPreviewCollapsed(this.menuID);
this.isExpanded$ = combineLatestObservable([this.active, this.isSidebarCollapsed$, this.isSidebarPreviewCollapsed$]).pipe(
map(([active, sidebarCollapsed, sidebarPreviewCollapsed]) => (active && (!sidebarCollapsed || !sidebarPreviewCollapsed)))
this.isExpanded$ = combineLatestObservable([this.active$, this.isSidebarCollapsed$, this.isSidebarPreviewCollapsed$]).pipe(
map(([active, sidebarCollapsed, sidebarPreviewCollapsed]) => (active && (!sidebarCollapsed || !sidebarPreviewCollapsed))),
);
}

View File

@@ -27,6 +27,7 @@ import {
import {
SupervisionOrderStatusComponent
} from './admin-workflow-search-results/actions/workspace-item/supervision-order-status/supervision-order-status.component';
import { ThemedAdminWorkflowPageComponent } from './themed-admin-workflow-page.component';
const ENTRY_COMPONENTS = [
// put only entry components that use custom decorator
@@ -42,6 +43,7 @@ const ENTRY_COMPONENTS = [
SharedModule.withEntryComponents()
],
declarations: [
ThemedAdminWorkflowPageComponent,
AdminWorkflowPageComponent,
SupervisionOrderGroupSelectorComponent,
SupervisionOrderStatusComponent,

View File

@@ -0,0 +1,26 @@
import { Component } from '@angular/core';
import { ThemedComponent } from '../../shared/theme-support/themed.component';
import { AdminWorkflowPageComponent } from './admin-workflow-page.component';
/**
* Themed wrapper for {@link AdminWorkflowPageComponent}
*/
@Component({
selector: 'ds-themed-admin-workflow-page',
templateUrl: '../../shared/theme-support/themed.component.html',
})
export class ThemedAdminWorkflowPageComponent extends ThemedComponent<AdminWorkflowPageComponent> {
protected getComponentName(): string {
return 'AdminWorkflowPageComponent';
}
protected importThemedComponent(themeName: string): Promise<any> {
return import(`../../../themes/${themeName}/app/admin/admin-workflow-page/admin-workflow-page.component`);
}
protected importUnthemedComponent(): Promise<any> {
return import('./admin-workflow-page.component');
}
}

View File

@@ -40,6 +40,8 @@ import {
import { ServerCheckGuard } from './core/server-check/server-check.guard';
import { MenuResolver } from './menu.resolver';
import { ThemedPageErrorComponent } from './page-error/themed-page-error.component';
import { HomePageResolver } from './home-page/home-page.resolver';
import { ViewTrackerResolverService } from './statistics/angulartics/dspace/view-tracker-resolver.service';
@NgModule({
imports: [
@@ -63,7 +65,15 @@ import { ThemedPageErrorComponent } from './page-error/themed-page-error.compone
path: 'home',
loadChildren: () => import('./home-page/home-page.module')
.then((m) => m.HomePageModule),
data: { showBreadcrumbs: false },
data: {
showBreadcrumbs: false,
dsoPath: 'site'
},
resolve: {
site: HomePageResolver,
tracking: ViewTrackerResolverService,
},
canActivate: [EndUserAgreementCurrentUserGuard]
},
{
@@ -251,6 +261,7 @@ import { ThemedPageErrorComponent } from './page-error/themed-page-error.compone
})
],
exports: [RouterModule],
providers: [HomePageResolver, ViewTrackerResolverService],
})
export class AppRoutingModule {

View File

@@ -30,6 +30,7 @@ import { EagerThemesModule } from '../themes/eager-themes.module';
import { APP_CONFIG, AppConfig } from '../config/app-config.interface';
import { StoreDevModules } from '../config/store/devtools';
import { RootModule } from './root.module';
import { DspaceRestInterceptor } from './core/dspace-rest/dspace-rest.interceptor';
export function getConfig() {
return environment;
@@ -103,6 +104,12 @@ const PROVIDERS = [
useClass: LogInterceptor,
multi: true
},
// register DspaceRestInterceptor as HttpInterceptor
{
provide: HTTP_INTERCEPTORS,
useClass: DspaceRestInterceptor,
multi: true
},
// register the dynamic matcher used by form. MUST be provided by the app module
...DYNAMIC_MATCHER_PROVIDERS,
];

View File

@@ -8,11 +8,11 @@ import { RemoteData } from '../../core/data/remote-data';
import { DSpaceObject } from '../../core/shared/dspace-object.model';
@Component({
selector: 'ds-collection-authorizations',
selector: 'ds-bitstream-authorizations',
templateUrl: './bitstream-authorizations.component.html',
})
/**
* Component that handles the Collection Authorizations
* Component that handles the Bitstream Authorizations
*/
export class BitstreamAuthorizationsComponent<TDomain extends DSpaceObject> implements OnInit {

View File

@@ -1,6 +1,6 @@
<ng-container *ngVar="(bitstreamRD$ | async) as bitstreamRD">
<div class="container" *ngVar="(bitstreamFormatsRD$ | async) as formatsRD">
<div class="row" *ngIf="bitstreamRD?.hasSucceeded && formatsRD?.hasSucceeded">
<div class="container">
<div class="row" *ngIf="bitstreamRD?.hasSucceeded">
<div class="col-md-2">
<ds-themed-thumbnail [thumbnail]="bitstreamRD?.payload"></ds-themed-thumbnail>
</div>
@@ -27,7 +27,7 @@
</div>
</div>
<ds-error *ngIf="bitstreamRD?.hasFailed" message="{{'error.bitstream' | translate}}"></ds-error>
<ds-themed-loading *ngIf="!bitstreamRD || !formatsRD || bitstreamRD?.isLoading || formatsRD?.isLoading"
<ds-themed-loading *ngIf="!bitstreamRD || bitstreamRD?.isLoading"
message="{{'loading.bitstream' | translate}}"></ds-themed-loading>
</div>
</ng-container>

View File

@@ -239,7 +239,7 @@ describe('EditBitstreamPageComponent', () => {
});
it('should select the correct format', () => {
expect(rawForm.formatContainer.selectedFormat).toEqual(selectedFormat.id);
expect(rawForm.formatContainer.selectedFormat).toEqual(selectedFormat.shortDescription);
});
it('should put the \"New Format\" input on invisible', () => {
@@ -270,7 +270,13 @@ describe('EditBitstreamPageComponent', () => {
describe('when an unknown format is selected', () => {
beforeEach(() => {
comp.updateNewFormatLayout(allFormats[0].id);
comp.onChange({
model: {
id: 'selectedFormat',
value: allFormats[0],
},
});
comp.updateNewFormatLayout();
});
it('should remove the invisible class from the \"New Format\" input', () => {
@@ -372,10 +378,11 @@ describe('EditBitstreamPageComponent', () => {
describe('when selected format has changed', () => {
beforeEach(() => {
comp.formGroup.patchValue({
formatContainer: {
selectedFormat: allFormats[2].id
}
comp.onChange({
model: {
id: 'selectedFormat',
value: allFormats[2],
},
});
fixture.detectChanges();
comp.onSubmit();

View File

@@ -2,14 +2,20 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnIni
import { Bitstream } from '../../core/shared/bitstream.model';
import { ActivatedRoute, Router } from '@angular/router';
import { filter, map, switchMap, tap } from 'rxjs/operators';
import { combineLatest, combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs';
import { DynamicFormControlModel, DynamicFormGroupModel, DynamicFormLayout, DynamicFormService, DynamicInputModel, DynamicSelectModel } from '@ng-dynamic-forms/core';
import {
combineLatest,
combineLatest as observableCombineLatest,
Observable,
of as observableOf,
Subscription, take
} from 'rxjs';
import { DynamicFormControlModel, DynamicFormGroupModel, DynamicFormLayout, DynamicFormService, DynamicInputModel } from '@ng-dynamic-forms/core';
import { UntypedFormGroup } from '@angular/forms';
import { TranslateService } from '@ngx-translate/core';
import { DynamicCustomSwitchModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/custom-switch/custom-switch.model';
import cloneDeep from 'lodash/cloneDeep';
import { BitstreamDataService } from '../../core/data/bitstream-data.service';
import { getAllSucceededRemoteDataPayload, getFirstCompletedRemoteData, getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload, getRemoteDataPayload } from '../../core/shared/operators';
import { getFirstCompletedRemoteData, getFirstSucceededRemoteData, getFirstSucceededRemoteDataPayload, getRemoteDataPayload } from '../../core/shared/operators';
import { NotificationsService } from '../../shared/notifications/notifications.service';
import { BitstreamFormatDataService } from '../../core/data/bitstream-format-data.service';
import { BitstreamFormat } from '../../core/shared/bitstream-format.model';
@@ -18,7 +24,6 @@ import { hasValue, hasValueOperator, isEmpty, isNotEmpty } from '../../shared/em
import { Metadata } from '../../core/shared/metadata.utils';
import { Location } from '@angular/common';
import { RemoteData } from '../../core/data/remote-data';
import { PaginatedList } from '../../core/data/paginated-list.model';
import { getEntityEditRoute } from '../../item-page/item-page-routing-paths';
import { Bundle } from '../../core/shared/bundle.model';
import { DSONameService } from '../../core/breadcrumbs/dso-name.service';
@@ -26,6 +31,8 @@ import { Item } from '../../core/shared/item.model';
import { DsDynamicInputModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-input.model';
import { DsDynamicTextAreaModel } from '../../shared/form/builder/ds-dynamic-form-ui/models/ds-dynamic-textarea.model';
import { PrimaryBitstreamService } from '../../core/data/primary-bitstream.service';
import { DynamicScrollableDropdownModel } from 'src/app/shared/form/builder/ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.model';
import { FindAllDataImpl } from '../../core/data/base/find-all-data';
@Component({
selector: 'ds-edit-bitstream-page',
@@ -44,12 +51,6 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
*/
bitstreamRD$: Observable<RemoteData<Bitstream>>;
/**
* The formats their remote data observable
* Tracks changes and updates the view
*/
bitstreamFormatsRD$: Observable<RemoteData<PaginatedList<BitstreamFormat>>>;
/**
* The UUID of the primary bitstream for this bundle
*/
@@ -65,11 +66,6 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
*/
originalFormat: BitstreamFormat;
/**
* A list of all available bitstream formats
*/
formats: BitstreamFormat[];
/**
* @type {string} Key prefix used to generate form messages
*/
@@ -113,7 +109,10 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
/**
* Options for fetching all bitstream formats
*/
findAllOptions = { elementsPerPage: 9999 };
findAllOptions = {
elementsPerPage: 20,
currentPage: 1
};
/**
* The Dynamic Input Model for the file's name
@@ -153,9 +152,22 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
/**
* The Dynamic Input Model for the selected format
*/
selectedFormatModel = new DynamicSelectModel({
selectedFormatModel = new DynamicScrollableDropdownModel({
id: 'selectedFormat',
name: 'selectedFormat'
name: 'selectedFormat',
displayKey: 'shortDescription',
repeatable: false,
metadataFields: [],
submissionId: '',
hasSelectableMetadata: false,
findAllFactory: this.findAllFormatsServiceFactory(),
formatFunction: (format: BitstreamFormat | string) => {
if (format instanceof BitstreamFormat) {
return hasValue(format) && format.supportLevel === BitstreamFormatSupportLevel.Unknown ? this.translate.instant(this.KEY_PREFIX + 'selectedFormat.unknown') : format.shortDescription;
} else {
return format;
}
},
});
/**
@@ -370,6 +382,11 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
* @private
*/
private bundle: Bundle;
/**
* The currently selected format
* @private
*/
private selectedFormat: BitstreamFormat;
constructor(private route: ActivatedRoute,
private router: Router,
@@ -396,18 +413,12 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
this.itemId = this.route.snapshot.queryParams.itemId;
this.entityType = this.route.snapshot.queryParams.entityType;
this.bitstreamRD$ = this.route.data.pipe(map((data: any) => data.bitstream));
this.bitstreamFormatsRD$ = this.bitstreamFormatService.findAll(this.findAllOptions);
const bitstream$ = this.bitstreamRD$.pipe(
getFirstSucceededRemoteData(),
getRemoteDataPayload(),
);
const allFormats$ = this.bitstreamFormatsRD$.pipe(
getFirstSucceededRemoteData(),
getRemoteDataPayload(),
);
const bundle$ = bitstream$.pipe(
switchMap((bitstream: Bitstream) => bitstream.bundle),
getFirstSucceededRemoteDataPayload(),
@@ -423,24 +434,31 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
switchMap((bundle: Bundle) => bundle.item),
getFirstSucceededRemoteDataPayload(),
);
const format$ = bitstream$.pipe(
switchMap(bitstream => bitstream.format),
getFirstSucceededRemoteDataPayload(),
);
this.subs.push(
observableCombineLatest(
bitstream$,
allFormats$,
bundle$,
primaryBitstream$,
item$,
).pipe()
.subscribe(([bitstream, allFormats, bundle, primaryBitstream, item]) => {
format$,
).subscribe(([bitstream, bundle, primaryBitstream, item, format]) => {
this.bitstream = bitstream as Bitstream;
this.formats = allFormats.page;
this.bundle = bundle;
this.selectedFormat = format;
// hasValue(primaryBitstream) because if there's no primaryBitstream on the bundle it will
// be a success response, but empty
this.primaryBitstreamUUID = hasValue(primaryBitstream) ? primaryBitstream.uuid : null;
this.itemId = item.uuid;
this.setIiifStatus(this.bitstream);
})
}),
format$.pipe(take(1)).subscribe(
(format) => this.originalFormat = format,
),
);
this.subs.push(
@@ -456,7 +474,6 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
*/
setForm() {
this.formGroup = this.formService.createFormGroup(this.formModel);
this.updateFormatModel();
this.updateForm(this.bitstream);
this.updateFieldTranslations();
}
@@ -475,8 +492,9 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
description: bitstream.firstMetadataValue('dc.description')
},
formatContainer: {
newFormat: hasValue(bitstream.firstMetadata('dc.format')) ? bitstream.firstMetadata('dc.format').value : undefined
}
selectedFormat: this.selectedFormat.shortDescription,
newFormat: hasValue(bitstream.firstMetadata('dc.format')) ? bitstream.firstMetadata('dc.format').value : undefined,
},
});
if (this.isIIIF) {
this.formGroup.patchValue({
@@ -494,36 +512,16 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
}
});
}
this.bitstream.format.pipe(
getAllSucceededRemoteDataPayload()
).subscribe((format: BitstreamFormat) => {
this.originalFormat = format;
this.formGroup.patchValue({
formatContainer: {
selectedFormat: format.id
}
});
this.updateNewFormatLayout(format.id);
});
this.updateNewFormatLayout();
}
/**
* Create the list of unknown format IDs an add options to the selectedFormatModel
*/
updateFormatModel() {
this.selectedFormatModel.options = this.formats.map((format: BitstreamFormat) =>
Object.assign({
value: format.id,
label: this.isUnknownFormat(format.id) ? this.translate.instant(this.KEY_PREFIX + 'selectedFormat.unknown') : format.shortDescription
}));
}
/**
* Update the layout of the "Other Format" input depending on the selected format
* @param selectedId
*/
updateNewFormatLayout(selectedId: string) {
if (this.isUnknownFormat(selectedId)) {
updateNewFormatLayout() {
if (this.isUnknownFormat()) {
this.formLayout.newFormat.grid.host = this.newFormatBaseLayout;
} else {
this.formLayout.newFormat.grid.host = this.newFormatBaseLayout + ' invisible';
@@ -534,9 +532,8 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
* Is the provided format (id) part of the list of unknown formats?
* @param id
*/
isUnknownFormat(id: string): boolean {
const format = this.formats.find((f: BitstreamFormat) => f.id === id);
return hasValue(format) && format.supportLevel === BitstreamFormatSupportLevel.Unknown;
isUnknownFormat(): boolean {
return hasValue(this.selectedFormat) && this.selectedFormat.supportLevel === BitstreamFormatSupportLevel.Unknown;
}
/**
@@ -568,7 +565,8 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
onChange(event) {
const model = event.model;
if (model.id === this.selectedFormatModel.id) {
this.updateNewFormatLayout(model.value);
this.selectedFormat = model.value;
this.updateNewFormatLayout();
}
}
@@ -578,8 +576,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
onSubmit() {
const updatedValues = this.formGroup.getRawValue();
const updatedBitstream = this.formToBitstream(updatedValues);
const selectedFormat = this.formats.find((f: BitstreamFormat) => f.id === updatedValues.formatContainer.selectedFormat);
const isNewFormat = selectedFormat.id !== this.originalFormat.id;
const isNewFormat = this.selectedFormat.id !== this.originalFormat.id;
const isPrimary = updatedValues.fileNamePrimaryContainer.primaryBitstream;
const wasPrimary = this.primaryBitstreamUUID === this.bitstream.uuid;
@@ -631,7 +628,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
bundle$ = observableOf(this.bundle);
}
if (isNewFormat) {
bitstream$ = this.bitstreamService.updateFormat(this.bitstream, selectedFormat).pipe(
bitstream$ = this.bitstreamService.updateFormat(this.bitstream, this.selectedFormat).pipe(
getFirstCompletedRemoteData(),
map((formatResponse: RemoteData<Bitstream>) => {
if (hasValue(formatResponse) && formatResponse.hasFailed) {
@@ -789,4 +786,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
.forEach((subscription) => subscription.unsubscribe());
}
findAllFormatsServiceFactory() {
return () => this.bitstreamFormatService as any as FindAllDataImpl<BitstreamFormat>;
}
}

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