diff --git a/.github/disabled-workflows/label_merge_conflicts.yml b/.github/disabled-workflows/label_merge_conflicts.yml index e1e0a63cde1..a840a4fd171 100644 --- a/.github/disabled-workflows/label_merge_conflicts.yml +++ b/.github/disabled-workflows/label_merge_conflicts.yml @@ -1,7 +1,8 @@ # This workflow checks open PRs for merge conflicts and labels them when conflicts are found name: Check for merge conflicts -# Run this for all pushes (i.e. merges) to 'main' or maintenance branches +# Run whenever the "main" branch is updated +# NOTE: This means merge conflicts are only checked for when a PR is merged to main. on: push: branches: [ main ] diff --git a/README.md b/README.md index 15a7f16bd76..053d55b040f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build](https://github.com/dataquest-dev/dspace-angular/actions/workflows/build.yml/badge.svg)](https://github.com/dataquest-dev/dspace-angular/actions/workflows/build.yml) [![Coverage Status](https://codecov.io/gh/DSpace/dspace-angular/branch/main/graph/badge.svg)](https://codecov.io/gh/DSpace/dspace-angular) [![Universal Angular](https://img.shields.io/badge/universal-angular2-brightgreen.svg?style=flat)](https://github.com/angular/universal) +[![Build](https://github.com/dataquest-dev/dspace-angular/actions/workflows/build.yml/badge.svg)](https://github.com/dataquest-dev/dspace-angular/actions/workflows/build.yml) [![codecov](https://codecov.io/gh/dataquest-dev/dspace-angular/branch/dtq-dev/graph/badge.svg?token=DQ7QIZN8S6)](https://codecov.io/gh/dataquest-dev/dspace-angular) [![Universal Angular](https://img.shields.io/badge/universal-angular2-brightgreen.svg?style=flat)](https://github.com/angular/universal) dspace-angular ============== diff --git a/cypress/e2e/admin-menu.cy.ts b/cypress/e2e/admin-menu.cy.ts new file mode 100644 index 00000000000..0d02148cd9d --- /dev/null +++ b/cypress/e2e/admin-menu.cy.ts @@ -0,0 +1,26 @@ +import { + TEST_ADMIN_PASSWORD, + TEST_ADMIN_USER, + TEST_SUBMIT_COLLECTION_UUID, +} from '../support/e2e'; + +/** + * Test menu options for admin + */ +describe('Admin Menu Page', () => { + beforeEach(() => { + // Create a new submission + cy.visit('/submit?collection=' + TEST_SUBMIT_COLLECTION_UUID + '&entityType=none'); + + // This page is restricted, so we will be shown the login form. Fill it out & submit. + cy.loginViaForm(TEST_ADMIN_USER, TEST_ADMIN_PASSWORD); + }); + + it('should pass accessibility tests', () => { + // Check handles redirect url in the tag + cy.get('.sidebar-top-level-items a[href = "/handle-table"]').scrollIntoView().should('be.visible'); + + // Check licenses redirect url in the tag + cy.get('.sidebar-top-level-items a[href = "/licenses/manage-table"]').scrollIntoView().should('be.visible'); + }); +}); diff --git a/cypress/e2e/login-modal.cy.ts b/cypress/e2e/login-modal.cy.ts new file mode 100644 index 00000000000..e86aa6843ed --- /dev/null +++ b/cypress/e2e/login-modal.cy.ts @@ -0,0 +1,139 @@ +import { TEST_ADMIN_PASSWORD, TEST_ADMIN_USER, TEST_ENTITY_PUBLICATION } from 'cypress/support/e2e'; +import { testA11y } from 'cypress/support/utils'; + +const page = { + openLoginMenu() { + // Click the "Log In" dropdown menu in header + cy.get('ds-themed-navbar [data-test="login-menu"]').click(); + }, + openUserMenu() { + // Once logged in, click the User menu in header + cy.get('ds-themed-navbar [data-test="user-menu"]').click(); + }, + submitLoginAndPasswordByPressingButton(email, password) { + // Enter email + cy.get('ds-themed-navbar [data-test="email"]').type(email); + // Enter password + cy.get('ds-themed-navbar [data-test="password"]').type(password); + // Click login button + cy.get('ds-themed-navbar [data-test="login-button"]').click(); + }, + submitLoginAndPasswordByPressingEnter(email, password) { + // In opened Login modal, fill out email & password, then click Enter + cy.get('ds-themed-navbar [data-test="email"]').type(email); + cy.get('ds-themed-navbar [data-test="password"]').type(password); + cy.get('ds-themed-navbar [data-test="password"]').type('{enter}'); + }, + submitLogoutByPressingButton() { + // This is the POST command that will actually log us out + cy.intercept('POST', '/server/api/authn/logout').as('logout'); + // Click logout button + cy.get('ds-themed-navbar [data-test="logout-button"]').click(); + // Wait until above POST command responds before continuing + // (This ensures next action waits until logout completes) + cy.wait('@logout'); + } +}; + +// CLARIN - CLARIN-DSpace7.x has different login +// describe('Login Modal', () => { +// it('should login when clicking button & stay on same page', () => { +// const ENTITYPAGE = '/entities/publication/'.concat(TEST_ENTITY_PUBLICATION); +// cy.visit(ENTITYPAGE); +// +// // Login menu should exist +// cy.get('ds-log-in').should('exist'); +// +// // Login, and the tag should no longer exist +// page.openLoginMenu(); +// cy.get('.form-login').should('be.visible'); +// +// page.submitLoginAndPasswordByPressingButton(TEST_ADMIN_USER, TEST_ADMIN_PASSWORD); +// cy.get('ds-log-in').should('not.exist'); +// +// // 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'); +// }); +// +// it('should login when clicking enter key & stay on same page', () => { +// cy.visit('/home'); +// +// // Open login menu in header & verify tag is visible +// page.openLoginMenu(); +// cy.get('.form-login').should('be.visible'); +// +// // Login, and the tag should no longer exist +// page.submitLoginAndPasswordByPressingEnter(TEST_ADMIN_USER, TEST_ADMIN_PASSWORD); +// cy.get('.form-login').should('not.exist'); +// +// // 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'); +// }); +// +// it('should support logout', () => { +// // First authenticate & access homepage +// cy.login(TEST_ADMIN_USER, 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'); +// +// // 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'); +// }); +// +// it('should allow new user registration', () => { +// cy.visit('/'); +// +// page.openLoginMenu(); +// +// // Registration link should be visible +// cy.get('ds-themed-navbar [data-test="register"]').should('be.visible'); +// +// // Click registration link & you should go to registration page +// cy.get('ds-themed-navbar [data-test="register"]').click(); +// cy.location('pathname').should('eq', '/register'); +// cy.get('ds-register-email').should('exist'); +// }); +// +// it('should allow forgot password', () => { +// cy.visit('/'); +// +// page.openLoginMenu(); +// +// // Forgot password link should be visible +// cy.get('ds-themed-navbar [data-test="forgot"]').should('be.visible'); +// +// // Click link & you should go to Forgot Password page +// cy.get('ds-themed-navbar [data-test="forgot"]').click(); +// cy.location('pathname').should('eq', '/forgot'); +// cy.get('ds-forgot-email').should('exist'); +// }); +// +// it('should pass accessibility tests', () => { +// cy.visit('/'); +// +// page.openLoginMenu(); +// +// cy.get('ds-log-in').should('exist'); +// +// // Analyze for accessibility issues +// testA11y('ds-log-in'); +// }); +// }); diff --git a/cypress/e2e/submission-ui.cy.ts b/cypress/e2e/submission-ui.cy.ts new file mode 100644 index 00000000000..db41ba66756 --- /dev/null +++ b/cypress/e2e/submission-ui.cy.ts @@ -0,0 +1,291 @@ +/** + * This IT will be never be pushed to the upstream because clicking testing DOM elements is antipattern because + * the tests on other machines could fail. + */ +import { + TEST_ADMIN_PASSWORD, + TEST_ADMIN_USER, + TEST_SUBMIT_CLARIAH_COLLECTION_UUID, + TEST_SUBMIT_COLLECTION_UUID +} from '../support/e2e'; +import { createItemProcess } from '../support/commands'; + + +const sideBarMenu = { + clickOnNewButton() { + cy.get('.sidebar-top-level-items div[role = "button"]').eq(0).click(); + }, + clickOnNewCommunityButton() { + cy.get('.sidebar-sub-level-items a[role = "button"]').eq(0).click(); + }, + clickOnNewCollectionButton() { + cy.get('.sidebar-sub-level-items a[role = "button"]').eq(1).click(); + }, + clickOnNewItemButton() { + cy.get('.sidebar-sub-level-items a[role = "button"]').eq(2).click(); + } +}; + +describe('Create a new submission', () => { + beforeEach(() => { + // Create a new submission + cy.visit('/submit?collection=' + TEST_SUBMIT_COLLECTION_UUID + '&entityType=none'); + + // This page is restricted, so we will be shown the login form. Fill it out & submit. + cy.loginViaForm(TEST_ADMIN_USER, TEST_ADMIN_PASSWORD); + }); + + // Test openAIRE - configured more retries because it failed with 3 retries + // Note: openAIRE tests are commented because they are failing in the server but locally they success. + // it('should add non EU sponsor without suggestion', { + // retries: { + // runMode: 6, + // openMode: 6, + // }, + // },() => { + // // funding code + // cy.get('ds-dynamic-sponsor-autocomplete').eq(0).click({force: true}).type('code'); + // // suggestion is popped up - must blur + // cy.get('body').click(0,0); + // cy.wait(250); + // // local.sponsor_COMPLEX_INPUT_3 + // cy.get('ds-dynamic-sponsor-autocomplete').eq(1).click({force: true}).type('projectName'); + // // blur because after each click on input will send PATCH request and the input value is removed + // cy.get('body').click(0,0); + // cy.wait(250); + // // select sponsor type + // createItemProcess.clickOnSelectionInput('local.sponsor_COMPLEX_INPUT_0'); + // createItemProcess.clickOnSelection('N/A',0); + // cy.wait(250); + // // sponsor organisation + // createItemProcess.writeValueToInput('local.sponsor_COMPLEX_INPUT_2', 'organisation', false); + // }); + // + // it('should load and add EU sponsor from suggestion',{ + // retries: { + // runMode: 6, + // openMode: 6, + // }, + // }, () => { + // // select sponsor type + // createItemProcess.clickOnSelectionInput('local.sponsor_COMPLEX_INPUT_0'); + // createItemProcess.clickOnSelection('EU',0); + // cy.wait(250); + // // write suggestion for the eu sponsor - local.sponsor_COMPLEX_INPUT_1 + // cy.get('ds-dynamic-sponsor-autocomplete').eq(0).click({force: true}).type('eve'); + // // select suggestion + // createItemProcess.clickOnSuggestionSelection(0); + // cy.wait(250); + // // EU input field should be visible + // createItemProcess.checkIsInputVisible('local.sponsor_COMPLEX_INPUT_4'); + // }); + // + // it('should add four EU sponsors', { + // retries: { + // runMode: 6, + // openMode: 6, + // }, + // },() => { + // // select sponsor type + // createItemProcess.clickOnSelectionInput('local.sponsor_COMPLEX_INPUT_0'); + // createItemProcess.clickOnSelection('EU',0); + // cy.wait(250); + // // write suggestion for the eu sponsor - local.sponsor_COMPLEX_INPUT_1 + // cy.get('ds-dynamic-sponsor-autocomplete').eq(0).click({force: true}).type('eve'); + // // select suggestion + // createItemProcess.clickOnSuggestionSelection(0); + // cy.wait(250); + // // EU input field should be visible + // createItemProcess.checkIsInputVisible('local.sponsor_COMPLEX_INPUT_4'); + // + // // add another sponsors + // addEUSponsor(1); + // addEUSponsor(2); + // addEUSponsor(3); + // }); + + // Test type-bind + it('should be showed chosen type value', { + retries: { + runMode: 6, + openMode: 6, + }, + defaultCommandTimeout: 10000 + },() => { + createItemProcess.clickOnSelectionInput('dc.type'); + createItemProcess.clickOnTypeSelection('Corpus'); + }); + + // Test CMDI input field + it('should be visible Has CMDI file input field because user is admin', { + retries: { + runMode: 6, + openMode: 6, + }, + defaultCommandTimeout: 10000 + },() => { + createItemProcess.checkLocalHasCMDIVisibility(); + }); + + it('The local.hasCMDI value should be sent in the response after type change', { + retries: { + runMode: 6, + openMode: 6, + }, + defaultCommandTimeout: 10000 + },() => { + createItemProcess.clickOnSelectionInput('dc.type'); + createItemProcess.clickOnTypeSelection('Corpus'); + createItemProcess.checkCheckbox('local_hasCMDI'); + createItemProcess.controlCheckedCheckbox('local_hasCMDI',true); + createItemProcess.clickOnSave(); + cy.reload(); + createItemProcess.controlCheckedCheckbox('local_hasCMDI',true); + }); + + it('should change the step status after accepting/declining the distribution license', { + retries: { + runMode: 6, + openMode: 6, + }, + defaultCommandTimeout: 10000 + },() => { + createItemProcess.checkDistributionLicenseStep(); + createItemProcess.checkDistributionLicenseToggle(); + // default status value is warnings + createItemProcess.checkDistributionLicenseStatus('Warnings'); + // accept the distribution license agreement + createItemProcess.clickOnDistributionLicenseToggle(); + // after accepting the status should be valid + createItemProcess.checkDistributionLicenseStatus('Valid'); + // click on the toggle again and status should be changed to `Warnings` + createItemProcess.clickOnDistributionLicenseToggle(); + createItemProcess.checkDistributionLicenseStatus('Warnings'); + }); + + it('should pick up the license from the license selector', { + retries: { + runMode: 6, + openMode: 6, + }, + defaultCommandTimeout: 10000 + },() => { + createItemProcess.checkLicenseResourceStep(); + // check default value in the license dropdown selection + createItemProcess.checkLicenseSelectionValue('Select a License ...'); + // pop up the license selector modal + createItemProcess.clickOnLicenseSelectorButton(); + // check if the modal was popped up + createItemProcess.checkLicenseSelectorModal(); + // pick up the first license from the modal, it is `Public Domain Mark (PD)` + createItemProcess.pickUpLicenseFromLicenseSelector(); + // check if the picked up license value is seen as selected value in the selection + createItemProcess.checkLicenseSelectionValue('Public Domain Mark (PD)'); + }); + + it('should select the license from the license selection dropdown and change status', { + retries: { + runMode: 6, + openMode: 6, + }, + defaultCommandTimeout: 10000 + },() => { + createItemProcess.checkLicenseResourceStep(); + // check default value in the license dropdown selection + createItemProcess.checkLicenseSelectionValue('Select a License ...'); + // check step status - it should be as warning + createItemProcess.checkResourceLicenseStatus('Warnings'); + // click on the dropdown button to list options + createItemProcess.clickOnLicenseSelectionButton(); + // select `Public Domain Mark (PD)` from the selection + createItemProcess.selectValueFromLicenseSelection(2); + // // selected value should be seen as selected value in the selection + createItemProcess.checkLicenseSelectionValue('GNU General Public License, version 2'); + // // check step status - it should be valid + createItemProcess.checkResourceLicenseStatus('Valid'); + }); + + it('should show warning messages if was selected non-supported license', { + retries: { + runMode: 6, + openMode: 6, + }, + defaultCommandTimeout: 10000 + },() => { + createItemProcess.checkLicenseResourceStep(); + // check default value in the license dropdown selection + createItemProcess.checkLicenseSelectionValue('Select a License ...'); + // check step status - it should be as warning + createItemProcess.checkResourceLicenseStatus('Warnings'); + // click on the dropdown button to list options + createItemProcess.clickOnLicenseSelectionButton(); + // select `Select a License ...` from the selection - this license is not supported + createItemProcess.selectValueFromLicenseSelection(0); + // selected value should be seen as selected value in the selection + createItemProcess.checkLicenseSelectionValue('Select a License ...'); + // check step status - it should an error + createItemProcess.checkResourceLicenseStatus('Errors'); + // error messages should be popped up + createItemProcess.showErrorMustChooseLicense(); + createItemProcess.showErrorNotSupportedLicense(); + }); + + // Author field should consist of two input fields + it('Author field should consist of two input fields', { + retries: { + runMode: 6, + openMode: 6, + }, + defaultCommandTimeout: 10000 + },() => { + createItemProcess.checkAuthorFirstnameField(); + createItemProcess.checkAuthorLastnameField(); + }); + + it('The submission should not have the Notice Step', { + retries: { + runMode: 6, + openMode: 6, + }, + defaultCommandTimeout: 10000 + },() => { + createItemProcess.checkClarinNoticeStepNotExist(); + }); +}); + +describe('Create a new submission in the clariah collection', () => { + beforeEach(() => { + // Create a new submission + cy.visit('/submit?collection=' + TEST_SUBMIT_CLARIAH_COLLECTION_UUID + '&entityType=none'); + + // This page is restricted, so we will be shown the login form. Fill it out & submit. + cy.loginViaForm(TEST_ADMIN_USER, TEST_ADMIN_PASSWORD); + }); + + it('The submission should have the Notice Step', { + retries: { + runMode: 6, + openMode: 6, + }, + defaultCommandTimeout: 10000 + },() => { + createItemProcess.checkClarinNoticeStep(); + }); +}); + +function addEUSponsor(euSponsorOrder) { + createItemProcess.clickAddMore(1); + // select sponsor type of second sponsor + createItemProcess.clickOnSelectionInput('local.sponsor_COMPLEX_INPUT_0', euSponsorOrder); + createItemProcess.clickOnSelection('EU',euSponsorOrder); + cy.wait(500); + // write suggestion for the eu sponsor + // createItemProcess.writeValueToInput('local.sponsor_COMPLEX_INPUT_1', 'eve', true, euSponsorOrder); + // euSponsorOrder * 2 because sponsor complex type has two ds-dynamic-sponsor-autocomplete inputs + cy.get('ds-dynamic-sponsor-autocomplete').eq(euSponsorOrder * 2).click({force: true}).type('eve'); + // select suggestion + createItemProcess.clickOnSuggestionSelection(euSponsorOrder * 2); + cy.wait(250); + // EU input field should be visible + createItemProcess.checkIsInputVisible('local.sponsor_COMPLEX_INPUT_4', false, euSponsorOrder); +} diff --git a/src/app/core/auth/auth.reducer.spec.ts b/src/app/core/auth/auth.reducer.spec.ts index 235bf451a6d..41c03126538 100644 --- a/src/app/core/auth/auth.reducer.spec.ts +++ b/src/app/core/auth/auth.reducer.spec.ts @@ -215,7 +215,6 @@ describe('authReducer', () => { loaded: false, blocking: false, loading: true, - externalAuth: true, idle: false }; expect(newState).toEqual(state); diff --git a/src/app/core/data/base/base-data.service.spec.ts b/src/app/core/data/base/base-data.service.spec.ts index b6a4b6ad2e3..75662a691fa 100644 --- a/src/app/core/data/base/base-data.service.spec.ts +++ b/src/app/core/data/base/base-data.service.spec.ts @@ -567,26 +567,6 @@ describe('BaseDataService', () => { }); }); - (service as any).addDependency( - createSuccessfulRemoteDataObject$({ _links: { self: { href: 'object-href' } } }), - observableOf('dependsOnHref') - ); - expect(addDependencySpy).toHaveBeenCalled(); - }); - - it('should call objectCache.addDependency without an href if request failed', () => { - addDependencySpy.and.callFake((href$: Observable, dependsOn$: Observable) => { - observableCombineLatest([href$, dependsOn$]).subscribe(([href, dependsOn]) => { - expect(href).toBe(undefined); - expect(dependsOn).toBe('dependsOnHref'); - }); - }); - - (service as any).addDependency( - createFailedRemoteDataObject$('something went wrong'), - observableOf('dependsOnHref') - ); - expect(addDependencySpy).toHaveBeenCalled(); }); }); diff --git a/src/app/core/data/external-source-data.service.spec.ts b/src/app/core/data/external-source-data.service.spec.ts new file mode 100644 index 00000000000..723d7f9bed6 --- /dev/null +++ b/src/app/core/data/external-source-data.service.spec.ts @@ -0,0 +1,107 @@ +import { ExternalSourceDataService } from './external-source-data.service'; +import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; +import { createPaginatedList } from '../../shared/testing/utils.test'; +import { ExternalSourceEntry } from '../shared/external-source-entry.model'; +import { of as observableOf } from 'rxjs'; +import { GetRequest } from './request.models'; +import { testSearchDataImplementation } from './base/search-data.spec'; +import { take } from 'rxjs/operators'; + +describe('ExternalSourceService', () => { + let service: ExternalSourceDataService; + + let requestService; + let rdbService; + let halService; + + const entries = [ + Object.assign(new ExternalSourceEntry(), { + id: '0001-0001-0001-0001', + display: 'John Doe', + value: 'John, Doe', + metadata: { + 'dc.identifier.uri': [ + { + value: 'https://orcid.org/0001-0001-0001-0001' + } + ] + } + }), + Object.assign(new ExternalSourceEntry(), { + id: '0001-0001-0001-0002', + display: 'Sampson Megan', + value: 'Sampson, Megan', + metadata: { + 'dc.identifier.uri': [ + { + value: 'https://orcid.org/0001-0001-0001-0002' + } + ] + } + }) + ]; + + function init() { + requestService = jasmine.createSpyObj('requestService', { + generateRequestId: 'request-uuid', + send: {} + }); + rdbService = jasmine.createSpyObj('rdbService', { + buildList: createSuccessfulRemoteDataObject$(createPaginatedList(entries)) + }); + halService = jasmine.createSpyObj('halService', { + getEndpoint: observableOf('external-sources-REST-endpoint'), + }); + service = new ExternalSourceDataService(requestService, rdbService, undefined, halService); + } + + beforeEach(() => { + init(); + }); + + describe('composition', () => { + const initService = () => new ExternalSourceDataService(null, null, null, null); + testSearchDataImplementation(initService); + }); + + describe('getExternalSourceEntries', () => { + + describe('when no error response is cached', () => { + let result; + beforeEach(() => { + spyOn(service, 'hasCachedErrorResponse').and.returnValue(observableOf(false)); + result = service.getExternalSourceEntries('test'); + }); + + it('should send a GetRequest', () => { + result.pipe(take(1)).subscribe(); + expect(requestService.send).toHaveBeenCalledWith(jasmine.any(GetRequest), true); + }); + + it('should return the entries', () => { + result.subscribe((resultRD) => { + expect(resultRD.payload.page).toBe(entries); + }); + }); + }); + + describe('when an error response is cached', () => { + let result; + beforeEach(() => { + spyOn(service, 'hasCachedErrorResponse').and.returnValue(observableOf(true)); + result = service.getExternalSourceEntries('test'); + }); + + it('should send a GetRequest', () => { + result.pipe(take(1)).subscribe(); + expect(requestService.send).toHaveBeenCalledWith(jasmine.any(GetRequest), false); + }); + + it('should return the entries', () => { + result.subscribe((resultRD) => { + expect(resultRD.payload.page).toBe(entries); + }); + }); + }); + }); +}); diff --git a/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html new file mode 100644 index 00000000000..db3dc31948f --- /dev/null +++ b/src/app/shared/form/vocabulary-treeview/vocabulary-treeview.component.html @@ -0,0 +1,101 @@ + +
+
+
+ +
+ + + +
+
+
+
+
+ +

