) => {
- 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 {