Compare commits

..

738 Commits

Author SHA1 Message Date
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
3311 changed files with 158235 additions and 156041 deletions

View File

@@ -8,16 +8,7 @@
"eslint-plugin-deprecation",
"unused-imports",
"eslint-plugin-lodash",
"eslint-plugin-jsonc",
"eslint-plugin-rxjs",
"eslint-plugin-simple-import-sort",
"eslint-plugin-import-newlines",
"eslint-plugin-jsonc",
"dspace-angular-ts",
"dspace-angular-html"
],
"ignorePatterns": [
"lint/test/fixture"
"eslint-plugin-jsonc"
],
"overrides": [
{
@@ -27,8 +18,7 @@
"parserOptions": {
"project": [
"./tsconfig.json",
"./cypress/tsconfig.json",
"./lint/tsconfig.json"
"./cypress/tsconfig.json"
],
"createDefaultProgram": true
},
@@ -37,32 +27,17 @@
"plugin:@typescript-eslint/recommended",
"plugin:@typescript-eslint/recommended-requiring-type-checking",
"plugin:@angular-eslint/recommended",
"plugin:@angular-eslint/template/process-inline-templates",
"plugin:rxjs/recommended"
"plugin:@angular-eslint/template/process-inline-templates"
],
"rules": {
"indent": [
"error",
2,
{
"SwitchCase": 1,
"ignoredNodes": [
"ClassBody.body > PropertyDefinition[decorators.length > 0] > .key"
]
}
],
"max-classes-per-file": [
"error",
1
],
"comma-dangle": [
"error",
"off",
"always-multiline"
],
"object-curly-spacing": [
"error",
"always"
],
"eol-last": [
"error",
"always"
@@ -129,13 +104,15 @@
"allowTernary": true
}
],
"prefer-const": "error",
"no-case-declarations": "error",
"no-extra-boolean-cast": "error",
"prefer-const": "off", // todo: re-enable & fix errors (more strict than it used to be in TSLint)
"prefer-spread": "off",
"no-underscore-dangle": "off",
// todo: disabled rules from eslint:recommended, consider re-enabling & fixing
"no-prototype-builtins": "off",
"no-useless-escape": "off",
"no-case-declarations": "off",
"no-extra-boolean-cast": "off",
"@angular-eslint/directive-selector": [
"error",
@@ -162,10 +139,10 @@
}
],
"@angular-eslint/no-attribute-decorator": "error",
"@angular-eslint/no-forward-ref": "error",
"@angular-eslint/no-output-native": "warn",
"@angular-eslint/no-output-on-prefix": "warn",
"@angular-eslint/no-conflicting-lifecycle": "warn",
"@angular-eslint/use-lifecycle-interface": "error",
"@typescript-eslint/no-inferrable-types":[
"error",
@@ -206,7 +183,7 @@
],
"@typescript-eslint/type-annotation-spacing": "error",
"@typescript-eslint/unified-signatures": "error",
"@typescript-eslint/ban-types": "error",
"@typescript-eslint/ban-types": "warn", // todo: deal with {} type issues & re-enable
"@typescript-eslint/no-floating-promises": "warn",
"@typescript-eslint/no-misused-promises": "warn",
"@typescript-eslint/restrict-plus-operands": "warn",
@@ -223,65 +200,17 @@
"@typescript-eslint/no-unsafe-return": "off",
"@typescript-eslint/restrict-template-expressions": "off",
"@typescript-eslint/require-await": "off",
"@typescript-eslint/no-base-to-string": [
"error",
{
"ignoredTypeNames": [
"ResourceType",
"Error"
]
}
],
"deprecation/deprecation": "warn",
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
"import/order": "off",
"import/first": "error",
"import/newline-after-import": "error",
"import/no-duplicates": "error",
"import/no-deprecated": "warn",
"import/no-namespace": "error",
"import-newlines/enforce": [
"error",
{
"items": 1,
"semi": true,
"forceSingleLine": true
}
],
"unused-imports/no-unused-imports": "error",
"lodash/import-scope": [
"error",
"method"
],
"rxjs/no-nested-subscribe": "off", // todo: go over _all_ cases
// Custom DSpace Angular rules
"dspace-angular-ts/themed-component-classes": "error",
"dspace-angular-ts/themed-component-selectors": "error",
"dspace-angular-ts/themed-component-usages": "error"
}
},
{
"files": [
"*.spec.ts"
],
"parserOptions": {
"project": [
"./tsconfig.json",
"./cypress/tsconfig.json"
],
"createDefaultProgram": true
},
"rules": {
"prefer-const": "off",
// Custom DSpace Angular rules
"dspace-angular-ts/themed-component-usages": "error"
]
}
},
{
@@ -292,9 +221,9 @@
"plugin:@angular-eslint/template/recommended"
],
"rules": {
// Custom DSpace Angular rules
"dspace-angular-html/themed-component-usages": "error",
"dspace-angular-html/no-disabled-attribute-on-button": "error"
// todo: re-enable & fix errors
"@angular-eslint/template/no-negated-async": "off",
"@angular-eslint/template/eqeqeq": "off"
}
},
{
@@ -302,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",

3
.gitattributes vendored
View File

@@ -14,6 +14,3 @@
*.scss eol=lf
*.html eol=lf
*.svg eol=lf
# Generated documentation should have LF line endings to reduce git noise
docs/lint/**/*.md eol=lf

View File

@@ -29,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"
@@ -89,14 +91,8 @@ jobs:
- name: Install Yarn dependencies
run: yarn install --frozen-lockfile
- name: Build lint plugins
run: yarn run build:lint
- name: Run lint plugin tests
run: yarn run test:lint:nobuild
- name: Run lint
run: yarn run lint:nobuild --quiet
run: yarn run lint --quiet
- name: Check for circular dependencies
run: yarn run check-circ-deps
@@ -190,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

@@ -4,7 +4,7 @@ name: Docker images
# Run this Build for all pushes to 'main' or maintenance branches, or tagged releases.
# Also run for PRs to ensure PR doesn't break Docker build process
# NOTE: uses "reusable-docker-build.yml" in DSpace/DSpace to actually build each of the Docker images
# https://github.com/DSpace/DSpace/blob/main/.github/workflows/reusable-docker-build.yml
# https://github.com/DSpace/DSpace/blob/dspace-7_x/.github/workflows/reusable-docker-build.yml
#
on:
push:
@@ -27,7 +27,7 @@ jobs:
# Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace-angular'
if: github.repository == 'dspace/dspace-angular'
# Use the reusable-docker-build.yml script from DSpace/DSpace repo to build our Docker image
uses: DSpace/DSpace/.github/workflows/reusable-docker-build.yml@main
uses: DSpace/DSpace/.github/workflows/reusable-docker-build.yml@dspace-7_x
with:
build_id: dspace-angular-dev
image_name: dspace/dspace-angular
@@ -43,7 +43,7 @@ jobs:
# Ensure this job never runs on forked repos. It's only executed for 'dspace/dspace-angular'
if: github.repository == 'dspace/dspace-angular'
# Use the reusable-docker-build.yml script from DSpace/DSpace repo to build our Docker image
uses: DSpace/DSpace/.github/workflows/reusable-docker-build.yml@main
uses: DSpace/DSpace/.github/workflows/reusable-docker-build.yml@dspace-7_x
with:
build_id: dspace-angular-dist
image_name: dspace/dspace-angular

1
.gitignore vendored
View File

@@ -1,5 +1,4 @@
/.angular/cache
/.nx
/__build__
/__server_build__
/node_modules

View File

@@ -2,7 +2,7 @@
# See https://github.com/DSpace/dspace-angular/tree/main/docker for usage details
# Test build:
# docker build -f Dockerfile.dist -t dspace/dspace-angular:dspace-8_x-dist .
# docker build -f Dockerfile.dist -t dspace/dspace-angular:dspace-7_x-dist .
FROM docker.io/node:18-alpine AS build

View File

@@ -35,7 +35,7 @@ https://wiki.lyrasis.org/display/DSDOC7x/Installing+DSpace
Quick start
-----------
**Ensure you're running [Node](https://nodejs.org) `v18.x` or `v20.x`, [npm](https://www.npmjs.com/) >= `v10.x` and [yarn](https://yarnpkg.com) == `v1.x`**
**Ensure you're running [Node](https://nodejs.org) `v16.x` or `v18.x`, [npm](https://www.npmjs.com/) >= `v5.x` and [yarn](https://yarnpkg.com) == `v1.x`**
```bash
# clone the repo
@@ -90,7 +90,7 @@ Requirements
------------
- [Node.js](https://nodejs.org) and [yarn](https://yarnpkg.com)
- Ensure you're running node `v18.x` or `v20.x` and yarn == `v1.x`
- Ensure you're running node `v16.x` or `v18.x` and yarn == `v1.x`
If you have [`nvm`](https://github.com/creationix/nvm#install-script) or [`nvm-windows`](https://github.com/coreybutler/nvm-windows) installed, which is highly recommended, you can run `nvm install --lts && nvm use` to install and start using the latest Node LTS.

View File

@@ -108,22 +108,22 @@
"serve": {
"builder": "@angular-builders/custom-webpack:dev-server",
"options": {
"buildTarget": "dspace-angular:build",
"browserTarget": "dspace-angular:build",
"port": 4000
},
"configurations": {
"development": {
"buildTarget": "dspace-angular:build:development"
"browserTarget": "dspace-angular:build:development"
},
"production": {
"buildTarget": "dspace-angular:build:production"
"browserTarget": "dspace-angular:build:production"
}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"buildTarget": "dspace-angular:build"
"browserTarget": "dspace-angular:build"
}
},
"test": {
@@ -216,23 +216,23 @@
}
},
"serve-ssr": {
"builder": "@angular-devkit/build-angular:ssr-dev-server",
"builder": "@nguniversal/builders:ssr-dev-server",
"options": {
"buildTarget": "dspace-angular:build",
"browserTarget": "dspace-angular:build",
"serverTarget": "dspace-angular:server",
"port": 4000
},
"configurations": {
"production": {
"buildTarget": "dspace-angular:build:production",
"browserTarget": "dspace-angular:build:production",
"serverTarget": "dspace-angular:server:production"
}
}
},
"prerender": {
"builder": "@angular-devkit/build-angular:prerender",
"builder": "@nguniversal/builders:prerender",
"options": {
"buildTarget": "dspace-angular:build:production",
"browserTarget": "dspace-angular:build:production",
"serverTarget": "dspace-angular:server:production",
"routes": [
"/"
@@ -265,8 +265,6 @@
"options": {
"lintFilePatterns": [
"src/**/*.ts",
"cypress/**/*.ts",
"lint/**/*.ts",
"src/**/*.html",
"src/**/*.json5"
]

View File

@@ -17,16 +17,30 @@ ui:
# Trust X-FORWARDED-* headers from proxies (default = true)
useProxies: true
# Angular Server Side Rendering (SSR) settings
ssr:
# Angular Universal / Server Side Rendering (SSR) settings
universal:
# 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
# Path prefixes to enable SSR for. By default these are limited to paths of primary DSpace objects.
# NOTE: The "/handle/" path ensures Handle redirects work via SSR. The "/reload/" path ensures
# hard refreshes (e.g. after login) trigger SSR while fully reloading the page.
paths: [ '/home', '/items/', '/entities/', '/collections/', '/communities/', '/bitstream/', '/bitstreams/', '/handle/', '/reload/' ]
# 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.
@@ -45,16 +59,13 @@ ssr:
# 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
# Enable request performance profiling data collection and printing the results in the server console.
# Defaults to false. Enabling in production is NOT recommended
#enablePerformanceProfiler: false
# The REST API server settings
# NOTE: these settings define which (publicly available) REST API to use. They are usually
# 'synced' with the 'dspace.server.url' setting in your backend's local.cfg.
rest:
ssl: true
host: sandbox.dspace.org
host: demo.dspace.org
port: 443
# NOTE: Space is capitalized because 'namespace' is a reserved string in TypeScript
nameSpace: /server
@@ -166,16 +177,12 @@ submission:
# NOTE: after how many time (milliseconds) submission is saved automatically
# eg. timer: 5 * (1000 * 60); // 5 minutes
timer: 0
# Always show the duplicate detection section if enabled, even if there are no potential duplicates detected
# (a message will be displayed to indicate no matches were found)
duplicateDetection:
alwaysShowSection: false
icons:
metadata:
# NOTE: example of configuration
# # NOTE: metadata name
# - name: dc.author
# # NOTE: fontawesome (v6.x) icon classes and bootstrap utility classes can be used
# # NOTE: fontawesome (v5.x) icon classes and bootstrap utility classes can be used
# style: fas fa-user
- name: dc.author
style: fas fa-user
@@ -186,40 +193,18 @@ submission:
confidence:
# NOTE: example of configuration
# # NOTE: confidence value
# - value: 600
# # NOTE: fontawesome (v6.x) icon classes and bootstrap utility classes can be used
# style: text-success
# icon: fa-circle-check
# # NOTE: the class configured in property style is used by default, the icon property could be used in component
# configured to use a 'icon mode' display (mainly in edit-item page)
# - name: dc.author
# # NOTE: fontawesome (v5.x) icon classes and bootstrap utility classes can be used
# style: fa-user
- value: 600
style: text-success
icon: fa-circle-check
- value: 500
style: text-info
icon: fa-gear
- value: 400
style: text-warning
icon: fa-circle-question
- value: 300
style: text-muted
icon: fa-thumbs-down
- value: 200
style: text-muted
icon: fa-circle-exclamation
- value: 100
style: text-muted
icon: fa-circle-stop
- value: 0
style: text-muted
icon: fa-ban
- value: -1
style: text-muted
icon: fa-circle-xmark
# default configuration
- value: default
style: text-muted
icon: fa-circle-xmark
# Default Language in which the UI will be rendered if the user's browser language is not an active language
defaultLanguage: en
@@ -336,8 +321,6 @@ homePage:
# No. of communities to list per page on the home page
# This will always round to the nearest number from the list of page sizes. e.g. if you set it to 7 it'll use 10
pageSize: 5
# Enable or disable the Discover filters on the homepage
showDiscoverFilters: false
# Item Config
item:
@@ -351,17 +334,8 @@ item:
# settings menu. See pageSizeOptions in 'pagination-component-options.model.ts'.
pageSize: 5
# Community Page Config
community:
# Search tab config
searchSection:
showSidebar: true
# Collection Page Config
collection:
# Search tab config
searchSection:
showSidebar: true
edit:
undoTimeout: 10000 # 10 seconds
@@ -438,11 +412,10 @@ mediaViewer:
# Whether the end user agreement is required before users use the repository.
# If enabled, the user will be required to accept the agreement before they can use the repository.
# And whether the privacy statement/COAR notify support page should exist or not.
# And whether the privacy statement should exist or not.
info:
enableEndUserAgreement: true
enablePrivacyStatement: true
enableCOARNotifySupport: true
# Whether to enable Markdown (https://commonmark.org/) and MathJax (https://www.mathjax.org/)
# display in supported metadata fields. By default, only dc.description.abstract is supported.
@@ -463,80 +436,6 @@ comcolSelectionSort:
sortField: 'dc.title'
sortDirection: 'ASC'
# Example of fallback collection for suggestions import
# suggestion:
# - collectionId: 8f7df5ca-f9c2-47a4-81ec-8a6393d6e5af
# source: "openaire"
# Search settings
search:
# Settings to enable/disable or configure advanced search filters.
advancedFilters:
enabled: false
# List of filters to enable in "Advanced Search" dropdown
filter: [ 'title', 'author', 'subject', 'entityType' ]
#
# 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
# Notify metrics
# Configuration for Notify Admin Dashboard for metrics visualization
notifyMetrics:
# Configuration for received messages
- title: 'admin-notify-dashboard.received-ldn'
boxes:
- color: '#B8DAFF'
title: 'admin-notify-dashboard.NOTIFY.incoming.accepted'
config: 'NOTIFY.incoming.accepted'
description: 'admin-notify-dashboard.NOTIFY.incoming.accepted.description'
- color: '#D4EDDA'
title: 'admin-notify-dashboard.NOTIFY.incoming.processed'
config: 'NOTIFY.incoming.processed'
description: 'admin-notify-dashboard.NOTIFY.incoming.processed.description'
- color: '#FDBBC7'
title: 'admin-notify-dashboard.NOTIFY.incoming.failure'
config: 'NOTIFY.incoming.failure'
description: 'admin-notify-dashboard.NOTIFY.incoming.failure.description'
- color: '#FDBBC7'
title: 'admin-notify-dashboard.NOTIFY.incoming.untrusted'
config: 'NOTIFY.incoming.untrusted'
description: 'admin-notify-dashboard.NOTIFY.incoming.untrusted.description'
- color: '#43515F'
title: 'admin-notify-dashboard.NOTIFY.incoming.involvedItems'
textColor: '#fff'
config: 'NOTIFY.incoming.involvedItems'
description: 'admin-notify-dashboard.NOTIFY.incoming.involvedItems.description'
# Configuration for outgoing messages
- title: 'admin-notify-dashboard.generated-ldn'
boxes:
- color: '#B8DAFF'
title: 'admin-notify-dashboard.NOTIFY.outgoing.queued'
config: 'NOTIFY.outgoing.queued'
description: 'admin-notify-dashboard.NOTIFY.outgoing.queued.description'
- color: '#FDEEBB'
title: 'admin-notify-dashboard.NOTIFY.outgoing.queued_for_retry'
config: 'NOTIFY.outgoing.queued_for_retry'
description: 'admin-notify-dashboard.NOTIFY.outgoing.queued_for_retry.description'
- color: '#FDBBC7'
title: 'admin-notify-dashboard.NOTIFY.outgoing.failure'
config: 'NOTIFY.outgoing.failure'
description: 'admin-notify-dashboard.NOTIFY.outgoing.failure.description'
- color: '#43515F'
title: 'admin-notify-dashboard.NOTIFY.outgoing.involvedItems'
textColor: '#fff'
config: 'NOTIFY.outgoing.involvedItems'
description: 'admin-notify-dashboard.NOTIFY.outgoing.involvedItems.description'
- color: '#D4EDDA'
title: 'admin-notify-dashboard.NOTIFY.outgoing.delivered'
config: 'NOTIFY.outgoing.delivered'
description: 'admin-notify-dashboard.NOTIFY.outgoing.delivered.description'
# Live Region configuration
# Live Region as defined by w3c, https://www.w3.org/TR/wai-aria-1.1/#terms:
# Live regions are perceivable regions of a web page that are typically updated as a
@@ -550,3 +449,17 @@ liveRegion:
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,5 +1,5 @@
rest:
ssl: true
host: sandbox.dspace.org
host: demo.dspace.org
port: 443
nameSpace: /server

View File

@@ -34,6 +34,6 @@ describe('Admin Export Modals', () => {
cy.get('a[data-test="menu.section.export_batch"]').click();
// Analyze <ds-export-batch-selector> for accessibility
testA11y('ds-export-batch-selector');
testA11y('ds-export-metadata-selector');
});
});

View File

@@ -1,17 +0,0 @@
import { testA11y } from 'cypress/support/utils';
describe('Admin Notifications Publication Claim Page', () => {
beforeEach(() => {
// Must login as an Admin to see the page
cy.visit('/admin/notifications/publication-claim');
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-notifications-publication-claim-page').should('be.visible');
// Analyze <ds-admin-notifications-publication-claim-page> for accessibility issues
testA11y('ds-admin-notifications-publication-claim-page');
});
});

View File

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

View File

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

View File

@@ -1,13 +1,13 @@
import { testA11y } from 'cypress/support/utils';
describe('Browse By Author', () => {
it('should pass accessibility tests', () => {
cy.visit('/browse/author');
it('should pass accessibility tests', () => {
cy.visit('/browse/author');
// Wait for <ds-browse-by-metadata-page> to be visible
cy.get('ds-browse-by-metadata').should('be.visible');
// Wait for <ds-browse-by-metadata-page> to be visible
cy.get('ds-browse-by-metadata-page').should('be.visible');
// Analyze <ds-browse-by-metadata-page> for accessibility
testA11y('ds-browse-by-metadata');
});
// Analyze <ds-browse-by-metadata-page> for accessibility
testA11y('ds-browse-by-metadata-page');
});
});

View File

@@ -1,13 +1,13 @@
import { testA11y } from 'cypress/support/utils';
describe('Browse By Date Issued', () => {
it('should pass accessibility tests', () => {
cy.visit('/browse/dateissued');
it('should pass accessibility tests', () => {
cy.visit('/browse/dateissued');
// Wait for <ds-browse-by-date-page> to be visible
cy.get('ds-browse-by-date').should('be.visible');
// Wait for <ds-browse-by-date-page> to be visible
cy.get('ds-browse-by-date-page').should('be.visible');
// Analyze <ds-browse-by-date-page> for accessibility
testA11y('ds-browse-by-date');
});
// Analyze <ds-browse-by-date-page> for accessibility
testA11y('ds-browse-by-date-page');
});
});

View File

@@ -1,13 +1,13 @@
import { testA11y } from 'cypress/support/utils';
describe('Browse By Subject', () => {
it('should pass accessibility tests', () => {
cy.visit('/browse/subject');
it('should pass accessibility tests', () => {
cy.visit('/browse/subject');
// Wait for <ds-browse-by-metadata-page> to be visible
cy.get('ds-browse-by-metadata').should('be.visible');
// Wait for <ds-browse-by-metadata-page> to be visible
cy.get('ds-browse-by-metadata-page').should('be.visible');
// Analyze <ds-browse-by-metadata-page> for accessibility
testA11y('ds-browse-by-metadata');
});
// Analyze <ds-browse-by-metadata-page> for accessibility
testA11y('ds-browse-by-metadata-page');
});
});

View File

@@ -1,13 +1,13 @@
import { testA11y } from 'cypress/support/utils';
describe('Browse By Title', () => {
it('should pass accessibility tests', () => {
cy.visit('/browse/title');
it('should pass accessibility tests', () => {
cy.visit('/browse/title');
// Wait for <ds-browse-by-title-page> to be visible
cy.get('ds-browse-by-title').should('be.visible');
// Wait for <ds-browse-by-title-page> to be visible
cy.get('ds-browse-by-title-page').should('be.visible');
// Analyze <ds-browse-by-title-page> for accessibility
testA11y('ds-browse-by-title');
});
// Analyze <ds-browse-by-title-page> for accessibility
testA11y('ds-browse-by-title-page');
});
});

View File

@@ -1,13 +0,0 @@
beforeEach(() => {
cy.visit('/collections/create?parent='.concat(Cypress.env('DSPACE_TEST_COMMUNITY')));
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should show loading component while saving', () => {
const title = 'Test Collection Title';
cy.get('#title').type(title);
cy.get('button[type="submit"]').click();
cy.get('ds-loading').should('be.visible');
});

View File

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

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

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

View File

@@ -1,13 +0,0 @@
beforeEach(() => {
cy.visit('/communities/create');
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should show loading component while saving', () => {
const title = 'Test Community Title';
cy.get('#title').type(title);
cy.get('button[type="submit"]').click();
cy.get('ds-loading').should('be.visible');
});

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,38 +1,38 @@
import { testA11y } from 'cypress/support/utils';
describe('Header', () => {
it('should pass accessibility tests', () => {
cy.visit('/');
it('should pass accessibility tests', () => {
cy.visit('/');
// Header must first be visible
cy.get('ds-header').should('be.visible');
// Header must first be visible
cy.get('ds-header').should('be.visible');
// Analyze <ds-header> for accessibility
testA11y('ds-header');
});
// Analyze <ds-header> for accessibility
testA11y('ds-header');
});
it('should allow for changing language to German (for example)', () => {
cy.visit('/');
it('should allow for changing language to German (for example)', () => {
cy.visit('/');
// Click the language switcher (globe) in header
cy.get('a[data-test="lang-switch"]').click();
// Click on the "Deusch" language in dropdown
cy.get('#language-menu-list li').contains('Deutsch').click();
// 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');
// 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('a[data-test="login-menu"]').contains('Anmelden');
// Login menu should now be in German
cy.get('[data-test="login-menu"]').contains('Anmelden');
// Change back to English from language switcher
cy.get('a[data-test="lang-switch"]').click();
cy.get('#language-menu-list li').contains('English').click();
// 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');
// 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('a[data-test="login-menu"]').contains('Log In');
});
// Login menu should now be in English
cy.get('[data-test="login-menu"]').contains('Log In');
});
});

View File

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

View File

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

View File

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

View File

@@ -1,15 +0,0 @@
const ADD_TEMPLATE_ITEM_PAGE = '/collections/'.concat(Cypress.env('DSPACE_TEST_COLLECTION')).concat('/itemtemplate');
describe('Item Template', () => {
beforeEach(() => {
cy.visit(ADD_TEMPLATE_ITEM_PAGE);
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
});
it('should load properly', () => {
cy.contains('.ds-header-row .lbl-cell', 'Field', { timeout: 10000 }).should('exist').should('be.visible');
cy.contains('.ds-header-row b', 'Value', { timeout: 10000 }).should('exist').should('be.visible');
cy.contains('.ds-header-row b', 'Lang', { timeout: 10000 }).should('exist').should('be.visible');
cy.contains('.ds-header-row b', 'Edit', { timeout: 10000 }).should('exist').should('be.visible');
});
});

View File

@@ -35,116 +35,116 @@ const page = {
};
describe('Login Modal', () => {
it('should login when clicking button & stay on same page', () => {
const ENTITYPAGE = '/entities/publication/'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION'));
cy.visit(ENTITYPAGE);
it('should login when clicking button & stay on same page', () => {
const ENTITYPAGE = '/entities/publication/'.concat(Cypress.env('DSPACE_TEST_ENTITY_PUBLICATION'));
cy.visit(ENTITYPAGE);
// Login menu should exist
cy.get('ds-log-in').should('exist');
// Login menu should exist
cy.get('ds-log-in').should('exist');
// Login, and the <ds-log-in> tag should no longer exist
page.openLoginMenu();
cy.get('.form-login').should('be.visible');
// Login, and the <ds-log-in> tag should no longer exist
page.openLoginMenu();
cy.get('.form-login').should('be.visible');
page.submitLoginAndPasswordByPressingButton(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
cy.get('ds-log-in').should('not.exist');
page.submitLoginAndPasswordByPressingButton(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
cy.get('ds-log-in').should('not.exist');
// Verify we are still on the same page
cy.url().should('include', ENTITYPAGE);
// Verify we are still on the same page
cy.url().should('include', ENTITYPAGE);
// Open user menu, verify user menu & logout button now available
page.openUserMenu();
cy.get('ds-user-menu').should('be.visible');
cy.get('ds-log-out').should('be.visible');
});
// Open user menu, verify user menu & logout button now available
page.openUserMenu();
cy.get('ds-user-menu').should('be.visible');
cy.get('ds-log-out').should('be.visible');
});
it('should login when clicking enter key & stay on same page', () => {
cy.visit('/home');
it('should login when clicking enter key & stay on same page', () => {
cy.visit('/home');
// Open login menu in header & verify <ds-log-in> tag is visible
page.openLoginMenu();
cy.get('.form-login').should('be.visible');
// Open login menu in header & verify <ds-log-in> tag is visible
page.openLoginMenu();
cy.get('.form-login').should('be.visible');
// 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('ds-log-in').should('not.exist');
// 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('ds-log-in').should('not.exist');
// Verify we are still on homepage
cy.url().should('include', '/home');
// Verify we are still on homepage
cy.url().should('include', '/home');
// Open user menu, verify user menu & logout button now available
page.openUserMenu();
cy.get('ds-user-menu').should('be.visible');
cy.get('ds-log-out').should('be.visible');
});
// Open user menu, verify user menu & logout button now available
page.openUserMenu();
cy.get('ds-user-menu').should('be.visible');
cy.get('ds-log-out').should('be.visible');
});
it('should support logout', () => {
// First authenticate & access homepage
cy.login(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
cy.visit('/');
it('should support logout', () => {
// First authenticate & access homepage
cy.login(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
cy.visit('/');
// Verify ds-log-in tag doesn't exist, but ds-log-out tag does exist
cy.get('ds-log-in').should('not.exist');
cy.get('ds-log-out').should('exist');
// Verify ds-log-in tag doesn't exist, but ds-log-out tag does exist
cy.get('ds-log-in').should('not.exist');
cy.get('ds-log-out').should('exist');
// Click logout button
page.openUserMenu();
page.submitLogoutByPressingButton();
// Click logout button
page.openUserMenu();
page.submitLogoutByPressingButton();
// Verify ds-log-in tag now exists
cy.get('ds-log-in').should('exist');
cy.get('ds-log-out').should('not.exist');
});
// Verify ds-log-in tag now exists
cy.get('ds-log-in').should('exist');
cy.get('ds-log-out').should('not.exist');
});
it('should allow new user registration', () => {
cy.visit('/');
it('should allow new user registration', () => {
cy.visit('/');
page.openLoginMenu();
page.openLoginMenu();
// Registration link should be visible
cy.get('ds-header [data-test="register"]').should('be.visible');
// Registration link should be visible
cy.get('ds-themed-header [data-test="register"]').should('be.visible');
// Click registration link & you should go to registration page
cy.get('ds-header [data-test="register"]').click();
cy.location('pathname').should('eq', '/register');
cy.get('ds-register-email').should('exist');
// Click registration link & you should go to registration page
cy.get('ds-themed-header [data-test="register"]').click();
cy.location('pathname').should('eq', '/register');
cy.get('ds-register-email').should('exist');
// Test accessibility of this page
testA11y('ds-register-email');
});
// Test accessibility of this page
testA11y('ds-register-email');
});
it('should allow forgot password', () => {
cy.visit('/');
it('should allow forgot password', () => {
cy.visit('/');
page.openLoginMenu();
page.openLoginMenu();
// Forgot password link should be visible
cy.get('ds-header [data-test="forgot"]').should('be.visible');
// Forgot password link should be visible
cy.get('ds-themed-header [data-test="forgot"]').should('be.visible');
// Click link & you should go to Forgot Password page
cy.get('ds-header [data-test="forgot"]').click();
cy.location('pathname').should('eq', '/forgot');
cy.get('ds-forgot-email').should('exist');
// Click link & you should go to Forgot Password page
cy.get('ds-themed-header [data-test="forgot"]').click();
cy.location('pathname').should('eq', '/forgot');
cy.get('ds-forgot-email').should('exist');
// Test accessibility of this page
testA11y('ds-forgot-email');
});
// Test accessibility of this page
testA11y('ds-forgot-email');
});
it('should pass accessibility tests in menus', () => {
cy.visit('/');
it('should pass accessibility tests in menus', () => {
cy.visit('/');
// Open login menu & verify accessibility
page.openLoginMenu();
cy.get('ds-log-in').should('exist');
testA11y('ds-log-in');
// Open login menu & verify accessibility
page.openLoginMenu();
cy.get('ds-log-in').should('exist');
testA11y('ds-log-in');
// Now login
page.submitLoginAndPasswordByPressingButton(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
cy.get('ds-log-in').should('not.exist');
// Now login
page.submitLoginAndPasswordByPressingButton(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
cy.get('ds-log-in').should('not.exist');
// Open user menu, verify user menu accesibility
page.openUserMenu();
cy.get('ds-user-menu').should('be.visible');
testA11y('ds-user-menu');
});
// Open user menu, verify user menu accesibility
page.openUserMenu();
cy.get('ds-user-menu').should('be.visible');
testA11y('ds-user-menu');
});
});

View File

@@ -1,134 +1,134 @@
import { testA11y } from 'cypress/support/utils';
describe('My DSpace page', () => {
it('should display recent submissions and pass accessibility tests', () => {
cy.visit('/mydspace');
it('should display recent submissions and pass accessibility tests', () => {
cy.visit('/mydspace');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
cy.get('ds-my-dspace-page').should('be.visible');
cy.get('ds-my-dspace-page').should('be.visible');
// At least one recent submission should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
// At least one recent submission 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('.filter-toggle').click({ multiple: true });
// Click each filter toggle to open *every* filter
// (As we want to scan filter section for accessibility issues as well)
cy.get('.filter-toggle').click({ multiple: true });
// Analyze <ds-my-dspace-page> for accessibility issues
testA11y('ds-my-dspace-page');
});
it('should have a working detailed view that passes accessibility tests', () => {
cy.visit('/mydspace');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
cy.get('ds-my-dspace-page').should('be.visible');
// Click button in sidebar to display detailed view
cy.get('ds-search-sidebar [data-test="detail-view"]').click();
cy.get('ds-object-detail').should('be.visible');
// Analyze <ds-my-dspace-page> for accessibility issues
testA11y('ds-my-dspace-page');
});
// NOTE: Deleting existing submissions is exercised by submission.spec.ts
it('should let you start a new submission & edit in-progress submissions', () => {
cy.visit('/mydspace');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Open the New Submission dropdown
cy.get('button[data-test="submission-dropdown"]').click();
// Click on the "Item" type in that dropdown
cy.get('#entityControlsDropdownMenu button[title="none"]').click();
// This should display the <ds-create-item-parent-selector> (popup window)
cy.get('ds-create-item-parent-selector').should('be.visible');
// Type in a known Collection name in the search box
cy.get('ds-authorized-collection-selector input[type="search"]').type(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME'));
// Click on the button matching that known Collection name
cy.get('ds-authorized-collection-selector button[title="'.concat(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME')).concat('"]')).click();
// New URL should include /workspaceitems, as we've started a new submission
cy.url().should('include', '/workspaceitems');
// The Submission edit form tag should be visible
cy.get('ds-submission-edit').should('be.visible');
// A Collection menu button should exist & its value should be the selected collection
cy.get('#collectionControlsMenuButton span').should('have.text', Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME'));
// Now that we've created a submission, we'll test that we can go back and Edit it.
// Get our Submission URL, to parse out the ID of this new submission
cy.location().then(fullUrl => {
// This will be the full path (/workspaceitems/[id]/edit)
const path = fullUrl.pathname;
// Split on the slashes
const subpaths = path.split('/');
// Part 2 will be the [id] of the submission
const id = subpaths[2];
// Click the "Save for Later" button to save this submission
cy.get('ds-submission-form-footer [data-test="save-for-later"]').click();
// "Save for Later" should send us to MyDSpace
cy.url().should('include', '/mydspace');
// Close any open notifications, to make sure they don't get in the way of next steps
cy.get('[data-dismiss="alert"]').click({ multiple: true });
// This is the GET command that will actually run the search
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
// On MyDSpace, find the submission we just created via its ID
cy.get('[data-test="search-box"]').type(id);
cy.get('[data-test="search-button"]').click();
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// Click the Edit button for this in-progress submission
cy.get('#edit_' + id).click();
// Should send us back to the submission form
cy.url().should('include', '/workspaceitems/' + id + '/edit');
// Discard our new submission by clicking Discard in Submission form & confirming
cy.get('ds-submission-form-footer [data-test="discard"]').click();
cy.get('button#discard_submit').click();
// Discarding should send us back to MyDSpace
cy.url().should('include', '/mydspace');
// Analyze <ds-my-dspace-page> for accessibility issues
testA11y('ds-my-dspace-page');
});
});
it('should let you import from external sources', () => {
cy.visit('/mydspace');
it('should have a working detailed view that passes accessibility tests', () => {
cy.visit('/mydspace');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Open the New Import dropdown
cy.get('button[data-test="import-dropdown"]').click();
// Click on the "Item" type in that dropdown
cy.get('#importControlsDropdownMenu button[title="none"]').click();
cy.get('ds-my-dspace-page').should('be.visible');
// New URL should include /import-external, as we've moved to the import page
cy.url().should('include', '/import-external');
// Click button in sidebar to display detailed view
cy.get('ds-search-sidebar [data-test="detail-view"]').click();
// The external import searchbox should be visible
cy.get('ds-submission-import-external-searchbar').should('be.visible');
cy.get('ds-object-detail').should('be.visible');
// Test for accessibility issues
testA11y('ds-submission-import-external');
});
// Analyze <ds-my-dspace-page> for accessibility issues
testA11y('ds-my-dspace-page');
});
// NOTE: Deleting existing submissions is exercised by submission.spec.ts
it('should let you start a new submission & edit in-progress submissions', () => {
cy.visit('/mydspace');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Open the New Submission dropdown
cy.get('button[data-test="submission-dropdown"]').click();
// Click on the "Item" type in that dropdown
cy.get('#entityControlsDropdownMenu button[title="none"]').click();
// This should display the <ds-create-item-parent-selector> (popup window)
cy.get('ds-create-item-parent-selector').should('be.visible');
// Type in a known Collection name in the search box
cy.get('ds-authorized-collection-selector input[type="search"]').type(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME'));
// Click on the button matching that known Collection name
cy.get('ds-authorized-collection-selector button[title="'.concat(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME')).concat('"]')).click();
// New URL should include /workspaceitems, as we've started a new submission
cy.url().should('include', '/workspaceitems');
// The Submission edit form tag should be visible
cy.get('ds-submission-edit').should('be.visible');
// A Collection menu button should exist & its value should be the selected collection
cy.get('#collectionControlsMenuButton span').should('have.text', Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME'));
// Now that we've created a submission, we'll test that we can go back and Edit it.
// Get our Submission URL, to parse out the ID of this new submission
cy.location().then(fullUrl => {
// This will be the full path (/workspaceitems/[id]/edit)
const path = fullUrl.pathname;
// Split on the slashes
const subpaths = path.split('/');
// Part 2 will be the [id] of the submission
const id = subpaths[2];
// Click the "Save for Later" button to save this submission
cy.get('ds-submission-form-footer [data-test="save-for-later"]').click();
// "Save for Later" should send us to MyDSpace
cy.url().should('include', '/mydspace');
// Close any open notifications, to make sure they don't get in the way of next steps
cy.get('[data-dismiss="alert"]').click({multiple: true});
// This is the GET command that will actually run the search
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
// On MyDSpace, find the submission we just created via its ID
cy.get('[data-test="search-box"]').type(id);
cy.get('[data-test="search-button"]').click();
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// Click the Edit button for this in-progress submission
cy.get('#edit_' + id).click();
// Should send us back to the submission form
cy.url().should('include', '/workspaceitems/' + id + '/edit');
// Discard our new submission by clicking Discard in Submission form & confirming
cy.get('ds-submission-form-footer [data-test="discard"]').click();
cy.get('button#discard_submit').click();
// Discarding should send us back to MyDSpace
cy.url().should('include', '/mydspace');
});
});
it('should let you import from external sources', () => {
cy.visit('/mydspace');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Open the New Import dropdown
cy.get('button[data-test="import-dropdown"]').click();
// Click on the "Item" type in that dropdown
cy.get('#importControlsDropdownMenu button[title="none"]').click();
// New URL should include /import-external, as we've moved to the import page
cy.url().should('include', '/import-external');
// The external import searchbox should be visible
cy.get('ds-submission-import-external-searchbar').should('be.visible');
// Test for accessibility issues
testA11y('ds-submission-import-external');
});
});

View File

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

View File

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

View File

@@ -1,64 +1,64 @@
const page = {
fillOutQueryInNavBar(query) {
// Click the magnifying glass
cy.get('ds-header [data-test="header-search-icon"]').click();
// Fill out a query in input that appears
cy.get('ds-header [data-test="header-search-box"]').type(query);
},
submitQueryByPressingEnter() {
cy.get('ds-header [data-test="header-search-box"]').type('{enter}');
},
submitQueryByPressingIcon() {
cy.get('ds-header [data-test="header-search-icon"]').click();
},
fillOutQueryInNavBar(query) {
// Click the magnifying glass
cy.get('ds-themed-header [data-test="header-search-icon"]').click();
// Fill out a query in input that appears
cy.get('ds-themed-header [data-test="header-search-box"]').type(query);
},
submitQueryByPressingEnter() {
cy.get('ds-themed-header [data-test="header-search-box"]').type('{enter}');
},
submitQueryByPressingIcon() {
cy.get('ds-themed-header [data-test="header-search-icon"]').click();
}
};
describe('Search from Navigation Bar', () => {
// NOTE: these tests currently assume this query will return results!
const query = Cypress.env('DSPACE_TEST_SEARCH_TERM');
// NOTE: these tests currently assume this query will return results!
const query = Cypress.env('DSPACE_TEST_SEARCH_TERM');
it('should go to search page with correct query if submitted (from home)', () => {
cy.visit('/');
// This is the GET command that will actually run the search
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
// Run the search
page.fillOutQueryInNavBar(query);
page.submitQueryByPressingEnter();
// New URL should include query param
cy.url().should('include', 'query='.concat(query));
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// At least one search result should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
});
it('should go to search page with correct query if submitted (from home)', () => {
cy.visit('/');
// This is the GET command that will actually run the search
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
// Run the search
page.fillOutQueryInNavBar(query);
page.submitQueryByPressingEnter();
// New URL should include query param
cy.url().should('include', 'query='.concat(query));
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// At least one search result should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
});
it('should go to search page with correct query if submitted (from search)', () => {
cy.visit('/search');
// This is the GET command that will actually run the search
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
// Run the search
page.fillOutQueryInNavBar(query);
page.submitQueryByPressingEnter();
// New URL should include query param
cy.url().should('include', 'query='.concat(query));
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// At least one search result should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
});
it('should go to search page with correct query if submitted (from search)', () => {
cy.visit('/search');
// This is the GET command that will actually run the search
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
// Run the search
page.fillOutQueryInNavBar(query);
page.submitQueryByPressingEnter();
// New URL should include query param
cy.url().should('include', 'query='.concat(query));
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// At least one search result should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
});
it('should allow user to also submit query by clicking icon', () => {
cy.visit('/');
// This is the GET command that will actually run the search
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
// Run the search
page.fillOutQueryInNavBar(query);
page.submitQueryByPressingIcon();
// New URL should include query param
cy.url().should('include', 'query='.concat(query));
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// At least one search result should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
});
it('should allow user to also submit query by clicking icon', () => {
cy.visit('/');
// This is the GET command that will actually run the search
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
// Run the search
page.fillOutQueryInNavBar(query);
page.submitQueryByPressingIcon();
// New URL should include query param
cy.url().should('include', 'query='.concat(query));
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// At least one search result should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
});
});

View File

@@ -1,57 +1,57 @@
import { testA11y } from 'cypress/support/utils';
import { Options } from 'cypress-axe';
import { testA11y } from 'cypress/support/utils';
describe('Search Page', () => {
// NOTE: these tests currently assume this query will return results!
const query = Cypress.env('DSPACE_TEST_SEARCH_TERM');
// NOTE: these tests currently assume this query will return results!
const query = Cypress.env('DSPACE_TEST_SEARCH_TERM');
it('should redirect to the correct url when query was set and submit button was triggered', () => {
const queryString = 'Another interesting query string';
cy.visit('/search');
// Type query in searchbox & click search button
cy.get('[data-test="search-box"]').type(queryString);
cy.get('[data-test="search-button"]').click();
cy.url().should('include', 'query=' + encodeURI(queryString));
});
it('should redirect to the correct url when query was set and submit button was triggered', () => {
const queryString = 'Another interesting query string';
cy.visit('/search');
// Type query in searchbox & click search button
cy.get('[data-test="search-box"]').type(queryString);
cy.get('[data-test="search-button"]').click();
cy.url().should('include', 'query=' + encodeURI(queryString));
});
it('should load results and pass accessibility tests', () => {
cy.visit('/search?query='.concat(query));
cy.get('[data-test="search-box"]').should('have.value', query);
it('should load results and pass accessibility tests', () => {
cy.visit('/search?query='.concat(query));
cy.get('[data-test="search-box"]').should('have.value', query);
// <ds-search-page> tag must be loaded
cy.get('ds-search-page').should('be.visible');
// <ds-search-page> tag must be loaded
cy.get('ds-search-page').should('be.visible');
// At least one search result should be displayed
cy.get('[data-test="list-object"]').should('be.visible');
// 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 });
// 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-search-page> for accessibility issues
testA11y('ds-search-page');
});
// Analyze <ds-search-page> for accessibility issues
testA11y('ds-search-page');
});
it('should have a working grid view that passes accessibility tests', () => {
cy.visit('/search?query='.concat(query));
it('should have a working grid view that passes accessibility tests', () => {
cy.visit('/search?query='.concat(query));
// Click button in sidebar to display grid view
cy.get('ds-search-sidebar [data-test="grid-view"]').click();
// Click button in sidebar to display grid view
cy.get('ds-search-sidebar [data-test="grid-view"]').click();
// <ds-search-page> tag must be loaded
cy.get('ds-search-page').should('be.visible');
// <ds-search-page> tag must be loaded
cy.get('ds-search-page').should('be.visible');
// At least one grid object (card) should be displayed
cy.get('[data-test="grid-object"]').should('be.visible');
// At least one grid object (card) should be displayed
cy.get('[data-test="grid-object"]').should('be.visible');
// Analyze <ds-search-page> for accessibility issues
testA11y('ds-search-page',
// Analyze <ds-search-page> for accessibility issues
testA11y('ds-search-page',
{
rules: {
// Card titles fail this test currently
'heading-order': { enabled: false },
},
} as Options,
);
});
rules: {
// Card titles fail this test currently
'heading-order': { enabled: false }
}
} as Options
);
});
});

View File

@@ -4,224 +4,224 @@ import { Options } from 'cypress-axe';
describe('New Submission page', () => {
// NOTE: We already test that new Item submissions can be started from MyDSpace in my-dspace.spec.ts
it('should create a new submission when using /submit path & pass accessibility', () => {
// Test that calling /submit with collection & entityType will create a new submission
cy.visit('/submit?collection='.concat(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_UUID')).concat('&entityType=none'));
// NOTE: We already test that new Item submissions can be started from MyDSpace in my-dspace.spec.ts
it('should create a new submission when using /submit path & pass accessibility', () => {
// Test that calling /submit with collection & entityType will create a new submission
cy.visit('/submit?collection='.concat(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_UUID')).concat('&entityType=none'));
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Should redirect to /workspaceitems, as we've started a new submission
cy.url().should('include', '/workspaceitems');
// Should redirect to /workspaceitems, as we've started a new submission
cy.url().should('include', '/workspaceitems');
// The Submission edit form tag should be visible
cy.get('ds-submission-edit').should('be.visible');
// The Submission edit form tag should be visible
cy.get('ds-submission-edit').should('be.visible');
// A Collection menu button should exist & it's value should be the selected collection
cy.get('#collectionControlsMenuButton span').should('have.text', Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME'));
// A Collection menu button should exist & it's value should be the selected collection
cy.get('#collectionControlsMenuButton span').should('have.text', Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_NAME'));
// 4 sections should be visible by default
cy.get('div#section_traditionalpageone').should('be.visible');
cy.get('div#section_traditionalpagetwo').should('be.visible');
cy.get('div#section_upload').should('be.visible');
cy.get('div#section_license').should('be.visible');
// 4 sections should be visible by default
cy.get('div#section_traditionalpageone').should('be.visible');
cy.get('div#section_traditionalpagetwo').should('be.visible');
cy.get('div#section_upload').should('be.visible');
cy.get('div#section_license').should('be.visible');
// Test entire page for accessibility
testA11y('ds-submission-edit',
// Test entire page for accessibility
testA11y('ds-submission-edit',
{
rules: {
// Author & Subject fields have invalid "aria-multiline" attrs.
// See https://github.com/DSpace/dspace-angular/issues/1272
'aria-allowed-attr': { enabled: false },
// All panels are accordians & fail "aria-required-children" and "nested-interactive".
// Seem to require updating ng-bootstrap and https://github.com/DSpace/dspace-angular/issues/2216
'aria-required-children': { enabled: false },
'nested-interactive': { enabled: false },
// All select boxes fail to have a name / aria-label.
// This is a bug in ng-dynamic-forms and may require https://github.com/DSpace/dspace-angular/issues/2216
'select-name': { enabled: false },
},
rules: {
// Author & Subject fields have invalid "aria-multiline" attrs.
// See https://github.com/DSpace/dspace-angular/issues/1272
'aria-allowed-attr': { enabled: false },
// All panels are accordians & fail "aria-required-children" and "nested-interactive".
// Seem to require updating ng-bootstrap and https://github.com/DSpace/dspace-angular/issues/2216
'aria-required-children': { enabled: false },
'nested-interactive': { enabled: false },
// All select boxes fail to have a name / aria-label.
// This is a bug in ng-dynamic-forms and may require https://github.com/DSpace/dspace-angular/issues/2216
'select-name': { enabled: false },
}
} as Options,
);
} as Options
);
// Discard button should work
// Clicking it will display a confirmation, which we will confirm with another click
cy.get('button#discard').click();
cy.get('button#discard_submit').click();
});
it('should block submission & show errors if required fields are missing', () => {
// Create a new submission
cy.visit('/submit?collection='.concat(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_UUID')).concat('&entityType=none'));
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Attempt an immediate deposit without filling out any fields
cy.get('button#deposit').click();
// A warning alert should display.
cy.get('ds-notification div.alert-success').should('not.exist');
cy.get('ds-notification div.alert-warning').should('be.visible');
// First section should have an exclamation error in the header
// (as it has required fields)
cy.get('div#traditionalpageone-header i.fa-exclamation-circle').should('be.visible');
// Title field should have class "is-invalid" applied, as it's required
cy.get('input#dc_title').should('have.class', 'is-invalid');
// Date Year field should also have "is-valid" class
cy.get('input#dc_date_issued_year').should('have.class', 'is-invalid');
// FINALLY, cleanup after ourselves. This also exercises the MyDSpace delete button.
// Get our Submission URL, to parse out the ID of this submission
cy.location().then(fullUrl => {
// This will be the full path (/workspaceitems/[id]/edit)
const path = fullUrl.pathname;
// Split on the slashes
const subpaths = path.split('/');
// Part 2 will be the [id] of the submission
const id = subpaths[2];
// Even though form is incomplete, the "Save for Later" button should still work
cy.get('button#saveForLater').click();
// "Save for Later" should send us to MyDSpace
cy.url().should('include', '/mydspace');
// A success alert should be visible
cy.get('ds-notification div.alert-success').should('be.visible');
// Now, dismiss any open alert boxes (may be multiple, as tests run quickly)
cy.get('[data-dismiss="alert"]').click({ multiple: true });
// This is the GET command that will actually run the search
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
// On MyDSpace, find the submission we just saved via its ID
cy.get('[data-test="search-box"]').type(id);
cy.get('[data-test="search-button"]').click();
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// Delete our created submission & confirm deletion
cy.get('button#delete_' + id).click();
cy.get('button#delete_confirm').click();
});
});
it('should allow for deposit if all required fields completed & file uploaded', () => {
// Create a new submission
cy.visit('/submit?collection='.concat(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_UUID')).concat('&entityType=none'));
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Fill out all required fields (Title, Date)
cy.get('input#dc_title').type('DSpace logo uploaded via e2e tests');
cy.get('input#dc_date_issued_year').type('2022');
// Confirm the required license by checking checkbox
// (NOTE: requires "force:true" cause Cypress claims this checkbox is covered by its own <span>)
cy.get('input#granted').check( { force: true } );
// Before using Cypress drag & drop, we have to manually trigger the "dragover" event.
// This ensures our UI displays the dropzone that covers the entire submission page.
// (For some reason Cypress drag & drop doesn't trigger this even itself & upload won't work without this trigger)
cy.get('ds-uploader').trigger('dragover');
// This is the POST command that will upload the file
cy.intercept('POST', '/server/api/submission/workspaceitems/*').as('upload');
// Upload our DSpace logo via drag & drop onto submission form
// cy.get('div#section_upload')
cy.get('div.ds-document-drop-zone').selectFile('src/assets/images/dspace-logo.svg', {
action: 'drag-drop',
// Discard button should work
// Clicking it will display a confirmation, which we will confirm with another click
cy.get('button#discard').click();
cy.get('button#discard_submit').click();
});
// Wait for upload to complete before proceeding
cy.wait('@upload');
it('should block submission & show errors if required fields are missing', () => {
// Create a new submission
cy.visit('/submit?collection='.concat(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_UUID')).concat('&entityType=none'));
// Wait for deposit button to not be disabled & click it.
cy.get('button#deposit').should('not.be.disabled').click();
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// No warnings should exist. Instead, just successful deposit alert is displayed
cy.get('ds-notification div.alert-warning').should('not.exist');
cy.get('ds-notification div.alert-success').should('be.visible');
});
// Attempt an immediate deposit without filling out any fields
cy.get('button#deposit').click();
it('is possible to submit a new "Person" and that form passes accessibility', () => {
// To submit a different entity type, we'll start from MyDSpace
cy.visit('/mydspace');
// A warning alert should display.
cy.get('ds-notification div.alert-success').should('not.exist');
cy.get('ds-notification div.alert-warning').should('be.visible');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
// NOTE: At this time, we MUST login as admin to submit Person objects
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
// First section should have an exclamation error in the header
// (as it has required fields)
cy.get('div#traditionalpageone-header i.fa-exclamation-circle').should('be.visible');
// Open the New Submission dropdown
cy.get('button[data-test="submission-dropdown"]').click();
// Click on the "Person" type in that dropdown
cy.get('#entityControlsDropdownMenu button[title="Person"]').click();
// Title field should have class "is-invalid" applied, as it's required
cy.get('input#dc_title').should('have.class', 'is-invalid');
// This should display the <ds-create-item-parent-selector> (popup window)
cy.get('ds-create-item-parent-selector').should('be.visible');
// Date Year field should also have "is-valid" class
cy.get('input#dc_date_issued_year').should('have.class', 'is-invalid');
// Type in a known Collection name in the search box
cy.get('ds-authorized-collection-selector input[type="search"]').type(Cypress.env('DSPACE_TEST_SUBMIT_PERSON_COLLECTION_NAME'));
// FINALLY, cleanup after ourselves. This also exercises the MyDSpace delete button.
// Get our Submission URL, to parse out the ID of this submission
cy.location().then(fullUrl => {
// This will be the full path (/workspaceitems/[id]/edit)
const path = fullUrl.pathname;
// Split on the slashes
const subpaths = path.split('/');
// Part 2 will be the [id] of the submission
const id = subpaths[2];
// Click on the button matching that known Collection name
cy.get('ds-authorized-collection-selector button[title="'.concat(Cypress.env('DSPACE_TEST_SUBMIT_PERSON_COLLECTION_NAME')).concat('"]')).click();
// Even though form is incomplete, the "Save for Later" button should still work
cy.get('button#saveForLater').click();
// New URL should include /workspaceitems, as we've started a new submission
cy.url().should('include', '/workspaceitems');
// "Save for Later" should send us to MyDSpace
cy.url().should('include', '/mydspace');
// The Submission edit form tag should be visible
cy.get('ds-submission-edit').should('be.visible');
// A success alert should be visible
cy.get('ds-notification div.alert-success').should('be.visible');
// Now, dismiss any open alert boxes (may be multiple, as tests run quickly)
cy.get('[data-dismiss="alert"]').click({multiple: true});
// A Collection menu button should exist & its value should be the selected collection
cy.get('#collectionControlsMenuButton span').should('have.text', Cypress.env('DSPACE_TEST_SUBMIT_PERSON_COLLECTION_NAME'));
// This is the GET command that will actually run the search
cy.intercept('GET', '/server/api/discover/search/objects*').as('search-results');
// On MyDSpace, find the submission we just saved via its ID
cy.get('[data-test="search-box"]').type(id);
cy.get('[data-test="search-button"]').click();
// 3 sections should be visible by default
cy.get('div#section_personStep').should('be.visible');
cy.get('div#section_upload').should('be.visible');
cy.get('div#section_license').should('be.visible');
// Wait for search results to come back from the above GET command
cy.wait('@search-results');
// Test entire page for accessibility
testA11y('ds-submission-edit',
// Delete our created submission & confirm deletion
cy.get('button#delete_' + id).click();
cy.get('button#delete_confirm').click();
});
});
it('should allow for deposit if all required fields completed & file uploaded', () => {
// Create a new submission
cy.visit('/submit?collection='.concat(Cypress.env('DSPACE_TEST_SUBMIT_COLLECTION_UUID')).concat('&entityType=none'));
// This page is restricted, so we will be shown the login form. Fill it out & submit.
cy.loginViaForm(Cypress.env('DSPACE_TEST_SUBMIT_USER'), Cypress.env('DSPACE_TEST_SUBMIT_USER_PASSWORD'));
// Fill out all required fields (Title, Date)
cy.get('input#dc_title').type('DSpace logo uploaded via e2e tests');
cy.get('input#dc_date_issued_year').type('2022');
// Confirm the required license by checking checkbox
// (NOTE: requires "force:true" cause Cypress claims this checkbox is covered by its own <span>)
cy.get('input#granted').check( {force: true} );
// Before using Cypress drag & drop, we have to manually trigger the "dragover" event.
// This ensures our UI displays the dropzone that covers the entire submission page.
// (For some reason Cypress drag & drop doesn't trigger this even itself & upload won't work without this trigger)
cy.get('ds-uploader').trigger('dragover');
// This is the POST command that will upload the file
cy.intercept('POST', '/server/api/submission/workspaceitems/*').as('upload');
// Upload our DSpace logo via drag & drop onto submission form
// cy.get('div#section_upload')
cy.get('div.ds-document-drop-zone').selectFile('src/assets/images/dspace-logo.svg', {
action: 'drag-drop'
});
// Wait for upload to complete before proceeding
cy.wait('@upload');
// Wait for deposit button to not be disabled & click it.
cy.get('button#deposit').should('not.be.disabled').click();
// No warnings should exist. Instead, just successful deposit alert is displayed
cy.get('ds-notification div.alert-warning').should('not.exist');
cy.get('ds-notification div.alert-success').should('be.visible');
});
it('is possible to submit a new "Person" and that form passes accessibility', () => {
// To submit a different entity type, we'll start from MyDSpace
cy.visit('/mydspace');
// This page is restricted, so we will be shown the login form. Fill it out & submit.
// NOTE: At this time, we MUST login as admin to submit Person objects
cy.loginViaForm(Cypress.env('DSPACE_TEST_ADMIN_USER'), Cypress.env('DSPACE_TEST_ADMIN_PASSWORD'));
// Open the New Submission dropdown
cy.get('button[data-test="submission-dropdown"]').click();
// Click on the "Person" type in that dropdown
cy.get('#entityControlsDropdownMenu button[title="Person"]').click();
// This should display the <ds-create-item-parent-selector> (popup window)
cy.get('ds-create-item-parent-selector').should('be.visible');
// Type in a known Collection name in the search box
cy.get('ds-authorized-collection-selector input[type="search"]').type(Cypress.env('DSPACE_TEST_SUBMIT_PERSON_COLLECTION_NAME'));
// Click on the button matching that known Collection name
cy.get('ds-authorized-collection-selector button[title="'.concat(Cypress.env('DSPACE_TEST_SUBMIT_PERSON_COLLECTION_NAME')).concat('"]')).click();
// New URL should include /workspaceitems, as we've started a new submission
cy.url().should('include', '/workspaceitems');
// The Submission edit form tag should be visible
cy.get('ds-submission-edit').should('be.visible');
// A Collection menu button should exist & its value should be the selected collection
cy.get('#collectionControlsMenuButton span').should('have.text', Cypress.env('DSPACE_TEST_SUBMIT_PERSON_COLLECTION_NAME'));
// 3 sections should be visible by default
cy.get('div#section_personStep').should('be.visible');
cy.get('div#section_upload').should('be.visible');
cy.get('div#section_license').should('be.visible');
// Test entire page for accessibility
testA11y('ds-submission-edit',
{
rules: {
// All panels are accordians & fail "aria-required-children" and "nested-interactive".
// Seem to require updating ng-bootstrap and https://github.com/DSpace/dspace-angular/issues/2216
'aria-required-children': { enabled: false },
'nested-interactive': { enabled: false },
},
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,
);
} as Options
);
// Click the lookup button next to "Publication" field
cy.get('button[data-test="lookup-button"]').click();
// Click the lookup button next to "Publication" field
cy.get('button[data-test="lookup-button"]').click();
// A popup modal window should be visible
cy.get('ds-dynamic-lookup-relation-modal').should('be.visible');
// A popup modal window should be visible
cy.get('ds-dynamic-lookup-relation-modal').should('be.visible');
// Popup modal should also pass accessibility tests
//testA11y('ds-dynamic-lookup-relation-modal');
testA11y({
include: ['ds-dynamic-lookup-relation-modal'],
exclude: [
['ul.nav-tabs'], // Tabs at top of model have several issues which seem to be caused by ng-bootstrap
],
// Popup modal should also pass accessibility tests
//testA11y('ds-dynamic-lookup-relation-modal');
testA11y({
include: ['ds-dynamic-lookup-relation-modal'],
exclude: [
['ul.nav-tabs'] // Tabs at top of model have several issues which seem to be caused by ng-bootstrap
],
});
// Close popup window
cy.get('ds-dynamic-lookup-relation-modal button.close').click();
// Back on the form, click the discard button to remove new submission
// Clicking it will display a confirmation, which we will confirm with another click
cy.get('button#discard').click();
cy.get('button#discard_submit').click();
});
// Close popup window
cy.get('ds-dynamic-lookup-relation-modal button.close').click();
// Back on the form, click the discard button to remove new submission
// Clicking it will display a confirmation, which we will confirm with another click
cy.get('button#discard').click();
cy.get('button#discard_submit').click();
});
});

View File

@@ -9,51 +9,51 @@ let REST_DOMAIN: string;
// Plugins enable you to tap into, modify, or extend the internal behavior of Cypress
// For more info, visit https://on.cypress.io/plugins-api
module.exports = (on, config) => {
on('task', {
// Define "log" and "table" tasks, used for logging accessibility errors during CI
// Borrowed from https://github.com/component-driven/cypress-axe#in-cypress-plugins-file
log(message: string) {
console.log(message);
return null;
},
table(message: string) {
console.table(message);
return null;
},
// Cypress doesn't have access to the running application in Node.js.
// So, it's not possible to inject or load the AppConfig or environment of the Angular UI.
// Instead, we'll read our running application's config.json, which contains the configs &
// is regenerated at runtime each time the Angular UI application starts up.
readUIConfig() {
// Check if we have a config.json in the src/assets. If so, use that.
// This is where it's written when running "ng e2e" or "yarn serve"
if (fs.existsSync('./src/assets/config.json')) {
return fs.readFileSync('./src/assets/config.json', 'utf8');
// Otherwise, check the dist/browser/assets
// This is where it's written when running "serve:ssr", which is what CI uses to start the frontend
} else if (fs.existsSync('./dist/browser/assets/config.json')) {
return fs.readFileSync('./dist/browser/assets/config.json', 'utf8');
}
on('task', {
// Define "log" and "table" tasks, used for logging accessibility errors during CI
// Borrowed from https://github.com/component-driven/cypress-axe#in-cypress-plugins-file
log(message: string) {
console.log(message);
return null;
},
table(message: string) {
console.table(message);
return null;
},
// Cypress doesn't have access to the running application in Node.js.
// So, it's not possible to inject or load the AppConfig or environment of the Angular UI.
// Instead, we'll read our running application's config.json, which contains the configs &
// is regenerated at runtime each time the Angular UI application starts up.
readUIConfig() {
// Check if we have a config.json in the src/assets. If so, use that.
// This is where it's written when running "ng e2e" or "yarn serve"
if (fs.existsSync('./src/assets/config.json')) {
return fs.readFileSync('./src/assets/config.json', 'utf8');
// Otherwise, check the dist/browser/assets
// This is where it's written when running "serve:ssr", which is what CI uses to start the frontend
} else if (fs.existsSync('./dist/browser/assets/config.json')) {
return fs.readFileSync('./dist/browser/assets/config.json', 'utf8');
}
return null;
},
// Save value of REST Base URL, looked up before all tests.
// This allows other tests to use it easily via getRestBaseURL() below.
saveRestBaseURL(url: string) {
return (REST_BASE_URL = url);
},
// Retrieve currently saved value of REST Base URL
getRestBaseURL() {
return REST_BASE_URL ;
},
// Save value of REST Domain, looked up before all tests.
// This allows other tests to use it easily via getRestBaseDomain() below.
saveRestBaseDomain(domain: string) {
return (REST_DOMAIN = domain);
},
// Retrieve currently saved value of REST Domain
getRestBaseDomain() {
return REST_DOMAIN ;
},
});
return null;
},
// Save value of REST Base URL, looked up before all tests.
// This allows other tests to use it easily via getRestBaseURL() below.
saveRestBaseURL(url: string) {
return (REST_BASE_URL = url);
},
// Retrieve currently saved value of REST Base URL
getRestBaseURL() {
return REST_BASE_URL ;
},
// Save value of REST Domain, looked up before all tests.
// This allows other tests to use it easily via getRestBaseDomain() below.
saveRestBaseDomain(domain: string) {
return (REST_DOMAIN = domain);
},
// Retrieve currently saved value of REST Domain
getRestBaseDomain() {
return REST_DOMAIN ;
}
});
};

View File

@@ -3,14 +3,8 @@
// See docs at https://docs.cypress.io/api/cypress-api/custom-commands
// ***********************************************
import {
AuthTokenInfo,
TOKENITEM,
} from 'src/app/core/auth/models/auth-token-info.model';
import {
DSPACE_XSRF_COOKIE,
XSRF_REQUEST_HEADER,
} from 'src/app/core/xsrf/xsrf.constants';
import { AuthTokenInfo, TOKENITEM } from 'src/app/core/auth/models/auth-token-info.model';
import { DSPACE_XSRF_COOKIE, XSRF_REQUEST_HEADER } from 'src/app/core/xsrf/xsrf.constants';
import { v4 as uuidv4 } from 'uuid';
// Declare Cypress namespace to help with Intellisense & code completion in IDEs
@@ -63,33 +57,33 @@ declare global {
* @param password password to login as
*/
function login(email: string, password: string): void {
// Create a fake CSRF cookie/token to use in POST
cy.createCSRFCookie().then((csrfToken: string) => {
// get our REST API's base URL, also needed for POST
cy.task('getRestBaseURL').then((baseRestUrl: string) => {
// Now, send login POST request including that CSRF token
cy.request({
method: 'POST',
url: baseRestUrl + '/api/authn/login',
headers: { [XSRF_REQUEST_HEADER]: csrfToken },
form: true, // indicates the body should be form urlencoded
body: { user: email, password: password },
}).then((resp) => {
// We expect a successful login
expect(resp.status).to.eq(200);
// We expect to have a valid authorization header returned (with our auth token)
expect(resp.headers).to.have.property('authorization');
// Create a fake CSRF cookie/token to use in POST
cy.createCSRFCookie().then((csrfToken: string) => {
// get our REST API's base URL, also needed for POST
cy.task('getRestBaseURL').then((baseRestUrl: string) => {
// Now, send login POST request including that CSRF token
cy.request({
method: 'POST',
url: baseRestUrl + '/api/authn/login',
headers: { [XSRF_REQUEST_HEADER]: csrfToken},
form: true, // indicates the body should be form urlencoded
body: { user: email, password: password }
}).then((resp) => {
// We expect a successful login
expect(resp.status).to.eq(200);
// We expect to have a valid authorization header returned (with our auth token)
expect(resp.headers).to.have.property('authorization');
// Initialize our AuthTokenInfo object from the authorization header.
const authheader = resp.headers.authorization as string;
const authinfo: AuthTokenInfo = new AuthTokenInfo(authheader);
// Initialize our AuthTokenInfo object from the authorization header.
const authheader = resp.headers.authorization as string;
const authinfo: AuthTokenInfo = new AuthTokenInfo(authheader);
// Save our AuthTokenInfo object to our dsAuthInfo UI cookie
// This ensures the UI will recognize we are logged in on next "visit()"
cy.setCookie(TOKENITEM, JSON.stringify(authinfo));
});
// Save our AuthTokenInfo object to our dsAuthInfo UI cookie
// This ensures the UI will recognize we are logged in on next "visit()"
cy.setCookie(TOKENITEM, JSON.stringify(authinfo));
});
});
});
});
}
// Add as a Cypress command (i.e. assign to 'cy.login')
Cypress.Commands.add('login', login);
@@ -123,29 +117,29 @@ Cypress.Commands.add('loginViaForm', loginViaForm);
* @param dsoType type of DSpace Object (e.g. "item", "collection", "community")
*/
function generateViewEvent(uuid: string, dsoType: string): void {
// Create a fake CSRF cookie/token to use in POST
cy.createCSRFCookie().then((csrfToken: string) => {
// get our REST API's base URL, also needed for POST
cy.task('getRestBaseURL').then((baseRestUrl: string) => {
// Now, send 'statistics/viewevents' POST request including that fake CSRF token in required header
cy.request({
method: 'POST',
url: baseRestUrl + '/api/statistics/viewevents',
headers: {
[XSRF_REQUEST_HEADER] : csrfToken,
// use a known public IP address to avoid being seen as a "bot"
'X-Forwarded-For': '1.1.1.1',
// Use a user-agent of a Firefox browser on Windows. This again avoids being seen as a "bot"
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0',
},
//form: true, // indicates the body should be form urlencoded
body: { targetId: uuid, targetType: dsoType },
}).then((resp) => {
// We expect a 201 (which means statistics event was created)
expect(resp.status).to.eq(201);
});
// Create a fake CSRF cookie/token to use in POST
cy.createCSRFCookie().then((csrfToken: string) => {
// get our REST API's base URL, also needed for POST
cy.task('getRestBaseURL').then((baseRestUrl: string) => {
// Now, send 'statistics/viewevents' POST request including that fake CSRF token in required header
cy.request({
method: 'POST',
url: baseRestUrl + '/api/statistics/viewevents',
headers: {
[XSRF_REQUEST_HEADER] : csrfToken,
// use a known public IP address to avoid being seen as a "bot"
'X-Forwarded-For': '1.1.1.1',
// Use a user-agent of a Firefox browser on Windows. This again avoids being seen as a "bot"
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.0',
},
//form: true, // indicates the body should be form urlencoded
body: { targetId: uuid, targetType: dsoType },
}).then((resp) => {
// We expect a 201 (which means statistics event was created)
expect(resp.status).to.eq(201);
});
});
});
});
}
// Add as a Cypress command (i.e. assign to 'cy.generateViewEvent')
Cypress.Commands.add('generateViewEvent', generateViewEvent);
@@ -159,17 +153,17 @@ Cypress.Commands.add('generateViewEvent', generateViewEvent);
* @returns a Cypress Chainable which can be used to get the generated CSRF Token
*/
function createCSRFCookie(): Cypress.Chainable {
// Generate a new token which is a random UUID
const csrfToken: string = uuidv4();
// Generate a new token which is a random UUID
const csrfToken: string = uuidv4();
// Save it to our required cookie
cy.task('getRestBaseDomain').then((baseDomain: string) => {
// Create a fake CSRF Token. Set it in the required server-side cookie
cy.setCookie(DSPACE_XSRF_COOKIE, csrfToken, { 'domain': baseDomain });
});
// Save it to our required cookie
cy.task('getRestBaseDomain').then((baseDomain: string) => {
// Create a fake CSRF Token. Set it in the required server-side cookie
cy.setCookie(DSPACE_XSRF_COOKIE, csrfToken, { 'domain': baseDomain });
});
// return the generated token wrapped in a chainable
return cy.wrap(csrfToken);
// return the generated token wrapped in a chainable
return cy.wrap(csrfToken);
}
// Add as a Cypress command (i.e. assign to 'cy.createCSRFCookie')
Cypress.Commands.add('createCSRFCookie', createCSRFCookie);

View File

@@ -15,12 +15,13 @@
// Import all custom Commands (from commands.ts) for all tests
import './commands';
// Import Cypress Axe tools for all tests
// https://github.com/component-driven/cypress-axe
import 'cypress-axe';
import { DSPACE_XSRF_COOKIE } from 'src/app/core/xsrf/xsrf.constants';
// Runs once before all tests
before(() => {
// Cypress doesn't have access to the running application in Node.js.
@@ -34,18 +35,18 @@ before(() => {
// Find URL of our REST API & save to global variable via task
let baseRestUrl = FALLBACK_TEST_REST_BASE_URL;
if (!config.rest.baseUrl) {
console.warn("Could not load 'rest.baseUrl' from config.json. Falling back to " + FALLBACK_TEST_REST_BASE_URL);
console.warn("Could not load 'rest.baseUrl' from config.json. Falling back to " + FALLBACK_TEST_REST_BASE_URL);
} else {
baseRestUrl = config.rest.baseUrl;
baseRestUrl = config.rest.baseUrl;
}
cy.task('saveRestBaseURL', baseRestUrl);
// Find domain of our REST API & save to global variable via task.
let baseDomain = FALLBACK_TEST_REST_DOMAIN;
if (!config.rest.host) {
console.warn("Could not load 'rest.host' from config.json. Falling back to " + FALLBACK_TEST_REST_DOMAIN);
console.warn("Could not load 'rest.host' from config.json. Falling back to " + FALLBACK_TEST_REST_DOMAIN);
} else {
baseDomain = config.rest.host;
baseDomain = config.rest.host;
}
cy.task('saveRestBaseDomain', baseDomain);
@@ -54,12 +55,12 @@ before(() => {
// Runs once before the first test in each "block"
beforeEach(() => {
// Pre-agree to all Klaro cookies by setting the klaro-anonymous cookie
// This just ensures it doesn't get in the way of matching other objects in the page.
cy.setCookie('klaro-anonymous', '{%22authentication%22:true%2C%22preferences%22:true%2C%22acknowledgement%22:true%2C%22google-analytics%22:true%2C%22google-recaptcha%22:true}');
// Pre-agree to all Klaro cookies by setting the klaro-anonymous cookie
// This just ensures it doesn't get in the way of matching other objects in the page.
cy.setCookie('klaro-anonymous', '{%22authentication%22:true%2C%22preferences%22:true%2C%22acknowledgement%22:true%2C%22google-analytics%22:true%2C%22google-recaptcha%22:true}');
// Remove any CSRF cookies saved from prior tests
cy.clearCookie(DSPACE_XSRF_COOKIE);
// Remove any CSRF cookies saved from prior tests
cy.clearCookie(DSPACE_XSRF_COOKIE);
});
// NOTE: FALLBACK_TEST_REST_BASE_URL is only used if Cypress cannot read the REST API BaseURL

View File

@@ -5,26 +5,26 @@ import { Options } from 'cypress-axe';
// Uses 'log' and 'table' tasks defined in ../plugins/index.ts
// Borrowed from https://github.com/component-driven/cypress-axe#in-your-spec-file
function terminalLog(violations: Result[]) {
cy.task(
'log',
`${violations.length} accessibility violation${violations.length === 1 ? '' : 's'} ${violations.length === 1 ? 'was' : 'were'} detected`,
);
// pluck specific keys to keep the table readable
const violationData = violations.map(
({ id, impact, description, helpUrl, nodes }) => ({
id,
impact,
description,
helpUrl,
nodes: nodes.length,
html: nodes.map(node => node.html),
}),
);
cy.task(
'log',
`${violations.length} accessibility violation${violations.length === 1 ? '' : 's'} ${violations.length === 1 ? 'was' : 'were'} detected`
);
// pluck specific keys to keep the table readable
const violationData = violations.map(
({ id, impact, description, helpUrl, nodes }) => ({
id,
impact,
description,
helpUrl,
nodes: nodes.length,
html: nodes.map(node => node.html)
})
);
// Print violations as an array, since 'node.html' above often breaks table alignment
cy.task('log', violationData);
// Optionally, uncomment to print as a table
// cy.task('table', violationData);
// Print violations as an array, since 'node.html' above often breaks table alignment
cy.task('log', violationData);
// Optionally, uncomment to print as a table
// cy.task('table', violationData);
}
@@ -32,13 +32,13 @@ function terminalLog(violations: Result[]) {
// while also ensuring any violations are logged to the terminal (see terminalLog above)
// This method MUST be called after cy.visit(), as cy.injectAxe() must be called after page load
export const testA11y = (context?: any, options?: Options) => {
cy.injectAxe();
cy.configureAxe({
rules: [
// Disable color contrast checks as they are inaccurate / result in a lot of false positives
// See also open issues in axe-core: https://github.com/dequelabs/axe-core/labels/color%20contrast
{ id: 'color-contrast', enabled: false },
],
});
cy.checkA11y(context, options, terminalLog);
cy.injectAxe();
cy.configureAxe({
rules: [
// Disable color contrast checks as they are inaccurate / result in a lot of false positives
// See also open issues in axe-core: https://github.com/dequelabs/axe-core/labels/color%20contrast
{ id: 'color-contrast', enabled: false },
]
});
cy.checkA11y(context, options, terminalLog);
};

View File

@@ -4,7 +4,6 @@
"**/*.ts"
],
"compilerOptions": {
"sourceMap": false,
"types": [
"cypress",
"cypress-axe",

View File

@@ -20,17 +20,17 @@ the Docker compose scripts in this 'docker' folder.
### Dockerfile
This Dockerfile is used to build a *development* DSpace Angular UI image, published as 'dspace/dspace-angular'
This Dockerfile is used to build a *development* DSpace 7 Angular UI image, published as 'dspace/dspace-angular'
```
docker build -t dspace/dspace-angular:dspace-8_x .
docker build -t dspace/dspace-angular:dspace-7_x .
```
This image is built *automatically* after each commit is made to the `main` branch.
Admins to our DockerHub repo can manually publish with the following command.
```
docker push dspace/dspace-angular:dspace-8_x
docker push dspace/dspace-angular:dspace-7_x
```
### Dockerfile.dist
@@ -39,18 +39,18 @@ The `Dockerfile.dist` is used to generate a *production* build and runtime envir
```bash
# build the latest image
docker build -f Dockerfile.dist -t dspace/dspace-angular:dspace-8_x-dist .
docker build -f Dockerfile.dist -t dspace/dspace-angular:dspace-7_x-dist .
```
A default/demo version of this image is built *automatically*.
## 'docker' directory
- docker-compose.yml
- Starts DSpace Angular with Docker Compose from the current branch. This file assumes that a DSpace REST instance will also be started in Docker.
- Starts DSpace Angular with Docker Compose from the current branch. This file assumes that a DSpace 7 REST instance will also be started in Docker.
- docker-compose-rest.yml
- Runs a published instance of the DSpace REST API - persists data in Docker volumes
- Runs a published instance of the DSpace 7 REST API - persists data in Docker volumes
- docker-compose-ci.yml
- Runs a published instance of the DSpace REST API for CI testing. The database is re-populated from a SQL dump on each startup.
- Runs a published instance of the DSpace 7 REST API for CI testing. The database is re-populated from a SQL dump on each startup.
- cli.yml
- Docker compose file that provides a DSpace CLI container to work with a running DSpace REST container.
- cli.assetstore.yml
@@ -59,19 +59,19 @@ A default/demo version of this image is built *automatically*.
## To refresh / pull DSpace images from Dockerhub
```
docker compose -f docker/docker-compose.yml pull
docker-compose -f docker/docker-compose.yml pull
```
## To build DSpace images using code in your branch
```
docker compose -f docker/docker-compose.yml build
docker-compose -f docker/docker-compose.yml build
```
## To start DSpace (REST and Angular) from your branch
This command provides a quick way to start both the frontend & backend from this single codebase
```
docker compose -p d8 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml up -d
docker-compose -p d7 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml up -d
```
Keep in mind, you may also start the backend by cloning the 'DSpace/DSpace' GitHub repository separately. See the next section.
@@ -86,14 +86,14 @@ _The system will be started in 2 steps. Each step shares the same docker network
From 'DSpace/DSpace' clone (build first as needed):
```
docker compose -p d8 up -d
docker-compose -p d7 up -d
```
NOTE: More detailed instructions on starting the backend via Docker can be found in the [Docker Compose instructions for the Backend](https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/README.md).
From 'DSpace/dspace-angular' clone (build first as needed)
```
docker compose -p d8 -f docker/docker-compose.yml up -d
docker-compose -p d7 -f docker/docker-compose.yml up -d
```
At this point, you should be able to access the UI from http://localhost:4000,
@@ -105,21 +105,21 @@ This allows you to run the Angular UI in *production* mode, pointing it at the d
(https://demo.dspace.org/server/ or https://sandbox.dspace.org/server/).
```
docker compose -f docker/docker-compose-dist.yml pull
docker compose -f docker/docker-compose-dist.yml build
docker compose -p d8 -f docker/docker-compose-dist.yml up -d
docker-compose -f docker/docker-compose-dist.yml pull
docker-compose -f docker/docker-compose-dist.yml build
docker-compose -p d7 -f docker/docker-compose-dist.yml up -d
```
## Ingest test data from AIPDIR
Create an administrator
```
docker compose -p d8 -f docker/cli.yml run --rm dspace-cli create-administrator -e test@test.edu -f admin -l user -p admin -c en
docker-compose -p d7 -f docker/cli.yml run --rm dspace-cli create-administrator -e test@test.edu -f admin -l user -p admin -c en
```
Load content from AIP files
```
docker compose -p d8 -f docker/cli.yml -f ./docker/cli.ingest.yml run --rm dspace-cli
docker-compose -p d7 -f docker/cli.yml -f ./docker/cli.ingest.yml run --rm dspace-cli
```
## Alternative Ingest - Use Entities dataset
@@ -127,12 +127,12 @@ _Delete your docker volumes or use a unique project (-p) name_
Start DSpace with Database Content from a database dump
```
docker compose -p d8 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml -f docker/db.entities.yml up -d
docker-compose -p d7 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml -f docker/db.entities.yml up -d
```
Load assetstore content and trigger a re-index of the repository
```
docker compose -p d8 -f docker/cli.yml -f docker/cli.assetstore.yml run --rm dspace-cli
docker-compose -p d7 -f docker/cli.yml -f docker/cli.assetstore.yml run --rm dspace-cli
```
## End to end testing of the REST API (runs in GitHub Actions CI).
@@ -140,5 +140,5 @@ _In this instance, only the REST api runs in Docker using the Entities dataset.
This command is only really useful for testing our Continuous Integration process.
```
docker compose -p d8ci -f docker/docker-compose-ci.yml up -d
docker-compose -p d7ci -f docker/docker-compose-ci.yml up -d
```

View File

@@ -32,7 +32,5 @@ services:
/dspace/bin/dspace packager -r -a -t AIP -e $${ADMIN_EMAIL} -f -u SITE*.zip
/dspace/bin/dspace database update-sequences
touch /dspace/solr/search/conf/reindex.flag
/dspace/bin/dspace oai import
/dspace/bin/dspace oai clean-cache
/dspace/bin/dspace index-discovery

View File

@@ -14,14 +14,14 @@
# Therefore, it should be kept in sync with that file
networks:
# Default to using network named 'dspacenet' from docker-compose-rest.yml.
# Its full name will be prepended with the project name (e.g. "-p d8" means it will be named "d8_dspacenet")
# Its full name will be prepended with the project name (e.g. "-p d7" means it will be named "d7_dspacenet")
# If COMPOSITE_PROJECT_NAME is missing, default value will be "docker" (name of folder this file is in)
default:
name: ${COMPOSE_PROJECT_NAME:-docker}_dspacenet
external: true
services:
dspace-cli:
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-cli:${DSPACE_VER:-dspace-8_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-cli:${DSPACE_VER:-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,11 +14,10 @@
# # Therefore, it should be kept in sync with that file
services:
dspacedb:
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-8_x}-loadsql"
image: ${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-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
# NOTE: currently there is no dspace8 version
- LOADSQL=https://github.com/DSpace-Labs/AIP-Files/releases/download/demo-entities-data/dspace7-entities-data.sql
dspace:
### OVERRIDE default 'entrypoint' in 'docker-compose-rest.yml' ####
@@ -28,11 +27,23 @@ services:
# 3. (Custom for Entities) enable Entity-specific collection submission mappings in item-submission.xml
# This 'sed' command inserts the sample configurations specific to the Entities data set, see:
# https://github.com/DSpace/DSpace/blob/main/dspace/config/item-submission.xml#L36-L49
# 4. Finally, start DSpace
# 4. Finally, start Tomcat
entrypoint:
- /bin/bash
- '-c'
- |
while (!</dev/tcp/dspacedb/5432) > /dev/null 2>&1; do sleep 1; done;
/dspace/bin/dspace database migrate ignored
java -jar /dspace/webapps/server-boot.jar --dspace.dir=/dspace
sed -i '/name-map collection-handle="default".*/a \\n <name-map collection-handle="123456789/3" submission-name="Publication"/> \
<name-map collection-handle="123456789/4" submission-name="Publication"/> \
<name-map collection-handle="123456789/281" submission-name="Publication"/> \
<name-map collection-handle="123456789/5" submission-name="Publication"/> \
<name-map collection-handle="123456789/8" submission-name="OrgUnit"/> \
<name-map collection-handle="123456789/6" submission-name="Person"/> \
<name-map collection-handle="123456789/279" submission-name="Person"/> \
<name-map collection-handle="123456789/7" submission-name="Project"/> \
<name-map collection-handle="123456789/280" submission-name="Project"/> \
<name-map collection-handle="123456789/28" submission-name="Journal"/> \
<name-map collection-handle="123456789/29" submission-name="JournalVolume"/> \
<name-map collection-handle="123456789/30" submission-name="JournalIssue"/>' /dspace/config/item-submission.xml
catalina.sh run

View File

@@ -33,7 +33,7 @@ services:
# This allows us to generate statistics in e2e tests so that statistics pages can be tested thoroughly.
solr__D__statistics__P__autoCommit: 'false'
LOGGING_CONFIG: /dspace/config/log4j2-container.xml
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-8_x-test}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-7_x-test}"
depends_on:
- dspacedb
networks:
@@ -48,24 +48,23 @@ services:
# Ensure that the database is ready BEFORE starting tomcat
# 1. While a TCP connection to dspacedb port 5432 is not available, continue to sleep
# 2. Then, run database migration to init database tables (including any out-of-order ignored migrations, if any)
# 3. Finally, start DSpace
# 3. Finally, start Tomcat
entrypoint:
- /bin/bash
- '-c'
- |
while (!</dev/tcp/dspacedb/5432) > /dev/null 2>&1; do sleep 1; done;
/dspace/bin/dspace database migrate ignored
java -jar /dspace/webapps/server-boot.jar --dspace.dir=/dspace
catalina.sh run
# DSpace database container
# NOTE: This is customized to use our loadsql image, so that we are using a database with existing test data
dspacedb:
container_name: dspacedb
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-8_x}-loadsql"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-7_x}-loadsql"
environment:
# This LOADSQL should be kept in sync with the LOADSQL in
# https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/db.entities.yml
# This SQL is available from https://github.com/DSpace-Labs/AIP-Files/releases/tag/demo-entities-data
# NOTE: currently there is no dspace8 version
LOADSQL: https://github.com/DSpace-Labs/AIP-Files/releases/download/demo-entities-data/dspace7-entities-data.sql
PGDATA: /pgdata
POSTGRES_PASSWORD: dspace
@@ -82,7 +81,7 @@ services:
# DSpace Solr container
dspacesolr:
container_name: dspacesolr
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-8_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-7_x}"
networks:
- dspacenet
ports:
@@ -108,10 +107,6 @@ services:
cp -r /opt/solr/server/solr/configsets/search/* search
precreate-core statistics /opt/solr/server/solr/configsets/statistics
cp -r /opt/solr/server/solr/configsets/statistics/* statistics
precreate-core qaevent /opt/solr/server/solr/configsets/qaevent
cp -r /opt/solr/server/solr/configsets/qaevent/* qaevent
precreate-core suggestion /opt/solr/server/solr/configsets/suggestion
cp -r /opt/solr/server/solr/configsets/suggestion/* suggestion
exec solr -f
volumes:
assetstore:

View File

@@ -23,10 +23,10 @@ services:
# This is because Server Side Rendering (SSR) currently requires a public URL,
# see this bug: https://github.com/DSpace/dspace-angular/issues/1485
DSPACE_REST_SSL: 'true'
DSPACE_REST_HOST: sandbox.dspace.org
DSPACE_REST_HOST: demo.dspace.org
DSPACE_REST_PORT: 443
DSPACE_REST_NAMESPACE: /server
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-angular:${DSPACE_VER:-dspace-8_x}-dist"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-angular:${DSPACE_VER:-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_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-8_x-test}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-7_x-test}"
depends_on:
- dspacedb
networks:
@@ -51,24 +51,23 @@ services:
stdin_open: true
tty: true
volumes:
# Keep DSpace assetstore directory between reboots
- assetstore:/dspace/assetstore
# Ensure that the database is ready BEFORE starting tomcat
# 1. While a TCP connection to dspacedb port 5432 is not available, continue to sleep
# 2. Then, run database migration to init database tables
# 3. Finally, start DSpace
# 3. Finally, start Tomcat
entrypoint:
- /bin/bash
- '-c'
- |
while (!</dev/tcp/dspacedb/5432) > /dev/null 2>&1; do sleep 1; done;
/dspace/bin/dspace database migrate
java -jar /dspace/webapps/server-boot.jar --dspace.dir=/dspace
catalina.sh run
# DSpace database container
dspacedb:
container_name: dspacedb
# Uses a custom Postgres image with pgcrypto installed
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-8_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-postgres-pgcrypto:${DSPACE_VER:-dspace-7_x}"
environment:
PGDATA: /pgdata
POSTGRES_PASSWORD: dspace
@@ -85,7 +84,7 @@ services:
# DSpace Solr container
dspacesolr:
container_name: dspacesolr
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-8_x}"
image: "${DOCKER_REGISTRY:-docker.io}/${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-7_x}"
networks:
- dspacenet
ports:
@@ -101,7 +100,7 @@ services:
# * First, run precreate-core to create the core (if it doesn't yet exist). If exists already, this is a no-op
# * Second, copy configsets to this core:
# Updates to Solr configs require the container to be rebuilt/restarted:
# `docker compose -p d7 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml up -d --build dspacesolr`
# `docker-compose -p d7 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml up -d --build dspacesolr`
entrypoint:
- /bin/bash
- '-c'
@@ -115,10 +114,6 @@ services:
cp -r /opt/solr/server/solr/configsets/search/* search
precreate-core statistics /opt/solr/server/solr/configsets/statistics
cp -r /opt/solr/server/solr/configsets/statistics/* statistics
precreate-core qaevent /opt/solr/server/solr/configsets/qaevent
cp -r /opt/solr/server/solr/configsets/qaevent/* qaevent
precreate-core suggestion /opt/solr/server/solr/configsets/suggestion
cp -r /opt/solr/server/solr/configsets/suggestion/* suggestion
exec solr -f
volumes:
assetstore:

View File

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

View File

@@ -1,5 +0,0 @@
[DSpace ESLint plugins](../../../lint/README.md) > HTML rules
_______
- [`dspace-angular-html/themed-component-usages`](./rules/themed-component-usages.md): Themeable components should be used via the selector of their `ThemedComponent` wrapper class
- [`dspace-angular-html/no-disabled-attribute-on-button`](./rules/no-disabled-attribute-on-button.md): Buttons should use the `dsBtnDisabled` directive instead of the HTML `disabled` attribute.

View File

@@ -1,78 +0,0 @@
[DSpace ESLint plugins](../../../../lint/README.md) > [HTML rules](../index.md) > `dspace-angular-html/no-disabled-attribute-on-button`
_______
Buttons should use the `dsBtnDisabled` directive instead of the HTML `disabled` attribute.
This should be done to ensure that users with a screen reader are able to understand that the a button button is present, and that it is disabled.
The native html disabled attribute does not allow users to navigate to the button by keyboard, and thus they have no way of knowing that the button is present.
_______
[Source code](../../../../lint/src/rules/html/no-disabled-attribute-on-button.ts)
### Examples
#### Valid code
##### should use [dsBtnDisabled] in HTML templates
```html
<button [dsBtnDisabled]="true">Submit</button>
```
##### disabled attribute is still valid on non-button elements
```html
<input disabled>
```
##### [disabled] attribute is still valid on non-button elements
```html
<input [disabled]="true">
```
##### angular dynamic attributes that use disabled are still valid
```html
<button [class.disabled]="isDisabled">Submit</button>
```
#### Invalid code &amp; automatic fixes
##### should not use disabled attribute in HTML templates
```html
<button disabled>Submit</button>
```
Will produce the following error(s):
```
Buttons should use the `dsBtnDisabled` directive instead of the `disabled` attribute.
```
Result of `yarn lint --fix`:
```html
<button [dsBtnDisabled]="true">Submit</button>
```
##### should not use [disabled] attribute in HTML templates
```html
<button [disabled]="true">Submit</button>
```
Will produce the following error(s):
```
Buttons should use the `dsBtnDisabled` directive instead of the `disabled` attribute.
```
Result of `yarn lint --fix`:
```html
<button [dsBtnDisabled]="true">Submit</button>
```

View File

@@ -1,110 +0,0 @@
[DSpace ESLint plugins](../../../../lint/README.md) > [HTML rules](../index.md) > `dspace-angular-html/themed-component-usages`
_______
Themeable components should be used via the selector of their `ThemedComponent` wrapper class
This ensures that custom themes can correctly override _all_ instances of this component.
The only exception to this rule are unit tests, where we may want to use the base component in order to keep the test setup simple.
_______
[Source code](../../../../lint/src/rules/html/themed-component-usages.ts)
### Examples
#### Valid code
##### use no-prefix selectors in HTML templates
```html
<ds-test-themeable/>
<ds-test-themeable></ds-test-themeable>
<ds-test-themeable [test]="something"></ds-test-themeable>
```
##### use no-prefix selectors in TypeScript templates
```html
@Component({
template: '<ds-test-themeable></ds-test-themeable>'
})
class Test {
}
```
##### use no-prefix selectors in TypeScript test templates
Filename: `lint/test/fixture/src/test.spec.ts`
```html
@Component({
template: '<ds-test-themeable></ds-test-themeable>'
})
class Test {
}
```
##### base selectors are also allowed in TypeScript test templates
Filename: `lint/test/fixture/src/test.spec.ts`
```html
@Component({
template: '<ds-base-test-themeable></ds-base-test-themeable>'
})
class Test {
}
```
#### Invalid code &amp; automatic fixes
##### themed override selectors are not allowed in HTML templates
```html
<ds-themed-test-themeable/>
<ds-themed-test-themeable></ds-themed-test-themeable>
<ds-themed-test-themeable [test]="something"></ds-themed-test-themeable>
```
Will produce the following error(s):
```
Themeable components should be used via their ThemedComponent wrapper's selector
Themeable components should be used via their ThemedComponent wrapper's selector
Themeable components should be used via their ThemedComponent wrapper's selector
```
Result of `yarn lint --fix`:
```html
<ds-test-themeable/>
<ds-test-themeable></ds-test-themeable>
<ds-test-themeable [test]="something"></ds-test-themeable>
```
##### base selectors are not allowed in HTML templates
```html
<ds-base-test-themeable/>
<ds-base-test-themeable></ds-base-test-themeable>
<ds-base-test-themeable [test]="something"></ds-base-test-themeable>
```
Will produce the following error(s):
```
Themeable components should be used via their ThemedComponent wrapper's selector
Themeable components should be used via their ThemedComponent wrapper's selector
Themeable components should be used via their ThemedComponent wrapper's selector
```
Result of `yarn lint --fix`:
```html
<ds-test-themeable/>
<ds-test-themeable></ds-test-themeable>
<ds-test-themeable [test]="something"></ds-test-themeable>
```

View File

@@ -1,6 +0,0 @@
[DSpace ESLint plugins](../../../lint/README.md) > TypeScript rules
_______
- [`dspace-angular-ts/themed-component-classes`](./rules/themed-component-classes.md): Formatting rules for themeable component classes
- [`dspace-angular-ts/themed-component-selectors`](./rules/themed-component-selectors.md): Themeable component selectors should follow the DSpace convention
- [`dspace-angular-ts/themed-component-usages`](./rules/themed-component-usages.md): Themeable components should be used via their `ThemedComponent` wrapper class

View File

@@ -1,257 +0,0 @@
[DSpace ESLint plugins](../../../../lint/README.md) > [TypeScript rules](../index.md) > `dspace-angular-ts/themed-component-classes`
_______
Formatting rules for themeable component classes
- All themeable components must be standalone.
- The base component must always be imported in the `ThemedComponent` wrapper. This ensures that it is always sufficient to import just the wrapper whenever we use the component.
_______
[Source code](../../../../lint/src/rules/ts/themed-component-classes.ts)
### Examples
#### Valid code
##### Regular non-themeable component
```typescript
@Component({
selector: 'ds-something',
standalone: true,
})
class Something {
}
```
##### Base component
```typescript
@Component({
selector: 'ds-base-test-themable',
standalone: true,
})
class TestThemeableTomponent {
}
```
##### Wrapper component
Filename: `lint/test/fixture/src/app/test/themed-test-themeable.component.ts`
```typescript
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [
TestThemeableComponent,
],
})
class ThemedTestThemeableTomponent extends ThemedComponent<TestThemeableComponent> {
}
```
##### Override component
Filename: `lint/test/fixture/src/themes/test/app/test/test-themeable.component.ts`
```typescript
@Component({
selector: 'ds-themed-test-themable',
standalone: true,
})
class Override extends BaseComponent {
}
```
#### Invalid code &amp; automatic fixes
##### Base component must be standalone
```typescript
@Component({
selector: 'ds-base-test-themable',
})
class TestThemeableComponent {
}
```
Will produce the following error(s):
```
Themeable components must be standalone
```
Result of `yarn lint --fix`:
```typescript
@Component({
selector: 'ds-base-test-themable',
standalone: true,
})
class TestThemeableComponent {
}
```
##### Wrapper component must be standalone and import base component
Filename: `lint/test/fixture/src/app/test/themed-test-themeable.component.ts`
```typescript
@Component({
selector: 'ds-test-themable',
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
```
Will produce the following error(s):
```
Themeable component wrapper classes must be standalone and import the base class
```
Result of `yarn lint --fix`:
```typescript
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [TestThemeableComponent],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
```
##### Wrapper component must import base component (array present but empty)
Filename: `lint/test/fixture/src/app/test/themed-test-themeable.component.ts`
```typescript
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
```
Will produce the following error(s):
```
Themed component wrapper classes must only import the base class
```
Result of `yarn lint --fix`:
```typescript
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [TestThemeableComponent],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
```
##### Wrapper component must import base component (array is wrong)
Filename: `lint/test/fixture/src/app/test/themed-test-themeable.component.ts`
```typescript
import { SomethingElse } from './somewhere-else';
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [
SomethingElse,
],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
```
Will produce the following error(s):
```
Themed component wrapper classes must only import the base class
```
Result of `yarn lint --fix`:
```typescript
import { SomethingElse } from './somewhere-else';
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [TestThemeableComponent],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
```
##### Wrapper component must import base component (array is wrong)
Filename: `lint/test/fixture/src/app/test/themed-test-themeable.component.ts`
```typescript
import { Something, SomethingElse } from './somewhere-else';
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [
SomethingElse,
],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
```
Will produce the following error(s):
```
Themed component wrapper classes must only import the base class
```
Result of `yarn lint --fix`:
```typescript
import { Something, SomethingElse } from './somewhere-else';
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [TestThemeableComponent],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
```
##### Override component must be standalone
Filename: `lint/test/fixture/src/themes/test/app/test/test-themeable.component.ts`
```typescript
@Component({
selector: 'ds-themed-test-themable',
})
class Override extends BaseComponent {
}
```
Will produce the following error(s):
```
Themeable components must be standalone
```
Result of `yarn lint --fix`:
```typescript
@Component({
selector: 'ds-themed-test-themable',
standalone: true,
})
class Override extends BaseComponent {
}
```

View File

@@ -1,156 +0,0 @@
[DSpace ESLint plugins](../../../../lint/README.md) > [TypeScript rules](../index.md) > `dspace-angular-ts/themed-component-selectors`
_______
Themeable component selectors should follow the DSpace convention
Each themeable component is comprised of a base component, a wrapper component and any number of themed components
- Base components should have a selector starting with `ds-base-`
- Themed components should have a selector starting with `ds-themed-`
- Wrapper components should have a selector starting with `ds-`, but not `ds-base-` or `ds-themed-`
- This is the regular DSpace selector prefix
- **When making a regular component themeable, its selector prefix should be changed to `ds-base-`, and the new wrapper's component should reuse the previous selector**
Unit tests are exempt from this rule, because they may redefine components using the same class name as other themeable components elsewhere in the source.
_______
[Source code](../../../../lint/src/rules/ts/themed-component-selectors.ts)
### Examples
#### Valid code
##### Regular non-themeable component selector
```typescript
@Component({
selector: 'ds-something',
})
class Something {
}
```
##### Themeable component selector should replace the original version, unthemed version should be changed to ds-base-
```typescript
@Component({
selector: 'ds-base-something',
})
class Something {
}
@Component({
selector: 'ds-something',
})
class ThemedSomething extends ThemedComponent<Something> {
}
@Component({
selector: 'ds-themed-something',
})
class OverrideSomething extends Something {
}
```
##### Other themed component wrappers should not interfere
```typescript
@Component({
selector: 'ds-something',
})
class Something {
}
@Component({
selector: 'ds-something-else',
})
class ThemedSomethingElse extends ThemedComponent<SomethingElse> {
}
```
#### Invalid code &amp; automatic fixes
##### Wrong selector for base component
Filename: `lint/test/fixture/src/app/test/test-themeable.component.ts`
```typescript
@Component({
selector: 'ds-something',
})
class TestThemeableComponent {
}
```
Will produce the following error(s):
```
Unthemed version of themeable component should have a selector starting with 'ds-base-'
```
Result of `yarn lint --fix`:
```typescript
@Component({
selector: 'ds-base-something',
})
class TestThemeableComponent {
}
```
##### Wrong selector for wrapper component
Filename: `lint/test/fixture/src/app/test/themed-test-themeable.component.ts`
```typescript
@Component({
selector: 'ds-themed-something',
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
```
Will produce the following error(s):
```
Themed component wrapper of themeable component shouldn't have a selector starting with 'ds-themed-'
```
Result of `yarn lint --fix`:
```typescript
@Component({
selector: 'ds-something',
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
```
##### Wrong selector for theme override
Filename: `lint/test/fixture/src/themes/test/app/test/test-themeable.component.ts`
```typescript
@Component({
selector: 'ds-something',
})
class TestThememeableComponent extends BaseComponent {
}
```
Will produce the following error(s):
```
Theme override of themeable component should have a selector starting with 'ds-themed-'
```
Result of `yarn lint --fix`:
```typescript
@Component({
selector: 'ds-themed-something',
})
class TestThememeableComponent extends BaseComponent {
}
```

View File

@@ -1,332 +0,0 @@
[DSpace ESLint plugins](../../../../lint/README.md) > [TypeScript rules](../index.md) > `dspace-angular-ts/themed-component-usages`
_______
Themeable components should be used via their `ThemedComponent` wrapper class
This ensures that custom themes can correctly override _all_ instances of this component.
There are a few exceptions where the base class can still be used:
- Class declaration expressions (otherwise we can't declare, extend or override the class in the first place)
- Angular modules (except for routing modules)
- Angular `@ViewChild` decorators
- Type annotations
_______
[Source code](../../../../lint/src/rules/ts/themed-component-usages.ts)
### Examples
#### Valid code
##### allow wrapper class usages
```typescript
import { ThemedTestThemeableComponent } from './app/test/themed-test-themeable.component';
const config = {
a: ThemedTestThemeableComponent,
b: ChipsComponent,
}
```
##### allow base class in class declaration
```typescript
export class TestThemeableComponent {
}
```
##### allow inheriting from base class
```typescript
import { TestThemeableComponent } from './app/test/test-themeable.component';
export class ThemedAdminSidebarComponent extends ThemedComponent<TestThemeableComponent> {
}
```
##### allow base class in ViewChild
```typescript
import { TestThemeableComponent } from './app/test/test-themeable.component';
export class Something {
@ViewChild(TestThemeableComponent) test: TestThemeableComponent;
}
```
##### allow wrapper selectors in test queries
Filename: `lint/test/fixture/src/app/test/test.component.spec.ts`
```typescript
By.css('ds-themeable');
By.css('#test > ds-themeable > #nest');
```
##### allow wrapper selectors in cypress queries
Filename: `lint/test/fixture/src/app/test/test.component.cy.ts`
```typescript
By.css('ds-themeable');
By.css('#test > ds-themeable > #nest');
```
#### Invalid code &amp; automatic fixes
##### disallow direct usages of base class
```typescript
import { TestThemeableComponent } from './app/test/test-themeable.component';
import { TestComponent } from './app/test/test.component';
const config = {
a: TestThemeableComponent,
b: TestComponent,
}
```
Will produce the following error(s):
```
Themeable components should be used via their ThemedComponent wrapper
Themeable components should be used via their ThemedComponent wrapper
```
Result of `yarn lint --fix`:
```typescript
import { ThemedTestThemeableComponent } from './app/test/themed-test-themeable.component';
import { TestComponent } from './app/test/test.component';
const config = {
a: ThemedTestThemeableComponent,
b: TestComponent,
}
```
##### disallow direct usages of base class, keep other imports
```typescript
import { Something, TestThemeableComponent } from './app/test/test-themeable.component';
import { TestComponent } from './app/test/test.component';
const config = {
a: TestThemeableComponent,
b: TestComponent,
c: Something,
}
```
Will produce the following error(s):
```
Themeable components should be used via their ThemedComponent wrapper
Themeable components should be used via their ThemedComponent wrapper
```
Result of `yarn lint --fix`:
```typescript
import { Something } from './app/test/test-themeable.component';
import { ThemedTestThemeableComponent } from './app/test/themed-test-themeable.component';
import { TestComponent } from './app/test/test.component';
const config = {
a: ThemedTestThemeableComponent,
b: TestComponent,
c: Something,
}
```
##### handle array replacements correctly
```typescript
const DECLARATIONS = [
Something,
TestThemeableComponent,
Something,
ThemedTestThemeableComponent,
];
```
Will produce the following error(s):
```
Themeable components should be used via their ThemedComponent wrapper
```
Result of `yarn lint --fix`:
```typescript
const DECLARATIONS = [
Something,
Something,
ThemedTestThemeableComponent,
];
```
##### disallow override selector in test queries
Filename: `lint/test/fixture/src/app/test/test.component.spec.ts`
```typescript
By.css('ds-themed-themeable');
By.css('#test > ds-themed-themeable > #nest');
```
Will produce the following error(s):
```
Themeable components should be used via their ThemedComponent wrapper
Themeable components should be used via their ThemedComponent wrapper
```
Result of `yarn lint --fix`:
```typescript
By.css('ds-themeable');
By.css('#test > ds-themeable > #nest');
```
##### disallow base selector in test queries
Filename: `lint/test/fixture/src/app/test/test.component.spec.ts`
```typescript
By.css('ds-base-themeable');
By.css('#test > ds-base-themeable > #nest');
```
Will produce the following error(s):
```
Themeable components should be used via their ThemedComponent wrapper
Themeable components should be used via their ThemedComponent wrapper
```
Result of `yarn lint --fix`:
```typescript
By.css('ds-themeable');
By.css('#test > ds-themeable > #nest');
```
##### disallow override selector in cypress queries
Filename: `lint/test/fixture/src/app/test/test.component.cy.ts`
```typescript
cy.get('ds-themed-themeable');
cy.get('#test > ds-themed-themeable > #nest');
```
Will produce the following error(s):
```
Themeable components should be used via their ThemedComponent wrapper
Themeable components should be used via their ThemedComponent wrapper
```
Result of `yarn lint --fix`:
```typescript
cy.get('ds-themeable');
cy.get('#test > ds-themeable > #nest');
```
##### disallow base selector in cypress queries
Filename: `lint/test/fixture/src/app/test/test.component.cy.ts`
```typescript
cy.get('ds-base-themeable');
cy.get('#test > ds-base-themeable > #nest');
```
Will produce the following error(s):
```
Themeable components should be used via their ThemedComponent wrapper
Themeable components should be used via their ThemedComponent wrapper
```
Result of `yarn lint --fix`:
```typescript
cy.get('ds-themeable');
cy.get('#test > ds-themeable > #nest');
```
##### edge case: unable to find usage node through usage token, but import is still flagged and fixed
Filename: `lint/test/fixture/src/themes/test/app/test/other-themeable.component.ts`
```typescript
import { Component } from '@angular/core';
import { Context } from './app/core/shared/context.model';
import { TestThemeableComponent } from '../../../../app/test/test-themeable.component';
@Component({
standalone: true,
imports: [TestThemeableComponent],
})
export class UsageComponent {
}
```
Will produce the following error(s):
```
Themeable components should be used via their ThemedComponent wrapper
Themeable components should be used via their ThemedComponent wrapper
```
Result of `yarn lint --fix`:
```typescript
import { Component } from '@angular/core';
import { Context } from './app/core/shared/context.model';
import { ThemedTestThemeableComponent } from '../../../../app/test/themed-test-themeable.component';
@Component({
standalone: true,
imports: [ThemedTestThemeableComponent],
})
export class UsageComponent {
}
```
##### edge case edge case: both are imported, only wrapper is retained
Filename: `lint/test/fixture/src/themes/test/app/test/other-themeable.component.ts`
```typescript
import { Component } from '@angular/core';
import { Context } from './app/core/shared/context.model';
import { TestThemeableComponent } from '../../../../app/test/test-themeable.component';
import { ThemedTestThemeableComponent } from '../../../../app/test/themed-test-themeable.component';
@Component({
standalone: true,
imports: [TestThemeableComponent, ThemedTestThemeableComponent],
})
export class UsageComponent {
}
```
Will produce the following error(s):
```
Themeable components should be used via their ThemedComponent wrapper
Themeable components should be used via their ThemedComponent wrapper
```
Result of `yarn lint --fix`:
```typescript
import { Component } from '@angular/core';
import { Context } from './app/core/shared/context.model';
import { ThemedTestThemeableComponent } from '../../../../app/test/themed-test-themeable.component';
@Component({
standalone: true,
imports: [ThemedTestThemeableComponent],
})
export class UsageComponent {
}
```

View File

@@ -15,10 +15,7 @@ module.exports = function (config) {
],
client: {
clearContext: false, // leave Jasmine Spec Runner output visible in browser
captureConsole: false,
jasmine: {
failSpecWithNoExpectations: true
}
captureConsole: false
},
coverageIstanbulReporter: {
dir: require('path').join(__dirname, './coverage/dspace-angular'),

3
lint/.gitignore vendored
View File

@@ -1,3 +0,0 @@
/dist/
/coverage/
/node-modules/

View File

@@ -1,50 +0,0 @@
# DSpace ESLint plugins
Custom ESLint rules for DSpace Angular peculiarities.
## Usage
These plugins are included with the rest of our ESLint configuration in [.eslintc.json](../.eslintrc.json). Individual rules can be configured or disabled there, like usual.
- In order for the new rules to be picked up by your IDE, you should first run `yarn build:lint` to build the plugins.
- This will also happen automatically each time `yarn lint` is run.
## Documentation
The rules are split up into plugins by language:
- [TypeScript rules](../docs/lint/ts/index.md)
- [HTML rules](../docs/lint/html/index.md)
> Run `yarn docs:lint` to generate this documentation!
## Developing
### Overview
- All rules are written in TypeScript and compiled into [`dist`](./dist)
- The plugins are linked into the main project dependencies from here
- These directories already contain the necessary `package.json` files to mark them as ESLint plugins
- Rule source files are structured, so they can be imported all in one go
- Each rule must export the following:
- `Messages`: an Enum of error message IDs
- `info`: metadata about this rule (name, description, messages, options, ...)
- `rule`: the implementation of the rule
- `tests`: the tests for this rule, as a set of valid/invalid code snippets. These snippets are used as example in the documentation.
- New rules should be added to their plugin's `index.ts`
- Some useful links
- [Developing ESLint plugins](https://eslint.org/docs/latest/extend/plugins)
- [Custom rules in typescript-eslint](https://typescript-eslint.io/developers/custom-rules)
- [Angular ESLint](https://github.com/angular-eslint/angular-eslint)
### Parsing project metadata in advance ~ TypeScript AST
While it is possible to retain persistent state between files during the linting process, it becomes quite complicated if the content of one file determines how we want to lint another file.
Because the two files may be linted out of order, we may not know whether the first file is wrong before we pass by the second. This means that we cannot report or fix the issue, because the first file is already detached from the linting context.
For example, we cannot consistently determine which components are themeable (i.e. have a `ThemedComponent` wrapper) while linting.
To work around this issue, we construct a registry of themeable components _before_ linting anything.
- We don't have a good way to hook into the ESLint parser at this time
- Instead, we leverage the actual TypeScript AST parser
- Retrieve all `ThemedComponent` wrapper files by the pattern of their path (`themed-*.component.ts`)
- Determine the themed component they're linked to (by the actual type annotation/import path, since filenames are prone to errors)
- Store metadata describing these component pairs in a global registry that can be shared between rules
- This only needs to happen once, and only takes a fraction of a second (for ~100 themeable components)

View File

@@ -1,6 +0,0 @@
{
"name": "eslint-plugin-dspace-angular-html",
"version": "0.0.0",
"main": "./index.js",
"private": true
}

View File

@@ -1,6 +0,0 @@
{
"name": "eslint-plugin-dspace-angular-ts",
"version": "0.0.0",
"main": "./index.js",
"private": true
}

View File

@@ -1,85 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import {
existsSync,
mkdirSync,
readFileSync,
rmSync,
writeFileSync,
} from 'fs';
import { join } from 'path';
import { default as htmlPlugin } from './src/rules/html';
import { default as tsPlugin } from './src/rules/ts';
const templates = new Map();
function lazyEJS(path: string, data: object): string {
if (!templates.has(path)) {
templates.set(path, require('ejs').compile(readFileSync(path).toString()));
}
return templates.get(path)(data).replace(/\r\n/g, '\n');
}
const docsDir = join('docs', 'lint');
const tsDir = join(docsDir, 'ts');
const htmlDir = join(docsDir, 'html');
if (existsSync(docsDir)) {
rmSync(docsDir, { recursive: true });
}
mkdirSync(join(tsDir, 'rules'), { recursive: true });
mkdirSync(join(htmlDir, 'rules'), { recursive: true });
function template(name: string): string {
return join('lint', 'src', 'util', 'templates', name);
}
// TypeScript docs
writeFileSync(
join(tsDir, 'index.md'),
lazyEJS(template('index.ejs'), {
plugin: tsPlugin,
rules: tsPlugin.index.map(rule => rule.info),
}),
);
for (const rule of tsPlugin.index) {
writeFileSync(
join(tsDir, 'rules', rule.info.name + '.md'),
lazyEJS(template('rule.ejs'), {
plugin: tsPlugin,
rule: rule.info,
tests: rule.tests,
}),
);
}
// HTML docs
writeFileSync(
join(htmlDir, 'index.md'),
lazyEJS(template('index.ejs'), {
plugin: htmlPlugin,
rules: htmlPlugin.index.map(rule => rule.info),
}),
);
for (const rule of htmlPlugin.index) {
writeFileSync(
join(htmlDir, 'rules', rule.info.name + '.md'),
lazyEJS(template('rule.ejs'), {
plugin: htmlPlugin,
rule: rule.info,
tests: rule.tests,
}),
);
}

View File

@@ -1,7 +0,0 @@
{
"spec_files": ["**/*.spec.js"],
"spec_dir": "lint/dist/test",
"helpers": [
"./test/helpers.js"
]
}

View File

@@ -1,25 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
/* eslint-disable import/no-namespace */
import {
bundle,
RuleExports,
} from '../../util/structure';
import * as noDisabledAttributeOnButton from './no-disabled-attribute-on-button';
import * as themedComponentUsages from './themed-component-usages';
const index = [
themedComponentUsages,
noDisabledAttributeOnButton,
] as unknown as RuleExports[];
export = {
parser: require('@angular-eslint/template-parser'),
...bundle('dspace-angular-html', 'HTML', index),
};

View File

@@ -1,147 +0,0 @@
import {
TmplAstBoundAttribute,
TmplAstTextAttribute,
} from '@angular-eslint/bundled-angular-compiler';
import { TemplateParserServices } from '@angular-eslint/utils';
import {
ESLintUtils,
TSESLint,
} from '@typescript-eslint/utils';
import {
DSpaceESLintRuleInfo,
NamedTests,
} from '../../util/structure';
import { getSourceCode } from '../../util/typescript';
export enum Message {
USE_DSBTN_DISABLED = 'mustUseDsBtnDisabled',
}
export const info = {
name: 'no-disabled-attribute-on-button',
meta: {
docs: {
description: `Buttons should use the \`dsBtnDisabled\` directive instead of the HTML \`disabled\` attribute.
This should be done to ensure that users with a screen reader are able to understand that the a button button is present, and that it is disabled.
The native html disabled attribute does not allow users to navigate to the button by keyboard, and thus they have no way of knowing that the button is present.`,
},
type: 'problem',
fixable: 'code',
schema: [],
messages: {
[Message.USE_DSBTN_DISABLED]: 'Buttons should use the `dsBtnDisabled` directive instead of the `disabled` attribute.',
},
},
defaultOptions: [],
} as DSpaceESLintRuleInfo;
export const rule = ESLintUtils.RuleCreator.withoutDocs({
...info,
create(context: TSESLint.RuleContext<Message, unknown[]>) {
const parserServices = getSourceCode(context).parserServices as TemplateParserServices;
/**
* Some dynamic angular inputs will have disabled as name because of how Angular handles this internally (e.g [class.disabled]="isDisabled")
* But these aren't actually the disabled attribute we're looking for, we can determine this by checking the details of the keySpan
*/
function isOtherAttributeDisabled(node: TmplAstBoundAttribute | TmplAstTextAttribute): boolean {
// if the details are not null, and the details are not 'disabled', then it's not the disabled attribute we're looking for
return node.keySpan?.details !== null && node.keySpan?.details !== 'disabled';
}
/**
* Replace the disabled text with [dsBtnDisabled] in the template
*/
function replaceDisabledText(text: string ): string {
const hasBrackets = text.includes('[') && text.includes(']');
const newDisabledText = hasBrackets ? 'dsBtnDisabled' : '[dsBtnDisabled]="true"';
return text.replace('disabled', newDisabledText);
}
function inputIsChildOfButton(node: any): boolean {
return (node.parent?.tagName === 'button' || node.parent?.name === 'button');
}
function reportAndFix(node: TmplAstBoundAttribute | TmplAstTextAttribute) {
if (!inputIsChildOfButton(node) || isOtherAttributeDisabled(node)) {
return;
}
const sourceSpan = node.sourceSpan;
context.report({
messageId: Message.USE_DSBTN_DISABLED,
loc: parserServices.convertNodeSourceSpanToLoc(sourceSpan),
fix(fixer) {
const templateText = sourceSpan.start.file.content;
const disabledText = templateText.slice(sourceSpan.start.offset, sourceSpan.end.offset);
const newText = replaceDisabledText(disabledText);
return fixer.replaceTextRange([sourceSpan.start.offset, sourceSpan.end.offset], newText);
},
});
}
return {
'BoundAttribute[name="disabled"]'(node: TmplAstBoundAttribute) {
reportAndFix(node);
},
'TextAttribute[name="disabled"]'(node: TmplAstTextAttribute) {
reportAndFix(node);
},
};
},
});
export const tests = {
plugin: info.name,
valid: [
{
name: 'should use [dsBtnDisabled] in HTML templates',
code: `
<button [dsBtnDisabled]="true">Submit</button>
`,
},
{
name: 'disabled attribute is still valid on non-button elements',
code: `
<input disabled>
`,
},
{
name: '[disabled] attribute is still valid on non-button elements',
code: `
<input [disabled]="true">
`,
},
{
name: 'angular dynamic attributes that use disabled are still valid',
code: `
<button [class.disabled]="isDisabled">Submit</button>
`,
},
],
invalid: [
{
name: 'should not use disabled attribute in HTML templates',
code: `
<button disabled>Submit</button>
`,
errors: [{ messageId: Message.USE_DSBTN_DISABLED }],
output: `
<button [dsBtnDisabled]="true">Submit</button>
`,
},
{
name: 'should not use [disabled] attribute in HTML templates',
code: `
<button [disabled]="true">Submit</button>
`,
errors: [{ messageId: Message.USE_DSBTN_DISABLED }],
output: `
<button [dsBtnDisabled]="true">Submit</button>
`,
},
],
} as NamedTests;
export default rule;

View File

@@ -1,189 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { TmplAstElement } from '@angular-eslint/bundled-angular-compiler';
import { TemplateParserServices } from '@angular-eslint/utils';
import { ESLintUtils } from '@typescript-eslint/utils';
import { RuleContext } from '@typescript-eslint/utils/ts-eslint';
import { fixture } from '../../../test/fixture';
import {
DSpaceESLintRuleInfo,
NamedTests,
} from '../../util/structure';
import {
DISALLOWED_THEME_SELECTORS,
fixSelectors,
} from '../../util/theme-support';
import {
getFilename,
getSourceCode,
} from '../../util/typescript';
export enum Message {
WRONG_SELECTOR = 'mustUseThemedWrapperSelector',
}
export const info = {
name: 'themed-component-usages',
meta: {
docs: {
description: `Themeable components should be used via the selector of their \`ThemedComponent\` wrapper class
This ensures that custom themes can correctly override _all_ instances of this component.
The only exception to this rule are unit tests, where we may want to use the base component in order to keep the test setup simple.
`,
},
type: 'problem',
fixable: 'code',
schema: [],
messages: {
[Message.WRONG_SELECTOR]: 'Themeable components should be used via their ThemedComponent wrapper\'s selector',
},
},
defaultOptions: [],
} as DSpaceESLintRuleInfo;
export const rule = ESLintUtils.RuleCreator.withoutDocs({
...info,
create(context: RuleContext<Message, unknown[]>) {
if (getFilename(context).includes('.spec.ts')) {
// skip inline templates in unit tests
return {};
}
const parserServices = getSourceCode(context).parserServices as TemplateParserServices;
return {
[`Element$1[name = /^${DISALLOWED_THEME_SELECTORS}/]`](node: TmplAstElement) {
const { startSourceSpan, endSourceSpan } = node;
const openStart = startSourceSpan.start.offset as number;
context.report({
messageId: Message.WRONG_SELECTOR,
loc: parserServices.convertNodeSourceSpanToLoc(startSourceSpan),
fix(fixer) {
const oldSelector = node.name;
const newSelector = fixSelectors(oldSelector);
const ops = [
fixer.replaceTextRange([openStart + 1, openStart + 1 + oldSelector.length], newSelector),
];
// make sure we don't mangle self-closing tags
if (endSourceSpan !== null && startSourceSpan.end.offset !== endSourceSpan.end.offset) {
const closeStart = endSourceSpan.start.offset as number;
const closeEnd = endSourceSpan.end.offset as number;
ops.push(fixer.replaceTextRange([closeStart + 2, closeEnd - 1], newSelector));
}
return ops;
},
});
},
};
},
});
export const tests = {
plugin: info.name,
valid: [
{
name: 'use no-prefix selectors in HTML templates',
code: `
<ds-test-themeable/>
<ds-test-themeable></ds-test-themeable>
<ds-test-themeable [test]="something"></ds-test-themeable>
`,
},
{
name: 'use no-prefix selectors in TypeScript templates',
code: `
@Component({
template: '<ds-test-themeable></ds-test-themeable>'
})
class Test {
}
`,
},
{
name: 'use no-prefix selectors in TypeScript test templates',
filename: fixture('src/test.spec.ts'),
code: `
@Component({
template: '<ds-test-themeable></ds-test-themeable>'
})
class Test {
}
`,
},
{
name: 'base selectors are also allowed in TypeScript test templates',
filename: fixture('src/test.spec.ts'),
code: `
@Component({
template: '<ds-base-test-themeable></ds-base-test-themeable>'
})
class Test {
}
`,
},
],
invalid: [
{
name: 'themed override selectors are not allowed in HTML templates',
code: `
<ds-themed-test-themeable/>
<ds-themed-test-themeable></ds-themed-test-themeable>
<ds-themed-test-themeable [test]="something"></ds-themed-test-themeable>
`,
errors: [
{
messageId: Message.WRONG_SELECTOR,
},
{
messageId: Message.WRONG_SELECTOR,
},
{
messageId: Message.WRONG_SELECTOR,
},
],
output: `
<ds-test-themeable/>
<ds-test-themeable></ds-test-themeable>
<ds-test-themeable [test]="something"></ds-test-themeable>
`,
},
{
name: 'base selectors are not allowed in HTML templates',
code: `
<ds-base-test-themeable/>
<ds-base-test-themeable></ds-base-test-themeable>
<ds-base-test-themeable [test]="something"></ds-base-test-themeable>
`,
errors: [
{
messageId: Message.WRONG_SELECTOR,
},
{
messageId: Message.WRONG_SELECTOR,
},
{
messageId: Message.WRONG_SELECTOR,
},
],
output: `
<ds-test-themeable/>
<ds-test-themeable></ds-test-themeable>
<ds-test-themeable [test]="something"></ds-test-themeable>
`,
},
],
} as NamedTests;
export default rule;

View File

@@ -1,25 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import {
bundle,
RuleExports,
} from '../../util/structure';
/* eslint-disable import/no-namespace */
import * as themedComponentClasses from './themed-component-classes';
import * as themedComponentSelectors from './themed-component-selectors';
import * as themedComponentUsages from './themed-component-usages';
const index = [
themedComponentClasses,
themedComponentSelectors,
themedComponentUsages,
] as unknown as RuleExports[];
export = {
...bundle('dspace-angular-ts', 'TypeScript', index),
};

View File

@@ -1,382 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import {
ESLintUtils,
TSESTree,
} from '@typescript-eslint/utils';
import { RuleContext } from '@typescript-eslint/utils/ts-eslint';
import { fixture } from '../../../test/fixture';
import {
getComponentImportNode,
getComponentInitializer,
getComponentStandaloneNode,
} from '../../util/angular';
import { appendObjectProperties } from '../../util/fix';
import { DSpaceESLintRuleInfo } from '../../util/structure';
import {
getBaseComponentClassName,
inThemedComponentOverrideFile,
isThemeableComponent,
isThemedComponentWrapper,
} from '../../util/theme-support';
import { getFilename } from '../../util/typescript';
export enum Message {
NOT_STANDALONE = 'mustBeStandalone',
NOT_STANDALONE_IMPORTS_BASE = 'mustBeStandaloneAndImportBase',
WRAPPER_IMPORTS_BASE = 'wrapperShouldImportBase',
}
export const info = {
name: 'themed-component-classes',
meta: {
docs: {
description: `Formatting rules for themeable component classes
- All themeable components must be standalone.
- The base component must always be imported in the \`ThemedComponent\` wrapper. This ensures that it is always sufficient to import just the wrapper whenever we use the component.
`,
},
type: 'problem',
fixable: 'code',
schema: [],
messages: {
[Message.NOT_STANDALONE]: 'Themeable components must be standalone',
[Message.NOT_STANDALONE_IMPORTS_BASE]: 'Themeable component wrapper classes must be standalone and import the base class',
[Message.WRAPPER_IMPORTS_BASE]: 'Themed component wrapper classes must only import the base class',
},
},
defaultOptions: [],
} as DSpaceESLintRuleInfo;
export const rule = ESLintUtils.RuleCreator.withoutDocs({
...info,
create(context: RuleContext<Message, unknown[]>) {
const filename = getFilename(context);
if (filename.endsWith('.spec.ts')) {
return {};
}
function enforceStandalone(decoratorNode: TSESTree.Decorator, withBaseImport = false) {
const standaloneNode = getComponentStandaloneNode(decoratorNode);
if (standaloneNode === undefined) {
// We may need to add these properties in one go
if (!withBaseImport) {
context.report({
messageId: Message.NOT_STANDALONE,
node: decoratorNode,
fix(fixer) {
const initializer = getComponentInitializer(decoratorNode);
return appendObjectProperties(context, fixer, initializer, ['standalone: true']);
},
});
}
} else if (!standaloneNode.value) {
context.report({
messageId: Message.NOT_STANDALONE,
node: standaloneNode,
fix(fixer) {
return fixer.replaceText(standaloneNode, 'true');
},
});
}
if (withBaseImport) {
const baseClass = getBaseComponentClassName(decoratorNode);
if (baseClass === undefined) {
return;
}
const importsNode = getComponentImportNode(decoratorNode);
if (importsNode === undefined) {
if (standaloneNode === undefined) {
context.report({
messageId: Message.NOT_STANDALONE_IMPORTS_BASE,
node: decoratorNode,
fix(fixer) {
const initializer = getComponentInitializer(decoratorNode);
return appendObjectProperties(context, fixer, initializer, ['standalone: true', `imports: [${baseClass}]`]);
},
});
} else {
context.report({
messageId: Message.WRAPPER_IMPORTS_BASE,
node: decoratorNode,
fix(fixer) {
const initializer = getComponentInitializer(decoratorNode);
return appendObjectProperties(context, fixer, initializer, [`imports: [${baseClass}]`]);
},
});
}
} else {
// If we have an imports node, standalone: true will be enforced by another rule
const imports = importsNode.elements.map(e => (e as TSESTree.Identifier).name);
if (!imports.includes(baseClass) || imports.length > 1) {
// The wrapper should _only_ import the base component
context.report({
messageId: Message.WRAPPER_IMPORTS_BASE,
node: importsNode,
fix(fixer) {
// todo: this may leave unused imports, but that's better than mangling things
return fixer.replaceText(importsNode, `[${baseClass}]`);
},
});
}
}
}
}
return {
'ClassDeclaration > Decorator[expression.callee.name = "Component"]'(node: TSESTree.Decorator) {
const classNode = node.parent as TSESTree.ClassDeclaration;
const className = classNode.id?.name;
if (className === undefined) {
return;
}
if (isThemedComponentWrapper(node)) {
enforceStandalone(node, true);
} else if (inThemedComponentOverrideFile(filename)) {
enforceStandalone(node);
} else if (isThemeableComponent(className)) {
enforceStandalone(node);
}
},
};
},
});
export const tests = {
plugin: info.name,
valid: [
{
name: 'Regular non-themeable component',
code: `
@Component({
selector: 'ds-something',
standalone: true,
})
class Something {
}
`,
},
{
name: 'Base component',
code: `
@Component({
selector: 'ds-base-test-themable',
standalone: true,
})
class TestThemeableTomponent {
}
`,
},
{
name: 'Wrapper component',
filename: fixture('src/app/test/themed-test-themeable.component.ts'),
code: `
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [
TestThemeableComponent,
],
})
class ThemedTestThemeableTomponent extends ThemedComponent<TestThemeableComponent> {
}
`,
},
{
name: 'Override component',
filename: fixture('src/themes/test/app/test/test-themeable.component.ts'),
code: `
@Component({
selector: 'ds-themed-test-themable',
standalone: true,
})
class Override extends BaseComponent {
}
`,
},
],
invalid: [
{
name: 'Base component must be standalone',
code: `
@Component({
selector: 'ds-base-test-themable',
})
class TestThemeableComponent {
}
`,
errors:[
{
messageId: Message.NOT_STANDALONE,
},
],
output: `
@Component({
selector: 'ds-base-test-themable',
standalone: true,
})
class TestThemeableComponent {
}
`,
},
{
name: 'Wrapper component must be standalone and import base component',
filename: fixture('src/app/test/themed-test-themeable.component.ts'),
code: `
@Component({
selector: 'ds-test-themable',
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
`,
errors:[
{
messageId: Message.NOT_STANDALONE_IMPORTS_BASE,
},
],
output: `
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [TestThemeableComponent],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
`,
},
{
name: 'Wrapper component must import base component (array present but empty)',
filename: fixture('src/app/test/themed-test-themeable.component.ts'),
code: `
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
`,
errors:[
{
messageId: Message.WRAPPER_IMPORTS_BASE,
},
],
output: `
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [TestThemeableComponent],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
`,
},
{
name: 'Wrapper component must import base component (array is wrong)',
filename: fixture('src/app/test/themed-test-themeable.component.ts'),
code: `
import { SomethingElse } from './somewhere-else';
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [
SomethingElse,
],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
`,
errors:[
{
messageId: Message.WRAPPER_IMPORTS_BASE,
},
],
output: `
import { SomethingElse } from './somewhere-else';
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [TestThemeableComponent],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
`,
}, {
name: 'Wrapper component must import base component (array is wrong)',
filename: fixture('src/app/test/themed-test-themeable.component.ts'),
code: `
import { Something, SomethingElse } from './somewhere-else';
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [
SomethingElse,
],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
`,
errors:[
{
messageId: Message.WRAPPER_IMPORTS_BASE,
},
],
output: `
import { Something, SomethingElse } from './somewhere-else';
@Component({
selector: 'ds-test-themable',
standalone: true,
imports: [TestThemeableComponent],
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
`,
},
{
name: 'Override component must be standalone',
filename: fixture('src/themes/test/app/test/test-themeable.component.ts'),
code: `
@Component({
selector: 'ds-themed-test-themable',
})
class Override extends BaseComponent {
}
`,
errors:[
{
messageId: Message.NOT_STANDALONE,
},
],
output: `
@Component({
selector: 'ds-themed-test-themable',
standalone: true,
})
class Override extends BaseComponent {
}
`,
},
],
};

View File

@@ -1,257 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import {
ESLintUtils,
TSESTree,
} from '@typescript-eslint/utils';
import { RuleContext } from '@typescript-eslint/utils/ts-eslint';
import { fixture } from '../../../test/fixture';
import { getComponentSelectorNode } from '../../util/angular';
import { stringLiteral } from '../../util/misc';
import { DSpaceESLintRuleInfo } from '../../util/structure';
import {
inThemedComponentOverrideFile,
isThemeableComponent,
isThemedComponentWrapper,
} from '../../util/theme-support';
import { getFilename } from '../../util/typescript';
export enum Message {
BASE = 'wrongSelectorUnthemedComponent',
WRAPPER = 'wrongSelectorThemedComponentWrapper',
THEMED = 'wrongSelectorThemedComponentOverride',
}
export const info = {
name: 'themed-component-selectors',
meta: {
docs: {
description: `Themeable component selectors should follow the DSpace convention
Each themeable component is comprised of a base component, a wrapper component and any number of themed components
- Base components should have a selector starting with \`ds-base-\`
- Themed components should have a selector starting with \`ds-themed-\`
- Wrapper components should have a selector starting with \`ds-\`, but not \`ds-base-\` or \`ds-themed-\`
- This is the regular DSpace selector prefix
- **When making a regular component themeable, its selector prefix should be changed to \`ds-base-\`, and the new wrapper's component should reuse the previous selector**
Unit tests are exempt from this rule, because they may redefine components using the same class name as other themeable components elsewhere in the source.
`,
},
type: 'problem',
schema: [],
fixable: 'code',
messages: {
[Message.BASE]: 'Unthemed version of themeable component should have a selector starting with \'ds-base-\'',
[Message.WRAPPER]: 'Themed component wrapper of themeable component shouldn\'t have a selector starting with \'ds-themed-\'',
[Message.THEMED]: 'Theme override of themeable component should have a selector starting with \'ds-themed-\'',
},
},
defaultOptions: [],
} as DSpaceESLintRuleInfo;
export const rule = ESLintUtils.RuleCreator.withoutDocs({
...info,
create(context: RuleContext<Message, unknown[]>) {
const filename = getFilename(context);
if (filename.endsWith('.spec.ts')) {
return {};
}
function enforceWrapperSelector(selectorNode: TSESTree.StringLiteral) {
if (selectorNode?.value.startsWith('ds-themed-')) {
context.report({
messageId: Message.WRAPPER,
node: selectorNode,
fix(fixer) {
return fixer.replaceText(selectorNode, stringLiteral(selectorNode.value.replace('ds-themed-', 'ds-')));
},
});
}
}
function enforceBaseSelector(selectorNode: TSESTree.StringLiteral) {
if (!selectorNode?.value.startsWith('ds-base-')) {
context.report({
messageId: Message.BASE,
node: selectorNode,
fix(fixer) {
return fixer.replaceText(selectorNode, stringLiteral(selectorNode.value.replace('ds-', 'ds-base-')));
},
});
}
}
function enforceThemedSelector(selectorNode: TSESTree.StringLiteral) {
if (!selectorNode?.value.startsWith('ds-themed-')) {
context.report({
messageId: Message.THEMED,
node: selectorNode,
fix(fixer) {
return fixer.replaceText(selectorNode, stringLiteral(selectorNode.value.replace('ds-', 'ds-themed-')));
},
});
}
}
return {
'ClassDeclaration > Decorator[expression.callee.name = "Component"]'(node: TSESTree.Decorator) {
const selectorNode = getComponentSelectorNode(node);
if (selectorNode === undefined) {
return;
}
const selector = selectorNode?.value;
const classNode = node.parent as TSESTree.ClassDeclaration;
const className = classNode.id?.name;
if (selector === undefined || className === undefined) {
return;
}
if (isThemedComponentWrapper(node)) {
enforceWrapperSelector(selectorNode);
} else if (inThemedComponentOverrideFile(filename)) {
enforceThemedSelector(selectorNode);
} else if (isThemeableComponent(className)) {
enforceBaseSelector(selectorNode);
}
},
};
},
});
export const tests = {
plugin: info.name,
valid: [
{
name: 'Regular non-themeable component selector',
code: `
@Component({
selector: 'ds-something',
})
class Something {
}
`,
},
{
name: 'Themeable component selector should replace the original version, unthemed version should be changed to ds-base-',
code: `
@Component({
selector: 'ds-base-something',
})
class Something {
}
@Component({
selector: 'ds-something',
})
class ThemedSomething extends ThemedComponent<Something> {
}
@Component({
selector: 'ds-themed-something',
})
class OverrideSomething extends Something {
}
`,
},
{
name: 'Other themed component wrappers should not interfere',
code: `
@Component({
selector: 'ds-something',
})
class Something {
}
@Component({
selector: 'ds-something-else',
})
class ThemedSomethingElse extends ThemedComponent<SomethingElse> {
}
`,
},
],
invalid: [
{
name: 'Wrong selector for base component',
filename: fixture('src/app/test/test-themeable.component.ts'),
code: `
@Component({
selector: 'ds-something',
})
class TestThemeableComponent {
}
`,
errors: [
{
messageId: Message.BASE,
},
],
output: `
@Component({
selector: 'ds-base-something',
})
class TestThemeableComponent {
}
`,
},
{
name: 'Wrong selector for wrapper component',
filename: fixture('src/app/test/themed-test-themeable.component.ts'),
code: `
@Component({
selector: 'ds-themed-something',
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
`,
errors: [
{
messageId: Message.WRAPPER,
},
],
output: `
@Component({
selector: 'ds-something',
})
class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
}
`,
},
{
name: 'Wrong selector for theme override',
filename: fixture('src/themes/test/app/test/test-themeable.component.ts'),
code: `
@Component({
selector: 'ds-something',
})
class TestThememeableComponent extends BaseComponent {
}
`,
errors: [
{
messageId: Message.THEMED,
},
],
output: `
@Component({
selector: 'ds-themed-something',
})
class TestThememeableComponent extends BaseComponent {
}
`,
},
],
};
export default rule;

View File

@@ -1,502 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import {
ESLintUtils,
TSESTree,
} from '@typescript-eslint/utils';
import { RuleContext } from '@typescript-eslint/utils/ts-eslint';
import { fixture } from '../../../test/fixture';
import {
removeWithCommas,
replaceOrRemoveArrayIdentifier,
} from '../../util/fix';
import { DSpaceESLintRuleInfo } from '../../util/structure';
import {
allThemeableComponents,
DISALLOWED_THEME_SELECTORS,
fixSelectors,
getThemeableComponentByBaseClass,
isAllowedUnthemedUsage,
} from '../../util/theme-support';
import {
findImportSpecifier,
findUsages,
findUsagesByName,
getFilename,
relativePath,
} from '../../util/typescript';
export enum Message {
WRONG_CLASS = 'mustUseThemedWrapperClass',
WRONG_IMPORT = 'mustImportThemedWrapper',
WRONG_SELECTOR = 'mustUseThemedWrapperSelector',
BASE_IN_MODULE = 'baseComponentNotNeededInModule',
}
export const info = {
name: 'themed-component-usages',
meta: {
docs: {
description: `Themeable components should be used via their \`ThemedComponent\` wrapper class
This ensures that custom themes can correctly override _all_ instances of this component.
There are a few exceptions where the base class can still be used:
- Class declaration expressions (otherwise we can't declare, extend or override the class in the first place)
- Angular modules (except for routing modules)
- Angular \`@ViewChild\` decorators
- Type annotations
`,
},
type: 'problem',
schema: [],
fixable: 'code',
messages: {
[Message.WRONG_CLASS]: 'Themeable components should be used via their ThemedComponent wrapper',
[Message.WRONG_IMPORT]: 'Themeable components should be used via their ThemedComponent wrapper',
[Message.WRONG_SELECTOR]: 'Themeable components should be used via their ThemedComponent wrapper',
[Message.BASE_IN_MODULE]: 'Base themeable components shouldn\'t be declared in modules',
},
},
defaultOptions: [],
} as DSpaceESLintRuleInfo;
export const rule = ESLintUtils.RuleCreator.withoutDocs({
...info,
create(context: RuleContext<Message, unknown[]>) {
const filename = getFilename(context);
function handleUnthemedUsagesInTypescript(node: TSESTree.Identifier) {
if (isAllowedUnthemedUsage(node)) {
return;
}
const entry = getThemeableComponentByBaseClass(node.name);
if (entry === undefined) {
// this should never happen
throw new Error(`No such themeable component in registry: '${node.name}'`);
}
context.report({
messageId: Message.WRONG_CLASS,
node: node,
fix(fixer) {
if (node.parent.type === TSESTree.AST_NODE_TYPES.ArrayExpression) {
return replaceOrRemoveArrayIdentifier(context, fixer, node, entry.wrapperClass);
} else {
return fixer.replaceText(node, entry.wrapperClass);
}
},
});
}
function handleThemedSelectorQueriesInTests(node: TSESTree.Literal) {
context.report({
node,
messageId: Message.WRONG_SELECTOR,
fix(fixer){
const newSelector = fixSelectors(node.raw);
return fixer.replaceText(node, newSelector);
},
});
}
function handleUnthemedImportsInTypescript(specifierNode: TSESTree.ImportSpecifier) {
const allUsages = findUsages(context, specifierNode.local);
const badUsages = allUsages.filter(usage => !isAllowedUnthemedUsage(usage));
if (badUsages.length === 0) {
return;
}
const importedNode = specifierNode.imported;
const declarationNode = specifierNode.parent as TSESTree.ImportDeclaration;
const entry = getThemeableComponentByBaseClass(importedNode.name);
if (entry === undefined) {
// this should never happen
throw new Error(`No such themeable component in registry: '${importedNode.name}'`);
}
context.report({
messageId: Message.WRONG_IMPORT,
node: importedNode,
fix(fixer) {
const ops = [];
const wrapperImport = findImportSpecifier(context, entry.wrapperClass);
if (findUsagesByName(context, entry.wrapperClass).length === 0) {
// Wrapper is not present in this file, safe to add import
const newImportLine = `import { ${entry.wrapperClass} } from '${relativePath(filename, entry.wrapperPath)}';`;
if (declarationNode.specifiers.length === 1) {
if (allUsages.length === badUsages.length) {
ops.push(fixer.replaceText(declarationNode, newImportLine));
} else if (wrapperImport === undefined) {
ops.push(fixer.insertTextAfter(declarationNode, '\n' + newImportLine));
}
} else {
ops.push(...removeWithCommas(context, fixer, specifierNode));
if (wrapperImport === undefined) {
ops.push(fixer.insertTextAfter(declarationNode, '\n' + newImportLine));
}
}
} else {
// Wrapper already present in the file, remove import instead
if (allUsages.length === badUsages.length) {
if (declarationNode.specifiers.length === 1) {
// Make sure we remove the newline as well
ops.push(fixer.removeRange([declarationNode.range[0], declarationNode.range[1] + 1]));
} else {
ops.push(...removeWithCommas(context, fixer, specifierNode));
}
}
}
return ops;
},
});
}
// ignore tests and non-routing modules
if (filename.endsWith('.spec.ts')) {
return {
[`CallExpression[callee.object.name = "By"][callee.property.name = "css"] > Literal:first-child[value = /.*${DISALLOWED_THEME_SELECTORS}.*/]`]: handleThemedSelectorQueriesInTests,
};
} else if (filename.endsWith('.cy.ts')) {
return {
[`CallExpression[callee.object.name = "cy"][callee.property.name = "get"] > Literal:first-child[value = /.*${DISALLOWED_THEME_SELECTORS}.*/]`]: handleThemedSelectorQueriesInTests,
};
} else if (
filename.match(/(?!src\/themes\/).*(?!routing).module.ts$/)
|| filename.match(/themed-.+\.component\.ts$/)
) {
// do nothing
return {};
} else {
return allThemeableComponents().reduce(
(rules, entry) => {
return {
...rules,
[`:not(:matches(ClassDeclaration, ImportSpecifier)) > Identifier[name = "${entry.baseClass}"]`]: handleUnthemedUsagesInTypescript,
[`ImportSpecifier[imported.name = "${entry.baseClass}"]`]: handleUnthemedImportsInTypescript,
};
}, {},
);
}
},
});
export const tests = {
plugin: info.name,
valid: [
{
name: 'allow wrapper class usages',
code: `
import { ThemedTestThemeableComponent } from './app/test/themed-test-themeable.component';
const config = {
a: ThemedTestThemeableComponent,
b: ChipsComponent,
}
`,
},
{
name: 'allow base class in class declaration',
code: `
export class TestThemeableComponent {
}
`,
},
{
name: 'allow inheriting from base class',
code: `
import { TestThemeableComponent } from './app/test/test-themeable.component';
export class ThemedAdminSidebarComponent extends ThemedComponent<TestThemeableComponent> {
}
`,
},
{
name: 'allow base class in ViewChild',
code: `
import { TestThemeableComponent } from './app/test/test-themeable.component';
export class Something {
@ViewChild(TestThemeableComponent) test: TestThemeableComponent;
}
`,
},
{
name: 'allow wrapper selectors in test queries',
filename: fixture('src/app/test/test.component.spec.ts'),
code: `
By.css('ds-themeable');
By.css('#test > ds-themeable > #nest');
`,
},
{
name: 'allow wrapper selectors in cypress queries',
filename: fixture('src/app/test/test.component.cy.ts'),
code: `
By.css('ds-themeable');
By.css('#test > ds-themeable > #nest');
`,
},
],
invalid: [
{
name: 'disallow direct usages of base class',
code: `
import { TestThemeableComponent } from './app/test/test-themeable.component';
import { TestComponent } from './app/test/test.component';
const config = {
a: TestThemeableComponent,
b: TestComponent,
}
`,
errors: [
{
messageId: Message.WRONG_IMPORT,
},
{
messageId: Message.WRONG_CLASS,
},
],
output: `
import { ThemedTestThemeableComponent } from './app/test/themed-test-themeable.component';
import { TestComponent } from './app/test/test.component';
const config = {
a: ThemedTestThemeableComponent,
b: TestComponent,
}
`,
},
{
name: 'disallow direct usages of base class, keep other imports',
code: `
import { Something, TestThemeableComponent } from './app/test/test-themeable.component';
import { TestComponent } from './app/test/test.component';
const config = {
a: TestThemeableComponent,
b: TestComponent,
c: Something,
}
`,
errors: [
{
messageId: Message.WRONG_IMPORT,
},
{
messageId: Message.WRONG_CLASS,
},
],
output: `
import { Something } from './app/test/test-themeable.component';
import { ThemedTestThemeableComponent } from './app/test/themed-test-themeable.component';
import { TestComponent } from './app/test/test.component';
const config = {
a: ThemedTestThemeableComponent,
b: TestComponent,
c: Something,
}
`,
},
{
name: 'handle array replacements correctly',
code: `
const DECLARATIONS = [
Something,
TestThemeableComponent,
Something,
ThemedTestThemeableComponent,
];
`,
errors: [
{
messageId: Message.WRONG_CLASS,
},
],
output: `
const DECLARATIONS = [
Something,
Something,
ThemedTestThemeableComponent,
];
`,
},
{
name: 'disallow override selector in test queries',
filename: fixture('src/app/test/test.component.spec.ts'),
code: `
By.css('ds-themed-themeable');
By.css('#test > ds-themed-themeable > #nest');
`,
errors: [
{
messageId: Message.WRONG_SELECTOR,
},
{
messageId: Message.WRONG_SELECTOR,
},
],
output: `
By.css('ds-themeable');
By.css('#test > ds-themeable > #nest');
`,
},
{
name: 'disallow base selector in test queries',
filename: fixture('src/app/test/test.component.spec.ts'),
code: `
By.css('ds-base-themeable');
By.css('#test > ds-base-themeable > #nest');
`,
errors: [
{
messageId: Message.WRONG_SELECTOR,
},
{
messageId: Message.WRONG_SELECTOR,
},
],
output: `
By.css('ds-themeable');
By.css('#test > ds-themeable > #nest');
`,
},
{
name: 'disallow override selector in cypress queries',
filename: fixture('src/app/test/test.component.cy.ts'),
code: `
cy.get('ds-themed-themeable');
cy.get('#test > ds-themed-themeable > #nest');
`,
errors: [
{
messageId: Message.WRONG_SELECTOR,
},
{
messageId: Message.WRONG_SELECTOR,
},
],
output: `
cy.get('ds-themeable');
cy.get('#test > ds-themeable > #nest');
`,
},
{
name: 'disallow base selector in cypress queries',
filename: fixture('src/app/test/test.component.cy.ts'),
code: `
cy.get('ds-base-themeable');
cy.get('#test > ds-base-themeable > #nest');
`,
errors: [
{
messageId: Message.WRONG_SELECTOR,
},
{
messageId: Message.WRONG_SELECTOR,
},
],
output: `
cy.get('ds-themeable');
cy.get('#test > ds-themeable > #nest');
`,
},
{
name: 'edge case: unable to find usage node through usage token, but import is still flagged and fixed',
filename: fixture('src/themes/test/app/test/other-themeable.component.ts'),
code: `
import { Component } from '@angular/core';
import { Context } from './app/core/shared/context.model';
import { TestThemeableComponent } from '../../../../app/test/test-themeable.component';
@Component({
standalone: true,
imports: [TestThemeableComponent],
})
export class UsageComponent {
}
`,
errors: [
{
messageId: Message.WRONG_IMPORT,
},
{
messageId: Message.WRONG_CLASS,
},
],
output: `
import { Component } from '@angular/core';
import { Context } from './app/core/shared/context.model';
import { ThemedTestThemeableComponent } from '../../../../app/test/themed-test-themeable.component';
@Component({
standalone: true,
imports: [ThemedTestThemeableComponent],
})
export class UsageComponent {
}
`,
},
{
name: 'edge case edge case: both are imported, only wrapper is retained',
filename: fixture('src/themes/test/app/test/other-themeable.component.ts'),
code: `
import { Component } from '@angular/core';
import { Context } from './app/core/shared/context.model';
import { TestThemeableComponent } from '../../../../app/test/test-themeable.component';
import { ThemedTestThemeableComponent } from '../../../../app/test/themed-test-themeable.component';
@Component({
standalone: true,
imports: [TestThemeableComponent, ThemedTestThemeableComponent],
})
export class UsageComponent {
}
`,
errors: [
{
messageId: Message.WRONG_IMPORT,
},
{
messageId: Message.WRONG_CLASS,
},
],
output: `
import { Component } from '@angular/core';
import { Context } from './app/core/shared/context.model';
import { ThemedTestThemeableComponent } from '../../../../app/test/themed-test-themeable.component';
@Component({
standalone: true,
imports: [ThemedTestThemeableComponent],
})
export class UsageComponent {
}
`,
},
],
};
export default rule;

View File

@@ -1,83 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { TSESTree } from '@typescript-eslint/utils';
import { getObjectPropertyNodeByName } from './typescript';
export function getComponentSelectorNode(componentDecoratorNode: TSESTree.Decorator): TSESTree.StringLiteral | undefined {
const property = getComponentInitializerNodeByName(componentDecoratorNode, 'selector');
if (property !== undefined) {
// todo: support template literals as well
if (property.type === TSESTree.AST_NODE_TYPES.Literal && typeof property.value === 'string') {
return property as TSESTree.StringLiteral;
}
}
return undefined;
}
export function getComponentStandaloneNode(componentDecoratorNode: TSESTree.Decorator): TSESTree.BooleanLiteral | undefined {
const property = getComponentInitializerNodeByName(componentDecoratorNode, 'standalone');
if (property !== undefined) {
if (property.type === TSESTree.AST_NODE_TYPES.Literal && typeof property.value === 'boolean') {
return property as TSESTree.BooleanLiteral;
}
}
return undefined;
}
export function getComponentImportNode(componentDecoratorNode: TSESTree.Decorator): TSESTree.ArrayExpression | undefined {
const property = getComponentInitializerNodeByName(componentDecoratorNode, 'imports');
if (property !== undefined) {
if (property.type === TSESTree.AST_NODE_TYPES.ArrayExpression) {
return property as TSESTree.ArrayExpression;
}
}
return undefined;
}
export function getComponentClassName(decoratorNode: TSESTree.Decorator): string | undefined {
if (decoratorNode.parent.type !== TSESTree.AST_NODE_TYPES.ClassDeclaration) {
return undefined;
}
if (decoratorNode.parent.id?.type !== TSESTree.AST_NODE_TYPES.Identifier) {
return undefined;
}
return decoratorNode.parent.id.name;
}
export function getComponentSuperClassName(decoratorNode: TSESTree.Decorator): string | undefined {
if (decoratorNode.parent.type !== TSESTree.AST_NODE_TYPES.ClassDeclaration) {
return undefined;
}
if (decoratorNode.parent.superClass?.type !== TSESTree.AST_NODE_TYPES.Identifier) {
return undefined;
}
return decoratorNode.parent.superClass.name;
}
export function getComponentInitializer(componentDecoratorNode: TSESTree.Decorator): TSESTree.ObjectExpression {
return (componentDecoratorNode.expression as TSESTree.CallExpression).arguments[0] as TSESTree.ObjectExpression;
}
export function getComponentInitializerNodeByName(componentDecoratorNode: TSESTree.Decorator, name: string): TSESTree.Node | undefined {
const initializer = getComponentInitializer(componentDecoratorNode);
return getObjectPropertyNodeByName(initializer, name);
}
export function isPartOfViewChild(node: TSESTree.Identifier): boolean {
return (node.parent as any)?.callee?.name === 'ViewChild';
}

View File

@@ -1,125 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { TSESTree } from '@typescript-eslint/utils';
import {
RuleContext,
RuleFix,
RuleFixer,
} from '@typescript-eslint/utils/ts-eslint';
import { getSourceCode } from './typescript';
export function appendObjectProperties(context: RuleContext<any, any>, fixer: RuleFixer, objectNode: TSESTree.ObjectExpression, properties: string[]): RuleFix {
// todo: may not handle empty objects too well
const lastProperty = objectNode.properties[objectNode.properties.length - 1];
const source = getSourceCode(context);
const nextToken = source.getTokenAfter(lastProperty);
// todo: newline & indentation are hardcoded for @Component({})
// todo: we're assuming that we need trailing commas, what if we don't?
const newPart = '\n' + properties.map(p => ` ${p},`).join('\n');
if (nextToken !== null && nextToken.value === ',') {
return fixer.insertTextAfter(nextToken, newPart);
} else {
return fixer.insertTextAfter(lastProperty, ',' + newPart);
}
}
export function appendArrayElement(context: RuleContext<any, any>, fixer: RuleFixer, arrayNode: TSESTree.ArrayExpression, value: string): RuleFix {
const source = getSourceCode(context);
if (arrayNode.elements.length === 0) {
// This is the first element
const openArray = source.getTokenByRangeStart(arrayNode.range[0]);
if (openArray == null) {
throw new Error('Unexpected null token for opening square bracket');
}
// safe to assume the list is single-line
return fixer.insertTextAfter(openArray, `${value}`);
} else {
const lastElement = arrayNode.elements[arrayNode.elements.length - 1];
if (lastElement == null) {
throw new Error('Unexpected null node in array');
}
const nextToken = source.getTokenAfter(lastElement);
// todo: we don't know if the list is chopped or not, so we can't make any assumptions -- may produce output that will be flagged by other rules on the next run!
// todo: we're assuming that we need trailing commas, what if we don't?
if (nextToken !== null && nextToken.value === ',') {
return fixer.insertTextAfter(nextToken, ` ${value},`);
} else {
return fixer.insertTextAfter(lastElement, `, ${value},`);
}
}
}
export function isLast(elementNode: TSESTree.Node): boolean {
if (!elementNode.parent) {
return false;
}
let siblingNodes: (TSESTree.Node | null)[] = [null];
if (elementNode.parent.type === TSESTree.AST_NODE_TYPES.ArrayExpression) {
siblingNodes = elementNode.parent.elements;
} else if (elementNode.parent.type === TSESTree.AST_NODE_TYPES.ImportDeclaration) {
siblingNodes = elementNode.parent.specifiers;
}
return elementNode === siblingNodes[siblingNodes.length - 1];
}
export function removeWithCommas(context: RuleContext<any, any>, fixer: RuleFixer, elementNode: TSESTree.Node): RuleFix[] {
const ops = [];
const source = getSourceCode(context);
let nextToken = source.getTokenAfter(elementNode);
let prevToken = source.getTokenBefore(elementNode);
if (nextToken !== null && prevToken !== null) {
if (nextToken.value === ',') {
nextToken = source.getTokenAfter(nextToken);
if (nextToken !== null) {
ops.push(fixer.removeRange([elementNode.range[0], nextToken.range[0]]));
}
}
if (isLast(elementNode) && prevToken.value === ',') {
prevToken = source.getTokenBefore(prevToken);
if (prevToken !== null) {
ops.push(fixer.removeRange([prevToken.range[1], elementNode.range[1]]));
}
}
} else if (nextToken !== null) {
ops.push(fixer.removeRange([elementNode.range[0], nextToken.range[0]]));
}
return ops;
}
export function replaceOrRemoveArrayIdentifier(context: RuleContext<any, any>, fixer: RuleFixer, identifierNode: TSESTree.Identifier, newValue: string): RuleFix[] {
if (identifierNode.parent.type !== TSESTree.AST_NODE_TYPES.ArrayExpression) {
throw new Error('Parent node is not an array expression!');
}
const array = identifierNode.parent as TSESTree.ArrayExpression;
for (const element of array.elements) {
if (element !== null && element.type === TSESTree.AST_NODE_TYPES.Identifier && element.name === newValue) {
return removeWithCommas(context, fixer, identifierNode);
}
}
return [fixer.replaceText(identifierNode, newValue)];
}

View File

@@ -1,28 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
export function match(rangeA: number[], rangeB: number[]) {
return rangeA[0] === rangeB[0] && rangeA[1] === rangeB[1];
}
export function stringLiteral(value: string): string {
return `'${value}'`;
}
/**
* Transform Windows-style paths into Unix-style paths
*/
export function toUnixStylePath(path: string): string {
// note: we're assuming that none of the directory/file names contain '\' or '/' characters.
// using these characters in paths is very bad practice in general, so this should be a safe assumption.
if (path.includes('\\')) {
return path.replace(/^[A-Z]:\\/, '/').replaceAll('\\', '/');
}
return path;
}

View File

@@ -1,61 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import {
InvalidTestCase,
RuleMetaData,
RuleModule,
ValidTestCase,
} from '@typescript-eslint/utils/ts-eslint';
import { EnumType } from 'typescript';
export type Meta = RuleMetaData<string, unknown[]>;
export type Valid = ValidTestCase<unknown[]>;
export type Invalid = InvalidTestCase<string, unknown[]>;
export interface DSpaceESLintRuleInfo {
name: string;
meta: Meta,
defaultOptions: unknown[],
}
export interface NamedTests {
plugin: string;
valid: Valid[];
invalid: Invalid[];
}
export interface RuleExports {
Message: EnumType,
info: DSpaceESLintRuleInfo,
rule: RuleModule<string>,
tests: NamedTests,
default: unknown,
}
export interface PluginExports {
name: string,
language: string,
rules: Record<string, unknown>,
index: RuleExports[],
}
export function bundle(
name: string,
language: string,
index: RuleExports[],
): PluginExports {
return index.reduce((o: PluginExports, i: RuleExports) => {
o.rules[i.info.name] = i.rule;
return o;
}, {
name,
language,
rules: {},
index,
});
}

View File

@@ -1,5 +0,0 @@
[DSpace ESLint plugins](../../../lint/README.md) > <%= plugin.language %> rules
_______
<% rules.forEach(rule => { %>
- [`<%= plugin.name %>/<%= rule.name %>`](./rules/<%= rule.name %>.md)<% if (rule.meta?.docs?.description) {%>: <%= rule.meta.docs.description.split('\n')[0].trim() -%><% }-%>
<% }) %>

View File

@@ -1,48 +0,0 @@
[DSpace ESLint plugins](../../../../lint/README.md) > [<%= plugin.language %> rules](../index.md) > `<%= plugin.name %>/<%= rule.name %>`
_______
<%- rule.meta.docs?.description %>
_______
[Source code](../../../../lint/src/rules/<%- plugin.name.replace('dspace-angular-', '') %>/<%- rule.name %>.ts)
### Examples
<% if (tests.valid) {%>
#### Valid code
<% tests.valid.forEach(test => { %>
##### <%= test.name !== undefined ? test.name : 'UNNAMED' %>
<% if (test.filename) { %>
Filename: `<%- test.filename %>`
<% } %>
```<%- plugin.language.toLowerCase() %>
<%- test.code.trim() %>
```
<% }) %>
<% } %>
<% if (tests.invalid) {%>
#### Invalid code <%= rule.meta.fixable ? ' & automatic fixes' : '' %>
<% tests.invalid.forEach(test => { %>
##### <%= test.name !== undefined ? test.name : 'UNNAMED' %>
<% if (test.filename) { %>
Filename: `<%- test.filename %>`
<% } %>
```<%- plugin.language.toLowerCase() %>
<%- test.code.trim() %>
```
Will produce the following error(s):
```
<% for (const error of test.errors) { -%>
<%- rule.meta.messages[error.messageId] %>
<% } -%>
```
<% if (test.output) { %>
Result of `yarn lint --fix`:
```<%- plugin.language.toLowerCase() %>
<%- test.output.trim() %>
```
<% } %>
<% }) %>
<% } %>

View File

@@ -1,265 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { TSESTree } from '@typescript-eslint/utils';
import { readFileSync } from 'fs';
import { basename } from 'path';
import ts, { Identifier } from 'typescript';
import {
getComponentClassName,
isPartOfViewChild,
} from './angular';
import {
isPartOfClassDeclaration,
isPartOfTypeExpression,
} from './typescript';
/**
* Couples a themeable Component to its ThemedComponent wrapper
*/
export interface ThemeableComponentRegistryEntry {
basePath: string;
baseFileName: string,
baseClass: string;
wrapperPath: string;
wrapperFileName: string,
wrapperClass: string;
}
function isAngularComponentDecorator(node: ts.Node) {
if (node.kind === ts.SyntaxKind.Decorator && node.parent.kind === ts.SyntaxKind.ClassDeclaration) {
const decorator = node as ts.Decorator;
if (decorator.expression.kind === ts.SyntaxKind.CallExpression) {
const method = decorator.expression as ts.CallExpression;
if (method.expression.kind === ts.SyntaxKind.Identifier) {
return (method.expression as Identifier).text === 'Component';
}
}
}
return false;
}
function findImportDeclaration(source: ts.SourceFile, identifierName: string): ts.ImportDeclaration | undefined {
return ts.forEachChild(source, (topNode: ts.Node) => {
if (topNode.kind === ts.SyntaxKind.ImportDeclaration) {
const importDeclaration = topNode as ts.ImportDeclaration;
if (importDeclaration.importClause?.namedBindings?.kind === ts.SyntaxKind.NamedImports) {
const namedImports = importDeclaration.importClause?.namedBindings as ts.NamedImports;
for (const element of namedImports.elements) {
if (element.name.text === identifierName) {
return importDeclaration;
}
}
}
}
return undefined;
});
}
/**
* Listing of all themeable Components
*/
class ThemeableComponentRegistry {
public readonly entries: Set<ThemeableComponentRegistryEntry>;
public readonly byBaseClass: Map<string, ThemeableComponentRegistryEntry>;
public readonly byWrapperClass: Map<string, ThemeableComponentRegistryEntry>;
public readonly byBasePath: Map<string, ThemeableComponentRegistryEntry>;
public readonly byWrapperPath: Map<string, ThemeableComponentRegistryEntry>;
constructor() {
this.entries = new Set();
this.byBaseClass = new Map();
this.byWrapperClass = new Map();
this.byBasePath = new Map();
this.byWrapperPath = new Map();
}
public initialize(prefix = '') {
if (this.entries.size > 0) {
return;
}
function registerWrapper(path: string) {
const source = getSource(path);
function traverse(node: ts.Node) {
if (node.parent !== undefined && isAngularComponentDecorator(node)) {
const classNode = node.parent as ts.ClassDeclaration;
if (classNode.name === undefined || classNode.heritageClauses === undefined) {
return;
}
const wrapperClass = classNode.name?.escapedText as string;
for (const heritageClause of classNode.heritageClauses) {
for (const type of heritageClause.types) {
if ((type as any).expression.escapedText === 'ThemedComponent') {
if (type.kind !== ts.SyntaxKind.ExpressionWithTypeArguments || type.typeArguments === undefined) {
continue;
}
const firstTypeArg = type.typeArguments[0] as ts.TypeReferenceNode;
const baseClass = (firstTypeArg.typeName as ts.Identifier)?.escapedText;
if (baseClass === undefined) {
continue;
}
const importDeclaration = findImportDeclaration(source, baseClass);
if (importDeclaration === undefined) {
continue;
}
const basePath = resolveLocalPath((importDeclaration.moduleSpecifier as ts.StringLiteral).text, path);
themeableComponents.add({
baseClass,
basePath: basePath.replace(new RegExp(`^${prefix}`), ''),
baseFileName: basename(basePath).replace(/\.ts$/, ''),
wrapperClass,
wrapperPath: path.replace(new RegExp(`^${prefix}`), ''),
wrapperFileName: basename(path).replace(/\.ts$/, ''),
});
}
}
}
return;
} else {
ts.forEachChild(node, traverse);
}
}
traverse(source);
}
const glob = require('glob');
// note: this outputs Unix-style paths on Windows
const wrappers: string[] = glob.GlobSync(prefix + 'src/app/**/themed-*.component.ts', { ignore: 'node_modules/**' }).found;
for (const wrapper of wrappers) {
registerWrapper(wrapper);
}
}
private add(entry: ThemeableComponentRegistryEntry) {
this.entries.add(entry);
this.byBaseClass.set(entry.baseClass, entry);
this.byWrapperClass.set(entry.wrapperClass, entry);
this.byBasePath.set(entry.basePath, entry);
this.byWrapperPath.set(entry.wrapperPath, entry);
}
}
export const themeableComponents = new ThemeableComponentRegistry();
/**
* Construct the AST of a TypeScript source file
* @param file
*/
function getSource(file: string): ts.SourceFile {
return ts.createSourceFile(
file,
readFileSync(file).toString(),
ts.ScriptTarget.ES2020, // todo: actually use tsconfig.json?
/*setParentNodes */ true,
);
}
/**
* Resolve a possibly relative local path into an absolute path starting from the root directory of the project
*/
function resolveLocalPath(path: string, relativeTo: string) {
if (path.startsWith('src/')) {
return path;
} else if (path.startsWith('./')) {
const parts = relativeTo.split('/');
return [
...parts.slice(0, parts.length - 1),
path.replace(/^.\//, ''),
].join('/') + '.ts';
} else {
throw new Error(`Unsupported local path: ${path}`);
}
}
export function isThemedComponentWrapper(decoratorNode: TSESTree.Decorator): boolean {
if (decoratorNode.parent.type !== TSESTree.AST_NODE_TYPES.ClassDeclaration) {
return false;
}
if (decoratorNode.parent.superClass?.type !== TSESTree.AST_NODE_TYPES.Identifier) {
return false;
}
return (decoratorNode.parent.superClass as any)?.name === 'ThemedComponent';
}
export function getBaseComponentClassName(decoratorNode: TSESTree.Decorator): string | undefined {
const wrapperClass = getComponentClassName(decoratorNode);
if (wrapperClass === undefined) {
return;
}
themeableComponents.initialize();
const entry = themeableComponents.byWrapperClass.get(wrapperClass);
if (entry === undefined) {
return undefined;
}
return entry.baseClass;
}
export function isThemeableComponent(className: string): boolean {
themeableComponents.initialize();
return themeableComponents.byBaseClass.has(className);
}
export function inThemedComponentOverrideFile(filename: string): boolean {
const match = filename.match(/src\/themes\/[^\/]+\/(app\/.*)/);
if (!match) {
return false;
}
themeableComponents.initialize();
// todo: this is fragile!
return themeableComponents.byBasePath.has(`src/${match[1]}`);
}
export function allThemeableComponents(): ThemeableComponentRegistryEntry[] {
themeableComponents.initialize();
return [...themeableComponents.entries];
}
export function getThemeableComponentByBaseClass(baseClass: string): ThemeableComponentRegistryEntry | undefined {
themeableComponents.initialize();
return themeableComponents.byBaseClass.get(baseClass);
}
export function isAllowedUnthemedUsage(usageNode: TSESTree.Identifier) {
return isPartOfClassDeclaration(usageNode) || isPartOfTypeExpression(usageNode) || isPartOfViewChild(usageNode);
}
export const DISALLOWED_THEME_SELECTORS = 'ds-(base|themed)-';
export function fixSelectors(text: string): string {
return text.replaceAll(/ds-(base|themed)-/g, 'ds-');
}

View File

@@ -1,155 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { TSESTree } from '@typescript-eslint/utils';
import {
RuleContext,
SourceCode,
} from '@typescript-eslint/utils/ts-eslint';
import {
match,
toUnixStylePath,
} from './misc';
export type AnyRuleContext = RuleContext<string, unknown[]>;
/**
* Return the current filename based on the ESLint rule context as a Unix-style path.
* This is easier for regex and comparisons to glob paths.
*/
export function getFilename(context: AnyRuleContext): string {
// TSESLint claims this is deprecated, but the suggested alternative is undefined (could be a version mismatch between ESLint and TSESlint?)
// eslint-disable-next-line deprecation/deprecation
return toUnixStylePath(context.getFilename());
}
export function getSourceCode(context: AnyRuleContext): SourceCode {
// TSESLint claims this is deprecated, but the suggested alternative is undefined (could be a version mismatch between ESLint and TSESlint?)
// eslint-disable-next-line deprecation/deprecation
return context.getSourceCode();
}
export function getObjectPropertyNodeByName(objectNode: TSESTree.ObjectExpression, propertyName: string): TSESTree.Node | undefined {
for (const propertyNode of objectNode.properties) {
if (
propertyNode.type === TSESTree.AST_NODE_TYPES.Property
&& (
(
propertyNode.key?.type === TSESTree.AST_NODE_TYPES.Identifier
&& propertyNode.key?.name === propertyName
) || (
propertyNode.key?.type === TSESTree.AST_NODE_TYPES.Literal
&& propertyNode.key?.value === propertyName
)
)
) {
return propertyNode.value;
}
}
return undefined;
}
export function findUsages(context: AnyRuleContext, localNode: TSESTree.Identifier): TSESTree.Identifier[] {
const source = getSourceCode(context);
const usages: TSESTree.Identifier[] = [];
for (const token of source.ast.tokens) {
if (token.type === TSESTree.AST_TOKEN_TYPES.Identifier && token.value === localNode.name && !match(token.range, localNode.range)) {
const node = source.getNodeByRangeIndex(token.range[0]);
// todo: in some cases, the resulting node can actually be the whole program (!)
if (node !== null) {
usages.push(node as TSESTree.Identifier);
}
}
}
return usages;
}
export function findUsagesByName(context: AnyRuleContext, identifier: string): TSESTree.Identifier[] {
const source = getSourceCode(context);
const usages: TSESTree.Identifier[] = [];
for (const token of source.ast.tokens) {
if (token.type === TSESTree.AST_TOKEN_TYPES.Identifier && token.value === identifier) {
const node = source.getNodeByRangeIndex(token.range[0]);
// todo: in some cases, the resulting node can actually be the whole program (!)
if (node !== null) {
usages.push(node as TSESTree.Identifier);
}
}
}
return usages;
}
export function isPartOfTypeExpression(node: TSESTree.Identifier): boolean {
return node.parent?.type?.valueOf().startsWith('TSType');
}
export function isPartOfClassDeclaration(node: TSESTree.Identifier): boolean {
return node.parent?.type === TSESTree.AST_NODE_TYPES.ClassDeclaration;
}
function fromSrc(path: string): string {
const m = path.match(/^.*(src\/.+)(\.(ts|json|js)?)$/);
if (m) {
return m[1];
} else {
throw new Error(`Can't infer project-absolute TS/resource path from: ${path}`);
}
}
export function relativePath(thisFile: string, importFile: string): string {
const fromParts = fromSrc(thisFile).split('/');
const toParts = fromSrc(importFile).split('/');
let lastCommon = 0;
for (let i = 0; i < fromParts.length - 1; i++) {
if (fromParts[i] === toParts[i]) {
lastCommon++;
} else {
break;
}
}
const path = toParts.slice(lastCommon, toParts.length).join('/');
const backtrack = fromParts.length - lastCommon - 1;
let prefix: string;
if (backtrack > 0) {
prefix = '../'.repeat(backtrack);
} else {
prefix = './';
}
return prefix + path;
}
export function findImportSpecifier(context: AnyRuleContext, identifier: string): TSESTree.ImportSpecifier | undefined {
const source = getSourceCode(context);
const usages: TSESTree.Identifier[] = [];
for (const token of source.ast.tokens) {
if (token.type === TSESTree.AST_TOKEN_TYPES.Identifier && token.value === identifier) {
const node = source.getNodeByRangeIndex(token.range[0]);
// todo: in some cases, the resulting node can actually be the whole program (!)
if (node && node.parent && node.parent.type === TSESTree.AST_NODE_TYPES.ImportSpecifier) {
return node.parent;
}
}
}
return undefined;
}

View File

@@ -1,9 +0,0 @@
# ESLint testing fixtures
The files in this directory are used for the ESLint testing environment
- Some rules rely on registries that must be built up _before_ the rule is run
- In order to test these registries, the fixture sources contain a few dummy components
- The TypeScript ESLint test runner requires at least one dummy file to exist to run any tests
- By default, [`test.ts`](./src/test.ts) is used. Note that this file is empty; it's only there for the TypeScript configuration, the actual content is injected from the `code` property in the tests.
- To test rules that make assertions based on the path of the file, you'll need to include the `filename` property in the test configuration. Note that it must point to an existing file too!
- The `filename` must be provided as `fixture('src/something.ts')`

View File

@@ -1,13 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
export const FIXTURE = 'lint/test/fixture/';
export function fixture(path: string): string {
return FIXTURE + path;
}

View File

@@ -1,14 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { ThemedTestThemeableComponent } from './themed-test-themeable.component';
export const ROUTES = [
{
component: ThemedTestThemeableComponent,
},
];

View File

@@ -1,16 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { Component } from '@angular/core';
@Component({
selector: 'ds-base-test-themeable',
template: '',
standalone: true,
})
export class TestThemeableComponent {
}

View File

@@ -1,8 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/

View File

@@ -1,8 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/

View File

@@ -1,15 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { Component } from '@angular/core';
@Component({
selector: 'ds-test',
template: '',
})
export class TestComponent {
}

View File

@@ -1,24 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
// @ts-ignore
import { NgModule } from '@angular/core';
import { TestComponent } from './test.component';
import { TestThemeableComponent } from './test-themeable.component';
import { ThemedTestThemeableComponent } from './themed-test-themeable.component';
@NgModule({
declarations: [
TestComponent,
TestThemeableComponent,
ThemedTestThemeableComponent,
],
})
export class TestModule {
}

View File

@@ -1,31 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { Component } from '@angular/core';
import { ThemedComponent } from '../../../../../../src/app/shared/theme-support/themed.component';
import { TestThemeableComponent } from './test-themeable.component';
@Component({
selector: 'ds-test-themeable',
template: '',
standalone: true,
imports: [TestThemeableComponent],
})
export class ThemedTestThemeableComponent extends ThemedComponent<TestThemeableComponent> {
protected getComponentName(): string {
return '';
}
protected importThemedComponent(themeName: string): Promise<any> {
return Promise.resolve(undefined);
}
protected importUnthemedComponent(): Promise<any> {
return Promise.resolve(undefined);
}
}

View File

@@ -1,16 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { Component } from '@angular/core';
@Component({
selector: 'ds-themed-test-themeable',
template: '',
})
export class OtherThemeableComponent {
}

View File

@@ -1,18 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { Component } from '@angular/core';
import { TestThemeableComponent as BaseComponent } from '../../../../app/test/test-themeable.component';
@Component({
selector: 'ds-themed-test-themeable',
template: '',
})
export class TestThemeableComponent extends BaseComponent {
}

View File

@@ -1,22 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
// @ts-ignore
import { NgModule } from '@angular/core';
import { OtherThemeableComponent } from './app/test/other-themeable.component';
import { TestThemeableComponent } from './app/test/test-themeable.component';
@NgModule({
declarations: [
TestThemeableComponent,
OtherThemeableComponent,
],
})
export class TestModule {
}

View File

@@ -1,7 +0,0 @@
{
"extends": "../../tsconfig.json",
"include": [
"src/**/*.ts"
],
"exclude": []
}

View File

@@ -1,13 +0,0 @@
const SpecReporter = require('jasmine-spec-reporter').SpecReporter;
const StacktraceOption = require('jasmine-spec-reporter').StacktraceOption;
jasmine.getEnv().clearReporters(); // Clear default console reporter for those instead
jasmine.getEnv().addReporter(new SpecReporter({
spec: {
displayErrorMessages: false,
},
summary: {
displayFailed: true,
displayStacktrace: StacktraceOption.PRETTY,
},
}));

View File

@@ -1,26 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { default as htmlPlugin } from '../src/rules/html';
import { default as tsPlugin } from '../src/rules/ts';
import {
htmlRuleTester,
tsRuleTester,
} from './testing';
describe('TypeScript rules', () => {
for (const { info, rule, tests } of tsPlugin.index) {
tsRuleTester.run(info.name, rule, tests as any);
}
});
describe('HTML rules', () => {
for (const { info, rule, tests } of htmlPlugin.index) {
htmlRuleTester.run(info.name, rule, tests);
}
});

View File

@@ -1,76 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { default as html } from '../src/rules/html';
import { default as ts } from '../src/rules/ts';
describe('plugin structure', () => {
for (const pluginExports of [ts, html]) {
const pluginName = pluginExports.name ?? 'UNNAMED PLUGIN';
describe(pluginName, () => {
it('should have a name', () => {
expect(pluginExports.name).toBeTruthy();
});
it('should have rules', () => {
expect(pluginExports.index).toBeTruthy();
expect(pluginExports.rules).toBeTruthy();
expect(pluginExports.index.length).toBeGreaterThan(0);
});
for (const ruleExports of pluginExports.index) {
const ruleName = ruleExports.info.name ?? 'UNNAMED RULE';
describe(ruleName, () => {
it('should have a name', () => {
expect(ruleExports.info.name).toBeTruthy();
});
it('should be included under the right name in the plugin', () => {
expect(pluginExports.rules[ruleExports.info.name]).toBe(ruleExports.rule);
});
it('should contain metadata', () => {
expect(ruleExports.info).toBeTruthy();
expect(ruleExports.info.name).toBeTruthy();
expect(ruleExports.info.meta).toBeTruthy();
expect(ruleExports.info.defaultOptions).toBeTruthy();
});
it('should contain messages', () => {
expect(ruleExports.Message).toBeTruthy();
expect(ruleExports.info.meta.messages).toBeTruthy();
});
describe('messages', () => {
for (const member of Object.keys(ruleExports.Message)) {
describe(member, () => {
const id = (ruleExports.Message as any)[member];
it('should have a valid ID', () => {
expect(id).toBeTruthy();
});
it('should have valid metadata', () => {
expect(ruleExports.info.meta.messages[id]).toBeTruthy();
});
});
}
});
it('should contain tests', () => {
expect(ruleExports.tests).toBeTruthy();
expect(ruleExports.tests.valid.length).toBeGreaterThan(0);
expect(ruleExports.tests.invalid.length).toBeGreaterThan(0);
});
});
}
});
}
});

View File

@@ -1,53 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { RuleTester as TypeScriptRuleTester } from '@typescript-eslint/rule-tester';
import { RuleTester } from '@typescript-eslint/utils/ts-eslint';
import { themeableComponents } from '../src/util/theme-support';
import {
FIXTURE,
fixture,
} from './fixture';
// Register themed components from test fixture
themeableComponents.initialize(FIXTURE);
TypeScriptRuleTester.itOnly = fit;
TypeScriptRuleTester.itSkip = xit;
export const tsRuleTester = new TypeScriptRuleTester({
parser: '@typescript-eslint/parser',
defaultFilenames: {
ts: fixture('src/test.ts'),
tsx: 'n/a',
},
parserOptions: {
project: fixture('tsconfig.json'),
},
});
class HtmlRuleTester extends RuleTester {
run(name: string, rule: any, tests: { valid: any[], invalid: any[] }) {
super.run(name, rule, {
valid: tests.valid.map((test) => ({
filename: fixture('test.html'),
...test,
})),
invalid: tests.invalid.map((test) => ({
filename: fixture('test.html'),
...test,
})),
});
}
}
export const htmlRuleTester = new HtmlRuleTester({
parser: require.resolve('@angular-eslint/template-parser'),
});

View File

@@ -1,24 +0,0 @@
/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE and NOTICE files at the root of the source
* tree and available online at
*
* http://www.dspace.org/license/
*/
import { themeableComponents } from '../src/util/theme-support';
describe('theme-support', () => {
describe('themeable component registry', () => {
it('should contain all themeable components from the fixture', () => {
expect(themeableComponents.entries.size).toBe(1);
expect(themeableComponents.byBasePath.size).toBe(1);
expect(themeableComponents.byWrapperPath.size).toBe(1);
expect(themeableComponents.byBaseClass.size).toBe(1);
expect(themeableComponents.byBaseClass.get('TestThemeableComponent')).toBeTruthy();
expect(themeableComponents.byBasePath.get('src/app/test/test-themeable.component.ts')).toBeTruthy();
expect(themeableComponents.byWrapperPath.get('src/app/test/themed-test-themeable.component.ts')).toBeTruthy();
});
});
});

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