+ {{'vocabulary-treeview.search.no-result' | translate}} +

+ + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 82abcb40cfe..2e13dfb3187 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -130,8 +130,6 @@ "admin.registries.bitstream-formats.table.id": "ID", - "admin.registries.bitstream-formats.table.id": "ID", - "admin.registries.bitstream-formats.table.return": "Back", "admin.registries.bitstream-formats.table.supportLevel.KNOWN": "Known", @@ -184,8 +182,6 @@ "admin.registries.schema.fields.table.id": "ID", - "admin.registries.schema.fields.table.id": "ID", - "admin.registries.schema.fields.table.scopenote": "Scope Note", "admin.registries.schema.form.create": "Create metadata field", @@ -668,15 +664,11 @@ "admin.batch-import.page.remove": "remove", - "advanced-workflow-action.select-reviewer.description-single": "Please select a single reviewer below before submitting", + "auth.errors.invalid-user": "Invalid email address or password.", - "advanced-workflow-action.select-reviewer.description-multiple": "Please select one or more reviewers below before submitting", + "auth.messages.expired": "Your session has expired. Please log in again.", - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.head": "EPeople", - - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.search.head": "Add EPeople", - - "advanced-workflow-action-select-reviewer.groups.form.reviewers-list.button.see-all": "Browse All", + "auth.messages.token-refresh-failed": "Refreshing your session token failed. Please log in again.", "bitstream.download.page": "Now downloading {{bitstream}}...", @@ -1210,7 +1202,6 @@ "collection.source.controls.reset.submit.success": "The reset and reimport has been successfully initiated", "collection.source.controls.reset.submit.error": "Something went wrong with initiating the reset and reimport", - "collection.source.controls.reset.failed": "An error occurred during the reset and reimport", "collection.source.controls.reset.completed": "The reset and reimport completed", @@ -1931,17 +1922,16 @@ "home.description": "DSpace is a digital service that collects, preserves, and distributes digital material. Repositories are important tools for preserving an organization's legacy; they facilitate digital preservation and scholarly communication.", - "health-page.status-tab": "Status", + "home.breadcrumbs": "Home", - "health-page.error.msg": "The health check service is temporarily unavailable", + "home.search-form.placeholder": "Search the repository ...", - "health-page.property.status": "Status code", + "home.title": "Home", - "health-page.section.db.title": "Database", + "home.top-level-communities.head": "Communities in DSpace", - "health-page.section.geoIp.title": "GeoIp", + "home.top-level-communities.help": "Select a community to browse its collections.", - "health-page.section.solrAuthorityCore.title": "Solr: authority core", "home-page.carousel.ldata.info": "Linguistic Data and NLP Tools", @@ -2094,38 +2084,6 @@ - "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", - - "health-page.section.solrStatisticsCore.title": "Solr: statistics core", - - "health-page.section-info.app.title": "Application Backend", - - "health-page.section-info.java.title": "Java", - - "health-page.status": "Status", - - "health-page.status.ok.info": "Operational", - - "health-page.status.error.info": "Problems detected", - - "health-page.status.warning.info": "Possible issues detected", - - "health-page.title": "Health", - - "health-page.section.no-issues": "No issues detected", - - "home.description": "", - - "home.breadcrumbs": "Home", - - "home.search-form.placeholder": "Search the repository ...", - - "home.title": "Home", - - "home.top-level-communities.head": "Communities in DSpace", - - "home.top-level-communities.help": "Select a community to browse its collections.", - "info.end-user-agreement.accept": "I have read and I agree to the End User Agreement", "info.end-user-agreement.accept.error": "An error occurred accepting the End User Agreement", @@ -3604,7 +3562,7 @@ "nav.user.description": "User profile bar", - "nav.user.description": "User profile bar", + "none.listelement.badge": "Item", "orgunit.listelement.badge": "Organizational Unit", @@ -5277,35 +5235,7 @@ "submission.submit.breadcrumbs": "New submission", - "submission.sections.license.notgranted": "You must accept the license", - - "submission.sections.sherpa.publication.information": "Publication information", - - "submission.sections.sherpa.publication.information.title": "Title", - - "submission.sections.sherpa.publication.information.issns": "ISSNs", - - "submission.sections.sherpa.publication.information.url": "URL", - - "submission.sections.sherpa.publication.information.publishers": "Publisher", - - "submission.sections.sherpa.publication.information.romeoPub": "Romeo Pub", - - "submission.sections.sherpa.publication.information.zetoPub": "Zeto Pub", - - "submission.sections.sherpa.publisher.policy": "Publisher Policy", - - "submission.sections.sherpa.publisher.policy.description": "The below information was found via Sherpa Romeo. Based on the policies of your publisher, it provides advice regarding whether an embargo may be necessary and/or which files you are allowed to upload. If you have questions, please contact your site administrator via the feedback form in the footer.", - - "submission.sections.sherpa.publisher.policy.openaccess": "Open Access pathways permitted by this journal's policy are listed below by article version. Click on a pathway for a more detailed view", - - "submission.sections.sherpa.publisher.policy.more.information": "For more information, please see the following links:", - - "submission.sections.sherpa.publisher.policy.version": "Version", - - "submission.sections.sherpa.publisher.policy.embargo": "Embargo", - - "submission.sections.sherpa.publisher.policy.noembargo": "No Embargo", + "submission.submit.title": "New submission", "submission.workflow.generic.delete": "Delete", diff --git a/src/styles/_global-styles.scss b/src/styles/_global-styles.scss index d50917cc320..1009bc2b64b 100644 --- a/src/styles/_global-styles.scss +++ b/src/styles/_global-styles.scss @@ -93,61 +93,6 @@ ngb-modal-backdrop { -webkit-hyphens: auto; hyphens: auto; -/* Used to hide the thumbnail column in modals. */ -.hide-modal-thumbnail-column { - .modal-body ds-listable-object-component-loader div.row > div:first-child { - display: none; - } - - .modal-body ds-listable-object-component-loader div.row > div:nth-child(2) { - flex: 0 0 100%; - max-width: 100%; - } -} - -/* The font sizes used in "no thumbnail" placeholder */ -.thumb-font-0 { - .thumbnail-placeholder { - @media screen and (max-width: map-get($grid-breakpoints, lg)) { - font-size: 0.7rem; - padding: 0.2rem; - } - @media screen and (max-width: map-get($grid-breakpoints, sm)) { - font-size: 0.6rem; - padding: 0.1rem; - } - font-size: 0.4rem; - padding: 0.1rem; - } -} - -.thumb-font-1 { - .thumbnail-placeholder { - @media screen and (max-width: map-get($grid-breakpoints, sm)) { - font-size: 0.9rem; - padding: 0.1rem; - } - @media screen and (max-width: 950px) { - font-size: 0.4rem; - padding: 0.1rem; - } - font-size: 0.5rem; - padding: 0.125rem; - } -} - -.thumb-font-2 { - .thumbnail-placeholder { - font-size: 0.9rem; - padding: 0.125rem; - } -} - -.thumb-font-3 { - .thumbnail-placeholder { - font-size: 1.25rem; - padding: 0.5rem; - } } .researcher-profile-switch button:focus {