1
0

Compare commits

..

55 Commits

Author SHA1 Message Date
dependabot[bot]
866b998929 Bump typescript from 5.4.5 to 5.5.4
Bumps [typescript](https://github.com/microsoft/TypeScript) from 5.4.5 to 5.5.4.
- [Release notes](https://github.com/microsoft/TypeScript/releases)
- [Changelog](https://github.com/microsoft/TypeScript/blob/main/azure-pipelines.release-publish.yml)
- [Commits](https://github.com/microsoft/TypeScript/compare/v5.4.5...v5.5.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-30 06:17:07 +00:00
Alan Orth
9b72b1c36e Merge pull request #4489 from DSpace/dependabot/npm_and_yarn/postcss-bff535204e 2025-06-28 12:00:14 +03:00
Tim Donohue
f807f5ae77 Merge pull request #4291 from oscar-escire/Issue/3989
Improve community list e2e tests
2025-06-27 11:13:58 -05:00
dependabot[bot]
b201661ce1 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 05:46:45 +00:00
Alan Orth
417f835b56 Merge pull request #4465 from DSpace/dependabot/npm_and_yarn/sass-63defccb8e 2025-06-17 08:34:54 +03:00
Alan Orth
fdb747537e Merge pull request #4470 from DSpace/dependabot/npm_and_yarn/postcss-ff1e1e588d 2025-06-17 08:34:18 +03:00
Alan Orth
ed2095a275 Merge pull request #4468 from DSpace/dependabot/npm_and_yarn/axios-1.10.0 2025-06-17 07:04:34 +03:00
dependabot[bot]
54f8dddc8c 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:42:32 +00:00
dependabot[bot]
44e248d1df 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:41:45 +00:00
dependabot[bot]
03d7c5284e 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-06-16 05:40:58 +00:00
Alan Orth
aecfabbf93 Merge pull request #4389 from jlipka/fix/4346-delete-group-confirm-dialog
Confirmation dialog before deleting Group
2025-06-13 21:39:25 +03:00
Jukka Lipka
20510591e4 fix: add styles to confirmation modal
Words are forced to break if no more space available
2025-06-13 17:32:29 +02:00
Jukka Lipka
55d2f0ce38 fix: cleanup / unnecessary changes reverted 2025-06-13 17:22:16 +02:00
Jukka Lipka
137bbc35bd fix: added translations 2025-06-13 17:22:16 +02:00
Jukka Lipka
57bf254bec fix: confirm dialog for group deletion
Introduced a confirmation modal before deleting groups in both the Group Registry and Comcol Role components. This ensures users explicitly confirm deletion, reducing accidental data loss. Updated relevant tests and added new translations for modal text.
2025-06-13 17:22:15 +02:00
kshepherd
db81d5ec42 Merge pull request #4448 from ybnd/defer-geospatial-map-components_9.x
Lazy-load geospatial map code
2025-06-12 19:17:45 +02:00
Tim Donohue
7c27392cda Merge pull request #4434 from the-library-code/fix_repeated_field_errors
Resolve field instance models using index when filtering errors
2025-06-12 11:40:25 -05:00
Alan Orth
37bd0fd904 Merge pull request #4445 from DSpace/dependabot/npm_and_yarn/babel/runtime-7.27.6
Bump @babel/runtime from 7.27.4 to 7.27.6
2025-06-11 12:19:58 +03:00
dependabot[bot]
d9a9f0d837 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 06:28:09 +00:00
Alan Orth
00fc2a21f7 Merge pull request #4433 from DSpace/dependabot/npm_and_yarn/sass-d83863101d
Bump sass from 1.89.0 to 1.89.1 in the sass group
2025-06-05 08:52:43 +03:00
Kim Shepherd
d218e22944 Resolve field instance models using index when filtering errors 2025-06-04 19:11:41 +02:00
dependabot[bot]
e2159709f5 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:50:19 +00:00
Tim Donohue
469c715751 Merge pull request #4424 from alanorth/dependabot-zone.js
.github/dependabot.yml: adjust rules for zone.js
2025-06-04 08:45:50 -05:00
Alan Orth
bc3d8399dd Merge pull request #4076 from saschaszott/saschaszott-patch-12
fix typo in German translation of bitstream.edit.form.description.hint
2025-06-04 12:45:53 +03:00
Alan Orth
c838b4298c .github/dependabot.yml: adjust rules for zone.js
As @angular/core uses the "~" specifier to pin zone.js to a patch
version,dependabot should not try to update minor versions here.

See: https://github.com/angular/angular/blob/18.2.x/packages/core/package.json
2025-06-04 09:48:31 +03:00
Alan Orth
0ec98a576a Merge pull request #4406 from DSpace/dependabot/npm_and_yarn/postcss-3f4fa9ea8d
Bump postcss from 8.5.3 to 8.5.4 in the postcss group
2025-06-03 09:09:26 +03:00
Alan Orth
3d16975020 Merge pull request #4414 from DSpace/dependabot/npm_and_yarn/babel/runtime-7.27.4
Bump @babel/runtime from 7.27.3 to 7.27.4
2025-06-03 09:05:03 +03:00
Tim Donohue
aa9c8bab1d Merge pull request #4362 from GauravD2t/translation_hindi_gu_ma
add Gujarati(gu) and marathi(mr) json5 file
2025-06-02 12:13:32 -05:00
dependabot[bot]
df6f52f85c 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:48:21 +00:00
dependabot[bot]
22c7662506 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:37:52 +00:00
Tim Donohue
ce2b52ba43 Merge pull request #4377 from DSpace/dependabot/npm_and_yarn/testing-ff22ddd0c9
Bump ng-mocks from 14.13.4 to 14.13.5 in the testing group
2025-05-29 08:50:04 -05:00
gaurav patel
a2c53c6b8a Merge branch 'DSpace:main' into translation_hindi_gu_ma 2025-05-29 16:46:30 +05:30
Alan Orth
a9c50c19e3 Merge pull request #2774 from saschaszott/patch-15
German translation improvements in cookie consent dialog
2025-05-29 08:53:32 +03:00
Alan Orth
cea455e316 Merge pull request #4395 from DSpace/dependabot/npm_and_yarn/babel/runtime-7.27.3
Bump @babel/runtime from 7.27.1 to 7.27.3
2025-05-29 08:42:05 +03:00
Tim Donohue
7d1cf1d01c Merge pull request #4378 from DSpace/dependabot/npm_and_yarn/webpack-51a062295f
Bump webpack from 5.99.8 to 5.99.9 in the webpack group
2025-05-28 15:50:11 -05:00
dependabot[bot]
c9aef54eeb Bump webpack from 5.99.8 to 5.99.9 in the webpack group
Bumps the webpack group with 1 update: [webpack](https://github.com/webpack/webpack).


Updates `webpack` from 5.99.8 to 5.99.9
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.99.8...v5.99.9)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-28 18:34:08 +00:00
dependabot[bot]
51d1a558fa 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:29:32 +00:00
dependabot[bot]
9d48aab127 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:27:37 +00:00
Tim Donohue
e24fd0eea0 Merge pull request #4392 from tdonohue/dependabot_for_9x
Add dependabot configuration for dspace-9_x.
2025-05-28 13:00:19 -05:00
Tim Donohue
ee95cbfaef Add dependabot configuration for dspace-9_x. Set a specific time for each to run so that they run together as much as possible. 2025-05-28 11:44:34 -05:00
gaurav patel
5ac8dc13ac Rename Gu.json5 to gu.json5 2025-05-26 10:11:16 +05:30
gauravd2t
ce34bd271d change file name 2025-05-26 10:09:18 +05:30
gaurav patel
81152ef506 Merge branch 'DSpace:main' into translation_hindi_gu_ma 2025-05-26 10:06:24 +05:30
Tim Donohue
c15831191f Update homepage header/description for DSpace 10 2025-05-23 12:37:13 -05:00
Tim Donohue
0a2db167ff Update version tag for development of next major release 2025-05-23 11:21:17 -05:00
gaurav patel
b1a2008873 Merge branch 'DSpace:main' into translation_hindi_gu_ma 2025-05-22 13:20:14 +05:30
gauravd2t
dade46ca79 add Gujarati and marathi json5 file 2025-05-22 10:26:25 +05:30
Oscar Chacón
492023ce22 removed unnecessary class on name/span validation 2025-05-14 00:41:10 -06:00
Oscar Chacón
bcbbaabc76 Merge branch 'main' into Issue/3989
# Conflicts:
#	src/app/community-list-page/community-list/community-list.component.html
2025-05-02 16:59:10 -06:00
Oscar Chacón
a2dd3d185d improved community-list e2e tests 2025-05-02 16:57:40 -06:00
Sascha Szott
99d72b9348 Merge branch 'main' into patch-15 2025-03-14 15:59:53 +01:00
Sascha Szott
c72af8edb5 fix typo in German translation of bitstream.edit.form.description.hint 2025-03-12 19:09:16 +01:00
Sascha Szott
4ca1edfc63 added german translations 2024-01-26 14:25:39 +01:00
Sascha Szott
f12fae3865 added German translations 2024-01-26 14:04:05 +01:00
Sascha Szott
027a5ec5f0 minor translation improvement: use plural in German translation 2024-01-26 13:46:46 +01:00
86 changed files with 7710 additions and 23214 deletions

114
.github/dependabot.yml vendored
View File

@@ -13,6 +13,7 @@ updates:
directory: "/"
schedule:
interval: "weekly"
time: "05:00"
# Allow up to 10 open PRs for dependencies
open-pull-requests-limit: 10
# Group together Angular package upgrades
@@ -141,18 +142,26 @@ updates:
update-types:
- "minor"
- "patch"
# Restrict zone.js updates to patch level to avoid dependency conflicts with @angular/core
zonejs:
applies-to: version-updates
patterns:
- "zone.js"
update-types:
- "patch"
ignore:
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
- dependency-name: "*"
update-types: ["version-update:semver-major"]
#####################
## dspace-8_x branch
## dspace-9_x branch
#####################
- package-ecosystem: "npm"
directory: "/"
target-branch: dspace-8_x
target-branch: dspace-9_x
schedule:
interval: "weekly"
time: "05:00"
# Allow up to 10 open PRs for dependencies
open-pull-requests-limit: 10
# Group together Angular package upgrades
@@ -219,6 +228,99 @@ updates:
update-types:
- "minor"
- "patch"
# Restrict zone.js updates to patch level to avoid dependency conflicts with @angular/core
zonejs:
applies-to: version-updates
patterns:
- "zone.js"
update-types:
- "patch"
ignore:
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
- dependency-name: "*"
update-types: ["version-update:semver-major"]
#####################
## dspace-8_x branch
#####################
- package-ecosystem: "npm"
directory: "/"
target-branch: dspace-8_x
schedule:
interval: "weekly"
time: "05:00"
# Allow up to 10 open PRs for dependencies
open-pull-requests-limit: 10
# Group together Angular package upgrades
groups:
# Group together all patch version updates for Angular in a single PR
angular:
applies-to: version-updates
patterns:
- "@angular*"
update-types:
- "minor"
- "patch"
# Group together all minor/patch version updates for NgRx in a single PR
ngrx:
applies-to: version-updates
patterns:
- "@ngrx*"
update-types:
- "minor"
- "patch"
# Group together all patch version updates for eslint in a single PR
eslint:
applies-to: version-updates
patterns:
- "@typescript-eslint*"
- "eslint*"
update-types:
- "minor"
- "patch"
# Group together any testing related version updates
testing:
applies-to: version-updates
patterns:
- "@cypress*"
- "axe-*"
- "cypress*"
- "jasmine*"
- "karma*"
- "ng-mocks"
update-types:
- "minor"
- "patch"
# Group together any postcss related version updates
postcss:
applies-to: version-updates
patterns:
- "postcss*"
update-types:
- "minor"
- "patch"
# Group together any sass related version updates
sass:
applies-to: version-updates
patterns:
- "sass*"
update-types:
- "minor"
- "patch"
# Group together any webpack related version updates
webpack:
applies-to: version-updates
patterns:
- "webpack*"
update-types:
- "minor"
- "patch"
# Restrict zone.js updates to patch level to avoid dependency conflicts with @angular/core
zonejs:
applies-to: version-updates
patterns:
- "zone.js"
update-types:
- "patch"
ignore:
# Ignore all major version updates for all dependencies. We'll only automate minor/patch updates.
- dependency-name: "*"
@@ -231,6 +333,7 @@ updates:
target-branch: dspace-7_x
schedule:
interval: "weekly"
time: "05:00"
# Allow up to 10 open PRs for dependencies
open-pull-requests-limit: 10
# Group together Angular package upgrades
@@ -289,6 +392,13 @@ updates:
update-types:
- "minor"
- "patch"
# Restrict zone.js updates to patch level to avoid dependency conflicts with @angular/core
zonejs:
applies-to: version-updates
patterns:
- "zone.js"
update-types:
- "patch"
ignore:
# 7.x Cannot update Webpack past v5.76.1 as later versions not supported by Angular 15
# See also https://github.com/DSpace/dspace-angular/pull/3283#issuecomment-2372488489

View File

@@ -307,9 +307,6 @@ languages:
- code: pt-BR
label: Português do Brasil
active: true
- code: ru
label: Русский
active: true
- code: sr-lat
label: Srpski (lat)
active: true

View File

@@ -1,13 +1,87 @@
import { testA11y } from 'cypress/support/utils';
describe('Community List Page', () => {
function validateHierarchyLevel(currentLevel = 1): void {
// Find all <cdk-tree-node> elements with the current aria-level
cy.get(`ds-community-list cdk-tree-node.expandable-node[aria-level="${currentLevel}"]`).should('exist').then(($nodes) => {
let sublevelExists = false;
cy.wrap($nodes).each(($node) => {
// Check if the current node has an expand button and click it
if ($node.find('[data-test="expand-button"]').length) {
sublevelExists = true;
cy.wrap($node).find('[data-test="expand-button"]').click();
}
}).then(() => {
// After expanding all buttons, validate if a sublevel exists
if (sublevelExists) {
const nextLevelSelector = `ds-community-list cdk-tree-node.expandable-node[aria-level="${currentLevel + 1}"]`;
cy.get(nextLevelSelector).then(($nextLevel) => {
if ($nextLevel.length) {
// Recursively validate the next level
validateHierarchyLevel(currentLevel + 1);
}
});
}
});
});
}
it('should pass accessibility tests', () => {
beforeEach(() => {
cy.visit('/community-list');
// <ds-community-list-page> tag must be loaded
cy.get('ds-community-list-page').should('be.visible');
// <ds-community-list-list> tag must be loaded
cy.get('ds-community-list').should('be.visible');
});
it('should expand community/collection hierarchy', () => {
// Execute Hierarchy levels validation recursively
validateHierarchyLevel(1);
});
it('should display community/collections name with item count', () => {
// Open every <cdk-tree-node>
cy.get('[data-test="expand-button"]').click({ multiple: true });
cy.wait(300);
// A first <cdk-tree-node> must be found and validate that <a> tag (community name) and <span> tag (item count) exists in it
cy.get('ds-community-list').find('cdk-tree-node.expandable-node').then(($nodes) => {
cy.wrap($nodes).each(($node) => {
cy.wrap($node).find('a').should('exist');
cy.wrap($node).find('span').should('exist');
});
});
});
it('should enable "show more" button when 20 top-communities or more are presents', () => {
cy.get('ds-community-list').find('cdk-tree-node.expandable-node[aria-level="1"]').then(($nodes) => {
//Validate that there are 20 or more top-community elements
if ($nodes.length >= 20) {
//Validate that "show more" button is visible and then click on it
cy.get('[data-test="show-more-button"]').should('be.visible');
} else {
cy.get('[data-test="show-more-button"]').should('not.exist');
}
});
});
it('should show 21 or more top-communities if click "show more" button', () => {
cy.get('ds-community-list').find('cdk-tree-node.expandable-node[aria-level="1"]').then(($nodes) => {
//Validate that there are 20 or more top-community elements
if ($nodes.length >= 20) {
//Validate that "show more" button is visible and then click on it
cy.get('[data-test="show-more-button"]').click();
cy.wait(300);
cy.get('ds-community-list').find('cdk-tree-node.expandable-node[aria-level="1"]').should('have.length.at.least', 21);
} else {
cy.get('[data-test="show-more-button"]').should('not.exist');
}
});
});
it('should pass accessibility tests', () => {
// Open every expand button on page, so that we can scan sub-elements as well
cy.get('[data-test="expand-button"]').click({ multiple: true });

View File

@@ -84,7 +84,7 @@ describe('My DSpace page', () => {
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-bs-dismiss="alert"]').click({ multiple: true });
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');

View File

@@ -95,7 +95,7 @@ describe('New Submission page', () => {
// 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-bs-dismiss="alert"]').click({ multiple: true });
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');

431
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "dspace-angular",
"version": "9.1.0",
"version": "10.0.0-next",
"scripts": {
"ng": "ng",
"config:watch": "nodemon",
@@ -102,7 +102,7 @@
"@angular/platform-browser-dynamic": "^18.2.12",
"@angular/platform-server": "^18.2.12",
"@angular/router": "^18.2.12",
"@angular/ssr": "^18.2.20",
"@angular/ssr": "^18.2.19",
"@babel/runtime": "7.27.6",
"@kolkov/ngx-gallery": "^2.0.1",
"@ng-bootstrap/ng-bootstrap": "^12.0.0",
@@ -168,7 +168,7 @@
},
"devDependencies": {
"@angular-builders/custom-webpack": "~18.0.0",
"@angular-devkit/build-angular": "^18.2.20",
"@angular-devkit/build-angular": "^18.2.19",
"@angular-eslint/builder": "^18.4.1",
"@angular-eslint/bundled-angular-compiler": "^18.4.1",
"@angular-eslint/eslint-plugin": "^18.4.1",
@@ -176,7 +176,7 @@
"@angular-eslint/schematics": "^18.4.1",
"@angular-eslint/template-parser": "^18.4.1",
"@angular-eslint/utils": "^18.4.1",
"@angular/cli": "^18.2.20",
"@angular/cli": "^18.2.19",
"@angular/compiler-cli": "^18.2.12",
"@angular/language-service": "^18.2.12",
"@cypress/schematic": "^1.5.0",
@@ -236,7 +236,7 @@
"sass-loader": "^12.6.0",
"sass-resources-loader": "^2.2.5",
"ts-node": "^8.10.2",
"typescript": "~5.4.5",
"typescript": "~5.5.4",
"webpack": "5.99.9",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.15.1"

View File

@@ -83,7 +83,7 @@
<form [formGroup]="searchForm" (ngSubmit)="search(searchForm.value)" class="d-flex justify-content-between">
<div class="flex-grow-1 me-3">
<div class="mb-3 input-group me-3">
<div class="form-group input-group me-3">
<input type="text" name="query" id="query" formControlName="query"
class="form-control" aria-label="Search input">
<span class="input-group-append">

View File

@@ -6,7 +6,7 @@
<!-- In the toggle section -->
@if (!isNewService) {
<div class="toggle-switch-container">
<label class="status-label fw-bold" for="enabled">{{ 'ldn-service-status' | translate }}</label>
<label class="status-label font-weight-bold" for="enabled">{{ 'ldn-service-status' | translate }}</label>
<div>
<input formControlName="enabled" hidden id="enabled" name="enabled" type="checkbox">
<div (click)="toggleEnabled()" [class.checked]="formModel.get('enabled').value" class="toggle-switch">
@@ -17,7 +17,7 @@
}
<!-- In the Name section -->
<div class="mb-5">
<label for="name" class="fw-bold">{{ 'ldn-new-service.form.label.name' | translate }}</label>
<label for="name" class="font-weight-bold">{{ 'ldn-new-service.form.label.name' | translate }}</label>
<input [class.invalid-field]="formModel.get('name').invalid && formModel.get('name').touched"
[placeholder]="'ldn-new-service.form.placeholder.name' | translate" class="form-control"
formControlName="name"
@@ -33,7 +33,7 @@
<!-- In the description section -->
<div class="mb-5 mt-5 d-flex flex-column">
<label for="description" class="fw-bold">{{ 'ldn-new-service.form.label.description' | translate }}</label>
<label for="description" class="font-weight-bold">{{ 'ldn-new-service.form.label.description' | translate }}</label>
<textarea [placeholder]="'ldn-new-service.form.placeholder.description' | translate"
class="form-control" formControlName="description" id="description" name="description"></textarea>
</div>
@@ -42,7 +42,7 @@
<!-- In the url section -->
<div class="d-flex align-items-center">
<div class="d-flex flex-column w-50 me-2">
<label for="url" class="fw-bold">{{ 'ldn-new-service.form.label.url' | translate }}</label>
<label for="url" class="font-weight-bold">{{ 'ldn-new-service.form.label.url' | translate }}</label>
<input [class.invalid-field]="formModel.get('url').invalid && formModel.get('url').touched"
[placeholder]="'ldn-new-service.form.placeholder.url' | translate" class="form-control"
formControlName="url"
@@ -57,7 +57,7 @@
</div>
<div class="d-flex flex-column w-50">
<label for="score" class="fw-bold">{{ 'ldn-new-service.form.label.score' | translate }}</label>
<label for="score" class="font-weight-bold">{{ 'ldn-new-service.form.label.score' | translate }}</label>
<input [class.invalid-field]="formModel.get('score').invalid && formModel.get('score').touched"
[placeholder]="'ldn-new-service.form.placeholder.score' | translate" formControlName="score"
id="score"
@@ -78,7 +78,7 @@
<!-- In the IP range section -->
<div class="mb-5 mt-5">
<label for="lowerIp" class="fw-bold">{{ 'ldn-new-service.form.label.ip-range' | translate }}</label>
<label for="lowerIp" class="font-weight-bold">{{ 'ldn-new-service.form.label.ip-range' | translate }}</label>
<div class="d-flex">
<input [class.invalid-field]="formModel.get('lowerIp').invalid && formModel.get('lowerIp').touched"
[placeholder]="'ldn-new-service.form.placeholder.lowerIp' | translate" class="form-control me-2"
@@ -105,7 +105,7 @@
<!-- In the ldnUrl section -->
<div class="mb-5 mt-5">
<label for="ldnUrl" class="fw-bold">{{ 'ldn-new-service.form.label.ldnUrl' | translate }}</label>
<label for="ldnUrl" class="font-weight-bold">{{ 'ldn-new-service.form.label.ldnUrl' | translate }}</label>
<input [class.invalid-field]="formModel.get('ldnUrl').invalid && formModel.get('ldnUrl').touched"
[placeholder]="'ldn-new-service.form.placeholder.ldnUrl' | translate" class="form-control"
formControlName="ldnUrl"
@@ -130,7 +130,7 @@
<!-- In the usesActorEmailId section -->
<div class="mb-5 mt-5">
<label class="status-label fw-bold" for="usesActorEmailId">{{ 'ldn-service-usesActorEmailId' | translate }}</label>
<label class="status-label font-weight-bold" for="usesActorEmailId">{{ 'ldn-service-usesActorEmailId' | translate }}</label>
<div>
<input formControlName="usesActorEmailId" hidden id="usesActorEmailId"
name="usesActorEmailId" type="checkbox">
@@ -149,14 +149,14 @@
@if (areControlsInitialized) {
<div class="row mb-1 mt-5">
<div class="col">
<label class="fw-bold">{{ 'ldn-new-service.form.label.inboundPattern' | translate }} </label>
<label class="font-weight-bold">{{ 'ldn-new-service.form.label.inboundPattern' | translate }} </label>
</div>
@if (formModel.get('notifyServiceInboundPatterns')['controls'][0]?.value?.pattern) {
<div class="col">
<label class="fw-bold">{{ 'ldn-new-service.form.label.ItemFilter' | translate }}</label>
<label class="font-weight-bold">{{ 'ldn-new-service.form.label.ItemFilter' | translate }}</label>
</div>
<div class="col-sm-1">
<label class="fw-bold">{{ 'ldn-new-service.form.label.automatic' | translate }}</label>
<label class="font-weight-bold">{{ 'ldn-new-service.form.label.automatic' | translate }}</label>
</div>
}
<div class="col-sm-2">
@@ -295,8 +295,8 @@
<span (click)="addInboundPattern()"
class="add-pattern-link mb-2">{{ 'ldn-new-service.form.label.addPattern' | translate }}</span>
<hr>
<div class="mb-3 row">
<div class="col text-end space-children-mr">
<div class="form-group row">
<div class="col text-right space-children-mr">
<ng-content select="[before]"></ng-content>
<button (click)="resetFormAndLeave()" class="btn btn-outline-secondary" type="button">
<span>&nbsp;{{ 'submission.general.back.submit' | translate }}</span>
@@ -317,7 +317,9 @@
@if (isNewService) {
<h4>{{'service.overview.create.modal' | translate }}</h4>
}
<button (click)="closeModal()" aria-label="Close" class="btn-close" type="button">
<button (click)="closeModal()" aria-label="Close"
class="close" type="button">
<span aria-hidden="true">×</span>
</button>
</div>

View File

@@ -77,7 +77,8 @@
</div>
<button (click)="closeModal()" aria-label="Close"
[attr.aria-label]="'ldn-service-overview-close-modal' | translate"
class="btn-close" type="button">
class="close" type="button">
<span aria-hidden="true">×</span>
</button>
</div>
@@ -85,7 +86,7 @@
<div>
{{ 'service.overview.delete.body' | translate }}
</div>
<div class="mt-4 text-end">
<div class="mt-4 text-right">
<button (click)="closeModal()"
[attr.aria-label]="'ldn-service-overview-close-modal' | translate"
class="btn btn-outline-secondary me-2">{{ 'service.detail.delete.cancel' | translate }}</button>

View File

@@ -1,14 +1,15 @@
<div class="modal-header">
<h4 class="modal-title">{{'notify-message-modal.title' | translate}}</h4>
<button type="button" class="btn-close" aria-label="Close" (click)="activeModal.dismiss('Cross click')">
<button type="button" class="close" aria-label="Close" (click)="activeModal.dismiss('Cross click')">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body p-4">
@for (key of notifyMessageKeys; track key) {
<div>
<div class="row mb-4">
<div class="fw-bold col">{{ key + '.notify-detail-modal' | translate}}</div>
<div class="col text-end">{{'notify-detail-modal.' + notifyMessage[key] | translate: {default: notifyMessage[key] ?? "n/a" } }}</div>
<div class="font-weight-bold col">{{ key + '.notify-detail-modal' | translate}}</div>
<div class="col text-right">{{'notify-detail-modal.' + notifyMessage[key] | translate: {default: notifyMessage[key] ?? "n/a" } }}</div>
</div>
</div>
}

View File

@@ -1,6 +1,6 @@
<div class="container my-4">
<div class="row">
<div class="col-12 col-md-3 text-start h4">{{((isInbound$ | async) ? 'admin.notify.dashboard.inbound' : 'admin.notify.dashboard.outbound') | translate}}</div>
<div class="col-12 col-md-3 text-left h4">{{((isInbound$ | async) ? 'admin.notify.dashboard.inbound' : 'admin.notify.dashboard.outbound') | translate}}</div>
<div class="col-md-9">
<div class="h4">
@if ((selectedSearchConfig$ | async) !== defaultConfiguration) {

View File

@@ -15,7 +15,7 @@
<ds-loading></ds-loading>
}
@if ((loadingCollections$ | async) !== true) {
<select id="collSel" name="collSel" class="form-select" multiple="multiple" size="10" formControlName="collections">
<select id="collSel" name="collSel" class="form-control" multiple="multiple" size="10" formControlName="collections">
@for (item of collections; track item) {
<option [value]="item.id" [disabled]="item.disabled">{{item.name$ | async}}</option>
}
@@ -32,11 +32,11 @@
{{'admin.reports.items.section.metadataFieldQueries' | translate}}
</ng-template>
<ng-template ngbPanelContent>
<fieldset id="predefqueries" class="mb-3">
<fieldset id="predefqueries" class="form-group">
<label>
{{'admin.reports.items.predefinedQueries' | translate}}
</label>
<select id="predefselect" formControlName="presetQuery" class="form-select" (change)="setPresetQuery()">
<select id="predefselect" formControlName="presetQuery" class="form-control" (change)="setPresetQuery()">
@for (item of presetQueries; track item.id) {
<option [value]="item.id" [selected]="item.isDefault">{{item.label | translate}}</option>
}
@@ -46,17 +46,17 @@
<div id="queries">
@for (pred of queryPredicatesArray().controls; track pred; let i = $index) {
<div class="metadata">
<div [formGroup]="pred" class="mb-3">
<div class="row">
<div [formGroup]="pred" class="form-group">
<div class="form-row">
<div class="col-4">
<select class="query-tool" formControlName="field" class="form-select">
<select class="query-tool" formControlName="field" class="form-control">
@for (item of metadataFieldsWithAny; track item) {
<option [value]="item.id">{{item.name$ | async}}</option>
}
</select>
</div>
<div class="col-auto">
<select class="query-tool" formControlName="operator" class="form-select">
<select class="query-tool" formControlName="operator" class="form-control">
@for (item of predicates; track item) {
<option [value]="item.id">{{item.name$ | async | translate}}</option>
}
@@ -86,17 +86,17 @@
{{'admin.reports.items.section.limitPaginateQueries' | translate}}
</ng-template>
<ng-template ngbPanelContent>
<div class="row align-items-center mb-3">
<div class="row align-items-center">
<label for="limit" class="col-sm-2 col-form-label">{{'admin.reports.items.limit' | translate}}:</label>
<div class="col-6">
<select id="limit" name="limit" formControlName="pageLimit" class="form-select col-6">
<select id="limit" name="limit" formControlName="pageLimit" class="form-control col-6">
@for (item of pageLimits; track item) {
<option value="{{item.id}}" [selected]="item.isDefault">{{item.name$ | async}}</option>
}
</select>
</div>
</div>
<div class="row align-items-center mb-3">
<div class="row align-items-center">
<label for="offset" class="col-sm-2 col-form-label">{{'admin.reports.items.offset' | translate}}:</label>
<div class="col-6">
<input id="offset" name="offset" value="0" class="form-control col-6">
@@ -104,7 +104,7 @@
</div>
<div class="row">
<span class="col-3"></span>
<button class="btn btn-primary col-6" (click)="submit()">{{'admin.reports.items.run' | translate}}</button>
<button class="btn btn-primary mt-1 col-6" (click)="submit()">{{'admin.reports.items.run' | translate}}</button>
</div>
</ng-template>
</ngb-panel>
@@ -130,7 +130,7 @@
</ng-template>
<ng-template ngbPanelContent>
<div id="show-fields">
<select class="query-tool" name="show_fields" multiple="multiple" size="8" class="form-select" formControlName="additionalFields">
<select class="query-tool" name="show_fields" multiple="multiple" size="8" class="form-control" formControlName="additionalFields">
@for (item of metadataFields; track item) {
<option [value]="item.id">{{item.name$ | async}}</option>
}

View File

@@ -1,12 +1,12 @@
.nav-breadcrumb {
background-color: var(--ds-breadcrumb-bg) !important;
background-color: var(--ds-breadcrumb-bg);
}
.breadcrumb {
border-radius: 0;
padding-bottom: calc(var(--ds-content-spacing) / 2);
padding-top: calc(var(--ds-content-spacing) / 2);
background-color: var(--ds-breadcrumb-bg) !important;
background-color: var(--ds-breadcrumb-bg);
padding-left: calc(var(--bs-spacer) *.75);
padding-right: calc(var(--bs-spacer) *.75);
}

View File

@@ -1,6 +1,7 @@
import {
AsyncPipe,
isPlatformBrowser,
NgIf,
} from '@angular/common';
import {
ChangeDetectionStrategy,
@@ -44,6 +45,7 @@ import { PaginatedSearchOptions } from '../../shared/search/models/paginated-sea
imports: [
AsyncPipe,
GeospatialMapComponent,
NgIf,
TranslateModule,
],
standalone: true,

View File

@@ -12,7 +12,7 @@
<div class="align-middle my-auto">
@if ((dataSource.loading$ | async) !== true) {
<button (click)="getNextPage(node)"
class="btn btn-outline-primary btn-sm" role="button" tabindex="0">
class="btn btn-outline-primary btn-sm" role="button" tabindex="0" data-test="show-more-button">
<i class="fas fa-angle-down"></i> {{ 'communityList.showMore' | translate }}
</button>
}

View File

@@ -19,7 +19,7 @@
[innerHTML]="mdRepresentation.getValue()"
[ngbTooltip]="mdRepresentation.allMetadata(['person.jobTitle']).length > 0 ? descTemplate : null"></a>
@if (mdRepresentation.firstMetadata('person.identifier.orcid')) {
<ds-orcid-badge-and-tooltip class="ms-1"
<ds-orcid-badge-and-tooltip class="ml-1"
[orcid]="mdRepresentation.firstMetadata('person.identifier.orcid')"
[authenticatedTimestamp]="mdRepresentation.firstMetadata('dspace.orcid.authenticated')">
</ds-orcid-badge-and-tooltip>

View File

@@ -3,8 +3,8 @@
</h4>
<form [formGroup]="emailForm" (ngSubmit)="submitForm()">
<div class="mb-3">
<div class="row">
<div class="form-group">
<div class="form-row">
<div class="col-12 my-2">
<input
type="email"
@@ -26,7 +26,7 @@
}
</div>
</div>
<div class="row">
<div class="form-row">
<div class="col-12">
<button type="submit" class="btn btn-lg btn-primary w-100">
{{ "external-login.confirm.button.label" | translate }}

View File

@@ -3,8 +3,8 @@
</h4>
<form [formGroup]="emailForm" (ngSubmit)="submitForm()">
<div class="mb-3">
<div class="row">
<div class="form-group">
<div class="form-row">
<div class="col-12 my-2">
<input
type="email"
@@ -26,7 +26,7 @@
}
</div>
</div>
<div class="row">
<div class="form-row">
<div class="col-12">
<button type="submit" class="btn btn-lg btn-primary w-100">
{{ "external-login.provide-email.button.label" | translate }}

View File

@@ -1,6 +1,6 @@
<form class="form-login"
[formGroup]="form" novalidate>
<label class="fw-bold mb-0 text-uppercase">{{ registrationData.registrationType }}</label>
<label class="font-weight-bold mb-0 text-uppercase">{{ registrationData.registrationType }}</label>
<input [attr.aria-label]="'external-login-page.orcid-confirmation.netid.label' | translate"
autocomplete="off"
autofocus
@@ -9,14 +9,14 @@
[placeholder]="'external-login-page.orcid-confirmation.netid.placeholder' | translate"
type="text"
[attr.data-test]="'netId' | dsBrowserOnly">
<label class="fw-bold mb-0">{{"external-login-page.orcid-confirmation.lastname" | translate}}</label>
<label class="font-weight-bold mb-0">{{"external-login-page.orcid-confirmation.lastname" | translate}}</label>
<input [attr.aria-label]="'external-login-page.orcid-confirmation.lastname.label' | translate"
autocomplete="off"
class="form-control form-control-lg position-relative mb-2"
formControlName="lastname"
type="text"
[attr.data-test]="'lastname' | dsBrowserOnly">
<label class="fw-bold mb-0">{{"external-login-page.orcid-confirmation.firstname" | translate}}</label>
<label class="font-weight-bold mb-0">{{"external-login-page.orcid-confirmation.firstname" | translate}}</label>
<input [attr.aria-label]="'external-login-page.orcid-confirmation.firstname.label' | translate"
autocomplete="off"
class="form-control form-control-lg position-relative mb-2"
@@ -24,7 +24,7 @@
type="text"
[attr.data-test]="'firstname' | dsBrowserOnly">
@if (registrationData?.email) {
<label class="fw-bold mb-0">{{"external-login-page.orcid-confirmation.email" | translate}}</label>
<label class="font-weight-bold mb-0">{{"external-login-page.orcid-confirmation.email" | translate}}</label>
<input [attr.aria-label]="'external-login-page.orcid-confirmation.email.label' | translate"
autocomplete="off"
class="form-control form-control-lg position-relative"

View File

@@ -6,15 +6,15 @@
<thead class="thead-light">
<tr>
<th scope="col">
<span class="h5 fw-bold">{{ 'external-login-validation.review-account-info.table.header.information' | translate }}</span>
<span class="h5 font-weight-bold">{{ 'external-login-validation.review-account-info.table.header.information' | translate }}</span>
</th>
<th scope="col">
<span class="h5 fw-bold">{{'external-login-validation.review-account-info.table.header.received-value' | translate }}</span>
<span class="h5 font-weight-bold">{{'external-login-validation.review-account-info.table.header.received-value' | translate }}</span>
</th>
<th scope="col">
<span class="h5 fw-bold">{{'external-login-validation.review-account-info.table.header.current-value' | translate }}</span>
<span class="h5 font-weight-bold">{{'external-login-validation.review-account-info.table.header.current-value' | translate }}</span>
</th>
<th scope="col"><span class="h5 fw-bold">{{'external-login-validation.review-account-info.table.header.action' | translate }}</span></th>
<th scope="col"><span class="h5 font-weight-bold">{{'external-login-validation.review-account-info.table.header.action' | translate }}</span></th>
</tr>
</thead>
<tbody>

View File

@@ -1,4 +1,4 @@
<div class="home-news-content py-4 px-2 py-sm-5 px-sm-0 mt-ncs mb-4">
<div class="jumbotron py-4 px-2 py-sm-5 px-sm-0 mt-ncs mb-4">
<div class="container">
<div class="d-flex flex-wrap">
<div>

View File

@@ -6,7 +6,7 @@
word-break: break-word;
}
.home-news-content {
.jumbotron {
background-color: var(--ds-home-news-background-color);
}

View File

@@ -2,7 +2,7 @@
<h2>{{ 'info.accessibility-settings.title' | translate }}</h2>
<form>
<div class="mb-3 row">
<div class="form-group row">
<label [for]="'disableNotificationTimeOutInput'" class="col-sm-4 col-form-label">
{{ 'info.accessibility-settings.disableNotificationTimeOut.label' | translate }}
</label>
@@ -23,7 +23,7 @@
</div>
</div>
<div class="mb-3 row">
<div class="form-group row">
<label [for]="'notificationTimeOutInput'" class="col-sm-4 col-form-label">
{{ 'info.accessibility-settings.notificationTimeOut.label' | translate }}
</label>
@@ -50,7 +50,7 @@
</div>
</div>
<div class="mb-3 row">
<div class="form-group row">
<label [for]="'liveRegionTimeOutInput'" class="col-sm-4 col-form-label">
{{ 'info.accessibility-settings.liveRegionTimeOut.label' | translate }}
</label>
@@ -77,7 +77,7 @@
</div>
<div role="group">
<button type="submit" (click)="saveSettings()" class="btn btn-primary me-2">
<button type="submit" (click)="saveSettings()" class="btn btn-primary mr-2">
{{ 'info.accessibility-settings.submit' | translate }}
</button>
<button (click)="resetSettings()" class="btn btn-warning">

View File

@@ -1,3 +1,7 @@
import {
AsyncPipe,
NgIf,
} from '@angular/common';
import {
Component,
CUSTOM_ELEMENTS_SCHEMA,
@@ -7,14 +11,21 @@ import {
Output,
} from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { RouterLink } from '@angular/router';
import { TranslateModule } from '@ngx-translate/core';
import { VarDirective } from '../../../shared/utils/var.directive';
@Component({
selector: 'ds-altcha-captcha',
templateUrl: './altcha-captcha.component.html',
imports: [
AsyncPipe,
NgIf,
ReactiveFormsModule,
RouterLink,
TranslateModule,
VarDirective,
],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
standalone: true,

View File

@@ -58,13 +58,13 @@
<div class="row mb-4">
<div class="col-12">
<div>{{'bitstream-request-a-copy.allfiles.label' |translate}}</div>
<div class="ms-2 form-check">
<div class="ms-4 form-check">
<input [className]="'form-check-input'" type="radio"
id="allfiles-true" formControlName="allfiles" value="true">
<label class="form-check-label"
for="allfiles-true">{{'bitstream-request-a-copy.files-all-true.label' | translate}}</label>
</div>
<div class="ms-2 form-check">
<div class="ms-4">
<input [className]="'form-check-input'" type="radio"
id="allfiles-false" formControlName="allfiles" value="false" [attr.disabled]="bitstream === undefined ? true : null ">
<label class="form-check-label"

View File

@@ -1,6 +1,6 @@
import {
AsyncPipe,
NgClass,
CommonModule,
} from '@angular/common';
import {
ChangeDetectorRef,
@@ -72,8 +72,8 @@ import { ItemEditBitstreamBundleComponent } from './item-edit-bitstream-bundle/i
AlertComponent,
AsyncPipe,
BtnDisabledDirective,
CommonModule,
ItemEditBitstreamBundleComponent,
NgClass,
RouterLink,
ThemedLoadingComponent,
TranslateModule,

View File

@@ -14,7 +14,7 @@
<table class="table" [class.mt-n1]="!isFirstTable"
[attr.aria-label]="'item.edit.bitstreams.bundle.table.aria-label' | translate: { bundle: bundleName } ">
<thead [class.visually-hidden]="!isFirstTable">
<tr class="header-row fw-bold">
<tr class="header-row font-weight-bold">
<th id="name" scope="col" class="{{ columnSizes.columns[0].buildClasses() }}">
{{'item.edit.bitstreams.headers.name' | translate}}
</th>
@@ -31,10 +31,10 @@
</thead>
<tbody cdkDropList (cdkDropListDropped)="drop($event)">
<tr class="bundle-row">
<th id="{{ bundleName }}" class="row-element" colspan="3" scope="colgroup">
<th id="{{ bundleName }}" class="span" colspan="3" scope="colgroup">
{{'item.edit.bitstreams.bundle.name' | translate:{ name: bundleName } }}
</th>
<td class="text-center row-element">
<td class="text-center">
<div class="btn-group">
<button [routerLink]="[itemPageRoute, 'bitstreams', 'new']"
[queryParams]="{bundle: bundle.id}"
@@ -43,9 +43,9 @@
title="{{'item.edit.bitstreams.bundle.edit.buttons.upload' | translate}}">
<i class="fas fa-upload fa-fw"></i>
</button>
<div ngbDropdown #paginationControls="ngbDropdown" class="btn-group float-end p-0"
container="body" placement="bottom-right">
<button class="btn btn-outline-secondary btn-sm" id="paginationControls" ngbDropdownToggle
<div ngbDropdown #paginationControls="ngbDropdown" class="btn-group float-right btn-sm p-0"
placement="bottom-right">
<button class="btn btn-outline-secondary" id="paginationControls" ngbDropdownToggle
[title]="'pagination.options.description' | translate"
[attr.aria-label]="'pagination.options.description' | translate" aria-haspopup="true"
aria-expanded="false">
@@ -79,7 +79,7 @@
(cdkDragStarted)="dragStart()" (cdkDragEnded)="dragEnd()">
<th class="bitstream-name row-element {{ columnSizes.columns[0].buildClasses() }}"
scope="row" id="{{ entry.nameStripped }}" headers="{{ bundleName }} name">
<div class="drag-handle text-muted float-start p-1 me-2 d-inline" tabindex="0" cdkDragHandle
<div class="drag-handle text-muted float-left p-1 mr-2 d-inline" tabindex="0" cdkDragHandle
(keydown.enter)="select($event, entry)" (keydown.space)="select($event, entry)" (click)="select($event, entry)">
<i class="fas fa-grip-vertical fa-fw"
[title]="'item.edit.bitstreams.edit.buttons.drag' | translate"></i>

View File

@@ -1,5 +1,5 @@
<div class="col-12 col-md-3 h-auto float-start d-flex action-label">
<span class="justify-content-center align-self-center fw-bold">
<span class="justify-content-center align-self-center font-weight-bold">
{{'item.edit.tabs.status.buttons.' + operation.operationKey + '.label' | translate}}
</span>
</div>

View File

@@ -2,7 +2,7 @@
<div class="row">
@for (statusKey of statusDataKeys; track statusKey) {
<div class="w-100 pt-1">
<div class="col-12 col-md-3 float-start status-label fw-bold">
<div class="col-12 col-md-3 float-start status-label font-weight-bold">
{{'item.edit.tabs.status.labels.' + statusKey | translate}}:
</div>
<div class="col-12 col-md-9 float-start status-data" id="status-{{statusKey}}">
@@ -15,17 +15,17 @@
<div class="w-100 pt-1">
@if ((identifier.identifierType==='doi')) {
<div>
<div class="col-12 col-md-3 float-start status-label fw-bold">
<div class="col-12 col-md-3 float-start status-label font-weight-bold">
{{identifier.identifierType.toLocaleUpperCase()}}
</div>
<div class="col-12 col-md-9 float-start status-label fw-bold">{{identifier.value}}
<div class="col-12 col-md-9 float-start status-label font-weight-bold">{{identifier.value}}
({{"item.edit.identifiers.doi.status."+identifier.identifierStatus|translate}})</div>
</div>
}
</div>
}
<div class="col-12 col-md-3 float-start status-label fw-bold">
<div class="col-12 col-md-3 float-start status-label font-weight-bold">
{{'item.edit.tabs.status.labels.itemPage' | translate}}:
</div>
<div class="col-12 col-md-9 float-start status-data" id="status-itemPage">

View File

@@ -1,5 +1,5 @@
import {
AsyncPipe,
CommonModule,
isPlatformBrowser,
} from '@angular/common';
import {
@@ -54,7 +54,7 @@ import { OrcidSyncSettingsComponent } from './orcid-sync-settings/orcid-sync-set
styleUrls: ['./orcid-page.component.scss'],
imports: [
AlertComponent,
AsyncPipe,
CommonModule,
OrcidAuthComponent,
OrcidQueueComponent,
OrcidSyncSettingsComponent,

View File

@@ -1,9 +1,10 @@
import { NgIf } from '@angular/common';
import {
Component,
Input,
OnInit,
} from '@angular/core';
import { TranslatePipe } from '@ngx-translate/core';
import { TranslateModule } from '@ngx-translate/core';
import { Item } from '../../../../../core/shared/item.model';
import {
@@ -20,7 +21,8 @@ import { ItemPageFieldComponent } from '../item-page-field.component';
imports: [
GeospatialMapComponent,
MetadataFieldWrapperComponent,
TranslatePipe,
NgIf,
TranslateModule,
],
standalone: true,
})

View File

@@ -301,7 +301,7 @@
<div class="modal-body">
<p>{{'quality-assurance.event.accept.description' | translate}}</p>
<button class="btn btn-outline-success float-end" (click)="modal.close('do')">
<button class="btn btn-outline-success float-right" (click)="modal.close('do')">
<i class="fas fa-check"></i>
<span class="d-none d-sm-inline"> {{'quality-assurance.event.action.import' | translate}}</span>
</button>
@@ -318,7 +318,7 @@
</div>
<div class="modal-body">
<p>{{'quality-assurance.event.ignore.description' | translate}}</p>
<button class="btn btn-outline-danger float-end" (click)="modal.close('do')">
<button class="btn btn-outline-danger float-right" (click)="modal.close('do')">
<i class="fas fa-trash-alt"></i>
<span class="d-none d-sm-inline"> {{'quality-assurance.event.action.ignore' | translate}}</span>
</button>
@@ -335,7 +335,7 @@
</div>
<div class="modal-body">
<p>{{'quality-assurance.event.reject.description' | translate}}</p>
<button class="btn btn-outline-danger float-end" (click)="modal.close('do')">
<button class="btn btn-outline-danger float-right" (click)="modal.close('do')">
<i class="fas fa-trash-alt"></i>
<span class="d-none d-sm-inline"> {{'quality-assurance.event.action.reject' | translate}}</span>
</button>
@@ -352,7 +352,7 @@
</div>
<div class="modal-body">
<p>{{'quality-assurance.event.undo.description' | translate}}</p>
<button class="btn btn-outline-danger float-end" (click)="modal.close('do')">
<button class="btn btn-outline-danger float-right" (click)="modal.close('do')">
<i class="fas fa-trash-alt"></i>
<span class="d-none d-sm-inline"> {{'quality-assurance.event.action.undo' | translate}}</span>
</button>

View File

@@ -1,7 +1,8 @@
<div class="modal-header">
<h4 class="modal-title" id="modal-title">{{ (labelPrefix + label + '.title') | translate }}</h4>
<button type="button" class="btn-close" aria-label="Close button" aria-describedby="modal-title"
<button type="button" class="close" aria-label="Close button" aria-describedby="modal-title"
(click)="close()">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">

View File

@@ -2,13 +2,14 @@
<div class="notifications-wrapper position-fixed top right">
<div class="notification alert alert-success alert-dismissible m-3 shadow" role="alert">
<button (click)="removePopup()"
type="button" class="close pt-0 pe-1 pe-0 pb-0" data-bs-dismiss="alert" aria-label="Close">
type="button" class="close pt-0 pe-1 pe-0 pb-0" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<div class="d-flex flex-row">
<div class="d-flex flex-column justify-content-center align-items-center">
<div class="notification-icon d-flex justify-content-center"><i class="fas fa-2x fa-check-circle"></i></div>
</div>
<div class="d-flex flex-column justify-content-center align-content-stretch text-start p-2">
<div class="d-flex flex-column justify-content-center align-content-stretch text-left p-2">
@if ((suggestionsRD$ | async); as suggestions) {
@for (suggestion of suggestions; track suggestion) {
<ng-container class="alert alert-info">

View File

@@ -4,7 +4,7 @@
</span>
<span class="file-name ms-1">{{fileObject?.name}}</span>
</label>
<input requireFile #file="ngModel" type="file" name="file-upload-{{index}}" id="file-upload-{{index}}" class="form-control d-none" [ngModel]="fileObject" (ngModelChange)="setFile($event)"/>
<input requireFile #file="ngModel" type="file" name="file-upload-{{index}}" id="file-upload-{{index}}" class="form-control-file d-none" [ngModel]="fileObject" (ngModelChange)="setFile($event)"/>
@if (file.invalid && (file.dirty || file.touched)) {
<div
class="alert alert-danger validation-error">

View File

@@ -16,7 +16,7 @@
<!-- Display access periods if more than one was bound to input. The parent component (grant-request-copy)
sends an empty list if the feature is not enabled or applicable to this request. -->
@if (hasValue(validAccessPeriods$ | async) && (validAccessPeriods$ | async).length > 0) {
<div class="mb-3">
<div class="form-group">
<label for="accessPeriod">{{ 'grant-request-copy.access-period.header' | translate }}</label>
<div ngbDropdown class="d-block">
<!-- Show current selected access period (defaults to first in array) -->

View File

@@ -1,4 +1,7 @@
import { AsyncPipe } from '@angular/common';
import {
AsyncPipe,
CommonModule,
} from '@angular/common';
import {
Component,
OnInit,
@@ -46,6 +49,7 @@ import { ThemedEmailRequestCopyComponent } from '../email-request-copy/themed-em
standalone: true,
imports: [
AsyncPipe,
CommonModule,
FormsModule,
RouterLink,
ThemedEmailRequestCopyComponent,

View File

@@ -3,7 +3,7 @@
<form [formGroup]="searchForm" (ngSubmit)="onSubmit(searchForm.value)" autocomplete="on" class="d-flex">
<input #searchInput [@toggleAnimation]="isExpanded" [attr.aria-label]="('nav.search' | translate)" name="query"
formControlName="query" type="text" placeholder="{{searchExpanded ? ('nav.search' | translate) : ''}}"
class="d-inline-block bg-transparent position-absolute form-control dropdown-menu-end p1"
class="d-inline-block bg-transparent position-absolute form-control dropdown-menu-right p1"
[class.display]="searchExpanded ? 'inline-block' : 'none'"
[tabIndex]="searchExpanded ? 0 : -1"
[attr.data-test]="'header-search-box' | dsBrowserOnly">

View File

@@ -5,7 +5,7 @@
}
<ng-content></ng-content>
@if (dismissible) {
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close" (click)="dismiss()">
<button type="button" class="btn-close" data-dismiss="alert" aria-label="Close" (click)="dismiss()">
</button>
}
</div>

View File

@@ -3,20 +3,22 @@
@if (this.canWithdraw) {
<div class="modal-header">
{{ 'item.qa.withdrawn.modal.header' | translate }}
<button type="button" class="btn-close" (click)="onModalClose()" aria-label="Close">
<button type="button" class="close" (click)="onModalClose()" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
} @else {
@if (!this.canWithdraw) {
<div class="modal-header">
{{'item.qa.reinstate.modal.header' | translate}}
<button type="button" class="btn-close" (click)="onModalClose()" aria-label="Close">
<button type="button" class="close" (click)="onModalClose()" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
}
}
<div class="modal-body">
<div class="mb-3">
<div class="form-group">
<label for="reason">{{ this.canWithdraw ? ('qa-withdrawn.create.modal.form.summary.label' | translate)
: ('qa-reinstate.create.modal.form.summary.label' | translate) }}</label>
<label for="reason">{{ this.canWithdraw ? ('qa-withdrawn.create.modal.form.summary2.label' | translate)

View File

@@ -14,7 +14,7 @@
<span role="img"
[attr.aria-label]="'file-download-link.restricted' | translate"
[title]="'file-download-link.restricted' | translate"
class="pe-1">
class="pr-1">
<i class="fas fa-lock"></i>
</span>
} @else if ((canDownloadWithToken$ | async) && (canDownload$ | async) === false) {
@@ -22,7 +22,7 @@
<span role="img"
[attr.aria-label]="'file-download-link.secure-access' | translate"
[title]="'file-download-link.secure-access' | translate"
class="pe-1 request-a-copy-access-icon">
class="pr-1 request-a-copy-access-icon">
<i class="fa-solid fa-lock-open"></i>
</span>
} @else if (showIcon) {

View File

@@ -1,5 +1,5 @@
<div [formGroup]="group" [ngClass]="getClass('element', 'container')" class="form-check custom-control form-switch" [class.disabled]="model.disabled">
<input type="checkbox" class="form-check-input form-check-input"
<input type="checkbox" class="form-check-input custom-control-input"
[checked]="model.checked"
[class.is-invalid]="showErrorMessages"
[id]="id"
@@ -13,7 +13,7 @@
(blur)="onBlur($event)"
(change)="onChange($event)"
(focus)="onFocus($event)"/>
<label class="form-check-label form-check-label" [for]="bindId && model.id">
<label class="form-check-label custom-control-label" [for]="bindId && model.id">
<span [innerHTML]="model.label | translate"
[ngClass]="[getClass('element', 'label'), getClass('grid', 'label')]"></span>
</label>

View File

@@ -0,0 +1,16 @@
div.custom-switch {
&.custom-control-right {
margin-left: 0;
margin-right: 0;
&::after {
right: -1.5rem;
left: auto;
}
&::before {
right: -2.35rem;
left: auto;
}
}
}

View File

@@ -24,40 +24,38 @@
@if ((isHierarchicalVocabulary() | async) !== true) {
<div class="position-relative right-addon">
<div class="authority-icons position-absolute d-flex align-items-center">
@if (searching || loadingInitialValue) {
<i class="fas fa-circle-notch fa-spin fa-2x fa-fw text-primary my-auto p-0" aria-hidden="true"></i>
}
@if (!searching && !loadingInitialValue) {
<i
dsAuthorityConfidenceState
class="far fa-circle fa-2x fa-fw my-auto p-0"
aria-hidden="true"
[authorityValue]="currentValue"
(whenClickOnConfidenceNotAccepted)="whenClickOnConfidenceNotAccepted($event)"></i>
}
</div>
@if (searching || loadingInitialValue) {
<i class="fas fa-circle-notch fa-spin fa-2x fa-fw text-primary position-absolute mt-1 p-0" aria-hidden="true"></i>
}
@if (!searching && !loadingInitialValue) {
<i
dsAuthorityConfidenceState
class="far fa-circle fa-2x fa-fw position-absolute mt-1 p-0"
aria-hidden="true"
[authorityValue]="currentValue"
(whenClickOnConfidenceNotAccepted)="whenClickOnConfidenceNotAccepted($event)"></i>
}
<input #instance="ngbTypeahead"
class="form-control"
[attr.aria-labelledby]="'label_' + model.id"
[attr.autoComplete]="model.autoComplete"
[attr.aria-label]="model.label | translate"
[class.is-invalid]="showErrorMessages"
[id]="model.id"
[inputFormatter]="formatter"
[name]="model.name"
[ngbTypeahead]="search"
[placeholder]="model.placeholder"
[readonly]="model.readOnly"
[disabled]="model.readOnly"
[resultTemplate]="rt"
[type]="model.inputType"
[(ngModel)]="currentValue"
(blur)="onBlur($event)"
(focus)="onFocus($event)"
(change)="onChange($event)"
(input)="onInput($event)"
(selectItem)="onSelectItem($event)">
class="form-control"
[attr.aria-labelledby]="'label_' + model.id"
[attr.autoComplete]="model.autoComplete"
[attr.aria-label]="model.label | translate"
[class.is-invalid]="showErrorMessages"
[id]="model.id"
[inputFormatter]="formatter"
[name]="model.name"
[ngbTypeahead]="search"
[placeholder]="model.placeholder"
[readonly]="model.readOnly"
[disabled]="model.readOnly"
[resultTemplate]="rt"
[type]="model.inputType"
[(ngModel)]="currentValue"
(blur)="onBlur($event)"
(focus)="onFocus($event)"
(change)="onChange($event)"
(input)="onInput($event)"
(selectItem)="onSelectItem($event)">
@if (searchFailed) {
<div class="invalid-feedback">Sorry, suggestions could not be loaded.</div>
}
@@ -67,25 +65,25 @@
@if ((isHierarchicalVocabulary() | async)) {
<div class="position-relative right-addon">
<i class="dropdown-toggle position-absolute tree-toggle" (click)="openTree($event)"
aria-hidden="true"></i>
aria-hidden="true"></i>
<input class="form-control"
[attr.aria-labelledby]="'label_' + model.id"
[attr.autoComplete]="model.autoComplete"
[attr.aria-label]="model.label | translate"
[class.is-invalid]="showErrorMessages"
[class.tree-input]="!model.readOnly"
[id]="id"
[name]="model.name"
[placeholder]="model.placeholder"
[readonly]="true"
[disabled]="model.readOnly"
[type]="model.inputType"
[value]="currentValue?.display"
(focus)="onFocus($event)"
(change)="onChange($event)"
(click)="openTree($event)"
(keydown)="$event.preventDefault()"
(keypress)="$event.preventDefault()"
(keyup)="$event.preventDefault()">
[attr.aria-labelledby]="'label_' + model.id"
[attr.autoComplete]="model.autoComplete"
[attr.aria-label]="model.label | translate"
[class.is-invalid]="showErrorMessages"
[class.tree-input]="!model.readOnly"
[id]="id"
[name]="model.name"
[placeholder]="model.placeholder"
[readonly]="true"
[disabled]="model.readOnly"
[type]="model.inputType"
[value]="currentValue?.display"
(focus)="onFocus($event)"
(change)="onChange($event)"
(click)="openTree($event)"
(keydown)="$event.preventDefault()"
(keypress)="$event.preventDefault()"
(keyup)="$event.preventDefault()">
</div>
}

View File

@@ -31,9 +31,3 @@
.tree-input[readonly]{
background-color: #fff;
}
.authority-icons {
top: 50%;
right: 0;
transform: translateY(-50%)
}

View File

@@ -30,7 +30,7 @@
<button id="resultdropdown" type="button"
ngbDropdownToggle
class="btn btn-outline-secondary dropdown-toggle-split"
data-bs-toggle="dropdown" aria-haspopup="true"
data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false"
[hidden]="selectAllLoading">
<span class="sr-only">{{ ('submission.sections.describe.relationship-lookup.toggle-dropdown' | translate) }}</span>

View File

@@ -21,7 +21,6 @@ import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vo
import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model';
import { VocabularyService } from '../../../core/submission/vocabularies/vocabulary.service';
import { createSuccessfulRemoteDataObject$ } from '../../remote-data.utils';
import { createTestComponent } from '../../testing/utils.test';
import { FormFieldMetadataValueObject } from '../builder/models/form-field-metadata-value.model';
import { VocabularyTreeviewComponent } from './vocabulary-treeview.component';
@@ -64,7 +63,6 @@ describe('VocabularyTreeviewComponent test suite', () => {
searchTopEntries: jasmine.createSpy('searchTopEntries'),
getEntryDetailChildren: jasmine.createSpy('getEntryDetailChildren'),
clearSearchTopRequests: jasmine.createSpy('clearSearchTopRequests'),
findVocabularyById: createSuccessfulRemoteDataObject$({ preloadLevel: 2 }),
});
beforeEach(waitForAsync(() => {

View File

@@ -22,20 +22,11 @@ import {
Observable,
Subscription,
} from 'rxjs';
import {
map,
switchMap,
tap,
} from 'rxjs/operators';
import { getFirstCompletedRemoteData } from 'src/app/core/shared/operators';
import { RemoteData } from '../../../core/data/remote-data';
import { PageInfo } from '../../../core/shared/page-info.model';
import { Vocabulary } from '../../../core/submission/vocabularies/models/vocabulary.model';
import { VocabularyEntry } from '../../../core/submission/vocabularies/models/vocabulary-entry.model';
import { VocabularyEntryDetail } from '../../../core/submission/vocabularies/models/vocabulary-entry-detail.model';
import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model';
import { VocabularyService } from '../../../core/submission/vocabularies/vocabulary.service';
import { AlertComponent } from '../../alert/alert.component';
import { AlertType } from '../../alert/alert-type';
import { BtnDisabledDirective } from '../../btn-disabled.directive';
@@ -172,11 +163,9 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit, OnChanges
* Initialize instance variables
*
* @param {VocabularyTreeviewService} vocabularyTreeviewService
* @param {VocabularyService} vocabularyService
*/
constructor(
private vocabularyTreeviewService: VocabularyTreeviewService,
protected vocabularyService: VocabularyService,
) {
this.treeFlattener = new VocabularyTreeFlattener(this.transformer, this.getLevel,
this.isExpandable, this.getChildren);
@@ -218,20 +207,12 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit, OnChanges
);
this.nodeMap.set(entryId, newNode);
if ((((level + 1) < this.preloadLevel))
if ((((level + 1) < this.preloadLevel) && newNode.childrenLoaded)
|| (newNode.isSearchNode && newNode.childrenLoaded)
|| newNode.isInInitValueHierarchy) {
if (newNode.item.id === LOAD_MORE || newNode.item.id === LOAD_MORE_ROOT) {
// When a 'LOAD_MORE' node is encountered, the parent already has a lot of expanded children
// so this is a good point to stop expanding.
return newNode;
}
if (!newNode.childrenLoaded) {
if (!newNode.isSearchNode) {
this.loadChildren(newNode);
}
this.treeControl.expand(newNode);
}
return newNode;
@@ -272,31 +253,15 @@ export class VocabularyTreeviewComponent implements OnDestroy, OnInit, OnChanges
*/
ngOnInit(): void {
this.subs.push(
this.vocabularyService.findVocabularyById(this.vocabularyOptions.name).pipe(
// Retrieve the configured preloadLevel from REST
getFirstCompletedRemoteData(),
map((vocabularyRD: RemoteData<Vocabulary>) => {
if (vocabularyRD.hasSucceeded &&
hasValue(vocabularyRD.payload.preloadLevel) &&
vocabularyRD.payload.preloadLevel > 1) {
return vocabularyRD.payload.preloadLevel;
} else {
// Set preload level to 1 in case request fails
return 1;
}
}),
tap(preloadLevel => this.preloadLevel = preloadLevel),
tap(() => {
const entryId: string = (this.selectedItems?.length > 0) ? this.getEntryId(this.selectedItems[0]) : null;
this.vocabularyTreeviewService.initialize(this.vocabularyOptions, new PageInfo(), this.getSelectedEntryIds(), entryId);
}),
switchMap(() => this.vocabularyTreeviewService.getData()),
).subscribe((data) => {
this.vocabularyTreeviewService.getData().subscribe((data) => {
this.dataSource.data = data;
}),
);
this.loading = this.vocabularyTreeviewService.isLoading();
const entryId: string = (this.selectedItems?.length > 0) ? this.getEntryId(this.selectedItems[0]) : null;
this.vocabularyTreeviewService.initialize(this.vocabularyOptions, new PageInfo(), this.getSelectedEntryIds(), entryId);
}
/**

View File

@@ -6,7 +6,7 @@
aria-haspopup="menu"
class="dropdown-toggle btn btn-link px-0"
[title]="'nav.language' | translate"
(click)="$event.preventDefault()" data-bs-toggle="dropdown" ngbDropdownToggle
(click)="$event.preventDefault()" data-toggle="dropdown" ngbDropdownToggle
data-test="lang-switch"
tabindex="0">
<i class="fas fa-globe-asia fa-lg fa-fw"></i>

View File

@@ -7,8 +7,8 @@
[title]="boxConfig.description | translate"
>
<div [ngStyle]="{'color': boxConfig.textColor}" class="d-flex flex-column justify-content-center align-items-center">
<div class="mb-3 fw-bold box-counter">{{ boxConfig.count ?? 0 }}</div>
<div class="fw-bold d-flex justify-content-center w-100">{{ boxConfig.title | translate }}</div>
<div class="mb-3 font-weight-bold box-counter">{{ boxConfig.count ?? 0 }}</div>
<div class="font-weight-bold d-flex justify-content-center w-100">{{ boxConfig.title | translate }}</div>
</div>
</div>
}

View File

@@ -10,7 +10,7 @@
@if (notification.options.clickToClose) {
<button
(click)="remove()"
type="button" class="btn-close pt-0 pe-1 ps-0 pb-0 mt-1 me-1" data-bs-dismiss="alert" aria-label="Close">
type="button" class="btn-close pt-0 pe-1 ps-0 pb-0 mt-1 me-1" data-dismiss="alert" aria-label="Close">
</button>
}

View File

@@ -1,4 +1,7 @@
import { isPlatformBrowser } from '@angular/common';
import {
isPlatformBrowser,
NgIf,
} from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
@@ -32,6 +35,7 @@ import { parseGeoJsonFromMetadataValue } from '../utils/geospatial.functions';
standalone: true,
imports: [
GeospatialMapComponent,
NgIf,
],
})

View File

@@ -1,11 +1,11 @@
<td class="text-center">
<div>
<div class="custom-control custom-checkbox">
<input type="checkbox"
class="form-check-input"
class="custom-control-input"
[id]="entry.id"
[ngModel]="entry.checked"
(ngModelChange)="this.toggleCheckbox.emit($event);">
<label class="form-check-label" [for]="entry.id">
<label class="custom-control-label" [for]="entry.id">
<span class="sr-only">{{(entry.checked ? 'resource-policies.table.headers.deselect' : 'resource-policies.table.headers.select') | translate}}</span>
</label>
</div>

View File

@@ -42,12 +42,12 @@
@if ((getResourcePolicies() | async)?.length > 0) {
<tr class="text-center">
<th>
<div>
<div class="custom-control custom-checkbox">
<input #selectAllBtn type="checkbox"
class="form-check-input"
class="custom-control-input"
[id]="'selectAll_' + resourceUUID"
(change)="selectAllCheckbox($event)">
<label class="form-check-label" [for]="'selectAll_' + resourceUUID">
<label class="custom-control-label" [for]="'selectAll_' + resourceUUID">
<span class="sr-only">{{(selectAllBtn.checked ? 'resource-policies.table.headers.deselect-all' : 'resource-policies.table.headers.select-all') | translate}}</span>
</label>
</div>

View File

@@ -6,7 +6,7 @@
</label>
<select [(ngModel)]="currentFilter" (keyup.enter)="applyFilter()"
(ngModelChange)="currentOperator = advancedFilterMap.get(currentFilter).operators[0].operator"
class="form-select mb-2" id="advanced-search-filters">
class="form-control mb-2" id="advanced-search-filters">
@for (advancedFilter of (advancedFilters$ | async); track advancedFilter.filter) {
<option [value]="advancedFilter.filter">
{{ 'search.filters.filter.' + advancedFilter.filter + '.head' | translate }}
@@ -17,7 +17,7 @@
{{ 'search.sidebar.advanced-search.operators' | translate }}
</label>
<select [(ngModel)]="currentOperator" (keyup.enter)="applyFilter()"
class="form-select mb-2" id="advanced-search-operators">
class="form-control mb-2" id="advanced-search-operators">
@for (operator of advancedFilterMap.get(currentFilter)?.operators; track operator) {
<option [value]="operator.operator">
{{ 'search.filters.operator.' + operator.operator + '.text' | translate }}

View File

@@ -9,7 +9,7 @@
role="button"
tabindex="0"
>
<span class="h4 d-inline-block text-start mt-auto mb-auto dark:text-white text-dark">
<span class="h4 d-inline-block text-left mt-auto mb-auto dark:text-white text-dark">
{{'search.filters.filter.' + filter.name + '.head'| translate}}
</span>
<i class="filter-toggle flex-grow-1 fas p-auto"

View File

@@ -6,7 +6,7 @@
(click)="searchFilterService.minimizeAll()"
class="badge bg-primary">
<span class="d-flex">
<span class="flex-grow-1 text-start">{{('search.filters.applied.f.' + appliedFilter.filter + '.min') | translate}}: {{ min }}</span>
<span class="flex-grow-1 text-left">{{('search.filters.applied.f.' + appliedFilter.filter + '.min') | translate}}: {{ min }}</span>
<span class="ps-1" aria-hidden="true">×</span>
</span>
</a>
@@ -19,7 +19,7 @@
(click)="searchFilterService.minimizeAll()"
class="badge bg-primary">
<span class="d-flex">
<span class="flex-grow-1 text-start">{{('search.filters.applied.f.' + appliedFilter.filter + '.max') | translate}}: {{ max }}</span>
<span class="flex-grow-1 text-left">{{('search.filters.applied.f.' + appliedFilter.filter + '.max') | translate}}: {{ max }}</span>
<span class="ps-1" aria-hidden="true">×</span>
</span>
</a>

View File

@@ -4,7 +4,7 @@
[queryParams]="(removeParameters$ | async)"
(click)="searchFilterService.minimizeAll()">
<span class="d-flex">
<span class="flex-grow-1 text-start">{{ ('search.filters.applied.f.' + appliedFilter.filter) | translate}}{{'search.filters.applied.operator.' + appliedFilter.operator | translate}}: {{'search.filters.' + appliedFilter.filter + '.' + appliedFilter.label | translate: { default: appliedFilter.label } }}</span>
<span class="flex-grow-1 text-left">{{ ('search.filters.applied.f.' + appliedFilter.filter) | translate}}{{'search.filters.applied.operator.' + appliedFilter.operator | translate}}: {{'search.filters.' + appliedFilter.filter + '.' + appliedFilter.label | translate: { default: appliedFilter.label } }}</span>
<span class="ps-1" aria-hidden="true">×</span>
</span>
</a>

View File

@@ -16,7 +16,7 @@
<div>
@for (subscriptionType of subscriptionForm?.controls | keyvalue; track subscriptionType) {
<fieldset formGroupName="{{subscriptionType.key}}" class="mb-3 row">
<legend class="col-md-4 col-form-label float-md-start pt-0">
<legend class="col-md-4 col-form-label float-md-left pt-0">
{{ 'subscriptions.modal.new-subscription-form.type.' + subscriptionType.key | translate }}:
</legend>
<div class="col-md-8">

View File

@@ -23,7 +23,7 @@
<span><i class="fas fa-cloud-upload"
aria-hidden="true"></i> {{ ((fileObject === null || fileObject === undefined) ? dropMessageLabel : dropMessageLabelReplacement) | translate}} {{'uploader.or' | translate}}</span>
<label class="btn btn-link m-0 p-0 ms-1">
<input class="form-control d-none" type="file" name="file-upload"
<input class="form-control-file d-none" type="file" name="file-upload"
id="file-upload"
(change)="handleFileInput($event)">
{{'uploader.browse' | translate}}

View File

@@ -1,4 +1,4 @@
<div class="btn-group" data-bs-toggle="buttons">
<div class="btn-group" data-toggle="buttons">
@if (isToShow(viewModeEnum.ListElement)) {
<button
[attr.aria-current]="currentMode === viewModeEnum.ListElement"

View File

@@ -1,4 +1,4 @@
import { AsyncPipe } from '@angular/common';
import { CommonModule } from '@angular/common';
import {
Component,
Input,
@@ -6,7 +6,7 @@ import {
SimpleChanges,
} from '@angular/core';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { TranslatePipe } from '@ngx-translate/core';
import { TranslateModule } from '@ngx-translate/core';
import {
Observable,
of,
@@ -29,10 +29,10 @@ import { SubmissionService } from '../../submission.service';
templateUrl: './submission-form-footer.component.html',
standalone: true,
imports: [
AsyncPipe,
BrowserOnlyPipe,
BtnDisabledDirective,
TranslatePipe,
CommonModule,
TranslateModule,
],
})
export class SubmissionFormFooterComponent implements OnChanges {

View File

@@ -2,7 +2,7 @@
Template for the detect duplicates submission section component
@author Kim Shepherd
-->
<div class="text-sm-start" *ngVar="(this.getDuplicateData() | async) as data">
<div class="text-sm-left" *ngVar="(this.getDuplicateData() | async) as data">
@if (data?.potentialDuplicates.length === 0) {
<div class="alert alert-success w-100">{{ 'submission.sections.duplicates.none' | translate }}</div>
}

View File

@@ -2,15 +2,15 @@
<div class="row">
<!-- Default switch -->
<div class="col-md-2 d-flex justify-content-center align-items-center" >
<div class="form-check form-switch">
<div class="custom-control custom-switch">
<input
type="checkbox"
class="form-check-input"
class="custom-control-input"
id="primaryBitstream{{fileIndex}}"
[disabled]="processingSaveStatus$ | async"
[checked]="isPrimary"
(change)="togglePrimaryBitstream($event)">
<label class="form-check-label" for="primaryBitstream{{fileIndex}}">
<label class="custom-control-label" for="primaryBitstream{{fileIndex}}">
@if (!isPrimary) {
<span class="sr-only">{{'submission.sections.upload.primary.make' | translate:{ fileName: fileName } }}</span>
}

View File

@@ -21,7 +21,7 @@
}
<div class="row">
<div class="col-md-2">
<span class="text-start fw-bold">{{ 'bitstream.edit.form.primaryBitstream.label' | translate }}</span>
<span class="text-left font-weight-bold">{{ 'bitstream.edit.form.primaryBitstream.label' | translate }}</span>
</div>
</div>
<div class="row">

View File

@@ -1,29 +1,30 @@
<div class="thumbnail" [class.limit-width]="limitWidth">
@if (isLoading()) {
<div class="thumbnail-content outer">
<div class="inner">
<div class="centered">
<ds-loading [spinner]="true"></ds-loading>
</div>
<div class="thumbnail-content outer">
<div class="inner">
<div class="centered">
<ds-loading [spinner]="true"></ds-loading>
</div>
</div>
</div>
}
<!-- don't use *ngIf="!isLoading" so the thumbnail can load in while the animation is playing -->
@if (src() !== null) {
<img class="thumbnail-content img-fluid"
[class.d-none]="isLoading()"
<img
class="thumbnail-content img-fluid"
[ngClass]="{ 'd-none': isLoading ()}"
[src]="src() | dsSafeUrl"
[alt]="alt | translate"
(error)="errorHandler()"
(load)="successHandler()"/>
}
@if (src() === null && isLoading() === false) {
<div class="thumbnail-content outer">
<div class="inner">
<div class="thumbnail-placeholder centered">
{{ placeholder | translate }}
</div>
(load)="successHandler()"
/>
} @if (src() === null && isLoading() === false) {
<div class="thumbnail-content outer">
<div class="inner">
<div class="thumbnail-placeholder centered">
{{ placeholder | translate }}
</div>
</div>
</div>
}
</div>

View File

@@ -1,4 +1,7 @@
import { isPlatformBrowser } from '@angular/common';
import {
CommonModule,
isPlatformBrowser,
} from '@angular/common';
import {
Component,
Inject,
@@ -9,7 +12,7 @@ import {
SimpleChanges,
WritableSignal,
} from '@angular/core';
import { TranslatePipe } from '@ngx-translate/core';
import { TranslateModule } from '@ngx-translate/core';
import { of } from 'rxjs';
import { switchMap } from 'rxjs/operators';
@@ -37,9 +40,10 @@ import { SafeUrlPipe } from '../shared/utils/safe-url-pipe';
templateUrl: './thumbnail.component.html',
standalone: true,
imports: [
CommonModule,
SafeUrlPipe,
ThemedLoadingComponent,
TranslatePipe,
TranslateModule,
],
})
export class ThumbnailComponent implements OnChanges {

View File

@@ -1,7 +1,6 @@
import {
AsyncPipe,
CommonModule,
Location,
NgClass,
} from '@angular/common';
import {
Component,
@@ -45,9 +44,8 @@ export const ADVANCED_WORKFLOW_ACTION_SELECT_REVIEWER = 'selectrevieweraction';
templateUrl: './advanced-workflow-action-select-reviewer.component.html',
styleUrls: ['./advanced-workflow-action-select-reviewer.component.scss'],
imports: [
AsyncPipe,
CommonModule,
ModifyItemOverviewComponent,
NgClass,
ReviewersListComponent,
TranslateModule,
],

View File

@@ -1,5 +1,5 @@
import {
AsyncPipe,
CommonModule,
Location,
} from '@angular/common';
import { Component } from '@angular/core';
@@ -8,7 +8,7 @@ import {
Router,
} from '@angular/router';
import {
TranslatePipe,
TranslateModule,
TranslateService,
} from '@ngx-translate/core';
import { Observable } from 'rxjs';
@@ -30,9 +30,9 @@ import { WorkflowItemActionPageDirective } from '../workflow-item-action-page.co
templateUrl: '../workflow-item-action-page.component.html',
standalone: true,
imports: [
AsyncPipe,
CommonModule,
ModifyItemOverviewComponent,
TranslatePipe,
TranslateModule,
VarDirective,
],
})

View File

@@ -1,5 +1,5 @@
import {
AsyncPipe,
CommonModule,
Location,
} from '@angular/common';
import {
@@ -42,7 +42,7 @@ import { NotificationsService } from '../../shared/notifications/notifications.s
templateUrl: './workspaceitems-delete-page.component.html',
styleUrls: ['./workspaceitems-delete-page.component.scss'],
imports: [
AsyncPipe,
CommonModule,
ModifyItemOverviewComponent,
TranslateModule,
],

View File

@@ -2494,7 +2494,7 @@
"cookies.consent.content-modal.no-privacy-policy.text": "",
// "cookies.consent.content-modal.title": "Information that we collect",
"cookies.consent.content-modal.title": "Information, die wir sammeln",
"cookies.consent.content-modal.title": "Informationen, die wir sammeln",
// "cookies.consent.app.title.accessibility": "Accessibility Settings",
// TODO New key - Add a translation

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -5652,10 +5652,10 @@
"publication-claim.source.description": "Em baixo pode ver todas as fontes.",
// "quality-assurance.title": "Quality Assurance",
"quality-assurance.title": "Controlo de qualidade",
"quality-assurance.title": "Controlo de Qualidade",
// "quality-assurance.topics.description": "Below you can see all the topics received from the subscriptions to {{source}}.",
"quality-assurance.topics.description": "Em baixo pode ver todos os tópicos recebidos das subscrições de {{source}}.",
"quality-assurance.topics.description": "Em Abaixo pode ver todos os tópicos recebidos das subscrições de {{source}}.",
// "quality-assurance.source.description": "Below you can see all the notification's sources.",
"quality-assurance.source.description": "Em baixo pode ver todas as fontes da notificação.",
@@ -5874,7 +5874,7 @@
"orgunit.page.country": "País",
// "orgunit.page.dateestablished": "Date established",
"orgunit.page.dateestablished": "Data de criação",
"orgunit.page.dateestablished": "Data estabelecida",
// "orgunit.page.description": "Description",
"orgunit.page.description": "Descrição",
@@ -5907,7 +5907,7 @@
"pagination.showing.detail": "{{ range }} de {{ total }}",
// "pagination.showing.label": "Now showing ",
"pagination.showing.label": "A mostrar ",
"pagination.showing.label": "A mostrar",
// "pagination.sort-direction": "Sort Options",
"pagination.sort-direction": "Opções de ordenação",
@@ -8440,7 +8440,7 @@
"submission.sections.general.metadata-extracted": "Novos metadados foram extraídos e adicionados à secção <strong>{{sectionId}}</strong>.",
// "submission.sections.general.metadata-extracted-new-section": "New <strong>{{sectionId}}</strong> section has been added to submission.",
"submission.sections.general.metadata-extracted-new-section": "Nova secção <strong>{{sectionId}}</strong> foi adicionada à submissão.",
"submission.sections.general.metadata-extracted-new-section": "Nova Secção <strong>{{sectionId}}</strong> foi adicionada a dubmissão.",
// "submission.sections.general.no-collection": "No collection found",
"submission.sections.general.no-collection": "Não foi encontrada nenhuma coleção",
@@ -9827,7 +9827,7 @@
"coar-notify-support.title": "Protocolo COAR Notify",
// "coar-notify-support-title.content": "Here, we fully support the COAR Notify protocol, which is designed to enhance the communication between repositories. To learn more about the COAR Notify protocol, visit the <a href=\"https://notify.coar-repositories.org/\" rel=\"noopener noreferrer\">COAR Notify website</a>.",
"coar-notify-support-title.content": "Suportamos totalmente o protocolo COAR Notify, que foi concebido para melhorar a comunicação entre repositórios. Para saber mais sobre o protocolo COAR Notify, visite a página <a href=\"https://notify.coar-repositories.org/\"rel=\"noopener noreferrer\">COAR Notify</a>.",
"coar-notify-support-title.content": "Aqui, suportamos totalmente o protocolo COAR Notify, que foi concebido para melhorar a comunicação entre repositórios. Para saber mais sobre o protocolo COAR Notify, visite a página <a href=\"https://notify.coar-repositories.org/\"rel=\"noopener noreferrer\">COAR Notify</a>.",
// "coar-notify-support.ldn-inbox.title": "LDN InBox",
"coar-notify-support.ldn-inbox.title": "Caixa de entrada LDN",
@@ -9839,10 +9839,10 @@
"coar-notify-support.message-moderation.title": "Moderação de mensagens",
// "coar-notify-support.message-moderation.content": "To ensure a secure and productive environment, all incoming LDN messages are moderated. If you are planning to exchange information with us, kindly reach out via our dedicated",
"coar-notify-support.message-moderation.content": "Para garantir um ambiente seguro e produtivo, todas as mensagens LDN recebidas são moderadas. Caso pretenda comunicar connosco, por favor utilize o nosso",
"coar-notify-support.message-moderation.content": "Para garantir um ambiente seguro e produtivo, todas as mensagens LDN recebidas são moderadas. Se pretende trocar informações connosco, contacte-nos através do nosso",
// "coar-notify-support.message-moderation.feedback-form": " Feedback form.",
"coar-notify-support.message-moderation.feedback-form": " formulário de contacto.",
"coar-notify-support.message-moderation.feedback-form": "Formulário de comentários.",
// "service.overview.delete.header": "Delete Service",
"service.overview.delete.header": "Exluir serviço",

File diff suppressed because it is too large Load Diff

View File

@@ -281,7 +281,6 @@ export class DefaultAppConfig implements AppConfig {
{ code: 'pl', label: 'Polski', active: true },
{ code: 'pt-PT', label: 'Português', active: true },
{ code: 'pt-BR', label: 'Português do Brasil', active: true },
{ code: 'ru', label: 'Русский', active: true },
{ code: 'sr-lat', label: 'Srpski (lat)', active: true },
{ code: 'sr-cyr', label: 'Српски', active: true },
{ code: 'sv', label: 'Svenska', active: true },

View File

@@ -105,7 +105,7 @@
--ds-home-news-link-hover-color: #{darken($ds-home-news-link-color, 15%)};
--ds-home-news-background-color: #{$gray-200};
--ds-breadcrumb-bg: #{$gray-200};
--ds-breadcrumb-bg: #{$gray-200} !important;
--ds-breadcrumb-link-color: #{$ds-breadcrumb-link-color};
--ds-breadcrumb-link-active-color: #{darken($ds-breadcrumb-link-color, 30%)};
--ds-breadcrumb-max-length: 200px;

View File

@@ -1,4 +1,7 @@
import { AsyncPipe } from '@angular/common';
import {
AsyncPipe,
CommonModule,
} from '@angular/common';
import { Component } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { RouterLink } from '@angular/router';
@@ -18,6 +21,7 @@ import { VarDirective } from '../../../../../app/shared/utils/var.directive';
standalone: true,
imports: [
AsyncPipe,
CommonModule,
FormsModule,
RouterLink,
ThemedEmailRequestCopyComponent,

View File

@@ -1,6 +1,6 @@
import { AsyncPipe } from '@angular/common';
import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import { TranslatePipe } from '@ngx-translate/core';
import { TranslateModule } from '@ngx-translate/core';
import { BtnDisabledDirective } from '../../../../../../app/shared/btn-disabled.directive';
import { BrowserOnlyPipe } from '../../../../../../app/shared/utils/browser-only.pipe';
@@ -14,10 +14,10 @@ import { SubmissionFormFooterComponent as BaseComponent } from '../../../../../.
templateUrl: '../../../../../../app/submission/form/footer/submission-form-footer.component.html',
standalone: true,
imports: [
AsyncPipe,
BrowserOnlyPipe,
BtnDisabledDirective,
TranslatePipe,
CommonModule,
TranslateModule,
],
})
export class SubmissionFormFooterComponent extends BaseComponent {

View File

@@ -1,5 +1,6 @@
import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import { TranslatePipe } from '@ngx-translate/core';
import { TranslateModule } from '@ngx-translate/core';
import { ThemedLoadingComponent } from '../../../../app/shared/loading/themed-loading.component';
import { SafeUrlPipe } from '../../../../app/shared/utils/safe-url-pipe';
@@ -13,9 +14,10 @@ import { ThumbnailComponent as BaseComponent } from '../../../../app/thumbnail/t
templateUrl: '../../../../app/thumbnail/thumbnail.component.html',
standalone: true,
imports: [
CommonModule,
SafeUrlPipe,
ThemedLoadingComponent,
TranslatePipe,
TranslateModule,
],
})
export class ThumbnailComponent extends BaseComponent {

View File

@@ -1,6 +1,6 @@
import { AsyncPipe } from '@angular/common';
import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import { TranslatePipe } from '@ngx-translate/core';
import { TranslateModule } from '@ngx-translate/core';
import { ModifyItemOverviewComponent } from '../../../../../app/item-page/edit-item-page/modify-item-overview/modify-item-overview.component';
import { VarDirective } from '../../../../../app/shared/utils/var.directive';
@@ -13,9 +13,9 @@ import { WorkflowItemDeleteComponent as BaseComponent } from '../../../../../app
templateUrl: '../../../../../app/workflowitems-edit-page/workflow-item-action-page.component.html',
standalone: true,
imports: [
AsyncPipe,
CommonModule,
ModifyItemOverviewComponent,
TranslatePipe,
TranslateModule,
VarDirective,
],
})

View File

@@ -1,4 +1,4 @@
import { AsyncPipe } from '@angular/common';
import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import { TranslateModule } from '@ngx-translate/core';
@@ -7,13 +7,10 @@ import { WorkspaceItemsDeletePageComponent as BaseComponent } from '../../../../
@Component({
selector: 'ds-themed-workspaceitems-delete-page',
// styleUrls: ['./workspaceitems-delete-page.component.scss'],
styleUrls: ['../../../../../app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.scss'],
// templateUrl: './workspaceitems-delete-page.component.html',
templateUrl: '../../../../../app/workspaceitems-edit-page/workspaceitems-delete-page/workspaceitems-delete-page.component.html',
standalone: true,
imports: [
AsyncPipe,
CommonModule,
ModifyItemOverviewComponent,
TranslateModule,
],

View File

@@ -1,10 +1,10 @@
<div class="background-image-container mt-ncs">
<div class="container">
<div class="home-news-content py-4 px-2 py-sm-5 px-sm-0 mt-0 mb-4">
<div class="jumbotron py-4 px-2 py-sm-5 px-sm-0 mt-0 mb-4">
<div class="d-flex flex-wrap">
<div>
<h1 class="display-2">DSpace 9</h1>
<p><i class="fas fa-circle-info"></i> This site is running DSpace 9. For more information, see the <a href="https://wiki.lyrasis.org/display/DSDOC9x/Release+Notes" role="link" tabindex="0">DSpace 9 Release Notes</a>.</p>
<h1 class="display-2">DSpace Sandbox</h1>
<p><i class="fas fa-circle-info"></i> This site is running unreleased code which will eventually become DSpace 10. For more information, see the <a href="https://wiki.lyrasis.org/display/DSPACE/DSpace+Release+10.0+Status" role="link" tabindex="0">DSpace 10 Release Status</a>.</p>
<p class="lead">DSpace is the world leading open source repository platform that enables
organisations to:</p>
</div>

View File

@@ -58,7 +58,7 @@
}
}
.home-news-content {
.jumbotron {
background-color: transparent;
}